[
  {
    "path": ".gitignore",
    "content": "_site\n.DS_Store\n*.sublime-project\n*.sublime-workspace\ncodekit-config.json\nnode_modules\nGemfile.lock"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"bitwise\": true,\n  \"browser\": true,\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"eqnull\": true,\n  \"es5\": false,\n  \"esnext\": true,\n  \"immed\": true,\n  \"jquery\": true,\n  \"latedef\": true,\n  \"newcap\": true,\n  \"noarg\": true,\n  \"node\": true,\n  \"strict\": false,\n  \"trailing\": false,\n  \"undef\": true,\n  \"multistr\": true,\n  \"expr\": true\n}"
  },
  {
    "path": ".project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>github_blog</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>com.aptana.ide.core.unifiedBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>com.aptana.projects.webnature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "404.md",
    "content": "---\nlayout: page\ntitle: \"Page Not Found\"\ndescription: \"Page not found. Your pixels are in another canvas.\"\n---  \n\nSorry, but the page you were trying to view does not exist --- perhaps you can try searching for it below.\n\n<script type=\"text/javascript\">\n  var GOOG_FIXURL_LANG = 'en';\n  var GOOG_FIXURL_SITE = '{{ site.url }}'\n</script>\n<script type=\"text/javascript\"\n  src=\"http://linkhelp.clients.google.com/tbproxy/lh/wm/fixurl.js\">\n</script>"
  },
  {
    "path": "CNAME",
    "content": "\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem 'jekyll'\ngem 'kramdown'\ngem 'coderay'\ngem 'rake'\ngem 'thor'\ngem 'activesupport'\ngem 'stringex'"
  },
  {
    "path": "Gruntfile.js",
    "content": "'use strict';\nmodule.exports = function(grunt) {\n\n  grunt.initConfig({\n    jshint: {\n      options: {\n        jshintrc: '.jshintrc'\n      },\n      all: [\n        'Gruntfile.js',\n        'assets/js/*.js',\n        'assets/js/plugins/*.js',\n        '!assets/js/scripts.min.js'\n      ]\n    },\n    recess: {\n      dist: {\n        options: {\n          compile: true,\n          compress: true\n        },\n        files: {\n          'assets/css/main.min.css': [\n            'assets/less/main.less'\n          ]\n        }\n      },\n      dev: {\n        options: {\n          compile: true,\n          compress: false\n        },\n        files: {\n          'assets/css/main.css': [\n            'assets/less/main.less'\n          ]\n        }\n      }\n    },\n    uglify: {\n      dist: {\n        files: {\n          'assets/js/scripts.min.js': [\n            'assets/js/plugins/*.js',\n            'assets/js/_*.js'\n          ]\n        }\n      }\n    },\n    imagemin: {\n      dist: {\n        options: {\n          optimizationLevel: 7,\n          progressive: true\n        },\n        files: [{\n          expand: true,\n          cwd: 'images/',\n          src: '{,*/}*.{png,jpg,jpeg}',\n          dest: 'images/'\n        }]\n      }\n    },\n    svgmin: {\n      dist: {\n        files: [{\n          expand: true,\n          cwd: 'images/',\n          src: '{,*/}*.svg',\n          dest: 'images/'\n        }]\n      }\n    },\n    watch: {\n      less: {\n        files: [\n          'assets/less/*.less',\n          'assets/less/bootstrap/*.less'\n        ],\n        tasks: ['recess']\n      },\n      js: {\n        files: [\n          '<%= jshint.all %>'\n        ],\n        tasks: ['jshint','uglify']\n      }\n    },\n    clean: {\n      dist: [\n        'assets/css/main.min.css',\n        'assets/js/scripts.min.js'\n      ]\n    }\n  });\n\n  // Load tasks\n  grunt.loadNpmTasks('grunt-contrib-clean');\n  grunt.loadNpmTasks('grunt-contrib-jshint');\n  grunt.loadNpmTasks('grunt-contrib-uglify');\n  grunt.loadNpmTasks('grunt-contrib-watch');\n  grunt.loadNpmTasks('grunt-recess');\n  grunt.loadNpmTasks('grunt-contrib-imagemin');\n  grunt.loadNpmTasks('grunt-svgmin');\n\n  // Register tasks\n  grunt.registerTask('default', [\n    'clean',\n    'recess',\n    'uglify',\n    'imagemin',\n    'svgmin'\n  ]);\n  grunt.registerTask('dev', [\n    'watch'\n  ]);\n\n};"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Michael Rose\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "README.md",
    "content": "个人前端博客\n----------\n\n## [点此访问 www.hacke2.cn](http://www.hacke2.cn)\n\n本博客是基于[hpstr jekyll](\"https://github.com/hacke2/hpstr-jekyll-theme)而搭建的个人博客，在原有强大的功能上，做了如下修改：\n\n* 将google cdn换成 baidu cdn 原因你懂的\n* 去掉分享到twitter、facebook等国外社区，加入百度分享\n* 加入百度站长助手，方便您的统计\n* disqus评论\n* Read More功能，不想像以前一样文章全显示出来\n\n如果您想快速搭建和我一样属于自己的博客系统，请参阅：\n\n[30秒创建Github Page](http://www.hacke2.cn/create-github-page/)\n\n目前待优化事项：\n\n* 合并资源（JS,CSS）\n\n\n\n"
  },
  {
    "path": "Rakefile.rb",
    "content": "require \"rubygems\"\nrequire \"bundler/setup\"\nrequire \"stringex\"\n\n## -- Config -- ##\n\npublic_dir      = \"public\"    # compiled site directory\nposts_dir       = \"_posts\"    # directory for blog files\nnew_post_ext    = \"md\"  # default new post file extension when using the new_post task\nnew_page_ext    = \"md\"  # default new page file extension when using the new_page task\n\n\n#############################\n# Create a new Post or Page #\n#############################\n\n# usage rake new_post\ndesc \"Create a new post in #{posts_dir}\"\ntask :new_post, :title do |t, args|\n  if args.title\n    title = args.title\n  else\n    title = get_stdin(\"Enter a title for your post: \")\n  end\n  filename = \"#{posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}\"\n  if File.exist?(filename)\n    abort(\"rake aborted!\") if ask(\"#{filename} already exists. Do you want to overwrite?\", ['y', 'n']) == 'n'\n  end\n  tags = get_stdin(\"Enter tags to classify your post (comma separated): \")\n  puts \"Creating new post: #{filename}\"\n  open(filename, 'w') do |post|\n    post.puts \"---\"\n    post.puts \"layout: post\"\n    post.puts \"title: \\\"#{title.gsub(/&/,'&amp;')}\\\"\"\n    post.puts \"modified: #{Time.now.strftime('%Y-%m-%d %H:%M:%S %z')}\"\n    post.puts \"tags: [#{tags}]\"\n    post.puts \"image:\"\n    post.puts \"  feature: \"\n    post.puts \"  credit: \"\n    post.puts \"  creditlink: \"\n    post.puts \"comments: \"\n    post.puts \"share: \"\n    post.puts \"---\"\n  end\nend\n\n# usage rake new_page\ndesc \"Create a new page\"\ntask :new_page, :title do |t, args|\n  if args.title\n    title = args.title\n  else\n    title = get_stdin(\"Enter a title for your page: \")\n  end\n  filename = \"#{title.to_url}.#{new_page_ext}\"\n  if File.exist?(filename)\n    abort(\"rake aborted!\") if ask(\"#{filename} already exists. Do you want to overwrite?\", ['y', 'n']) == 'n'\n  end\n  tags = get_stdin(\"Enter tags to classify your page (comma separated): \")\n  puts \"Creating new page: #{filename}\"\n  open(filename, 'w') do |page|\n    page.puts \"---\"\n    page.puts \"layout: page\"\n    page.puts \"permalink: /#{title.to_url}/\"\n    page.puts \"title: \\\"#{title}\\\"\"\n    page.puts \"modified: #{Time.now.strftime('%Y-%m-%d %H:%M')}\"\n    page.puts \"tags: [#{tags}]\"\n    page.puts \"image:\"\n    page.puts \"  feature: \"\n    page.puts \"  credit: \"\n    page.puts \"  creditlink: \"\n    page.puts \"share: \"\n    page.puts \"---\"\n  end\nend\n\ndef get_stdin(message)\n  print message\n  STDIN.gets.chomp\nend\n\ndef ask(message, valid_options)\n  if valid_options\n    answer = get_stdin(\"#{message} #{valid_options.to_s.gsub(/\"/, '').gsub(/, /,'/')} \") while !valid_options.include?(answer)\n  else\n    answer = get_stdin(message)\n  end\n  answer\nend"
  },
  {
    "path": "_config.yml",
    "content": "title:            hacke2's blog\ndescription:      hacke2的前端技术博客,分享自己的技术心得,积累前段技能,汇聚前端之路的点点滴滴。\ndisqus_shortname: hacke2\nreading_time:     true\nwords_per_minute: 200\n#Your site's domain goes here. Leave localhost server or blank when working locally.\nurl:              http://www.hacke2.cn\n\n# Owner/author information\nowner:\n  name:           hacke2\n  avatar:         wxl-photo2.jpg\n  bio:            \"梦想还是要有的，万一实现了呢？\"\n  email:          hacke2@qq.com\n  # Social networking links used in footer. Update and remove as you like.\n  twitter:        \n  facebook:       \n  github: hacke2         \n  stackexchange:  \n  linkedin:       \n  instagram:      \n  flickr:         \n  tumblr:         \n  # For Google Authorship https://plus.google.com/authorship\n  # google plus id, include the '+', eg +mmistakes\n  google_plus:    +yourid\n\n# Background image to be tiled on all pages\nbackground: \n\n# Analytics and webmaster tools stuff goes here\ngoogle_analytics:   \ngoogle_verify:      \n# https://ssl.bing.com/webmaster/configure/verify/ownership Option 2 content= goes here\nbing_verify:         \n\n# Links to include in top navigation\n# For external links add external: true\nlinks:\n#  - title: Theme Setup\n#    url: /theme-setup\n  - title: Works\n    url: http://www.hacke2.cn/works\n    external: true\n#  - title: GitHub\n#    url: https://github.com/hacke2\n#    external: true\n    \n\n# http://en.wikipedia.org/wiki/List_of_tz_database_time_zones\ntimezone:    America/New_York\nfuture:      true\nhighlighter: rouge\nmarkdown:    kramdown\n\n# https://github.com/mojombo/jekyll/wiki/Permalinks\npermalink:   /:categories/:title/\n\n# Amount of post to show on home page\npaginate: 5\n\nkramdown:\n  auto_ids: true\n  footnote_nr: 1\n  entity_output: as_char\n  toc_levels: 1..6\n  use_coderay: true\n\n  coderay:\n    coderay_line_numbers: nil\n    coderay_line_numbers_start: 1\n    coderay_tab_width: 4\n    coderay_bold_every: 10\n    coderay_css: class\n\ninclude: [\".htaccess\"]\nexclude: [\"lib\", \"config.rb\", \"Capfile\", \"config\", \"Gemfile\", \"Gemfile.lock\", \"README.md\", \"LICENSE\", \"log\", \"Rakefile\", \"Rakefile.rb\", \"tmp\", \"less\", \"*.sublime-project\", \"*.sublime-workspace\", \"test\", \"spec\", \"Gruntfile.js\", \"package.json\", \"node_modules\"]"
  },
  {
    "path": "_includes/browser-upgrade.html",
    "content": "<!--[if lt IE 9]><div class=\"upgrade\"><strong><a href=\"http://whatbrowser.org/\">Your browser is quite old!</strong> Why not upgrade to a different browser to better enjoy this site?</a></div><![endif]-->"
  },
  {
    "path": "_includes/disqus_comments.html",
    "content": "<script type=\"text/javascript\">\n    /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */\n    var disqus_shortname = '{{ site.disqus_shortname }}'; // required: replace example with your forum shortname\n\n    /* * * DON'T EDIT BELOW THIS LINE * * */\n    (function() {\n        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;\n        dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';\n        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);\n    })();\n\n    /* * * DON'T EDIT BELOW THIS LINE * * */\n    (function () {\n        var s = document.createElement('script'); s.async = true;\n        s.type = 'text/javascript';\n        s.src = '//' + disqus_shortname + '.disqus.com/count.js';\n        (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);\n    }());\n</script>\n<noscript>Please enable JavaScript to view the <a href=\"http://disqus.com/?ref_noscript\">comments powered by Disqus.</a></noscript>\n<a href=\"http://disqus.com\" class=\"dsq-brlink\">comments powered by <span class=\"logo-disqus\">Disqus</span></a>"
  },
  {
    "path": "_includes/footer.html",
    "content": "<span>&copy; {{ site.time | date: '%Y' }} {{ site.owner.name }}. Powered by <a href=\"http://jekyllrb.com\">Jekyll</a> using the <a href=\"http://mademistakes.com/hpstr/\">HPSTR Theme</a>.</span>\n<!--\n\t作者：hacke2@qq.com\n\t时间：2014-08-31\n\t描述：百度统计\n-->\n<script type=\"text/javascript\">\nvar _bdhmProtocol = ((\"https:\" == document.location.protocol) ? \" https://\" : \" http://\");\ndocument.write(unescape(\"%3Cscript src='\" + _bdhmProtocol + \"hm.baidu.com/h.js%3Fc974ee5652cef49d5c272e5cae5a0d20' type='text/javascript'%3E%3C/script%3E\"));\n</script>\n"
  },
  {
    "path": "_includes/head.html",
    "content": "<meta charset=\"utf-8\">\n<title>{% if page.title %}{{ page.title }} &#8211; {% endif %}{{ site.title }}</title>\n<meta name=\"description\" content=\"{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}\">\n{% if page.tags %}<meta name=\"keywords\" content=\"{{ page.tags | join: ', ' }}\">{% endif %}\n\n{% if site.owner.twitter %}<!-- Twitter Cards -->\n{% if page.image.feature %}<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:image\" content=\"{{ site.url }}/images/{{ page.image.feature }}\">\n{% else %}<meta name=\"twitter:card\" content=\"summary\">\n<meta name=\"twitter:image\" content=\"{% if page.image.thumb %}{{ site.url }}/images/{{ page.image.thumb }}{% else %}{{ site.url }}/images/{{ site.logo }}{% endif %}\">{% endif %}\n<meta name=\"twitter:title\" content=\"{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}\">\n<meta name=\"twitter:description\" content=\"{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}\">\n<meta name=\"twitter:creator\" content=\"@{{ site.owner.twitter }}\">{% endif %}\n <meta name=\"baidu-site-verification\" content=\"QkAp0TlPXW\" />\n<!-- Open Graph -->\n<meta property=\"og:locale\" content=\"en_US\">\n<meta property=\"og:type\" content=\"article\">\n<meta property=\"og:title\" content=\"{% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %}\">\n<meta property=\"og:description\" content=\"{% if page.description %}{{ page.description }}{% else %}{{ site.description }}{% endif %}\">\n<meta property=\"og:url\" content=\"{{ site.url }}{{ page.url }}\">\n<meta property=\"og:site_name\" content=\"{{ site.title }}\">\n\n{% if site.google_verify %}<meta name=\"google-site-verification\" content=\"{{ site.google_verify }}\">{% endif %}\n{% if site.bing_verify %}<meta name=\"msvalidate.01\" content=\"{{ site.bing_verify }}\">{% endif %}\n\n{% capture canonical %}{{ site.url }}{% if site.permalink contains '.html' %}{{ page.url }}{% else %}{{ page.url | remove:'index.html' | strip_slash }}{% endif %}{% endcapture %}\n<link rel=\"canonical\" href=\"{{ canonical }}\">\n<link href=\"{{ site.url }}/feed.xml\" type=\"application/atom+xml\" rel=\"alternate\" title=\"{{ site.title }} Feed\">\n<!--{% if site.owner.google_plus %}<link rel=\"author\" href=\"https://google.com/{{ site.owner.google_plus }}?rel=author\">{% endif %}\n-->\n<!-- http://t.co/dKP3o1e -->\n<meta name=\"HandheldFriendly\" content=\"True\">\n<meta name=\"MobileOptimized\" content=\"320\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\"/>\n\n<!-- For all browsers -->\n<link rel=\"stylesheet\" href=\"{{ site.url }}/assets/css/main.min.css\">\n<!-- Webfonts \n<link href=\"http://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic\" rel=\"stylesheet\" type=\"text/css\">\n-->\n<meta http-equiv=\"cleartype\" content=\"on\">\n\n<!-- Load Modernizr -->\n<script src=\"{{ site.url }}/assets/js/vendor/modernizr-2.6.2.custom.min.js\"></script>\n\n<!-- Icons -->\n<!-- 16x16 -->\n<link rel=\"shortcut icon\" href=\"{{ site.url }}/favicon.ico\">\n<!-- 32x32 -->\n<link rel=\"shortcut icon\" href=\"{{ site.url }}/favicon.png\">\n<!-- 57x57 (precomposed) for iPhone 3GS, pre-2011 iPod Touch and older Android devices -->\n<link rel=\"apple-touch-icon-precomposed\" href=\"{{ site.url }}/images/apple-touch-icon-precomposed.png\">\n<!-- 72x72 (precomposed) for 1st generation iPad, iPad 2 and iPad mini -->\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"{{ site.url }}/images/apple-touch-icon-72x72-precomposed.png\">\n<!-- 114x114 (precomposed) for iPhone 4, 4S, 5 and post-2011 iPod Touch -->\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"{{ site.url }}/images/apple-touch-icon-114x114-precomposed.png\">\n<!-- 144x144 (precomposed) for iPad 3rd and 4th generation -->\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"144x144\" href=\"{{ site.url }}/images/apple-touch-icon-144x144-precomposed.png\">\n\n{% if page.image.background or site.background %}\n{% capture background %}{% if page.image.background %}{{ page.image.background }}{% else %}{{ site.background }}{% endif %}{% endcapture %}\n{% unless background contains 'http://' or background contains 'https://' %}{% capture background %}{{ site.url }}/images/{{ background }}{% endcapture %}{% endunless %}\n<style type=\"text/css\">body {background-image:url({{ background }});}</style>\n{% endif %}\n"
  },
  {
    "path": "_includes/navigation.html",
    "content": "<nav id=\"dl-menu\" class=\"dl-menuwrapper\" role=\"navigation\">\n\t<button class=\"dl-trigger\">Open Menu</button>\n\t<ul class=\"dl-menu\">\n\t\t<li><a href=\"{{ site.url }}\">Home</a></li>\n\t\t<li>\n\t\t\t<a href=\"#\">About</a>\n\t\t\t<ul class=\"dl-submenu\">\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"{{ site.url }}/images/{{ site.owner.avatar }}\" alt=\"{{ site.owner.name }} photo\" class=\"author-photo\">\n\t\t\t\t\t<h4>{{ site.owner.name }}</h4>\n\t\t\t\t\t<p>{{ site.owner.bio }}</p>\n\t\t\t\t</li>\n\t\t\t\t<!--关于我 TODO-->\n\t\t\t\t<li><a href=\"{{ site.url }}/about/\">Learn More</a></li>\n\t\t\t\t{% if site.owner.email %}<li>\n\t\t\t\t\t<a href=\"mailto:{{ site.owner.email }}\"><i class=\"fa fa-envelope\"></i> Email</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.twitter %}<li>\n\t\t\t\t\t<a href=\"http://twitter.com/{{ site.owner.twitter }}\"><i class=\"fa fa-twitter\"></i> Twitter</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.facebook %}<li>\n\t\t\t\t\t<a href=\"http://facebook.com/{{ site.owner.facebook }}\"><i class=\"fa fa-facebook\"></i> Facebook</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.google_plus %}<li>\n\t\t\t\t\t<!--<a href=\"https://google.com/{{ site.owner.google_plus }}\"><i class=\"fa fa-google-plus\"></i> Google+</a>-->\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.linkedin %}<li>\n\t\t\t\t\t<a href=\"http://linkedin.com/in/{{ site.owner.linkedin }}\"><i class=\"fa fa-linkedin\"></i> LinkedIn</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.github %}<li>\n\t\t\t\t\t<a href=\"http://github.com/{{ site.owner.github }}\"><i class=\"fa fa-github\"></i> GitHub</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.stackexchange %}<li>\n\t\t\t\t\t<a href=\"{{ site.owner.stackexchange }}\"><i class=\"fa fa-stack-exchange\"></i> Stackexchange</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.instagram %}<li>\n\t\t\t\t\t<a href=\"http://instagram.com/{{ site.owner.instagram }}\"><i class=\"fa fa-instagram\"></i> Instagram</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.flickr %}<li>\n\t\t\t\t\t<a href=\"http://www.flickr.com/photos/{{ site.owner.flickr }}\"><i class=\"fa fa-flickr\"></i> Flickr</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t\t{% if site.owner.tumblr %}<li>\n\t\t\t\t\t<a href=\"http://{{ site.owner.tumblr }}.tumblr.com\"><i class=\"fa fa-tumblr\"></i> Tumblr</a>\n\t\t\t\t</li>{% endif %}\n\t\t\t</ul><!-- /.dl-submenu -->\n\t\t</li>\n\t\t<li>\n\t\t\t<a href=\"#\">Posts</a>\n\t\t\t<ul class=\"dl-submenu\">\n\t\t\t\t<li><a href=\"{{ site.url }}/posts/\">All Posts</a></li>\n\t\t\t\t<li><a href=\"{{ site.url }}/tags/\">All Tags</a></li>\n\t\t\t</ul>\n\t\t</li>\n\t\t{% for link in site.links %}<li>{% if link.external %}<a href=\"{{ link.url }}\" target=\"_blank\">{{ link.title }}</a>{% else %}<a href=\"{{ site.url }}{{ link.url }}\">{{ link.title }}</a>{% endif %}</li>{% endfor %}\n\t</ul><!-- /.dl-menu -->\n</nav><!-- /.dl-menuwrapper -->\n"
  },
  {
    "path": "_includes/scripts.html",
    "content": "<script src=\"//libs.baidu.com/jquery/1.9.0/jquery.js\"></script>\n<!--<script>window.jQuery || document.write('<script src=\"{{ site.url }}/assets/js/vendor/jquery-1.9.1.min.js\"><\\/script>')</script>-->\n<script src=\"{{ site.url }}/assets/js/scripts.min.js\"></script>\n<script>window._bd_share_config={\"common\":{\"bdSnsKey\":{},\"bdText\":\"\",\"bdMini\":\"1\",\"bdMiniList\":false,\"bdPic\":\"\",\"bdStyle\":\"0\",\"bdSize\":\"16\"},\"share\":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>\n{% if site.google_analytics %}\n<!-- Asynchronous Google Analytics snippet -->\n<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n  ga('create', '{{ site.google_analytics }}', 'auto');  \n  ga('require', 'linkid', 'linkid.js');\n  ga('send', 'pageview');\n  \n</script>\n{% endif %}\n{% if page.comments %}{% include disqus_comments.html %}{% endif %}"
  },
  {
    "path": "_layouts/page.html",
    "content": "<!doctype html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if (IE 7)&!(IEMobile)]><html class=\"no-js lt-ie9 lt-ie8\" lang=\"en\"><![endif]-->\n<!--[if (IE 8)&!(IEMobile)]><html class=\"no-js lt-ie9\" lang=\"en\"><![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"><!--<![endif]-->\n<head>\n{% include head.html %}\n</head>\n\n<body id=\"page\" {% if page.image.feature %}class=\"feature\"{% endif %}>\n\n{% include browser-upgrade.html %}\n{% include navigation.html %}\n\n{% if page.image.feature %}\n<div class=\"entry-header\">\n  <!--{% if page.image.credit %}<div class=\"image-credit\">Image source: <a href=\"{{ page.image.creditlink }}\">{{ page.image.credit }}</a></div>/.image-credit{% endif %}-->\n  <div class=\"entry-image\">\n    <img src=\"{{ site.url }}/images/{{ page.image.feature }}\" alt=\"{{ page.title }}\">\n  </div><!-- /.entry-image -->\n</div><!-- /.entry-header -->\n{% endif %}\n\n<div id=\"main\" role=\"main\">\n  <article class=\"entry\">\n    <header class=\"header-title\">\n      <div class=\"header-title-wrap\">\n        <h1 class=\"entry-title\">{{ page.title }}</h1>\n        {% if site.reading_time %}\n        <p class=\"entry-reading-time\">\n          <i class=\"fa fa-clock-o\"></i>\n          {% assign readtime = content | number_of_words | divided_by:site.words_per_minute %}\n          Reading time ~{% if readtime <= 1 %}1 minute{% else %}{{ readtime }} minutes{% endif %}\n        </p><!-- /.entry-reading-time -->\n        {% endif %}\n      </div><!-- /.header-title-wrap -->\n    </header>\n    <div class=\"entry-content\">\n      {{ content }}\n      <footer class=\"entry-meta\">\n        {% if page.modified %}{{ page.title }} was last modified on <span class=\"entry-date date modified\"><time datetime=\"{{ page.modified }}\">{{ page.modified }}</time></span>\n        <span class=\"author vcard fn\">{{ site.owner.name }}</span>{% endif %}\n        {% if page.share %}<div class=\"social-share\">\n          <ul class=\"socialcount socialcount-small inline-list\" data-url=\"{{ site.url }}{{ page.url }}\" data-share-text=\"{{ page.title }}\">\n            <li class=\"facebook\"><a href=\"https://www.facebook.com/sharer/sharer.php?u={{ site.url }}{{ page.url }}\" title=\"Share on Facebook\"><span class=\"count\"><i class=\"fa fa-facebook-square\"></i> Like</span></a></li>\n            <li class=\"twitter\"><a href=\"https://twitter.com/intent/tweet?text={{ site.url }}{{ page.url }}\" title=\"Share on Twitter\"><span class=\"count\"><i class=\"fa fa-twitter-square\"></i> Tweet</span></a></li>\n            <li class=\"googleplus\"><a href=\"https://plus.google.com/share?url={{ site.url }}{{ page.url }}\" title=\"Share on Google Plus\"><span class=\"count\"><i class=\"fa fa-google-plus-square\"></i> +1</span></a></li>\n          </ul>\n        </div><!-- /.social-share -->{% endif %}\n      </footer>\n    </div><!-- /.entry-content -->\n    {% if site.disqus_shortname and page.comments %}<section id=\"disqus_thread\"></section><!-- /#disqus_thread -->{% endif %}\n  </article>\n</div><!-- /#main -->\n\n<div class=\"footer-wrapper\">\n  <footer role=\"contentinfo\">\n    {% include footer.html %}\n  </footer>\n</div><!-- /.footer-wrapper -->\n\n{% include scripts.html %}          \n\n</body>\n</html>\n"
  },
  {
    "path": "_layouts/post-index.html",
    "content": "<!doctype html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if (IE 7)&!(IEMobile)]><html class=\"no-js lt-ie9 lt-ie8\" lang=\"en\"><![endif]-->\n<!--[if (IE 8)&!(IEMobile)]><html class=\"no-js lt-ie9\" lang=\"en\"><![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"><!--<![endif]-->\n<head>\n{% include head.html %}\n</head>\n\n<body id=\"post-index\" {% if page.image.feature %}class=\"feature\"{% endif %}>\n\n{% include browser-upgrade.html %}\n{% include navigation.html %}\n<div class=\"entry-header\">\n  <!--{% if page.image.credit %}<div class=\"image-credit\">Image source: <a href=\"{{ page.image.creditlink }}\">{{ page.image.credit }}</a></div>/.image-credit{% endif %}-->\n  {% if page.image.feature %}\n    <div class=\"entry-image\">\n      <img id=\"headerPic\">\n    </div><!-- /.entry-image -->\n  {% endif %}\n  <div class=\"header-title\">\n    <div class=\"header-title-wrap\">\n      <h1>{{ site.title }}</h1>\n      <h2>{{ page.title }}</h2>\n    </div><!-- /.header-title-wrap -->\n  </div><!-- /.header-title -->\n  <span id=\"headerPicDesc\" style=\"position:absolute;right:5px;bottom:5px;color:rgb(204, 194, 194)\"></span>\n</div><!-- /.entry-header -->\n<script type=\"text/javascript\">\n  var picData = [{\n    src : '/images/fuzhou-min.jpg',\n    desc : '2012.10.4 福州·平潭 第一次看见大海'\n  },{\n    src : '/images/shiyanshi.jpg',\n    desc : '2013.10.26 从实验室的角度看整个校园'\n  },{\n    src : '/images/huoyin.jpg',\n    desc : '谢谢你 陪伴了我10年的火影！'\n  }],\n  picIndex = ((new Date).getMonth() +1) % picData.length,\n  curDate = picData[picIndex],\n  headerPic = document.getElementById('headerPic'),\n  headerPicDesc = document.getElementById('headerPicDesc');\n\n  headerPic.setAttribute('src', curDate.src);    \n  headerPicDesc.innerHTML = curDate.desc;    \n</script>\n<div id=\"main\" role=\"main\">\n  {{ content }}\n</div><!-- /#main -->\n\n<div class=\"footer-wrapper\">\n  <footer role=\"contentinfo\">\n    {% include footer.html %}\n  </footer>\n</div><!-- /.footer-wrapper -->\n\n{% include scripts.html %}          \n\n</body>\n</html>"
  },
  {
    "path": "_layouts/post.html",
    "content": "<!doctype html>\n<!--[if lt IE 7]><html class=\"no-js lt-ie9 lt-ie8 lt-ie7\" lang=\"en\"> <![endif]-->\n<!--[if (IE 7)&!(IEMobile)]><html class=\"no-js lt-ie9 lt-ie8\" lang=\"en\"><![endif]-->\n<!--[if (IE 8)&!(IEMobile)]><html class=\"no-js lt-ie9\" lang=\"en\"><![endif]-->\n<!--[if gt IE 8]><!--> <html class=\"no-js\" lang=\"en\"><!--<![endif]-->\n<head>\n{% include head.html %}\n</head>\n\n<body id=\"post\" {% if page.image.feature %}class=\"feature\"{% endif %}>\n\n{% include browser-upgrade.html %}\n{% include navigation.html %}\n\n{% if page.image.feature %}\n<div class=\"entry-header\">\n  <!--{% if page.image.credit %}<div class=\"image-credit\">Image source: {% if page.image.creditlink %}<a href=\"{{ page.image.creditlink }}\">{% endif %}{{ page.image.credit }}{% if page.image.creditlink %}</a>{% endif %}</div>/.image-credit{% endif %}-->\n  <div class=\"entry-image\">\n    <img src=\"{{ site.url }}/images/{{ page.image.feature }}\" alt=\"{{ page.title }}\">\n  </div><!-- /.entry-image -->\n</div><!-- /.entry-header -->\n{% endif %}\n\n<div id=\"main\" role=\"main\">\n  <article class=\"hentry\">\n    <header class=\"header-title\">\n      <div class=\"header-title-wrap\">\n        {% if page.link %}\n          <h1 class=\"entry-title\"><a href=\"{{ page.link }}\">{{ page.title }}</a></h1>\n        {% else %}\n          <h1 class=\"entry-title\"><a href=\"{{ site.url }}{{ page.url }}\" rel=\"bookmark\" title=\"{{ page.title }}\">{{ page.title }}</a></h1>\n        {% endif %}\n        <h2>{{ page.date | date: \"%B %d, %Y\" }}</h2>\n        {% if site.reading_time %}\n        <p class=\"entry-reading-time\">\n          <i class=\"fa fa-clock-o\"></i>\n          {% assign readtime = content | number_of_words | divided_by:site.words_per_minute %}\n          Reading time ~{% if readtime <= 1 %}1 minute{% else %}{{ readtime }} minutes{% endif %}\n        </p><!-- /.entry-reading-time -->\n        {% endif %}\n      </div><!-- /.header-title-wrap -->\n    </header>\n    <div class=\"entry-content\">\n      {{ content }}\n      <footer class=\"entry-meta\">\n        <span class=\"entry-tags\">{% for tag in page.tags %}<a href=\"{{ site.url }}/tags/#{{ tag }}\" title=\"Pages tagged {{ tag }}\" class=\"tag\">{{ tag }}</a>{% unless forloop.last %}{% endunless %}{% endfor %}</span>\n        <span><a href=\"{{ site.url }}{{ page.url }}\" rel=\"bookmark\" title=\"{{ page.title }}\">{{ page.title }}</a> was published on <span class=\"entry-date date published updated\"><time datetime=\"{{ page.date | date_to_xmlschema }}\">{{ page.date | date: \"%B %d, %Y\" }}</time></span></span>\n        {% if page.modified %}(revised: <span class=\"entry-date date modified\"><time datetime=\"{{ page.modified }}\">{{ page.modified | date: \"%m/%d/%Y\" }}</time></span>){% endif %}\n        <span class=\"author vcard\"><span class=\"fn\"><a href=\"{{ site.url }}/about/\" title=\"About {{ site.owner.name }}\">{{ site.owner.name }}</a></span></span>\n        {% if page.share %}\n        <div class=\"social-share socialcount socialcount-small inline-list\">\n         <ul class=\"bdsharebuttonbox\">\n         \t<li><a href=\"#\" class=\"bds_more\" data-cmd=\"more\"></a></li>\n         \t<li><a href=\"#\" class=\"bds_qzone\" data-cmd=\"qzone\" title=\"分享到QQ空间\"></a></li>\n         \t<li><a href=\"#\" class=\"bds_tsina\" data-cmd=\"tsina\" title=\"分享到新浪微博\"></a></li>\n         \t<li><a href=\"#\" class=\"bds_tqq\" data-cmd=\"tqq\" title=\"分享到腾讯微博\"></a></li>\n         \t<li><a href=\"#\" class=\"bds_renren\" data-cmd=\"renren\" title=\"分享到人人网\"></a></li>\n         \t<li><a href=\"#\" class=\"bds_weixin\" data-cmd=\"weixin\" title=\"分享到微信\"></a></li>\n         </div>\n        </div><!-- /.social-share -->{% endif %}\n      </footer>\n    </div><!-- /.entry-content -->\n    {% if site.disqus_shortname and page.comments %}<section id=\"disqus_thread\"></section><!-- /#disqus_thread -->{% endif %}\n    {% if site.related_posts.size %}\n    <div class=\"read-more\">\n      {% for post in site.related_posts limit:1 %}\n        <div class=\"read-more-header\">\n          <a href=\"{{ site.url }}{{ page.previous.url }}\" class=\"read-more-btn\">Read More</a>\n        </div><!-- /.read-more-header -->\n        <div class=\"read-more-content\">\n          <h3><a href=\"{{ site.url }}{{ post.url }}\" title=\"{{ post.title }}\">{{ post.title }}</a></h3>\n          <p>{% if post.description %}{{ post.description }}{% else %}{{ post.content | strip_html | strip_newlines | truncate: 140 }}&hellip;{% endif %} <a href=\"{{ site.url }}{{ post.url }}\">Continue reading</a></p>\n        </div><!-- /.read-more-content -->\n      {% endfor %}\n      <div class=\"read-more-list\">\n        {% for post in site.related_posts limit:2 offset:1 %}\n          <div class=\"list-item\">\n            <h4><a href=\"{{ site.url }}{{ post.url }}\" title=\"{{ post.title }}\">{{ post.title }}</a></h4>\n            <span>Published on {{ post.date | date: \"%B %d, %Y\" }}</span>\n          </div><!-- /.list-item -->\n        {% endfor %}\n      </div><!-- /.read-more-list -->\n      {% endif %}\n    </div><!-- /.read-more -->\n  </article>\n</div><!-- /#main -->\n\n<div class=\"footer-wrapper\">\n  <footer role=\"contentinfo\">\n    {% include footer.html %}\n  </footer>\n</div><!-- /.footer-wrapper -->\n\n{% include scripts.html %}\t        \n\n</body>\n</html>\n"
  },
  {
    "path": "_posts/2014-10-1-for-me-1.html",
    "content": "<!DOCTYPE html>\n<html>\n\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>致自己</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\t\n\t\t\t}\n\t\t\t.container {\n\t\t\t\twidth: 960px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t.show-img {\n\t\t\t\twidth: 500px;\n\t\t\t\theight: 400px;\n\t\t\t\toverflow:hidden;\n\t\t\t\tborder: 1px solid #000000;\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t.show-img img {\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t.show-img .ico-long-pic {\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tposition: absolute;\n\t\t\t\tbackground: #009999;\n\t\t\t\tcolor: #FFF;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 0;\n\t\t\t\tz-index: 9;\n\t\t\t}\n\t\t\t.up {\n\t\t\t\twidth: 500px;\n\t\t\t\theight: 200px;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 0;\n\t\t\t\topacity: 0;\n\t\t\t\tfilter: Alpha(opacity=0);\n\t\t\t\tz-index: 99;\n\t\t\t} \n\t\t\t.down {\n\t\t\t\twidth: 500px;\n\t\t\t\theight: 200px;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 200px;\n\t\t\t\topacity: 0;\n\t\t\t\tfilter: Alpha(opacity=0);\n\t\t\t\tz-index: 99;\n\t\t\t} \n\t\t</style>\n\t</head>\n\n\t<body>\n\t\t<div class=\"container\">\n\t\t<p>我就是想出来看看外面的世界</p>\n\t\t\t<div class=\"show-img\">\n\t\t\t\t<i class=\"ico-long-pic\">长图</i>\n\t\t\t\t<div class=\"up\"></div>\n\t\t\t\t<div class=\"down\"></div>\n\t\t\t\t<img id=\"long-pic\" src=\"/images/article/15.jpg\" alt=\"\" />\n\t\t\t</div>\n\t\t</div>\n\t</body>\n\t<script>\n\t\tvar img = document.getElementById('long-pic');\n\t\t\n\t\tvar context = img.parentNode;\n\t\n\t\t\n\t\t\n\t\tcontext.onmouseover = function() {\n\t\t\t\n\t\t\tvar e = event || window.event,\n\t\t\t\ttarget = e.target || e.srcElement;\n\t\t\t\trelativeX = e.clientX - context.offsetLeft,\n\t\t\t\trelativeY = e.clientY - context.offsetTop,\n\t\t\t\ttargetH = -img.offsetHeight+context.offsetHeight,\n\t\t\t\tcompareH =  context.offsetHeight /2;\n\t\t\t\t\n\t\t\t\tif(target.className == 'up') {\n\t\t\t\t\t\n\t\t\t\t\tstartMove(img,0);\n\t\t\t\t}\n\t\t\t\tif(target.className == 'down') {\n\t\t\t\t\tstartMove(img,targetH);\n\t\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\tcontext.onmouseout = function() {\n\t\t\tif (img.timer) {\n\t\t\t\tclearInterval(img.timer);\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\tfunction startMove(obj, iTarget) {\n\t\t\tclearInterval(obj.timer);\n\t\t\t\n\t\t\tvar speed = obj.offsetTop > iTarget ? -6 : 6;\n\t\t\t\n\n\t\t\tobj.timer = setInterval(function(){\n\t\t\t\tif (Math.abs(iTarget - obj.offsetTop) <= Math.abs(speed)) {\n\t\t\t\t\tclearInterval(obj.timer);\n\t\t\t\t\tobj.style.top = iTarget + 'px';\n\t\t\t\t} else{\n\t\t\t\t\tobj.style.top = obj.offsetTop + speed + 'px';\n\t\t\t\t}\n\t\t\t},30);\n\t\t\t\n\t\t}\n\t\t\n\t\tfunction d(msg) {\n\t\t\tif(console) {\n\t\t\t\tconsole.log(msg);\n\t\t\t}\n\t\t}\n\t</script>\n\n</html>\n"
  },
  {
    "path": "_posts/2014-10-1-mongoose-populate.md",
    "content": "---\nlayout: post\ntitle: Mongoose简单的连表查询\ndescription: \"使用populate属性\"\ntags: [Mongoose]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n\n像我这篇文章所说的<a href=\"http://www.hacke2.cn/gokk/\">基于Node.js + jade + Mongoose 模仿gokk.tv</a>，当时停止开发是因为我深深的感觉到当时想错了，应该用两个Schema，而不是一个下面又有数组来存，这样取数据是方便，当时分页相当麻烦，不能使用原生提供的limit方法。\n\n今天看到一本书上有讲，尝试了一把，记录下来\n\n我们实验的场景为一个班级有N多学生，先通过学生ID找到班级名称（是不是被玩腻了？）\n\n先来将Schema定义好\n\n<!--more-->\n\nClazzSchema ： \n\n```js\nvar mongoose = require('mongoose')\n\nvar ClazzSchema = new mongoose.Schema({\n\tclazzName:String\n})\n//其他方法省略..\n}\n\nmodule.exports = ClazzSchema\n\n```\n    \nStudentSchema ： \n\n```js\nvar mongoose = require('mongoose')\n\nvar StudentSchema = new mongoose.Schema({\n\tname:String,\n\tclazzID : {\n\t\ttype : mongoose.Schema.ObjectId,\n\t\tref : 'Clazz'\n\t}\n})\n\nStudentSchema.statics = {\n\tfindClazzNameByStudentId:function(studentId, callback){\n\t\t\treturn this\n\t\t\t\t.findOne({_id : studentId}).populate('clazzID')\n\t\t\t\t.exec(callback)\n\t\t}\n\t//其他方法省略..\n}\n\nmodule.exports = StudentSchema\n\n```\n\n可以看到，主需要将ClazzID设为ref到Clazz,依赖为你建立Model时的名称就可以了,要查询Clzz使用populate\n\n下面是Model\n\n```js\nvar mongoose = require('mongoose')\nvar ClazzSchema = require('../schemas/clazzSchema')\nvar Clazz = mongoose.model('Clazz',ClazzSchema)\n\n\nmodule.exports  = Clazz \n```\n\n```js\nvar mongoose = require('mongoose')\nvar StudentSchema = require('../schemas/studentSchema')\nvar Student = mongoose.model('Student',StudentSchema)\n\n\nmodule.exports  = Student \n```\n\n大同小异，着重看test.js\n\n```js\nvar mongoose = require('mongoose')\nvar Clazz = require('./models/clazzModel')\nvar Student = require('./models/studentModel')\n//var db = mongoose.createConnection('localhost', 'gokk')\nmongoose.connect('mongodb://localhost/test')\n\n/*var clazz = new Clazz(\n\t{\n\t\tclazzName:'软件2班'\n\t}\n);\n\nclazz.save(function  (argument){\n\tconsole.log('true');\n});*/\n\n/*var student = new Student({\n\tname : 'hacke2',\n\tclazzID : '542b5fcc49df6e741d8d15f5'\n})\nstudent.save(function (err){\n\tconsole.log('true');\n})*/\n\nStudent.findClazzNameByStudentId('542b600a683d59a80d4ee632', function (err, student){\n\tif(err) console.log(err);\n\tconsole.log(student.clazzID.clazzName);\n})\n```\n\n之前添加了两班级：软件一班和软件二班\n\n我们在新增hacke2时将classID设为软件2班的，查新hacke2时自动就会把关键的\nClass查询到\n\n```js\n{ _id: 542b600a683d59a80d4ee632,\n    name: 'hacke2',\n    clazzID: { _id: 542b5fcc49df6e741d8d15f5, clazzName: '软件2班', __v: 0 },\n    __v: 0 }\n```\n<strong>end from <a href=\"{{ site.url }}\"> {{ site.url }}</a></strong>"
  },
  {
    "path": "_posts/2014-10-11-the-golden-key.md",
    "content": "---\nlayout: post\ntitle: 金钥匙\ndescription: \"记这两周的起起伏伏\"\ntags: [心情]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n这两周的心情真是起起伏伏，本来意向是在杭州，结果被分在北京高德，经过无数个人帮我协调，换了好几个部门，最后在神马搜索。\n\n之前根本没有遇到这个情况，以为拿到阿里offer就等于拿到了金钥匙，以后就等着那着这个钥匙去开各个宝箱，职业上专注前端，专注Node.js，带领团队，升职加薪。以后的生活肯定很美满。\n\n这几天的事情让我细细想了一下，这种想法是错的。<strong>妄想着一劳永逸的解决自己的职业规划。</strong> 人生不是这样，不是拿到一个好offer就能吃一辈子，<strong>不期而遇的突发事件才是生活的精彩之处</strong>。拿到了offer，生活还得继续，自己还得努力。\n\n\n生活不是按照你的期望走下去，未来发生的事情不可控，之前自己的善良让自己吃了亏，没有其他offer，没有一个谈判的资本，让自己陷入尴尬的境地。现在明白了，在这个弱肉强食的社会，自己能做的，就是速度快一点，果断反应。\n\n\n谋事在人，成事在天。感谢生命中那些精彩，让我知足也看的开。自己已经为部门这件事做了努力，剩下的就是靠时间来说明自己的选择是否正确。选择了一个新兴团队，希望能和团队在互联网行业突破重围，克服困难，而不是心神不宁，一直在担心未来会怎样。不走在路上，一直在观望徘徊哪知道这条路是对是错呢？\n\ngood luck\n\n<strong>end from{{ site.url }}</strong>"
  },
  {
    "path": "_posts/2014-10-14-links-share-2014-10-14.md",
    "content": "---\nlayout: post\ntitle: 前端资源分享\ndescription: \"分享一些前端、知乎、行业文章、有些工具资源等\"\ntags: [前端资源分享]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>跬步积千里,滴水汇长河，整理的一些优秀链接，希望对大家有所帮助\n\n## 2014年9月 精彩博客集合\n\n<a href=\"https://github.com/hacke2/hacke2.github.io/issues/2\" target=\"_blank\">\n\thttps://github.com/hacke2/hacke2.github.io/issues/2\n</a>\n\n## 2014年9月 前端资源分享\n\n<a href=\"https://github.com/hacke2/hacke2.github.io/issues/1\" target=\"_blank\">\nhttps://github.com/hacke2/hacke2.github.io/issues/1\n</a>\n\n## 2014年10月 上 前端资源分享\n\n<a href=\"https://github.com/hacke2/hacke2.github.io/issues/3\" target=\"_blank\">\nhttps://github.com/hacke2/hacke2.github.io/issues/3\n</a>\n\n<strong>end from <a href=\"{{ site.url }}\"> {{ site.url }}</a></strong>"
  },
  {
    "path": "_posts/2014-10-2-great-nodejs.md",
    "content": "---\nlayout: post\ntitle: 了不起的Node.js读书笔记\ndescription: \"一般结构和思路特别清晰的Node.js入门书籍\"\ntags: [读书笔记, Node.js]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n<figure>\n\t<a href=\"http://img11.360buyimg.com/n0/g15/M07/17/03/rBEhWVKMZ1AIAAAAAAVG8mJwrncAAFuKwEuVBwABUcK039.jpg\">\n\t\t<img src=\"http://img11.360buyimg.com/n0/g15/M07/17/03/rBEhWVKMZ1AIAAAAAAVG8mJwrncAAFuKwEuVBwABUcK039.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>了不起的Node.js</figcaption>\n</figure>\n\n<!--more-->\n\n# 第二章 Js概览\n\n## 基于GoogleV8引擎\n\n * Object.keys(o)\n * 数组方法：遍历forEach、过滤filter、改变map\n * 实现了String.prototype.trim()\n * 含有JSON解析\n\n# 第三章 阻塞与非阻塞IO\n\n## 单线程注意点\n\n * 小心处理内存中的变量，可能会影响两次访问的结果\n * 不要编写阻塞式代码，可能会影响第二次访问的时间\n\n## 事件轮训\n\n *  先注册事件\n * 不断询问这些事件是否已经分发dispatch\n * 当事件分发了，相应的回调就会被触发\n * 如果事件未触发，则继续执行其他代码\n * 捕获未来才会执行到的函数所抛出的异常是不可能的\n * 避免同步IO\n\n# 第四章 Nodez中的Javascript\n\n## global对象\n\n* 对应于浏览器window\n\n## process对象\n\n* process.nextTick == serTimeout(fn,1)\n\n## 模块\n\n * require module exports\n * NPM\n * 绝对模块指Node内置模块以及在node_modules模块require(‘fs’)\n * 相对模块指通过相对路径找的模块require(‘./module’)\n * 暴漏数据exports.a(多个)、重写module.exports(一个)\n\n##事件\n\n * EventEmitter\n * 事件监听 on，事件分发emit，事件移除removeListener\n * 只执行一次once\n * data事件 数据是部分到达，而不是一次性全到达返回给你\n\n## buffer \n\n * 处理二进制数据\n\n# 第五章CLI &FS API\n\n## Stream\n\n * stdin 可读流 stdout/stderr可写流\n * stdin.resume 等待用户输入\n * console == process.stdout.write(str + ‘\\n’)\n\n## fs\n\n * readdirSync(__dirname) readFileSync同步 \n * readdir(‘.’, async) readFile 异步 \n * createReadSteam 读取可变大小 有data、end事件多用于图片、大型文件等\n * watchFile监视文件是否改变\n\n## process\n\n * process.argv 运行的参数\n * process.cwd 获取当前工作目录\n * process.env 环境变量\n * process.exit退出\n * 信号量\n\n# 第六章TCP\n\n## TCP\n\n * 面向连接，基于IP协议\n * IP协议发包无序，TCP给发送的IP包含了标示符和数据流顺序信息\n * 面向字节 对字符以及字符编码完全无知，很好的灵活性\n * 可靠性 三次握手、窗口时间重发\n * 流控制，对接收和发送的速度控制\n * 拥堵控制 避免拥堵、数包报的延迟率和丢包率不会太高\n\n## Telnet\n\n * 当不是telnet协议是自动降级为TCP\n * 发送GET /HTTP/1.1模拟浏览器请求，两次回车\n\n## net  \n\n * Node.js核心TCP模块\n * data close end事件\n * conn.setEncoding(‘utf-8’) 或 Buffer.toString(‘utf-8’)\n * 服务端createServer 客户端connect方法 connect事件\n\n# 第七章HTTP\n\n## HTTP\n\n * TCP上层协议\n * Content-Type类型 文本、HTML、XML、JSON、PNG\n * Transfer-Encoding: chunked 输出的内容长度不能确定，Node天生的异步机制，\t这样相应可以逐形成\n * 301 永久转移 302 临时转移 304资源未改变 403未授权 404资源未找到 \n * 表单Content-Type application/x-www-form-unencoded\n\n## http 模块\n\n * request、response 参数\n * 判断路由为method+url\n * querystring模块 将字符串解析成对象\n * request方法模拟一个请求，传回来的数据2进制，设置utf-8\n * superagent 模拟客户端（模拟一个请求）模块\n * up 重启服务器模块\n\n# 第八章Connect\n\n## 工具集&中间件\n\n * 模块:connect\n * 中间件调用server.user(...)\n * 日志中间件console.log(‘%s %s ’, req.method, req.url)\n * 模拟请求时间过长中间件，在res.end是清除定时器\n * static中间件 处理静态文件connect.static(‘..’)\n * query中间件 获取查询字符串connect.query\n * logger 中间件connect.logger(‘dev’)\n * body parser中间件connect.bodyParser()如果在POST使用了JSON格式，body \tparser自动转JSON对象，还可以处理用户上传文件req.body.file多文件表单name\t使用name=”file[]”\n * seesion中间件 会话connect.session 使用方法req.session.user\n * redis session 会话持久化中间件\n * methodOverride 中间件 让低版本浏览器支持PUT、DELETE、PATCH\n * basicAuth中间件 用户身份验证\n\n# 第九章EXPRESS\n\n## express\n\n * WEB应用开发框架，基于Connect\n * app.set(‘view engine’, ‘ejs’) 设置EJS模板引擎\n * app.set(‘view’, __dirname + ‘/view’) 设置视图层路径\n * app.set(‘view cache’, ‘true) 设置模板缓存\n * 使用app.get()、app.put()、app.post()配置路由，可传参数如:id，获取req.params.id\n * res.render(‘search’，obj) 渲染模板\n * 其他设置大小写敏感、严格路由、jsonp回调\n * 为res和req提供了快捷方法 render渲染、redirect重定向req.header检查头信息\n * 中间件 app.user(function(req, res, next){})\n * 代码组织 分层、分包、MVC，建议仿照Spring MVC\n\n## 模板引擎\n\nExpress/Haml/Jade/CoffeeKup/JQuery Templates for node\n\n#第十章WebSocket\n\n## Ajax\n\n * 异步javascripy\n * 缺陷；每次都建立HTTP请求，消耗网络资源，不适于实时服务\nHTML5 WebSocket\n * 基于ws协议\n * node支持:websocket.io\n * 客户端new WebSocket\n\n## 缺陷\n\n * 关闭不意味着断开，使用心跳检测机制判断\n * 对JSON支持不够友好\n * 客户端临时断开无法解决 使用定时器或者刷新页面？\n * 兼容性\n\n# 第十一章Socket.io\n\n## 优势\n\n * 跨浏览器，支持WebSocket则原生，不支持使用长连接方式,连接会持续打开\t20-50s\n * 即使浏览器支持的WebSocket被代理或者防火墙禁止了，Socket.io仍然会通过其\t他技术来解决\n * 如果客户端停止传输信息，并且一定时间没有正常的关闭，则认为连接已经断开\n * 当连接丢失时，自动重连\n * 对逻辑进行分层，有命名空间\n * 支持emit分发和listen监听事件\n\n# 第十二章MongoDB\n\n## MongoDB\n\n * 面向文档，绝大多数情况是JSON\n * 连接 new mongodb.Server(‘127.0.0.1’, 27017)\n * API open insert find ensureIndex findOne \n * $set 设置 $push 推入数组\n\n## Mongoose\n\n * 类似于JAVA中ORM框架，简化数据库开发\n * 连接mongoose.connect(‘mongodb://localhost/database’)\n * Schema：一种以文件形式存储的数据库模型骨架，不具备数据库的操作能力\n * Model: 由Schema发布生成的模型，具有抽象属性和行为的数据库操作对\n * Entity:由Model创建的实体，他的操作也会影响数据库\n * index 索引 title : {type : String, index : true} unique : true 唯一\n * new Schema({}).pre(‘save’, function(){})保存之前做一些处理\n * 常用API find,findOne,remove,update,count\n * new Schema({}).find({_id:‘xx’}).where(‘title’,‘xxx’).sort(‘content’, -1).limit(5).run(function(err, data){}) 类似JQ查询\n * .select(‘_id’, ‘name’)选择查询指定字段\n * .skip 跳过 mongoose.Schema.ObjectId 生成随机ID\n * clazz : [Clazz] 嵌套的Sehema\n * clazz: {type : ObjectId , ref: ‘Clazz’} 关联查询\n * 添加静态PersonSchema.statics.findByName通过model调用\n * 添加实例方法 PersonSchema.methods.findSimilarTypes Entity调用\n\n# 第十三章MySQL\n\n## MySQL \n\n * 主要使用query执行SQL\n * 有占位符 ? 插入数据（和JAVA一样）\n * 使用seqelize Node版ORM框架\n\n# 第十四章Redis\n\n## Redis\n\n * 应用场景：简单数据模型、数据集。适合存储在内存\n * seesion持久化\n\n# 第十五章 代码共享\n\n## 书写兼容性代码\n\n * 导出模块 ，前端后端都可使用\n\n(function(module){\nmodule.exports = function(a, b ){ \nreturn a+b;\n}\nIf(‘undefined’ != typeof window) {\nWindow.add = module.exports;\n}\n})(‘undefined’ == typeof module ? {module : {exports : {}}}: module) \n\n * 模拟实现ECMA:扩展原型或者实现工具函数\n * EventEmitter。Assert、XMLHttpRequest、DOM、WebSocket、node-canvas都在\tgit上有实现\n * bowserbuild 将node模块转为浏览器可识别的代码\n\n# 第十六章测试\n\n## assert\n\n * 常用API ok,be/equal/eql/a/macth...\n\n## Mocha\n\n * 简化书写\n * 测试异步代码\n * 生成报告\n\n<strong>end from <a href=\"{{ site.url }}\"> {{ site.url }}</a></strong>"
  },
  {
    "path": "_posts/2014-10-20-tink-in-Ghostjs.md",
    "content": "---\nlayout: post\ntitle: GhostJs源码目录\ndescription: \"GhostJs源码的学习\"\ntags: [JavaScript]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n之前[Demon](http://Demon.com)写了一个JS类库[Ghosejs](https://github.com/DemonCloud/GhostJS)，最近我打算学一下。\n\n先贴一下整理的整体结构，前面的为行数。\n\n```js\n/**\n名称 Ghostjs\n版本 0.0.3\n\n21 入口\n38 G()函数入口，DOM加载后执行，兼容FF和IE，类似于$(function(){});如果是结点会走_G()\n\t116 引用了一些常见的方法\n\t146 常见的正则\n\t186 全局缓存\n\t204 UA判断\n220 _G() 选择器包装入口，有length等，具体选择器在selector数组里\n\t276 queueSelector复杂选择器 G('div>p +warp')，最终找到P\n\t353 选择器入口 支持ID CLASS TAG * >选择\n\t378 _G原型方法\n\t\t381 each 对遍历元素的迭代，参数返回为dom, index, this(当前遍历对象) \n\t\t441 signet 给_G元素加属性\n\t\t455 at 类似于JQ的eq\n\t\t477 back G(elm).at(n).xxx(做一堆事情).back().yyy(在原来的选择器上做事情)\n\t\t510 first last\n\t\t525 fix 调用AryFilter\n\t\t541 even odd\n\t\t563 next prev siblings\n\t\t667 warp 所选元素的子元素 warpClass warpTag ctains \n\t\t724 obstruct 阻塞执行\n\t\t741 trash 清楚缓存\n\t\t765 事件 bind unbind once\n\t\t811 CSS方法 hide show adClass rmClass tgClass stStyle gtStyle\n\t\t909 属性方法stAttr rmAttr gtAttr\n\t\t948 动画 animate fdIn fdOut\n\t\t1027 DOM操作 insetHTML gtInHTML insetText gtInText rmNode apend\n\t\t1108 位置与大小 w h gtPos scTo bscTop bscBtom\n1167 G的共用方法 实现了一些本类库的内部方法，兼容了部分ECMAScript 5、ECMAScript 6方法\n1732 编码的一些转换\t\n1801 模板引擎\n1875 一些判断 返回bool类型那种\t\n1921 ajax\n1968 jsonp\n2036 cookie\n2141 事件\n2256 其他内部方法\n2411 Tween动画算法\n**/\n```\n\n<!--more-->\n\n大致的结构如此，今天和作者聊了一下午，他打算吧动画那一块还要做一些事情，加入点高级动画的特效\n\n里面有很多技巧，比如项目入口就是兼容非CMD模块加载的解决方案，作者说还没加上去\n\n\n还有各种部分ECMAScript 5、ECMAScript 6兼容方法\n\n```js\nG.AryFilter = function(ary, func) {\n    if (nativeFilter) {\n        //ECMAScript 5 filter\n        // func(e) 返回为 true. 则会被保留. 如果 func(e) 返回为false. 那就会被过滤从数组中移除掉\n        G.AryFilter = function(ary, func) {\n            return ary.filter(func)\n        };\n    } else {\n        G.AryFilter = function(ary, func) {\n            //ary [1,2,3,4,5]\n            //func function(e){ return e!==4 } -> [1,2,3,5]\n            for(var i = ary.length;i--;){\n                if (!func(ary[i],i))  splice.call(ary,i,1);\n            }\n            return ary;\n        };\n    }\n    return G.AryFilter(ary, func)\n};\n```\n\n还有一些函数的处理技巧，如下时间绑定，在第一次判断兼容性，将函数覆盖，之后就不用判断了\n\n```js\n function OneBind(e, event, callback) {\n    if (doc.addEventListener) {\n        OneBind = function(el, eve, call) {\n            el.addEventListener(eve, function() {\n                el.removeEventListener(eve, arguments.callee);\n                call.call(el);\n            });\n        };\n    } else {\n        OneBind = function(el, eve, call) {\n            el.attachEvent(\"on\" + eve, function() {\n                call.call(el);\n                el.detachEvent(\"on\" + eve, arguments.callee);\n            });\n        };\n    }\n    return OneBind(e, event, callback);\n}\n```\n\n\nDEMON一个乐于分享自己的一些经验的同学，知识只从外国网站获取，是一位很有潜力的牛人，以后混的好可别忘了我啊：D\n\n**end from [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-10-22-html5-javascript-web-dep.md",
    "content": "---\nlayout: post\ntitle: HTML5和JavaScript Web应用开发读书笔记\ndescription: \"《HTML5和JavaScript Web应用开发》主要介绍如何使用HTML5、JavaScript和最新的W3C规范构建可用于所有浏览器和设备的Web应用\"\ntags: [读书笔记]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n<figure>\n\t<a href=\"http://img11.360buyimg.com/n0/g14/M07/17/04/rBEhV1JnaDgIAAAAAAIMoOWOE-gAAEhdAArwQ4AAgy4171.jpg\">\n\t\t<img src=\"http://img11.360buyimg.com/n0/g14/M07/17/04/rBEhV1JnaDgIAAAAAAIMoOWOE-gAAEhdAArwQ4AAgy4171.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>HTML5和JavaScript Web应用开发</figcaption>\n</figure>\n\n<!--more-->\n\n# 第一章 客户端架构\n\n * 过去前端开发人员不用关心用户界面后的框架，从未先现在一样关注浏览器的性能\n * 过去利用服务端模板和组件框架，如JAVA 的JSP,Velocity，前端只是套个模板而已\n * 如今浏览器的性能已经得到了很大的提升，很多逻辑在客户端写，而后台仅仅提供Restful风格的接口\n * 我们现在创建的不是网站，而是基于HTML5，CSS3和JavaScript的**可靠地应用程序**\n * 服务端模板引擎已经逐渐被JavaScript模板所取代\n * JavaScript API得到了更多硬件访问的支持，例如Geolocation、Web Workers\n * 应该为当前的项目作出价值的决策，必须建立和维护编写、测试、和调试代码与选择框架的工作流\n * [WEB开发模式已经逐渐在演化](https://github.com/lifesinger/lifesinger.github.com/issues/184)，我们前端是新时代的先锋，抓住这个机会，创建性能强大，可伸缩的应用，利用WEB最新规范将其推进一步，变得更好。\n\n# 第二章 移动WEB\n\n * 28%会使用移动设备来冲浪，但也有很大一部分人使用IE9以下的浏览器\n * 维基百科 [HTML5引擎对比页面](http://en.wikipedia.org/wiki/Comparison-of-layout_engines_(HTML5))\n * Webkit、Mobile Firefox、OperaMobile\n * [浏览器的市场份额](http://www.netmarketshare.com/browser-market-share.aspx?qprid=0&qpcustomd=1),[最新浏览器HTML5支持](http://caniuse.com)\n * 优雅降级\n * [移动设备模拟器列表](http://www.mobilexweb.com/emulators)\n\n# 第三章 为移动WEB构造程序\n\n * 移动设备的成功依赖于两个因素：所以平台一致的外观；具有离线能力、UI动画和通过Rest风格或者WebSocket端点读取和发送数据的后端服务\n * 有两个影响：CPU/GPU的速度和互联网速度\n * [移动端的设计模式](http://mobiledesignpatterngallery.com/mobile-patterns.php)\n * 要考虑的事情：硬件加速，内存分配和计算负担，电池的消耗与寿命，使用canvas代替image\n * [常见交互](http://html5e.org/example) 滑动，翻转，旋转transtion,transtform,transtlate.建议使用translate3d, 2d转换不支持GPU加速\n * 使用Chrome查看每秒帧数FPS,查看是否加速用合成渲染边框\n * [读取和缓冲，将AJAX缓冲到localStorage](https://github.com/html5e/slidfast/blob/master/slidfast.js#264) 可存5M\n * IOS使用InnerHTML可能会出问题\n * [网络类型检测与处理](https://github.com/html5e/slidfast/blob/master/slidfast.js#L536)\n * 移动WEB常用于单页，可以平滑的向原生应用过渡，减少了请求次数\n\n## 移动框架\n \n * 对触摸屏设备的优化，确保使用CSS3过渡处理动画\n * 在所有主流平台浏览器上跨平台一致性\n * 使用或封装最新的HTML5 CSS3标准\n * 框架背后的强大开源社区\n * 单页框架：[JQuery Mobile](http://jquerymobile.com), [JQTouch](http://jqtouch.com)\n * 无页面结构框架：[xui](http://xuijs.com)\n * 100%JavaScript驱动：[SenchaTouch](http://www.sencha.com/products/touch), [Wink Tooolkit](http://www.sencha.com/products/touch), [The-M-Project](http://the-m-project.net)\n\n## 移动调试\n\n * [weinre](http://people.apache.org/~pmuellr/weinre)\n * [Adobe Shadow](http://labs.adobe.com/technologies/shadow)\n * [Opera远程调试](http://www.opera.com/dragonfly/documentation/remote)\n\n# 第四章 桌面WEB\n\n * 由于AJAX的出现，在后台生成HTML的时代宣告结束\n * 在客户端生成HTML降低了服务器的负载\n * [使用HTML5 + Node.js的例子，比前身快2~10倍](http://venturebeat.com/2011/08/16/linkedin-node)\n\n### 客户端优势\n\n * 更好的用户体验\n * 网络带宽减少（降低成本）\n * 具有可移植性（离线）\n\n### 服务端优势\n\n * 更好的安全性\n * 减少客户端的处理开销（移动端电池）\n * 具有可扩展性（方便添加更多服务器）\n * 性能检测可以使用UA或[Modernizr.js](http://modernizr.com)\n\n## 特征检测\n\n * 原生特征检测一般使用创建一个元素看某一个方法是否存在\n * 使用[Modernizr.js](http://modernizr.com)可能会带来加载时间超过30MS，因为必须在DOM加载之前渲染各个值，\n * 使用[Modernizr.js](http://modernizr.com)不建议在生产环境中使用，但是可以在开发阶段使用它将各个浏览器的兼容性先调试好\n * [FormFactory.js](https://github.com/PaulKinlan/formfactor)可以检测不同类型的的设备,如移动设备版本、电视版本\n\n## UA\n\n * window.navigator.userAgent检测，但是不可靠\n * Google的一款UA解析器，基于JSON[ua-parser](https://github.com/tobie/ua-parser)，另一款基于JS[platform.js](https://github.com/bestiejs/platform.js)\n * 服务端检测，[MobileESP](http://blog.mobileesp.com)用来检测userAgent的首标\n\n## 压缩\n\n * 确保之压缩可压缩的内容，不要把资源浪费在可压可不压的内容上\n * 未访问这选择正确的压缩方案\n * 正确配置WEB服务器，将压缩的内容发给具体的有解压能力的客户端\n * 如果一个大型页面(20k ~ 30K)压缩可能会加载CPU的负载，远大于SQL的执行，建议不压身\n * 压缩的目标可以有HTML, CSS, JS, XML, JSON, HTC, TXT(Robots.txt)\n * 可使用GZIP(减少70%，90%浏览器支持)或DEFLATE\n * 压缩JS和CSS的工具有Closure Cpmpiler, Yahoo!YUI Compressor, JSMin, Packer,\n * 前端构建(验证压缩合并等)[grunt](https://github.com/gruntjs/grunt), [Jawr](http://jawr.java.net), [Ziproxy](http://ziproxy.sourceforge.net)\n\n## JavaScript MVC框架\n\n * [常见MV*框架的演示程序 TodoMVC](https://github.com/tastejs/todomvc)\n * [Backbone](https://github.com/jashkenas/backbone) [书中的例子](https://github.com/html5e/backbone-jax-cellar)\n * [Ember](https://github.com/emberjs/ember.js) [书中的例子](https://github.com/html5e/ember_data_example)\n * [Angular](https://github.com/angular/angular.js) [AngularJS译本](https://github.com/peiransun/angularjs-cn) [书中的例子](https://github.com/html5e/angular-phonecat-mongodb-rest)\n * [Batman](https://github.com/batmanjs/batman) [书中的例子](https://github.com/html5e/batmanjs-address-book)\n * [Knockout](https://github.com/knockout/knockout) [书中的例子](https://github.com/html5e/knockout-rest)\n\n# 第五章 WebSocket\n\n * 从浏览器发出请求包含了header，无压缩的header可能有200b~2kb之前\n * WebSocket通过套接字的全双工同学，是客户端和服务器通信的高效手段\n * 优雅降级是指在WebSocket不受支持时退回到就技术(Flash或长轮训)\n * NIO和线程直接的争论永无止境，一般的，高并发建议NIO，对计算有很大要求的用多线程\n * 观察者模式，一般的有三个事件，OPEN, MESSSAGE, CLOSE\n * [使用Jetty服务器实现WebSocket的例子](https://github.com/html5e/HTML5-Mobile-WebSocket)\n * 不仅可以传递文本，JSON，而且可以传递二进制，用老发送流式音频，也可以提供画布（你画我猜）与实时的屏幕共享技术\n * 使用代理技术如HAProxy让拆除服务器又不影响新的服务\n\n### 优势\n\n * 没有HTTP Header\n * 没有持续(Keep-alive)问题引起的时滞\n * 低延时，更好地吞吐量和相应能力\n * 对移动设备的电池有利\n\n## 框架\n\n * [Ver.x](https://github.com/vert-x/vert.x)是一个全异步，通用的JVM语言应用容器，是JVM版的Node.js\n * [Socket.io](http://socket.io)目标是在每种浏览器和移动设备实现应用，优雅降级\n * [Atmosphere](https://github.com/Atmosphere)可运行在任何基于JAVA的WEB框架\n \n# 第六章 Web Storage\n\n * Cookie只有4K的存储量，而且每次都会带在HTTP请求头，与服务器共享\n * Web Storage有5M，但是存储数据若为UTF-16只有2.6M，IE和Firefox除外\n * Web Storage分为localStorage和sessionStorage(关闭浏览器或标签会消失)\n * 读取或存储数据，是阻塞式的\n * 常用API:length;key(n);getItem(key);setItem(key, value);removeItem(key);clear();\n * [使用localStorage[name] = 'hacke2',localStorage.name = 'hacke2', localStorage.setItem('name', 'hacke2')效率不同](http://jsperf.com/localstorage-key-vs-localstorage-key-vs-localstorage-ge)\n * 同步问题使用StorageEventAPI解决\n * 使用JSON在Web Storage上要进行编码和解码\n * 无安全性可言\n * 浏览器隐私模式下存储会出现异常\n * 使用场景，存储一些Base64的图片，用户搜索的一些数据(神马搜索)等，QQ空间、Disqus评论将草稿存储在loaclStorage,自动登录，[带有时间戳的缓存](https://github.com/pamelafox/lscache)等\n * [从客户端缓冲数据 允许离线且连接到网络时刷新数据](http://engineering.linkedin.com/mobile/linkedin-ipad-using-local-storage-snappy-mobile-apps)\n * [用Backbone进行数据库同步](http://blog.oxfordcc.co.uk/backbone-local-storage-and-server-synchronization)\n * [在任何浏览器中使用Web Storage](https://github.com/wojodesign/local-storage-js)\n\n## 框架\n\n * [LawnChair](https://github.com/brianleroux/lawnchair)轻量级支持移动设备\n * [persistence.js](https://github.com/coresmart/persistencejs)用于服务端，集成Node.js和MySQL\n\n# 第七章 Geolocation\n\n * 提供对于宿主设备相关的地理位置信息的脚本访问，定位用户移动时跟踪器经纬度\n * 地理防护：进入或离开一个位置进行提醒\n * 地址匹配：利用Google将经纬度转为实际地址\n * 一般跟踪：跟踪汽车，走路，跑步的距离\n * navigator.geolocation.getCurrentPosition(function(){})\n * [防止激活Geolocation的一个变通方法](http://html5e.org/example/geo)\n * 实例：用户跟踪，反向地址匹配\n * [Geolocation API跨浏览器支持](http://bit.ly/Geolocation-API-Polyfill)\n\n## 框架\n\n * [geo-loaction-javascript](code.google.com/p/geo-location-javascript)\n * [Webshims lib](https://github.com/aFarkas/webshim)\n\n# 第八章 Device Orientation API\n\n * 加速度计，陀螺仪，指南针\n * [实例：用设备的移动完成滚动](http://www.html5e.org/example/orientation)\n\n# 第九章 Web Workers\n\n * 当WEB应用需要在JavaScript进行繁重的工作和后台处理的时候，推荐使用\n * [Web Worker API检测](http://html5-shims.googlecode.com/svn/trunk/demo/workers.html)\n * [Web Worker 性能测试](http://html5-demos.appspot.com/staic/workers/transferables/index.html)\n * [实例：池化和并行作业](http://html5e.org/example/workers) [对应的演示程序](https://github.com/html5e/slidfast/blob/master/example/workers/index.html)\n * [实例：处理图像](http://www.smartjava.org/examples/webworkers2)\n\n**end from [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-10-29-2014-10-d2.md",
    "content": "---\nlayout: post\ntitle: 2014.10.25 杭州D2行\ndescription: \"2014.10.25 杭州D2行\"\ntags: [游记]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n<figure>\n\t<a href=\"https://github.com/soulteary/Get-D2-2014-Ticket/raw/master/assets/img/figure.png\">\n\t\t<img src=\"https://github.com/soulteary/Get-D2-2014-Ticket/raw/master/assets/img/figure.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>D2前端技术论坛</figcaption>\n</figure>\n\n>参加交流会坐在台下看台上大牛的分享，有种时光交错的感觉。在一个最好的时代与时间最精英的人，挤挤一堂，梦想成为这个时代最有创造力的一代，而不是垮掉的一代。----豪情 \n\t\n这次D2和[@liningone](https://github.com/liningone)一起去的，25个小时的火车(没钱啊TT)，一路奔波，终于来到了杭州，短暂休息了一下，就跑去阿里西溪总部先观望了一下，结果门卫大哥不让我们进去，只好在门口照了几张相\n<figure>\n\t<a href=\"/images/2014-10-d2-albb.jpg\">\n\t\t<img src=\"/images/2014-10-d2-albb.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>阿里巴巴西溪园区门口</figcaption>\n</figure>\n\n<!--more-->\n\n回去收拾了一下就睡了，整整一天的火车还是挺累的。\n第二天一早，就打的又过去，这次有阿里的同学负责接应，最后到了会场，扫描了二维码，然后碰见以为百度地图的小伙在那边聊天，期间碰见了[@小胡子哥](https://github.com/barretlee)，打了个招呼，也合了个影：）。\n\n<figure>\n\t<a href=\"/images/2014-10-d2-xiaohuzi.jpg\">\n\t\t<img src=\"/images/2014-10-d2-xiaohuzi.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>和小胡子哥</figcaption>\n</figure>\n\n后来还看见[@张鑫旭](http://www.zhangxinxu.com/wordpress/)，旁边围的人挺多的，如众星捧月一般，没好意思过去，只是远远的观望了一下，很黑很高很瘦，不知道的还以为田径运动员。没多久，就和[@liningone](https://github.com/liningone)一起进入到会场。\n<figure>\n\t<a href=\"/images/2014-10-d2-dahui.jpg\">\n\t\t<img src=\"/images/2014-10-d2-dahui.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>D2大会开始前</figcaption>\n</figure>\n\n很兴奋，主持人[@aoao](http://weibo.com/aoaoing?topnav=1&wvr=6&topsug=1)一口标准的普通话让人捧腹大笑，期间和旁边的一位杭州就职的聊了几句，我称呼您，他说他不适应。。会议开始了，首先将D2的创始人圆心简单的介绍了一下D2的创建以及历史，和对中国前端的一些展望，然后正式开始，因为很想听听[《支付宝前后端分离的思考与实践》](http://vdisk.weibo.com/s/C30SUspJtfe1v)，所以果断去了分会场，没想到一进去，这么多人。。没地方做，站着听了一会。苏千引入了一个“大前端”的概念，主要讲了为什么进行前后端的分离，谈了谈更清晰的职责划分的优势，并引出了阿里chair框架，对模板引擎，单元测试，自动化UI测试，性能提升，日志报警等都有很好的解决方案。听完后就去吃饭，排了很长的队伍，但是阿里的饭菜还是很给力的\n<figure>\n\t<a href=\"/images/2014-10-d2-shitang.jpg\">\n\t\t<img src=\"/images/2014-10-d2-shitang.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>阿里食堂的伙食</figcaption>\n</figure>\n吃完饭和[@liningone](https://github.com/liningone)去器自行车逛了一圈阿里西溪园区，后来接到[豪哥](https://github.com/jikeytang)电话，终于看见心中的男神了，聊了一会儿，大家过去D2门口照了张相\n<figure>\n\t<a href=\"/images/2014-10-d2-haoqing.jpg\">\n\t\t<img src=\"/images/2014-10-d2-haoqing.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>从左往右：豪情，ngot, 桃子, undefined, 我</figcaption>\n</figure>\n\n和群友一起进入主会场，听接下来的三场：[nodejs一小步 前端开发一大步](http://vdisk.weibo.com/s/C30SUspJtfe4O),[第三方开发前端实践](http://vdisk.weibo.com/s/C30SUspJtfdhI),[面向多端的蘑菇街前端技术架构](http://vdisk.weibo.com/s/C30SUspJtfdi5),[京东前端工业化实践之路](http://vdisk.weibo.com/s/C30SUspJtf4sv)，由于下午精神不是很好，听的不是很仔细，去和豪哥上厕所是碰见大神[winter](http://weibo.com/wintercn?from=feed&loc=nickname)，赶紧去握了一下手:D(其实是去外面休息一下碰见了)\n\n总结一下，下午主要听了有两个概念：Node.js和前端工业化。由于Node.js的出现，让我们前端成为全栈成为可能，我们可以发挥自己想象力为项目或者产品做更多的事情，同时，前端也有了更多的职责，更大的压力，地位也是显著的提高。对于前端工业化，我之前有一个文章没写完[高大上Web前端开发环境](http://www.hacke2.cn/web-development-process/)，其实就是各个公司讲了一下他们公司对于前端工业化的思路与实现，下来再看看分享的PPT。\n\n\n第二天和liningone去西湖玩，租了自行车沿着西湖转了一圈，整整一天！沿途的风光很美，特别是在雷峰塔上的广阔视野和断桥残雪上的夕阳。下次来的话一定得去一下钱塘江感受一下！\n<figure>\n\t<a href=\"/images/2014-10-d2-leifeng.jpg\">\n\t\t<img src=\"/images/2014-10-d2-leifeng.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>雷峰塔</figcaption>\n</figure>\n\n<figure>\n\t<a href=\"/images/2014-10-d2-duanqiao.jpg\">\n\t\t<img src=\"/images/2014-10-d2-duanqiao.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>断桥残雪</figcaption>\n</figure>\n\n**end from [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-10-3-node-westom-mina.md",
    "content": "---\nlayout: post\ntitle: 利用Node.js对某智能家居服务器重构\ndescription: \"利用Node.js天生NIO特性\"\ntags: [Mongoose]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n之前负责过一个智能家居项目的开发，外包重庆一家公司的，我们主要开发服务器监控和集群版管理。\n\n移动端和机顶盒的远程通信是用中间服务器完成交互，服务器使用MINA NIO框架，非阻塞式的，可以看看以前博客了解下<a href=\"http://blog.csdn.net/hacke2/article/details/32188927\">某智能家居项目框架学习总结</a>，或者其他资料<a href=\"http://weixiaolu.iteye.com/blog/1479656\">JAVA NIO原理</a>，<a href=\"http://www.iteye.com/topic/166596\">基于MINA框架快速开发网络应用程序</a>。\n\n在移动端或者机顶盒登录后会使用spring security 进行加密，主要是结合用户名和密码来加密，生成一个唯一标示符。服务器来到一个请求时会检查对应的标示符来发送相关约定好的命令，如登录到移动端向服务器发送命名，服务器会生成如522f9e2a459de81d6a9e9eadfa9468d1的标示符，如果在机顶盒集合里也存在相应标示符的主控，则给他发送。\n\n最近关注Node.js，这不就是Node的特性NIO吗？\n\n让我们来着手重构一下，利用Node.js的先天优势，高并发，非阻塞式\n\n<!--more-->\n\n```js\n\nvar MyClient = function (client, username, password, type){\n\tthis.client = client;\n\tthis.username = username;\n\tthis.password = password;\n\tthis.type = type; //0是机顶盒，1是客户端\n}\n\nMyClient.prototype.write = function(msg) {\n\tthis.client.write(msg + '\\r\\n');\n}\n\nmodule.exports = MyClient;\n\n```\n\n每一个连接都有它的用户名和密码，也有它的client，也就是Socket。也有一个标示符，表示是主控还是客户端\n\n然后添加一个原型方法，用来向当前client发送信息\n\n下面就是编写主程序了，使用Node.js进行网络应用程序的开发很简单，详细大家能看懂\n\n```js\n//tcp\nvar net = require('net');\nvar crypto = require('crypto');\n\n\n\nvar MyClient = require('./MyClient');\n\nvar server = net.createServer();\n\n//客户端，如平台、移动端进来放在这个数组中\nvar clientArr = [];\n//主控端，主要装的是机顶盒的连接\nvar boxArr = [];\n\n\nserver.on('connection', function(client){\n\n\t\n\tclient.setEncoding('utf-8');\n\tclient.write('plase input name|password|type :\\n');\n\n\tvar myClient; \n\tvar message = '';\n\t//发送消息\n\tclient.on('data', function(data){\n\t\t//如果是非回车则累加\n\t\tif('\\r\\n' != data || data == '' || data == null) {\n\t\t\tmessage += data;\n\t\t}else {\n\t\t\t//说明是已经注册的client\n\t\t\tif(myClient) {\n\t\t\t\tsendMsg(message, myClient);\n\t\t\t}else{//说明是第一次进来\n\t\t\t\tvar userInfo = message.split('|');\n\t\t\t\tvar md5 = crypto.createHash('md5');\n\t\t\t\t//使用用户名和密码进行加密，放入password中\n\t\t\t\tmd5.update(userInfo[0] + userInfo[1]);\n\t\t\t\tvar password = md5.digest('hex');\n\t\t\t\tmyClient = new MyClient(client, userInfo[0], password, +userInfo[2]);\n\t\t\t\t//如果是客户端\n\t\t\t\tif(myClient.type) {\n\t\t\t\t\tclientArr.push(myClient);\n\t\t\t\t}else {\n\t\t\t\t\tboxArr.push(myClient);\n\t\t\t\t}\n\t\t\t\tconsole.log('新加用户' + password);\n\t\t\t}\n\t\t\tmessage = '';\n\t\t}\n\t\t\n\t\t\n\t\t\n\t})\n\t//断开时移除这个客户端\n\tclient.on('end', function(data){\n\t\tconsole.log('end....');\n\t\t//有还未登录就退出的情况\n\t\tif(myClient) {\n\t\t\tif(myClient.type) {\n\t\t\t\tclientArr.splice(clientArr.indexOf(myClient), 1)\n\t\t\t}else {\n\t\t\t\tboxArr.splice(boxArr.indexOf(myClient), 1)\n\t\t\t}\n\t\t}\n\t\t\n\t})\n})\n\nserver.listen(3000);\n\nfunction sendMsg(msg, myClient) {\n\tconsole.log(' sendMsg : ' + msg);\n\tvar array = myClient.type == 1 ? boxArr : clientArr;\n\tfor (var i = 0; i < array.length; i++) {\n\t\tif (myClient.password == array[i].password) {\n\t\t\t array[i].write(msg);\n\t\t\t console.log(myClient.name + myClient.type == 1 ? '移动端' : '主控' + '发送消息....');\n\t\t};\n\t};\n}\n\nconsole.log('listening....');\n```\n\n我们来测试一下，利用telnet，使用约定好的协议进行登录，cqut 123456 1,cqut 123456 0,cqut2 123456 1，(这里不是空格，而是I符号，在文章内显示有问题，具体看代码分割就明白了)可以看到，cqut只是给cqut的机顶盒发送，而cqut2的接受不到。\n\n<figure>\n\t<a href=\"/images/article/16.jpg\">\n\t\t<img src=\"/images/article/16.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>只给对应的设备发，给其他设备不会发送</figcaption>\n</figure>\n\n当然Mina还有其强大的过滤器，利用Node.js的中间件就能很好的实现，请读者自行研究\n\n<strong>end from <a href=\"{{ site.url }}\"> {{ site.url }}</a></strong>"
  },
  {
    "path": "_posts/2014-10-31-es6-modules-today-with-6to5.md",
    "content": "---\nlayout: post\ntitle: 译-使用6to5，让今天就来写ES6的模块化开发！\ndescription: \"ES6 modules today with 6to5\"\ntags: [翻译]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>http://es6rocks.com/2014/10/es6-modules-today-with-6to5/?utm_source=javascriptweekly&utm_medium=email 原文链接\n\n我之前在Twitter上发过一个照片，表达出我有多快乐，这像是一个时光机让我们可以穿梭到未来-ES6的时代！下面让我来展示如何使用6to5让今天就可以练手ES6的模块化。\n\n<figure>\n\t<a href=\"http://es6rocks.com/img/modules-today-6to5.png\">\n\t\t<img src=\"http://es6rocks.com/img/modules-today-6to5.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>使用6to5让今天就可以练手ES6的模块化</figcaption>\n</figure>\n\n<!--more-->\n\n# 第一步\n\n如果你现在还不了解ES6的模块化开发，请在[JSModules.io](http://JSModules.io)上了解一下。我也推荐大家读一下@jcemer的文章[A new syntax for modules in ES6](http://es6rocks.com/2014/07/a-new-syntax-for-modules-in-es6/)，它涉及到了很多非常酷的关于JS模块化的东西。他可以指导我们使用6to5。总的来说，6to5能在支持ES5d的环境下提前尝试ES6 模块化开发的快感。\n6to5比其他降级工具有一下几个优势：\n * 可读性：你的格式化的代码尽可能的保留。\n * 可扩展性：有非常庞大的插件库和浏览器的支持。\n * 可调式性：因为支持source map，你可以方便的调试已经编译过后的代码\n * 高效率：直接转化为与ES相当的代码，不会增加额外的运行十几\n\n# 一起来写模块\n\n让我们来尝试着写模块吧！\n我们的应用除了输出日志不会做其他事情，其主要的目的就是让你了解模块化如何工作和如何让你现有的环境使用ES6的模块化开发。\n基本的目录结构：\n\n\t├── Gruntfile.js\n\t├── package.json\n\t└── src\n\t    ├── app.js\n\t    ├── modules\n\t    │   ├── bar.js\n\t    │   ├── baz.js\n\t    │   └── foo.js\n\t    └── sample\n\t        └── index.html\n\napp.js是主程序，包含了我们将要存储的模块化的目录\n下面是app.js的代码：\n\n```js\nimport foo from \"./modules/foo\";\nimport bar from \"./modules/bar\";\n\nconsole.log('From module foo >>> ', foo);\nconsole.log('From module bar >>> ', bar);\n```\n\n以上代码非常简单，我们导入了foo模块和bar模块，然后分别打印出他们\n\n```js\n// foo.js\nlet foo = 'foo';\n\nexport default foo;\n\n\n// bar.js\nlet bar = 'bar';\n\nexport default bar;\n```\n\n在这些模块一面我们只是导出了两个字符串'foo'和'bar'，当我们导入这些模块，我们的变量其实已经有数据。\n当然，我们何以导出对象，类，函数，等等\n现在，你可以开始模仿这个例子写出你自己的模块\n\n# 构建\n\n就像你已经知道的，[ES6不支持你现在的浏览器和Node](http://kangax.github.io/compat-table/es6/).js，只有一条路，那就是使用降级转换器来编写ES6的模块化代码。\n正如我之前提到的那个，我使用6to5，他可以精确的达到我们想要的效果。\n这个任务是运行在Grunt上的,我们使用 @sindresorhus的 [grunt-6to5](https://github.com/sindresorhus/grunt-6to5)\n\n```js\nnpm install grunt-cli -g\nnpm install grunt --save-dev\nnpm install grunt-6to5 --save-dev\n```\n\n我们的Gruntfile类似于一下：\n\n```js\ngrunt.initConfig({\n    '6to5': {\n        options: {\n            modules: 'common'\n        },\n\n        build: {\n            files: [{\n                expand: true,\n                cwd: 'src/',\n                src: ['**/*.js'],\n                dest: 'dist/',\n            }],\n        }\n    }\n});\n```\n\nTo test it in the browser, I made a copy task that just copies the sample/index.html file to our dist directory.\nThe HTML file looks like this:\n\n这是个简单又给力的配置，我们也几乎完成了。\n当你指定好源文件和输出文件后，这个任务就可以来运行了。\n'common'选项的目的在于告诉6to5我们将输出ES5CommonJS模块化风格。\n当然，6to5也支持AMD，我写了sample/index.html，让他在浏览器环境下测试一下，这个HTML的代码如下：\n\n```html\n<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>ES6 modules 6to5</title>\n</head>\n<body>\n    <script src=\"//[cdnjs URL]/require.min.js\"></script>\n    <script>\n        require(['app.js']);\n    </script>\n</body>\n</html>\n```\n\n观察上面的代码，我们使用AMD的RequireJS框架来加载这个JS，对于这个例子，你需要将上面的配置文件改为 modules: 'amd'\n\n# 运行\n\n万事俱备东风只欠，我们的代码已经放在[es6-modules-today-with-6to5](https://github.com/es6rocks/es6-modules-today-with-6to5)，你可以克隆下来自己玩玩。使用npm install安装6to5\n\n记住一点，Grunt任务会生成一个目标文件夹来存放转化后的代码\n所以，如果你想测试使用CommonJS规范的转化后的ES6的代码，你可以执行一下命令\n\nnode dist/app.js\n\n<figure>\n\t<a href=\"http://es6rocks.com/img/running-node.png\">\n\t\t<img src=\"http://es6rocks.com/img/running-node.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>Node.js上的运行效果</figcaption>\n</figure>\n\n如果你使用AMD规范的，请在浏览器访问index.html(**吐槽一下，老外竟然不知道中国的[sea.js](https://github.com/seajs/seajs)**)\n\n<figure>\n\t<a href=\"http://es6rocks.com/img/amd-es6.png\">\n\t\t<img src=\"http://es6rocks.com/img/amd-es6.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>在浏览器执行的效果</figcaption>\n</figure>\n\n# 结论\n\n\n通过这个简单的实例你学会了如果简单的使用ES6模块化风格来编写代码。6to5是胃肠棒的工具让你穿越到未来提前体验ES6模块化带来的快感。资源下载[es6-modules-today-with-6to5](https://github.com/es6rocks/es6-modules-today-with-6to5)，欢迎提交一些问题的反馈\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-11-10-javascript-aop.md",
    "content": "---\nlayout: post\ntitle: 简单几行代码，实现JavaScript中的AOP\ndescription: \"JavaScript中的AOP的模拟与实现\"\ntags: [JavaScript]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>AOP我们在后台常常听见，那么在前端是否也有这个概念呢？\n\n## 现存的方式\n\n我们写了一段计算比较密集的代码：\n\n```js\nfunction complexFunc() {\n\tsleep(1000)\n}\n\nfunction sleep(maxtime) {\n\tvar now = +new Date();\n\twhile(true) {\n\t\tif(+new Date() - now > maxtime) {\n\t\t\tbreak;\n\t\t}\n\t}\n}\n```\n\n我们在这边定义一个复杂函数，用一个伪睡眠函数模拟。突然需求来了：\n\n>产品经理：这个函数计算时间挺多的，我们想将这个函数在客户机器上真实的运行时间记录下来做一些统计，你把这个代码改改，加一个统计运行时间的功能发给后台。\n\n>前端程序员：哦，好的。\n\n现在我们向在这个`complexFunc`函数中做执行时间的记录。动手改一下上面的代码。\n\n<!--more-->\n\n```js\nfunction complexFunc() {\n\tvar now = +new Date();\n\tsleep(1000);\n\t//$.get('xxx/log.do?time' + +new Date() - now > maxtime + '&funcName' + arguments.callee.name)\t发送给后台\n\tconsole.log(+new Date() - now, funcName);\t//模拟运行\n}\n\n//运行结果：\n1014\n```\n\n代码开开心心写完了，然后需求又来了。\n\n>产品经理：其他几个函数也加一下吧\n\n>前端程序员：嗯，行。\n\n```js\nfunction complexFunc() {\n\tvar now = +new Date();\n\tsleep(1000);\n\t//$.get('xxx/log.do?time' + +new Date() - now > maxtime + '&funcName' + arguments.callee.name)\t发送给后台\n\tconsole.log(+new Date() - now, funcName);\t//模拟运行\n}\n\n\nfunction otherComplexFunc() {\n\tvar now = +new Date();\t//和上面完全重复，复制过来俗称COPY 改\n\tsleep(1500);\n\t//$.get('xxx/log.do?time' + +new Date() - now > maxtime + '&funcName' + arguments.callee.name)\t完全重复\n\tconsole.log(+new Date() - now, funcName);\t//模拟运行\n}\n\n//其它要加统计时间代码的函数\n//....\n```\n\n后台也做了统计完成后：\n\n>产品经理：嗯，这些函数现在没必要统计他的执行时间，你去把那些你家的代码给去掉。\n\n>前端程序员：What the f2ck?\n\n已经上线的项目不能轻易改动，更何况改动如此之大，找都得找半天苦逼的程序员如果出错就只能怪在你身上了T T\n\n\n## 什么是AOP？\n\nAOP这个概念是来源于后台开发，指面向切面编程。在我们的项目中一般仅限于声明式事务，不过后来在做豌豆荚社区时用到了AOP的异常捕获、会员积分记录、日志系统等。AOP的使用大大的降低了代码的耦合度。真真的实现了代码的可插拔。\n\n可以使用现实中的例子：年轮。树的年轮用来记录树的年龄，每一年加一轮。我们可以把与业务无关的代码就像是年轮一样将之包裹，并没有侵害已有代码，如果不需要这个功能，就在调用的时候给去掉。**要知道，在调用处改比在函数实现内部改要好一万倍！**\n\n传统AOP的实现原理为动态代理，我之前层深入分析过[对Spring.Net的AOP一些思考及应用](http://blog.csdn.net/hacke2/article/details/12753379),[动态代理及JDK动态代理源码分析](http://blog.csdn.net/hacke2/article/details/23712633)。每一个代理类不用重新定义，而是只要你符合那个规范会利用反射技术动态生成出那个代理对象。我们使用JavaScript语言的特殊性，轻轻松松就可以实现代码的可插拔。\n\n## 函数的封装\n\n我们知道，我们可以给JavaScript原生对象扩展其属性、方法。JavaScript对于`功能的封装`就是在函数里，我们在函数里面扩展一个before方法。\n\n```js\n//前置通知\nFunction.prototype.before = function(func) {\n\tvar that = this;\n\t\targs = [].slice.call(arguments,1);\n\treturn function() {\n\t\t//debugger\n\t\tif(func.apply(this, args) === false) {\n\t\t\treturn false;\n\t\t}\n\t\treturn that.apply(this, arguments);\n\t}\n}\n\n//后置通知\nFunction.prototype.after = function(func) {\n\tvar that = this;\n\t\targs = [].slice.call(arguments,1);\n\treturn function() {\n\t\tvar ret = that.apply(this, arguments);\n\t\tif(ret === false) {\n\t\t\treturn false;\n\t\t}\n\t\tfunc.apply(this, args);\n\t\treturn ret;\n\t}\n}\n\n//环绕型\nFunction.prototype.around = function(beforeFunc, afterFunc) {\n\tvar that = this;\n\treturn function() {\n\t\treturn that.before(beforeFunc).after(afterFunc).apply(this, args);\n\t}\n}\n\n//捕获异常\nFunction.prototype.throwing = function(throwingFunc) {\n\tvar that = this;\n\t\targs = [].slice.call(arguments,1);\n\treturn function() {\n\t\ttry {\n\t\t\treturn that.apply(this, arguments);\n\t\t} catch(e) {\n\t\t\tthrowingFunc && throwingFunc.call(this, e, args);\n\t\t}\n\t}\n}\n\n```\n\n这里先只提供四个API：\n\n* 前置通知before:在函数调用之前调用的函数func\n* 后置通知after:在函数调用之后调用的函数func\n* 环绕通知around:传递前置、后置函数，将其包裹\n* 抛出异常后通知throwing:异常的控制\n\n只说说第一个函数，这里有一个闭包，引用了上一层传来`this`和`arugments`的返回一个加工后的函数。在这里我们并不是简简单单的只是将功能函数在业务函数之前执行，而是判断了一下功能函数的返回值，如果是`false`。则不执行已有函数，类似于一个`拦截器`或者`过滤器`的功能，在NOde.js叫中间件。\n\n因为是直接扩展在`Function`上的，可以进行`链式操作`。如：\n\n```js\nfunc.before(func1).before(func2).after(func2)(arg1)\n```\n\n## 重构上面的代码\n\n下面，我们来重构一下\n\n```js\n//将时间记录函数封装一下\nfunction logTime (func) {\n\treturn func = (function() {\n\t\tvar d;\n\t\treturn func.around(function() {\n\t\t\td = +new Date();\n\t\t},function() {\n\t\t\tconsole.log(+new Date() - d, func.name);\n\t\t});\n\t})()\n}\n\n//像年轮一样将业务函数包裹，不会污染已有代码\nlogTime(complexFunc)();\n\nlogTime(otherComplexFunc)();\n\n//运行结果：\n1014\n2024\n```\n\n<figure>\n\t<a href=\"/images/article/2014-11-10/1.jpg\">\n\t\t<img src=\"/images/article/2014-11-10/1.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>像年轮一样无限扩展。。这就是AOP！</figcaption>\n</figure>\n\n我们的代码就像被年轮函数被包裹，而且此函数可以再次被年轮函数包裹！如果需求改动，只需轻轻松松的改动`调用处而非实现处`是不是瞬间世界变得美好了？\n\n## 一些使用场景\n\n上面的代码只是一个使用场景，下面列举几个常见的场景：\n\n* 将一些敏感字符或需要转码的字符过滤，而这个方法并不和业务代码产生耦合。使用`before`几个实现。\n* 如本例日志的记录。\n* 数据的验证，如果不通过不会执行业务代码，一般为`submit`,并且将逻辑进行了分离。\n* 无限的想象力...\n* 异常的控制\n\n## 一些展望\n\n在Spring提供的AOP，我们有一个非常强大的功能：`切入点表达式`,比如一下代码：\n\n```js\nexecution(* com.spring.service.*.*(String,..)) and args(msg,..)\n```\n\n我们可以写一个表达式来动态的给函数来绑定一些前置通知，后置通知等。在JavaScript中，我们可以使用正则来完成定义表达式的策略。扫描当前JS的函数后包装函数，要修改功能只需动态的修改配置就可以实现功能的插拔，真正意义上实现JavaScript的AOP！\n\n## 总结\n\n总的来说有一下几点好处：\n\n* 降低模块的耦合度\n* 使系统容易扩展\n* 更好的代码复用性\n\n使用面向切面编程能将我们的代码逻辑进行分离，将问题细化为单独部分，即可以理解为不可再分割的组件，如上边的日志组件，更好地实现模块化、组件化。还不赶紧重构你的代码？\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-11-11-hello-mobile-aop.md",
    "content": "---\nlayout: post\ntitle: 移动Web初级入门\ndescription: \"入门移动Web的一些思考\"\ntags: [移动Web]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>最好的阅读是输出。 --玉伯\n\n即将开始涉入移动Web了，有点小兴奋也有点小紧张，希望能在未来的团队里带来一些价值。记录一下我现在所认识的移动Web。\n\n## 一些基本名词\n\n初涉移动Web，会有一些基本的名称需要掌握，什么设备像素比呀，移动端Web的内核呀，viewport呀，屏幕的的最小物理单位呀。我已经记录了一些，以后还得继续补充。\n\n- \\-  [常见移动Web名词](https://www.zybuluo.com/hacke2/note/45079)\n\n## 关于布局\n\n我们来看看移动端最常见的布局：\n\n<!--more-->\n\n<figure>\n\t<a href=\"/images/article/2014-11-10/2.jpg\">\n\t\t<img src=\"/images/article/2014-11-10/2.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>上中下三部分布局</figcaption>\n</figure>\n\n下面实现上述页面常见移动Web布局三种方法：\n\n* fixed\n* absolute\n* flexbox\n\n### fixed\n\n对于第一种布局，其实现原理就是header和footer部分都为fixed定位。内容页面可以使用`-webkit-overflow-scrolling:touch`来进行滚动，当然，对于不支持的，也可以使用[iscroll](https://github.com/cubiq/iscroll)来兼容。\nfixed布局网上人说坑太多，滚动的时候bug太多，特别是表单元素时弹出输入法会有很多问题，所以不建议使用，以下是一些网上参考的资料：\n\n- \\- [移动Web开发实践——解决position:fixed自适应BUG](https://github.com/maxzhang/maxzhang.github.com/issues/11)\n- \\- [移动端web页面使用position:fixed问题总结](https://github.com/maxzhang/maxzhang.github.com/issues/2)\n- \\- [移动Web开发，4行代码检测浏览器是否支持position:fixed](https://github.com/maxzhang/maxzhang.github.com/issues/7)\n\n### absolute\n\n和fixed一样，只不过将fixed定位设为绝对定位。设定其left,right等值。下面有一个绝对定位的DEMO。\n\n- \\- [绝对定位的DEMO](/demo/mobile/position/absolute.html)\n\n### flexbox\n\nflexbox布局我估计是仿照**flex***布局方式。由于主流移动端都使用的现代浏览器都支持这个CSS3属性。Flexbox布局俗称伸缩布局，它可以简单快速的创建一个具有弹性功能的布局。由于移动多终端的需求，所以首选是flexbox。\n\n- \\- [flexbox的DEMO](/demo/mobile/position/flex.html)\n- \\- [[译]flexbox全揭秘](http://css-tricks.com/snippets/css/a-guide-to-flexbox/)\n\n## 图片与文字\n\n### 非背景图片\n\n之前提到的[常见移动Web名词](https://www.zybuluo.com/hacke2/note/45079)，设备像素比：2的高清视网膜技术却会使图片变得模糊，这是为什么呢？\n\n<figure>\n\t<a href=\"/images/article/2014-11-10/3.png\">\n\t\t<img src=\"/images/article/2014-11-10/3.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>中密度与超高密度(retina)显示的区别</figcaption>\n</figure>\n\n根据计算公式，一个像素点会被拆分成4个小点，显示起来自然模糊了。\n\n解决方案一般有两个：\n\n1.设置`target-densitydpi=device-dpi`，采用按照真实比例来展示，然后进行媒体查询技术如下面代码：\n\n```css\n#header {\nbackground:url (medium-density-image.png);\n}\n@media screen and (- webkit -device-pixel-ratio:1.5) {\n/* CSS for high-density screens */\n#header { background:url (high-density-image.png);}\n}\n@media screen and (- webkit -device-pixel-ratio:0.75) {\n/* CSS for low-density screens */\n#header { background:url (low-density-image.png);}\n}\n```\n\n这样有一个弊端就是：需要为每一种分辨率书写单独的代码。\n\n2. 假如需要100×100的图片，那么从设计稿(宽为640)上截取200×200的大小，但设置还是100*100。宽720的设计稿 ，为了满足显示像素为360的屏幕。这样就可以来只有一份设计稿只写一份代码了。\n\n另外，多张图片的显示可以进行`canvas`的绘制，进行`GPU`渲染。。\n\n### 背景图片\n\nbackground-size设置为高度，自适应宽度100%，这也是CSS3的属性。\n\n### 文字\n\npx单位\n\n传统PC端常用的px来设置大小。因为他比较稳定和精确。\n\nem单位\n\n浏览器中放大或缩放浏览页面时会存在一个问题，因为字体大小是固定了的。要解决这个问题，我们可以使用“em”单位。\nem有如下特点：\n\n1. em的值并不是固定的;\n2. em会继承父级元素的字体大小。\n\nrem单位\n\n`rem`是CSS3的属性，和`em`一样，他的值是不固定的。区别在于他参考的是一个根元素的确定值。`em`是相对于其父元素来设置字体大小的，这样就会存在一个问题，进行任何元素设置，都有可能需要知道他父元素的大小，在我们多次使用时，就会带来无法预知的错误风险。而rem是相对于根元素`html`，这样就意味着，我们只需要在根元素确定一个参考值。\n\n在了解了px,em,rem的区别后，我们可以进行如下设置：\n\n```css\nhtml { font-size: 62.5%; } \nbody { font-size: 14px; font-size: 1.4rem; }\n```\n\n我们在写大小的时候通过一些简单的计算就可以了，比如的拿到的设计稿有一一部分为18px的文字，那我们在写代码的时候就可以写：\n\n```css\np : {font-size:18px；font-size:1.8rem}/*(1.8 x 10=18)*/\n```\n\n## 动画\n\n在移动端不用过多考虑平台端的兼容性，完成动画也是借助CSS3的动画来实现。\n\n在我看来，移动端动画优先选择为以下顺序：\n\n\ttransition > Animation > js\n\n而且最好使用translate3d强制设备进行`GPU`渲染，但也不能过度使用。\n我们可以使用CSS3动画库animate.css玩完成常见的动画。更多关于CSS3动画的可以参考：\n\n- \\- [CSS动画简介](http://www.ruanyifeng.com/blog/2014/02/css_transition_and_animation.html)\n\n## 一些事件\n\n移动端原生的最重要的事件`touch` ：\n\n* touchstart\n* touchmove\n* touchend\n* touchcancel\n\n其中，他们之间触发的先后顺序为：\n\n\ttouchstart > touchmove > touchend > click\n\n移动端click会延迟300ms，原因是他在等待判断是不是双击。当然，现在的一些框架解决了这个问题：\n\n- \\- [fastclick](https://github.com/ftlabs/fastclick)\n- \\- [tap.js](https://github.com/alexgibson/tap.js)\n\n\n用这几个事件可以衍生出很多事件，比如左滑右滑，上下滑屏，放大，缩放等。详情可以看指尖上的JS系列。\n\n- \\- [指尖下的js ——多触式web前端开发之一：对于Touch的处理](http://www.cnblogs.com/pifoo/archive/2011/05/23/webkit-touch-event-1.html)\n- \\- [指尖下的js ——多触式web前端开发之二：处理简单手势](http://www.cnblogs.com/pifoo/archive/2011/05/22/webkit-touch-event-2.html)\n- \\- [指尖下的js —— 多触式web前端开发之三：处理复杂手势](http://www.cnblogs.com/pifoo/archive/2011/05/22/webkit-touch-event-3.html)\n\n现在已经有一些封装了的框架：\n\n- \\- [hammer.js](https://github.com/hammerjs/hammer.js)\n- \\- [touch.js](https://github.com/Clouda-team/touch.code.baidu.com)\n\n当然还有其他移动端专属的事件，比如：\n\n* 触摸事件\n* 屏幕旋转事件\n\n我用原生JS模仿了神马搜索搜出美团后的信息轮播：\n\n- \\- [移动端访问](http://www.hacke2.cn/works/demo/sm-meituan/)\n\n## 一些框架\n\n移动端有一些较为成熟框架：\n\n- \\- [JQuery Mobile](http://jquerymobile.com/)\n- \\- [JQTouch](http://jqtouch.com/)\n\n一些公司也有自己的框架\n\n- \\- [腾讯Pro](https://github.com/AlloyTeam/Pro)\n- \\- [百度BlendUI](https://github.com/Clouda-team/BlendUI)\n\n但更多公司选择使用一些基础的类库自己封装一些常见的交互，毕竟在移动端上流量真的是寸土必争。比如神马搜索用的是[zepto.js](http://zeptojs.com/)。通过gzip压缩后只有几k，而且风格与JQ一模一样，无学习成本。\n\n当然还有些为工具框架\n\n- \\- [iscroll4](http://cubiq.org/iscroll-4)\n\n## 参考资料\n\n* [jtyjty99999收集移动端开发所需要的一些资源与小技巧](https://github.com/jtyjty99999/mobileTech)\n* [[译]flexbox全揭秘](http://www.cnblogs.com/lilyimage/p/3682810.html)\n* [移动端重构系列3——整体布局](http://www.w3cplus.com/mobile/mobile-terminal-refactoring-mobile-layout.html)\n* [移动端webapp开发必备知识](http://www.qianduan.net/mobile-webapp-develop-essential-knowledge.html)\n* [CSS3的REM设置字体大小](http://www.w3cplus.com/css3/define-font-size-with-css3-rem)\n* [设备像素比devicePixelRatio简单介绍](http://www.zhangxinxu.com/wordpress/2012/08/window-devicepixelratio/)\n* [使用CSS3开启GPU硬件加速提升网站动画渲染性能](http://blog.bingo929.com/transform-translate3d-translatez-transition-gpu-hardware-acceleration.html)\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-11-12-create-github-page.md",
    "content": "---\nlayout: post\ntitle: 30秒搭建Github Page\ndescription: \"30秒创建和我一样的Github博客\"\ntags: [分享]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>如果中国每个程序员都写博客，那么中国IT届的春天就来了\n\n有同学问我的网站是怎么创建的，其实30秒就可以办到。话不多说，大家屏住呼吸，看看能不能坚持30秒：D\n\n## 第一步 fork\n\n\n我的博客使用的`hpstr-jekyll-theme`,基于`jekyll`的，我们都知道，`Github`是支持`jekyll`的是进入`hpstr-jekyll-theme` 的。\n\nGithub 地址：\n\n[https://github.com/mmistakes/hpstr-jekyll-theme](https://github.com/mmistakes/hpstr-jekyll-theme)\n\n点击Fork\n\n<!--more-->\n\n<figure>\n\t<a href=\"/images/article/2014-11-11/1.jpg\">\n\t\t<img src=\"/images/article/2014-11-11/1.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>单击Fork</figcaption>\n</figure>\n\n\n## 第二步 修改\n\n\n<figure>\n\t<a href=\"/images/article/2014-11-11/4.jpg\">\n\t\t<img src=\"/images/article/2014-11-11/4.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>点击设置</figcaption>\n</figure>\n\n\n<figure>\n\t<a href=\"/images/article/2014-11-11/3.jpg\">\n\t\t<img src=\"/images/article/2014-11-11/3.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>将名字改为`你的Github名字.github.io`</figcaption>\n</figure>\n\n### 完了吗？完成了！数一下到底有没有30秒？！\n\n<figure>\n\t<a href=\"/images/article/2014-11-11/8.jpg\">\n\t\t<img src=\"/images/article/2014-11-11/8.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>成功访问</figcaption>\n</figure>\n\n\n等待几分钟，访问以下\n\n\t你的Github名字.github.io\n\n## 一些后续设置\n\n现在你已经有了自己的博客了，当你还可能做以下事情：\n\n1.将google cdn换成 baidu cdn 原因你懂的\n\n2.去掉分享到twitter、facebook等国外社区，加入百度分享\n\n3.加入百度站长助手，方便您的统计\n\n4.配置disqus评论\n\n5.加入Read More功能，不想像以前一样文章全显示出来\n\n上述功能其实我已经给我自己做了配置，你也可以[Fork我的博客](https://github.com/hacke2/hacke2.github.io)。\n\n期待您的文章！\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-11-14-answer-how-to-prepare.md",
    "content": "---\nlayout: post\ntitle: 还有一年时间，该如何准备？\ndescription: \"回答群友问题\"\ntags: [问答]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>群中有朋友问还有一年时间，该如何准备？我回答了一下，仅仅是一孔之见\n\n`群友：`\n\n>我现在css方面看了css那些事儿，css权威指南，正在看精通css；js方面看了javascript高级程序设计，javascript语言精粹；也做了一些页面效果的练习；这周拿了百度偏前端的开发测试实习，但是由于某些原因没办法去。我想知道如果我想明年暑假校招的时候能进BAT的前端部门，现在开始应该偏重看哪些知识点或者书籍？本人现在研二，相对于css更喜欢 js ，希望各位经验丰富的前辈指点迷津，真心喜欢 js 还有就是有必要学习学习 jquery 、nodejs、angularjs 什么吗？\n\n<!--more-->\n\n`重庆-球霸天：`\n\n\n我其实也是运气好，没什么经验可谈，只是有几个建议：\n\n1.多写DEMO,将你的作品挂到网上去。可以放在github上，[像我一样](http://www.hacke2.cn/works/)，也可以[像豪哥一样](http://1.gitapp.sinaapp.com/pro/) 放在sae上，有免费的云豆可拿\n还有京东云，都是免费的。个人感觉[更好的基础练习](http://www.fgm.cc/learn/)\n\n2.多多关注一些前端大牛的最新动态（通过微博或微信），看看他们最近在干什么，行业有哪些最近比较关注的知识点。要了解目标公司前端动态，别像我去360面试还不知道成银是谁，他组织的奇舞团和编写的thinkjs.js很出名，如果当时和他聊得欢保证成功率在70%以上。\n\n3.整理自己所学过的知识点，将之形成一个系列，放到博客中，将来面试的时候也展示一下，张鑫旭已经写了无数篇文章了，我在想如果我大一就坚持写博客现在得有多牛啊，其实我们这一行除了技术还有就是文字的产出能力。玉伯说的。\n\n4.要是有项目经验再好不过了，在项目中碰见过过哪些问题，怎么解决的，担任什么样的角色，都是非常非常重要的。我在面试的时候问面试官对我的评价，他说我是他面过的同学对项目是**最深入的一个**。\n\n5.想BAT不会问你有没有使用过这些框架，而会问你这些框架的源码你读过没，那个点是怎么实现的，比如我就被问过JQ和NG的，jq很定要会，如果以后走全栈Node.js要了解，ng可学可不学，因为2.0马上要出来了，与以前风格完全不一样，建议学学backbone（但他其实也不是传统意义的MVC）。\n\n6.还有就是与时俱进，HTML5，CSS3，ES6，都不能比别人落后啊。\n\n一年的时间真的还很长，我真正接触前端也就这么几个月，现在拿自己的水平和前一个月做一个比较，感觉真的不是一个档次。每个月都能感觉到自己的进步，这个感觉很好。祝好运。\n\n最后引用豪哥的总结发言：\n\n>我们走过弯路之后给你的一个人生阶段的结果，人生可能确实需要走一些弯路之后才能真正明白过来人所给的建议。要不然，真不明白里边的坑有多深，需要填多深。\n\n**end from [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-11-18-about-responsive.md",
    "content": "---\nlayout: post\ntitle: 响应式Web初级入门\ndescription: \"关于响应式编程的一些思考\"\ntags: [移动Web]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n## 跨终端时代的到来\n\n当你乘坐各种交通工具(公交、地铁、轻轨、火车)时你会发现，人们都个个低下头在玩自己的手机、平板、Kindle，没错，你正在处于一个多终端设备的时代！手机用户连年上升，前几天我们在感叹以前玩沙包、陀螺，现在小孩的娱乐就是玩手机--。另外，微软的Xbox和任天堂的Wii等游戏设备也有自己的浏览器。设备真的来了。。\n\n<!--more-->\n\n现在网站主流跨终端的有以下方式：\n\n### 单域\n\n比如[前端乱炖](http://www.html-js.com/)和[我的个人博客](http://www.hacke2.cn)都属于此一类。此类网站具有只编写一次就能实现跨终端的需求，维护起来相当方便。但缺点也很明显，加载不必要的JS和CSS比往常相比巨多。\n\n单域还有一种情况，就是多个模板，你用移动设备可能访问一个网站，最底下会有访问桌面版，访问触屏版等，他会重新加载模板。\n\n<figure>\n\t<a href=\"/images/article/2014-11/git.png\">\n\t\t<img src=\"/images/article/2014-11/git.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>提示访问移动版</figcaption>\n</figure>\n\n<figure>\n\t<a href=\"/images/article/2014-11/git2.jpg\">\n\t\t<img src=\"/images/article/2014-11/git2.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>随之进入移动版，HTML结构也会发生变化</figcaption>\n</figure>\n\n\n### 多域\n\n如[神马搜索](http://m.sm.cn)和百度(http://www.baidu.com)，当用桌面浏览器和移动浏览器访问的结果是不一样的。其中的手段可能有两种：\n\n* [Ngix反向代理判断](http://blog.csdn.net/fairplay_li/article/details/13769393)\n* 服务端直接判断UA输出不同的界面，[JAVA和PHP等后台语言都提供了支持框架](https://github.com/tobie/ua-parser)\n\n两家都对移动端做了专门的页面，这样进行功能的拆减，用户体验当然大大提高，但有需求发生变化时，往往要更改两处地方。\n\n### 多终端\n\n也就是前端最不想看到的，很多公司为了提高更好地用户体验都使用native开发，如IOS的OC,SWIFT，Andriod SDK等。功能强大，接口丰富，缺点就是更新起来异常困难，很多用户都不想过几天就安装一个APP。\n\n**本文主要讲第一种`单域(响应式)`的情况**\n\n### 响应式Web\n\n响应式Web设计最早在2010年EthanMarcotte发表过一篇文章[《Responsive Web Design》](http://www.alistapart.com/articles/responsive-web-design/)，**基本每本将响应式的书籍都将他提起，那个例子太经典**提起，文中援引了响应式建筑设计的概念：\n\n>最近出现了一门新兴的学科——\"响应式建筑(responsive architecture)\"——提出，物理空间应该可以根据存在于其中的人的情况进行响应。结合嵌入式机器人技术以及可拉伸材料的应用，建筑师们正在尝试建造一种可以根据周围人群的情况进行弯曲、伸缩和扩展的墙体结构；还可以使用运动传感器配合气候控制系统，调整室内的温度及环境光。已经有公司在生产\"智能玻璃\"：当室内人数达到一定的阀值时，这种玻璃可以自动变为不透明，确保隐私。\n\n澄清一点，**响应式站点不等同于移动站点**，他只是一种开发移动站点的策略。其实按照这个说法[神马搜索](http://m.sm.cn)是一款纯粹的移动WEB APP，因为它没有桌面版。\n\n<figure>\n\t<a href=\"/images/article/2014-11/sm.jpg\">\n\t\t<img src=\"/images/article/2014-11/sm.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>为移动而生，专注移动搜索的神马搜索</figcaption>\n</figure>\n\n## 三种布局方式\n\n现存的布局哪一种更加适合做响应式的网站呢？一般来说有以下三种布局：\n\n### 固定布局\n\n应该是新手开发人员最喜欢用的布局方式，简单粗暴，设计稿是多少PX，写CSS时就多少PX，对页面的控制力度是最强的，上下级没有联系，想调哪个就调那个，如果设置`box-sizing:border-box;`,甚至对整个布局都没有影响。\n\n最常见的就是`body`使用`960px`的像素，有以下两个因素：\n\n* 适应正方形的老式屏幕；\n* 两边补白，让宽屏用户不觉得那么聚集；\n* 960可以被3、4、5、6、8、10、12、15整除。\n\n[点击戳DEMO](/demo/2014-11/ali-px.html)\n\n但问题是这么做毫无响应式可言，会出现很恶心的`横向滚动条`，另外，移动端的浏览器会默认的将网页缩小，根本`无多终端性`可言。\n\n### 流式布局\n\n在流式布局中，度量单位不再是简单的像素，而是百分比。这使得页面具有可变性。\n\n[点击戳DEMO](/demo/2014-11/ali-percent.html)\n\n当缩小浏览器边框时，`万恶的横向滚动条`消失了。缺点就是有些文本的行宽会看起来太宽，而在小屏幕看起来太窄\n\n当然，在良好的支持CSS3的移动浏览器下，使用`flex布局`更加有优势！\n\n### 弹性布局\n\n这次度量单位又变了，通常情况以em为单位，但是em太依赖于父级，好在CSS3提供了更好的`rem方式`(这个demo找的不好，因为table表格本来就有流动的属性`display:table;display:table-cell;`)。\n\n[点击戳DEMO](/demo/2014-11/ali-rem.html)\n\n其实细想一下，**选择布局方式其实是对`度量单位`的选择!**\n\n另外还有`网格布局`方式，bootstrap就是采用12栅栏布局，另外前不久winner也谈了一些淘宝提供的可伸缩布局方案：[lib.flexible](https://github.com/amfe/lib.flexible)，按照DEMO来看，其使用的是`rem`方式，在改变视窗大小的时候动态的改变基准的比例(浏览器默认是`16px`，设置器基准大小为`62.5%`)。还有人提出来的`混合布局`，但无论哪一种，都离不开上面`固定布局`,`流式布局`,`弹性布局`,三种的支撑。\n\n综上所述，`流式布局`或`弹性布局`或许是响应式布局的更好方式。\n\n## 媒体查询\n\n难道有`流式布局`或`弹性布局`就够了吗？就像一个屌丝升职加薪就够了？不当上CEO怎么赢取白富美？\n\n媒体查询可以让你根据在特定环境下查询到的各种属性值-比如`分辨率`，`色彩深度`，`高度和宽度`(包括设备宽度与视觉宽度)，`横向纵向`,`设备像素比`来决定应用什么样的样式。\n\n我们可以看到我们上面的那些DEMO(我承认这个DEMO找的不好，是从今年阿里校招题目里面抠出来的)，当我们改变浏览器大小时，左边的列表实在是太丑，但是使用媒体查询后的效果就不一样了。\n\n[点击戳DEMO](/demo/2014-11/ali-media.html)\n\n### 媒体查询的语法\n\n语法很简单\n\n\n\t@media [not|only] type [and] [expr] {\n\t\trules\n\t}\n\n解释一下：\n\n* not|only：逻辑关键字\n* expr：媒体表达式\n* type：媒体类型\n* rules：CSS样式\n\n\n\n1.逻辑关键字\n\n有and,not,or,only等，前三个不多说，最后一个是因为很多较老的浏览器支持媒体类型，却不支持媒体查询，有时候导致浏览器去尝试下载那些你不希望用户看到的样式。\n\n2.媒体表达式\n\n表达式支持的也很多，这里也不列举了，重点有:\n* 表示**显示区域**的`width`和`height`\n* 表示**设备区域**的`device-width`和`device-height`\n* 表示**横屏还是竖屏**的`orientation`\n* 表示**设备像素比**`device-pixel-ratio`\n\n3.媒体类型\n\n媒体类型有很多，感兴趣下来查一下，这里就不列举了，一般大多网站设置的是screen，如不你嫌麻烦可以什么都不写(默认为all)，支持所有设备。\n\n4.规则\n\n就是你想要在这个环境下想展示出的CSS\n\n下面一个简单的示例：\n\n```css\n@media sreen and (min-width: 320px) {\n\t\n}\n```\n\n\n另外，媒体查询也可以使用在外部样式上，如：\n\n```html\n<link media=\"only sceen and (min-width:1300px)\" type=\"text/css\" href=\"style.css\">\n```\n\n### 关于断点\n\n这里说的断点不是传统意义的调试断点，而是一些常用的`标准宽度`:\n\n* 320px(iPhone和其他一些设备)\n* 769px(iPad)\n* 1024\n\n依赖这些断点会有一个问题，今天流行的明天未必流行，而且在断点过渡的时候会显得很突兀，所以，确定断点的一个原则是**追随内容**。让设计稿，内容来确定你的断点。\n\n<figure>\n\t<a href=\"/images/article/2014-11/luandun.jpg\">\n\t\t<img src=\"/images/article/2014-11/luandun.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>前端乱炖的断点</figcaption>\n</figure>\n\n### 兼容性\n\n一般的，在IE9一下，加载下列CSS\n\n```html\n<!--[if lt IE 9]>\n<script src=\"http://css3-mediaqueries-js.googlecode.com/svn/trunk/css3-mediaqueries.js\"></script>\n<![endif]-->\n```\n\n## 图片和视频\n\n### 图片\n\n对于背景图片来说，CSS3有个属性为`background-size`，设置为100%就可以自适应，但是在小屏幕的移动设备加载大图片有点`杀鸡焉用宰牛刀`，一般为了加快速度，我们的策略是：`有选择性的加载图片`，一般会有以下四种方法：\n\n1.万能的媒体查询\n\n只加载与当前屏幕相匹配的图片\n\n2.JS做判断\n\nJS提供了一个方法：`window.matchMedia`，可以把CSS媒体查询作为参数传入，返回相关媒体查询是否匹配的信息。\n\n使用方法：\n\n```js\nif(window.matchMedia('(min-width:320px)').matches) {\n\t//其他代码\n}\n```\n\n我们可以利用他来加载合适的图片。\n\n3.使用src.sencha.io \n\n`src.sencha.io`可以传入需要的尺寸和图片地址，自动来压缩图片，使用了CDN+缓存策略技术。当然，我们的服务端也可以自己来实现\n\n<figure>\n\t<a href=\"/images/article/2014-11/sencha.jpg\">\n\t\t<img src=\"/images/article/2014-11/sencha.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>图片已经被压缩到320px</figcaption>\n</figure>\n\n[点击戳图片](http://src.sencha.io/320/http://www.hacke2.cn/images/shiyanshi.jpg)\n\n4.SVG\n\n对于图片伸缩的问题，也可以采用可伸缩矢量图(SGG)来解决。\n\n有关SVG的资料请戳大漠的[w3cplusSVG标签](http://www.w3cplus.com/blog/tags/411.html?u=undefined%26t=%26msgfrom=%26area=msgtext%26clickfrom=3%26clickscene=)。\n\n### 视频\n\n视频的方式与上面类似，可以使用`媒体查询`和`js matchMedia`，当然，用设备看视频的一般是WIFI下，所以直接使用`max-width:100%;height:auto;`也是可以的。如果是连接站外资源，如`优酷`难么，一般解决方法是放到一个iframe里面，详情请看[站外引用的优酷视频，怎样让视频高度自适应？](http://bbs.csdn.net/topics/390600207)\n\n```js\n<div style=\"width:320px;height:180px\" >\n     <iframe height=\"100%\" width=\"100%\" src=\"http://player.youku.com/embed/XNjA3NjQ0MzE2\" frameborder=0 allowfullscreen></iframe>\n</div>\n```\n\n## 总结\n\n写到这边，算是对响应式的一个初级入门吧，但个人觉得，做起来原理简单，但**如果设计一个响应式的网站？怎样保证他的高质量？怎么不会影响到速度？已有网站怎么改为相应式的？**这些才是真正值得我们研究的东西。\n\n## 扩展阅读\n\n[CSS3媒体查询](http://www.w3.org/html/ig/zh/wiki/CSS3%E5%AA%92%E4%BD%93%E6%9F%A5%E8%AF%A2)\n\n[媒体查询简介——第1部分：什么是媒体查询？](http://www.infoq.com/cn/news/2011/12/introducing-media-queries)\n\n[什么是响应式Web设计？怎样进行？](http://www.chinaz.com/manage/2011/1121/221607_2.shtml)\n\n[通过CSS3 Media Query实现响应式Web设计](http://developer.51cto.com/art/201201/312206.htm)\n\n[移动优先的跨终端 Web](http://www.imooc.com/learn/43)\n\n[手机淘宝的flexible设计与实现](http://www.html-js.com/article/Like-the-winter-flexible-design-and-implementation-of-the-mobile-phone-Taobao-cold)\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-11-30-gugong.md",
    "content": "---\nlayout: post\ntitle: 故宫&国家博物馆之行\ndescription: \"北京第一站游记\"\ntags: [游记]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>前几天刚来北京，这几天找房子、买东西，做好该准备的工作后（谢谢猪肉在这几天的帮忙），就开始北京景点之旅。第一站选择`故宫`。\n\n早晨11点来到天安门前，做了安检登上了`天安门`。\n\n<figure>\n\t<a href=\"/images/article/2014-11/tiananmen.jpg\">\n\t\t<img src=\"/images/article/2014-11/tiananmen.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>天安门前</figcaption>\n</figure>\n\n<!--more-->\n\n以前在电视前看到的地方今天终于走了上去，等上`天安门`后，感受了当年伟人的视觉。当然，雾霾很严重远方看的还是很不清晰，但能容纳10万人的广场还是能看见。\n\n<figure>\n\t<a href=\"/images/article/2014-11/tiananmen2.jpeg\">\n\t\t<img src=\"/images/article/2014-11/tiananmen2.jpeg\" alt=\"home\" />\n\t</a>\n\t<figcaption>天安门上</figcaption>\n</figure>\n\n看完一些天安门的介绍，买了票和一张故宫的地图与介绍，然后正式进入紫禁城，一些地方真的是耳熟能详，什么`午门`，`太和殿`，`乾清宫`等等，传说中皇帝上早朝的地方没有想象中的大。\n\n另外，故宫的防火意识挺强的，在很多房子旁边都放了一些`大缸子`，用来防火，而且怕冬天水会冻住，在缸底下也有烧火的。\n\n<figure>\n\t<a href=\"/images/article/2014-11/shuigang.jpeg\">\n\t\t<img src=\"/images/article/2014-11/shuigang.jpeg\" alt=\"home\" />\n\t</a>\n\t<figcaption>用来防火的水缸</figcaption>\n</figure>\n\n逛了几个展厅，不知不觉就快3小时了，看了看地图，还有几处地方漏了，只能回去再逛一遍，返回的途中看到一个很有特色的巷子，人很少，周围全是`红墙黄瓦`，YY了一下当年太监在这条路上跑路的样子。\n\n<figure>\n\t<a href=\"/images/article/2014-11/hongqianghuangwa.jpeg\">\n\t\t<img src=\"/images/article/2014-11/hongqianghuangwa.jpeg\" alt=\"home\" />\n\t</a>\n\t<figcaption>人很少的巷子</figcaption>\n</figure>\n\n在停止买票前进入了锡庆门，看到了传说中的`九龙墙`\n\n<figure>\n\t<a href=\"/images/article/2014-11/jiulongqiang.jpg\">\n\t\t<img src=\"/images/article/2014-11/jiulongqiang.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>传说中的九龙墙</figcaption>\n</figure>\n\n后来又看了几个展馆和`珍妃井`，就走出了`神武门`。门口有卖`冰糖葫芦`的，买了一个，真心好吃。\n\n<figure>\n\t<a href=\"/images/article/2014-11/bthl.jpg\">\n\t\t<img src=\"/images/article/2014-11/bthl.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>北京的冰糖葫芦</figcaption>\n</figure>\n\n后来想去`什刹海`，`后海公园`，因为下起雨来就回了，第二天继续这个地方，打算看看广场附近的地方就去还没去的地方，就是这么任性，来到了`天安门广场`。风真的好大。\n\n<figure>\n\t<a href=\"/images/article/2014-11/gc.jpeg\">\n\t\t<img src=\"/images/article/2014-11/gc.jpeg\" alt=\"home\" />\n\t</a>\n\t<figcaption>天安门广场</figcaption>\n</figure>\n\n结果去的迟了，毛主席纪念堂已经关闭，只能下次再来了。移步到旁边的`国家博物馆`，博物馆内东西太多了，为了细细观赏和感受，所以全程没有照相。\n\n人类历史太久远了，我们不过是滚滚历史长河的一颗小沙粒，想想有点伤感，出来又快6点了，吃了个饭，风太大，就回去了，下次还会来这边，北京能逛得地方是在太多了！\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-11-8-arrow-functions-and-their-scope.md",
    "content": "---\nlayout: post\ntitle: 译-ES6箭头函数和它的作用域\ndescription: \"关于ES6里箭头函数及其作用域的使用\"\ntags: [翻译]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>http://es6rocks.com/2014/10/arrow-functions-and-their-scope/ 原文链接 摇滚ES6中国站快要上线了，大家期待吧，也可以联系[我](https://github.com/hacke2)或者[ES6组织](https://github.com/es6rocks)为这个活动做出点贡献！\n\n在ES6很多很棒的新特性中, 箭头函数 (或者大箭头函数)就是其中值得关注的一个! 它不仅仅是很棒很酷, 它很好的利用了作用域, 快捷方便的在现在使用以前我们用的技术, 减少了很多代码......但是如果你不了解箭头函数原理的话可能就有点难以理解. 所以,让我们来看下箭头函数, 就是现在!\n\n## 执行环境\n\n你可以自己去学习和尝试下, 你可以简单的把示例程序代码复制到你的浏览器控制台下. 现在, 推荐使用Firefox(22+)开发者工具, Firefox(22+)开发者工具现在支持箭头函数,你也可以使用谷歌浏览器. 如果你使用谷歌浏览器, 你必须要做下列两件事:\n- \\- 在谷歌浏览器中地址栏中输入：\"about:flags\", 找到 \"使用体验性Javascript\"选项，开启使用。\n- \\- 在函数的开头加上\"use strict\",然后再在你的谷歌浏览中测试箭头函数吧(提示：请用谷歌浏览器v38,我当时就是被浏览器版本坑了):\n\n```js\n(function(){\n    \"use strict\";\n    // use arrow functions here\n}());\n```\n\n幸运的是后面会有越来越多的浏览器支持ES6特性. 现在你完成了所有准备工作, 让我们继续深入它吧!\n\n<!--more-->\n\n## 一个新话题\n\n最近大家在讨论关于ES6的一个话题：关于箭头函数, 像这样:\n\n```js\n=>\n```\n\n## 新的语法\n\n随着讨论产生了一个新的语法：\n\n```js\nparam => expression\n```\n\n新增的语法是作用在变量上, 可以在表达式中申明多个变量, 下面是箭头函数的使用模式:\n\n```js\n//  一个参数对应一个表达式\nparam => expression;// 例如 x => x+2;\n\n// 多个参数对应一个表达式\n(param [, param]) => expression; //例如 (x,y) => (x + y);\n\n// 一个参数对应多个表示式\nparam => {statements;} //例如 x = > { x++; return x;};\n\n//  多个参数对应多个表达式\n([param] [, param]) => {statements} // 例如 (x,y) => { x++;y++;return x*y;};\n\n//表达式里没有参数\n() => expression; //例如var flag = (() => 2)(); flag等于2\n\n() => {statements;} //例如 var flag = (() => {return 1;})(); flag就等于1\n\n //传入一个表达式，返回一个对象\n([param]) => ({ key: value });\n//例如  var fuc = (x) => ({key:x})\n        var object = fuc(1);\n        alert(object);//{key:1}\n```\n\n## 箭头函数是怎么实现的\n\n我们可以把一个普通函数转换成用箭头函数来实现：\n\n```js\n// 当前函数\nvar func = function (param) {    \n\treturn param.split(\" \");\n}\n// 利用箭头函数实现\nvar func = param => param.split(\" \");\n\n```\n\n从上面的例子中我们可以看出箭头函数的语法实际上是返回了一个新的函数, 这个函数有函数体和参数\n\n因此, 我们可以这样调用刚才我们创建的函数:\n\n```js\nfunc(\"Felipe Moura\"); // returns [\"Felipe\", \"Moura\"]\n```\n\n##  立即执行函数(IIFE)\n\n你能在立即执行函数里使用箭头函数，例如:\n\n```js\n( x => x * 2 )( 3 ); // 6\n```\n\n这行代码产生了一个临时函数，这个函数有一个形参`x`，函数的返回值为`x*2`,之后系统会马上执行这个临时函数, 将`3`赋值给形参`x`.\n\n下面的例子描述了临时函数体里有多行代码的情况：\n\n```js\n( (x, y) => {\n    x = x * 2;\n    return x + y;\n})( 3, \"A\" ); // \"6A\"\n\n```\n\n## 相关思考\n\n思考下面的函数：\n\n```js\nvar func = x => {\n    return x++;\n};\n```\n\n我们列出了一些常见的问题：\n\n**- 箭头函数创建的临时函数的`arguments`是我们预料的那样工作**\n\n```js\nconsole.log(arguments);\n```\n\n**- `typeof`和`instanceof`函数也能正常检查临时函数**\n\n```js\nfunc instanceof Function; // true\ntypeof func; // function\nfunc.constructor == Function; // true\n```\n\n**- 把箭头函数放在括号内是无效的**\n\n```js\n//  有效的常规语法\n(function (x, y){\n    x= x * 2;\n    return x + y;\n} (3, \"B\") );\n\n// 无效的箭头函数语法\n( (x, y) => {\n    x= x * 2;\n    return x + y;\n} ( 3, \"A\" ) );\n\n// 但是可以这样写就是有效的了：\n( (x,y) => {\n\tx= x * 2;return x + y;\n} )( 3,\"A\" );//立即执行函数\n```\n\n**- 尽管箭头函数会产生一个临时函数，但是这个临时函数不是一个构造函数**\n\n```js\nvar instance= new func(); // TypeError: func is not a constructor\n```\n\n**- 同样也没有原型对象**\n\n```js\nfunc.prototype; // undefined\n```\n\n## 作用域\n\n这个箭头函数的作用域和其他函数有一些不同,如果不是严格模式，`this`关键字就是指向`window`，严格模式就是`undefined`，在构造函数里的`this`指向的是当前对象实例,如果this在一个对象的函数内则`this`指向的是这个对象，`this`有可能指向的是一个`dom元素`，例如当我们添加事件监听函数时,可能这个`this`的指向不是很直接，其实`this`（不止是`this`变量）变量的指向是根据一个规则来判断的：作用域流。下面我将演示`this`在事件监听函数和在对象函数内出现的情况： \n\n在事件监听函数中：\n\n```js\ndocument.body.addEventListener('click', function(evt){\n    console.log(this); // the HTMLBodyElement itself\n});\n```\n\n在构造函数里：\n\n```js\nfunction Person () {\n\n    let fullName = null;\n\n    this.getName = function () {\n        return fullName;\n    };\n\n    this.setName = function (name) {\n        fullName = name;\n        return this;\n    };\n}\n\nlet jon = new Person();\njon.setName(\"Jon Doe\");\nconsole.log(jon.getName()); // \"Jon Doe\"\n//注：this关键字这里就不解释了，大家自己google,badu吧。\n```\n\n\n在这个例子中，如果我们让Person.setName函数返回Person对象本身，我们就可以这样用：\n\n```js\njon.setName(\"Jon Doe\")\n   .getName(); // \"Jon Doe\"\n```\n\n在一个对象里:\n\n```js\nlet obj = {\n    foo: \"bar\",\n    getIt: function () {\n        return this.foo;\n    }\n};\n\nconsole.log( obj.getIt() ); // \"bar\"\n```\n\n但是当执行流(比如使用了setTimeout)和作用域变了的时候，this也会变。\n\n```js\nfunction Student(data){\n\n    this.name = data.name || \"Jon Doe\";\n    this.age = data.age>=0 ? data.age : -1;\n\n    this.getInfo = function () {\n        return this.name + \", \" + this.age;\n    };\n\n    this.sayHi = function () {\n        window.setTimeout( function () {\n            console.log( this );\n        }, 100 );\n    }\n\n}\n\nlet mary = new Student({\n    name: \"Mary Lou\",\n    age: 13\n});\n\nconsole.log( mary.getInfo() ); // \"Mary Lou, 13\"\nmary.sayHi();\n// window\n\n```\n\n当`setTimeout`函数改变了执行流的情况时，`this`的指向会变成全局对象,或者是在严格模式下就是`undefine`,这样在`setTimeout`函数里面我们使用其他的变量去指向`this`对象，比如`self`，`that`,当然不管你用什么变量，你首先应该在setTimeout访问之前，给`self`，`that`赋值，或者使用`bind`方法不然这些变量就是undefined。\n\n这是后就是箭头函数登场的时候了，它可以保持作用域，this的指向就不会变了。\n\n让我们看下上文**起先**的例子，在这里我们使用箭头函数：\n\n```js\nfunction Student(data){\n\n    this.name = data.name || \"Jon Doe\";\n    this.age = data.age>=0 ? data.age : -1;\n\n    this.getInfo = function () {\n        return this.name + \", \" + this.age;\n    };\n\n    this.sayHi = function () {\n        window.setTimeout( ()=>{ \n        \t// the only difference is here\n            console.log( this );\n        }, 100 );\n    }\n\n}\n\nlet mary = new Student({\n    name: \"Mary Lou\",\n    age: 13\n});\n\nconsole.log( mary.getInfo() ); // \"Mary Lou, 13\"\nmary.sayHi();\n// Object { name: \"Mary Lou\", age: 13, ... }\n\n```\n\n>分析：在sayHi函数中，我们使用了箭头函数，当前作用域是在student对象的一个方法中，箭头函数生成的临时函数的作用域也就是student对象的sayHi函数的作用域。所以即使我们在setTimeout调用了箭头函数生成的临时函数，这个临时函数中的this也是正确的指向。\n\n##  有趣和有用的使用\n\n创建一个函数很容易，我们可以利用它可以保持作用域的特征：\n\n例如我们可以这么使用：Array.forEach()\n\n```js\nvar arr = ['a', 'e', 'i', 'o', 'u'];\narr.forEach(vowel => {\n    console.log(vowel);\n});\n```\n\n>分析：在forEach里箭头函数会创建并返回一个临时函数 tempFun,这个tempFun你可以想象成这样的：function(vowel){ console.log(vowel);}但是Array.forEach函数会怎么去处理传入的tempFunc呢？在forEach函数里会这样调用它：tempFunc.call(this,value);所有我们看到函数的正确执行效果。\n\n\nmap里使用箭头函数，这里我就不分析函数执行过程了。。。。\n\n```js\nvar arr = ['a', 'e', 'i', 'o', 'u'];\narr.map(vowel => {\n    return vowel.toUpperCase();\n});\n// [ \"A\", \"E\", \"I\", \"O\", \"U\" ]\n```\n\n费布拉奇数列\n\n```js\nvar factorial = (n) => {\n    if(n==0) {\n        return 1;\n    }\n    return (n * factorial (n-1) );\n}\n\nfactorial(6); // 720\n```\n\n我们也可以用在Array.sort方法里：\n\n```js\nlet arr = ['a', 'e', 'i', 'o', 'u'];\narr.sort( (a, b)=> a < b? 1: -1 );\n```\n\n也可以在事件监听函数里使用：\n\n```js\ndocument.body.addEventListener('click', event=>console.log(event, this)); // EventObject, BodyElement\n```\n\n## 推荐的链接\n\n下面列出了一系列有用的链接，大家可以去看一看\n\n- \\- [Arrow Functions in MDN Documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)\n- \\- [TC39 Wiki about Arrow Function](http://tc39wiki.calculist.org/es6/arrow-functions/)\n- \\- [ESNext](https://github.com/esnext)\n- \\- [ES6 Tools](https://github.com/addyosmani/es6-tools)\n- \\- [Grunt ES6 Transpiler](https://www.npmjs.org/package/grunt-es6-transpiler)\n- \\- [ES6 Fiddle](http://www.es6fiddle.net/)\n- \\- [ES6 Compatibility Table](http://kangax.github.io/compat-table/es6/)\n\n## 总结\n\n尽管大家可能会认为使用箭头函数会降低你代码的可读性，但是由于它对作用域的特殊处理，它能让我们能很好的处理this的指向问题。箭头函数加上let关键字的使用，将会让我们javascript代码上一个层次！尽量多使用箭头函数，你可以再你的浏览器测试你写的箭头函数代码，大家可以再评论区留下你对箭头函数的想法和使用方案！我希望大家能享受这篇文章，就像你会不就的将来享受箭头函数带给你的快乐.\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-12-2-fe-cut-image.md",
    "content": "---\nlayout: post\ntitle: 实习初体验之前端切图\ndescription: \"前端切图的一些小技巧\"\ntags: [PS]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>以前在实验室做项目图都是美工同学给切好的，结果。。不会，给我一个PSD我竟然不会切--，让同事演示了一下太快了，没好意思再问，最后找`小娟同学`语音演示了一把，才算了解个大概。\n\n首先，我们把PSD加载到PS中。\n\n<figure>\n\t<a href=\"/images/article/2014-11/1.png\">\n\t\t<img src=\"/images/article/2014-11/1.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>用PS CS5打开psd文件</figcaption>\n</figure>\n\n<!--more-->\n\n用左侧放大镜放大后，点击左侧工具栏，选择自动选择，选择图层\n\n<figure>\n\t<a href=\"/images/article/2014-11/2.png\">\n\t\t<img src=\"/images/article/2014-11/2.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>如图选择好</figcaption>\n</figure>\n\n选择好那个暂停图标，右侧图层出现了要切出的图片，可以点击那个`眼睛`试一下，点一下如果消失就OK。\n\n<figure>\n\t<a href=\"/images/article/2014-11/3.png\">\n\t\t<img src=\"/images/article/2014-11/3.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>我们已经找到了要切的</figcaption>\n</figure>\n\n然后我们点击右键\n\n<figure>\n\t<a href=\"/images/article/2014-11/4.png\">\n\t\t<img src=\"/images/article/2014-11/4.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>选择复制图层</figcaption>\n</figure>\n\n选择目标文档为`新建`，名称起为`stop`\n\n<figure>\n\t<a href=\"/images/article/2014-11/5.png\">\n\t\t<img src=\"/images/article/2014-11/5.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>设置好点击确定</figcaption>\n</figure>\n\n而后会出来一个透明的图层，然后我们将之前选择的图层进行裁剪。使用快捷键：\n\n`Alt + I +R `\n\n<figure>\n\t<a href=\"/images/article/2014-11/6.png\">\n\t\t<img src=\"/images/article/2014-11/6.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>出现一个弹框点击确定</figcaption>\n</figure>\n\n现在，我们已经将那个待切除的图片准备好了\n\n<figure>\n\t<a href=\"/images/article/2014-11/7.png\">\n\t\t<img src=\"/images/article/2014-11/7.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>那一个小小的暂停按钮</figcaption>\n</figure>\n\n然后，我们要将这个图片保存到本地，使用快捷键：\n\n`Ctrl + Alt + R + S `\n\n弹出一个对话框，选择png24，点击存储。\n<figure>\n\t<a href=\"/images/article/2014-11/8.png\">\n\t\t<img src=\"/images/article/2014-11/8.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>保存我们的小图标</figcaption>\n</figure>\n\n关于选择图片格式阿里UED有个不错的文章：[图片格式与设计那点事儿](http://ued.taobao.org/blog/2010/12/jpg_png/)\n\n这样就完成了切图工作。\n\n如何切多个图呢？在选择图层的时候按住`shift`就可以了。\n\n**反思：**该做的还得做，欠下的还是要还的。\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-12-8-my-university-experience.md",
    "content": "---\nlayout: post\ntitle: 给学弟学妹说的话\ndescription: \"我的大学经历\"\ntags: [感悟]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>今天学弟找到我，让我说说大学里的经历，给以后的学弟学妹们可以参考一下。说我其实没啥东西留下的，的确有点装逼了，我确实比较幸运，现在在一个条件相对不错的公司实习，那我就说一些吧。\n\n## 兴趣是最好的老师\n\n有没有兴趣是看你能不能在一行业持久下去的最关键因素。我不相信对IT，没有一点兴趣的人会成为一个巨匠。但是有些同学可能之前没有接触过计算机，没有兴趣，那就强迫自己爱上他。找些相关纪录片，电影看看，看看那些牛人的历程，找一个计算机相关专业的男友，或许你就会爱上计算机：D，如果真的没有兴趣，**至少要找一个以后能养家糊口的本事**。\n\n有了兴趣你可能会加入一些实验室，组织等，会寻求那些与你志同相合的人，这样，`人脉`也有了\n\n## 积累与分享\n\n有了兴趣后，你自己就会不由自主的动起手来了，码点小玩意，分享点小技巧，写点小博客，**每一步都是你的脚印，也是你未来的谈判筹码**。当你花上几年时间看看以前走的脚印，你会感动到自己。\n\n积累和分享最好的手段就是写博客了，以下是我这两年的积累：\n\n* [我以前CSDN的博客 http://blog.csdn.net/hacke2](http://blog.csdn.net/hacke2)\n* [我现在Github的博客 http://www.hacke2.cn/](http://www.hacke2.cn/)\n\n`最好的阅读是输出`，将自己所学习到的东西梳理以下，形成文字，再重新认知一遍，你会理解的更加深入。有个程序员听完网上视频后就当场敲一遍，不会了再看看那视频，然后第二天再敲一遍，再一次巩固，获取敲得过程不是很顺利，但是几年坚持下来，真心强大。\n\n还可以加一些高质量的QQ群，在一些论坛上活跃活跃，帮助他人自己也学到了东西，很多都是一线企业的第一手信息，而且顺带混个脸熟：D。\n\n## 实际的项目\n\n如果你能加入实验室，做真实的项目是非常幸运的，但由于实验室空间有限，如果你没能进入实验室也不要紧，跟着其他老师做（如`徐传云老师`，`刘亚辉老师`,`李刚老师`）、其他组织，如我校的`CFC`，或者寒暑假在外面公司实习，或是网上结识伙伴做外包、参加开源项目等。**有些人只会在院长信箱抱怨，而有些人自己寻求出路。**\n\n## 一句话\n\n其他的不说了，谋事在人，成事在天，有些坑必须得自己趟一下才服气，最好送上一句话，祝学弟学妹有一个好的未来：\n\n**不该在最应该努力的年龄选择安逸，不被嘲笑的梦想，没有实现的价值**\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2014-8-29-hello-memory-leak.md",
    "content": "---\nlayout: post\ntitle: JavaScript内存泄漏\ndescription: \"进入WEB 2.0 时代，js人们对Web应用有了高更的要求.一个页面很可能数小时不会发生URL跳转，并同时通过Web服务动态的更新页面内容.复杂的事件关联设计、基于对象的JScript和DHTML技术的广泛采用，使得代码的能力达到了其承受的极限.在这样的情况和改变下，弄清楚内存泄露方式变得非常的急迫。那么，为什么会出现内存溢出呢？\"\ntags: [JavaScript, 内存泄漏]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n# 简介\n\n所谓内存泄露就是内存空间使用完毕之后未回收。在过去Web开发人员并没有太多的去关注内存泄露问题.那时的页面间联系大都比较简单，js使用的功能主要是表单校验，不会有太多关于特效以及业务等方面上的扩展，而进入WEB 2.0 时代，js人们对Web应用有了高更的要求.一个页面很可能数小时不会发生URL跳转，并同时通过Web服务动态的更新页面内容.复杂的事件关联设计、基于对象的JScript和DHTML技术的广泛采用，使得代码的能力达到了其承受的极限.在这样的情况和改变下，弄清楚内存泄露方式变得非常的急迫。那么，为什么会出现内存溢出呢？\n\n<!--more-->\n\t\t\t\t\t\t\t\n# 内存分配与垃圾回收\n\n说道内存泄露，就不得不谈到内存分配的方式。内存分配有三种方式，分别是：\n\n## 静态分配(Static Allocation )\n\n静态变量和全局变量的分配形式。如果把房间看做一个程序，我们可以把静态分配的内存当成是房间里的耐用家具。通常，它们无需释放和回收，因为没人会天天把大衣柜当作垃圾扔到窗外。\n\n## 自动分配( Automatic Allocation )\n\n在栈中为局部变量分配内存的方法。栈中的内存可以随着代码块退出时的出栈操作被自动释放。\n这类似于到房间中办事的人，事情一旦完成，就会自己离开，而他们所占用的空间，也随着这些人的离开而自动释放了。\n\n## 动态分配( Dynamic Allocation )\n\n在堆中动态分配内存空间以存储数据的方式。也就是程序运行时用malloc或new申请的内存，我们需要自己用free或delete释放。动态内存的生存期由程序员自己决定。一旦忘记释放，势必造成内存泄露。这种情况下，堆中的内存块好像我们日常使用的餐巾纸，用过了就得扔到垃圾箱里，否则屋内就会满地狼藉。因此，懒人们做梦都想有一台家用机器人跟在身边打扫卫生。在软件开发中，如果你懒得释放内存，那么你也需要一台类似的机器人——这其实就是一个由特定算法实现的垃圾收集器。而正是垃圾收集机制本身策略的一些缺陷，导致了javascript内存泄漏。具体到浏览器中的实现，通常有以下两个策略：\n\n### 标记清除\n\nJavascript最常用的垃圾回收方式是“标记清除”(mark-and-sweep)。当变量进入环境（如在函数中声明了一个变量），则为其标记为“进入环境”；当变量离开环境，则为其标记为“离开环境”。垃圾回收器会定时扫描那些“离开环境”的变量，销毁那些被标记的值并回收它们所占的内存。\n除了IE7以前的版本、Netscape Navigate3.0,其他版本的浏览器都用的是标记清除的垃圾回收策略。\n\n### 引用计数\n\n引用计数的含义是跟踪记录每个值被引用的次数，如当声明一个变量并将一个引用类型赋给该变量时，这个值的引用次数就是1，如果这个引用类型赋给另一个变量，它的引用类型加1,。相反，如果第一个变量又引用了其他引用类型时，之前的引用类型的引用次数就减1，直到减成0。当垃圾回收下一次运行的时候，就会释放掉引用次数为0的引用类型的内存。\n该方式有一个严重的问题，请看下面例子：\n\n```js\nfunction problem(){\n\tvar objA = {};\n\tvar objB = {}; \n\t\n\tobjA.someOtherObject = objB;\n\tobjB.anotherObject = objA;\n}\n```\n\nobjA、objB通过各自的属性相互引用，如果采用引用计数，objA和objB会一直存在。假使这个函数多次被调用，大量内存不能回收，直接导致内存泄漏。\n\n# 常见内存泄漏及解决\n\n## 循环引用(Circular References)\n\nIE浏览器的COM组件产生的对象实例和网页脚本引擎产生的对象实例相互引用，就会造成内存泄漏。这也是Web页面中我们遇到的最常见和主要的泄漏方式；\n<br />例:\n\n```js\nvar element = document.getElementById(“some-element”);\nvar myobject = {}; \nmyobject.element = element;\nelement.someElement = myobject;\n```\n\n在此例中DOM元素与一个原生javascript对象形成循环引用，其中myobject.element指向element元素，element.someElement指向element对象，由于存在这个循环引用，即使将该DOM从页面中移除，它也永远不会被回收。为了避免该问题，最好在使用完毕后手动将其移除:\n\n```js\nvar element = document.getElementById(“some-element”);\nvar myobject = {}; \nmyobject.element = element;\nelement.someElement = myobject;\n//当使用完后\nmyobject.element = null;\nelement.someElement = null;\n```\n\n为了解决上述问题，IE9以后将所有的BOM和DOM都转换成了javascript对象，这样，就避免了两种垃圾回收机制都存在的问题，也就消除了常见的内存泄漏的问题。\n\n## 内部函数引用(Closures)\n\nClosures也就是闭包，外部变量可以应用内部函数的局部变量，当外部变量一直引用，那么该局部变量会在内存中一直存在，如果有大量这样的情况，则可能会出现内存泄漏；\n<br />例:\n\n```js\nfunction closures() {\n\tvar a = 10;\n\treturn function () {\n\t\treturn a;\n\t}\n}\nvar b = closures()();\n```\n\n在此例中，closures函数下有个闭包，返回了该函数的局部变量a，外部有一个变量b引用了a，则如果b不释放a，a会一直存在于内存中，解决方法就是在在b使用完后，主动的释放b：\n\n```\nfunction closures() {\n\tvar a = 10;\n\treturn function () {\n\t\treturn a;\n\t}\n}\nvar b = closures()();\n//b使用完后\nb = null;\n```\n\n>原文摘自《Web前端案例教材》 ---重庆理工大学创新实验室\n\n<strong>end</strong>"
  },
  {
    "path": "_posts/2014-8-29-web-development-process.md",
    "content": "---\nlayout: post\ntitle: 高大上Web前端开发环境\ndescription: \"前几天做阿里笔试题，最后一个问题是：在前端开发中，经常会遇到调用后端接口的情况，如果我们不想依赖后台的开发环境，比如：本地搭建熟悉的环境，模拟AJAX，说出你的解决方案\n记得我当时是这样答的：\"\ntags: [JavaScript]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n# 起因\n\n前几天做阿里笔试题，最后一个问题是：在前端开发中，经常会遇到调用后端接口的情况，如果我们不想依赖后台的开发环境，比如：本地搭建熟悉的环境，模拟AJAX，说出你的解决方案\n记得我当时是这样答的：\n\n<!--more-->\n\n### 若java\n\n\t1.使用tomcat环境\n\t2.使用selvet\n\n```js\nprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {\n\tresp.getOutputStream().write(\"{status:'ok',value:'11'}\".getBytes(\"UTF-8\"));\n\tresp.setContentType(\"text/json; charset=UTF-8\");\n}\n```\n\n### 若php\n\n1.使用wamp 环境   \n2.后端PHP构造json数据\n\n```php\necho \"{status:'ok',value:'11'}\";\n//或者\necho json_encode($result);//$result 是数组\n```\n\n\n### 若对数据没有动态提取的要求，则直接放大xxx.json里面\n\njson格式为\n\n```json\n{'status':'ok','value':'11'}\n```\n\n* 前台使用AJAX请求\n\n```js\nfunction ajax(url, success, fail){\n    // 1. 创建连接\n    var xhr = null;\n    if(window.XMLHttpRequest){\n        xhr = new XMLHttpRequest()\n    } else {\n        xhr = new ActiveXObject('Microsoft.XMLHTTP');\n    }\n    // 2. 连接服务器\n    xhr.open('get', url, true)\n    // 3. 发送请求\n    xhr.send(null);\n    // 4. 接受请求\n    xhr.onreadystatechange = function(){\n        if(xhr.readyState == 4){\n            if(xhr.status == 200){\n                success(xhr.responseText);\n            } else { // fail\n                fail && fail(xhr.status);\n            }\n        }\n    }\n}\n//请求到数据\nvar url =  'json.php'...其他地址\najax(url, function(data) {\n    data.status\n})\n```\n\n后来自己又想了一下，其实这道题就看你平时前端开发的环境是怎样的，因为我是JAVA出生，所以一想就想到了启动一个tomcat来启动一个服务器，上面开启一个sevlet来输出json数据。\n总感觉这样太“重量级”了，在网上查了一查，才知道了阿里真实的意图--。\n\n### 先不说阿里意图是什么，先看看现在高大上的前端开发环境：\n\n* 代码编辑工具\n* 断点调试工具\n* 版本管理工具\n* 代码合并和混搅工具\n* 依赖管理工具\n* 单元测试工具\n* 集成测试工具\n\n<strong>你没看错，这不是后端开发环境，这竟然是前端的开发环境!</strong>\n\n下面，我们就来说说<strong>这些工具有哪些，在JAVA里面对应那些工具</strong>\n\n<!--\n##代码编辑工具：Sublime Text、WebStrom、HBuilder\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/1.jpg\" alt=\"\"></a>\n\t<figcaption>Sublime Text被称为是最性感的代码编辑器，很多插件，体积也很小</figcaption>\n</figure>\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/2.jpg\" alt=\"\"></a>\n\t<figcaption>HBuilder是国产的一款基于eclipse的IDE，专门编写HTML5/CSS3/JavaScript等</figcaption>\n</figure>\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/3.jpg\" alt=\"\"></a>\n\t<figcaption>WebStorm，一款非常流行的IDE，可以看这个方法在哪一个浏览器兼容，拥有众多插件</figcaption>\n</figure>\n\n\n## 断点调试工具： FireBug, chrome Debug\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/1.jpg\" alt=\"\"></a>\n\t<figcaption>Sublime Text被称为是最性感的代码编辑器，很多插件，体积也很小</figcaption>\n</figure>\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/2.jpg\" alt=\"\"></a>\n\t<figcaption>HBuilder是国产的一款基于eclipse的IDE，专门编写HTML5/CSS3/JavaScript等</figcaption>\n</figure>\n\n## 版本管理工具：Git\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/1.jpg\" alt=\"\"></a>\n\t<figcaption>Sublime Text被称为是最性感的代码编辑器，很多插件，体积也很小</figcaption>\n</figure>\n\n## 代码合并和混搅工具：Grunt(基于NodeJS)\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/1.jpg\" alt=\"\"></a>\n\t<figcaption>Sublime Text被称为是最性感的代码编辑器，很多插件，体积也很小</figcaption>\n</figure>\n\n## 依赖管理工具：bower(基于NodeJS)\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/1.jpg\" alt=\"\"></a>\n\t<figcaption>Sublime Text被称为是最性感的代码编辑器，很多插件，体积也很小</figcaption>\n</figure>\n\n## 单元测试工具：jasmine(基于NodeJS)\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/1.jpg\" alt=\"\"></a>\n\t<figcaption>Sublime Text被称为是最性感的代码编辑器，很多插件，体积也很小</figcaption>\n</figure>\n\n## 单元测试工具：jasmine(基于NodeJS)Karma自动化完成单元测试\n\n<figure>\n\t<img src=\"images/2014-8-29-web-development-process/1.jpg\" alt=\"\"></a>\n\t<figcaption>Sublime Text被称为是最性感的代码编辑器，很多插件，体积也很小</figcaption>\n</figure>\n-->\n<strong>未完待续...</strong>"
  },
  {
    "path": "_posts/2014-8-31-javascript-quiz.md",
    "content": "---\nlayout: post\ntitle: Javascript Quiz\ndescription: \"Javascript Quiz 练习题解析\"\ntags: [JavaScript]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n### 1.考点：arguments的类型\n\n```js\n  (function(){\n\t  return typeof arguments;\n  })();\n```\n\n这个题考的是，乍一看arguments可能是一个数组，因为一般可以这样取到:arguments[0]、arguments[1]、arguments[2]\n可其实他是类似于jQuery对象的方式，用类来模拟数组，类似于这样的:\n\n```js\n  var arguments = {\n  \t  0 : '第一个参数',\n\t  1 : '第二个参数',\n\t  2 : '第三个参数',\n\t  length : 3,\n\t  //其他属性或方法\n  }\n```\n\n所以结果是 'object'，默认不为undefined\n\n<!--more-->\n\n### 2.考点：函数的内部属性name\n\n```js\n  var f = function g(){ return 23; };\n  typeof g();\n```\n\ng可选可不选,如果加上，则为函数的内部属性，如调用f.name 输出 g，直接调用会说g未定义\n\n### 3.考点：delete\n\n```js\n  (function(x){\n      delete x;\n      return x;\n  })(1);\n```\n\ndelete 会删除对象的属性，如var a ={ b : 1}; delete a.b;此时打印a为{}，但是不会删除形参,输出为1\n\n### 4.考点：赋值顺序\n\n```js\n  var y = 1, x = y = typeof x;\n  x;\n```\n\n基本所有语言都赋值都是从右向左赋值，typeof x得到结果为'undefined'，最终赋给y和x，打印出来为'undefined'\n\n### 5.考点：typeof\n\n```js\n  (function f(f){\n    return typeof f();\n  })(function(){ return 1; });\n```\n\ntypeof的运算数未定义,返回的就是 \"undefined\". 运算数为数字 typeof(x) = \"number\" 字符串 typeof(x) = \"string\" 布尔值 typeof(x) = \"boolean\" 对象,数组和null typeof(x) = \"object\" 函数 typeof(x) = \"function\" \n函数返回为1，输出'number'\n\n### 6.考点：typeof\n\n```js\n  var foo = {\n    bar: function() { return this.baz; },\n    baz: 1\n  };\n  (function(){\n    return typeof arguments[0]();\n  })(foo.bar);\n```\n\n和上一题类似，将bar函数传进去，arguments[0]指向foo.bar函数，函数指向，但此时this是window对象，window对象下午baz，所以是'undefined'\n若将题目改为以下，则返回'number'\n\n```js\n  var foo = {\n    bar: function() { return this.baz; },\n    baz: 1\n  };\n  (function(){\n    return typeof arguments[0].call(foo);\n  })(foo.bar,foo);\n```\n\n\n### 7.考点：作用域\n\n```js\n  var foo = {\n    bar: function(){ return this.baz; },\n    baz: 1\n  }\n  typeof (f = foo.bar)();\n```\n\n原因参见上题,输出'undefined'\n\n### 8.考点：逗号表达式\n\n```js\n  var f = (function f(){ return \"1\"; }, function g(){ return 2; })();\n  typeof f;\n```\n\n输出为 'function' , f执行的结果为函数表达式里最后一个，如在函数表达式再加一个,function h(){return 3}，则输出3\n如果为非函数则为少一个立即执行函数以下代码，输出b\n\n```js\nvar f = ('a', 'b');\nconsole.log(f);\n```\n\n### 9.考点：JavaScript加性操作符\n\n```js\n  var x = 1;\n  if (function f(){}) {\n    x += typeof f;\n  }\n  x;\n```\n\n参考《javascript 高级程序设计 第三版》 3.5.5章,输出为字符串'1undefined'\n\n### 10.考点：typeof\n\n```js\n  var x = [typeof x, typeof y][1];\n  typeof typeof x;\n```\n\n'string'的typeof 肯定也是'string', 输出为字符串'string'\n\n### 11.考点：不知道考的是啥，文字游戏吧\n\n```js\n  (function(foo){\n    return typeof foo.bar;\n  })({ foo: { bar: 1 } });\n```\n\n输出'undefined'，如果return typeof foo.foo.bar;为期望值\n\n### 12.考点：函数提升\n\n```js\n  (function f(){\n    function f(){ return 1; }\n    return f();\n    function f(){ return 2; }\n  })();\n```\n\n函数提升了两次，第二次把第一次覆盖了，所以 return 后面的 f 是 return 语句的下一条语句声明的函数 f .\n\n### 13.考点：实例化对象\n\n```js\n  function f(){ return f; }\n  new f() instanceof f;\n```\n\n如果函数无返回值，则返回一个对象的实例，若果有返回值，则为改返回值,输出为false\n\n### 14.考点：with\n\n```js\n  with (function(x, undefined){}) length;\n```\n\nwhth改变了函数的作用域，其实里面的length为函数function(x, undefined){}.length, 函数length表示给函数真正传的参数的个数，为2\n\n>以上题目来源：http://perfectionkills.com/javascript-quiz/"
  },
  {
    "path": "_posts/2014-9-1-cqut-paging.md",
    "content": "---\nlayout: post\ntitle: JavaScript模仿实验室分页组件\ndescription: \"实验室分页组件，一个简单的分页，非AJAX局部刷新\"\ntags: [小练习, JavaScript]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 起因\n\n刚才蔡哥让我重启一下邻水项目服务器，我顺便有回顾了一下去年做的项目。。当时我的任务是园区动态+配置管理，园区动态里有个分页\n当时是拿实验室以前项目：泛教育分页组件做的，完全是拿来主义，现在看到，就像用javascript实现一下，没什么技术含量，设计思路也是\n至少7年前的，直接一个a标签打开一个连接，将你的当前页数传到后台去。什么时候再做一个AJAX的。\n\n# 分析\n\n邻水分页如下图：\n<img src=\"/images/article/cqut-paging/1.jpg\" alt=\"邻水分页\" />\n现在数据还不是很多，显示了三条，而且有首页、尾页、上页、下页等辅助按钮，当当前页为第一个时，上页和首页成不可点击状。\n当当前页为最后一个时，下页和尾页成不可点击状。\n还有以下规则：\n* 如果总页数大于10且当前页远离总页数(小于5)，则显示5个，后面的省略直到最后一个；\n* 总页数大于10且当前页接近总页数(小于总页数-3)则显示后4个；\n* 除开上面两个情况，显示当前页前后2页\n\n<!--more-->\n\n# 代码\n\n将page传到后台去取数据，一页显示多少条也在后台弄吧，用a数组存a标签，比字符串拼接快很多，StringBuffer也是按照这个原理实现的。\n\n\n```js\n\tfunction iPage(obj,count,curPage){  \n\t\tvar href = 'article.do?page=';\n\t\tvar obj=obj;\n\t\tvar count=count;\n\t\tvar curPage=curPage;\n\t\tvar a=[];\n\t\t//总页数少于10 全部显示,大于10 显示前3 后3 中间3 其余....\n\t\n\t\tif(curPage == 1) {\n\t\t\ta.push('<a href=\"#\" class=\"unclick\" >首页</a>');\n\t\t\ta.push('<a href=\"#\" class=\"unclick\" >上页</a>');\n\t\t}\n\t\telse {\n\t\t\ta.push('<a href=\"' + href + 1 + '\" >首页</a>');\n\t\t\ta.push('<a href=\"' + href + (curPage-1) + '\"  >上页</a>');\n\t\t}\n\n\t\t//总页数小于10\n\t\tif(count<=10){\n\t\t\tfor(var i=1;i<=count;i++){\n\t\t\t\tcreatePage(i);\n\t\t\t}\n\t\t}else {\n\t\t\tif(curPage <= 4) {//总页数大于10且当前页远离总页数(小于5)\n\t\t\t\tfor(var i = 1; i <=5; i++) {\n\t\t\t\t\tcreatePage(i);\n\t\t\t\t}\n\t\t\t\ta.push('...<a href=\"' + href + count + '\">'+count+'</a>')\n\t\t\t}else if(curPage>=count-3){//总页数大于10且当前页接近总页数(小于总页数-3)\n\t\t\t\ta.push('<a href=\"' + href + 1 + '\">1</a>');\n\t\t\t\tfor(var i=count-4;i<=count;i++){\n\t\t\t\t\tcreatePage(i);\n\t\t\t\t}\n\t\t\t}else{ //除开上面两个情况\n\t\t\t\ta.push('<a href=\"' + href + 1 + '\">1</a>...');\n\t\t\t\tfor(var i=curPage-2;i<=curPage+2;i++){\n\t\t\t\t\tcreatePage(i);\n\t\t\t\t}\n\t\t\t\ta.push('...<a href=\"' + href + count + '\">'+count+'</a>');\n\t\t\t}\n\t\t}\n\n\t\tif(curPage==count){\n\t\t\ta.push('<a href=\"#\" class=\"unclick\">下页</a>');\n\t\t\ta.push('<a href=\"#\" class=\"unclick\">尾页</a>');\n\t\t}\n\t\telse{\n\t\t\ta.push('<a href=\"' + href + (curPage + 1) + '\">下页</a>');\n\t\t\ta.push('<a href=\"' + href + count + '\">尾页</a>');\n\t\t}\n\t\t\n\t\tobj.innerHTML=a.join(\"\");\n\n\t\t//生成页面\n\t\tfunction createPage(i){\n\t\t\tif(curPage==i){\n\t\t\t\ta.push('<a href=\"' + href + i + '\" class=\"on\">'+i+'</a>');\n\t\t\t}\n\t\t\telse{\n\t\t\t\ta.push('<a href=\"' + href + i + '\" >'+i+'</a>');\n\t\t\t}\n\t\t}\n\t}\n```\n\n\n## <a style=\"color:red\" href=\"/demo/cqut-paging/demo.html\" >查看完整DEMO</a>\n\n\n<img src=\"/images/article/cqut-paging/2.jpg\" alt=\"我的分页\" />\n\n<strong>end</strong>"
  },
  {
    "path": "_posts/2014-9-1-oschina-angularjs.md",
    "content": "---\nlayout: post\ntitle: 开源中国的 AngularJS 优秀文章汇总\ndescription: \"在开源中国看到的，每一篇都是精华\"\ntags: [小练习, JavaScript]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>Angular JS (Angular.JS) 是一组用来开发Web页面的框架、模板以及数据绑定和丰富UI组件。它支持整个开发进程，提供web应用的架构，无需进行手工DOM操作。 AngularJS很小，只有60K，兼容主流浏览器，与 jQuery 配合良好。\n\n<image src=\"http://www.oschina.net/uploads/img/201101/20193253_4wJ1.gif\" width=\"582\" height=\"262\" alt=\"angularJS\" />\n\n<!--more-->\n\n<ul><li><p><a href=\"http://my.oschina.net/blogshi/blog/303758\" title=\"【每日一博】AngularJS 通过 CORS 实现跨域方案\">AngularJS 通过 CORS 实现跨域方案</a></p></li><li><p><a href=\"http://my.oschina.net/blogshi/blog/300595\" title=\"【每日一博】Angular 实现权限控制 - 基于RBAC\">Angular 实现权限控制 - 基于RBAC</a></p></li><li><p><a href=\"http://my.oschina.net/blogshi/blog/293631\" title=\"【每日一博】不可错过的 AngularJS 应用技巧\">不可错过的 <span class=\"highlight\">AngularJS</span> 应用技巧</a></p></li><li><p><a href=\"http://my.oschina.net/ilivebox/blog/289670\" title=\"【每日一博】AngularJS 自定义控件\"><span class=\"highlight\">AngularJS</span> 自定义控件</a></p></li><li><p><a href=\"http://my.oschina.net/blogshi/blog/280400\" title=\"【每日一博】AngularJS 项目构建指南\"><span class=\"highlight\">AngularJS</span> 项目构建指南</a></p></li><li><p><a target=\"_blank\" href=\"http://my.oschina.net/trumanspace/blog/207449\">整合jQuery Mobile+AngularJs 经验谈</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-performance-improvement\" target=\"_blank\" title=\"AngularJS 性能优化二三事\">AngularJS 性能优化二三事</a></p></li><li><p><a href=\"http://www.oschina.net/translate/developing-a-large-scale-application-with-a-single\" target=\"_blank\" title=\"Developing a Large Scale Application with a Single Page Application (SPA) using AngularJS\">Developing a Large Scale Application with a Single Page Application (SPA) using AngularJS...</a></p><p>&nbsp; 使用 AngularJS 开发一个大规模的单页应用（SPA）<em>(已翻译17%)</em></p></li><li><p><a href=\"http://www.oschina.net/translate/better-ux-with-angularjs-directives\" target=\"_blank\" title=\"改善用户体验的 3 个 AngularJS 指令\">改善用户体验的 3 个 AngularJS 指令</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-role-based-access-on-gui\" target=\"_blank\" title=\"AngularJS – 实现基于角色访问控制的 GUI\">AngularJS – 实现基于角色访问控制的 GUI</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-organizing-your-code-with-modules\" target=\"_blank\" title=\"AngularJS —— 使用模块组织你的代码\">AngularJS —— 使用模块组织你的代码</a></p></li><li><p><a href=\"http://www.oschina.net/translate/building-2048-in-angularjs\" target=\"_blank\" title=\"Building the 2048 game in AngularJS\">Building the 2048 game in AngularJS</a></p><p>&nbsp; 使用 AngularJS 开发 2048 游戏<em>(已翻译31%)</em></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-the-next-big-thing\" target=\"_blank\" title=\"AngularJS - The next BIG thing\">AngularJS - The next BIG thing</a></p><p>&nbsp;&nbsp; AngularJS - 下一个大框架<em>(已翻译62%)</em></p></li><li><p><a href=\"http://www.oschina.net/translate/custom-directives-in-angularjs\" target=\"_blank\" title=\"AngularJS 的自定义指令\">AngularJS 的自定义指令</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-filter-creating-custom-filter\" target=\"_blank\" title=\"创建 AngularJS 自定义过滤器，带自定义参数\">创建 AngularJS 自定义过滤器，带自定义参数</a></p></li><li><p><a href=\"http://www.oschina.net/translate/post-data-ngresource-restful-apis-spring-mvc\" target=\"_blank\" title=\"AngularJS —— 使用 ngResource、RESTful APIs 和 Spring MVC 框架提交数据\">AngularJS —— 使用 ngResource、RESTful APIs 和 Spring MVC 框架提交数据...</a></p></li><li><p><a href=\"http://www.oschina.net/translate/setting-up-states-from-a-json-file-in-angularjs-applications\" target=\"_blank\" title=\"在 AngularJS 应用中通过 JSON 文件来设置状态\">在 AngularJS 应用中通过 JSON 文件来设置状态</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-console\" target=\"_blank\" title=\"通过终端调试 AngularJS 应用\">通过终端调试 AngularJS 应用</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-seo-with-prerender-io\" target=\"_blank\" title=\"AngularJS 使用 Prerender.io 处理 SEO 的问题\">AngularJS 使用 Prerender.io 处理 SEO 的问题</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-form-validation\" target=\"_blank\" title=\"AngularJS 的表单验证\">AngularJS 的表单验证</a></p></li><li><p><a href=\"http://www.oschina.net/translate/submitting-ajax-forms-the-angularjs-way\" target=\"_blank\" title=\"AngularJS 提交表单的方式\">AngularJS 提交表单的方式</a></p></li><li><p><a href=\"http://www.oschina.net/translate/handling-checkboxes-and-radio-buttons-in-angular-forms\" target=\"_blank\" title=\"在 AngularJS 应用中处理单选框和复选框\">在 AngularJS 应用中处理单选框和复选框</a></p></li><li><p><a href=\"http://www.oschina.net/translate/animating-angularjs-apps-ngview\" target=\"_blank\" title=\"让你的 AngularJS 应用动起来 ： ngView\">让你的 AngularJS 应用动起来 ： ngView</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-ie-compatibility\" target=\"_blank\" title=\"AngularJS 的 IE 兼容性\">AngularJS 的 IE 兼容性</a></p></li><li><p><a href=\"http://www.oschina.net/translate/create-a-laravel-and-angular-single-page-comment-application\" target=\"_blank\" title=\"使用 Laravel 和 Angular 创建一个单页的评论应用\">使用 Laravel 和 Angular 创建一个单页的评论应用</a></p></li><li><p><a href=\"http://www.oschina.net/translate/how-to-use-ngshow-and-nghide\" target=\"_blank\" title=\"如何使用 AngularJS 的 ngShow 和 ngHide\">如何使用 AngularJS 的 ngShow 和 ngHide</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-multi-step-form-using-ui-router\" target=\"_blank\" title=\"AngularJS 使用 UI Router 实现表单向导\">AngularJS 使用 UI Router 实现表单向导</a></p></li><li><p><a href=\"http://www.oschina.net/translate/scalable-approach-page-transitions-angularjs\" target=\"_blank\" title=\"AngularJS 实现页面切换的一个可伸缩方法\">AngularJS 实现页面切换的一个可伸缩方法</a></p></li><li><p><a href=\"http://www.oschina.net/translate/single-page-apps-with-angularjs-routing-and-templating\" target=\"_blank\" title=\"使用 AngularJS 的路由和模板实现单页应用 (Single Page)\">使用 AngularJS 的路由和模板实现单页应用 (Single Page)</a></p></li><li><p><a href=\"http://www.oschina.net/translate/pretty-urls-in-angularjs-removing-the-hashtag\" target=\"_blank\" title=\"AngularJS 中的友好 URL —— 移除URL 中的 #\">AngularJS 中的友好 URL —— 移除URL 中的 #</a></p></li><li><p><a href=\"http://www.oschina.net/translate/autocomplete-ui-in-angularjs\" target=\"_blank\" title=\"angular-smarty ： 一个 AngularJS 的自动完成 UI 实现\">angular-smarty ： 一个 AngularJS 的自动完成 UI 实现</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-hello-world-code-example\" target=\"_blank\" title=\"AngularJS Hello World 代码实例，只需 6 步\">AngularJS Hello World 代码实例，只需 6 步</a></p></li><li><p><a href=\"http://www.oschina.net/translate/track-angular-js-exceptions-automatically\" target=\"_blank\" title=\"如何自动跟踪 Angular.js 的异常\">如何自动跟踪 Angular.js 的异常</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-support-in-phpstorm\" target=\"_blank\" title=\"PhpStorm 对 AngularJS 的支持\">PhpStorm 对 AngularJS 的支持</a></p></li><li><p><a href=\"http://www.oschina.net/translate/meteor-vs-angular\" target=\"_blank\" title=\"Meteor vs Angular\">Meteor vs Angular</a></p></li><li><p><a href=\"http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider\" target=\"_blank\" title=\"AngularJS 之 Factory vs Service vs Provider\">AngularJS 之 Factory vs Service vs Provider</a></p></li><li><p><a href=\"http://www.oschina.net/translate/how-to-unit-test-controllers-in-angularjs-without-setting-your-hair-on-fire\" target=\"_blank\" title=\"如何在 AngularJS 中对控制器进行单元测试\">如何在 AngularJS 中对控制器进行单元测试</a></p></li><li><p><a href=\"http://www.oschina.net/translate/sample-mobile-application-with-angularjs\" target=\"_blank\" title=\"使用 AngularJS 开发的移动应用示例\">使用 AngularJS 开发的移动应用示例</a></p></li><li><p><a href=\"http://www.oschina.net/translate/the-angular-way\" target=\"_blank\" title=\"Angular 编程思想 \">Angular 编程思想</a></p></li></ul>\n<strong>end</strong>"
  },
  {
    "path": "_posts/2014-9-10-level-img-change.md",
    "content": "---\nlayout: post\ntitle: 带层次感的图片轮播\ndescription: \"带层次感的图片轮播,JavaScript小练习\"\ntags: [JavaScript, 小练习]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 起因\n\n豪哥的JS练习又一波来袭~今天又写了个百度爱玩的东西，暂且叫他带层次感的图片轮播吧\n\n\n<figure>\n\t<a href=\"/images/article/level-img-change/1.jpg\">\n\t\t<img src=\"/images/article/level-img-change/1.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>图片可以很有层次感的切换</figcaption>\n</figure>\n\n<!--more-->\n\n# 思路\n\n主要思路有二\n\n## 图片大小、位置的计算\n\n我的思路是这样的：\n\n因为首尾切换，我想到的就是自己封装一个循环队列\n\n```js\n//封装一个循环队列\nfunction CircularQueue(arr) {\n\tthis.arr = arr || [];\n}\n\n//移除前一个，追加到最后\nCircularQueue.prototype.shift = function() {\n\t\tvar temp = this.arr.shift();\n\t\tthis.arr.push(temp);\n\t}\n//移除最后一个，追加到头部\nCircularQueue.prototype.unshift = function() {\n\t\tvar temp = this.arr.pop();\n\t\tthis.arr.unshift(temp);\n\t}\n//添加一个元素\nCircularQueue.prototype.add = function(obj) {\n\tthis.arr.push(obj);\n}\n```\n\n现在一个数组里缓存下初始位置的大小，\n\n```js\n//初始化ARR数组\nvar queue = new CircularQueue();\nfor (var i = 0; i < li.length; i++) {\n\n\tqueue.add({\n\t\ttop: parseInt(getStyle(li[i], 'top')),\n\t\tleft: parseInt(getStyle(li[i], 'left')),\n\t\twidth: parseInt(getStyle(li[i], 'width')),\n\t\theight: parseInt(getStyle(li[i], 'height')),\n\t\tzIndex: getStyle(li[i], 'z-index')\n\t});\n}\n```\n\n然后在每一个选择项加上mouseover事件，来切换以上图片。\n\n```js\n//绑定事件\nfor (var j = 0; j < links.length; j++) {\n\tlinks[j].onmouseover = (function(j, len) {\n\t\treturn function() {\n\t\t\t//鼠标一上去小点切换\n\t\t\tvar k = len - 1;\n\t\t\tfor (; k >= 0; k--) {\n\t\t\t\tlinks[k].className = 'dot';\n\t\t\t}\n\t\t\tlinks[j].className += ' dot-active';\n\n\t\t\t//替换大图片\n\t\t\tvar arr = getMiddleArr(j);\n\t\t\tupdateStyle(arr);\n\n\t\t}\n\t})(j, links.length);\n}\n```\n\n然后通过传入一个数值，得到以改数组为中心的新数组。\n因为不能打乱以前的数组，所以我用了深克隆\n\n```js\n//深克隆\nObject.prototype.clones = function() {\n\tvar o = {};\n\tfor (var i in this) {\n\t\to[i] = this[i];\n\t}\n\treturn o;\n};\nArray.prototype.clones = function() {\n\tvar arr = [];\n\tfor (var i = 0; i < this.length; i++)\n\t\tif (typeof this[i] !== 'object') {\n\t\t\tarr.push(this[i]);\n\t\t} else {\n\t\t\tarr.push(this[i].clones());\n\t\t}\n\treturn arr;\n};\n```\n\n\n\n## 缓冲运动\n\n还是用的智联社的运动库，最后将页面元素的样式更新\n\n```js\n//调用动作函数绘制\nfunction updateStyle(arr) {\n\tfor (var i = 0; i < li.length; i++) {\n\t\tli[i].style.zIndex = arr[i].zIndex;\n\t\tstartMove(li[i], arr[i]);\n\n\t}\n}\n```\n\n\n# 代码\n\n全部代码就不贴在博客上了，很简单，没什么可看的，大家可以去我的github上检出\n\n\n<a target=\"_blank\"  href=\"https://github.com/hacke2\">点击进入我的github</a><br/>\n\n## <a target=\"_blank\"  style=\"color:red\" href=\"/works/demo/06/\" >查看完整DEMO</a>\n\n<strong>end from {{ site.url }}</strong>"
  },
  {
    "path": "_posts/2014-9-11-nodeJS-char.md",
    "content": "---\nlayout: post\ntitle: 基于Node.js + socket.io实现WebSocket的聊天DEMO\ndescription: \"WebSocket Node.js实现版\"\ntags: [JavaScript, Node.js]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 简介\n\n最近看Node.js和HTML5，练手了一个简易版的聊天DEMO，娱乐一下\n\n## 为什么需要socket.io？\n\nnode.js提供了高效的服务端运行环境，但是由于浏览器端对HTML5的支持不一，\n为了兼容所有浏览器，提供卓越的实时的用户体验，并且为程序员提供客户端与服务端一致的编程体验，\n于是socket.io诞生。\n\n\t简答来说socket.io具体以下特点：\n\t\n    1.socket.io设计的目标是支持任何的浏览器，任何Mobile设备。目前支持主流的PC浏览器 (IE,Safari,Chrome,Firefox,Opera等)，Mobile浏览器(iphone Safari/ipad Safari/android WebKit/WebOS WebKit等)。socket.io基于node.js并简化了WebSocket API，统一了通信的API。它支持：WebSocket, Flash Socket, AJAX long-polling, AJAX multipart streaming, Forever IFrame, JSONP polling。\n    \n    2.socket.io解决了实时的通信问题，并统一了服务端与客户端的编程方式。启动了socket以后，就像建立了一条客户端与服务端的管道，两边可以互通有无。\n\n\n<!--more-->\n\n# 代码\n\n创建app.js 源码如下\n\n```js\nvar fs = require('fs')\t//文件操作\n    , http = require('http')\t//http服务器\n    , socketio = require('socket.io');\t//socket.io，用来和前台进行交互\n  \nvar server = http.createServer(function(req, res) {\n    res.writeHead(200, { 'Content-type': 'text/html'});\n    //将index.html输出\n    res.end(fs.readFileSync(__dirname + '/index.html'));\n}).listen(3000, function() {\n    console.log('Listening at: http://localhost:3000');\n});\n\n//连接成功的回调  \nsocketio.listen(server).on('connection', function (socket) {\n    socket.on('message', function (msg) {\n        console.log('接受到 ', msg);\n        //将信息发送给其他客户端\n        socket.broadcast.emit('message', msg);\n    });\n});\n```\n\n创建index.html\n\n```html\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n    <script src=\"http://libs.baidu.com/jquery/1.9.0/jquery.js\"></script>\n    <script src=\"/socket.io/socket.io.js\"></script>\n    <script>\n        $(function(){\n            var iosocket = io.connect();\n  \n            iosocket.on('connect', function () {\n                $('#incomingChatMessages').append($('<li>已连接！</li>'));\n  \n                iosocket.on('message', function(message) {\n                    $('#incomingChatMessages').append($('<li></li>').text(message));\n                });\n                iosocket.on('disconnect', function() {\n                    $('#incomingChatMessages').append('<li>失去连接</li>');\n                });\n            });\n  \n            $('#outgoingChatMessage').keypress(function(event) {\n                if(event.which == 13) {\n                    event.preventDefault();\n                    iosocket.send($('#outgoingChatMessage').val());\n                    $('#incomingChatMessages').append($('<li></li>').text($('#outgoingChatMessage').val()));\n                    $('#outgoingChatMessage').val('');\n                }\n            });\n        });\n    </script>\n</head>\n<body>\n控制台:&nbsp;<ul id=\"incomingChatMessages\"></ul>\n<br />\n<input type=\"text\" id=\"outgoingChatMessage\">\n</body>\n</html>\n\n```\n\n# 运行&结果\n\n因为依赖了socket.io包，所以用npm 下载\n\nnpm install socket.io\n\n最后直接运行\n\nnode app.js\n\n<figure>\n\t<a href=\"/images/article/1.jpg\">\n\t\t<img src=\"/images/article/1.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>运行效果</figcaption>\n</figure>\n\n\n>附上一个实现了很炫聊天DEMO  http://segmentfault.com/a/1190000000479518\n\n<figure>\n\t<a href=\"/images/article/2.png\">\n\t\t<img src=\"/images/article/2.png\" alt=\"home\" />\n\t</a>\n\t<figcaption>聊天DEMO</figcaption>\n</figure>\n\n<strong>end from <a href=\"{{ site.url }}\"> {{ site.url }}</a></strong>"
  },
  {
    "path": "_posts/2014-9-12-css3-lenove.md",
    "content": "---\nlayout: post\ntitle: JavaScript实现联想校招员工信息展示\ndescription: \"使用简单模板+css3+javascript实现CSS3弹窗及切换\"\ntags: [JavaScript, 小练习]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 起因\n\n今天和豪哥聊天，才知道他是我老乡，而且特别近。。真的感觉他是我的贵人，这是他从\n联想校招扣出来的，我们就用JavaScript来实现吧\n\n\n<figure>\n\t<a href=\"/images/article/4.jpg\">\n\t\t<img src=\"/images/article/4.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>联想校招员工信息展示</figcaption>\n</figure>\n\n<figure>\n\t<a href=\"/images/article/3.jpg\">\n\t\t<img src=\"/images/article/3.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>点击弹出详细信息</figcaption>\n</figure>\n\n<!--more-->\n\n# 过程\n\n给的有HTML还有CSS3，我打算先用前端模板技术讲信息都出来，之前数据是写死在HTML\n\n数据封装在data.js里\n\n```js\nvar data = [];\n\ndata.push({\n\t'name' : 'Dillon',\n\t'enname' : 'Dillon',\n\t'desc' : '来自哈佛的战略伙伴经理',\n\t'pic' : 'images/n8_10.png',\n\t'bigpic' : 'images/j2.jpg'\n});\n\ndata.push({\n\t'name' : '成俞晟',\n\t'enname' : 'cheng',\n\t'desc' : '技术宅服务器工程师',\n\t'pic' : 'images/n8_07.png',\n\t'bigpic' : 'images/j3.jpg'\n});\n\ndata.push({\n\t'name' : 'Said',\n\t'enname' : 'Said',\n\t'desc' : '开朗健谈的中国通',\n\t'pic' : 'images/n8_18.png',\n\t'bigpic' : 'images/j5.jpg'\n});\n\n//...\n```\n\n\n我们讲以前的HTML写成一个模板\n\n展示区模板\n\n```html\n<div id=\"temp_li\" style=\"display: none;\">\n\t<li data-id=\"{i}\" class=\"transform\">\n\t\t<div>\n\t\t\t<i></i>\n\t\t\t<span>{name}</span>\n\t\t\t<p>{desc}</p>\n\t\t</div>\n\t\t<img src=\"{pic}\">\n\t</li>\n</div>\n```\n\n弹出层模板\n\n```html\n<div id=\"dialog\"  class=\"box_ovo \">\n\t<span id=\"close\" class=\"close\"><i></i></span>\n\t<span class=\"prev\"><i></i></span>\n\t<span class=\"next\"><i></i></span>\n\t<div id=\"div_temp1\" data-id=\"{i}\" >\n\t\t<img class=\"oimg1\" src=\"{bigpic}\">\n\t\t<div class=\"ovotxt\">\n\t\t\t<div class=\"ovohead\">\n\t\t\t\t<h1>{name}</h1>\n\t\t\t\t<i>{enname}</i>\n\t\t\t\t<em>{desc}</em>\n\t\t\t\t<span>ECS</span>\n\t\t\t</div>\n\t\t\t<p>2013年加入联想，联想游戏中心最霸气的女商务，性格大大咧咧，柔弱的外表下有一颗强大的心。自诩内可安邦定天下，外可御敌千里外。</p>\n\t\t\t<p>联想游戏中心作为北研最靓丽的风景线，不仅有着最潮、最流行的游戏可以玩，有各种精美的游戏周边随便拿，最关键的是有这样娇(ba)媚(qi)可(shi)人(zu)的女汉子陪聊，陪工作，陪吃饭。总之一句话，联想游戏中心，你值得拥有。</p>\n\t\t</div>\n\t</div>\n</div>\n```\n\n\n然后用一下代码弄到HTML里面\n\n```js\n//获取LI模板HTML\nvar tempLi = document.getElementById('temp_li').innerHTML;\n//HTML + 数据最后放到这个数组里\nvar liArr = [];\nfor (var i = 0; i < data.length; i++) {\n\t//替换模板里{}表达式\n\tvar itemLi = tempLi.replace(/\\{i\\}/, i)\n\t\t\t\t\t.replace(/\\{name\\}/,data[i].name)\n\t\t\t\t\t.replace(/\\{desc\\}/,data[i].desc)\n\t\t\t\t\t.replace(/\\{pic\\}/,data[i].pic);\n\tliArr.push(itemLi);\n} \n\n//加入到ul里\nul.innerHTML = liArr.join('');\n\n\n//获取详细信息模板\nvar tempDialog = dialog.innerHTML;\n\n//打开弹出层\nfunction openDialog(dataIndex) {\n\tdialog.innerHTML = tempDialog.replace(/\\{i\\}/,dataIndex)\n\t\t\t\t\t\t.replace(/\\{name\\}/,data[dataIndex].name)\n\t\t\t\t\t\t.replace(/\\{enname\\}/,data[dataIndex].enname)\n\t\t\t\t\t\t.replace(/\\{desc\\}/,data[dataIndex].desc)\n\t\t\t\t\t\t.replace(/\\{bigpic\\}/,data[dataIndex].bigpic);\n\tbg.className += ' current';\n    dialog.className += ' current';\n}\n```\n\n\n因为HTML是动态生成的，直接不能加绑定事件，所以使用事件委托\n\n```js\n//给每一个li加事件\nul.onclick = function(event) {\n\tvar e = event || window.event;\n\tvar target = e.target || e.srcElement;\n\ttarget = getLiByChild(target);\n\tif(target) {\n\t\tvar curIndex = target.getAttribute('data-id');\n    \topenDialog(curIndex);\n\t}\n}\t\n\n//给弹出层加事件\ndialog.onclick = function(){\n\tvar e = event || window.event;\n\tvar target = e.target || e.srcElement;\n\tvar curIndex = +dialog.lastElementChild.getAttribute('data-id'); \n\t//点击关闭\n\tif(target.nodeName == 'I' && target.parentNode.className == 'close') {\n\t\tcloseDialog();\n\t}\n\t//点击上一个\n\tif(target.nodeName == 'I' && target.parentNode.className == 'prev') {\n\t\tvar preIndex= curIndex-1;\n\t\tif(preIndex > -1) {\n\t\t\tcloseDialog(function() {\n\t\t\t\topenDialog(preIndex);\n\t\t\t});\n\t\t}else {//否则循环到最后一个\n\t\t\tcloseDialog(function() {\n\t\t\t\topenDialog(data.length-1);\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\t//点击下一个\n\tif(target.nodeName == 'I' && target.parentNode.className == 'next') {\n\t\tvar nextIndex= curIndex+1;\n\t\tif(nextIndex < data.length) {\n\t\t\tcloseDialog(function() {\n\t\t\t\topenDialog(nextIndex);\n\t\t\t});\n\t\t}else {//否则循环到最后一个\n\t\t\tcloseDialog(function() {\n\t\t\t\topenDialog(0);\n\t\t\t});\n\t\t}\n\t}\n    \n}\n```\n\n其中，弹出层里有三个动作；\n\n1.关闭弹窗\n2.前一个\n2.后一个\n\n我们在里面做处理，如果是前一个为第一个则跳到最后一个，如果为最后一个则跳到前一个\n\n因为我们点击的时候有可能点到SPAN，有可能点到DIV(原因看展示区模板)，所以要有个函数来\n找到顶层的LI,因为关闭有一个动画效果，我看了CSS是0.3s，所以我们加一个定时器做一个回调\n\n```js\n//找到最顶层LI\nfunction getLiByChild(element) {\n\tvar li = element;\n\twhile(li.nodeName != 'LI') {\n\t\tli = li.parentNode;\n\t}\n\treturn li;\n}\n\n//关闭Dialog\nfunction closeDialog(func) {\n\tbg.className = 'box_bg1';\n    dialog.className = 'box_ovo';\n    setTimeout(function(){\n    \tif(dialog.className == 'box_ovo') {\n    \t\tfunc && func();\n    \t}\n    },300);\n}\n```\n\n# <a target=\"_blank\"  href=\"https://github.com/hacke2/\">获取代码</a><br/>\n\n代码就不贴在博客上了，很简单，没什么可看的，大家可以去我的github上检出\n\n## <a target=\"_blank\"  style=\"color:red\" href=\"/works/demo/04\" >查看完整DEMO</a>\n\n<strong>end from{{ site.url }}</strong>"
  },
  {
    "path": "_posts/2014-9-18-no-sleep.md",
    "content": "---\nlayout: post\ntitle: 夜未眠\ndescription: \"找工作这几天的心声\"\ntags: [心声]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n<figure>\n\t<a href=\"/images/article/5.jpg\">\n\t\t<img src=\"/images/article/5.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>图书一角</figcaption>\n</figure>\n\n>小时候总觉得「努力」是没有「天赋」的人做的事情；长大了才明白，原来「努力」才是最珍贵的「天赋」。\n\nAL最后HR面试的时候我说了上面的话。\n\n自己以前走的一些弯路，高考那一关很艰难。那一次我终于明白，人，\n<strong>不在合适的时候做合适的事情，是要倒霉的</strong>。今天和悦在聊天，她说很多时候，她想干点事情，但又无从下手。\n来到这个学校，最让我感激的还是我们创新实验室。因为我想干点事情，而这块地方就是我挥洒热血的地方。\n感谢实验室的环境与自己的努力，让我从容的拿到了offer。天时地利人和都有了，我抓住了这次机会。\n\n晚上的时光过的是很快的。每当我累了的时候，就听见昌志的话在耳边响起：“每天7点起来读英语，8点上班，\n加班到晚上10点，还得回来啃书到2点，累成狗”。压力不是有人比你努力，而是比你牛叉几倍的人依然比你努力。\n你只看到那些光鲜的大牛，但并没有看到大牛在人背后默默的啃书，读代码。这次拿到offer并不是结束，而是才上路。\n想想那些比你牛的人在干什么，或许你会关掉正在打开的游戏。\n\n感激高考那一关带来的无助于迷茫，感激那些冷嘲热讽的话语。正是这些，推动我越过高山。\n咬牙坚持走过，回头看看，那只是一个插曲。人生并没有难以跨越的鸿沟.经历是一笔无形的财富，\n我在享受成长过程带来的收获的同时，在慢慢走向自己最纯真的梦想。\n\n我相信，这个梦，总会实现。\n\n\n<strong>end from {{ site.url }}</strong>"
  },
  {
    "path": "_posts/2014-9-2-what-happens-when-you-type-in-a-url-in-browser.md",
    "content": "---\nlayout: post\ntitle: 从输入 URL 到页面加载完成的过程中都发生了什么事情？\ndescription: \"what happens when you type in a url in browser，对stackoverflow回答的扩展\"\ntags: [浏览器, 计算机网络]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n之前阿里有一个笔试题：在在浏览器输入url发生了什么事请，看到<a href=\"http://stackoverflow.com/questions/2092527/what-happens-when-you-type-in-a-url-in-browser\">Stack Overflow</a>有一个很好的资料,\n记录了一下，以后做个参考.\n\n\t1.browser checks cache; if requested object is in cache and is fresh, skip to #9\n\t2.browser asks OS for server's IP address\n\t3.OS makes a DNS lookup and replies the IP address to the browser\n\t4.browser opens a TCP connection to server (this step is much more complex with HTTPS)\n\t5.browser sends the HTTP request through TCP connection\n\t6.browser receives HTTP response and may close the TCP connection, or reuse it for another request\n\t7.browser checks if the response is a redirect (3xx result status codes), authorization request (401),\n\t\terror (4xx and 5xx), etc.; these are handled differently from normal responses (2xx)\n\t8.if cacheable, response is stored in cache\n\t9.browser decodes response (e.g. if it's gzipped)\n\t10.browser determines what to do with response \n\t\t(e.g. is it a HTML page, is it an image, is it a sound clip?)\n\t11.browser renders response, or offers a download dialog for unrecognized types\n\n<!--more-->\n\n\t1.检查浏览器缓存，如果你请求的对象依据缓存下来了，则跳到第9步\n\t2.浏览器会询问操作系统你请求的服务器的IP\n\t3.操作系统先查询本地Host文件；如果hosts里没有这个域名的映射，则查找本地DNS解析器缓存；\n\t\t如果还是没有，会找TCP/ip参数中设置的首选DNS服务器，查询本地区域文件与缓存；\n\t\t如果本地DNS服务器本地区域文件与缓存解析都失效，则根据本地DNS服务器的设置进行查询，\n\t\t如果未用转发模式，本地DNS就把请求发至13台根DNS，\n\t\t如果开启转发模式，此DNS服务器就会把请求转发至上一级DNS服务器，由上一级服务器进行解析，\n\t\t上一级服务器如果不能解析，或找根DNS或把转请求转至上上级，以此循环。最后返回IP给浏览器\n\t4.浏览器拿到IP后，想会向服务器建立一个socket连接(不考虑https)\n\t5.浏览器通过TCP向服务器发送HTTP请求的\n\t6.浏览器接收到服务器响应就会断开TCP连接，或者为了其他请求重用它\n\t7.浏览器检查响应的状态是重定向(3xx)、要求授权(401)、服务器错误(4xx 和 5xx)，如果是正常则会返回2xx(200)，\n\t8.如果是可缓存的，响应则缓存在内存里\n\t9.浏览器将解码响应(不考虑gzip压缩)\n\t10.浏览器决定如何响应,例如图片、HTML、媒体文件\n\t11.浏览器将渲染请求，或者弹出一个下载对话框\n\t\n大家也可以参考下面补充文章:<br/>\n<a href=\"http://ued.ctrip.com/blog/?p=3287\">浏览器是怎样工作的（一）：基础知识</a><br/>\n<a href=\"http://ued.ctrip.com/blog/?p=3295\">浏览器是怎样工作的：渲染引擎，HTML解析（连载二）</a><br/>\n<a href=\"http://tool.oschina.net/commons?type=5\">开源中国HTTP状态码常用对照表</a>\n\n<strong>end</strong>"
  },
  {
    "path": "_posts/2014-9-26-div-center.md",
    "content": "---\nlayout: post\ntitle: CSS居中完全解决方案\ndescription: \"各种情景下的CSS水平垂直居中\"\ntags: [CSS]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>上次面试面试官问到了，问了个定宽局中和不定宽局中，下来我把所有有关CSS居中都总结了一下\n\n\n# 水平居中\n\n## 行内元素\n\n把行内元素嵌套在一个DIV中，并且在DIV中设置以下样式\n\n```css\n\ta{\n\t\ttext-align: center;\n\t}\n```\n\n## 块级元素\n\n对于定宽的块级元素，我们要设置起margin-top,margin-right 为auto\n\n```css\n\t.center{\n\t\tmargin: 0 auto;\n\t}\n```\n\n## 多个块级元素(inline-block)\n\n多个块级元素，我们将其display设置为inline-block；然后将父级元素设置一下属性\n\n<!--more-->\n\n```css\n\tdiv{\n\t\ttext-align: center;\n\t}\n```\n\n## 多个块级元素(flex)\n\n设置需要水平居中的块状元素的父元素display为flex ，并且justify-content属性为center即可\n\n```css\n\tbody{\n\t  display: flex;\n\t  justify-content: center;\n\t}\n```\n\n# 垂直居中\n\n## 单行 行内元素\n\n将行内元素的height和line-height设置为一致即可\n\n```css\n\ta{\n\t  height: 200px;\n\t  line-height:200px;  \n\t}\n```\n\n## 多行 行内元素\n\n如果行内元素文字过多产生多行，则在父级元素设置display: table-cell;vertical-align:middle;\n\n```css\n\t.container{\n\t\twidth: 300px;\n\t\theight: 300px;\n\t\tdisplay: table-cell;\n\t\tvertical-align:middle;\n\t}\n```\n\n## 已知高度的块级元素\n\n将块级元素设置绝对定位，top为50%，margin-top:-height/2\n\n```css\n\tdiv{\n\t  height: 100px;\n\t  position: absolute;\n\t  top: 50%;\n\t  margin-top: -50px;\n\t  padding:0; \n\t}\n```\n\n## 未知高度的块级元素\n\n使用CSS translate,将块级元素设置绝对定位，top为50%，transform: translateY(-50%);\n\n```css\n\tdiv{\n\t  position: absolute;\n\t  top: 50%;\n\t  -webkit-transform:translateY(-50%);\n\t  -moz-transform:translateY(-50%);\n\t  transform: translateY(-50%);\n\t  padding:0; \n\t}\n```\n\n# 水平垂直居中\n\n## 已知高度、宽度的元素\n\n将块级元素设置绝对定位，top为50%，left:50%;margin-top:-height/2;margin-left:-width/2\n\n```css\n\tdiv{\n\t\twidth: 150px;\n\t\theight: 150px;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\tmargin-top: -75px;\n\t\tmargin-left: -75px;\n\t}\n```\n\n## 已知高度、宽度的元素(flex)\n\n给父级使用flex布局\n\n```css\n\tdiv{\n\t\tdisplay: flex;\n\t\tjustify-content:center;\n\t\talign-items: center;\n\t}\n```\n\n## 未知高度、宽度的元素\n\n使用CSS translate\n\n```css\n\tdiv{\n\t    position:absolute;\n\t\ttop:50%;\n\t\tleft:50%;\n\t\t-webkit-transform:translate(-50%,-50%);\n\t\t-moz-transform:translate(-50%,-50%);\n\t\ttransform:translate(-50%,-50%);\n\t}\n```\n\n\n\n<strong>end from{{ site.url }}</strong>"
  },
  {
    "path": "_posts/2014-9-26-think-in-seo.md",
    "content": "---\nlayout: post\ntitle: 和我一起来了解SEO\ndescription: \"前端工程师必备的SEO知识\"\ntags: [SEO]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 基础知识\n\n## 搜索引擎\n\n搜索引擎爬虫会检索各个网站，分析他们的关键字，从一个连接到另一个连接，如果爬虫觉得这个关键字是有用的\n就会存入<strong>搜索引擎数据库</strong>，反之如果没用的、恶意的、或者已经在数据库的，就会舍弃。搜索引擎数据库\n保证是爬虫爬过的最新的数据。用户在使用搜索引擎会在搜索引擎数据库查找关键词，展现给用的的是排序后的结果。除开\n某些搜索引擎推广的，剩余的一般是按照关联度来排序。\n\n## SEO简介\n\nSEO（Search Engine Optimization）汉译为搜索引擎优化.seo优化是专门利用搜索引擎的搜索规则来提高目\n前网站在有关搜索引擎内的自然排名的方式.SEO的目的理解是为网站提供生态式的自我营销解决方案，让网站在\n行业内占据领先地位，从而获得品牌收益.\n\n如在百度搜索hacke2，第一个就是我的前端博客<a href=\"www.hacke2.cn\">www.hacke2.cn</a>\n\n<figure>\n\t<a href=\"/images/article/7.jpg\">\n\t\t<img src=\"/images/article/7.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>百度搜索hacke2</figcaption>\n</figure>\n\n<!--more-->\n\n### 白帽SEO\n\n采用SEO的思维，合理优化网站，提高用户体验，合理与其他网站互联。从而使站点在搜索引擎排名提升。\n白帽SEO关注的是长远利益，需要的时间长，但效果稳定。\n\n### 黑帽SEO\n\n就是采用搜索引擎禁止的方式优化网站，影响搜索引擎对网站排名的合理和公正性。同时随时因为搜索引擎\n算法的改变而面临惩罚。比如加的关键字与自己网站根本无任何关系，这些关键字一般都是最近最火的关键字\n欺骗用户、欺骗爬虫。\n\n### 白帽SEO的相关手段\n\n* 网站标题、关键字、描述\n* 网站内容优化\n* robot.txt\n* 网站地图\n* 增加外链引用\n\n一般有关前端工程师的有：网站布局结构优化、网页代码优化。\n\n# 前端SEO\n\n## 网站布局结构优化\n\n网站结构尽量简单、清晰。推荐扁平化结构。相关手段如下：\n\n### 控制首页连接数量\n\n对于中小型网站来说，最好不要太多，但也不能太少\n\n### 扁平化目录层次\n\n爬虫希望看到你网站的结果是树形结构。\n如动物-->猫科动物-->狮子\n\n### 导航\n\n导航尽量是文字，而且层级尽量小于三级。如本站导航若为图片，title和alt必须添加\n\n<figure>\n\t<a href=\"/images/article/6.jpg\">\n\t\t<img src=\"/images/article/6.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>本站导航</figcaption>\n</figure>\n\n### 其他\n\n使用面包屑导航、单个页面不超过100k\n\n## 代码\n\n### head\n\n<strong>title</strong> 表示网页的标题\n<strong>description</strong> 表示网页的描述\n<strong>keywords</strong> 表示网页的关键字\n\n下面是本站的相关描述，右键查看源代码即可看到\n\n```html\n<title>hacke2's blog | WEB前端,一路前行 &#8211; hacke2's blog</title>\n<meta name=\"description\" content=\"hacke2的前端技术博客,分享自己的技术心得,积累前段技能,汇聚前端之路的点点滴滴。\">\n<meta name=\"keywords\" content=\"hacke2, blog, hacke2 blog, 前端技术, javascript\">\n```\n\n### 语义化\n\n<a href=\"http://www.html5jscss.com/html5-semantics-section.html\">HTML 5的革新——语义化标签</a>\n<a href=\"http://www.cnblogs.com/yizuierguo/archive/2009/07/26/1531112.html\">深更半夜话(html)语义</a>\n\n### 代码优化\n\n<a href=\"http://www.doc88.com/p-213653269816.html\">SEO网页代码优化</a>\n<a href=\"http://www.pc6.com/infoview/Article_32813.html\">优化HTML代码加快网页速度</a>\n\n\n>部分参考百度百科、慕课网\n\n<strong>end from {{ site.url }}</strong>"
  },
  {
    "path": "_posts/2014-9-28-gokk.md",
    "content": "---\nlayout: post\ntitle: 基于Node.js + jade + Mongoose  模仿gokk.tv \ndescription: \"向goxiazai致敬\"\ntags: [Node.js]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 关于gokk\n\n大学的娱乐活动基本就是在寝室看电影了→_→，一般都会选择去goxiazai.cc上看，里面的资源多，质量高\n。站长会推荐评分很高广受好评的电影给大家免费下载，整体来说真是不错，但前两月由于版权问题被迫转型\n这也是没办法的事，程序员更应该尊重版权问题，我们也能理解，后来站长又开了gokk个不是给地址让你\n下载，而是将网络一些优秀视频站点资源提供出来观看，质量变低了，好怀念以前的goxiazai啊。。\n\n最近在学习Node.js，也看了<a href=\"https://github.com/congyuandong/imooc\">imooc</a>的源码\n，自己模仿gokk.tv的前台搭建了一个基于Node.js + Mongoose + Bootstrap，很简单的页面，\n花了两天时间，第一次Node体验就交给gokk了，向goxiazai致敬!\n\n<!--more-->\n\n# 展示\n\n<figure>\n\t<a href=\"/images/article/11.jpg\">\n\t\t<img src=\"/images/article/11.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>首页一</figcaption>\n</figure>\n\n<figure>\n\t<a href=\"/images/article/12.jpg\">\n\t\t<img src=\"/images/article/12.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>首页二</figcaption>\n</figure>\n\n<figure>\n\t<a href=\"/images/article/13.jpg\">\n\t\t<img src=\"/images/article/13.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>详情页</figcaption>\n</figure>\n\n<figure>\n\t<a href=\"/images/article/14.jpg\">\n\t\t<img src=\"/images/article/14.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>新增页</figcaption>\n</figure>\n\n# 获取源码\n\n源码托管于git\n\n<a href=\"https://github.com/hacke2/gokk\">点击获取</a>\n\n# 部署于运行\n\n使用npm将项目打包，大家检出来后使用<strong>npm install</strong>即可安装\n\n使用<strong>node app</strong>运行，数据库使用Mongdb，请自行安装，测试数据在test/db.js下\n\n希望您能提出建议或意见\n\n# 数据结构\n\nmovies 下面有columnName 表示栏目的名称，如电影、动画、娱乐等 movie是一个数组\n里面放入Json对象，表示改栏目下的所有电影，这样非关系数据库的好处就是之前如果遵循低冗余\n原则必须建立两张表来使column和movie一对多,后来感觉应该用两个Schema更合理\n\n# 功能\n\n首页、详情页、新增\n\n未实现：分页、查看列表、后台删除、编辑\n\n\n\n# 什么原因让我只写了个新增功能？\n\n由于是第一次编写node，在编写的过程中遇到很多问题，虽然node提供了分页limit，但是\n只能分一张表内的，比如movies这张表，不能对一条数据低下movie数组集合下分量取出。\n\n后来在<a href=\"http://cnodejs.org/topic/504b4924e2b84515770103dd\">Mongoose学习参考文档——基础篇 </a> \n看到有这么一个东西Sub Docs\n\n>如同SQL数据库中2张表有主外关系，Mongoose将2个Document的嵌套叫做Sub-Docs(子文档)简单的说就是一个Document嵌套另外一个Document或者Documents:\n\n这可能是我想要的，但是第一次开发重点不是在Mongoose上，node的书还不是看的很多，这算是我的\n一个学习过程中的小测试吧！计划开发两天时间，如果修改会越陷越深，我明白我现在的node开发流程有很大问题，流程不不正确\n。我把在这上面越陷越深，写起来感觉效率真的不是很高，所以其他功能立即停止开发。\n\n这也是项目半成品的一个原因吧\n\n\n<strong>end from {{ site.url }}</strong>"
  },
  {
    "path": "_posts/2014-9-30-nodeJS-sublime-3.md",
    "content": "---\nlayout: post\ntitle: 在Sublime Text3 开发Node.js遇到的一个小问题\ndescription: \"主要解决了重新运行端口占用的情况\"\ntags: [Node.js]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n\n以前的Sublime Text 2包管理出现问题了，不能安装新包，让人开发很捉急，今天装了个3，这个问题解决了\n\n那我们就一起用Sublime Text 3 来玩Node.js吧！\n\ncn node说的很清楚，在这里就不细表\n\n<a href=\"http://cnodejs.org/topic/51ee453af4963ade0ebde85e\">http://cnodejs.org/topic/51ee453af4963ade0ebde85e</a>\n\n这里说说他们说的一个问题\n\n<figure>\n\t<a href=\"/images/article/10.jpg\">\n\t\t<img src=\"/images/article/10.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>重新运行后端口占用</figcaption>\n</figure>\n\n我也是在这边搞了半天，最后用下面方法解决的\n\n<!--more-->\n\n```js\n{\n\t//这里加了一句关闭\n\t\"cmd\": [\"taskkill /F /IM node.exe\", \"\"],\n\t\"cmd\": [\"node\", \"$file\"]\n}\n```\n\n\n<figure>\n\t<a href=\"/images/article/9.jpg\">\n\t\t<img src=\"/images/article/9.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>重新运行后端口占用</figcaption>\n</figure>\n\n但也出现一个问题，如果你的app.js正在运行，而你在这边调试单元测试，这样会把主程序也会关掉，这个东西\n不能常用，还是使用Grunt最为妥当\n\n完整Nodejs.sublime-build\n\n```js\n{\n  \"cmd\": [\"node\", \"$file\"],\n  \"file_regex\": \"^[ ]*File \\\"(...*?)\\\", line ([0-9]*)\",\n  \"selector\": \"source.js\",\n  \"shell\":true,\n  \"encoding\": \"utf-8\",\n  \"windows\":\n    {\n\t\"cmd\": [\"taskkill /F /IM node.exe\", \"\"],\n    \t\"cmd\": [\"node\", \"$file\"]\n    },\n  \"linux\":\n    {\n        \"cmd\": [\"killall node; node\", \"$file\"]\n    }\n}\n```\n    \n    \n\n<strong>end from <a href=\"{{ site.url }}\"> {{ site.url }}</a></strong>"
  },
  {
    "path": "_posts/2014-9-4-javascript-seamless-handover.md",
    "content": "---\nlayout: post\ntitle: JavaScript打造无缝切换\ndescription: \"用JavaScrip写的无缝切换，弥补一年前的遗憾\"\ntags: [JavaScript, 小练习]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 起因\n\n一年前写管理学院的时候，那时候做首页有一个幻灯片，由于之前没交流好，CL写的静态页面幻灯片图片是在背景里，让我用jq写，\n当时就感觉特别啃爹，图片写在了css里。。好坑爹，自己又懒得改，只能硬着头皮用jq写，一堆临时变量，如num++，各种奇葩，最后加了\n个jq淡隐淡出的效果，就交差了，，代码如下：\n\n<script src=\"https://gist.github.com/hacke2/5434a4346a1169f8b97b.js\"></script>\n\n<!--more-->\n\n这几天一个前端qq群主分享了一个东西说平时可以练练手，我没有做，可是看到他说，<strong>群里面有些人小东西不屑做，稍微大点有不会做</strong>\n我当时就感觉说我。。刚才写了一下，与大家分享\n\n# 思路\n\n关键一点就是克隆,而且是深克隆，obj.clone(true);这样就能克服该节点的所有子节点。之所以选择克隆，是因为直接删除太突兀了。\n\n一般无缝切换的幻灯片是这样做的\n\n1.点击前一个：将最开始的节点克隆到最后一个节点后面，然后整体向前移，并且删除掉第一个元素\n\n2.点击后一个：将最后节点克隆到最前面的节点钱，然后整体向后移，并且删除掉最后一个元素\n\n动画效果用的智能社的动画脚本\n\n# 代码\n\n代码在github上，有兴趣的看下：\n\n<a target=\"_blank\"  href=\"https://github.com/hacke2/frontcode\">JavaScript打造无缝切换</a><br/>\n\n## <a target=\"_blank\"  style=\"color:red\" href=\"/demo/javascript-seamless-handover/slide/bd01.html\" >查看完整DEMO</a>\n\n<strong>end</strong>"
  },
  {
    "path": "_posts/2014-9-4-my-show-4-angularjs.md",
    "content": "---\nlayout: post\ntitle: AngularJs+BootStarp+fontAwesome打造个人展示页面\ndescription: \"简单的个人展示的界面\"\ntags: [JavaScript, AngularJs, BootStarp]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n# 起因\n\n实验室马上要出去找工作了，大家想写一个展示自己项目的东西，没必要做的太复杂，我就把这几天学到的结合了一下，算是做了\n一个大概的样子出来，大家可以自己放里面加内容\n\n\n<figure>\n\t<a href=\"/images/article/my-show-4-angularJs/1.jpg\">\n\t\t<img src=\"/images/article/my-show-4-angularJs/1.jpg\" alt=\"home\" />\n\t</a>\n\t<figcaption>点击右上角项目名称可切换不同视图</figcaption>\n</figure>\n\n<!--more-->\n\n# 所含的技术\n\n## AngularJs\n\n里面MVC使用AngularJs来实现，主要用了其中两个技术：\n\n1.模板技术\n\n2.路由技术\n\n之所以用了AngularJs的路由技术，是因为做一个页面的跳转，之前做开发都是以sevlet或者JAVA MVC框架来做，从后台取数据放到前台，\n通过控制器来觉得给用户返回怎样的一个视图，因为这次没必要做的比较复杂，使用AngularJs上两种技术完全能达到我们的要求，而且还是\n无刷新的。\n\n## BootStarp\n\n优秀的UI框架，大家做简历或者项目展示的时候可能会想要炫酷的效果:)\n\n## fontAwesome\n\n一款优秀的图标字体库\n\n\n# 代码\n\n代码就不贴在博客上了，很简单，没什么可看的，大家可以去我的github上检出\n\n\n<a target=\"_blank\"  href=\"https://github.com/hacke2/myShow4AngularJs\">点击进入github: AngularJs+BootStarp+fontAwesome打造个人展示页面</a><br/>\n\n## <a target=\"_blank\"  style=\"color:red\" href=\"/demo/my-show-4-angularjs/\" >查看完整DEMO</a>\n\n<strong>end from{{ site.url }}</strong>"
  },
  {
    "path": "_posts/2015-1-13-what-you-need-to-know-about-block-scope-let.md",
    "content": "---\nlayout: post\ntitle: 译-你需要知道的块级作用域 - let\ndescription: \"JavaScript 未来声明变量的方式\"\ntags: [翻译]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>http://es6rocks.com/2014/08/what-you-need-to-know-about-block-scope-let/ 原文链接\n\n变量声明在任何语言中都是非常基础的东西，理解变量在作用域下如何工作是非常重要的事情。\n\n在大多数语言中，如`Python`，他有两个作用域:局部 和 全局。如下，变量定义在代码开头部分则为全局变量，在函数里面声明变量则为局部变量。\n\nJavaScript也很相似，看以下例子：\n\n<!--more-->\n\n```python\n# Python\nx = 1 # 全局变量\ny = 3\n\ndef sum(a, b):\n    s = a + b # 局部变量\n    return s\n```\n\n\n```js\n// JavaScript\nvar x = 1;  // 全局变量\nvar y = 3;\n\nfunction sum(a, b) {\n    var s = a + b;  // 局部变量\n    return s;\n}\n```\n\n以C语言为基础而衍生出来的语言(JavaScript, PHP)一般是块级作用域，但JavaScript却不是，当你在一个函数体内声明一个变量，他会在父级或者全局来寻找这个变量，这种行为叫做`变量提升`，与其他语言不同，JavaScript会在`for循环`外面使用这些变量。\n\n看下面这个例子\n\n```js\n// JavaScript\nfor (var i = 0; i <= 2; i += 1) {\n    console.log(i); // current i\n}\nconsole.log(i); // last i\n```\n\n在这个例子中，i竟然可以在循环外面被访问到！这在其他语言是不可思议的！这是很常见的问题，但JS程序员不见得都会关注它。\n\n## let 声明\n\nlet在ES6中出现是为了`代替`var。是的，我们的想法是在未来停用`var`，现在就停止时不切实际的，因为有很多网站都还在用它。\n\n使用`let`会像和其他语言大道预期的效果\n\n例子：\n\n```js\nlet foo = true;\nif  (foo) {\n    let bar = 'baz';\n    console.log(bar); // outputs 'baz'\n}\n\ntry {\n    console.log(bar);\n} catch (e) {\n    console.log(\"bar doesn't exist\");\n}\n```\n\n正如你想看到的,`let`会解决在for循环变量的问题。\n\n## 现在的支持\n\n你现在就可以使用let\n\n查看 Kangax 的ES6 支持表格 > http://kangax.github.io/compat-table/es6/#.\nlet已经在z最新的现代浏览器有所支持( >= IE 11)和[Traceur](https://github.com/google/traceur-compiler)编译器\n\n你可以在火狐开发者工具中试试\n\n![es6 let](http://es6rocks.com/img/let.gif)\n\n注： Michał Gołębiowski 指出在各个浏览器的规范不一样，使用时可能会出现bug。在当前还未正式流行开，这种情况可能会持续到2015年中旬。\n\n## 结论\n\n声明变量虽然简单,但在JavaScript语言中会让初学者头痛的。\n`let`声明变量更直观,符合基于c的语言.\n\nvar应该停止使用,只有这样，没有变量提示的`let`才能正在运用到未来。\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-1-14-2015-plan.md",
    "content": "---\nlayout: post\ntitle: 该是做做计划的时候了！\ndescription: \"2015年计划\"\ntags: [翻译]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>看着大神们一个个做着年终总结，小菜页凑个热闹，做做2015年的计划\n\n`2014年`就这样过去了，回忆过去，痛苦的相思忘不了。2014年肉果很多，尤为重要的一点：自己走上了前端这一道路。\n\n加了高质量的前端群，认识了很多行内人士，微博关注了很多人，开始玩GitHub了，放弃了在CSDN上的博客，开通了专门前端的Github Page，写了一个作品页，参加了校招面试，拿到了阿里巴巴集团的Offer，现在有做起了移动端WEB编程，前景很大...收获实在是太多了。\n\n\n在新的一年里，希望能在前端路上有所建树，找到一个重心点深挖，最好通过公司的实际业务需求，学到一下几方面的知识：\n\n## 技术\n\n1.ES6\n\n之前和[ES6 Rocks](http://www.es6rocks.com)联系，希望能创建一个中国版的ES6 Rocks，翻译了几篇文章后，鸟无音讯了，试着再联系联系\n\n2.HTML5和CSS3\n\n借着公司移动端WEB的春风，相信今年在H5上面也会有所建树\n\n3.backbone,ng等MVC框架\n\n还没深入研究过，得好好理解前端MVC在大型WEB应用上的代码组织\n\n4.属于自己的前端框架\n\n一个小心愿，在此期间也会读读其他框架的源码\n\n5.算法\n\n小虫的群里建了一个项目：[每日一题](https://github.com/nunnly/everycode/issues)，上面有很多算法上的东西，这一块是我的短板\n\n6.设计\n\n看到那么多人设计的东西，感觉看起来整个人都变好了，每一个毛孔都感觉特别放松，很美。希望能在这方面也入个门\n\n7.读书\n\n在公司感觉整个人都很忙，在北京完全没有看过一本书了，希望能忙里偷闲，看几本书，让自己也智慧点，\n\n## 学业\n\n大学快结束了，在学业上今年最重要的也就是毕业设计，我的选题是《维斯顿智能家居集群版的设计与实现》希望能顺顺利利的通过。\n\n## 健康\n\n看着越来越大的肚子，我在想我怎么年纪轻轻身材就已经像四五十岁的人了？在公司和小伙伴经常一起打乒乓球，玩桌上足球，但我的肚子，还是得有个计划收一收。\n\n## 独立能力&自理能力\n\n以前衣服什么的都是母亲帮我洗，现在在外面，靠不了别人，还是得锻炼自己的独立能力和自理能力。（写这篇博文前刚刚洗了堆积已久的袜子--）\n\n其实最重要的还是计划的执行力和自制力，希望能在2015年有一个质的飞跃！\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-10-21-scroll-in-uc.md",
    "content": "---\nlayout: post\ntitle: 在移动端上使用原生滑屏解决方案\ndescription: \"解决UC左右滑动BUG\"\ntags: [Mobile Web]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>最近有个需求，就是非常简单地横向滑动。打算使用overflow-x:auto;来试验原生滑动，但在安卓版UC下当滑到最左或者最右会`默认启用UC上一页、下一页手势`，导致页面的跳转（原生浏览器无此手势）。之前好几个项目之前视频有使用js处理(query: 夏洛特烦恼), 横向滑动没有加惯性支持，非常卡顿。感觉此类对距离没有要求的滑动用原生最好，而且overflow-x:auto;兼容性支持到安卓2.1以上，使用起来也非常方便，所以打算在UC下做一下适配。\n\n<!--more-->\n\n## 使用css布局\n\n先使用overflow-x:auto;给UL加上一下css，做出横向滑动的效果：\n\n```css\noverflow-x: auto;\nwhite-space: nowrap;\n-webkit-overflow-scrolling: touch;\n```\n\n这样，一个简单地滚动效果就实现了。如图\n\n![css滑动](http://ww4.sinaimg.cn/large/8ae515a4gw1ex7vnx0qpnj20ke066gn4.jpg)\n\n在UC浏览器安卓版下试验，不出所料的滑到最右边启用了UC上一页、下一页手势。\n\n## 解决思路\n\n经过无数次和@绍伟的试验，给`body`绑定`touchmove`事件，并且组织默认行为就能把UC效果干掉，那么就有思路了：\n\n1. 在滑到最左边或者最右边给Body绑定事件，组织默认行为\n2. 当手指抬起解绑事件\n\n## 参考代码\n\n具体参考代码如下：\n\n\n```js\nvar preventUCDefault = (function() {\n    var ua = window.navigator.userAgent,\n        startX = 0,\n        diffY = 0,\n        bindPreventTouch = function() {\n            $(document.body).on('touchmove.prevUC', function(e) {\n                e.preventDefault();\n            });\n        },\n        isAndroid = (function() {\n            //https://github.com/amfe/lib-env/blob/master/src/browser.js#L70\n            return (!!ua.match(/(?:UCWEB|UCBrowser\\/)([\\d\\.]+)/) && !!ua.match(/Android[\\s\\/]([\\d\\.]+)/));\n        })();\n\n    return {\n        init : function(ul) {\n            if(isAndroid) {\n                var scrollWidth = ul[0].scrollWidth;\n\n                ul.on('touchstart.prevUC', function(e) {\n                    startX = e.touches[0].pageX;\n                });\n\n                ul.on('touchmove.prevUC',function(e) {\n                    diffY = e.touches[0].pageX - startX;\n                    if($(this).scrollLeft() == 0 && diffY > 0) {\n                        //到最左\n                        bindPreventTouch();\n                    }else if((scrollWidth - $(this).scrollLeft() - ul.width())  === 0 && diffY < 0) {\n                        //到最右\n                        bindPreventTouch();\n                    }\n                });\n\n                ul.on('touchend.prevUC',function(e) {\n                    $(document.body).off('touchmove.prevUC');\n                });\n            }\n        }\n    }\n})();\n\n\npreventUCDefault.init(scope.find('.slide-image ul'));\n\n```\n\n\n经过QA测试，低版本UC下滑动效果也很不错呢！\n\n## 优化\n\n\n当然，想开启gpu加速可以加上下句话：\n\n```css\n-webkit-transform:translateZ(0);\n```\n\n另外，使用原生滑动会出现滚动条，如果想达到极致体验的话，@靳磊给了两个思路：\n\n1. 外面套一层，给定高度+overflow:hidden;\n2. 加一个伪元素将滚动条遮起来\n\n使用伪元素代码如下\n\n```css\n ul::after {\n    display: block;\n    content: \"\";\n    position: absolute;\n    z-index: 10;\n    width: 100%;\n    background-color: #fff;\n    height: 10px;\n    margin-top : -11px;\n}\n```\n\n## 总结\n\n对于一个问题一个人思考思维会很局限，和大家一起讨论完成学到了很多解决的办法，能将任务完成最优而且增进团队的融合性。\n\n---\n\n更新 2015年12月14日\n\n隐藏滚动条还有更好地方法\n\n```css\nul::-webkit-scrollbar {\n        display: none;\n    }\n```\n\n主要解决背景非纯色而是虚化这样的需求，uc下有效，但是safari下还是会出现滚动条，有点小遗憾。\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-10-9-javascript-iterables-and-iterators.md",
    "content": "---\nlayout: post\ntitle: 译-Javascript中的Iterables和Iterators\ndescription: \"ES6迭代器介绍\"\ntags: [Javascript, ES6]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>迭代器是es6引入的重要概念(Java中很早就有了)，也是理解generator的基础。英文原文：http://jsrocks.org/2015/09/javascript-iterables-and-iterators/\n\n\nECMAScript 2015 (ES6) 介绍了两个新的概念，它们密切相关: **iterables** and **iterators**.<br>\n希望你在阅读了这篇文章后，会了解到这两个概念的重要性，并且能在日常开发中使用它们。\n\n<!--more-->\n\n## Iterables\n\n可遍历对象：是指实现了[Iterable interface](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-iterable-interface)接口的对象. 可遍历对象会暴露一个遍历方法，我们可以通过这个暴露的方法去自定义遍历行为。\n\n请看下面的demo：\n\n```js\n//推荐google浏览器，执行报错的话，说明你的浏览器不支持这两个新的特征，我用的是google chrome v45.0,顺利执行\nlet iterable = [1, 2, 3];\nfor (let item of iterable) {\n\tconsole.log(item); // 1, 2, 3\n}\n\nlet iterable2 = new Set([4, 5, 6]);\nfor (let item of iterable2) {\n\tconsole.log(item); // 4, 5, 6\n}\n\nlet iterable3 = '789';\nfor (let item of iterable3) {\n\tconsole.log(item); // '7', '8', '9'\n}\n\nlet notIterable = {name:'alibaba'};\nfor(let item of notIterable){\n\tconsole.log(item) // 执行报错！原因很简单，普通Oject并不是可遍历对象\n}\n```\n\n[for-of](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of) 语法支持可遍历对象, 因此我们可以这种规范的遍历语法去遍历实现了Iterable接口的对象。\n\n### 那Iterable接口到底是个什么东东?\n\n这里的Iterable其实是指一个`[Symbol.iterator]`方法，任何对象只要包含了这个`[Symbol.iterator]`方法，它就是可遍历对象。<br>\n如果你不太了解这个ES6新特征Symbol你可以看下这篇文章：[阮一峰：es6 symbols](http://es6.ruanyifeng.com/#docs/symbol)（你也可以看英文文章：[symbols](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Symbol)）。<br>\n`Symbol.iterator` 是个一个 [*well-known*](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Well-known_symbols) (内置于语言内部) Symbol, 他主要用于定义可遍历对象。\n\n在刚才的例子中，我们其实隐式的使用了`[Symbol.iterator]`方法，在Array,Set,String的原型prototype里都包含了`[Symbol.iterator]`方法。比如 [Array](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array), [Set](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Set), [String](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String) and [Map](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Map) 它们都定义了默认的遍历行为, 然而[Object](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object) 并没这个方法。\n\nIterable接口允许自定义遍历行为，请看下面的例子，我们讲对象的遍历行为设置为数组的遍历行为，让对象能像数组那样遍历：\n\n```js\nlet iterable = {\n\t0: 'a',\n\t1: 'b',\n\t2: 'c',\n\tlength: 3,\n\t[Symbol.iterator]: Array.prototype[Symbol.iterator]\n};\nfor (let item of iterable) {\n\tconsole.log(item); // 'a', 'b', 'c'\n}\n//这个还是比较实用的，毕竟在es5中Oject遍历用for in不是很简洁。\n```\n\n现在你可能会问：**\"怎样才能自定义遍历行为？\"**<br>\n我们已经知道：添加一个`[Symbol.iterator]`可以让一个对象变为可遍历的，但是需要注意一点的是：`[Symbol.iterator]`方法必须返回一个 *iterator object* ，就是这个iterator object负责完成遍历逻辑。不要急，在下一个部分我们介绍它的。\n\n在介绍iterators(迭代器)之前，让我们先来回顾下Iterable interface的概念：\n\n- 它意味着可以给使用者一个可遍历的对象(iterable object: \"嗨，我有一个`[Symbol.iterator]` 方法.\");\n- 它会提供一个标准的方法去遍历任何可遍历的对象(iterable object: \"亲，你可以调用`[Symbol.iterator]`方法去完成遍历过程\").\n\n\n## Iterators\n\n迭代器对象是指实现了[Iterator interface](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-iterator-interface)的对象，迭代器对象必须拥有一个`next`方法，并且这个方法的返回值必须要是 `{ value: Any, done: Boolean }`这种格式的对象，当我们第一次调用next方法时，next方法会返回第一个遍历结果元素。这个`done`属性是指当前遍历的元素是否是最后一个元素，如果done:true意味着所有遍历完成。\n\n下面例子介绍如何使用遍历器去遍历数组：\n\n```js\nlet iterable = ['a', 'b', 'c'];\n\n\n// 获取遍历器\nlet iterator = iterable[Symbol.iterator]();\n\n//使用next方法遍历元素(好像java遍历器)\niterator.next(); // { value: 'a', done: false }\niterator.next(); // { value: 'b', done: false }\niterator.next(); // { value: 'c', done: false }\niterator.next(); // { value: undefined, done: true }\n\n```\n\n最开始的例子我们不是使用for-of的语法么！现在我们来看一下for-of语法的内部实现方式：\n\n```js\nlet iterable = ['a', 'b', 'c'];\n\n\n// 简便语法，利用for-of\nfor (let item of iterable) {\n\tconsole.log(item); // 'a', 'b', 'c'\n}\n\n// for-of的内部实现方式，是不是感觉很简单！真的好像java遍历器\nfor (let _iterator = iterable[Symbol.iterator](), _result, item; _result = _iterator.next(), item = _result.value, !_result.done;) {\n\tconsole.log(item); // 'a', 'b', 'c'\n}\n```\n\n现在我们知道了iterables和iterators后，现在我们可以创建自定义遍历行为的可遍历对象了。首先，我们先来自己实现一个类似数组遍历行为的遍历器：\n\n```js\nlet iterable = {\n\t0: 'a',\n\t1: 'b',\n\t2: 'c',\n\tlength: 3,\n\t[Symbol.iterator]() {\n\t\tlet index = 0;\n\t\treturn {\n\t\t\tnext: () => {\n\t\t\t\tlet value = this[index];\n\t\t\t\tlet done = index === this.length;\n\t\t\t\tindex++;\n\t\t\t\treturn { value, done };\n\t\t\t}\n\t\t};\n\t}\n};\n\n//使用for-of语法完成遍历\nfor (let item of iterable) {\n\tconsole.log(item); // 'a', 'b', 'c'\n}\n```\n\n额，这个看起来是有点复杂，不清晰，但是不要慌，让我们仔细的分析下它。\n\n我们一开始用JavaScript本文化特征语法创建了一个对象。并且用 [computed properties](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Computed_property_names) 和 [shorthand methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions) ES2015 本文化扩展语法给这个对象定义了一个`[Symbol.iterator]`方法，这个对象有了`[Symbol.iterator]`方法，因此他也成了一个可遍历对象。\n\n这个`[Symbol.iterator]`方法实现了默认的遍历行为，这个方法返回了一个遍历器对象，这个遍历器对象包含了上文我们说的next方法，所以我们才能把`[Symbol.iterator]`方法返回的对象视为遍历器对象。\n\n其中`next`方法里面用到了[arrow function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)，所以next方法里的this才会指向iterable对象。（个人来说，我认为ES6 中箭头函数是最强大，最实用，最能简化现有js开发的新特征之一，个人看法，不喜勿喷）。\n\nnext方法返回了一个由value和done属性组成的对象，语法很简洁，很实用，用的是[shorthand properties](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer#Property_definitions)语法，简单来说{value,done}就等于{'value':value,'done':done}。\n\n看到这里，相信你已经完全上面例子里每行代码是怎么工作的了。`for-of`语法会调用 `[Symbol.iterator]`方法来获取遍历器对象，遍历对象里有一个next方法，通过调用next方法遍历元素。\n\n### 有必要把一个遍历接口设计得这么复杂?  \n恩，总之是需要的。下面我讲列出最常见的问题和疑惑，并以QA的方式展现给大家。\n\n### Q. 为什么是`[Symbol.iterator]`属性是一个方法，这个方法会返回一个遍历器，而不是这个属性直接就是一个遍历器？\n\n原因是：如果直接是一个遍历器，当你同时想多次遍历时，就不能实现了，同时多次遍历这个可能有点难理解，请看下面的代码：\n\n```js\nlet iterable = [1, 2, 3, 4];\nlet iterator1 = iterable[Symbol.iterator]();\nlet iterator2 = iterable[Symbol.iterator]();\n\niterator1.next(); // { value: 1, done: false }\n\niterator2.next(); // { value: 1, done: false }\niterator2.next(); // { value: 2, done: false }\niterator2.next(); // { value: 3, done: false }\n\niterator1.next(); // { value: 2, done: false }\n\n//可以看到iterator1和iterator2是互不影响的\n```\n\n这个例子很勉强，重复遍历相同的数据事时上不太常见。但是异步处理迭代之间的每个值，这在[Koa](http://koajs.com/)和[co](https://github.com/tj/co)中就很好地表现了这一点。尽管它们是利用生成器函数返回的遍历器。\n\n### Q. 为什么遍历器的`next`方法返回一个新的数据结构，而不是直接返回遍历的元素值呢？\n\n在最初的遍历器设计中，这个`next`方法只会返回元素值。那么问题就来了：我怎么知道遍历器已经完成所有的遍历行为呢? 如果让`next`函数抛出一个错误来标明遍历已完成这样又太土了！因为这样你在调用`next`函数时，就必须给它包一层`try/catch`。所以才会让`next`函数返回的数据里有一个`done`属性。\n\n### Q. 为什么遍历器最后一个遍历结果让人感觉有点冗余?\n\n请看下面的代码：\n\n```js\nlet iterable = [1, 2];\n\nlet it = iterable[Symbol.iterator]();\n\n\nit.next() // { value: \"a\", done: false }\nit.next() // { value: \"b\", done: false }\n\n//明明只有2个元素，为毛非要遍历三次，才算遍历完成，蛋疼？？？？！！！！\nit.next() // { value: undefined, done: true }\n\n```\n\n当`next`方法返回的结果`done`属性为`true`时，遍历才算完成，并且`value`属性的值为`undefined`。遍历器让value和`down:true`的对象为返回值，是为了让这个`down:true`的对象作为一个遍历完成的标志，并不是一个遍历的元素。例如在`for-of`,`Array.from`的内部实现里，它们都会忽略掉这个返回值。\n\n### Q. 我能让遍历器的`next`方法接收参数么?\n\n是的，这样是可以的。请看下面的例子：\n\n```js\nlet echoIterator = {\n\tnext(value) {\n\t\treturn { value, done: false };\n\t}\n};\n\nechoIterator.next(42); // { value: 42, done: false }\n```\n\n正如上面的例子一样，你在自定义的遍历器里，是可以给next方法配置参数的！但是这种遍历器如果使用`for-of`或`Array.from`这些语法时，就会发生异常，因为`for-of`在调用你的next方法时并不会传递参数给next方法。所以请慎用这种方式。\n\n### Q. 是否可以无限的调用遍历器的遍历方法？\n\n是的，你可以无限的调用遍历器的`next`方法，即使遍历行为已经完成。只是返回的结果都是value=undefined,down=true的对象。\n\n\n## 可遍历的遍历器（Iterable iterators）\n\n先来一个快速的知识回顾：\n\n- 可变遍历接口要求实现一个`[Symbol.iterator]`方法;\n- 遍历器接口需要实现一个`next`方法;\n\n请打开你的脑洞：要是我们让一个对象既有`[Symbol.iterator]`方法，既有`next`方法，那这个对象岂不是成了一个可遍历的遍历器了。\n\n实际上，大多数遍历器都实现了可遍历接口，都有`[Symbol.iterator]`方法，但是请记住：遍历器的`[Symbol.iterator]`方法通常会返回遍历器本身，而不是一个新的遍历器对象。\n\n请看下面的例子：\n\n```js\nlet iterable = [1, 2];\nlet iterator = iterable[Symbol.iterator]();\n\n\nvar iterator1 = iterable[Symbol.iterator]();\nvar iterator2 = iterable[Symbol.iterator]();\niterator1 == iterator2 // false\n//为毛iterator1又不等于iterator2了？ 亲，iterator1和iterator2是分别由Iterable Oject的`[Symbol.iterator]`方法生成的对象，它们当然不相等了。\n\nvar iterator3 = iterator[Symbol.iterator]();\nvar iterator4 = iterator[Symbol.iterator]();\niterator == iterator3 == iterator4 // true\n//iterator3和iterator4都是指向的是iterator,iterator和iterator3和iterator4其实是一个对象所以它们是相等的。\n\n```\n\n这是一个简单的可遍历的遍历器：\n\n```js\nlet iterableIterator = {\n\n\tnext() {/*...*/},\n\t\n\t[Symbol.iterator]() {\n\t\treturn this;\n\t}\n};\n```\n\n现在你可能会问：**这样有什么用啊? 然并卵？**\n\n好的，现在请思考一个问题： **一个数据源可能需要有多次遍历行为.**<br>\n请记住：`for-of`语法的内部实现里，它会重复调用iterable对象的`[Symbol.iterator]`方法来获取iterator.（我这这里其实有一个疑问：为毛for-of的内部实现里，会一直不断的获取iterator,既然iterator的`[Symbol.iterator]`方法方法会返回iterator自身，那还需调用这个方法来获取iterator嘛！这个疑问估计得看真正的for-of的内部实现源码才能明白了）\n\n通过给iterator对象添加`[Symbol.iterator]`方法来返回iterator对象本自身，这样设计很重要的一点就是：`通用`。\n\n怎么解释这个通用呢？\n\n假设现在有一个方法A,方法A接收的参数是一个Iterable Object(方法A是干啥的你先不要关心),但是你现在传递了一个iterator对象给方法A,试想一下如果iterotor对象里没有`[Symbol.iterator]`方法，那方法A肯定不能顺利执行了。所以当给iterator对象添加`[Symbol.iterator]`方法后，任何需要参数为Iterable object的函数，你传给这个函数一个iterator对象，这个函数还是能正常work。希望我这样解释`通用`大家能明白。\n\n\n```js\nlet arr = ['a', 'b'];\nlet keysIterator = arr.keys(); // 获取遍历器\n\nkeysIterator[Symbol.iterator]() === keysIterator; // `keysIterator` 就是一个 Iterable iterator\n\n//for-of会重复的调用`keysIterator[Symbol.iterator]()`，来获取`keysIterator`\n//之后遍历它\nfor (let key of keysIterator) {\n\tconsole.log(key); // 0, 1 (the array indexes)\n}\n\n```\n\n## 可能会中枪的小细节\n\n因为iterator的`[Symbol.iterator]`方法会返回iterator自身，所以我们在用的时候一定要小心这个问题，不然代码执行出错了就坑爹了。\n\n请看下面的例子：\n\n```js\nlet iterable = [1, 2, 3, 4];\n\nlet iterator = iterable[Symbol.iterator]();\n\n//先手动的遍历2次\niterator.next();\niterator.next();\n\n//再调用for-of去遍历\nfor (let item of iterator) {\n\tconsole.log(item); // 3, 4\n\t//注意了这里只遍历了2次，并不会从头开始遍历\n}\n\n//如果你想从头开始遍历，你可以这样写\nfor (let item of iterable[Symbol.iterator]()) {\n\tconsole.log(item); // 1, 2, 3, 4\n}\n```\n\n原因就不在多说了，相信大家都懂的。\n\n\n## 总结\n\n啊啊啊啊啊！谢谢你看完了这篇文章！希望我的介绍没问题，让你理解了iterables和iterators。\n\n恩，文章差不多结束了，可能你有想继续学习ES6的内容，你可以看下，下一篇文章：[Generators](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-generatorfunction-objects)。\n\n最后如果你想改善一下这篇文章，请点击这里：[JS Rocks repository](https://github.com/JSRocksHQ/jsrockshq.github.io)(额，这是英文原文)，我们将会很高兴地与你讨论并接纳你的意见。\n\n至于文章知识点总结就省略了，希望大家不要打我...\n\n\n## 参考\n\n- [ECMAScript® 2015 Language Specification - Ecma International](http://www.ecma-international.org/ecma-262/6.0/index.html)\n- [for...of - MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of)\n- [Iteration protocols - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)\n- [for-of reimplementation - Babel](http://babeljs.io/repl/#?experimental=false&evaluate=true&loose=false&spec=false&playground=true&code=let%20iterable%20%3D%20%5B'a'%2C%20'b'%2C%20'c'%5D%3B%0D%0Afor%20%28let%20item%20of%20iterable%29%20%7B%0D%0A%09console.log%28item%29%3B%20%2F%2F%20'a'%2C%20'b'%2C%20'c'%0D%0A%7D%0D%0A&runtime=true)\n- [Symbol - MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Symbol)\n- [Object initializer - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer)\n- [Method definitions - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions)\n- [Arrow functions - MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-11-17-use-node-build-static-blog.md",
    "content": "---\nlayout: post\ntitle: 使用Node.js生成一个静态博客\ndescription: \"静态博客wooden编写记录\"\ntags: [Node,Javascript, ES6]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>我github star最多的是我的博客,是用Ruby写的Jekyll搭建的，运行在支持它的gthub上。Jekyll很方便的一点是可以用markdown来编写你的博客，有一种极客的感觉。但是用Node.js怎么实现一个静态博客系统呢？\n\n<!--more-->\n\n![github](http://ww2.sinaimg.cn/large/8ae515a4jw1ey4ctqpvhaj20sc02m0sz.jpg)\n\n## 生成模板\n\n首先要解决的问题是怎么用命令行来做一些操作。我打算用命令行生成模板，有一个模块`commander`实现很方便。\n定义一个帮助命令\n\n```js\nprogram\n\t.command('help')\n\t.description('show help')\n\t.action(() => {\n\t\tprogram.outputHelp();\n\t});\n```\n\n在定义其他命令\n\n```js\n\nprogram\n\t.command('create [dir]')\n\t.description('create empty project')\n\t.action(require('../lib/create'));\n\nprogram\n\t.command('preview [dir]')\n\t.description('preview your web page')\n\t.action(require('../lib/preview'));\n\nprogram\n\t.command('build [dir]')\n\t.description('build the project to HTML')\n\t.option('-o, --output <dir>', 'build the project dir')\n\t.action(require('../lib/build'));\n\nprogram.parse(process.argv);\n\n```\n\n我们定义了三条命令:\n\n1. 创建\n2. 预览\n3. 生成\n\n## 创建\n\n在创建的时候会把之前的一些模板文章生成到用户文件下，因为本模块是安装在全局的，运行该命名会把一些静态资源文件、模板、配置文件等输出出来供用户修改。\n\n```js\n\ntry {\n\t  \t//create template dir\n\t\tfse.mkdirsSync(path.resolve(dir, '_layout'));\n\t\tfse.mkdirsSync(path.resolve(dir, '_post'));\n\t\tfse.mkdirsSync(path.resolve(dir, 'assets'));\n\t\tfse.mkdirsSync(path.resolve(dir, 'posts'));\n\n\t\t// 复制模板文件\n\t\tlet tplDir = path.resolve(__dirname, '../tpl');\n\t\tfse.copySync(tplDir, dir);\n\n\t\tconsole.log('create success!');\n\t}catch(e) {\n\t\tconsole.log('create faild!');\n\t\tconsole.error(e);\n\t}\n\t\n```\n\n## 预览\n\n预览就是用express启动一个web项目。开启一个Node.js web项目最简单无异于是用express框架了。我是用jade当做模板引擎，因为其提供的block和include实在是太强大了。\n\n```js\n\n\tlet app = express();\n\n\n\tapp.use('/assets', express.static(path.join(__dirname, '../assets')));\n\t\n\tapp.set('port', (process.env.PORT || 3000));\n\n\tapp.set('views', path.join(__dirname, '../_layout/pages'));\n\tapp.set('view engine','jade')\n\t\n```\n\n我们设置好静态目录和模板引擎，就可以编写重要的路由了。在一个简单的博客系统，无外乎有两个重要的路由：\n\n* 首页\n* 文章详情页\n\n对应路由如下：\n\n```js\n//render index\n\tapp.get('/', (req, res, next) => {\n\t\t//...\n\t});\n\n//render article\napp.get('/posts/:articleName', (req, res, next) => {\n\t//...\n});\n```\n\n最后，我们想启动的时候就能打开默认浏览器，这里，我参考了一下[新杰的代码](https://github.com/freeyiyi1993/mobile-test/blob/master/server.js#L25)：\n\n```js\n// open browers\n\tapp.listen(app.get('port'), () => {\n\n\t\tlet cmd = 'open \"http://localhost:' + app.get('port') + '/\"';\n\n\t    child_process.exec(cmd, (err, stdout, error) => {\n\t        if(err) {\n\t            console.log('error:' + error)\n\t        } else {\n\t            let url = 'http://localhost:' + app.get('port') + '/'\n\t            console.log('Server started: ' + url)\n\t        }\n\t    })\n\t})\n```\n\n### 解析markdown\n\n解析markdown Node.js已经提供了封装好得模块`markdown-it`，我们设置参数调用就可以直接调用。\n\n```js\nlet md = new MarkdownIt({\n    html: true,\n    langPrefix: 'code-',\n});\n```\n\n一篇文章应该有他的一些特征，比如像Jekyll一样：标题、标签、背景图等。\n\n我在markdown下有如下设置：\n\n```html\n---\ntitle : 我是标题\n---\n```\n\n然后需要有一个[函数来解析](https://github.com/hacke2/wooden/blob/master/lib%2Futils.js#L55)\n\n最后得到标题，我们命名文章的规则是日期+标题，和jekyll一样。\n\n也需要解析一下\n\n```js\nlet getArticleDate = title =>{\n    let arr = title.split('-'),\n    result = [];\n\n    for (let i = 0; i < 3; i++) {\n        result[i] = arr[i];\n    }\n    return result.join('-');\n}\n```\n\n### 异步调用\n\n我们得到数据后，会将它给到jade，这是一个异步的过程，我用`Promise`来封装\n\n下面是的获取首页\n\n```js\nlet getArticle = name => {\n    return new Promise((resolve, reject) => {\n        \n        let file = path.join(process.cwd(), '_post', name + '.md');\n        fs.readFile(file, (err, data) => {\n            if(err) {\n                reject(err);\n            }else {\n                let article = parseSourceContent(name, data.toString());\n                let html = md.render(article.content);\n                resolve({\n                    name : config.name,\n                    contact : config.contact,\n                    title : article.title,\n                    content : html,\n                    date : article.date,\n                    href : article.href\n                });\n            }\n        });\n        \n    })\n}\n```\n\n下面是的获取某一篇文章\n\n```js\nlet getArticle = name => {\n    return new Promise((resolve, reject) => {\n        \n        let file = path.join(process.cwd(), '_post', name + '.md');\n        fs.readFile(file, (err, data) => {\n            if(err) {\n                reject(err);\n            }else {\n                let article = parseSourceContent(name, data.toString());\n                let html = md.render(article.content);\n                resolve({\n                    name : config.name,\n                    contact : config.contact,\n                    title : article.title,\n                    content : html,\n                    date : article.date,\n                    href : article.href\n                });\n            }\n        });\n        \n    })\n}\n```\n\n### 渲染jade\n\njade提供个强大的include 和 block。我们创建一个框架，其他页面继承它。\n\n```jade\ndoctype\nhtml\n\thead\n\t\tmeta(charset=\"utf-8\")\n\t\tmeta(name=\"viewport\",content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\")\n\t\ttitle #{name}\n\t\tinclude ./includes/css\n\t\tblock page_css\n\tbody\n\t\tinclude ./includes/header\n\t\tblock content\n\t\tinclude ./includes/js\n\t\tblock page_js\n```\n\n它包含css模板和js模板，页面放在content里\n\n```jade\nblock content\n```\n\n首页来继承它\n\n```jade\nextends ../layout\n\nblock page_css\n\tlink(href=\"assets/css/base.css\",rel=\"stylesheet\")\n\tlink(href=\"assets/css/index.css\",rel=\"stylesheet\")\n\nblock content\n\th1.site-name #{name}\n\tarticle.container\n\t\tul.article-list\n\t\t\teach article in articleList\n\t\t\t\tli(class=\"article\")\n\t\t\t\t\ta(href=\"#{article.href}#{isBuild ? '.html' : ''}\", class=\"article-title\") #{article.title}\n\t\t\t\t\tdiv.abstract #{article.abstract}\n```\n\n文章列表也也是如此，在此不展开了。\n\n可以看出，预览是比较重要的一步，生成也是基于它来运作的。\n\n## 生成\n\n我们在创建新的md文件后，需要将它编译成html，也是调用之前预览的方法来生成html。\n\n```js\nutils.getIndexData().then(data => {\n\n\t\tdata.isBuild = true;\n\t\t\n\t\tconsole.log('build ' + path.join(viewPath, 'index.jade'))\n\t\tlet html = jade.renderFile(path.join(viewPath, 'index.jade'), data);\n\t\tfse.outputFileSync(path.join(outputDir, 'index.html'), html);\n\t});\n\t\n\t//build post\n\tutils.getFileList().forEach(filePath => {\n\t\tlet fileName = path.basename(filePath, '.md');\n\t\tutils.getArticle(fileName)\n\t\t\t.then(data => {\n\t\t\t\tconsole.log('build ' + path.join(viewPath, 'post.jade'))\n\t\t\t\tlet html = jade.renderFile(path.join(viewPath, 'post.jade'), data);\n\t\t\t\tfse.outputFileSync(path.join(outputDir, 'posts', fileName + '.html'), html.toString('utf-8'));\n\t\t\t});\n\t\t\n\t});\n```\n\n## 发布\n\n想让这个命令不是用Node xxx.js来运行，直接是用xxx来运行，需要在bin目录下创建一个文件，将commande这个入口js拷进去，然后在开头输入\n\n```shell\n#!/usr/bin/env node --harmony\n```\n\n因为此项目运用了es6的一些特性，需要使用`--harmony`来开启支持。\n\n最后，使用`npm publish`发布，我已经将它发布在npm上了，起名`wooden`[https://www.npmjs.com/package/wooden](https://www.npmjs.com/package/wooden)。将一个demo部署在了开发机上[http://fe.sm.cn/xinglong.wangwxl/wooden/](http://fe.sm.cn/xinglong.wangwxl/wooden/)\n\n\n![WOODEN](http://ww3.sinaimg.cn/large/8ae515a4jw1ey4cjpkywzj20xl0bkwf9.jpg)\n\n## 遇到的一个坑\n\n之前写项目都是用`__dirname`找当前目录，但是使用这种直接命令这种方式`__dirname`找到的是全局安装的路径，并不是当前命令执行的路径，最后路径会找不到，可以使用`process.cwd()`来找到当前命令执行的路径。\n\n本文就此完毕，是不是和我现有博客的架构挺像？\n\n项目地址：[https://github.com/hacke2/wooden](https://github.com/hacke2/wooden)\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-2-25-Variables-and-scoping-in-ECMAScript-6.md",
    "content": "---\nlayout: post\ntitle: 译-ES6里的变量和作用域\ndescription: \"在ES6中变量和作用域的使用方法\"\ntags: [翻译]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>http://www.2ality.com/2015/02/es6-scoping.html 原文链接\n\n在本文将有大量的例子介绍在ES6中作用域和变量的使用方法\n\n## 1.块级作用域的let和const\n\n让`let`和`const`创造块级作用域，他仅仅存在于包裹他们的最内层的块。下面代码演示了使用`let`修饰的`tmp变量`仅仅存在于最里层的`if`申明里。\n\n```js\nfunction func() {\n    if (true) {\n        let tmp = 123;\n    }\n    console.log(tmp); // tmp未定义\n}\n```\n\n相比之下，用var申明的变量在函数级作用域\n\n<!--more-->\n\n```js\nfunction func() {\n    if (true) {\n        var tmp = 123;\n    }\n    console.log(tmp); // 123\n}\n```\n\n块级作用域意味着你在函数里只要是两个不同的块，那么变量名称可以重复。（原文为**影子变量**）\n\n```js\nfunction func() {\n    let foo = 5;\n    if (···) {\n        let foo = 10; // shadows outer `foo`\n        console.log(foo); // 10\n    }\n    console.log(foo); // 5\n}\n```\n\n## 2.`const`创建不可变的变量\n\n由`let`创建的变量是可变的\n\n```js\nlet foo = 'abc';\nfoo = 'def';\nconsole.log(foo); // def\n```\n\n`const`创建变量是不可变的\n\n```js\nconst foo = 'abc';\nfoo = 'def'; // TypeError\n```\n\n注意，`const`并不影响所赋的值是否可变，如果所赋的值是一个对象，那么并不能保证该对象不变。他只是保存一个对象的引用。\n\n```js\nconst obj = {};\nobj.prop = 123;\nconsole.log(obj.prop); // 123\n\nobj = {}; // TypeError\n```\n\n如果你想改变量是真正不可变的，那么直接[冻结他的值](http://speakingjs.com/es5/ch17.html#freezing_objects)\n\n```js\nconst obj = Object.freeze({});\nobj.prop = 123; // TypeError\n```\n\n### 2.1 循环体内的const\n\n一旦`const`变量创建，那么他就不能改变。但这并不意味着你不能重新声明一个新值，比如在循环体内。\n\n```js\nfunction logArgs(...args) {\n    for (let [index, elem] of args.entries()) {\n        const message = index + '. ' + elem;\n        console.log(message);\n    }\n}\nlogArgs('Hello', 'everyone');\n\n// Output:\n// 0. Hello\n// 1. everyone\n```\n\n### 2.2 什么时候我该使用let，什么时候该使用const？\n\n```js\nconst foo = 1;\nfoo++; // TypeError\n```\n\n如果你想创建的可变变量为基本类型，则，不能使用const。\n\n不过你可以使用`const`修饰引用类型的变量。\n\n```js\nconst bar = [];\nbar.push('abc'); // array是可变的\n```\n\n按照最佳实践，一般会把常量(真正不变的)使用大写来表示。\n\n```js\nconst EMPTY_ARRAY = Object.freeze([]);\n```\n\n## 3.临时禁区(TDZ)\n\n被`const`和`let`修饰的变量我叫做它是`临时禁区` (TDZ)。当进入这个作用域，外界就无法访问这些被修饰的变量知道运行结束。\n\n使用`var`修饰的变量没有TDZ。\n\n* 当进入有`var`修饰的变量的作用域中，会在内存中立即创建空间，立即初始化变量，并且设置成`undifined`。\n* 在执行过程中如遇到赋值关键字则给变量赋值，否则还是为`undifined`。\n\n使用`let`关键字的拥有TDZ，这意味着它的生命周期如下：\n\n* 当进入有`let`修饰的变量的作用域中，会在内存中立即创建这个变量，不会初始化这个变量。\n* 获取或设置未初始化的变量会导致引用错误(ReferenceError).\n* 在执行过程中如遇到声明处则初始化且给变量赋值，如果不赋值则为undefined。\n\n`const`的机制与`let`相似，但他必须赋一个值且不能被改变。\n\n在TDZ中，如果获取或者设置一个未初始化会抛出异常。\n\n```js\nif (true) { // 一个新的作用域, TDZ 开始\n    //tmp未初始化\n    tmp = 'abc'; // ReferenceError\n    console.log(tmp); // ReferenceError\n\n    let tmp; // TDZ 结束, `tmp` 被初始化为 `undefined`\n    console.log(tmp); // undefined\n\n    tmp = 123;\n    console.log(tmp); // 123\n}\n```\n\n下面例子演示了TDZ是临时的(基于时间)的而不是基于位置的：\n\n```\nif (true) { // 一个新的作用域, TDZ 开始\n    const func = function () {\n        console.log(myVar); // OK!\n    };\n\n    // 在这里已经进入了TDZ，访问 `myVar` 会导致 ReferenceError\n\n    let myVar = 3; TDZ 结束\n    func(); // called outside TDZ\n}\n```\n\n### 3.1TDZ的类型检查\n\n一个变量不能再TDZ里访问意味着你也不能在该变量使用`typeof`\n\n```js\nif (true) {\n    console.log(typeof tmp); // ReferenceError\n    let tmp;\n}\n```\n\n我不认为这将在实践中是一个问题。因为你不能有条件的给某一个作用域加上`let`修饰符。事实上你仍然可以使用`var`修饰符创建全局变量\n\n```js\nif (typeof myVarVariable === 'undefined') {\n    // `myVarVariable`不存在，则创建它\n    window.myVarVariable = 'abc';\n}\n```\n\n## 4.在循环体的头部中使用`let`修饰符\n\n在循环体中，你每次迭代重新绑定用`let`修饰的变量。允许你这样做的循环:`for`, `for-in`和`for-of` 。\n\n```js\nif (typeof myVarVariable === 'undefined') {\n    let arr = [];\n    for (let i=0; i < 3; i++) {\n        arr.push(() => i);\n    }\n    console.log(arr.map(x => x())); // [0,1,2]\n}\n```\n\n相比之下，用var声明的循环体中，，每次迭代室友一个单一的值\n\n```js\nif (typeof myVarVariable === 'undefined') {\n    let arr = [];\n    for (var i=0; i < 3; i++) {\n        arr.push(() => i);\n    }\n    console.log(arr.map(x => x())); // [3,3,3]\n}\n```\n\n为每次迭代得到一个新的绑定似乎有些奇怪,但当你使用循环创建函数(例如回调事件处理)它是非常有用。\n\n## 5.形参\n\n### 5.1 形参和局部变量\n\n如果你声明的变量名正好与形参一致，那么会爆出一个静态错误\n\n```js\nfunction func(arg) {\n    let arg; // static error: duplicate declaration of `arg`\n}\n```\n\n在函数里面再嵌套一个块则会避免这个问题\n\n```js\nfunction func(arg) {\n    {\n        let arg; // 影子参数 `arg`\n    }\n}\n```\n\n相比之下,用`var`修饰的与形参同名的变量不会出现错误，表现的形式是覆盖了形参。\n\n```js\nfunction func(arg) {\n    var arg; // does nothing\n}\n```\n\n```js\nfunction func(arg) {\n    {\n        var arg; // does nothing\n    }\n}\n```\n\n### 5.2 默认形参与TDZ\n\n如果形参有默认值,他们被当做一个序列\n\n```js\n// OK: 声明之后访问x\nfunction foo(x=1, y=x) {\n    return [x, y];\n}\nfoo(); // [1,1]\n\n// 异常，在YDZ里试图访问y\nfunction bar(x=y, y=2) {\n    return [x, y];\n}\nbar(); // ReferenceError\n```\n\n### 5.3 默认形参与TDZ\n\n形参默认值的范围是独立于body的作用域(前者围绕后者)。这意味着“inside”定义的方法或函数参数的默认值不知道body的局部变量。\n\n```js\n// OK: 在x已经声明后y访问x\nfunction foo(x=1, y=x) {\n    return [x, y];\n}\nfoo(); // [1,1]\n\n// 异常: `x` 试图在TDZ访问 `y`\nfunction bar(x=y, y=2) {\n    return [x, y];\n}\nbar(); // ReferenceError\n```\n\n## 6.全局对象\n\nJS中的全局对象(浏览器是`windows`，Node.js是global)的bug比特性还要多，尤其在性能这一块，这也就是不奇怪ES6有以下描述：\n\n* 全局对象的属性都是全局变量。在全局范围,`var` 和 `function` 声明创建这些属性\n* 是全局变量但不是全局对象的属性。在全局范围,`let` 和 `const`, `Class` 声明创建这些属性\n\n## 7.函数的声明和类的声明\n\n函数声明：\n\n* 块级作用域，像`let`\n* 在全局对象创建属性(在全局范围),像var。 \n* 声明提升：独立的一个函数声明中提到它的范围,它总是创建之初的范围\n\n下面代码解释了声明提升\n\n```js\n{ // Enter a new scope\n\n    console.log(foo()); // OK, due to hoisting\n    function foo() {\n        return 'hello';\n    }\n}\n```\n\n类的声明：\n\n* 块级作用域\n* 不会再全局对象上创建属性\n* 不会声明提升\n\n类不升起可能令人惊讶,因为他们创建函数。这种行为的理由是,他们继承条款定义的值通过表达式,表达式必须在适当的时间执行。\n\n```js\n{ // 进入新的作用域\n    \n    const identity = x => x;\n\n    //这儿是`MyClass`的TDZ\n    let inst = new MyClass(); // ReferenceError\n\n    //注意 `extends`\n    class MyClass extends identity(Object) {\n    }\n}\n```\n\n## 8.扩展阅读\n\n1.[Using ECMAScript 6 today](http://www.2ality.com/2014/08/es6-today.html)\n\n2.[Destructuring and parameter handling in ECMAScript 6](http://www.2ality.com/2015/01/es6-destructuring.html)\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-3-13-anmi-strange-problem.md",
    "content": "---\nlayout: post\ntitle: Zepto CSS方法一个奇怪的现象\ndescription: \"Zepto CSS方法一个奇怪的现象\"\ntags: [心声]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n今天写活动页，打算封装一个JS逐帧运动的组件，但在调试的时候发现使用以下代码会出现问题：\n\n```css\ncurAnim.css({\n    'background-position' : '-' + i * 75 + 'px 0px'\n})\n```\n\n<!--more-->\n\n在Chrome 模拟器下没任何问题，但是在iphone6下会出现一闪一闪的问题，百思不得其解，后来用JS原生方法解决了。\n\n```js\ncurAnim[0].style.backgroundPosition = \"-\" + i * 75 + \"px 0px\";\n```\n\n在iphone6也正常了。\n\n查阅了以下Zetop的css方法，其核心代码如下：\n\n```js\nvar css = ''\nif (type(property) == 'string') {\nif (!value && value !== 0)\n  this.each(function(){ this.style.removeProperty(dasherize(property)) })\nelse\n  css = dasherize(property) + \":\" + maybeAddPx(property, value)\n} else {\nfor (key in property)\n  if (!property[key] && property[key] !== 0)\n    this.each(function(){ this.style.removeProperty(dasherize(key)) })\n  else\n    css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';'\n}\n\nreturn this.each(function(){ this.style.cssText += ';' + css })\n```\n\n我上一句其实正在起作用的是下面：\n\n```js\nthis.style.cssText += ';' + css;\n```\n\n于是我想，是不是`this.style.cssText`和`this.style.backgroundPosition`的区别？于是了然了：**cssText因为重新这设置了这个元素样式的会让浏览器将这个元素的整个都repaint+reflow，效率当然要比之变换一个样式的低**，算是分析完了，若对一个元素多次操作还是使用原生JS为妙。\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-3-20-css-multi-row-overflow.md",
    "content": "---\nlayout: post\ntitle: 小tip:CSS3控制多行溢出\ndescription: \"打破CSS只能控制单行溢出的历史观点\"\ntags: [CSS3]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>以前做项目，对文字溢出只能进行单行溢出的控制：\n\n```css\nwhite-space: nowrap;  \noverflow: hidden;  \ntext-overflow: ellipsis;  \n```\n\n对于多行则无能为力，只能用渲染端来控制，这样有一个很大的问题：**无法达到响应式**\n\n但是在WebKit浏览器或移动端（绝大部分是WebKit内核的浏览器）的页面实现比较简单，可以直接使用WebKit的CSS扩展属性(WebKit是私有属性)-webkit-line-clamp，这个历史问题也就不攻自破了,对应代码：\n\n<!--more-->\n\n```css\n@media all and (-webkit-transform-3d){\n    .3-line{\n       white-space:normal;  \n       -webkit-line-clamp:3;  //表限制三行\n       display:-webkit-box;  \n       overflow: hidden;\n       text-overflow:ellipsis;\n       -webkit-box-orient: vertical; \n    }\n}\n```\n\n对应SCSS代码如下：\n\n```scss\n/**\n  * multi lines overflow\n  * @param {Number} $lineCount - count to display\n  */\n@mixin multiline-ellipsis($lineCount){\n    @media all and (-webkit-transform-3d){\n        &{\n           white-space:normal;  \n           -webkit-line-clamp:$lineCount;  \n           display:-webkit-box;  \n           overflow: hidden;\n           text-overflow:ellipsis;\n           -webkit-box-orient: vertical; \n        }\n    }\n}\n```\n\n\n加这段媒体查询的原因是考虑只在webkit下用。直接引用这个代码片段传入参数即可。\n\n对于过渡方案，有以下几种：\n\n1.使用伪元素生成一个“...”（最好半透明背景），父元素定高`overflow:hidden`\n\n2.以上功能由JS来代替[Clamp.js](https://github.com/josephschmitt/Clamp.js)\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-3-23-frame-animation.md",
    "content": "---\nlayout: post\ntitle: 逐帧动画两种实现方式\ndescription: \"分别用JS/CSS实现逐帧动画\"\ntags: [CSS3]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>由于使用gif，我们不能将其控制（播放、暂停、播放次数），所以逐帧动画一般使用代码实现，下面我们来介绍两种方法。\n\n**原理就是时时刻刻改变他的`position`**。\n\n<!--more-->\n\n## 1.JS逐帧动画\n\nJS就是调用定时器，这边有一个小技巧：直接改变一个经测试会有闪烁的情况，再加一个重叠替换运动\n\n<a class=\"jsbin-embed\" href=\"http://jsbin.com/milopu/1/embed?html,css,js,output\">JS Bin</a><script src=\"http://static.jsbin.com/js/embed.js\"></script>\n\n\n每次改变位置，效率不高。简单封装了一段JS插件\n\n```js\n;(function($) {\n    'use strict';\n    $.extend($.fn, {\n        requestAnimFrame: function(opt){\n            var defined = {\n                top:0,\n                left:0,\n                position:'absolute'\n            },\n            option = $.extend(defined, opt),\n            i = 0,\n            flag = false,\n            curAnim = null,\n            self = this,\n            width = 0,\n            isRunning = false,\n            maybeAddPx = function (value) {\n                return (typeof value == \"number\") ? value + \"px\" : value;\n            },\n            /**\n             * 标准化requestAnimFrame\n             * @param  {[type]} ){                         return  window.requestAnimationFrame       ||                    window.webkitRequestAnimationFrame ||                    window.mozRequestAnimationFrame    ||                    function( callback ){                    window.setTimeout(callback, 1000 / 60);                    };        })( [description]\n             * @return {[type]}     [description]\n             */\n            requestAnimationFrame = (function(){\n                if(option.time) {\n                    return  function( callback ){\n                            window.setTimeout(option.time);\n                        };\n                }\n                return  window.requestAnimationFrame       ||\n                        window.webkitRequestAnimationFrame ||\n                        window.mozRequestAnimationFrame    ||\n                        function( callback ){\n                            window.setTimeout(callback, 1000 / 60);\n                        };\n            })(),\n            //添加两张图，解决一轮动画结束闪屏问题\n            anim_1 = $('<div>', {\n                css :  {\n                     background : 'url(' + option.url + ') no-repeat scroll 0px 0px transparent'\n                     \n                }\n\n            }),\n            anim_2 = anim_1.clone(),\n            init = function() {\n                self.append(anim_1).append(anim_2).css('position', 'relative');\n            },\n            width = option.length / option.step,\n            go = function() {\n                    if (i > step) { i = 0; }\n                    flag ? (curAnim = anim_1) : (curAnim = anim_2);\n\n                    flag = !flag;\n                    curAnim[0].style.backgroundPosition = \"-\" + i * width + \"px 0px\";\n                    //使用Zepto方法会闪动，具体看博文：http://www.hacke2.cn/anmi-strange-problem/\n                    //curAnim.css('background-position' , '-' + i * 75 + 'px 0px')\n                    self.append(curAnim);\n\n                    i++;\n                    console.log(isRunning)\n                    isRunning && requestAnimationFrame(go)      \n            };\n\n            init();\n\n            return {\n                run : function() {\n                    isRunning = true;\n\n                    requestAnimationFrame(go);\n\n                },\n                stop : function() {\n                    isRunning = false;\n                },\n                isRunning : function() {\n                    return isRunning;\n                }\n            };\n        }\n    })\n\n        \n})(Zepto);\n```\n\n调用的时候这样调用:\n\n```js\nvar ra = scope.find('#divParent').requestAnimFrame({\n        step : 80,\n        url : 'img/1-slow.png',\n        length : 6000,\n        time : 12\n    });\nra.run();\n```\n\n自己完成两个DOM的COPY，html结果如下：\n\n```html\n<div id=\"divParent\"></div>\n```\n\n提供了几个接口：run、stop、isRunning\n\n## 2.CSS3逐帧动画\n\nCSS3方式实现当时比用JS效率高很多，许多优化在浏览器底层完成。之前为什么不用有两点考虑：\n\n1.兼容性\n\n2.每一帧都要手动去写\n\n但是在移动端CSS3已经支持很好了，但每一帧都得自己写太痛苦，还好在一篇博客看到有一个step函数供我们调用 [https://idiotwu.me/css3-running-animation/](https://idiotwu.me/css3-running-animation/)。我们将它整合一下：\n\n<a class=\"jsbin-embed\" href=\"http://jsbin.com/qejavi/4/embed?html,output\">JS Bin</a><script src=\"http://static.jsbin.com/js/embed.js\"></script>\n\n怎么样，是不是很简单，中间的帧数让浏览器给我们计算就可以了。\n\n，关于`step`，这边有篇文章介绍的很详细[CSS3 timing-function: steps() 详解](https://idiotwu.me/understanding-css3-timing-function-steps/)\n\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-3-4-to-teacher.md",
    "content": "---\nlayout: post\ntitle: 给老师的一些课程主题\ndescription: \"前端课程的参考主题\"\ntags: [翻译]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n\n>我们实验室有一门内部课程，专门讲前端开发，每年的主题都不一样，今年老师让我们建议几个，我罗列了一下几个主题供老师参考：\n\n### 1. 前端工程化\n\n前端工程化是将代码、资源（图片等）的压缩、合并、检错等一些列使用程序来自动完成。有了它可以大大提高开发效率。目前比较流行的国外有grunt，gulp等，国内有fis等，建议讲课时可以讲讲主流前端工程化工具的使用和思考如果将至融入实验室工作的开发流程。\n\n### 2. 前后端分离的思考\n\n以前前端后端开发分离不够，如修改jsp模板前端需要和后端协调，一些数据协议要沟通，一些代码逻辑不能复用（如前后端的数据校验）。支付宝提出使用Node.js在前端和后端中间再加一层，首屏交给Node.js来渲染，二次请求可以通过ajax动态调用。详情可以参照淘宝UED[《前后端分离的思考与实践》](http://ued.taobao.org/blog/2014/04/full-stack-development-with-nodejs/)\n一个趋势，大家可以一起学习一下，可以进行头脑风暴。（但实验室这种开发模式是一个人前后端都做，所以没有沟通的成本，但很难在某一领域专一）\n\n<!--more-->\n\n### 3. CSS3动画\n\n现在CSS3新起，动画也有以前的Flash慢慢过渡到用CSS3来实现。使用动画让活动页内容更加丰富活泼，讲的时候建议讲讲重要api及综合案例。参考：\n\n* 黄薇 [《Web高性能动画》](http://melonhuang.github.io/sharing/slides.html?file=high_performance_animation#/)\n* [奇舞团《CSS动画使用技巧》](http://www.75team.com/archives/793)\n* Webrebuild [《CSS3 动画》](http://daxue.qq.com/content/content/id/1676)\n\n### 4. ECMA Script 6 AND IO.js\n\nES6将是今年的趋势，这次草案规范了Javascript的类、模块化、Promise、Genertor等重要API，IO.JS作为Node.js的分支，默认开启了ES6，服务端JS是必不可少的\n\n### 5. MVC and MVVM in JavaScript\n\n随着SPA应用的增多，大型前端网页的代码组织不再是简单的JQuery对元素进行操作，而是引入了以Backbone.js代表的MVC框架，以Angular.js代码的MVVM框架。建议实验室同学一起学习学习这些框架的理念。\n\n### 6. Native App VS Web App\n\n本地APP和WEB APP一直孰好孰坏而争吵，可以谈谈两类开发的优劣。另外facebook最新一版使用React.js开发Native App，也以为这JS工程师在无学习成本转向Native App，也可以给大家分享分享React.js\n\n### 7. Web Components\n\n传统的组件开发方式必须要引一堆HTML,CSS,JS，而Web Components提出只是使用简单自定义标签就可以代替传统开发模式，加快了开发的速度，减少了复制时的错误率，这是未来的开发方向，建议做一些DEMO与大家分享。\n\n### 8. Canvas & SVG\n\n随着HTML5新起，Canvas & SVG就尤为重要了，他们可以做游戏、数据可视化等强大的功能。建议讲的时候将一些重要API和DEMO。\n\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-3-7-share-jsbin.md",
    "content": "---\nlayout: post\ntitle: 我在jsbin里存的好东西\ndescription: \"在jsbin里存的一些代码片段\"\ntags: [心声]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>看到一些有用的代码片段，我就喜欢收藏到我的jsbin里。今天和大家分享一下\n\n1.canvas画出圆环进度条\n\n代码注释很多，初级入门都能看懂，作为活动页很适用\n\n[http://jsbin.com/viribi/1/](http://jsbin.com/viribi/1/edit?html,output)\n\n![](/images/article/jsbin-share/1.png)\n\n2.无刷新分页\n\n推荐用ajax方式，这个代码是讲所有的数据都加载出来的处理方式\n\n[http://jsbin.com/poxawo/1/](http://jsbin.com/poxawo/1/edit?html,output)\n\n![](/images/article/jsbin-share/2.png)\n\n<!--more-->\n\n3.富文本编辑器\n\n火狐开发者网站的，代码不多，使用`document.execCommand`文本样式操作。\n\n[http://jsbin.com/belafa/1/](http://jsbin.com/belafa/1/edit?html,output)\n\n![](/images/article/jsbin-share/3.png)\n\n4.太极\n\n用CSS3画的太极\n\n[http://jsbin.com/jigiko/2/](http://jsbin.com/jigiko/2/edit?html,output)\n\n![](/images/article/jsbin-share/5.png)\n\n5.伸缩式布局\n\n在群众看到一个小伙写1024这个游戏时用的布局，关键是`padding-top:100%`这行代码。在实际用用中，除了上面9格布局，还适用于图片的自适应性。当然也可以使用`padding-bottom`，后面的值为图片的宽高比例\n\n[http://jsbin.com/foruli/3/edit](http://jsbin.com/foruli/3/edit?html,css,output)\n\n![](/images/article/jsbin-share/4.png)\n\n6.动画购物\n\n类天猫的购物、收藏、红心等功能，有动画效果\n\n[http://jsbin.com/ziguke/1/](http://jsbin.com/ziguke/1/edit?html,css,js,output)\n\n![](/images/article/jsbin-share/6.png)\n\n7.条件解析\n\n由于UC某些接口有版本限制，我在写的时候用JSbin边写边调，也共享出来吧\n\n[http://jsbin.com/kajixi/3/edit](http://jsbin.com/kajixi/3/edit)\n\n![](/images/article/jsbin-share/7.png)\n\n8.Promise\n\n几行代码实现的Promise\n\n[http://jsbin.com/batuyo/1/edit?html,js,output](http://jsbin.com/batuyo/1/edit?html,js,output)\n\n9.loading 动画\n\n之前我见过的这个loading动画使用了很多div标签，但是这个缺只使用一个标签，果断收藏了\n\n[http://jsbin.com/yalepo/1/edit?html,css,output](http://jsbin.com/yalepo/1/edit?html,css,output)\n\n![](/images/article/jsbin-share/8.png)\n\n\n10.canvas笑脸\n\n算是canvas最简单的api使用了\n\n[http://jsbin.com/vaqoba/2/edit](http://jsbin.com/vaqoba/2/edit)\n\n![](/images/article/jsbin-share/9.png)\n\n11.css3瀑布流\n\n群友推荐的，使用CSS3实现瀑布流\n\n[http://jsbin.com/lihamu/1/edit?html,output](http://jsbin.com/lihamu/1/edit?html,output)\n\n![](/images/article/jsbin-share/10.png)\n\n12.妙味首页菜单\n\n以前看妙味首页就感觉特别炫，一位博客园仁兄将至抠出来了，收藏！\n\n[http://jsbin.com/hoyija/1/edit?html,output](http://jsbin.com/hoyija/1/edit?html,output)\n\n![](/images/article/jsbin-share/11.png)\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-5-18-how-i-m-using-es6-modules-in-production.md",
    "content": "---\nlayout: post\ntitle: 译-我是怎么在项目中使用ES6模块化的\ndescription: \"如何让ES6 module 和 AMD module一起工作\"\ntags: [ES6]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>http://jsrocks.org/2015/05/how-i-m-using-es6-modules-in-production/ 原文链接\n\n我使用 [ES6 modules](/categories/modules/)工作已经有一段时间了，今天我就向大家分享下我是怎么使用ES6 moudule的。\n\n<!--more-->\n\n首先，向大家介绍一下Babel ，[Babel](https://babeljs.io/)是用来JS转译的整合工具，它是一个非常活跃的项目，而且它几乎覆盖了所有现代JavaScript特征。（注：JS转译（Javascript Transpiler）请自行谷歌）\nBabel完美支持模块化，你可以自己决定你代码的风格，你可以使用AMD,Common,UMD这些规范，而且你甚至能自定义模块规范。\n\n在我的公司里，我们开发了一个基于AMD modules规范的框架（当然尚未开源），用来构建我们的应用。\n相信我：对于开发大型的应用，使用AMD规范仍然是一个很好很好的解决方案。我们不能再把所有js代码反正一个文件里，这样是不行的。\n悲剧的是我们现在很多些应用的解决方案是类似于[Webpack](http://webpack.github.io/),要想迁移到AMD modules可不是那么容易，而我们公司关于模块化的解决方案是很实用的（尚未开源）。\n\n注：在本文中“解决方案”都是指JS模块化解决方案。\n微模块策略\n这个策略对我来说很有用。\n正如我上文说的那样，我们最终产出模块必须要要是AMD module，但是当某一个AMD模块需要依赖其他模块时，我叫那个模块（AMD模块依赖的模块）叫做微模块。\n微模块并不会被应用的每个模块都用到，但是利用它能帮助我们组织代码。\n以下代码演示了我们怎么使用微模块：\n\n## 微模块策略\n\n这个策略对我来说很有用。\n正如我上文说的那样，我们最终产出模块必须要要是AMD module，但是当某一个AMD模块需要依赖其他模块时，我叫那个模块（AMD模块依赖的模块）叫做微模块。\n微模块并不会被应用的每个模块都用到，但是利用它能帮助我们组织代码。\n以下代码演示了我们怎么使用微模块：\n\n```js\nimport config from './config';//导入ES6模块\nimport { globalpkg } from './config';//动态注入ES6模块参数\nimport factory from './factory';\n \n zaz.use((pkg) => {      \n   \"use strict\";\n    config.dynamic.globalpkg = pkg;\n    pkg.require(['modFactory'], (modFactory) => {\n        modFactory.create(pkg.utils.deepMerge(config._static, factory));     \n    }); \n });\n\n```\n\n我们在代码的顶部导入了一些模块，并且在我们的AMD模块里还使用了这些导入的模块。在其他的应用中并不会用到这些ES6模块，但是使用了这些微模块后，编译后产生的最终源码有更高的可读性。\n\n这是config模块的代码：\n\n```js\nconst githubURL = \"OUR GITHUB URL HERE\";\nconst staticServer = \"http://s1.trrsf.com\";\nconst testsPath = `zaz-${type}-${name}/tests/index.htm?zaz[env]=tests`;\nconst name = \"stalker\";\nconst type = \"mod\";\nconst version = \"0.0.1\";\nconst state = \"ok\";\nconst description = \"JavaScript API to deal with user data\";\nlet globalpkg = null; // default export \nconst config = {     \n  _static: {         \n  name,         \n  version,         \n  state,         \n  description,         \n  docs: `${githubURL}/pages/terra/zaz-${type}-${name}`,         \n  source: `${githubURL}/Terra/zaz-${type}-${name}`,         \n  tests: `${staticServer}/fe/${testsPath}`,         \n  dependencies: ['mod.wilson']     \n  }\n}; \nexport default config;\n```\n\n这是项目的源码结构：\n\n\t└── src\n\t    ├── _js\n\t        ├── config.js\n\t        ├── environment.js\n          ├── helpers.js\n          ├── factory.js\n          ├── methods.js\n\t        └── mod-stalker.js\n\t        └── mod-stalker.js\n\n\n我把一些AMD模块的逻辑放进了微小的ES6模块里。\n这对于构建处理是很简单的：Babel转译ES6的Javascript代码为ES5的代码；使用导入CommonJS模块的方式来导入微模块。最后用[Browserify](http://browserify.org/) 打包代码。\n哈哈！最终生成的代码符合AMD模块规范了。\n\n## 下一步\n\nSourcemaps比起Browserify来说，Sourcemaps不能很好的处理这个编译的流程。\n也许这里能有更好的实现方式。\n我们现在可以开始使用ES6新特征和模块化来重构我们的框架了。\n你甚至可以自己实现模块加载规范给你的程序，但是我认为这可能不是一个好方法，有可能你会需要完全重写现有的模块加载系统。\n\n## 结论\n\n现在模块规范已经完成了，而且是非常成熟和有效的。\n然而，web浏览器至今没有提供js模块加载的原生API,所有像AMD或者CommonJS就显得格外重要了。\n现在我们已经体会到ES6模块语法的好处了，可以让我们的代码拥有更高的可读性和简洁性。\n现有的工具，比如Babel和Browserify能减少我们开发的痛苦，相信在不久的将来等ES6普及后，我们就能简化js开发流程，这样就能舍弃这些构建打包工具了。\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2015-9-16-express-node-act.md",
    "content": "---\nlayout: post\ntitle: express介绍及实战\ndescription: \"神马前端9月新人分享\"\ntags: [分享]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>上周5和组内分享了一下express介绍和实战，制作的ppt分享给大家：\n\n[express介绍和实战](http://www.hacke2.cn/ppt/express.html)\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2016-1-1-review-2015.md",
    "content": "---\nlayout: post\ntitle: 2015年终小结\ndescription: \"2015回顾\"\ntags: [Javascript, ES6]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>随着凌晨12点的钟声，2015就这样过去了，这一年是我从一个学生状态转变为工作状态的一年，对于我来说是人生十分重要的一年。\n\n\n<!--more-->\n\n[《该是做做计划的时候了！》](http://www.hacke2.cn/2015-plan/)这边文章是今年年初写的，当时大致列了一下几点：\n\n* ES6\n* HTML5和CSS3\n* backbone,ng等MVC框架\n* 属于自己的前端框架\n* 算法\n* 设计\n* 读书\n* 毕业设计\n* 锻炼\n* 独立能力&自理能力\n\n前6个是涉及技术的。\n\nES6算是零零碎碎学了一些，也在简单的作品里练习了一把。es6在今年改名为es2015，可能也是希望在2015年公司也开始把这个用起来，可惜浏览器支持不够，本来以为并不能现在马上就运用。所幸有大杀器babel，可以将es6代码转化为es5代码，据说编译后的代码甚至优于源代码，今年也是超乎想想的在各个公司线上项目实践起来了。可惜编译后文件过于庞大，目前之适用于pc端，移动端如果对速度有特殊要求的业务并不适用，比如神马搜索主搜业务。但动效平台这种基于Node.js的项目或者其他垂搜感觉可以尝试一下。D2上李成银分享了《使用 ES6/7 特性开发 Node.js 项目》，回来也给部门小伙伴分享了一下，实现了年初的计划。`完成`\n\nHTML5和CSS3在移动端可谓是玩的风生水起，这也是我们部门的一个优势：专注移动端开发。在移动端上不用考虑IE6/7/8等不支持css3特性的浏览器，所以平时写sc时几乎天天和h5,css3打交道，又加上今年神马重点项目是蓝光项目，里面使用了大量的创新交互，加上h5,css3助力，这一块更加稳固了。`完成`\n\n年初的时候大家讨论的最多的就是angular，当时计划也学学backbone, angular等基于mvc的框架，因为自己也有java的功底，所以感觉这些学起来应该不难，但是万万没想到今年是react.js唱戏，衍生出了react-native、relay、flux等基于react.js的生态圈，可谓今年是racet.js的胜利年，各个分享会分享主题多一半也是react.js。最近微博真阿当和各路大侠引发的关于前端框架的争论也颇有看点，总之前端轮子层出不群，最终哪一个能活下来，哪一个才是真正能提高前端的开发效率，还有待观察。但我感觉mvvm确实非常适用于一些业务复杂的场景。神马这边有小康在明星垂直上实践的`vue.js`，也是今年的一个颇具闪光点的mvvm框架。`未完成`\n\n年初本来想的是有一个自己的前端框架，类似于jq等，每一个项目都能用起来，目的是快速构建一个web项目吧，谁知道最后写了一个博客生成器(类似于hex)，已经在npm上发布[wooden](https://www.npmjs.com/package/wooden)，也算是实现了计划吧。`完成`\n\n算法、设计这两块并无任何建树，感觉应该是火候还未到，或者还没有接触到算法相关的业务吧。。\n\n书倒读了几本Node.js相关的书，但是当时想看一点非技术的书的。。今年很庆幸的是以后的方向定了，想以后就往Node.js方向走走，正好在阿里的大环境下学学Node.js。阿里应该是国内Node.js沉淀最多的公司吧。。`未完成`\n\n非常开心的是毕业设计业顺利过了，之前5月份回学校还有点担心呢。。后来都段时间调设备调到了2点钟。。最后感谢老师的照顾，拿了个校优^_^。`完成`\n\n7月份去公司坚持跑了一段时间的步，当时去公司旁边的学校：北京语言大学和北京地质大学的操场上跑5圈，下雨也是在公司跑步机上坚持，结果没坚持下来。。。`未完成`\n\n十月一号来杭州，二号就把被子什么全买好已经入住了，一个人在杭州生活了100天乐，总体感觉还行，希望在新的一年里，家里收拾更整洁一点，穿的也不求时髦，只求干净。`完成`\n\n2016年将会是正式工作的第一年，希望心中所想能顺顺利利的完成。\n\n最后，跨年夜和大学同学们分享了很多以前的回忆，希望大家能在以后的日子里健康快乐，事业有成。\n\n![11382](http://ww4.sinaimg.cn/large/8ae515a4gw1ezjutg9dixj20zk0k0q6z.jpg)\n\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2016-2-1-configuring-babel-6-for-node-js.md",
    "content": "---\nlayout: post\ntitle: 译-为你的Node.js配置babel 6\ndescription: \"babel 6基础教程\"\ntags: [Node.js, ES6]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>原文：http://jsrocks.org/2016/01/configuring-babel-6-for-node-js/\n\n如果你像我一样在你的Node.js应用上还在使用老的ES5 js代码，那么你可以抛弃之前的习惯，现在就可以使用JavaScript ES2015的特性和ES2016的标准在你的Node.js应用上。ES2015和ES2016让JavaScript宛如清风般一样开发，但是，不是每一个ES2015特性在我们心爱的[Node.js](https://nodejs.org)上支持。\n\n这时候[Babel](https://babeljs.io)就派上用场了。<!--more-->Babel是一个让ES2015和ES2016代码转换成ES5甚至是ES3的编译器。简单来说，它会转换你的JavaScript代码，让它在Node.js应用上非常愉悦的用起来。\n\n**小记：** Node.js已经支持多种ES2015的功能，如果你不想转化你的ES2015代码，你可以在启动Node.js是使用 `--harmony` 标签去开启一些已确定标准化的特性。为了使用更多实验性特性可以使用更激进的命令： `node --v8-options | grep harmony` ，但是请注意即便是最新版本的Node.js（在写本文的时候最新版本是5）也不是所有的特性都被支持。这些特性往往是不稳定或不完整的。所以为了保持可读性常常不使用这些特性。\n\n### 下面做一些假设：\n\n- 你了解如何编写[Node.js](https://nodejs.org)应用。\n- 你会使用npm来安装软件包。\n- 你已经安装了Node.js和npm。\n- 你喜欢使用一些命令行命令。\n- 最好也了解一点ES2015的语法，当然这个不是必须的。\n\n### 一些例子\n\n有没有一些可运行的例子而不仅仅是阅读代码? 这儿有[可运行的例子](https://github.com/abdulhannanali/babel-configuration-tutorial)\n\n### 安装和开始学习Babel\n\n有很多方法让你可以安装并使用Babel，但这这里我们讨论的是如何让babel-cli运行。\n\n在`code` **文件夹** 下创建一个简单的包含ES2015代码的Index.js文件：\n\n```js\nfunction* jsRocksIsAwesome() {\n  yield \"JS Rocks is Awesome\";\n  yield \"JS Rocks says JavaScript Rocks\";\n  return \"because JavaScript really rocks\";\n}\n\nvar jsRocks = jsRocksIsAwesome();\n\nconsole.log(jsRocks.next());\nconsole.log(jsRocks.next());\nconsole.log(jsRocks.next());\n```\n\n我们将在下一个命令下安装**babel-cli**。他会在当前项目安装最后一个稳定版本的babel-cli并且也会追加在package.json的devDependencies里。\n\n\n\tnpm install --save-dev babel-cli\n\n\n现在如果你运行\n\n\n\tbabel code/index.js -d build/\n\n\n你将会看见你写的相同代码出现在build/index.js文件夹里，所以Babel的 **插件** 和 **预设** 来临了。\n\n### 插件和预设\n\nbabel本身并没有做很多事情，但是通过插件和预设可以实现很多功能。我们希望可以通过babel在我们的代码中使用es2016和es2015所有的优美语法。\n\n为此我们需要安装两个预设文件在 `devDependencies` 里。\n\n- [es2015](https://babeljs.io/docs/plugins/preset-es2015/)\n- [stage-0](https://babeljs.io/docs/plugins/preset-stage-0/)\n\n运行下面的命令安装预设文件：\n\n\n\tnpm install --save-dev babel-preset-es2015 babel-preset-stage-0\n\nbabel拥有广泛的插件在[这边获得](https://babeljs.io/docs/plugins/)\n\n现在你需要在执行命令的时候包含这两个预设。\n\n\tbabel --presets es2015,stage-0 code/index.js -o build/app.js\n\n\n现在你会看到正常的ES5代码已经出现在 `app.js`了，它也叫 `编译后的代码` (这是js世界里的一个术语)。你可以使用以下命令运行这些代码：\n\n\n\tnode build/app.js\n\n### 使用Babel来配置一个合适的编译环境\n\n\n这是非常神奇的，但是怎么样才能更好地运用在Node.js开发上？\n\n#### babel的配置文件： .babelrc\n\n`.babelrc` 是一个非常简洁的JSON文件，它可以分离出你的Babel相关的配置。它也是非常易于上手的。以下是本教程的`.babelrc` 文件。\n\n```\n{\n  \"plugins\": [\"es2015\", \"stage-0\"]\n}\n```\n\n你可以配置其他[`.babelrc` 选项](http://babeljs.io/docs/usage/options/)，确保它和你一样强大。\n\n对于本教程来说这是非常多的配置。现在，每当我们添加或删除插件，我们仅仅改变以下配置选项而不是去修改他的运行命令，是不是很简单！\n\n现在，如果你运行：\n\n\tbabel -w code/ -d build/\n\n他会从 `.babelrc` 读取 **预设** 去编译在 `code/` 里的代码并且生成编译好的JavaScript文件在 `build/` 文件夹并且不会结束此命令。注意这个 `-w` 标志：如果你对 `code` 文件夹修改，它会 **监听** 和重新编译这个文件夹下的代码，酷！我现在所说的是不是非常神奇。\n\n#### 使用source maps在你的文件\n\n如果你在思考虽然它非常酷和有趣但是非常难于调试编译后的代码。你不用对此担心。Source maps的思想就是出于这个目的。Source maps会告诉Node.js这个错误的 **源文件** 而不是 **编译后的文件** ！\n\n这边有一个 `code/error.js` 文件会抛出一个异常在生成器的第二次 `yield`后。编译后的代码完全和源文件是不同的。\n\n```js\nfunction* errorFulGenerator() {\n  yield \"yo\";\n  throw new Error(\"source maps are awesome\");\n  return \"\";\n}\n\nvar errorGen = errorFulGenerator();\nerrorGen.next();\nerrorGen.next();\n```\n\n我们使用如下命令去给 **编译后的文件** 生成 **source maps**。*注意使用`--source-maps` 标签*:\n\n\n\tbabel code/ -d build/ --source-maps\n\n\n现在当我们遇到错误的时候我们会获得有用的调试信息，如下：\n\n\n\terrorGen.next()\n\t         ^\n\t\n\tError: source maps are awesome\n\t    at errorFulGenerator (/home/programreneur/Programming/githubRepos/babeljs-short-tutorial/code/error.js:3:9)\n\t    at next (native)\n\t    at Object.<anonymous> (/home/programreneur/Programming/githubRepos/babeljs-short-tutorial/code/error.js:10:10)\n\t    at Module._compile (module.js:425:26)\n\t    at Object.Module._extensions..js (module.js:432:10)\n\t    at Module.load (module.js:356:32)\n\t    at Function.Module._load (module.js:313:12)\n\t    at Function.Module.runMain (module.js:457:10)\n\t    at startup (node.js:138:18)\n\t    at node.js:974:3\n\n\n这个就是使用 source maps 的方法。\n\n#### 设置npm命令\n\n为了能每一次都非常简单的使用编译命令，你可以更新你的 `package.json` 文件去为Babel加一个构建命令。在 `package.json` 的 `script` 对象你可以如下添加构建命令。\n\n\n```js\n\"scripts\": {\n  \"build\": \"babel -w code/ -d build -s\"\n}\n```\n\n现在，我们运行：\n\n\n\tnpm run build\n\n\n从今天开始就应该全面享受 ES2015/ES2016 带来的好处了！\n\n#### 了解更多关于Babel的知识\n\n这是一个Babel基础教程，但是Babel的世界才刚刚开始。它有给力的社区作支撑并且已经在IT世界有了响当当的名声。Babel也支持大多数构建工具例如[Grunt](https://www.npmjs.com/package/grunt-babel) 和 [gulp](https://npmjs.org/package/gulp-babel/). 你可以在 [Babel Website](https://babeljs.io/docs/setup/)了解到相关信息。\n\n这儿有一些资源可以帮助你在Bable的世界里打怪升级：\n\n- [Learn ES2015 and Babel using this detailed tutorial](http://ccoenraets.github.io/es6-tutorial/index.html)\n- [Read the Babel docs on setting up Babel (They're helpful)](https://babeljs.io/docs/setup/)\n\n#### 源码、贡献和感谢\n\n本教程的源码在[这个仓库](https://github.com/abdulhannanali/babel-configuration-tutorial)。\n\n如果你发现一下错别字或者有一些更新，请使用issues或者给[我们的Github 仓库](https://github.com/abdulhannanali/babel-configuration-tutorial)发起PR。\n\n我也非常感谢[Fabrício Matté](http://ultcombo.js.org/) 审阅这篇文章并且把它发布在[JS Rocks](https://github.com/JSRocksHQ/jsrockshq.github.io/) 并且也做了一些更正。\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2016-6-19-think-in-react-redux-1.md",
    "content": "---\nlayout: post\ntitle: React + Redux 入门（一）：抛开 React 学 Redux\ndescription: \"redux 入门\"\ntags: [Redux, React]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n## redux简介\n\nRedux 是一个改变状态(state)的模型，这个模型通过一个单向操作的方式来改变状态。现在网上教程一言不合上来就是 Redux + React 的综合运用，经常搞的人一脸懵逼。其实 Redux 和 React 完全解耦，并不是 Redux 非得和 React结合才能使用，而只是 React 结合 Redux 会事半功倍。本系列主要也讲得这个。\n\n对于日益复杂的 Javascript 应用来说，Javascript 需要管理非常多的 state。包括本地尚未持久化到数据库的数据、UI状态等等，而且这些状态有可能是相互关联的，一个状态的改变可能会引起另外一个状态的变化，如果用命令式编程将会变得异常复杂以及难以维护。Redux 作为一个专门关联 state 的框架应用而生，而这种单向数据流的思想也让 Redux 成为一个现代框架。\n\n<!--more-->\n\n![](http://img4.tbcdn.cn/L1/461/1/3db24afe31e7218b4ac6cc74497204250b2f5f3a)\n\nredux介绍\n\n### redux三大原则\n\nRedux 有三大原则：\n\n- 单一数据源\n- state 只读\n- 只用纯函数来修改\n\n### 单一数据源\n\n整个应用的 state 都是保存在一个对象树中，而且这个对象树存在唯一一个 store。这个 store 我们通过`redux.createStore创建`，通过以下代码获取：\n\n```js\nstore.getState()\n```\t\n\n### state 只读\n\n改变 state 只能通过 dispatch 一个 action 才能修改。\n\naction 其实就是一个简单对象，其中type是必填项，以便 区分是哪一个 action。\n\n```js\nstore.dispatch({\n  type: 'ALL'\n});\n```\n\n为了方便给 action 传递数据，一般来说我们会把上边参数对象封装成方法。如：\n\n```js\nconst create = (item)=> {\n\treturn {\n\t\ttype: 'CREATE',\n\t\titem\n\t}\n}\n```\n\n即便在小的功能也得这样修改 state。比如实现表单的双向绑定。我们给一个input绑定一个在`onChange`事件，然后在`onChange`里拿到当前的 value，dispactch 一个 action 通知 reducer 改变给当前 dom 绑定的state(根据props传递)，这样才能实现双向绑定。\n\n\n### 使用纯函数来执行修改\n\n何为纯函数？简单来说就是函数的输出完全由输入所决定，运行过程不依赖于系统的状态和上下文环境，运行过程不改变它作用域之外的环境状态。详情可以参考月影的：[高阶函数对系统的“提纯”](https://www.h5jun.com/post/higher-order-function-play-with-pure-function.html)\n\n这个纯函数在 Redux 里叫做 Reducer，它接收先前的 state 和 action，并返回一个新的 state，由于它是纯函数，所以它的结果是可预测的，这样为编写单元测试创造了条件。\n\n### 一个实例\n\n介绍完三大原则，我们认清了redux的三个非常重要的组成部分：\n\n- action\n- reducer\n- store\n\naction 通知 reducer 修改 state，store 管理 state。非常简单。介绍一个非常简单的demo：\n\n运行环境： node v6.1.0\n\n```js\nconst redux = require('redux');\nconst createStore = redux.createStore;\n\nconst ActionType = {\n\tADD: Symbol()\n}\n```\n\n首先我们引入 Redux后，编写一个简单的常量类，这个类里存储着一些不同的类型。注意一般会使用字符串来区分，为了避免出现无意义的字符串，我们使用 ES6 的 `Symbol`。\n\n我们定义一个元素初始状态的 state：\n\n```js\nlet initState = {\n\tproducts: []\n};\n```\n\n接下来，我们就可以写一个 action，比如新增产品\n\n```js\nconst addProducts = (product)=> {\n\treturn {\n\t\ttype: ActionType.ADD,\n\t\tproduct\n\t}\n}\n```\n\n我们现在需要一个 reducer 来改变我们的状态\n\n```\nconst getProducts = (state=initState, action) => {\n\tswitch(action.type) {\n\t\tcase ActionType.ADD : \n\t\t\treturn Object.assign({}, state, {\n\t\t\t\tproducts: state.products.concat(action.product)\n\t\t\t});\n\t\tdefault : \n\t\t\treturn state;\n\n\t}\n}\n```\n\n然后将 reducer 放入 store 中进行测试\n\n```js\nlet store = createStore(getProducts);\nconsole.log(store.getState());\n\nstore.dispatch(addProducts(1));\nconsole.log(store.getState());\n```\n\n输出结果\n\n```js\n{ products: [] }\n{ products: [ 1 ] }\n```\n\n注意：分析 createStore 的源码可知，在初始化的时候他自己会 dispatch 一个 action：\n\n```js\nexport var ActionTypes = {\n  INIT: '@@redux/INIT'\n};\n\n```\n\n会对当前 state 初始化。\n\n至此，我们使用 Redux 编写了一个无 React 的例子。也对 Redux 有了一个基本的认知。\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "_posts/2017-01-22-review-2016.md",
    "content": "---\nlayout: post\ntitle: 2017 is Comming\ndescription: \"致已经逝去的2016和即将到来的2017\"\ntags: [心路历程]\nimage:\n  background: witewall_3.png\ncomments: true\nshare: true\n---\n\n>在雨中我送过你\n>\n>在夜里我吻过你\n>\n>在春天我拥有你\n>\n>在冬季我离开你\n>\n>有相聚也有分离\n>\n>人生本是一曲戏\n>\n>有欢笑也有哭泣\n>\n>不知谁能\n>\n>谁能躲的过去\n\n\n<!--more-->\n\n2016就这样过去了，本想回顾一下，却发现自己没有做那年的规划。发生了很多事情，有遗憾，也有意外。\n\n去年参加 jsconf 的时候，一些老外演讲的愣是听不懂，当时好后悔英语没有好好学，再加上在 youtube 偶尔看看国外的演讲论坛，所以在北京的出差的时候下决心把英语再学一学，不然真的感觉没几乎了。上高中的时候鼠目寸光，到现在觉得英语绝对是非常非常重要的一个技能，因为信息不对称对于我们这个快速发展的行业非常非常不利，也不想咀嚼别人嚼过的东西，所以一回到杭州就报名了个英孚教育，当时觉得有意思的点是每天晚上和其他不认识的小伙伴一起上多对一的对话课，每天的主题都不一样，坚持了两周后，觉得这个不是自己想要的，因为水平层次不齐，往往一节课得脱到一个小时以上，有一节课甚至脱到了一个半小时。。这对于我们这种时间很少的人是太可怕了。。所以现在的规律一般是一周一单元 + 1v1的私教。目标是17年的 jsconf 能听懂。\n\n以前完全觉得胖一点无所谓，后来觉得一个程序员，如果思想活跃，四肢又发达，多好啊。。索性报了一个健身班，每周去四天，基本是40分钟有氧+20分钟无氧，现在早晨的体重是136，希望能达到125，让自己有漂亮的肌肉。我觉得每天坚持跑步是一种积极的生活态度，合理健康的饮食，以前自己吃的东西太油腻太不健康，2016年已经意识到这一点，希望今年能将健康的生活态度继续保持下去。去年还有一件非常自豪的事情是把抽了10年的烟戒了。\n\n2015年看了很多技术书，去年开始觉得非技术的书也很重要，已经看了tinyfool的《技巧》，村上的《且听风吟》，人生不只是为了吃饭的技能，还有应该有强大的精神世界，我打算今年看10本书，在此里一个flag。\n\n今年也想学一门乐器了，能会一个乐器的程序员特别帅，也许能在音乐上有点代码灵感呢？说不准，想学的可能是吉他，也有可能是电子琴。还想抽空把车学了，不知道有没有做这个事情的动力。。\n\n至于生活吗。。想和爱的人去很多很多地方。。\n\n文章开头是韩寒的《在雨中》，觉得他唱的很好听，有相聚，也有分离，希望自己能拥抱新的世界。\n\n**文章来自 [{{ site.url }}]({{ site.url }})**"
  },
  {
    "path": "about.md",
    "content": "---\nlayout: page\npermalink: /about/\ntitle: About Me\ntags: [about]\nimage:\n  feature: abstract-12.jpg\ncomments: true\nshare: true\n---\n\n```js\n{\n  \"name\": \"hacke2\",\n  \"description\": \"\",\n  \"version\": \"0.1.0\",\n  \"keywords\": [\"Web APP\", \"JS\", \"Frontend Developer\", \"Node.js\"],\n  \"contact\": {\n    \"weibo\": \"@hacke2\",\n    \"github\": \"@hacke2\",\n    \"mail\": \"hacke2cn@gmail.com\"\n  },\n  \"location\": \"北京\",\n  \"workAt\": \"Alibaba Inc.\"\n}\n```\n\n\n\n`任性的`扫一下吧~ ^_^\n\n<figure>\n  <a href=\"/images/alipay.png\">\n    <img src=\"/images/alipay.png\" alt=\"home\" />\n  </a>\n  <figcaption>我的支付宝</figcaption>\n</figure>"
  },
  {
    "path": "assets/assets/js/plugins/jquery.dlmenu.js",
    "content": "/**\n * jquery.dlmenu.js v1.0.1\n * http://www.codrops.com\n *\n * Licensed under the MIT license.\n * http://www.opensource.org/licenses/mit-license.php\n * \n * Copyright 2013, Codrops\n * http://www.codrops.com\n */\n;( function( $, window, undefined ) {\n\n\t'use strict';\n\n\t// global\n\tvar Modernizr = window.Modernizr, $body = $( 'body' );\n\n\t$.DLMenu = function( options, element ) {\n\t\tthis.$el = $( element );\n\t\tthis._init( options );\n\t};\n\n\t// the options\n\t$.DLMenu.defaults = {\n\t\t// classes for the animation effects\n\t\tanimationClasses : { classin : 'dl-animate-in-1', classout : 'dl-animate-out-1' },\n\t\t// callback: click a link that has a sub menu\n\t\t// el is the link element (li); name is the level name\n\t\tonLevelClick : function( el, name ) { return false; },\n\t\t// callback: click a link that does not have a sub menu\n\t\t// el is the link element (li); ev is the event obj\n\t\tonLinkClick : function( el, ev ) { return false; }\n\t};\n\n\t$.DLMenu.prototype = {\n\t\t_init : function( options ) {\n\n\t\t\t// options\n\t\t\tthis.options = $.extend( true, {}, $.DLMenu.defaults, options );\n\t\t\t// cache some elements and initialize some variables\n\t\t\tthis._config();\n\t\t\t\n\t\t\tvar animEndEventNames = {\n\t\t\t\t\t'WebkitAnimation' : 'webkitAnimationEnd',\n\t\t\t\t\t'OAnimation' : 'oAnimationEnd',\n\t\t\t\t\t'msAnimation' : 'MSAnimationEnd',\n\t\t\t\t\t'animation' : 'animationend'\n\t\t\t\t},\n\t\t\t\ttransEndEventNames = {\n\t\t\t\t\t'WebkitTransition' : 'webkitTransitionEnd',\n\t\t\t\t\t'MozTransition' : 'transitionend',\n\t\t\t\t\t'OTransition' : 'oTransitionEnd',\n\t\t\t\t\t'msTransition' : 'MSTransitionEnd',\n\t\t\t\t\t'transition' : 'transitionend'\n\t\t\t\t};\n\t\t\t// animation end event name\n\t\t\tthis.animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ] + '.dlmenu';\n\t\t\t// transition end event name\n\t\t\tthis.transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ] + '.dlmenu',\n\t\t\t// support for css animations and css transitions\n\t\t\tthis.supportAnimations = Modernizr.cssanimations,\n\t\t\tthis.supportTransitions = Modernizr.csstransitions;\n\n\t\t\tthis._initEvents();\n\n\t\t},\n\t\t_config : function() {\n\t\t\tthis.open = false;\n\t\t\tthis.$trigger = this.$el.children( '.dl-trigger' );\n\t\t\tthis.$menu = this.$el.children( 'ul.dl-menu' );\n\t\t\tthis.$menuitems = this.$menu.find( 'li:not(.dl-back)' );\n\t\t\tthis.$el.find( 'ul.dl-submenu' ).prepend( '<li class=\"dl-back\"><a href=\"#\">back</a></li>' );\n\t\t\tthis.$back = this.$menu.find( 'li.dl-back' );\n\t\t},\n\t\t_initEvents : function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.$trigger.on( 'click.dlmenu', function() {\n\t\t\t\t\n\t\t\t\tif( self.open ) {\n\t\t\t\t\tself._closeMenu();\n\t\t\t\t} \n\t\t\t\telse {\n\t\t\t\t\tself._openMenu();\n\t\t\t\t}\n\t\t\t\treturn false;\n\n\t\t\t} );\n\n\t\t\tthis.$menuitems.on( 'click.dlmenu', function( event ) {\n\t\t\t\t\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tvar $item = $(this),\n\t\t\t\t\t$submenu = $item.children( 'ul.dl-submenu' );\n\n\t\t\t\tif( $submenu.length > 0 ) {\n\n\t\t\t\t\tvar $flyin = $submenu.clone().css({\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\tmargin: 0\n\t\t\t\t\t}).insertAfter( self.$menu ),\n\t\t\t\t\t\tonAnimationEndFn = function() {\n\t\t\t\t\t\t\tself.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classout ).addClass( 'dl-subview' );\n\t\t\t\t\t\t\t$item.addClass( 'dl-subviewopen' ).parents( '.dl-subviewopen:first' ).removeClass( 'dl-subviewopen' ).addClass( 'dl-subview' );\n\t\t\t\t\t\t\t$flyin.remove();\n\t\t\t\t\t\t};\n\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t$flyin.addClass( self.options.animationClasses.classin );\n\t\t\t\t\t\tself.$menu.addClass( self.options.animationClasses.classout );\n\t\t\t\t\t\tif( self.supportAnimations ) {\n\t\t\t\t\t\t\tself.$menu.on( self.animEndEventName, onAnimationEndFn );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tonAnimationEndFn.call();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tself.options.onLevelClick( $item, $item.children( 'a:first' ).text() );\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself.options.onLinkClick( $item, event );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tthis.$back.on( 'click.dlmenu', function( event ) {\n\t\t\t\t\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\t$submenu = $this.parents( 'ul.dl-submenu:first' ),\n\t\t\t\t\t$item = $submenu.parent(),\n\n\t\t\t\t\t$flyin = $submenu.clone().insertAfter( self.$menu );\n\n\t\t\t\tvar onAnimationEndFn = function() {\n\t\t\t\t\tself.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classin );\n\t\t\t\t\t$flyin.remove();\n\t\t\t\t};\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t$flyin.addClass( self.options.animationClasses.classout );\n\t\t\t\t\tself.$menu.addClass( self.options.animationClasses.classin );\n\t\t\t\t\tif( self.supportAnimations ) {\n\t\t\t\t\t\tself.$menu.on( self.animEndEventName, onAnimationEndFn );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tonAnimationEndFn.call();\n\t\t\t\t\t}\n\n\t\t\t\t\t$item.removeClass( 'dl-subviewopen' );\n\t\t\t\t\t\n\t\t\t\t\tvar $subview = $this.parents( '.dl-subview:first' );\n\t\t\t\t\tif( $subview.is( 'li' ) ) {\n\t\t\t\t\t\t$subview.addClass( 'dl-subviewopen' );\n\t\t\t\t\t}\n\t\t\t\t\t$subview.removeClass( 'dl-subview' );\n\t\t\t\t} );\n\n\t\t\t\treturn false;\n\n\t\t\t} );\n\t\t\t\n\t\t},\n\t\tcloseMenu : function() {\n\t\t\tif( this.open ) {\n\t\t\t\tthis._closeMenu();\n\t\t\t}\n\t\t},\n\t\t_closeMenu : function() {\n\t\t\tvar self = this,\n\t\t\t\tonTransitionEndFn = function() {\n\t\t\t\t\tself.$menu.off( self.transEndEventName );\n\t\t\t\t\tself._resetMenu();\n\t\t\t\t};\n\t\t\t\n\t\t\tthis.$menu.removeClass( 'dl-menuopen' );\n\t\t\tthis.$menu.addClass( 'dl-menu-toggle' );\n\t\t\tthis.$trigger.removeClass( 'dl-active' );\n\t\t\t\n\t\t\tif( this.supportTransitions ) {\n\t\t\t\tthis.$menu.on( this.transEndEventName, onTransitionEndFn );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tonTransitionEndFn.call();\n\t\t\t}\n\n\t\t\tthis.open = false;\n\t\t},\n\t\topenMenu : function() {\n\t\t\tif( !this.open ) {\n\t\t\t\tthis._openMenu();\n\t\t\t}\n\t\t},\n\t\t_openMenu : function() {\n\t\t\tvar self = this;\n\t\t\t// clicking somewhere else makes the menu close\n\t\t\t$body.off( 'click' ).on( 'click.dlmenu', function() {\n\t\t\t\tself._closeMenu() ;\n\t\t\t} );\n\t\t\tthis.$menu.addClass( 'dl-menuopen dl-menu-toggle' ).on( this.transEndEventName, function() {\n\t\t\t\t$( this ).removeClass( 'dl-menu-toggle' );\n\t\t\t} );\n\t\t\tthis.$trigger.addClass( 'dl-active' );\n\t\t\tthis.open = true;\n\t\t},\n\t\t// resets the menu to its original state (first level of options)\n\t\t_resetMenu : function() {\n\t\t\tthis.$menu.removeClass( 'dl-subview' );\n\t\t\tthis.$menuitems.removeClass( 'dl-subview dl-subviewopen' );\n\t\t}\n\t};\n\n\tvar logError = function( message ) {\n\t\tif ( window.console ) {\n\t\t\twindow.console.error( message );\n\t\t}\n\t};\n\n\t$.fn.dlmenu = function( options ) {\n\t\tif ( typeof options === 'string' ) {\n\t\t\tvar args = Array.prototype.slice.call( arguments, 1 );\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, 'dlmenu' );\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\tlogError( \"cannot call methods on dlmenu prior to initialization; \" +\n\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt(0) === \"_\" ) {\n\t\t\t\t\tlogError( \"no such method '\" + options + \"' for dlmenu instance\" );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tinstance[ options ].apply( instance, args );\n\t\t\t});\n\t\t} \n\t\telse {\n\t\t\tthis.each(function() {\t\n\t\t\t\tvar instance = $.data( this, 'dlmenu' );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance._init();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tinstance = $.data( this, 'dlmenu', new $.DLMenu( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t};\n\n} )( jQuery, window );\n"
  },
  {
    "path": "assets/assets/js/plugins/jquery.fitvids.js",
    "content": "/*global jQuery */\n/*jshint multistr:true, browser:true */\n/*!\n* FitVids 1.0\n*\n* Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com\n* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/\n* Released under the WTFPL license - http://sam.zoy.org/wtfpl/\n*\n* Date: Thu Sept 01 18:00:00 2011 -0500\n*/\n\n(function( $ ){\n\n  \"use strict\";\n\n  $.fn.fitVids = function( options ) {\n    var settings = {\n      customSelector: null\n    };\n\n    var div = document.createElement('div'),\n        ref = document.getElementsByTagName('base')[0] || document.getElementsByTagName('script')[0];\n\n    div.className = 'fit-vids-style';\n    div.innerHTML = '&shy;<style>         \\\n      .fluid-width-video-wrapper {        \\\n         width: 100%;                     \\\n         position: relative;              \\\n         padding: 0;                      \\\n      }                                   \\\n                                          \\\n      .fluid-width-video-wrapper iframe,  \\\n      .fluid-width-video-wrapper object,  \\\n      .fluid-width-video-wrapper embed {  \\\n         position: absolute;              \\\n         top: 0;                          \\\n         left: 0;                         \\\n         width: 100%;                     \\\n         height: 100%;                    \\\n      }                                   \\\n    </style>';\n\n    ref.parentNode.insertBefore(div,ref);\n\n    if ( options ) {\n      $.extend( settings, options );\n    }\n\n    return this.each(function(){\n      var selectors = [\n        \"iframe[src*='player.vimeo.com']\",\n        \"iframe[src*='www.youtube.com']\",\n        \"iframe[src*='www.youtube-nocookie.com']\",\n        \"iframe[src*='www.kickstarter.com']\",\n        \"object\",\n        \"embed\"\n      ];\n\n      if (settings.customSelector) {\n        selectors.push(settings.customSelector);\n      }\n\n      var $allVideos = $(this).find(selectors.join(','));\n\n      $allVideos.each(function(){\n        var $this = $(this);\n        if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }\n        var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),\n            width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),\n            aspectRatio = height / width;\n        if(!$this.attr('id')){\n          var videoID = 'fitvid' + Math.floor(Math.random()*999999);\n          $this.attr('id', videoID);\n        }\n        $this.wrap('<div class=\"fluid-width-video-wrapper\"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+\"%\");\n        $this.removeAttr('height').removeAttr('width');\n      });\n    });\n  };\n})( jQuery );"
  },
  {
    "path": "assets/assets/js/plugins/jquery.magnific-popup.js",
    "content": "/*! Magnific Popup - v0.9.3 - 2013-07-16\n* http://dimsemenov.com/plugins/magnific-popup/\n* Copyright (c) 2013 Dmitry Semenov; */\n;(function($) {\n\n/*>>core*/\n/**\n * \n * Magnific Popup Core JS file\n * \n */\n\n\n/**\n * Private static constants\n */\nvar CLOSE_EVENT = 'Close',\n\tBEFORE_CLOSE_EVENT = 'BeforeClose',\n\tAFTER_CLOSE_EVENT = 'AfterClose',\n\tBEFORE_APPEND_EVENT = 'BeforeAppend',\n\tMARKUP_PARSE_EVENT = 'MarkupParse',\n\tOPEN_EVENT = 'Open',\n\tCHANGE_EVENT = 'Change',\n\tNS = 'mfp',\n\tEVENT_NS = '.' + NS,\n\tREADY_CLASS = 'mfp-ready',\n\tREMOVING_CLASS = 'mfp-removing',\n\tPREVENT_CLOSE_CLASS = 'mfp-prevent-close';\n\n\n/**\n * Private vars \n */\nvar mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'\n\tMagnificPopup = function(){},\n\t_isJQ = !!(window.jQuery),\n\t_prevStatus,\n\t_window = $(window),\n\t_body,\n\t_document,\n\t_prevContentType,\n\t_wrapClasses,\n\t_currPopupType;\n\n\n/**\n * Private functions\n */\nvar _mfpOn = function(name, f) {\n\t\tmfp.ev.on(NS + name + EVENT_NS, f);\n\t},\n\t_getEl = function(className, appendTo, html, raw) {\n\t\tvar el = document.createElement('div');\n\t\tel.className = 'mfp-'+className;\n\t\tif(html) {\n\t\t\tel.innerHTML = html;\n\t\t}\n\t\tif(!raw) {\n\t\t\tel = $(el);\n\t\t\tif(appendTo) {\n\t\t\t\tel.appendTo(appendTo);\n\t\t\t}\n\t\t} else if(appendTo) {\n\t\t\tappendTo.appendChild(el);\n\t\t}\n\t\treturn el;\n\t},\n\t_mfpTrigger = function(e, data) {\n\t\tmfp.ev.triggerHandler(NS + e, data);\n\n\t\tif(mfp.st.callbacks) {\n\t\t\t// converts \"mfpEventName\" to \"eventName\" callback and triggers it if it's present\n\t\t\te = e.charAt(0).toLowerCase() + e.slice(1);\n\t\t\tif(mfp.st.callbacks[e]) {\n\t\t\t\tmfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);\n\t\t\t}\n\t\t}\n\t},\n\t_setFocus = function() {\n\t\t(mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).trigger('focus');\n\t},\n\t_getCloseBtn = function(type) {\n\t\tif(type !== _currPopupType || !mfp.currTemplate.closeBtn) {\n\t\t\tmfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) );\n\t\t\t_currPopupType = type;\n\t\t}\n\t\treturn mfp.currTemplate.closeBtn;\n\t},\n\t// Initialize Magnific Popup only when called at least once\n\t_checkInstance = function() {\n\t\tif(!$.magnificPopup.instance) {\n\t\t\tmfp = new MagnificPopup();\n\t\t\tmfp.init();\n\t\t\t$.magnificPopup.instance = mfp;\n\t\t}\n\t},\n\t// Check to close popup or not\n\t// \"target\" is an element that was clicked\n\t_checkIfClose = function(target) {\n\n\t\tif($(target).hasClass(PREVENT_CLOSE_CLASS)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar closeOnContent = mfp.st.closeOnContentClick;\n\t\tvar closeOnBg = mfp.st.closeOnBgClick;\n\n\t\tif(closeOnContent && closeOnBg) {\n\t\t\treturn true;\n\t\t} else {\n\n\t\t\t// We close the popup if click is on close button or on preloader. Or if there is no content.\n\t\t\tif(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// if click is outside the content\n\t\t\tif(  (target !== mfp.content[0] && !$.contains(mfp.content[0], target))  ) {\n\t\t\t\tif(closeOnBg) {\n\t\t\t\t\t// last check, if the clicked element is in DOM, (in case it's removed onclick)\n\t\t\t\t\tif( $.contains(document, target) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(closeOnContent) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t}\n\t\treturn false;\n\t},\n\t// CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr\n\tsupportsTransitions = function() {\n\t\tvar s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist\n\t\t\tv = ['ms','O','Moz','Webkit']; // 'v' for vendor\n\n\t\tif( s['transition'] !== undefined ) {\n\t\t\treturn true; \n\t\t}\n\t\t\t\n\t\twhile( v.length ) {\n\t\t\tif( v.pop() + 'Transition' in s ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\treturn false;\n\t};\n\n\n\n/**\n * Public functions\n */\nMagnificPopup.prototype = {\n\n\tconstructor: MagnificPopup,\n\n\t/**\n\t * Initializes Magnific Popup plugin. \n\t * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed\n\t */\n\tinit: function() {\n\t\tvar appVersion = navigator.appVersion;\n\t\tmfp.isIE7 = appVersion.indexOf(\"MSIE 7.\") !== -1; \n\t\tmfp.isIE8 = appVersion.indexOf(\"MSIE 8.\") !== -1;\n\t\tmfp.isLowIE = mfp.isIE7 || mfp.isIE8;\n\t\tmfp.isAndroid = (/android/gi).test(appVersion);\n\t\tmfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);\n\t\tmfp.supportsTransition = supportsTransitions();\n\n\t\t// We disable fixed positioned lightbox on devices that don't handle it nicely.\n\t\t// If you know a better way of detecting this - let me know.\n\t\tmfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) );\n\t\t_body = $(document.body);\n\t\t_document = $(document);\n\n\t\tmfp.popupsCache = {};\n\t},\n\n\t/**\n\t * Opens popup\n\t * @param  data [description]\n\t */\n\topen: function(data) {\n\n\t\tvar i;\n\n\t\tif(data.isObj === false) { \n\t\t\t// convert jQuery collection to array to avoid conflicts later\n\t\t\tmfp.items = data.items.toArray();\n\n\t\t\tmfp.index = 0;\n\t\t\tvar items = data.items,\n\t\t\t\titem;\n\t\t\tfor(i = 0; i < items.length; i++) {\n\t\t\t\titem = items[i];\n\t\t\t\tif(item.parsed) {\n\t\t\t\t\titem = item.el[0];\n\t\t\t\t}\n\t\t\t\tif(item === data.el[0]) {\n\t\t\t\t\tmfp.index = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tmfp.items = $.isArray(data.items) ? data.items : [data.items];\n\t\t\tmfp.index = data.index || 0;\n\t\t}\n\n\t\t// if popup is already opened - we just update the content\n\t\tif(mfp.isOpen) {\n\t\t\tmfp.updateItemHTML();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tmfp.types = []; \n\t\t_wrapClasses = '';\n\t\tif(data.mainEl && data.mainEl.length) {\n\t\t\tmfp.ev = data.mainEl.eq(0);\n\t\t} else {\n\t\t\tmfp.ev = _document;\n\t\t}\n\n\t\tif(data.key) {\n\t\t\tif(!mfp.popupsCache[data.key]) {\n\t\t\t\tmfp.popupsCache[data.key] = {};\n\t\t\t}\n\t\t\tmfp.currTemplate = mfp.popupsCache[data.key];\n\t\t} else {\n\t\t\tmfp.currTemplate = {};\n\t\t}\n\n\n\n\t\tmfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); \n\t\tmfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;\n\n\t\tif(mfp.st.modal) {\n\t\t\tmfp.st.closeOnContentClick = false;\n\t\t\tmfp.st.closeOnBgClick = false;\n\t\t\tmfp.st.showCloseBtn = false;\n\t\t\tmfp.st.enableEscapeKey = false;\n\t\t}\n\t\t\n\n\t\t// Building markup\n\t\t// main containers are created only once\n\t\tif(!mfp.bgOverlay) {\n\n\t\t\t// Dark overlay\n\t\t\tmfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() {\n\t\t\t\tmfp.close();\n\t\t\t});\n\n\t\t\tmfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) {\n\t\t\t\tif(_checkIfClose(e.target)) {\n\t\t\t\t\tmfp.close();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmfp.container = _getEl('container', mfp.wrap);\n\t\t}\n\n\t\tmfp.contentContainer = _getEl('content');\n\t\tif(mfp.st.preloader) {\n\t\t\tmfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);\n\t\t}\n\n\n\t\t// Initializing modules\n\t\tvar modules = $.magnificPopup.modules;\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar n = modules[i];\n\t\t\tn = n.charAt(0).toUpperCase() + n.slice(1);\n\t\t\tmfp['init'+n].call(mfp);\n\t\t}\n\t\t_mfpTrigger('BeforeOpen');\n\n\n\t\tif(mfp.st.showCloseBtn) {\n\t\t\t// Close button\n\t\t\tif(!mfp.st.closeBtnInside) {\n\t\t\t\tmfp.wrap.append( _getCloseBtn() );\n\t\t\t} else {\n\t\t\t\t_mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) {\n\t\t\t\t\tvalues.close_replaceWith = _getCloseBtn(item.type);\n\t\t\t\t});\n\t\t\t\t_wrapClasses += ' mfp-close-btn-in';\n\t\t\t}\n\t\t}\n\n\t\tif(mfp.st.alignTop) {\n\t\t\t_wrapClasses += ' mfp-align-top';\n\t\t}\n\n\t\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tmfp.wrap.css({\n\t\t\t\toverflow: mfp.st.overflowY,\n\t\t\t\toverflowX: 'hidden',\n\t\t\t\toverflowY: mfp.st.overflowY\n\t\t\t});\n\t\t} else {\n\t\t\tmfp.wrap.css({ \n\t\t\t\ttop: _window.scrollTop(),\n\t\t\t\tposition: 'absolute'\n\t\t\t});\n\t\t}\n\t\tif( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) {\n\t\t\tmfp.bgOverlay.css({\n\t\t\t\theight: _document.height(),\n\t\t\t\tposition: 'absolute'\n\t\t\t});\n\t\t}\n\n\t\t\n\n\t\tif(mfp.st.enableEscapeKey) {\n\t\t\t// Close on ESC key\n\t\t\t_document.on('keyup' + EVENT_NS, function(e) {\n\t\t\t\tif(e.keyCode === 27) {\n\t\t\t\t\tmfp.close();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_window.on('resize' + EVENT_NS, function() {\n\t\t\tmfp.updateSize();\n\t\t});\n\n\n\t\tif(!mfp.st.closeOnContentClick) {\n\t\t\t_wrapClasses += ' mfp-auto-cursor';\n\t\t}\n\t\t\n\t\tif(_wrapClasses)\n\t\t\tmfp.wrap.addClass(_wrapClasses);\n\n\n\t\t// this triggers recalculation of layout, so we get it once to not to trigger twice\n\t\tvar windowHeight = mfp.wH = _window.height();\n\n\t\t\n\t\tvar windowStyles = {};\n\n\t\tif( mfp.fixedContentPos ) {\n            if(mfp._hasScrollBar(windowHeight)){\n                var s = mfp._getScrollbarSize();\n                if(s) {\n                    windowStyles.paddingRight = s;\n                }\n            }\n        }\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tif(!mfp.isIE7) {\n\t\t\t\twindowStyles.overflow = 'hidden';\n\t\t\t} else {\n\t\t\t\t// ie7 double-scroll bug\n\t\t\t\t$('body, html').css('overflow', 'hidden');\n\t\t\t}\n\t\t}\n\n\t\t\n\t\t\n\t\tvar classesToadd = mfp.st.mainClass;\n\t\tif(mfp.isIE7) {\n\t\t\tclassesToadd += ' mfp-ie7';\n\t\t}\n\t\tif(classesToadd) {\n\t\t\tmfp._addClassToMFP( classesToadd );\n\t\t}\n\n\t\t// add content\n\t\tmfp.updateItemHTML();\n\n\t\t_mfpTrigger('BuildControls');\n\n\n\t\t// remove scrollbar, add padding e.t.c\n\t\t$('html').css(windowStyles);\n\t\t\n\t\t// add everything to DOM\n\t\tmfp.bgOverlay.add(mfp.wrap).prependTo( document.body );\n\n\n\n\t\t// Save last focused element\n\t\tmfp._lastFocusedEl = document.activeElement;\n\t\t\n\t\t// Wait for next cycle to allow CSS transition\n\t\tsetTimeout(function() {\n\t\t\t\n\t\t\tif(mfp.content) {\n\t\t\t\tmfp._addClassToMFP(READY_CLASS);\n\t\t\t\t_setFocus();\n\t\t\t} else {\n\t\t\t\t// if content is not defined (not loaded e.t.c) we add class only for BG\n\t\t\t\tmfp.bgOverlay.addClass(READY_CLASS);\n\t\t\t}\n\t\t\t\n\t\t\t// Trap the focus in popup\n\t\t\t_document.on('focusin' + EVENT_NS, function (e) {\n\t\t\t\tif( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) {\n\t\t\t\t\t_setFocus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t}, 16);\n\n\t\tmfp.isOpen = true;\n\t\tmfp.updateSize(windowHeight);\n\t\t_mfpTrigger(OPEN_EVENT);\n\t},\n\n\t/**\n\t * Closes the popup\n\t */\n\tclose: function() {\n\t\tif(!mfp.isOpen) return;\n\t\t_mfpTrigger(BEFORE_CLOSE_EVENT);\n\n\t\tmfp.isOpen = false;\n\t\t// for CSS3 animation\n\t\tif(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition )  {\n\t\t\tmfp._addClassToMFP(REMOVING_CLASS);\n\t\t\tsetTimeout(function() {\n\t\t\t\tmfp._close();\n\t\t\t}, mfp.st.removalDelay);\n\t\t} else {\n\t\t\tmfp._close();\n\t\t}\n\t},\n\n\t/**\n\t * Helper for close() function\n\t */\n\t_close: function() {\n\t\t_mfpTrigger(CLOSE_EVENT);\n\n\t\tvar classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';\n\n\t\tmfp.bgOverlay.detach();\n\t\tmfp.wrap.detach();\n\t\tmfp.container.empty();\n\n\t\tif(mfp.st.mainClass) {\n\t\t\tclassesToRemove += mfp.st.mainClass + ' ';\n\t\t}\n\n\t\tmfp._removeClassFromMFP(classesToRemove);\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tvar windowStyles = {paddingRight: ''};\n\t\t\tif(mfp.isIE7) {\n\t\t\t\t$('body, html').css('overflow', '');\n\t\t\t} else {\n\t\t\t\twindowStyles.overflow = '';\n\t\t\t}\n\t\t\t$('html').css(windowStyles);\n\t\t}\n\t\t\n\t\t_document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);\n\t\tmfp.ev.off(EVENT_NS);\n\n\t\t// clean up DOM elements that aren't removed\n\t\tmfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');\n\t\tmfp.bgOverlay.attr('class', 'mfp-bg');\n\t\tmfp.container.attr('class', 'mfp-container');\n\n\t\t// remove close button from target element\n\t\tif(mfp.st.showCloseBtn &&\n\t\t(!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {\n\t\t\tif(mfp.currTemplate.closeBtn)\n\t\t\t\tmfp.currTemplate.closeBtn.detach();\n\t\t}\n\n\n\t\tif(mfp._lastFocusedEl) {\n\t\t\t$(mfp._lastFocusedEl).trigger('focus'); // put tab focus back\n\t\t}\n\t\tmfp.currItem = null;\t\n\t\tmfp.content = null;\n\t\tmfp.currTemplate = null;\n\t\tmfp.prevHeight = 0;\n\n\t\t_mfpTrigger(AFTER_CLOSE_EVENT);\n\t},\n\t\n\tupdateSize: function(winHeight) {\n\n\t\tif(mfp.isIOS) {\n\t\t\t// fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2\n\t\t\tvar zoomLevel = document.documentElement.clientWidth / window.innerWidth;\n\t\t\tvar height = window.innerHeight * zoomLevel;\n\t\t\tmfp.wrap.css('height', height);\n\t\t\tmfp.wH = height;\n\t\t} else {\n\t\t\tmfp.wH = winHeight || _window.height();\n\t\t}\n\t\t// Fixes #84: popup incorrectly positioned with position:relative on body\n\t\tif(!mfp.fixedContentPos) {\n\t\t\tmfp.wrap.css('height', mfp.wH);\n\t\t}\n\n\t\t_mfpTrigger('Resize');\n\n\t},\n\n\t/**\n\t * Set content of popup based on current index\n\t */\n\tupdateItemHTML: function() {\n\t\tvar item = mfp.items[mfp.index];\n\n\t\t// Detach and perform modifications\n\t\tmfp.contentContainer.detach();\n\n\t\tif(mfp.content)\n\t\t\tmfp.content.detach();\n\n\t\tif(!item.parsed) {\n\t\t\titem = mfp.parseEl( mfp.index );\n\t\t}\n\n\t\tvar type = item.type;\t\n\n\t\t_mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);\n\t\t// BeforeChange event works like so:\n\t\t// _mfpOn('BeforeChange', function(e, prevType, newType) { });\n\t\t\n\t\tmfp.currItem = item;\n\n\t\t\n\n\t\t\n\n\t\tif(!mfp.currTemplate[type]) {\n\t\t\tvar markup = mfp.st[type] ? mfp.st[type].markup : false;\n\n\t\t\t// allows to modify markup\n\t\t\t_mfpTrigger('FirstMarkupParse', markup);\n\n\t\t\tif(markup) {\n\t\t\t\tmfp.currTemplate[type] = $(markup);\n\t\t\t} else {\n\t\t\t\t// if there is no markup found we just define that template is parsed\n\t\t\t\tmfp.currTemplate[type] = true;\n\t\t\t}\n\t\t}\n\n\t\tif(_prevContentType && _prevContentType !== item.type) {\n\t\t\tmfp.container.removeClass('mfp-'+_prevContentType+'-holder');\n\t\t}\n\t\t\n\t\tvar newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);\n\t\tmfp.appendContent(newContent, type);\n\n\t\titem.preloaded = true;\n\n\t\t_mfpTrigger(CHANGE_EVENT, item);\n\t\t_prevContentType = item.type;\n\t\t\n\t\t// Append container back after its content changed\n\t\tmfp.container.prepend(mfp.contentContainer);\n\n\t\t_mfpTrigger('AfterChange');\n\t},\n\n\n\t/**\n\t * Set HTML content of popup\n\t */\n\tappendContent: function(newContent, type) {\n\t\tmfp.content = newContent;\n\t\t\n\t\tif(newContent) {\n\t\t\tif(mfp.st.showCloseBtn && mfp.st.closeBtnInside &&\n\t\t\t\tmfp.currTemplate[type] === true) {\n\t\t\t\t// if there is no markup, we just append close button element inside\n\t\t\t\tif(!mfp.content.find('.mfp-close').length) {\n\t\t\t\t\tmfp.content.append(_getCloseBtn());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmfp.content = newContent;\n\t\t\t}\n\t\t} else {\n\t\t\tmfp.content = '';\n\t\t}\n\n\t\t_mfpTrigger(BEFORE_APPEND_EVENT);\n\t\tmfp.container.addClass('mfp-'+type+'-holder');\n\n\t\tmfp.contentContainer.append(mfp.content);\n\t},\n\n\n\n\t\n\t/**\n\t * Creates Magnific Popup data object based on given data\n\t * @param  {int} index Index of item to parse\n\t */\n\tparseEl: function(index) {\n\t\tvar item = mfp.items[index],\n\t\t\ttype = item.type;\n\n\t\tif(item.tagName) {\n\t\t\titem = { el: $(item) };\n\t\t} else {\n\t\t\titem = { data: item, src: item.src };\n\t\t}\n\n\t\tif(item.el) {\n\t\t\tvar types = mfp.types;\n\n\t\t\t// check for 'mfp-TYPE' class\n\t\t\tfor(var i = 0; i < types.length; i++) {\n\t\t\t\tif( item.el.hasClass('mfp-'+types[i]) ) {\n\t\t\t\t\ttype = types[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titem.src = item.el.attr('data-mfp-src');\n\t\t\tif(!item.src) {\n\t\t\t\titem.src = item.el.attr('href');\n\t\t\t}\n\t\t}\n\n\t\titem.type = type || mfp.st.type || 'inline';\n\t\titem.index = index;\n\t\titem.parsed = true;\n\t\tmfp.items[index] = item;\n\t\t_mfpTrigger('ElementParse', item);\n\n\t\treturn mfp.items[index];\n\t},\n\n\n\t/**\n\t * Initializes single popup or a group of popups\n\t */\n\taddGroup: function(el, options) {\n\t\tvar eHandler = function(e) {\n\t\t\te.mfpEl = this;\n\t\t\tmfp._openClick(e, el, options);\n\t\t};\n\n\t\tif(!options) {\n\t\t\toptions = {};\n\t\t} \n\n\t\tvar eName = 'click.magnificPopup';\n\t\toptions.mainEl = el;\n\t\t\n\t\tif(options.items) {\n\t\t\toptions.isObj = true;\n\t\t\tel.off(eName).on(eName, eHandler);\n\t\t} else {\n\t\t\toptions.isObj = false;\n\t\t\tif(options.delegate) {\n\t\t\t\tel.off(eName).on(eName, options.delegate , eHandler);\n\t\t\t} else {\n\t\t\t\toptions.items = el;\n\t\t\t\tel.off(eName).on(eName, eHandler);\n\t\t\t}\n\t\t}\n\t},\n\t_openClick: function(e, el, options) {\n\t\tvar midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;\n\n\n\t\tif(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;\n\n\t\tif(disableOn) {\n\t\t\tif($.isFunction(disableOn)) {\n\t\t\t\tif( !disableOn.call(mfp) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else { // else it's number\n\t\t\t\tif( _window.width() < disableOn ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(e.type) {\n\t\t\te.preventDefault();\n\n\t\t\t// This will prevent popup from closing if element is inside and popup is already opened\n\t\t\tif(mfp.isOpen) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t}\n\t\t\t\n\n\t\toptions.el = $(e.mfpEl);\n\t\tif(options.delegate) {\n\t\t\toptions.items = el.find(options.delegate);\n\t\t}\n\t\tmfp.open(options);\n\t},\n\n\n\t/**\n\t * Updates text on preloader\n\t */\n\tupdateStatus: function(status, text) {\n\n\t\tif(mfp.preloader) {\n\t\t\tif(_prevStatus !== status) {\n\t\t\t\tmfp.container.removeClass('mfp-s-'+_prevStatus);\n\t\t\t}\n\n\t\t\tif(!text && status === 'loading') {\n\t\t\t\ttext = mfp.st.tLoading;\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tstatus: status,\n\t\t\t\ttext: text\n\t\t\t};\n\t\t\t// allows to modify status\n\t\t\t_mfpTrigger('UpdateStatus', data);\n\n\t\t\tstatus = data.status;\n\t\t\ttext = data.text;\n\n\t\t\tmfp.preloader.html(text);\n\n\t\t\tmfp.preloader.find('a').on('click', function(e) {\n\t\t\t\te.stopImmediatePropagation();\n\t\t\t});\n\n\t\t\tmfp.container.addClass('mfp-s-'+status);\n\t\t\t_prevStatus = status;\n\t\t}\n\t},\n\n\n\t/*\n\t\t\"Private\" helpers that aren't private at all\n\t */\n\t_addClassToMFP: function(cName) {\n\t\tmfp.bgOverlay.addClass(cName);\n\t\tmfp.wrap.addClass(cName);\n\t},\n\t_removeClassFromMFP: function(cName) {\n\t\tthis.bgOverlay.removeClass(cName);\n\t\tmfp.wrap.removeClass(cName);\n\t},\n\t_hasScrollBar: function(winHeight) {\n\t\treturn (  (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) );\n\t},\n\t_parseMarkup: function(template, values, item) {\n\t\tvar arr;\n\t\tif(item.data) {\n\t\t\tvalues = $.extend(item.data, values);\n\t\t}\n\t\t_mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] );\n\n\t\t$.each(values, function(key, value) {\n\t\t\tif(value === undefined || value === false) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tarr = key.split('_');\n\t\t\tif(arr.length > 1) {\n\t\t\t\tvar el = template.find(EVENT_NS + '-'+arr[0]);\n\n\t\t\t\tif(el.length > 0) {\n\t\t\t\t\tvar attr = arr[1];\n\t\t\t\t\tif(attr === 'replaceWith') {\n\t\t\t\t\t\tif(el[0] !== value[0]) {\n\t\t\t\t\t\t\tel.replaceWith(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(attr === 'img') {\n\t\t\t\t\t\tif(el.is('img')) {\n\t\t\t\t\t\t\tel.attr('src', value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tel.replaceWith( '<img src=\"'+value+'\" class=\"' + el.attr('class') + '\" />' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.attr(arr[1], value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\ttemplate.find(EVENT_NS + '-'+key).html(value);\n\t\t\t}\n\t\t});\n\t},\n\n\t_getScrollbarSize: function() {\n\t\t// thx David\n\t\tif(mfp.scrollbarSize === undefined) {\n\t\t\tvar scrollDiv = document.createElement(\"div\");\n\t\t\tscrollDiv.id = \"mfp-sbm\";\n\t\t\tscrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';\n\t\t\tdocument.body.appendChild(scrollDiv);\n\t\t\tmfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n\t\t\tdocument.body.removeChild(scrollDiv);\n\t\t}\n\t\treturn mfp.scrollbarSize;\n\t}\n\n}; /* MagnificPopup core prototype end */\n\n\n\n\n/**\n * Public static functions\n */\n$.magnificPopup = {\n\tinstance: null,\n\tproto: MagnificPopup.prototype,\n\tmodules: [],\n\n\topen: function(options, index) {\n\t\t_checkInstance();\t\n\n\t\tif(!options) \n\t\t\toptions = {};\n\n\t\toptions.isObj = true;\n\t\toptions.index = index || 0;\n\t\treturn this.instance.open(options);\n\t},\n\n\tclose: function() {\n\t\treturn $.magnificPopup.instance.close();\n\t},\n\n\tregisterModule: function(name, module) {\n\t\tif(module.options) {\n\t\t\t$.magnificPopup.defaults[name] = module.options;\n\t\t}\n\t\t$.extend(this.proto, module.proto);\t\t\t\n\t\tthis.modules.push(name);\n\t},\n\n\tdefaults: {   \n\n\t\t// Info about options is in docs:\n\t\t// http://dimsemenov.com/plugins/magnific-popup/documentation.html#options\n\t\t\n\t\tdisableOn: 0,\t\n\n\t\tkey: null,\n\n\t\tmidClick: false,\n\n\t\tmainClass: '',\n\n\t\tpreloader: true,\n\n\t\tfocus: '', // CSS selector of input to focus after popup is opened\n\t\t\n\t\tcloseOnContentClick: false,\n\n\t\tcloseOnBgClick: true,\n\n\t\tcloseBtnInside: true, \n\n\t\tshowCloseBtn: true,\n\n\t\tenableEscapeKey: true,\n\n\t\tmodal: false,\n\n\t\talignTop: false,\n\t\n\t\tremovalDelay: 0,\n\t\t\n\t\tfixedContentPos: 'auto', \n\t\n\t\tfixedBgPos: 'auto',\n\n\t\toverflowY: 'auto',\n\n\t\tcloseMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">&times;</button>',\n\n\t\ttClose: 'Close (Esc)',\n\n\t\ttLoading: 'Loading...'\n\n\t}\n};\n\n\n\n$.fn.magnificPopup = function(options) {\n\t_checkInstance();\n\n\tvar jqEl = $(this);\n\n\t// We call some API method of first param is a string\n\tif (typeof options === \"string\" ) {\n\n\t\tif(options === 'open') {\n\t\t\tvar items,\n\t\t\t\titemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,\n\t\t\t\tindex = parseInt(arguments[1], 10) || 0;\n\n\t\t\tif(itemOpts.items) {\n\t\t\t\titems = itemOpts.items[index];\n\t\t\t} else {\n\t\t\t\titems = jqEl;\n\t\t\t\tif(itemOpts.delegate) {\n\t\t\t\t\titems = items.find(itemOpts.delegate);\n\t\t\t\t}\n\t\t\t\titems = items.eq( index );\n\t\t\t}\n\t\t\tmfp._openClick({mfpEl:items}, jqEl, itemOpts);\n\t\t} else {\n\t\t\tif(mfp.isOpen)\n\t\t\t\tmfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\n\t} else {\n\n\t\t/*\n\t\t * As Zepto doesn't support .data() method for objects \n\t\t * and it works only in normal browsers\n\t\t * we assign \"options\" object directly to the DOM element. FTW!\n\t\t */\n\t\tif(_isJQ) {\n\t\t\tjqEl.data('magnificPopup', options);\n\t\t} else {\n\t\t\tjqEl[0].magnificPopup = options;\n\t\t}\n\n\t\tmfp.addGroup(jqEl, options);\n\n\t}\n\treturn jqEl;\n};\n\n\n//Quick benchmark\n/*\nvar start = performance.now(),\n\ti,\n\trounds = 1000;\n\nfor(i = 0; i < rounds; i++) {\n\n}\nconsole.log('Test #1:', performance.now() - start);\n\nstart = performance.now();\nfor(i = 0; i < rounds; i++) {\n\n}\nconsole.log('Test #2:', performance.now() - start);\n*/\n\n\n/*>>core*/\n\n/*>>inline*/\n\nvar INLINE_NS = 'inline',\n\t_hiddenClass,\n\t_inlinePlaceholder, \n\t_lastInlineElement,\n\t_putInlineElementsBack = function() {\n\t\tif(_lastInlineElement) {\n\t\t\t_inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach();\n\t\t\t_lastInlineElement = null;\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(INLINE_NS, {\n\toptions: {\n\t\thiddenClass: 'hide', // will be appended with `mfp-` prefix\n\t\tmarkup: '',\n\t\ttNotFound: 'Content not found'\n\t},\n\tproto: {\n\n\t\tinitInline: function() {\n\t\t\tmfp.types.push(INLINE_NS);\n\n\t\t\t_mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() {\n\t\t\t\t_putInlineElementsBack();\n\t\t\t});\n\t\t},\n\n\t\tgetInline: function(item, template) {\n\n\t\t\t_putInlineElementsBack();\n\n\t\t\tif(item.src) {\n\t\t\t\tvar inlineSt = mfp.st.inline,\n\t\t\t\t\tel = $(item.src);\n\n\t\t\t\tif(el.length) {\n\n\t\t\t\t\t// If target element has parent - we replace it with placeholder and put it back after popup is closed\n\t\t\t\t\tvar parent = el[0].parentNode;\n\t\t\t\t\tif(parent && parent.tagName) {\n\t\t\t\t\t\tif(!_inlinePlaceholder) {\n\t\t\t\t\t\t\t_hiddenClass = inlineSt.hiddenClass;\n\t\t\t\t\t\t\t_inlinePlaceholder = _getEl(_hiddenClass);\n\t\t\t\t\t\t\t_hiddenClass = 'mfp-'+_hiddenClass;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// replace target inline element with placeholder\n\t\t\t\t\t\t_lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);\n\t\t\t\t\t}\n\n\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t} else {\n\t\t\t\t\tmfp.updateStatus('error', inlineSt.tNotFound);\n\t\t\t\t\tel = $('<div>');\n\t\t\t\t}\n\n\t\t\t\titem.inlineElement = el;\n\t\t\t\treturn el;\n\t\t\t}\n\n\t\t\tmfp.updateStatus('ready');\n\t\t\tmfp._parseMarkup(template, {}, item);\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n/*>>inline*/\n\n/*>>ajax*/\nvar AJAX_NS = 'ajax',\n\t_ajaxCur,\n\t_removeAjaxCursor = function() {\n\t\tif(_ajaxCur) {\n\t\t\t_body.removeClass(_ajaxCur);\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(AJAX_NS, {\n\n\toptions: {\n\t\tsettings: null,\n\t\tcursor: 'mfp-ajax-cur',\n\t\ttError: '<a href=\"%url%\">The content</a> could not be loaded.'\n\t},\n\n\tproto: {\n\t\tinitAjax: function() {\n\t\t\tmfp.types.push(AJAX_NS);\n\t\t\t_ajaxCur = mfp.st.ajax.cursor;\n\n\t\t\t_mfpOn(CLOSE_EVENT+'.'+AJAX_NS, function() {\n\t\t\t\t_removeAjaxCursor();\n\t\t\t\tif(mfp.req) {\n\t\t\t\t\tmfp.req.abort();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tgetAjax: function(item) {\n\n\t\t\tif(_ajaxCur)\n\t\t\t\t_body.addClass(_ajaxCur);\n\n\t\t\tmfp.updateStatus('loading');\n\n\t\t\tvar opts = $.extend({\n\t\t\t\turl: item.src,\n\t\t\t\tsuccess: function(data, textStatus, jqXHR) {\n\t\t\t\t\tvar temp = {\n\t\t\t\t\t\tdata:data,\n\t\t\t\t\t\txhr:jqXHR\n\t\t\t\t\t};\n\n\t\t\t\t\t_mfpTrigger('ParseAjax', temp);\n\n\t\t\t\t\tmfp.appendContent( $(temp.data), AJAX_NS );\n\n\t\t\t\t\titem.finished = true;\n\n\t\t\t\t\t_removeAjaxCursor();\n\n\t\t\t\t\t_setFocus();\n\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tmfp.wrap.addClass(READY_CLASS);\n\t\t\t\t\t}, 16);\n\n\t\t\t\t\tmfp.updateStatus('ready');\n\n\t\t\t\t\t_mfpTrigger('AjaxContentAdded');\n\t\t\t\t},\n\t\t\t\terror: function() {\n\t\t\t\t\t_removeAjaxCursor();\n\t\t\t\t\titem.finished = item.loadError = true;\n\t\t\t\t\tmfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));\n\t\t\t\t}\n\t\t\t}, mfp.st.ajax.settings);\n\n\t\t\tmfp.req = $.ajax(opts);\n\n\t\t\treturn '';\n\t\t}\n\t}\n});\n\n\n\n\n\n\t\n\n/*>>ajax*/\n\n/*>>image*/\nvar _imgInterval,\n\t_getTitle = function(item) {\n\t\tif(item.data && item.data.title !== undefined) \n\t\t\treturn item.data.title;\n\n\t\tvar src = mfp.st.image.titleSrc;\n\n\t\tif(src) {\n\t\t\tif($.isFunction(src)) {\n\t\t\t\treturn src.call(mfp, item);\n\t\t\t} else if(item.el) {\n\t\t\t\treturn item.el.attr(src) || '';\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t};\n\n$.magnificPopup.registerModule('image', {\n\n\toptions: {\n\t\tmarkup: '<div class=\"mfp-figure\">'+\n\t\t\t\t\t'<div class=\"mfp-close\"></div>'+\n\t\t\t\t\t'<div class=\"mfp-img\"></div>'+\n\t\t\t\t\t'<div class=\"mfp-bottom-bar\">'+\n\t\t\t\t\t\t'<div class=\"mfp-title\"></div>'+\n\t\t\t\t\t\t'<div class=\"mfp-counter\"></div>'+\n\t\t\t\t\t'</div>'+\n\t\t\t\t'</div>',\n\t\tcursor: 'mfp-zoom-out-cur',\n\t\ttitleSrc: 'title', \n\t\tverticalFit: true,\n\t\ttError: '<a href=\"%url%\">The image</a> could not be loaded.'\n\t},\n\n\tproto: {\n\t\tinitImage: function() {\n\t\t\tvar imgSt = mfp.st.image,\n\t\t\t\tns = '.image';\n\n\t\t\tmfp.types.push('image');\n\n\t\t\t_mfpOn(OPEN_EVENT+ns, function() {\n\t\t\t\tif(mfp.currItem.type === 'image' && imgSt.cursor) {\n\t\t\t\t\t_body.addClass(imgSt.cursor);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\tif(imgSt.cursor) {\n\t\t\t\t\t_body.removeClass(imgSt.cursor);\n\t\t\t\t}\n\t\t\t\t_window.off('resize' + EVENT_NS);\n\t\t\t});\n\n\t\t\t_mfpOn('Resize'+ns, mfp.resizeImage);\n\t\t\tif(mfp.isLowIE) {\n\t\t\t\t_mfpOn('AfterChange', mfp.resizeImage);\n\t\t\t}\n\t\t},\n\t\tresizeImage: function() {\n\t\t\tvar item = mfp.currItem;\n\t\t\tif(!item.img) return;\n\n\t\t\tif(mfp.st.image.verticalFit) {\n\t\t\t\tvar decr = 0;\n\t\t\t\t// fix box-sizing in ie7/8\n\t\t\t\tif(mfp.isLowIE) {\n\t\t\t\t\tdecr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10);\n\t\t\t\t}\n\t\t\t\titem.img.css('max-height', mfp.wH-decr);\n\t\t\t}\n\t\t},\n\t\t_onImageHasSize: function(item) {\n\t\t\tif(item.img) {\n\t\t\t\t\n\t\t\t\titem.hasSize = true;\n\n\t\t\t\tif(_imgInterval) {\n\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\titem.isCheckingImgSize = false;\n\n\t\t\t\t_mfpTrigger('ImageHasSize', item);\n\n\t\t\t\tif(item.imgHidden) {\n\t\t\t\t\tif(mfp.content)\n\t\t\t\t\t\tmfp.content.removeClass('mfp-loading');\n\t\t\t\t\t\n\t\t\t\t\titem.imgHidden = false;\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Function that loops until the image has size to display elements that rely on it asap\n\t\t */\n\t\tfindImageSize: function(item) {\n\n\t\t\tvar counter = 0,\n\t\t\t\timg = item.img[0],\n\t\t\t\tmfpSetInterval = function(delay) {\n\n\t\t\t\t\tif(_imgInterval) {\n\t\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t\t}\n\t\t\t\t\t// decelerating interval that checks for size of an image\n\t\t\t\t\t_imgInterval = setInterval(function() {\n\t\t\t\t\t\tif(img.naturalWidth > 0) {\n\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter > 200) {\n\t\t\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\tif(counter === 3) {\n\t\t\t\t\t\t\tmfpSetInterval(10);\n\t\t\t\t\t\t} else if(counter === 40) {\n\t\t\t\t\t\t\tmfpSetInterval(50);\n\t\t\t\t\t\t} else if(counter === 100) {\n\t\t\t\t\t\t\tmfpSetInterval(500);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay);\n\t\t\t\t};\n\n\t\t\tmfpSetInterval(1);\n\t\t},\n\n\t\tgetImage: function(item, template) {\n\n\t\t\tvar guard = 0,\n\n\t\t\t\t// image load complete handler\n\t\t\t\tonLoadComplete = function() {\n\t\t\t\t\tif(item) {\n\t\t\t\t\t\tif (item.img[0].complete) {\n\t\t\t\t\t\t\titem.img.off('.mfploader');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(item === mfp.currItem){\n\t\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\n\t\t\t\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\t\t\titem.loaded = true;\n\n\t\t\t\t\t\t\t_mfpTrigger('ImageLoadComplete');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// if image complete check fails 200 times (20 sec), we assume that there was an error.\n\t\t\t\t\t\t\tguard++;\n\t\t\t\t\t\t\tif(guard < 200) {\n\t\t\t\t\t\t\t\tsetTimeout(onLoadComplete,100);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tonLoadError();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// image error handler\n\t\t\t\tonLoadError = function() {\n\t\t\t\t\tif(item) {\n\t\t\t\t\t\titem.img.off('.mfploader');\n\t\t\t\t\t\tif(item === mfp.currItem){\n\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\t\t\t\t\t\t\tmfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\t\titem.loaded = true;\n\t\t\t\t\t\titem.loadError = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\timgSt = mfp.st.image;\n\n\n\t\t\tvar el = template.find('.mfp-img');\n\t\t\tif(el.length) {\n\t\t\t\tvar img = new Image();\n\t\t\t\timg.className = 'mfp-img';\n\t\t\t\titem.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);\n\t\t\t\timg.src = item.src;\n\n\t\t\t\t// without clone() \"error\" event is not firing when IMG is replaced by new IMG\n\t\t\t\t// TODO: find a way to avoid such cloning\n\t\t\t\tif(el.is('img')) {\n\t\t\t\t\titem.img = item.img.clone();\n\t\t\t\t}\n\t\t\t\tif(item.img[0].naturalWidth > 0) {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmfp._parseMarkup(template, {\n\t\t\t\ttitle: _getTitle(item),\n\t\t\t\timg_replaceWith: item.img\n\t\t\t}, item);\n\n\t\t\tmfp.resizeImage();\n\n\t\t\tif(item.hasSize) {\n\t\t\t\tif(_imgInterval) clearInterval(_imgInterval);\n\n\t\t\t\tif(item.loadError) {\n\t\t\t\t\ttemplate.addClass('mfp-loading');\n\t\t\t\t\tmfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n\t\t\t\t} else {\n\t\t\t\t\ttemplate.removeClass('mfp-loading');\n\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t}\n\t\t\t\treturn template;\n\t\t\t}\n\n\t\t\tmfp.updateStatus('loading');\n\t\t\titem.loading = true;\n\n\t\t\tif(!item.hasSize) {\n\t\t\t\titem.imgHidden = true;\n\t\t\t\ttemplate.addClass('mfp-loading');\n\t\t\t\tmfp.findImageSize(item);\n\t\t\t} \n\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n\n\n/*>>image*/\n\n/*>>zoom*/\nvar hasMozTransform,\n\tgetHasMozTransform = function() {\n\t\tif(hasMozTransform === undefined) {\n\t\t\thasMozTransform = document.createElement('p').style.MozTransform !== undefined;\n\t\t}\n\t\treturn hasMozTransform;\t\t\n\t};\n\n$.magnificPopup.registerModule('zoom', {\n\n\toptions: {\n\t\tenabled: false,\n\t\teasing: 'ease-in-out',\n\t\tduration: 300,\n\t\topener: function(element) {\n\t\t\treturn element.is('img') ? element : element.find('img');\n\t\t}\n\t},\n\n\tproto: {\n\n\t\tinitZoom: function() {\n\t\t\tvar zoomSt = mfp.st.zoom,\n\t\t\t\tns = '.zoom';\n\t\t\t\t\n\t\t\tif(!zoomSt.enabled || !mfp.supportsTransition) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar duration = zoomSt.duration,\n\t\t\t\tgetElToAnimate = function(image) {\n\t\t\t\t\tvar newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),\n\t\t\t\t\t\ttransition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing,\n\t\t\t\t\t\tcssObj = {\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t'-webkit-backface-visibility': 'hidden'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tt = 'transition';\n\n\t\t\t\t\tcssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition;\n\n\t\t\t\t\tnewImg.css(cssObj);\n\t\t\t\t\treturn newImg;\n\t\t\t\t},\n\t\t\t\tshowMainContent = function() {\n\t\t\t\t\tmfp.content.css('visibility', 'visible');\n\t\t\t\t},\n\t\t\t\topenTimeout,\n\t\t\t\tanimatedImg;\n\n\t\t\t_mfpOn('BuildControls'+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\n\t\t\t\t\tclearTimeout(openTimeout);\n\t\t\t\t\tmfp.content.css('visibility', 'hidden');\n\n\t\t\t\t\t// Basically, all code below does is clones existing image, puts in on top of the current one and animated it\n\t\t\t\t\t\n\t\t\t\t\timage = mfp._getItemToZoom();\n\n\t\t\t\t\tif(!image) {\n\t\t\t\t\t\tshowMainContent();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tanimatedImg = getElToAnimate(image); \n\t\t\t\t\t\n\t\t\t\t\tanimatedImg.css( mfp._getOffset() );\n\n\t\t\t\t\tmfp.wrap.append(animatedImg);\n\n\t\t\t\t\topenTimeout = setTimeout(function() {\n\t\t\t\t\t\tanimatedImg.css( mfp._getOffset( true ) );\n\t\t\t\t\t\topenTimeout = setTimeout(function() {\n\n\t\t\t\t\t\t\tshowMainContent();\n\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\tanimatedImg.remove();\n\t\t\t\t\t\t\t\timage = animatedImg = null;\n\t\t\t\t\t\t\t\t_mfpTrigger('ZoomAnimationEnded');\n\t\t\t\t\t\t\t}, 16); // avoid blink when switching images \n\n\t\t\t\t\t\t}, duration); // this timeout equals animation duration\n\n\t\t\t\t\t}, 16); // by adding this timeout we avoid short glitch at the beginning of animation\n\n\n\t\t\t\t\t// Lots of timeouts...\n\t\t\t\t}\n\t\t\t});\n\t\t\t_mfpOn(BEFORE_CLOSE_EVENT+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\n\t\t\t\t\tclearTimeout(openTimeout);\n\n\t\t\t\t\tmfp.st.removalDelay = duration;\n\n\t\t\t\t\tif(!image) {\n\t\t\t\t\t\timage = mfp._getItemToZoom();\n\t\t\t\t\t\tif(!image) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tanimatedImg = getElToAnimate(image);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tanimatedImg.css( mfp._getOffset(true) );\n\t\t\t\t\tmfp.wrap.append(animatedImg);\n\t\t\t\t\tmfp.content.css('visibility', 'hidden');\n\t\t\t\t\t\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tanimatedImg.css( mfp._getOffset() );\n\t\t\t\t\t}, 16);\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\t\t\t\t\tshowMainContent();\n\t\t\t\t\tif(animatedImg) {\n\t\t\t\t\t\tanimatedImg.remove();\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t});\n\t\t},\n\n\t\t_allowZoom: function() {\n\t\t\treturn mfp.currItem.type === 'image';\n\t\t},\n\n\t\t_getItemToZoom: function() {\n\t\t\tif(mfp.currItem.hasSize) {\n\t\t\t\treturn mfp.currItem.img;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Get element postion relative to viewport\n\t\t_getOffset: function(isLarge) {\n\t\t\tvar el;\n\t\t\tif(isLarge) {\n\t\t\t\tel = mfp.currItem.img;\n\t\t\t} else {\n\t\t\t\tel = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);\n\t\t\t}\n\n\t\t\tvar offset = el.offset();\n\t\t\tvar paddingTop = parseInt(el.css('padding-top'),10);\n\t\t\tvar paddingBottom = parseInt(el.css('padding-bottom'),10);\n\t\t\toffset.top -= ( $(window).scrollTop() - paddingTop );\n\n\n\t\t\t/*\n\t\t\t\n\t\t\tAnimating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.\n\n\t\t\t */\n\t\t\tvar obj = {\n\t\t\t\twidth: el.width(),\n\t\t\t\t// fix Zepto height+padding issue\n\t\t\t\theight: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop\n\t\t\t};\n\n\t\t\t// I hate to do this, but there is no another option\n\t\t\tif( getHasMozTransform() ) {\n\t\t\t\tobj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';\n\t\t\t} else {\n\t\t\t\tobj.left = offset.left;\n\t\t\t\tobj.top = offset.top;\n\t\t\t}\n\t\t\treturn obj;\n\t\t}\n\n\t}\n});\n\n\n\n/*>>zoom*/\n\n/*>>iframe*/\n\nvar IFRAME_NS = 'iframe',\n\t_emptyPage = '//about:blank',\n\t\n\t_fixIframeBugs = function(isShowing) {\n\t\tif(mfp.currTemplate[IFRAME_NS]) {\n\t\t\tvar el = mfp.currTemplate[IFRAME_NS].find('iframe');\n\t\t\tif(el.length) { \n\t\t\t\t// reset src after the popup is closed to avoid \"video keeps playing after popup is closed\" bug\n\t\t\t\tif(!isShowing) {\n\t\t\t\t\tel[0].src = _emptyPage;\n\t\t\t\t}\n\n\t\t\t\t// IE8 black screen bug fix\n\t\t\t\tif(mfp.isIE8) {\n\t\t\t\t\tel.css('display', isShowing ? 'block' : 'none');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(IFRAME_NS, {\n\n\toptions: {\n\t\tmarkup: '<div class=\"mfp-iframe-scaler\">'+\n\t\t\t\t\t'<div class=\"mfp-close\"></div>'+\n\t\t\t\t\t'<iframe class=\"mfp-iframe\" src=\"//about:blank\" frameborder=\"0\" allowfullscreen></iframe>'+\n\t\t\t\t'</div>',\n\n\t\tsrcAction: 'iframe_src',\n\n\t\t// we don't care and support only one default type of URL by default\n\t\tpatterns: {\n\t\t\tyoutube: {\n\t\t\t\tindex: 'youtube.com', \n\t\t\t\tid: 'v=', \n\t\t\t\tsrc: '//www.youtube.com/embed/%id%?autoplay=1'\n\t\t\t},\n\t\t\tvimeo: {\n\t\t\t\tindex: 'vimeo.com/',\n\t\t\t\tid: '/',\n\t\t\t\tsrc: '//player.vimeo.com/video/%id%?autoplay=1'\n\t\t\t},\n\t\t\tgmaps: {\n\t\t\t\tindex: '//maps.google.',\n\t\t\t\tsrc: '%id%&output=embed'\n\t\t\t}\n\t\t}\n\t},\n\n\tproto: {\n\t\tinitIframe: function() {\n\t\t\tmfp.types.push(IFRAME_NS);\n\n\t\t\t_mfpOn('BeforeChange', function(e, prevType, newType) {\n\t\t\t\tif(prevType !== newType) {\n\t\t\t\t\tif(prevType === IFRAME_NS) {\n\t\t\t\t\t\t_fixIframeBugs(); // iframe if removed\n\t\t\t\t\t} else if(newType === IFRAME_NS) {\n\t\t\t\t\t\t_fixIframeBugs(true); // iframe is showing\n\t\t\t\t\t} \n\t\t\t\t}// else {\n\t\t\t\t\t// iframe source is switched, don't do anything\n\t\t\t\t//}\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() {\n\t\t\t\t_fixIframeBugs();\n\t\t\t});\n\t\t},\n\n\t\tgetIframe: function(item, template) {\n\t\t\tvar embedSrc = item.src;\n\t\t\tvar iframeSt = mfp.st.iframe;\n\t\t\t\t\n\t\t\t$.each(iframeSt.patterns, function() {\n\t\t\t\tif(embedSrc.indexOf( this.index ) > -1) {\n\t\t\t\t\tif(this.id) {\n\t\t\t\t\t\tif(typeof this.id === 'string') {\n\t\t\t\t\t\t\tembedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tembedSrc = this.id.call( this, embedSrc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tembedSrc = this.src.replace('%id%', embedSrc );\n\t\t\t\t\treturn false; // break;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tvar dataObj = {};\n\t\t\tif(iframeSt.srcAction) {\n\t\t\t\tdataObj[iframeSt.srcAction] = embedSrc;\n\t\t\t}\n\t\t\tmfp._parseMarkup(template, dataObj, item);\n\n\t\t\tmfp.updateStatus('ready');\n\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n\n\n/*>>iframe*/\n\n/*>>gallery*/\n/**\n * Get looped index depending on number of slides\n */\nvar _getLoopedId = function(index) {\n\t\tvar numSlides = mfp.items.length;\n\t\tif(index > numSlides - 1) {\n\t\t\treturn index - numSlides;\n\t\t} else  if(index < 0) {\n\t\t\treturn numSlides + index;\n\t\t}\n\t\treturn index;\n\t},\n\t_replaceCurrTotal = function(text, curr, total) {\n\t\treturn text.replace('%curr%', curr + 1).replace('%total%', total);\n\t};\n\n$.magnificPopup.registerModule('gallery', {\n\n\toptions: {\n\t\tenabled: false,\n\t\tarrowMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-arrow mfp-arrow-%dir%\"></button>',\n\t\tpreload: [0,2],\n\t\tnavigateByImgClick: true,\n\t\tarrows: true,\n\n\t\ttPrev: 'Previous (Left arrow key)',\n\t\ttNext: 'Next (Right arrow key)',\n\t\ttCounter: '%curr% of %total%'\n\t},\n\n\tproto: {\n\t\tinitGallery: function() {\n\n\t\t\tvar gSt = mfp.st.gallery,\n\t\t\t\tns = '.mfp-gallery',\n\t\t\t\tsupportsFastClick = Boolean($.fn.mfpFastClick);\n\n\t\t\tmfp.direction = true; // true - next, false - prev\n\t\t\t\n\t\t\tif(!gSt || !gSt.enabled ) return false;\n\n\t\t\t_wrapClasses += ' mfp-gallery';\n\n\t\t\t_mfpOn(OPEN_EVENT+ns, function() {\n\n\t\t\t\tif(gSt.navigateByImgClick) {\n\t\t\t\t\tmfp.wrap.on('click'+ns, '.mfp-img', function() {\n\t\t\t\t\t\tif(mfp.items.length > 1) {\n\t\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t_document.on('keydown'+ns, function(e) {\n\t\t\t\t\tif (e.keyCode === 37) {\n\t\t\t\t\t\tmfp.prev();\n\t\t\t\t\t} else if (e.keyCode === 39) {\n\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t_mfpOn('UpdateStatus'+ns, function(e, data) {\n\t\t\t\tif(data.text) {\n\t\t\t\t\tdata.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) {\n\t\t\t\tvar l = mfp.items.length;\n\t\t\t\tvalues.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';\n\t\t\t});\n\n\t\t\t_mfpOn('BuildControls' + ns, function() {\n\t\t\t\tif(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {\n\t\t\t\t\tvar markup = gSt.arrowMarkup,\n\t\t\t\t\t\tarrowLeft = mfp.arrowLeft = $( markup.replace('%title%', gSt.tPrev).replace('%dir%', 'left') ).addClass(PREVENT_CLOSE_CLASS),\t\t\t\n\t\t\t\t\t\tarrowRight = mfp.arrowRight = $( markup.replace('%title%', gSt.tNext).replace('%dir%', 'right') ).addClass(PREVENT_CLOSE_CLASS);\n\n\t\t\t\t\tvar eName = supportsFastClick ? 'mfpFastClick' : 'click';\n\t\t\t\t\tarrowLeft[eName](function() {\n\t\t\t\t\t\tmfp.prev();\n\t\t\t\t\t});\t\t\t\n\t\t\t\t\tarrowRight[eName](function() {\n\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t});\t\n\n\t\t\t\t\t// Polyfill for :before and :after (adds elements with classes mfp-a and mfp-b)\n\t\t\t\t\tif(mfp.isIE7) {\n\t\t\t\t\t\t_getEl('b', arrowLeft[0], false, true);\n\t\t\t\t\t\t_getEl('a', arrowLeft[0], false, true);\n\t\t\t\t\t\t_getEl('b', arrowRight[0], false, true);\n\t\t\t\t\t\t_getEl('a', arrowRight[0], false, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tmfp.container.append(arrowLeft.add(arrowRight));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(CHANGE_EVENT+ns, function() {\n\t\t\t\tif(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);\n\n\t\t\t\tmfp._preloadTimeout = setTimeout(function() {\n\t\t\t\t\tmfp.preloadNearbyImages();\n\t\t\t\t\tmfp._preloadTimeout = null;\n\t\t\t\t}, 16);\t\t\n\t\t\t});\n\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\t_document.off(ns);\n\t\t\t\tmfp.wrap.off('click'+ns);\n\t\t\t\n\t\t\t\tif(mfp.arrowLeft && supportsFastClick) {\n\t\t\t\t\tmfp.arrowLeft.add(mfp.arrowRight).destroyMfpFastClick();\n\t\t\t\t}\n\t\t\t\tmfp.arrowRight = mfp.arrowLeft = null;\n\t\t\t});\n\n\t\t}, \n\t\tnext: function() {\n\t\t\tmfp.direction = true;\n\t\t\tmfp.index = _getLoopedId(mfp.index + 1);\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tprev: function() {\n\t\t\tmfp.direction = false;\n\t\t\tmfp.index = _getLoopedId(mfp.index - 1);\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tgoTo: function(newIndex) {\n\t\t\tmfp.direction = (newIndex >= mfp.index);\n\t\t\tmfp.index = newIndex;\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tpreloadNearbyImages: function() {\n\t\t\tvar p = mfp.st.gallery.preload,\n\t\t\t\tpreloadBefore = Math.min(p[0], mfp.items.length),\n\t\t\t\tpreloadAfter = Math.min(p[1], mfp.items.length),\n\t\t\t\ti;\n\n\t\t\tfor(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {\n\t\t\t\tmfp._preloadItem(mfp.index+i);\n\t\t\t}\n\t\t\tfor(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {\n\t\t\t\tmfp._preloadItem(mfp.index-i);\n\t\t\t}\n\t\t},\n\t\t_preloadItem: function(index) {\n\t\t\tindex = _getLoopedId(index);\n\n\t\t\tif(mfp.items[index].preloaded) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar item = mfp.items[index];\n\t\t\tif(!item.parsed) {\n\t\t\t\titem = mfp.parseEl( index );\n\t\t\t}\n\n\t\t\t_mfpTrigger('LazyLoad', item);\n\n\t\t\tif(item.type === 'image') {\n\t\t\t\titem.img = $('<img class=\"mfp-img\" />').on('load.mfploader', function() {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t}).on('error.mfploader', function() {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\titem.loadError = true;\n\t\t\t\t\t_mfpTrigger('LazyLoadError', item);\n\t\t\t\t}).attr('src', item.src);\n\t\t\t}\n\n\n\t\t\titem.preloaded = true;\n\t\t}\n\t}\n});\n\n/*\nTouch Support that might be implemented some day\n\naddSwipeGesture: function() {\n\tvar startX,\n\t\tmoved,\n\t\tmultipleTouches;\n\n\t\treturn;\n\n\tvar namespace = '.mfp',\n\t\taddEventNames = function(pref, down, move, up, cancel) {\n\t\t\tmfp._tStart = pref + down + namespace;\n\t\t\tmfp._tMove = pref + move + namespace;\n\t\t\tmfp._tEnd = pref + up + namespace;\n\t\t\tmfp._tCancel = pref + cancel + namespace;\n\t\t};\n\n\tif(window.navigator.msPointerEnabled) {\n\t\taddEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n\t} else if('ontouchstart' in window) {\n\t\taddEventNames('touch', 'start', 'move', 'end', 'cancel');\n\t} else {\n\t\treturn;\n\t}\n\t_window.on(mfp._tStart, function(e) {\n\t\tvar oE = e.originalEvent;\n\t\tmultipleTouches = moved = false;\n\t\tstartX = oE.pageX || oE.changedTouches[0].pageX;\n\t}).on(mfp._tMove, function(e) {\n\t\tif(e.originalEvent.touches.length > 1) {\n\t\t\tmultipleTouches = e.originalEvent.touches.length;\n\t\t} else {\n\t\t\t//e.preventDefault();\n\t\t\tmoved = true;\n\t\t}\n\t}).on(mfp._tEnd + ' ' + mfp._tCancel, function(e) {\n\t\tif(moved && !multipleTouches) {\n\t\t\tvar oE = e.originalEvent,\n\t\t\t\tdiff = startX - (oE.pageX || oE.changedTouches[0].pageX);\n\n\t\t\tif(diff > 20) {\n\t\t\t\tmfp.next();\n\t\t\t} else if(diff < -20) {\n\t\t\t\tmfp.prev();\n\t\t\t}\n\t\t}\n\t});\n},\n*/\n\n\n/*>>gallery*/\n\n/*>>retina*/\n\nvar RETINA_NS = 'retina';\n\n$.magnificPopup.registerModule(RETINA_NS, {\n\toptions: {\n\t\treplaceSrc: function(item) {\n\t\t\treturn item.src.replace(/\\.\\w+$/, function(m) { return '@2x' + m; });\n\t\t},\n\t\tratio: 1 // Function or number.  Set to 1 to disable.\n\t},\n\tproto: {\n\t\tinitRetina: function() {\n\t\t\tif(window.devicePixelRatio > 1) {\n\n\t\t\t\tvar st = mfp.st.retina,\n\t\t\t\t\tratio = st.ratio;\n\n\t\t\t\tratio = !isNaN(ratio) ? ratio : ratio();\n\n\t\t\t\tif(ratio > 1) {\n\t\t\t\t\t_mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) {\n\t\t\t\t\t\titem.img.css({\n\t\t\t\t\t\t\t'max-width': item.img[0].naturalWidth / ratio,\n\t\t\t\t\t\t\t'width': '100%'\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\t_mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) {\n\t\t\t\t\t\titem.src = st.replaceSrc(item, ratio);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n});\n\n/*>>retina*/\n\n/*>>fastclick*/\n/**\n * FastClick event implementation. (removes 300ms delay on touch devices)\n * Based on https://developers.google.com/mobile/articles/fast_buttons\n *\n * You may use it outside the Magnific Popup by calling just:\n *\n * $('.your-el').mfpFastClick(function() {\n *     console.log('Clicked!');\n * });\n *\n * To unbind:\n * $('.your-el').destroyMfpFastClick();\n * \n * \n * Note that it's a very basic and simple implementation, it blocks ghost click on the same element where it was bound.\n * If you need something more advanced, use plugin by FT Labs https://github.com/ftlabs/fastclick\n * \n */\n\n(function() {\n\tvar ghostClickDelay = 1000,\n\t\tsupportsTouch = 'ontouchstart' in window,\n\t\tunbindTouchMove = function() {\n\t\t\t_window.off('touchmove'+ns+' touchend'+ns);\n\t\t},\n\t\teName = 'mfpFastClick',\n\t\tns = '.'+eName;\n\n\n\t// As Zepto.js doesn't have an easy way to add custom events (like jQuery), so we implement it in this way\n\t$.fn.mfpFastClick = function(callback) {\n\n\t\treturn $(this).each(function() {\n\n\t\t\tvar elem = $(this),\n\t\t\t\tlock;\n\n\t\t\tif( supportsTouch ) {\n\n\t\t\t\tvar timeout,\n\t\t\t\t\tstartX,\n\t\t\t\t\tstartY,\n\t\t\t\t\tpointerMoved,\n\t\t\t\t\tpoint,\n\t\t\t\t\tnumPointers;\n\n\t\t\t\telem.on('touchstart' + ns, function(e) {\n\t\t\t\t\tpointerMoved = false;\n\t\t\t\t\tnumPointers = 1;\n\n\t\t\t\t\tpoint = e.originalEvent ? e.originalEvent.touches[0] : e.touches[0];\n\t\t\t\t\tstartX = point.clientX;\n\t\t\t\t\tstartY = point.clientY;\n\n\t\t\t\t\t_window.on('touchmove'+ns, function(e) {\n\t\t\t\t\t\tpoint = e.originalEvent ? e.originalEvent.touches : e.touches;\n\t\t\t\t\t\tnumPointers = point.length;\n\t\t\t\t\t\tpoint = point[0];\n\t\t\t\t\t\tif (Math.abs(point.clientX - startX) > 10 ||\n\t\t\t\t\t\t\tMath.abs(point.clientY - startY) > 10) {\n\t\t\t\t\t\t\tpointerMoved = true;\n\t\t\t\t\t\t\tunbindTouchMove();\n\t\t\t\t\t\t}\n\t\t\t\t\t}).on('touchend'+ns, function(e) {\n\t\t\t\t\t\tunbindTouchMove();\n\t\t\t\t\t\tif(pointerMoved || numPointers > 1) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlock = true;\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\ttimeout = setTimeout(function() {\n\t\t\t\t\t\t\tlock = false;\n\t\t\t\t\t\t}, ghostClickDelay);\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\telem.on('click' + ns, function() {\n\t\t\t\tif(!lock) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t};\n\n\t$.fn.destroyMfpFastClick = function() {\n\t\t$(this).off('touchstart' + ns + ' click' + ns);\n\t\tif(supportsTouch) _window.off('touchmove'+ns+' touchend'+ns);\n\t};\n})();\n\n/*>>fastclick*/\n})(window.jQuery || window.Zepto);"
  },
  {
    "path": "assets/css/main.css",
    "content": "/*! \n// ===========================================================\n// HPSTR Jekyll Theme\n// By: Michael Rose\n// ===========================================================\n*/\n\n*,\n*:after,\n*:before {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\n\naudio:not([controls]) {\n  display: none;\n}\n\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\na:hover,\na:active {\n  outline: 0;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nblockquote {\n  margin: 0;\n}\n\nimg {\n  width: auto\\9;\n  height: auto;\n  max-width: 100%;\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\n\nbutton,\ninput {\n  *overflow: visible;\n  line-height: normal;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  cursor: pointer;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n      -ms-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}\n\nbody {\n  margin-top: 26px;\n  font-size: 16px;\n}\n\n::-moz-selection {\n  color: #222222;\n  text-shadow: none;\n  background-color: #c8c8c8;\n}\n\n::selection {\n  color: #222222;\n  text-shadow: none;\n  background-color: #c8c8c8;\n}\n\n.wrap {\n  margin: 0 auto;\n}\n\n.all-caps {\n  text-transform: uppercase;\n}\n\n.pull-left {\n  float: left;\n}\n\n.pull-right {\n  float: right;\n}\n\n.unstyled-list {\n  padding-left: 0;\n  margin-left: 0;\n  list-style: none;\n}\n\n.unstyled-list li {\n  list-style-type: none;\n}\n\n.inline-list {\n  padding-left: 0;\n  margin-left: 0;\n  list-style: none;\n}\n\n.inline-list li {\n  display: inline;\n  list-style-type: none;\n}\n\nb,\ni,\nstrong,\nem,\nblockquote,\np,\nq,\nspan,\nfigure,\nimg,\nh1,\nh2,\nheader,\ninput,\na {\n  -webkit-transition: all 0.2s ease;\n     -moz-transition: all 0.2s ease;\n      -ms-transition: all 0.2s ease;\n       -o-transition: all 0.2s ease;\n          transition: all 0.2s ease;\n}\n\nbody {\n  font-family: 'Lato', Calibri, Arial, sans-serif;\n  color: #222222;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-family: 'Lato', Calibri, Arial, sans-serif;\n}\n\nh1 {\n  font-size: 32px;\n  font-size: 2rem;\n}\n\na {\n  color: #222222;\n  text-decoration: none;\n}\n\na:visited {\n  color: #555555;\n}\n\na:hover {\n  color: #000000;\n}\n\na:focus {\n  color: #000000;\n  outline: thin dotted;\n}\n\na:hover,\na:active {\n  outline: 0;\n}\n\n.link-arrow {\n  font-style: normal;\n  font-weight: 100;\n  text-decoration: underline;\n}\n\nfigcaption {\n  padding-top: 10px;\n  font-size: 14px;\n  font-size: 0.875rem;\n  line-height: 1.8571;\n  line-height: 1.3;\n  color: #3c3c3c;\n}\n\n.notice {\n  padding: .5em 1em;\n  margin-top: 1.5em;\n  font-size: 14px;\n  font-size: 0.875rem;\n  text-indent: 0;\n  background-color: #e8e8e8;\n  border: 1px solid #b5b5b5;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\nblockquote {\n  padding-left: 20px;\n  font-family: serif;\n  font-style: italic;\n  border-left: 8px solid #bbbbbb;\n}\n\n@media only screen and (min-width: 48em) {\n  blockquote {\n    margin-left: -28px;\n  }\n}\n\n.entry-content .footnotes ol,\n.entry-content .footnotes li,\n.entry-content .footnotes p {\n  margin-bottom: 26px;\n  margin-bottom: 1.625rem;\n  font-size: 14px;\n  font-size: 0.875rem;\n  line-height: 1.8571;\n}\n\ntt,\ncode,\nkbd,\nsamp,\npre {\n  font-family: monospace;\n}\n\np code,\nli code {\n  padding: 0 5px;\n  margin: 0 2px;\n  font-size: 12px;\n  font-size: 0.75rem;\n  line-height: 1.5;\n  white-space: nowrap;\n  background-color: #f2f2f2;\n  border: 1px solid #e6e6e6;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\npre {\n  overflow-x: auto;\n  font-size: 12px;\n  font-size: 0.75rem;\n  line-height: 1.5;\n}\n\npre::-webkit-scrollbar {\n  height: 12px;\n  background-color: #34362e;\n  border-radius: 0 0 4px 4px;\n}\n\npre::-webkit-scrollbar-thumb:horizontal {\n  background-color: #6a6d5d;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.highlight {\n  margin-bottom: 1.5em;\n  font-size: 12px;\n  font-size: 0.75rem;\n  line-height: 2.1667;\n  color: #d0d0d0;\n  background-color: #272822;\n  border: 1px solid #dbdbdb;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.highlight pre {\n  position: relative;\n  padding: 1em;\n  margin: 0;\n}\n\n.highlight .lineno {\n  padding-right: 24px;\n  color: #8f908a;\n}\n\n.highlight .hll {\n  background-color: #49483e;\n}\n\n.highlight .c {\n  color: #75715e;\n}\n\n.highlight .err {\n  color: #960050;\n  background-color: #1e0010;\n}\n\n.highlight .k {\n  color: #66d9ef;\n}\n\n.highlight .l {\n  color: #ae81ff;\n}\n\n.highlight .n {\n  color: #f8f8f2;\n}\n\n.highlight .o {\n  color: #f92672;\n}\n\n.highlight .p {\n  color: #f8f8f2;\n}\n\n.highlight .cm {\n  color: #75715e;\n}\n\n.highlight .cp {\n  color: #75715e;\n}\n\n.highlight .c1 {\n  color: #75715e;\n}\n\n.highlight .cs {\n  color: #75715e;\n}\n\n.highlight .ge {\n  font-style: italic;\n}\n\n.highlight .gs {\n  font-weight: bold;\n}\n\n.highlight .kc {\n  color: #66d9ef;\n}\n\n.highlight .kd {\n  color: #66d9ef;\n}\n\n.highlight .kn {\n  color: #f92672;\n}\n\n.highlight .kp {\n  color: #66d9ef;\n}\n\n.highlight .kr {\n  color: #66d9ef;\n}\n\n.highlight .kt {\n  color: #66d9ef;\n}\n\n.highlight .ld {\n  color: #e6db74;\n}\n\n.highlight .m {\n  color: #ae81ff;\n}\n\n.highlight .s {\n  color: #e6db74;\n}\n\n.highlight .na {\n  color: #a6e22e;\n}\n\n.highlight .nb {\n  color: #f8f8f2;\n}\n\n.highlight .nc {\n  color: #a6e22e;\n}\n\n.highlight .no {\n  color: #66d9ef;\n}\n\n.highlight .nd {\n  color: #a6e22e;\n}\n\n.highlight .ni {\n  color: #f8f8f2;\n}\n\n.highlight .ne {\n  color: #a6e22e;\n}\n\n.highlight .nf {\n  color: #a6e22e;\n}\n\n.highlight .nl {\n  color: #f8f8f2;\n}\n\n.highlight .nn {\n  color: #f8f8f2;\n}\n\n.highlight .nx {\n  color: #a6e22e;\n}\n\n.highlight .py {\n  color: #f8f8f2;\n}\n\n.highlight .nt {\n  color: #f92672;\n}\n\n.highlight .nv {\n  color: #f8f8f2;\n}\n\n.highlight .ow {\n  color: #f92672;\n}\n\n.highlight .w {\n  color: #f8f8f2;\n}\n\n.highlight .mf {\n  color: #ae81ff;\n}\n\n.highlight .mh {\n  color: #ae81ff;\n}\n\n.highlight .mi {\n  color: #ae81ff;\n}\n\n.highlight .mo {\n  color: #ae81ff;\n}\n\n.highlight .sb {\n  color: #e6db74;\n}\n\n.highlight .sc {\n  color: #e6db74;\n}\n\n.highlight .sd {\n  color: #e6db74;\n}\n\n.highlight .s2 {\n  color: #e6db74;\n}\n\n.highlight .se {\n  color: #ae81ff;\n}\n\n.highlight .sh {\n  color: #e6db74;\n}\n\n.highlight .si {\n  color: #e6db74;\n}\n\n.highlight .sx {\n  color: #e6db74;\n}\n\n.highlight .sr {\n  color: #e6db74;\n}\n\n.highlight .s1 {\n  color: #e6db74;\n}\n\n.highlight .ss {\n  color: #e6db74;\n}\n\n.highlight .bp {\n  color: #f8f8f2;\n}\n\n.highlight .vc {\n  color: #f8f8f2;\n}\n\n.highlight .vg {\n  color: #f8f8f2;\n}\n\n.highlight .vi {\n  color: #f8f8f2;\n}\n\n.highlight .il {\n  color: #ae81ff;\n}\n\n.CodeRay {\n  margin-bottom: 1.5em;\n  font-family: monospace;\n  font-size: 12px;\n  font-size: 0.75rem;\n  line-height: 2.1667;\n  color: #d0d0d0;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.CodeRay .code pre {\n  padding: 1em;\n  margin: 0;\n  background-color: #272822;\n  border: 1px solid #dbdbdb;\n}\n\nspan.CodeRay {\n  padding: 2px;\n  white-space: pre;\n  border: 0;\n}\n\ntable.CodeRay {\n  width: 100%;\n  padding: 2px;\n  border-collapse: collapse;\n}\n\ntable.CodeRay td {\n  padding: 1em 0.5em;\n  vertical-align: top;\n}\n\n.CodeRay .line-numbers,\n.CodeRay .no {\n  color: #8f908a;\n  text-align: right;\n}\n\n.CodeRay .line-numbers a {\n  color: #8f908a;\n}\n\n.CodeRay .line-numbers tt {\n  font-weight: bold;\n}\n\n.CodeRay .line-numbers .highlighted {\n  color: #ff0000;\n}\n\n.CodeRay .line {\n  display: block;\n  float: left;\n  width: 100%;\n}\n\n.CodeRay span.line-numbers {\n  padding: 0 24px 0 4px;\n}\n\n.CodeRay .code {\n  width: 100%;\n}\n\nol.CodeRay {\n  font-size: 10pt;\n}\n\nol.CodeRay li {\n  white-space: pre;\n}\n\n.CodeRay .code pre {\n  overflow: auto;\n}\n\n.CodeRay .debug {\n  color: white ! important;\n  background: blue ! important;\n}\n\n.CodeRay .doctype,\n.CodeRay .key,\n.CodeRay .instance-variable {\n  color: #f8f8f2;\n}\n\n.CodeRay .attribute-name {\n  color: #a6e22e;\n}\n\n.CodeRay .symbol,\n.CodeRay .integer,\n.CodeRay .float {\n  color: #ff658b;\n}\n\n.CodeRay .string {\n  color: #2dc900;\n}\n\n.CodeRay .keyword {\n  color: #66d9ef;\n}\n\n.CodeRay .function,\n.CodeRay .class {\n  color: #a6e22e;\n}\n\n.CodeRay .regexp,\n.CodeRay .constant,\n.CodeRay .tag {\n  color: #f92672;\n}\n\n.CodeRay .modifier,\n.CodeRay .predefined-constant {\n  color: #ff84e4;\n}\n\n.CodeRay .comment {\n  color: #75715e;\n}\n\n.CodeRay .error {\n  color: #ecc;\n}\n\n.CodeRay .content {\n  color: #e6db74;\n}\n\n.CodeRay .delimiter {\n  color: #e6db74;\n}\n\n.CodeRay .inline {\n  color: #e6db74;\n}\n\n.gist .highlight {\n  color: #000;\n}\n\n.gist .render-container .render-viewer-error,\n.gist .render-container .render-viewer-fatal,\n.gist .render-container .octospinner {\n  display: none;\n}\n\n.gist .gist-render iframe {\n  width: 100%;\n}\n\n.gist .gist-file.gist-render .highlight {\n  border: none;\n}\n\n.gist .gist-file .gist-meta .highlight a {\n  font-weight: 700;\n  color: #666;\n  text-decoration: none;\n}\n\n.gist .highlight {\n  background: #fff;\n}\n\n.gist .highlight .err {\n  color: #a61717;\n  background-color: #e3d2d2;\n}\n\n.gist .highlight .cp {\n  font-weight: 700;\n  color: #999;\n}\n\n.gist .highlight .cs {\n  font-style: italic;\n  font-weight: 700;\n  color: #999;\n}\n\n.gist .highlight .gd {\n  color: #000;\n  background-color: #fdd;\n}\n\n.gist .highlight .gd .x {\n  color: #000;\n  background-color: #faa;\n}\n\n.gist .highlight .ge {\n  font-style: italic;\n  color: #000;\n}\n\n.gist .highlight .gi {\n  color: #000;\n  background-color: #dfd;\n}\n\n.gist .highlight .gi .x {\n  color: #000;\n  background-color: #afa;\n}\n\n.gist .highlight .go {\n  color: #888;\n}\n\n.gist .highlight .gs {\n  font-weight: 700;\n}\n\n.gist .highlight .gu {\n  color: #aaa;\n}\n\n.gist .highlight .nb {\n  color: #0086b3;\n}\n\n.gist .highlight .ni {\n  color: purple;\n}\n\n.gist .highlight .nt {\n  color: navy;\n}\n\n.gist .highlight .w {\n  color: #bbb;\n}\n\n.gist .highlight .sr {\n  color: #009926;\n}\n\n.gist .highlight .ss {\n  color: #990073;\n}\n\n.gist .highlight .c,\n.gist .highlight .cm,\n.gist .highlight .c1 {\n  font-style: italic;\n  color: #998;\n}\n\n.gist .highlight .k,\n.gist .highlight .o,\n.gist .highlight .kc,\n.gist .highlight .kd,\n.gist .highlight .kp,\n.gist .highlight .kr,\n.gist .highlight .ow,\n.gist .highlight .n,\n.gist .highlight .p {\n  font-weight: 700;\n  color: #000;\n}\n\n.gist .highlight .gr,\n.gist .highlight .gt {\n  color: #a00;\n}\n\n.gist .highlight .gh,\n.gist .highlight .bp {\n  color: #999;\n}\n\n.gist .highlight .gp,\n.gist .highlight .nn {\n  color: #555;\n}\n\n.gist .highlight .kt,\n.gist .highlight .nc {\n  font-weight: 700;\n  color: #458;\n}\n\n.gist .highlight .m,\n.gist .highlight .mf,\n.gist .highlight .mh,\n.gist .highlight .mi,\n.gist .highlight .mo,\n.gist .highlight .il {\n  color: #099;\n}\n\n.gist .highlight .s,\n.gist .highlight .sb,\n.gist .highlight .sc,\n.gist .highlight .sd,\n.gist .highlight .s2,\n.gist .highlight .se,\n.gist .highlight .sh,\n.gist .highlight .si,\n.gist .highlight .sx,\n.gist .highlight .s1 {\n  color: #d14;\n}\n\n.gist .highlight .na,\n.gist .highlight .no,\n.gist .highlight .nv,\n.gist .highlight .vc,\n.gist .highlight .vg,\n.gist .highlight .vi {\n  color: teal;\n}\n\n.gist .highlight .ne,\n.gist .highlight .nf {\n  font-weight: 700;\n  color: #900;\n}\n\n.clearfix {\n  *zoom: 1;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n\n.visuallyhidden.focusable:active,\n.visuallyhidden.focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n\nhr {\n  display: block;\n  height: 1px;\n  padding: 0;\n  margin: 1em 0;\n  border: 0;\n  border-top: 1px solid #ccc;\n  border-bottom: 1px solid #fff;\n}\n\nfigure {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  margin: 0;\n  *zoom: 1;\n}\n\nfigure:before,\nfigure:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\nfigure:after {\n  clear: both;\n}\n\nfigure img {\n  margin-bottom: 10px;\n}\n\nfigure a img {\n  -webkit-transform: translate(0, 0);\n     -moz-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n       -o-transform: translate(0, 0);\n          transform: translate(0, 0);\n  -webkit-transition-duration: 0.25s;\n     -moz-transition-duration: 0.25s;\n       -o-transition-duration: 0.25s;\n}\n\nfigure a img:hover {\n  -webkit-transform: translate(0, -5px);\n     -moz-transform: translate(0, -5px);\n      -ms-transform: translate(0, -5px);\n       -o-transform: translate(0, -5px);\n          transform: translate(0, -5px);\n  -webkit-box-shadow: 0 0 10px rgba(34, 34, 34, 0.2);\n     -moz-box-shadow: 0 0 10px rgba(34, 34, 34, 0.2);\n          box-shadow: 0 0 10px rgba(34, 34, 34, 0.2);\n}\n\n@media only screen and (min-width: 62.5em) {\n  figure.half img {\n    float: left;\n    width: 310px;\n    margin-right: 10px;\n  }\n  figure.half figcaption {\n    clear: left;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  figure.third img {\n    float: left;\n    width: 200px;\n    margin-right: 10px;\n  }\n  figure.third figcaption {\n    clear: left;\n  }\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n.btn {\n  display: inline-block;\n  padding: 8px 20px;\n  margin-bottom: 20px;\n  font-size: 14px;\n  font-size: 0.875rem;\n  color: #ffffff;\n  background-color: #222222;\n  border-color: #222222;\n  border-style: solid !important;\n  border-width: 2px !important;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.btn:visited {\n  color: #ffffff;\n}\n\n.btn:hover {\n  color: #222222;\n  background-color: #ffffff;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #5cb85c;\n}\n\n.btn-success:visited {\n  color: #ffffff;\n}\n\n.btn-success:hover {\n  color: #5cb85c;\n  background-color: #ffffff;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #dd8338;\n  border-color: #dd8338;\n}\n\n.btn-warning:visited {\n  color: #ffffff;\n}\n\n.btn-warning:hover {\n  color: #dd8338;\n  background-color: #ffffff;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #c64537;\n  border-color: #c64537;\n}\n\n.btn-danger:visited {\n  color: #ffffff;\n}\n\n.btn-danger:hover {\n  color: #c64537;\n  background-color: #ffffff;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #308cbc;\n  border-color: #308cbc;\n}\n\n.btn-info:visited {\n  color: #ffffff;\n}\n\n.btn-info:hover {\n  color: #308cbc;\n  background-color: #ffffff;\n}\n\n.well {\n  padding: 20px;\n  border: 1px solid #222222;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.animated {\n  -webkit-animation-duration: 1s;\n     -moz-animation-duration: 1s;\n      -ms-animation-duration: 1s;\n       -o-animation-duration: 1s;\n          animation-duration: 1s;\n  -webkit-animation-fill-mode: both;\n     -moz-animation-fill-mode: both;\n      -ms-animation-fill-mode: both;\n       -o-animation-fill-mode: both;\n          animation-fill-mode: both;\n}\n\n.animated.hinge {\n  -webkit-animation-duration: 2s;\n     -moz-animation-duration: 2s;\n      -ms-animation-duration: 2s;\n       -o-animation-duration: 2s;\n          animation-duration: 2s;\n}\n\n@-webkit-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@-moz-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@-o-keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n@keyframes fadeIn {\n  0% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n}\n\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n     -moz-animation-name: fadeIn;\n       -o-animation-name: fadeIn;\n          animation-name: fadeIn;\n}\n\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-20px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-20px);\n  }\n  100% {\n    opacity: 1;\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-20px);\n  }\n  100% {\n    opacity: 1;\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-20px);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n     -moz-animation-name: fadeInDown;\n       -o-animation-name: fadeInDown;\n          animation-name: fadeInDown;\n}\n\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    transform: translateY(-2000px);\n  }\n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n     -moz-animation-name: fadeInDownBig;\n       -o-animation-name: fadeInDownBig;\n          animation-name: fadeInDownBig;\n}\n\n@-webkit-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(0.3);\n  }\n  50% {\n    opacity: 1;\n    -webkit-transform: scale(1.05);\n  }\n  70% {\n    -webkit-transform: scale(0.9);\n  }\n  100% {\n    -webkit-transform: scale(1);\n  }\n}\n\n@-moz-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -moz-transform: scale(0.3);\n  }\n  50% {\n    opacity: 1;\n    -moz-transform: scale(1.05);\n  }\n  70% {\n    -moz-transform: scale(0.9);\n  }\n  100% {\n    -moz-transform: scale(1);\n  }\n}\n\n@-o-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -o-transform: scale(0.3);\n  }\n  50% {\n    opacity: 1;\n    -o-transform: scale(1.05);\n  }\n  70% {\n    -o-transform: scale(0.9);\n  }\n  100% {\n    -o-transform: scale(1);\n  }\n}\n\n@keyframes bounceIn {\n  0% {\n    opacity: 0;\n    transform: scale(0.3);\n  }\n  50% {\n    opacity: 1;\n    transform: scale(1.05);\n  }\n  70% {\n    transform: scale(0.9);\n  }\n  100% {\n    transform: scale(1);\n  }\n}\n\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n     -moz-animation-name: bounceIn;\n       -o-animation-name: bounceIn;\n          animation-name: bounceIn;\n}\n\n@-webkit-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-2000px);\n  }\n  60% {\n    opacity: 1;\n    -webkit-transform: translateY(30px);\n  }\n  80% {\n    -webkit-transform: translateY(-10px);\n  }\n  100% {\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-2000px);\n  }\n  60% {\n    opacity: 1;\n    -moz-transform: translateY(30px);\n  }\n  80% {\n    -moz-transform: translateY(-10px);\n  }\n  100% {\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-2000px);\n  }\n  60% {\n    opacity: 1;\n    -o-transform: translateY(30px);\n  }\n  80% {\n    -o-transform: translateY(-10px);\n  }\n  100% {\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-2000px);\n  }\n  60% {\n    opacity: 1;\n    transform: translateY(30px);\n  }\n  80% {\n    transform: translateY(-10px);\n  }\n  100% {\n    transform: translateY(0);\n  }\n}\n\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n     -moz-animation-name: bounceInDown;\n       -o-animation-name: bounceInDown;\n          animation-name: bounceInDown;\n}\n\n@-webkit-keyframes drop {\n  0% {\n    -webkit-transform: translateY(-500px);\n  }\n  100% {\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes drop {\n  0% {\n    -moz-transform: translateY(-500px);\n  }\n  100% {\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes drop {\n  0% {\n    -o-transform: translateY(-500px);\n  }\n  100% {\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes drop {\n  0% {\n    transform: translateY(-500px);\n  }\n  100% {\n    transform: translateY(0);\n  }\n}\n\n.drop {\n  -webkit-animation-name: drop;\n     -moz-animation-name: drop;\n       -o-animation-name: drop;\n          animation-name: drop;\n}\n\n.dl-menuwrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1000;\n  width: 100%;\n  -webkit-perspective: 1000px;\n     -moz-perspective: 1000px;\n          perspective: 1000px;\n  -webkit-perspective-origin: 50% 200%;\n     -moz-perspective-origin: 50% 200%;\n          perspective-origin: 50% 200%;\n}\n\n@media only screen and (min-width: 48em) {\n  .dl-menuwrapper {\n    position: fixed;\n    top: 25px;\n    left: 25px;\n    max-width: 175px;\n  }\n}\n\n.dl-menuwrapper button {\n  position: relative;\n  top: 0;\n  left: 0;\n  width: 48px;\n  height: 45px;\n  overflow: hidden;\n  text-indent: -900em;\n  cursor: pointer;\n  background: #222222;\n  border: none;\n  -webkit-border-top-right-radius: 0;\n          border-top-right-radius: 0;\n  -webkit-border-bottom-right-radius: 3px;\n          border-bottom-right-radius: 3px;\n  -webkit-border-bottom-left-radius: 0;\n          border-bottom-left-radius: 0;\n  -webkit-border-top-left-radius: 0;\n          border-top-left-radius: 0;\n  -moz-border-radius-topright: 0;\n  -moz-border-radius-bottomright: 3px;\n  -moz-border-radius-bottomleft: 0;\n  -moz-border-radius-topleft: 0;\n  outline: none;\n  opacity: 0.6;\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n@media only screen and (min-width: 48em) {\n  .dl-menuwrapper button {\n    -webkit-border-top-right-radius: 3px;\n            border-top-right-radius: 3px;\n    -webkit-border-bottom-right-radius: 3px;\n            border-bottom-right-radius: 3px;\n    -webkit-border-bottom-left-radius: 3px;\n            border-bottom-left-radius: 3px;\n    -webkit-border-top-left-radius: 3px;\n            border-top-left-radius: 3px;\n    -moz-border-radius-topright: 3px;\n    -moz-border-radius-bottomright: 3px;\n    -moz-border-radius-bottomleft: 3px;\n    -moz-border-radius-topleft: 3px;\n    -webkit-background-clip: padding-box;\n       -moz-background-clip: padding;\n            background-clip: padding-box;\n  }\n}\n\n.dl-menuwrapper button:hover,\n.dl-menuwrapper button.dl-active,\n.dl-menuwrapper ul {\n  background: #aaa;\n}\n\n.dl-menuwrapper button:after {\n  position: absolute;\n  top: 10px;\n  left: 16%;\n  width: 68%;\n  height: 5px;\n  background: #ffffff;\n  content: '';\n  box-shadow: 0 10px 0 #ffffff, 0 20px 0 #ffffff;\n}\n\n.dl-menuwrapper button.dl-active {\n  display: none;\n}\n\n.dl-menuwrapper ul {\n  padding: 0;\n  list-style: none;\n  -webkit-transform-style: preserve-3d;\n     -moz-transform-style: preserve-3d;\n          transform-style: preserve-3d;\n}\n\n.dl-menuwrapper li {\n  position: relative;\n}\n\n.dl-menuwrapper li h4 {\n  padding: 15px 20px 0;\n  margin: 0;\n  color: rgba(255, 255, 255, 0.9);\n}\n\n.dl-menuwrapper li p {\n  padding: 15px 20px;\n  margin: 0;\n  font-size: 14px;\n  font-size: 0.875rem;\n  color: rgba(255, 255, 255, 0.8);\n}\n\n.dl-menuwrapper li p a {\n  display: inline;\n  padding: 0;\n  font-size: 14px;\n  font-size: 0.875rem;\n}\n\n.dl-menuwrapper li i {\n  display: inline-block;\n  width: 2em;\n}\n\n.dl-menuwrapper li a {\n  position: relative;\n  display: block;\n  padding: 15px 20px;\n  font-size: 14px;\n  font-size: 0.875rem;\n  font-weight: 300;\n  line-height: 20px;\n  color: #ffffff;\n  outline: none;\n}\n\n.dl-menuwrapper li.dl-back > a {\n  padding-left: 30px;\n  background: rgba(0, 0, 0, 0.2);\n}\n\n.dl-menuwrapper li.dl-back:after,\n.dl-menuwrapper li > a:not(:only-child):after {\n  position: absolute;\n  top: 0;\n  font-family: 'fontawesome';\n  -webkit-font-smoothing: antialiased;\n  line-height: 50px;\n  color: #ffffff;\n  content: \"\\f105\";\n  speak: none;\n}\n\n.dl-menuwrapper li.dl-back:after {\n  left: 10px;\n  color: rgba(212, 204, 198, 0.5);\n  -webkit-transform: rotate(180deg);\n     -moz-transform: rotate(180deg);\n          transform: rotate(180deg);\n}\n\n.dl-menuwrapper li > a:after {\n  right: 10px;\n  color: rgba(0, 0, 0, 0.15);\n}\n\n.dl-menuwrapper .dl-menu {\n  position: absolute;\n  width: 100%;\n  max-width: 400px;\n  max-height: 600px;\n  margin: 0;\n  overflow-y: auto;\n  pointer-events: none;\n  opacity: 0;\n  -webkit-transform: translateY(10px);\n     -moz-transform: translateY(10px);\n          transform: translateY(10px);\n  box-shadow: 0 12px 24px rgba(0, 0, 0, 0.35);\n  -webkit-backface-visibility: hidden;\n     -moz-backface-visibility: hidden;\n          backface-visibility: hidden;\n}\n\n@media only screen and (min-width: 48em) {\n  .dl-menuwrapper .dl-menu {\n    max-height: 650px;\n    -webkit-border-top-right-radius: 3px;\n            border-top-right-radius: 3px;\n    -webkit-border-bottom-right-radius: 3px;\n            border-bottom-right-radius: 3px;\n    -webkit-border-bottom-left-radius: 3px;\n            border-bottom-left-radius: 3px;\n    -webkit-border-top-left-radius: 3px;\n            border-top-left-radius: 3px;\n    -moz-border-radius-topright: 3px;\n    -moz-border-radius-bottomright: 3px;\n    -moz-border-radius-bottomleft: 3px;\n    -moz-border-radius-topleft: 3px;\n    -webkit-background-clip: padding-box;\n       -moz-background-clip: padding;\n            background-clip: padding-box;\n  }\n}\n\n.dl-menuwrapper .dl-menu.dl-menu-toggle {\n  -webkit-transition: all 0.3s ease;\n     -moz-transition: all 0.3s ease;\n          transition: all 0.3s ease;\n}\n\n.dl-menuwrapper .dl-menu.dl-menuopen {\n  pointer-events: auto;\n  opacity: 1;\n  -webkit-transform: translateY(0);\n     -moz-transform: translateY(0);\n          transform: translateY(0);\n}\n\n.dl-menuwrapper .dl-submenu {\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n  box-shadow: 0 12px 24px rgba(0, 0, 0, 0.35);\n}\n\n.dl-menuwrapper li .dl-submenu {\n  display: none;\n}\n\n/* \nWhen a submenu is openend, we will hide all li siblings.\nFor that we give a class to the parent menu called \"dl-subview\".\nWe also hide the submenu link. \nThe opened submenu will get the class \"dl-subviewopen\".\nAll this is done for any sub-level being entered.\n*/\n\n.dl-menu.dl-subview li,\n.dl-menu.dl-subview li.dl-subviewopen > a,\n.dl-menu.dl-subview li.dl-subview > a {\n  display: none;\n}\n\n.dl-menu.dl-subview li.dl-subview,\n.dl-menu.dl-subview li.dl-subview .dl-submenu,\n.dl-menu.dl-subview li.dl-subviewopen,\n.dl-menu.dl-subview li.dl-subviewopen > .dl-submenu,\n.dl-menu.dl-subview li.dl-subviewopen > .dl-submenu > li {\n  display: block;\n}\n\n/* Animation classes for moving out and in */\n\n.dl-menu.dl-animate-out {\n  -webkit-animation: MenuAnimOut 0.4s ease;\n     -moz-animation: MenuAnimOut 0.4s ease;\n          animation: MenuAnimOut 0.4s ease;\n}\n\n@-webkit-keyframes MenuAnimOut {\n  100% {\n    opacity: 0;\n    -webkit-transform: translateZ(300px);\n  }\n}\n\n@-moz-keyframes MenuAnimOut {\n  100% {\n    opacity: 0;\n    -moz-transform: translateZ(300px);\n  }\n}\n\n@keyframes MenuAnimOut {\n  100% {\n    opacity: 0;\n    transform: translateZ(300px);\n  }\n}\n\n.dl-menu.dl-animate-in {\n  -webkit-animation: MenuAnimIn 0.4s ease;\n     -moz-animation: MenuAnimIn 0.4s ease;\n          animation: MenuAnimIn 0.4s ease;\n}\n\n@-webkit-keyframes MenuAnimIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateZ(300px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateZ(0);\n  }\n}\n\n@-moz-keyframes MenuAnimIn {\n  0% {\n    opacity: 0;\n    -moz-transform: translateZ(300px);\n  }\n  100% {\n    opacity: 1;\n    -moz-transform: translateZ(0);\n  }\n}\n\n@keyframes MenuAnimIn {\n  0% {\n    opacity: 0;\n    transform: translateZ(300px);\n  }\n  100% {\n    opacity: 1;\n    transform: translateZ(0);\n  }\n}\n\n.dl-menuwrapper > .dl-submenu.dl-animate-in {\n  -webkit-animation: SubMenuAnimIn 0.4s ease;\n     -moz-animation: SubMenuAnimIn 0.4s ease;\n          animation: SubMenuAnimIn 0.4s ease;\n}\n\n@-webkit-keyframes SubMenuAnimIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateZ(-300px);\n  }\n  100% {\n    opacity: 1;\n    -webkit-transform: translateZ(0);\n  }\n}\n\n@-moz-keyframes SubMenuAnimIn {\n  0% {\n    opacity: 0;\n    -moz-transform: translateZ(-300px);\n  }\n  100% {\n    opacity: 1;\n    -moz-transform: translateZ(0);\n  }\n}\n\n@keyframes SubMenuAnimIn {\n  0% {\n    opacity: 0;\n    transform: translateZ(-300px);\n  }\n  100% {\n    opacity: 1;\n    transform: translateZ(0);\n  }\n}\n\n.dl-menuwrapper > .dl-submenu.dl-animate-out {\n  -webkit-animation: SubMenuAnimOut 0.4s ease;\n     -moz-animation: SubMenuAnimOut 0.4s ease;\n          animation: SubMenuAnimOut 0.4s ease;\n}\n\n@-webkit-keyframes SubMenuAnimOut {\n  0% {\n    opacity: 1;\n    -webkit-transform: translateZ(0);\n  }\n  100% {\n    opacity: 0;\n    -webkit-transform: translateZ(-300px);\n  }\n}\n\n@-moz-keyframes SubMenuAnimOut {\n  0% {\n    opacity: 1;\n    -moz-transform: translateZ(0);\n  }\n  100% {\n    opacity: 0;\n    -moz-transform: translateZ(-300px);\n  }\n}\n\n@keyframes SubMenuAnimOut {\n  0% {\n    opacity: 1;\n    transform: translateZ(0);\n  }\n  100% {\n    opacity: 0;\n    transform: translateZ(-300px);\n  }\n}\n\n/* No Touch Fallback */\n\n.no-touch .dl-menuwrapper li a:hover {\n  background: rgba(255, 248, 213, 0.1);\n}\n\n/* No JS Fallback */\n\n.no-js .dl-trigger {\n  display: none;\n}\n\n.no-js .dl-menuwrapper .dl-menu {\n  position: relative;\n  pointer-events: auto;\n  opacity: 1;\n  -webkit-transform: none;\n     -moz-transform: none;\n          transform: none;\n}\n\n.no-js .dl-menuwrapper li .dl-submenu {\n  display: block;\n}\n\n.no-js .dl-menuwrapper li.dl-back {\n  display: none;\n}\n\n.no-js .dl-menuwrapper li > a:not(:only-child) {\n  background: rgba(0, 0, 0, 0.1);\n}\n\n.no-js .dl-menuwrapper li > a:not(:only-child):after {\n  content: '';\n}\n\n.dl-menuwrapper button:hover,\n.dl-menuwrapper button.dl-active,\n.dl-menuwrapper ul {\n  background: #222222;\n}\n\n.dl-menu li {\n  display: none;\n}\n\n.dl-menuopen li {\n  display: block;\n}\n\n/*!\n *  Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  font-style: normal;\n  font-weight: normal;\n  src: url('//netdna.bootstrapcdn.com/font-awesome/4.1.0/fonts/fontawesome-webfont.eot?v=4.1.0');\n  src: url('//netdna.bootstrapcdn.com/font-awesome/4.1.0/fonts/fontawesome-webfont.eot?#iefix&v=4.1.0') format('embedded-opentype'), url('//netdna.bootstrapcdn.com/font-awesome/4.1.0/fonts/fontawesome-webfont.woff?v=4.1.0') format('woff'), url('//netdna.bootstrapcdn.com/font-awesome/4.1.0/fonts/fontawesome-webfont.ttf?v=4.1.0') format('truetype'), url('//netdna.bootstrapcdn.com/font-awesome/4.1.0/fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular') format('svg');\n}\n\n.fa {\n  display: inline-block;\n  font-family: FontAwesome;\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n/* makes the font 33% larger relative to the icon container */\n\n.fa-lg {\n  font-size: 1.3333333333333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n\n.fa-2x {\n  font-size: 2em;\n}\n\n.fa-3x {\n  font-size: 3em;\n}\n\n.fa-4x {\n  font-size: 4em;\n}\n\n.fa-5x {\n  font-size: 5em;\n}\n\n.fa-fw {\n  width: 1.2857142857142858em;\n  text-align: center;\n}\n\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.142857142857143em;\n  list-style-type: none;\n}\n\n.fa-ul > li {\n  position: relative;\n}\n\n.fa-li {\n  position: absolute;\n  top: 0.14285714285714285em;\n  left: -2.142857142857143em;\n  width: 2.142857142857143em;\n  text-align: center;\n}\n\n.fa-li.fa-lg {\n  left: -1.8571428571428572em;\n}\n\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n\n.pull-right {\n  float: right;\n}\n\n.pull-left {\n  float: left;\n}\n\n.fa.pull-left {\n  margin-right: .3em;\n}\n\n.fa.pull-right {\n  margin-left: .3em;\n}\n\n.fa-spin {\n  -webkit-animation: spin 2s infinite linear;\n     -moz-animation: spin 2s infinite linear;\n       -o-animation: spin 2s infinite linear;\n          animation: spin 2s infinite linear;\n}\n\n@-moz-keyframes spin {\n  0% {\n    -moz-transform: rotate(0deg);\n  }\n  100% {\n    -moz-transform: rotate(359deg);\n  }\n}\n\n@-webkit-keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n  }\n}\n\n@-o-keyframes spin {\n  0% {\n    -o-transform: rotate(0deg);\n  }\n  100% {\n    -o-transform: rotate(359deg);\n  }\n}\n\n@keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n.fa-rotate-90 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n  -webkit-transform: rotate(90deg);\n     -moz-transform: rotate(90deg);\n      -ms-transform: rotate(90deg);\n       -o-transform: rotate(90deg);\n          transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n  -webkit-transform: rotate(180deg);\n     -moz-transform: rotate(180deg);\n      -ms-transform: rotate(180deg);\n       -o-transform: rotate(180deg);\n          transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n  -webkit-transform: rotate(270deg);\n     -moz-transform: rotate(270deg);\n      -ms-transform: rotate(270deg);\n       -o-transform: rotate(270deg);\n          transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n  -webkit-transform: scale(-1, 1);\n     -moz-transform: scale(-1, 1);\n      -ms-transform: scale(-1, 1);\n       -o-transform: scale(-1, 1);\n          transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n  -webkit-transform: scale(1, -1);\n     -moz-transform: scale(1, -1);\n      -ms-transform: scale(1, -1);\n       -o-transform: scale(1, -1);\n          transform: scale(1, -1);\n}\n\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n\n.fa-stack-1x {\n  line-height: inherit;\n}\n\n.fa-stack-2x {\n  font-size: 2em;\n}\n\n.fa-inverse {\n  color: #ffffff;\n}\n\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.fa-glass:before {\n  content: \"\\f000\";\n}\n\n.fa-music:before {\n  content: \"\\f001\";\n}\n\n.fa-search:before {\n  content: \"\\f002\";\n}\n\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n\n.fa-heart:before {\n  content: \"\\f004\";\n}\n\n.fa-star:before {\n  content: \"\\f005\";\n}\n\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n\n.fa-user:before {\n  content: \"\\f007\";\n}\n\n.fa-film:before {\n  content: \"\\f008\";\n}\n\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n\n.fa-th:before {\n  content: \"\\f00a\";\n}\n\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n\n.fa-check:before {\n  content: \"\\f00c\";\n}\n\n.fa-times:before {\n  content: \"\\f00d\";\n}\n\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n\n.fa-signal:before {\n  content: \"\\f012\";\n}\n\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n\n.fa-home:before {\n  content: \"\\f015\";\n}\n\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n\n.fa-road:before {\n  content: \"\\f018\";\n}\n\n.fa-download:before {\n  content: \"\\f019\";\n}\n\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n\n.fa-lock:before {\n  content: \"\\f023\";\n}\n\n.fa-flag:before {\n  content: \"\\f024\";\n}\n\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n\n.fa-book:before {\n  content: \"\\f02d\";\n}\n\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n\n.fa-print:before {\n  content: \"\\f02f\";\n}\n\n.fa-camera:before {\n  content: \"\\f030\";\n}\n\n.fa-font:before {\n  content: \"\\f031\";\n}\n\n.fa-bold:before {\n  content: \"\\f032\";\n}\n\n.fa-italic:before {\n  content: \"\\f033\";\n}\n\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n\n.fa-list:before {\n  content: \"\\f03a\";\n}\n\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n\n.fa-tint:before {\n  content: \"\\f043\";\n}\n\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n\n.fa-play:before {\n  content: \"\\f04b\";\n}\n\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n\n.fa-eject:before {\n  content: \"\\f052\";\n}\n\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n\n.fa-expand:before {\n  content: \"\\f065\";\n}\n\n.fa-compress:before {\n  content: \"\\f066\";\n}\n\n.fa-plus:before {\n  content: \"\\f067\";\n}\n\n.fa-minus:before {\n  content: \"\\f068\";\n}\n\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n\n.fa-plane:before {\n  content: \"\\f072\";\n}\n\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n\n.fa-random:before {\n  content: \"\\f074\";\n}\n\n.fa-comment:before {\n  content: \"\\f075\";\n}\n\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n\n.fa-bar-chart-o:before {\n  content: \"\\f080\";\n}\n\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n\n.fa-key:before {\n  content: \"\\f084\";\n}\n\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n\n.fa-comments:before {\n  content: \"\\f086\";\n}\n\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n\n.fa-upload:before {\n  content: \"\\f093\";\n}\n\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n\n.fa-phone:before {\n  content: \"\\f095\";\n}\n\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n\n.fa-github:before {\n  content: \"\\f09b\";\n}\n\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n\n.fa-circle:before {\n  content: \"\\f111\";\n}\n\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n\n.fa-code:before {\n  content: \"\\f121\";\n}\n\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n\n.fa-crop:before {\n  content: \"\\f125\";\n}\n\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n\n.fa-question:before {\n  content: \"\\f128\";\n}\n\n.fa-info:before {\n  content: \"\\f129\";\n}\n\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n\n.fa-shield:before {\n  content: \"\\f132\";\n}\n\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n\n.fa-file:before {\n  content: \"\\f15b\";\n}\n\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n\n.fa-xing:before {\n  content: \"\\f168\";\n}\n\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n\n.fa-adn:before {\n  content: \"\\f170\";\n}\n\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n\n.fa-apple:before {\n  content: \"\\f179\";\n}\n\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n\n.fa-android:before {\n  content: \"\\f17b\";\n}\n\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n\n.fa-trello:before {\n  content: \"\\f181\";\n}\n\n.fa-female:before {\n  content: \"\\f182\";\n}\n\n.fa-male:before {\n  content: \"\\f183\";\n}\n\n.fa-gittip:before {\n  content: \"\\f184\";\n}\n\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n\n.fa-archive:before {\n  content: \"\\f187\";\n}\n\n.fa-bug:before {\n  content: \"\\f188\";\n}\n\n.fa-vk:before {\n  content: \"\\f189\";\n}\n\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n\n.fa-slack:before {\n  content: \"\\f198\";\n}\n\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n\n.fa-pied-piper-square:before,\n.fa-pied-piper:before {\n  content: \"\\f1a7\";\n}\n\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n\n.fa-life-bouy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n\n.fa-ra:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n\n.fa-history:before {\n  content: \"\\f1da\";\n}\n\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n\n/* Magnific Popup CSS */\n\n.mfp-bg {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 502;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  background: #0b0b0b;\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n\n.mfp-wrap {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 503;\n  width: 100%;\n  height: 100%;\n  outline: none !important;\n  -webkit-backface-visibility: hidden;\n}\n\n.mfp-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  padding: 0 8px;\n  text-align: center;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n.mfp-container:before {\n  display: inline-block;\n  height: 100%;\n  vertical-align: middle;\n  content: '';\n}\n\n.mfp-align-top .mfp-container:before {\n  display: none;\n}\n\n.mfp-content {\n  position: relative;\n  z-index: 505;\n  display: inline-block;\n  margin: 0 auto;\n  text-align: left;\n  vertical-align: middle;\n}\n\n.mfp-inline-holder .mfp-content,\n.mfp-ajax-holder .mfp-content {\n  width: 100%;\n  cursor: auto;\n}\n\n.mfp-inline-holder .mfp-content:after,\n.mfp-ajax-holder .mfp-content:after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: -1;\n  display: block;\n  width: auto;\n  height: auto;\n  content: '';\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);\n}\n\n.mfp-ajax-cur {\n  cursor: progress;\n}\n\n.mfp-zoom-out-cur,\n.mfp-zoom-out-cur .mfp-image-holder .mfp-close {\n  cursor: -moz-zoom-out;\n  cursor: -webkit-zoom-out;\n  cursor: zoom-out;\n}\n\n.mfp-zoom,\n.image-popup {\n  cursor: pointer;\n  cursor: -webkit-zoom-in;\n  cursor: -moz-zoom-in;\n  cursor: zoom-in;\n}\n\n.mfp-auto-cursor .mfp-content {\n  cursor: auto;\n}\n\n.mfp-close,\n.mfp-arrow,\n.mfp-preloader,\n.mfp-counter {\n  -webkit-user-select: none;\n     -moz-user-select: none;\n          user-select: none;\n}\n\n.mfp-loading.mfp-figure {\n  display: none;\n}\n\n.mfp-hide {\n  display: none !important;\n}\n\n.mfp-preloader {\n  position: absolute;\n  top: 50%;\n  right: 8px;\n  left: 8px;\n  z-index: 504;\n  width: auto;\n  margin-top: -0.8em;\n  color: #cccccc;\n  text-align: center;\n}\n\n.mfp-preloader a {\n  color: #cccccc;\n}\n\n.mfp-preloader a:hover {\n  color: white;\n}\n\n.mfp-s-ready .mfp-preloader {\n  display: none;\n}\n\n.mfp-s-error .mfp-content {\n  display: none;\n}\n\nbutton.mfp-close,\nbutton.mfp-arrow {\n  z-index: 506;\n  display: block;\n  padding: 0;\n  overflow: visible;\n  cursor: pointer;\n  border: 0;\n  -webkit-appearance: none;\n}\n\nbutton.mfp-close {\n  background: transparent;\n}\n\nbutton::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\n.mfp-close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 44px;\n  height: 44px;\n  padding: 0 0 18px 10px;\n  font-family: Arial, Baskerville, monospace;\n  font-size: 28px;\n  font-style: normal;\n  line-height: 44px;\n  color: white;\n  text-align: center;\n  text-decoration: none;\n  opacity: 0.65;\n}\n\n.mfp-close:hover,\n.mfp-close:focus {\n  opacity: 1;\n}\n\n.mfp-close:active {\n  top: 1px;\n}\n\n.mfp-close-btn-in .mfp-close {\n  color: #333333;\n}\n\n.mfp-image-holder .mfp-close,\n.mfp-iframe-holder .mfp-close {\n  right: -6px;\n  width: 100%;\n  padding-right: 6px;\n  color: white;\n  text-align: right;\n}\n\n.mfp-counter {\n  position: absolute;\n  top: 0;\n  right: 0;\n  font-size: 12px;\n  line-height: 18px;\n  color: #cccccc;\n}\n\n.mfp-arrow {\n  position: absolute;\n  top: 0;\n  top: 50%;\n  width: 90px;\n  height: 110px;\n  padding: 0;\n  margin: 0;\n  margin-top: -55px;\n  overflow: hidden;\n  text-indent: 100%;\n  white-space: nowrap;\n  background-color: #000000;\n  opacity: 0.65;\n  -webkit-transition: opacity 0.2s ease-in-out;\n     -moz-transition: opacity 0.2s ease-in-out;\n      -ms-transition: opacity 0.2s ease-in-out;\n       -o-transition: opacity 0.2s ease-in-out;\n          transition: opacity 0.2s ease-in-out;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n.mfp-arrow:active {\n  margin-top: -54px;\n}\n\n.mfp-arrow:hover,\n.mfp-arrow:focus {\n  opacity: 1;\n}\n\n.mfp-arrow:before,\n.mfp-arrow:after,\n.mfp-arrow .mfp-b,\n.mfp-arrow .mfp-a {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 0;\n  height: 0;\n  margin-top: 35px;\n  margin-left: 35px;\n  border: solid transparent;\n  content: '';\n}\n\n.mfp-arrow:after,\n.mfp-arrow .mfp-a {\n  top: 8px;\n  border-top-width: 12px;\n  border-bottom-width: 12px;\n  opacity: 0.8;\n}\n\n.mfp-arrow:before,\n.mfp-arrow .mfp-b {\n  border-top-width: 20px;\n  border-bottom-width: 20px;\n}\n\n.mfp-arrow-left {\n  left: 0;\n  -webkit-border-top-right-radius: 5px;\n          border-top-right-radius: 5px;\n  -webkit-border-bottom-right-radius: 5px;\n          border-bottom-right-radius: 5px;\n  -webkit-border-bottom-left-radius: 0;\n          border-bottom-left-radius: 0;\n  -webkit-border-top-left-radius: 0;\n          border-top-left-radius: 0;\n  -moz-border-radius-topright: 5px;\n  -moz-border-radius-bottomright: 5px;\n  -moz-border-radius-bottomleft: 0;\n  -moz-border-radius-topleft: 0;\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n.mfp-arrow-left:after,\n.mfp-arrow-left .mfp-a {\n  left: 5px;\n  border-right: 12px solid #fff;\n}\n\n.mfp-arrow-left:before,\n.mfp-arrow-left .mfp-b {\n  border-right: 20px solid #fff;\n}\n\n.mfp-arrow-right {\n  right: 0;\n  -webkit-border-top-right-radius: 0;\n          border-top-right-radius: 0;\n  -webkit-border-bottom-right-radius: 0;\n          border-bottom-right-radius: 0;\n  -webkit-border-bottom-left-radius: 5px;\n          border-bottom-left-radius: 5px;\n  -webkit-border-top-left-radius: 5px;\n          border-top-left-radius: 5px;\n  -moz-border-radius-topright: 0;\n  -moz-border-radius-bottomright: 0;\n  -moz-border-radius-bottomleft: 5px;\n  -moz-border-radius-topleft: 5px;\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n.mfp-arrow-right:after,\n.mfp-arrow-right .mfp-a {\n  left: 3px;\n  border-left: 12px solid #fff;\n}\n\n.mfp-arrow-right:before,\n.mfp-arrow-right .mfp-b {\n  border-left: 20px solid #fff;\n}\n\n.mfp-iframe-holder {\n  padding-top: 40px;\n  padding-bottom: 40px;\n}\n\n.mfp-iframe-holder .mfp-content {\n  width: 100%;\n  max-width: 900px;\n  line-height: 0;\n}\n\n.mfp-iframe-scaler {\n  width: 100%;\n  height: 0;\n  padding-top: 56.25%;\n  overflow: hidden;\n}\n\n.mfp-iframe-scaler iframe {\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 100%;\n  height: 100%;\n  background: black;\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);\n}\n\n.mfp-iframe-holder .mfp-close {\n  top: -40px;\n}\n\n/* Main image in popup */\n\nimg.mfp-img {\n  display: block;\n  width: auto;\n  height: auto;\n  max-width: 100%;\n  padding: 40px 0 40px;\n  margin: 0 auto;\n  line-height: 0;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n/* The shadow behind the image */\n\n.mfp-figure:after {\n  position: absolute;\n  top: 40px;\n  right: 0;\n  bottom: 40px;\n  left: 0;\n  z-index: -1;\n  display: block;\n  width: auto;\n  height: auto;\n  content: '';\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);\n}\n\n.mfp-figure {\n  line-height: 0;\n}\n\n.mfp-bottom-bar {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  width: 100%;\n  margin-top: -36px;\n  cursor: auto;\n}\n\n.mfp-title {\n  line-height: 18px;\n  color: #f3f3f3;\n  text-align: left;\n}\n\n.mfp-figure small {\n  display: block;\n  font-size: 12px;\n  line-height: 14px;\n  color: #bdbdbd;\n}\n\n.mfp-image-holder .mfp-content {\n  max-width: 100%;\n}\n\n.mfp-gallery .mfp-image-holder .mfp-figure {\n  cursor: pointer;\n}\n\n@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {\n  {\n    /**\n       * Remove all paddings around the image on small screen\n       */\n  \n    /* The shadow behind the image */\n  \n  }\n  .mfp-img-mobile .mfp-image-holder {\n    padding-right: 0;\n    padding-left: 0;\n  }\n  .mfp-img-mobile img.mfp-img {\n    padding: 0;\n  }\n  .mfp-img-mobile .mfp-figure:after {\n    top: 0;\n    bottom: 0;\n  }\n  .mfp-img-mobile .mfp-bottom-bar {\n    position: fixed;\n    top: auto;\n    bottom: 0;\n    padding: 3px 5px;\n    margin: 0;\n    background: rgba(0, 0, 0, 0.6);\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .mfp-img-mobile .mfp-bottom-bar:empty {\n    padding: 0;\n  }\n  .mfp-img-mobile .mfp-counter {\n    top: 3px;\n    right: 5px;\n  }\n  .mfp-img-mobile .mfp-close {\n    position: fixed;\n    top: 0;\n    right: 0;\n    width: 35px;\n    height: 35px;\n    padding: 0;\n    line-height: 35px;\n    text-align: center;\n    background: rgba(0, 0, 0, 0.6);\n  }\n  .mfp-img-mobile .mfp-figure small {\n    display: inline;\n    margin-left: 5px;\n  }\n}\n\n@media all and (max-width: 800px) {\n  .mfp-arrow {\n    -webkit-transform: scale(0.75);\n            transform: scale(0.75);\n  }\n  .mfp-arrow-left {\n    -webkit-transform-origin: 0;\n            transform-origin: 0;\n  }\n  .mfp-arrow-right {\n    -webkit-transform-origin: 100%;\n            transform-origin: 100%;\n  }\n  .mfp-container {\n    padding-right: 6px;\n    padding-left: 6px;\n  }\n}\n\n.mfp-ie7 .mfp-img {\n  padding: 0;\n}\n\n.mfp-ie7 .mfp-bottom-bar {\n  left: 50%;\n  width: 600px;\n  padding-bottom: 5px;\n  margin-top: 5px;\n  margin-left: -300px;\n}\n\n.mfp-ie7 .mfp-container {\n  padding: 0;\n}\n\n.mfp-ie7 .mfp-content {\n  padding-top: 44px;\n}\n\n.mfp-ie7 .mfp-close {\n  top: 0;\n  right: 0;\n  padding-top: 0;\n}\n\n/**\n * Fade-zoom animation for first dialog\n */\n\n/* start state */\n\n.mfp-fade .zoom-anim-dialog {\n  opacity: 0;\n  -webkit-transform: scale(0.8);\n     -moz-transform: scale(0.8);\n      -ms-transform: scale(0.8);\n       -o-transform: scale(0.8);\n          transform: scale(0.8);\n  -webkit-transition: all 0.2s ease-in-out;\n     -moz-transition: all 0.2s ease-in-out;\n      -ms-transition: all 0.2s ease-in-out;\n       -o-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n/* animate in */\n\n.mfp-fade.mfp-ready .zoom-anim-dialog {\n  opacity: 1;\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/* animate out */\n\n.mfp-fade.mfp-removing .zoom-anim-dialog {\n  opacity: 0;\n  -webkit-transform: scale(0.8);\n     -moz-transform: scale(0.8);\n      -ms-transform: scale(0.8);\n       -o-transform: scale(0.8);\n          transform: scale(0.8);\n}\n\n/* Dark overlay, start state */\n\n.mfp-fade.mfp-bg {\n  opacity: 0;\n  -webkit-transition: opacity 0.3s ease-out;\n     -moz-transition: opacity 0.3s ease-out;\n      -ms-transition: opacity 0.3s ease-out;\n       -o-transition: opacity 0.3s ease-out;\n          transition: opacity 0.3s ease-out;\n}\n\n/* animate in */\n\n.mfp-fade.mfp-ready.mfp-bg {\n  opacity: 0.8;\n}\n\n/* animate out */\n\n.mfp-fade.mfp-removing.mfp-bg {\n  opacity: 0;\n}\n\nbody {\n  width: 100%;\n  padding: 0;\n  margin: 0;\n  background-color: #e8e8e8;\n}\n\n.entry,\n.hentry {\n  *zoom: 1;\n}\n\n.entry:before,\n.hentry:before,\n.entry:after,\n.hentry:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.entry:after,\n.hentry:after {\n  clear: both;\n}\n\n.entry-content {\n  margin-bottom: 26px;\n  margin-bottom: 1.625rem;\n  font-size: 16px;\n  font-size: 1rem;\n  line-height: 1.625;\n}\n\n.entry-content p > a,\n.entry-content li > a {\n  border-bottom: 1px dotted #a2a2a2;\n}\n\n.entry-content p > a:hover,\n.entry-content li > a:hover {\n  border-bottom-style: solid;\n}\n\n.entry-header {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.header-title {\n  margin: 30px 0 0;\n  text-align: center;\n}\n\n.header-title h1 {\n  margin: 10px 20px;\n  font-size: 28px;\n  font-size: 1.75rem;\n  font-weight: 700;\n  color: #555555;\n}\n\n@media only screen and (min-width: 48em) {\n  .header-title h1 {\n    font-size: 48px;\n    font-size: 3rem;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  .header-title h1 {\n    font-size: 60px;\n    font-size: 3.75rem;\n  }\n}\n\n.header-title h2 {\n  margin: 0;\n  font-size: 18px;\n  font-size: 1.125rem;\n  color: #888888;\n  text-transform: uppercase;\n}\n\n@media only screen and (min-width: 48em) {\n  .header-title h2 {\n    font-size: 30px;\n    font-size: 1.875rem;\n  }\n}\n\n.header-title p {\n  color: #555555;\n}\n\n.feature .header-title {\n  position: absolute;\n  top: 0;\n  display: table;\n  width: 100%;\n  height: 400px;\n  margin-top: 0;\n  overflow: hidden;\n}\n\n.feature .header-title .header-title-wrap {\n  display: table-cell;\n  margin: 0 auto;\n  text-align: center;\n  vertical-align: middle;\n}\n\n.feature .header-title h1 {\n  margin: 10px;\n  margin: 10px 60px;\n  font-weight: 700;\n  color: #ffffff;\n  text-shadow: 1px 1px 4px rgba(34, 34, 34, 0.6);\n}\n\n.feature .header-title h1 a {\n  color: #ffffff;\n}\n\n@media only screen and (min-width: 62.5em) {\n  \n}\n\n.feature .header-title h2 {\n  margin: 0;\n  color: #ffffff;\n  text-transform: uppercase;\n}\n\n@media only screen and (min-width: 48em) {\n  .feature .header-title h2 a {\n    color: #ffffff;\n  }\n}\n\n.feature .header-title p {\n  color: #ffffff;\n}\n\n.entry-image {\n  position: relative;\n  top: -50%;\n  left: -50%;\n  width: 200%;\n  height: 200%;\n  min-height: 400px;\n  overflow: hidden;\n}\n\n.entry-image:after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(34, 34, 34, 0.3);\n  content: '';\n}\n\n.entry-image img {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  min-width: 50%;\n  min-height: 50%;\n  margin: auto;\n}\n\n.image-credit {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  z-index: 10;\n  max-width: 440px;\n  padding: 10px 15px;\n  margin: 0 auto;\n  font-size: 12px;\n  font-size: 0.75rem;\n  color: #ffffff;\n  text-align: right;\n  background-color: rgba(34, 34, 34, 0.5);\n  -webkit-border-top-right-radius: 3px;\n          border-top-right-radius: 3px;\n  -webkit-border-bottom-right-radius: 0;\n          border-bottom-right-radius: 0;\n  -webkit-border-bottom-left-radius: 0;\n          border-bottom-left-radius: 0;\n  -webkit-border-top-left-radius: 3px;\n          border-top-left-radius: 3px;\n  -moz-border-radius-topright: 3px;\n  -moz-border-radius-bottomright: 0;\n  -moz-border-radius-bottomleft: 0;\n  -moz-border-radius-topleft: 3px;\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n@media only screen and (min-width: 48em) {\n  .image-credit {\n    max-width: 760px;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  .image-credit {\n    max-width: 960px;\n  }\n}\n\n.image-credit a {\n  color: #ffffff;\n  text-decoration: none;\n}\n\n.entry-meta {\n  font-size: 12px;\n  font-size: 0.75rem;\n  color: #bbbbbb;\n  text-transform: uppercase;\n}\n\n.entry-meta a {\n  color: #bbbbbb;\n}\n\n.entry-meta .vcard:before {\n  content: \" by \";\n}\n\n.entry-meta .tag {\n  display: inline-block;\n  padding: 2px 6px;\n  margin: 4px;\n  color: #ffffff;\n  background-color: #bbbbbb;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.entry-meta .tag span {\n  font-size: 10px;\n  font-size: 0.625rem;\n  vertical-align: super;\n}\n\n.entry-meta .tag:hover {\n  background-color: #a2a2a2;\n}\n\n.entry-meta .tag:active {\n  -webkit-transform: translate(0, 1px);\n     -moz-transform: translate(0, 1px);\n      -ms-transform: translate(0, 1px);\n       -o-transform: translate(0, 1px);\n          transform: translate(0, 1px);\n  -webkit-box-shadow: 0 0 1px rgba(34, 34, 34, 0.2);\n     -moz-box-shadow: 0 0 1px rgba(34, 34, 34, 0.2);\n          box-shadow: 0 0 1px rgba(34, 34, 34, 0.2);\n}\n\n#post .entry-content,\n#page .entry-content {\n  padding: 10px 15px;\n  margin: 40px 2px 20px 2px;\n  background-color: #ffffff;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n  box-shadow: 0 0 0 0, 0 6px 12px rgba(0, 0, 0, 0.1);\n}\n\n@media only screen and (min-width: 48em) {\n  #post .entry-content,\n  #page .entry-content {\n    padding: 20px 30px;\n    margin-right: 10px;\n    margin-left: 10px;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  #post .entry-content,\n  #page .entry-content {\n    max-width: 800px;\n    padding: 50px 80px;\n    margin: 50px auto 30px auto;\n  }\n  #post .entry-content > p:first-child,\n  #page .entry-content > p:first-child {\n    margin-bottom: 26px;\n    margin-bottom: 1.625rem;\n    font-size: 20px;\n    font-size: 1.25rem;\n    line-height: 1.3;\n  }\n}\n\n#post #disqus_thread,\n#page #disqus_thread {\n  padding: 10px 15px;\n  margin: 40px 2px 20px 2px;\n  background-color: #ffffff;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n  box-shadow: 0 0 0 1px rgba(187, 187, 187, 0.1), 0 6px 12px rgba(0, 0, 0, 0.1);\n}\n\n@media only screen and (min-width: 48em) {\n  #post #disqus_thread,\n  #page #disqus_thread {\n    padding: 20px 30px;\n    margin-right: 10px;\n    margin-left: 10px;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  #post #disqus_thread,\n  #page #disqus_thread {\n    max-width: 800px;\n    padding: 50px 80px;\n    margin: 0 auto 30px auto;\n  }\n}\n\n#post .entry-meta,\n#page .entry-meta {\n  margin: 50px 30px 30px;\n  text-align: center;\n}\n\n.entry-tags {\n  display: block;\n  margin-bottom: 6px;\n}\n\n.pagination {\n  margin: 20px 10px;\n  text-align: center;\n}\n\n.pagination ul {\n  display: inline;\n  margin-right: 10px;\n  margin-left: 10px;\n}\n\n.pagination li {\n  padding-right: 4px;\n  padding-left: 4px;\n}\n\n.pagination .current-page {\n  font-weight: 700;\n}\n\n.read-more {\n  position: relative;\n  padding: 40px 15px 25px;\n  margin: 40px 2px 20px 2px;\n  text-align: center;\n  background-color: #ffffff;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n  *zoom: 1;\n  box-shadow: 0 0 0 1px rgba(187, 187, 187, 0.1), 0 6px 12px rgba(0, 0, 0, 0.1);\n}\n\n@media only screen and (min-width: 48em) {\n  .read-more {\n    padding: 50px 40px 25px;\n    margin: 50px 10px 20px 10px;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  .read-more {\n    max-width: 800px;\n    padding: 50px 80px;\n    margin: 60px auto;\n  }\n}\n\n.read-more:before,\n.read-more:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.read-more:after {\n  clear: both;\n}\n\n.read-more-header {\n  position: absolute;\n  top: -20px;\n  right: 0;\n  left: 0;\n  height: 35px;\n}\n\n.read-more-header a {\n  display: inline-block;\n  padding: 8px 20px;\n  margin-bottom: 20px;\n  font-size: 14px;\n  font-size: 0.875rem;\n  color: #ffffff;\n  background-color: #222222;\n  border-color: #222222;\n  border-style: solid !important;\n  border-width: 2px !important;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.read-more-header a:visited {\n  color: #ffffff;\n}\n\n.read-more-header a:hover {\n  color: #222222;\n  background-color: #ffffff;\n}\n\n.read-more-content {\n  margin-bottom: 26px;\n  margin-bottom: 1.625rem;\n  font-size: 16px;\n  font-size: 1rem;\n  line-height: 1.625;\n}\n\n.read-more-content p > a,\n.read-more-content li > a {\n  border-bottom: 1px dotted #a2a2a2;\n}\n\n.read-more-content p > a:hover,\n.read-more-content li > a:hover {\n  border-bottom-style: solid;\n}\n\n.read-more-content h3 {\n  margin: 0;\n  font-size: 28px;\n  font-size: 1.75rem;\n}\n\n.read-more-content h3 a {\n  color: #222222;\n}\n\n@media only screen and (min-width: 48em) {\n  .read-more-content h3 {\n    font-size: 36px;\n    font-size: 2.25rem;\n  }\n}\n\n.read-more-list {\n  border-top: solid 1px #bbbbbb;\n}\n\n.list-item {\n  width: 100%;\n  text-align: left;\n}\n\n.list-item h4 {\n  margin-bottom: 0;\n  font-size: 18px;\n  font-size: 1.125rem;\n}\n\n.list-item span {\n  display: block;\n  font-size: 14px;\n  font-size: 0.875rem;\n  color: #a2a2a2;\n}\n\n@media only screen and (min-width: 48em) {\n  .list-item {\n    float: left;\n    width: 49%;\n  }\n  .list-item:nth-child(2) {\n    text-align: right;\n  }\n}\n\n#post-index #main {\n  margin: 40px 2px 20px 2px;\n}\n\n@media only screen and (min-width: 48em) {\n  #post-index #main {\n    margin-right: 20px;\n    margin-left: 20px;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  #post-index #main {\n    max-width: 800px;\n    margin-top: 50px;\n    margin-right: auto;\n    margin-left: auto;\n  }\n}\n\n#post-index article {\n  padding: 25px 15px;\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n  box-shadow: 0 0 0 0, 0 6px 12px rgba(34, 34, 34, 0.1);\n}\n\n@media only screen and (min-width: 48em) {\n  #post-index article {\n    padding: 30px;\n  }\n}\n\n@media only screen and (min-width: 62.5em) {\n  #post-index article {\n    padding: 50px 80px;\n    margin-bottom: 30px;\n  }\n}\n\n.footer-wrapper {\n  margin: 2em auto;\n  color: #555555;\n  text-align: center;\n  *zoom: 1;\n}\n\n.footer-wrapper:before,\n.footer-wrapper:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.footer-wrapper:after {\n  clear: both;\n}\n\n.footer-wrapper a {\n  color: #555555;\n}\n\n.socialcount {\n  font-size: 16px;\n  font-size: 1rem;\n  font-weight: 700;\n}\n\n.socialcount li {\n  padding-right: 10px;\n  padding-left: 10px;\n}\n\n.socialcount p > a,\n.socialcount li > a {\n  border-bottom-width: 0;\n}\n\n.upgrade {\n  padding: 10px;\n  text-align: center;\n}\n\n#goog-fixurl ul {\n  padding-left: 0;\n  margin-left: 0;\n  list-style: none;\n}\n\n#goog-fixurl ul li {\n  list-style-type: none;\n}\n\n#goog-wm-qt {\n  display: inline-block;\n  width: auto;\n  padding: 8px 20px;\n  margin-right: 10px;\n  margin-bottom: 20px;\n  font-size: 14px;\n  font-size: 0.875rem;\n  color: #222222;\n  background-color: #ffffff;\n  border-color: #a2a2a2;\n  border-style: solid !important;\n  border-width: 2px !important;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n#goog-wm-sb {\n  display: inline-block;\n  padding: 8px 20px;\n  margin-bottom: 20px;\n  font-size: 14px;\n  font-size: 0.875rem;\n  color: #ffffff;\n  background-color: #222222;\n  border-color: #222222;\n  border-style: solid !important;\n  border-width: 2px !important;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n#goog-wm-sb:visited {\n  color: #ffffff;\n}\n\n#goog-wm-sb:hover {\n  color: #222222;\n  background-color: #ffffff;\n}"
  },
  {
    "path": "assets/js/_main.js",
    "content": "/*! Plugin options and other jQuery stuff */\n\n// dl-menu options\n$(function() {\n  $( '#dl-menu' ).dlmenu({\n    animationClasses : { classin : 'dl-animate-in', classout : 'dl-animate-out' }\n  });\n});\n\n// FitVids options\n$(function() {\n  $(\"article\").fitVids();\n});\n\n$(\".close-menu\").click(function () {\n  $(\".menu\").toggleClass(\"disabled\");\n  $(\".links\").toggleClass(\"enabled\");\n});\n\n$(\".about\").click(function () {\n  $(\"#about\").css('display','block');\n});\n\n$(\".close-about\").click(function () {\n  $(\"#about\").css('display','');\n});\n\n// Add lightbox class to all image links\n$(\"a[href$='.jpg'],a[href$='.jpeg'],a[href$='.JPG'],a[href$='.png'],a[href$='.gif']\").addClass(\"image-popup\");\n\n// Magnific-Popup options\n$(document).ready(function() {\n  $('.image-popup').magnificPopup({\n    type: 'image',\n    tLoading: 'Loading image #%curr%...',\n    gallery: {\n      enabled: true,\n      navigateByImgClick: true,\n      preload: [0,1] // Will preload 0 - before current, and 1 after the current image\n    },\n    image: {\n      tError: '<a href=\"%url%\">Image #%curr%</a> could not be loaded.',\n    },\n    removalDelay: 300, // Delay in milliseconds before popup is removed\n    // Class that is added to body when popup is open. \n    // make it unique to apply your CSS animations just to this exact popup\n    mainClass: 'mfp-fade'\n  });\n});"
  },
  {
    "path": "assets/js/plugins/jquery.dlmenu.js",
    "content": "/**\n * jquery.dlmenu.js v1.0.1\n * http://www.codrops.com\n *\n * Licensed under the MIT license.\n * http://www.opensource.org/licenses/mit-license.php\n * \n * Copyright 2013, Codrops\n * http://www.codrops.com\n */\n;( function( $, window, undefined ) {\n\n\t'use strict';\n\n\t// global\n\tvar Modernizr = window.Modernizr, $body = $( 'body' );\n\n\t$.DLMenu = function( options, element ) {\n\t\tthis.$el = $( element );\n\t\tthis._init( options );\n\t};\n\n\t// the options\n\t$.DLMenu.defaults = {\n\t\t// classes for the animation effects\n\t\tanimationClasses : { classin : 'dl-animate-in-1', classout : 'dl-animate-out-1' },\n\t\t// callback: click a link that has a sub menu\n\t\t// el is the link element (li); name is the level name\n\t\tonLevelClick : function( el, name ) { return false; },\n\t\t// callback: click a link that does not have a sub menu\n\t\t// el is the link element (li); ev is the event obj\n\t\tonLinkClick : function( el, ev ) { return false; }\n\t};\n\n\t$.DLMenu.prototype = {\n\t\t_init : function( options ) {\n\n\t\t\t// options\n\t\t\tthis.options = $.extend( true, {}, $.DLMenu.defaults, options );\n\t\t\t// cache some elements and initialize some variables\n\t\t\tthis._config();\n\t\t\t\n\t\t\tvar animEndEventNames = {\n\t\t\t\t\t'WebkitAnimation' : 'webkitAnimationEnd',\n\t\t\t\t\t'OAnimation' : 'oAnimationEnd',\n\t\t\t\t\t'msAnimation' : 'MSAnimationEnd',\n\t\t\t\t\t'animation' : 'animationend'\n\t\t\t\t},\n\t\t\t\ttransEndEventNames = {\n\t\t\t\t\t'WebkitTransition' : 'webkitTransitionEnd',\n\t\t\t\t\t'MozTransition' : 'transitionend',\n\t\t\t\t\t'OTransition' : 'oTransitionEnd',\n\t\t\t\t\t'msTransition' : 'MSTransitionEnd',\n\t\t\t\t\t'transition' : 'transitionend'\n\t\t\t\t};\n\t\t\t// animation end event name\n\t\t\tthis.animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ] + '.dlmenu';\n\t\t\t// transition end event name\n\t\t\tthis.transEndEventName = transEndEventNames[ Modernizr.prefixed( 'transition' ) ] + '.dlmenu',\n\t\t\t// support for css animations and css transitions\n\t\t\tthis.supportAnimations = Modernizr.cssanimations,\n\t\t\tthis.supportTransitions = Modernizr.csstransitions;\n\n\t\t\tthis._initEvents();\n\n\t\t},\n\t\t_config : function() {\n\t\t\tthis.open = false;\n\t\t\tthis.$trigger = this.$el.children( '.dl-trigger' );\n\t\t\tthis.$menu = this.$el.children( 'ul.dl-menu' );\n\t\t\tthis.$menuitems = this.$menu.find( 'li:not(.dl-back)' );\n\t\t\tthis.$el.find( 'ul.dl-submenu' ).prepend( '<li class=\"dl-back\"><a href=\"#\">back</a></li>' );\n\t\t\tthis.$back = this.$menu.find( 'li.dl-back' );\n\t\t},\n\t\t_initEvents : function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.$trigger.on( 'click.dlmenu', function() {\n\t\t\t\t\n\t\t\t\tif( self.open ) {\n\t\t\t\t\tself._closeMenu();\n\t\t\t\t} \n\t\t\t\telse {\n\t\t\t\t\tself._openMenu();\n\t\t\t\t}\n\t\t\t\treturn false;\n\n\t\t\t} );\n\n\t\t\tthis.$menuitems.on( 'click.dlmenu', function( event ) {\n\t\t\t\t\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tvar $item = $(this),\n\t\t\t\t\t$submenu = $item.children( 'ul.dl-submenu' );\n\n\t\t\t\tif( $submenu.length > 0 ) {\n\n\t\t\t\t\tvar $flyin = $submenu.clone().css({\n\t\t\t\t\t\topacity: 0,\n\t\t\t\t\t\tmargin: 0\n\t\t\t\t\t}).insertAfter( self.$menu ),\n\t\t\t\t\t\tonAnimationEndFn = function() {\n\t\t\t\t\t\t\tself.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classout ).addClass( 'dl-subview' );\n\t\t\t\t\t\t\t$item.addClass( 'dl-subviewopen' ).parents( '.dl-subviewopen:first' ).removeClass( 'dl-subviewopen' ).addClass( 'dl-subview' );\n\t\t\t\t\t\t\t$flyin.remove();\n\t\t\t\t\t\t};\n\n\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t$flyin.addClass( self.options.animationClasses.classin );\n\t\t\t\t\t\tself.$menu.addClass( self.options.animationClasses.classout );\n\t\t\t\t\t\tif( self.supportAnimations ) {\n\t\t\t\t\t\t\tself.$menu.on( self.animEndEventName, onAnimationEndFn );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tonAnimationEndFn.call();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tself.options.onLevelClick( $item, $item.children( 'a:first' ).text() );\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself.options.onLinkClick( $item, event );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tthis.$back.on( 'click.dlmenu', function( event ) {\n\t\t\t\t\n\t\t\t\tvar $this = $( this ),\n\t\t\t\t\t$submenu = $this.parents( 'ul.dl-submenu:first' ),\n\t\t\t\t\t$item = $submenu.parent(),\n\n\t\t\t\t\t$flyin = $submenu.clone().insertAfter( self.$menu );\n\n\t\t\t\tvar onAnimationEndFn = function() {\n\t\t\t\t\tself.$menu.off( self.animEndEventName ).removeClass( self.options.animationClasses.classin );\n\t\t\t\t\t$flyin.remove();\n\t\t\t\t};\n\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t$flyin.addClass( self.options.animationClasses.classout );\n\t\t\t\t\tself.$menu.addClass( self.options.animationClasses.classin );\n\t\t\t\t\tif( self.supportAnimations ) {\n\t\t\t\t\t\tself.$menu.on( self.animEndEventName, onAnimationEndFn );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tonAnimationEndFn.call();\n\t\t\t\t\t}\n\n\t\t\t\t\t$item.removeClass( 'dl-subviewopen' );\n\t\t\t\t\t\n\t\t\t\t\tvar $subview = $this.parents( '.dl-subview:first' );\n\t\t\t\t\tif( $subview.is( 'li' ) ) {\n\t\t\t\t\t\t$subview.addClass( 'dl-subviewopen' );\n\t\t\t\t\t}\n\t\t\t\t\t$subview.removeClass( 'dl-subview' );\n\t\t\t\t} );\n\n\t\t\t\treturn false;\n\n\t\t\t} );\n\t\t\t\n\t\t},\n\t\tcloseMenu : function() {\n\t\t\tif( this.open ) {\n\t\t\t\tthis._closeMenu();\n\t\t\t}\n\t\t},\n\t\t_closeMenu : function() {\n\t\t\tvar self = this,\n\t\t\t\tonTransitionEndFn = function() {\n\t\t\t\t\tself.$menu.off( self.transEndEventName );\n\t\t\t\t\tself._resetMenu();\n\t\t\t\t};\n\t\t\t\n\t\t\tthis.$menu.removeClass( 'dl-menuopen' );\n\t\t\tthis.$menu.addClass( 'dl-menu-toggle' );\n\t\t\tthis.$trigger.removeClass( 'dl-active' );\n\t\t\t\n\t\t\tif( this.supportTransitions ) {\n\t\t\t\tthis.$menu.on( this.transEndEventName, onTransitionEndFn );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tonTransitionEndFn.call();\n\t\t\t}\n\n\t\t\tthis.open = false;\n\t\t},\n\t\topenMenu : function() {\n\t\t\tif( !this.open ) {\n\t\t\t\tthis._openMenu();\n\t\t\t}\n\t\t},\n\t\t_openMenu : function() {\n\t\t\tvar self = this;\n\t\t\t// clicking somewhere else makes the menu close\n\t\t\t$body.off( 'click' ).on( 'click.dlmenu', function() {\n\t\t\t\tself._closeMenu() ;\n\t\t\t} );\n\t\t\tthis.$menu.addClass( 'dl-menuopen dl-menu-toggle' ).on( this.transEndEventName, function() {\n\t\t\t\t$( this ).removeClass( 'dl-menu-toggle' );\n\t\t\t} );\n\t\t\tthis.$trigger.addClass( 'dl-active' );\n\t\t\tthis.open = true;\n\t\t},\n\t\t// resets the menu to its original state (first level of options)\n\t\t_resetMenu : function() {\n\t\t\tthis.$menu.removeClass( 'dl-subview' );\n\t\t\tthis.$menuitems.removeClass( 'dl-subview dl-subviewopen' );\n\t\t}\n\t};\n\n\tvar logError = function( message ) {\n\t\tif ( window.console ) {\n\t\t\twindow.console.error( message );\n\t\t}\n\t};\n\n\t$.fn.dlmenu = function( options ) {\n\t\tif ( typeof options === 'string' ) {\n\t\t\tvar args = Array.prototype.slice.call( arguments, 1 );\n\t\t\tthis.each(function() {\n\t\t\t\tvar instance = $.data( this, 'dlmenu' );\n\t\t\t\tif ( !instance ) {\n\t\t\t\t\tlogError( \"cannot call methods on dlmenu prior to initialization; \" +\n\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt(0) === \"_\" ) {\n\t\t\t\t\tlogError( \"no such method '\" + options + \"' for dlmenu instance\" );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tinstance[ options ].apply( instance, args );\n\t\t\t});\n\t\t} \n\t\telse {\n\t\t\tthis.each(function() {\t\n\t\t\t\tvar instance = $.data( this, 'dlmenu' );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance._init();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tinstance = $.data( this, 'dlmenu', new $.DLMenu( options, this ) );\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t};\n\n} )( jQuery, window );\n"
  },
  {
    "path": "assets/js/plugins/jquery.fitvids.js",
    "content": "/*global jQuery */\n/*jshint multistr:true, browser:true */\n/*!\n* FitVids 1.0\n*\n* Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com\n* Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/\n* Released under the WTFPL license - http://sam.zoy.org/wtfpl/\n*\n* Date: Thu Sept 01 18:00:00 2011 -0500\n*/\n\n(function( $ ){\n\n  \"use strict\";\n\n  $.fn.fitVids = function( options ) {\n    var settings = {\n      customSelector: null\n    };\n\n    var div = document.createElement('div'),\n        ref = document.getElementsByTagName('base')[0] || document.getElementsByTagName('script')[0];\n\n    div.className = 'fit-vids-style';\n    div.innerHTML = '&shy;<style>         \\\n      .fluid-width-video-wrapper {        \\\n         width: 100%;                     \\\n         position: relative;              \\\n         padding: 0;                      \\\n      }                                   \\\n                                          \\\n      .fluid-width-video-wrapper iframe,  \\\n      .fluid-width-video-wrapper object,  \\\n      .fluid-width-video-wrapper embed {  \\\n         position: absolute;              \\\n         top: 0;                          \\\n         left: 0;                         \\\n         width: 100%;                     \\\n         height: 100%;                    \\\n      }                                   \\\n    </style>';\n\n    ref.parentNode.insertBefore(div,ref);\n\n    if ( options ) {\n      $.extend( settings, options );\n    }\n\n    return this.each(function(){\n      var selectors = [\n        \"iframe[src*='player.vimeo.com']\",\n        \"iframe[src*='www.youtube.com']\",\n        \"iframe[src*='www.youtube-nocookie.com']\",\n        \"iframe[src*='www.kickstarter.com']\",\n        \"object\",\n        \"embed\"\n      ];\n\n      if (settings.customSelector) {\n        selectors.push(settings.customSelector);\n      }\n\n      var $allVideos = $(this).find(selectors.join(','));\n\n      $allVideos.each(function(){\n        var $this = $(this);\n        if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }\n        var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),\n            width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),\n            aspectRatio = height / width;\n        if(!$this.attr('id')){\n          var videoID = 'fitvid' + Math.floor(Math.random()*999999);\n          $this.attr('id', videoID);\n        }\n        $this.wrap('<div class=\"fluid-width-video-wrapper\"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+\"%\");\n        $this.removeAttr('height').removeAttr('width');\n      });\n    });\n  };\n})( jQuery );"
  },
  {
    "path": "assets/js/plugins/jquery.magnific-popup.js",
    "content": "/*! Magnific Popup - v0.9.3 - 2013-07-16\n* http://dimsemenov.com/plugins/magnific-popup/\n* Copyright (c) 2013 Dmitry Semenov; */\n;(function($) {\n\n/*>>core*/\n/**\n * \n * Magnific Popup Core JS file\n * \n */\n\n\n/**\n * Private static constants\n */\nvar CLOSE_EVENT = 'Close',\n\tBEFORE_CLOSE_EVENT = 'BeforeClose',\n\tAFTER_CLOSE_EVENT = 'AfterClose',\n\tBEFORE_APPEND_EVENT = 'BeforeAppend',\n\tMARKUP_PARSE_EVENT = 'MarkupParse',\n\tOPEN_EVENT = 'Open',\n\tCHANGE_EVENT = 'Change',\n\tNS = 'mfp',\n\tEVENT_NS = '.' + NS,\n\tREADY_CLASS = 'mfp-ready',\n\tREMOVING_CLASS = 'mfp-removing',\n\tPREVENT_CLOSE_CLASS = 'mfp-prevent-close';\n\n\n/**\n * Private vars \n */\nvar mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'\n\tMagnificPopup = function(){},\n\t_isJQ = !!(window.jQuery),\n\t_prevStatus,\n\t_window = $(window),\n\t_body,\n\t_document,\n\t_prevContentType,\n\t_wrapClasses,\n\t_currPopupType;\n\n\n/**\n * Private functions\n */\nvar _mfpOn = function(name, f) {\n\t\tmfp.ev.on(NS + name + EVENT_NS, f);\n\t},\n\t_getEl = function(className, appendTo, html, raw) {\n\t\tvar el = document.createElement('div');\n\t\tel.className = 'mfp-'+className;\n\t\tif(html) {\n\t\t\tel.innerHTML = html;\n\t\t}\n\t\tif(!raw) {\n\t\t\tel = $(el);\n\t\t\tif(appendTo) {\n\t\t\t\tel.appendTo(appendTo);\n\t\t\t}\n\t\t} else if(appendTo) {\n\t\t\tappendTo.appendChild(el);\n\t\t}\n\t\treturn el;\n\t},\n\t_mfpTrigger = function(e, data) {\n\t\tmfp.ev.triggerHandler(NS + e, data);\n\n\t\tif(mfp.st.callbacks) {\n\t\t\t// converts \"mfpEventName\" to \"eventName\" callback and triggers it if it's present\n\t\t\te = e.charAt(0).toLowerCase() + e.slice(1);\n\t\t\tif(mfp.st.callbacks[e]) {\n\t\t\t\tmfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);\n\t\t\t}\n\t\t}\n\t},\n\t_setFocus = function() {\n\t\t(mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).trigger('focus');\n\t},\n\t_getCloseBtn = function(type) {\n\t\tif(type !== _currPopupType || !mfp.currTemplate.closeBtn) {\n\t\t\tmfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) );\n\t\t\t_currPopupType = type;\n\t\t}\n\t\treturn mfp.currTemplate.closeBtn;\n\t},\n\t// Initialize Magnific Popup only when called at least once\n\t_checkInstance = function() {\n\t\tif(!$.magnificPopup.instance) {\n\t\t\tmfp = new MagnificPopup();\n\t\t\tmfp.init();\n\t\t\t$.magnificPopup.instance = mfp;\n\t\t}\n\t},\n\t// Check to close popup or not\n\t// \"target\" is an element that was clicked\n\t_checkIfClose = function(target) {\n\n\t\tif($(target).hasClass(PREVENT_CLOSE_CLASS)) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar closeOnContent = mfp.st.closeOnContentClick;\n\t\tvar closeOnBg = mfp.st.closeOnBgClick;\n\n\t\tif(closeOnContent && closeOnBg) {\n\t\t\treturn true;\n\t\t} else {\n\n\t\t\t// We close the popup if click is on close button or on preloader. Or if there is no content.\n\t\t\tif(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// if click is outside the content\n\t\t\tif(  (target !== mfp.content[0] && !$.contains(mfp.content[0], target))  ) {\n\t\t\t\tif(closeOnBg) {\n\t\t\t\t\t// last check, if the clicked element is in DOM, (in case it's removed onclick)\n\t\t\t\t\tif( $.contains(document, target) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if(closeOnContent) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t}\n\t\treturn false;\n\t},\n\t// CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr\n\tsupportsTransitions = function() {\n\t\tvar s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist\n\t\t\tv = ['ms','O','Moz','Webkit']; // 'v' for vendor\n\n\t\tif( s['transition'] !== undefined ) {\n\t\t\treturn true; \n\t\t}\n\t\t\t\n\t\twhile( v.length ) {\n\t\t\tif( v.pop() + 'Transition' in s ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\t\t\n\t\treturn false;\n\t};\n\n\n\n/**\n * Public functions\n */\nMagnificPopup.prototype = {\n\n\tconstructor: MagnificPopup,\n\n\t/**\n\t * Initializes Magnific Popup plugin. \n\t * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed\n\t */\n\tinit: function() {\n\t\tvar appVersion = navigator.appVersion;\n\t\tmfp.isIE7 = appVersion.indexOf(\"MSIE 7.\") !== -1; \n\t\tmfp.isIE8 = appVersion.indexOf(\"MSIE 8.\") !== -1;\n\t\tmfp.isLowIE = mfp.isIE7 || mfp.isIE8;\n\t\tmfp.isAndroid = (/android/gi).test(appVersion);\n\t\tmfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);\n\t\tmfp.supportsTransition = supportsTransitions();\n\n\t\t// We disable fixed positioned lightbox on devices that don't handle it nicely.\n\t\t// If you know a better way of detecting this - let me know.\n\t\tmfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) );\n\t\t_body = $(document.body);\n\t\t_document = $(document);\n\n\t\tmfp.popupsCache = {};\n\t},\n\n\t/**\n\t * Opens popup\n\t * @param  data [description]\n\t */\n\topen: function(data) {\n\n\t\tvar i;\n\n\t\tif(data.isObj === false) { \n\t\t\t// convert jQuery collection to array to avoid conflicts later\n\t\t\tmfp.items = data.items.toArray();\n\n\t\t\tmfp.index = 0;\n\t\t\tvar items = data.items,\n\t\t\t\titem;\n\t\t\tfor(i = 0; i < items.length; i++) {\n\t\t\t\titem = items[i];\n\t\t\t\tif(item.parsed) {\n\t\t\t\t\titem = item.el[0];\n\t\t\t\t}\n\t\t\t\tif(item === data.el[0]) {\n\t\t\t\t\tmfp.index = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tmfp.items = $.isArray(data.items) ? data.items : [data.items];\n\t\t\tmfp.index = data.index || 0;\n\t\t}\n\n\t\t// if popup is already opened - we just update the content\n\t\tif(mfp.isOpen) {\n\t\t\tmfp.updateItemHTML();\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tmfp.types = []; \n\t\t_wrapClasses = '';\n\t\tif(data.mainEl && data.mainEl.length) {\n\t\t\tmfp.ev = data.mainEl.eq(0);\n\t\t} else {\n\t\t\tmfp.ev = _document;\n\t\t}\n\n\t\tif(data.key) {\n\t\t\tif(!mfp.popupsCache[data.key]) {\n\t\t\t\tmfp.popupsCache[data.key] = {};\n\t\t\t}\n\t\t\tmfp.currTemplate = mfp.popupsCache[data.key];\n\t\t} else {\n\t\t\tmfp.currTemplate = {};\n\t\t}\n\n\n\n\t\tmfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); \n\t\tmfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;\n\n\t\tif(mfp.st.modal) {\n\t\t\tmfp.st.closeOnContentClick = false;\n\t\t\tmfp.st.closeOnBgClick = false;\n\t\t\tmfp.st.showCloseBtn = false;\n\t\t\tmfp.st.enableEscapeKey = false;\n\t\t}\n\t\t\n\n\t\t// Building markup\n\t\t// main containers are created only once\n\t\tif(!mfp.bgOverlay) {\n\n\t\t\t// Dark overlay\n\t\t\tmfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() {\n\t\t\t\tmfp.close();\n\t\t\t});\n\n\t\t\tmfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) {\n\t\t\t\tif(_checkIfClose(e.target)) {\n\t\t\t\t\tmfp.close();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmfp.container = _getEl('container', mfp.wrap);\n\t\t}\n\n\t\tmfp.contentContainer = _getEl('content');\n\t\tif(mfp.st.preloader) {\n\t\t\tmfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);\n\t\t}\n\n\n\t\t// Initializing modules\n\t\tvar modules = $.magnificPopup.modules;\n\t\tfor(i = 0; i < modules.length; i++) {\n\t\t\tvar n = modules[i];\n\t\t\tn = n.charAt(0).toUpperCase() + n.slice(1);\n\t\t\tmfp['init'+n].call(mfp);\n\t\t}\n\t\t_mfpTrigger('BeforeOpen');\n\n\n\t\tif(mfp.st.showCloseBtn) {\n\t\t\t// Close button\n\t\t\tif(!mfp.st.closeBtnInside) {\n\t\t\t\tmfp.wrap.append( _getCloseBtn() );\n\t\t\t} else {\n\t\t\t\t_mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) {\n\t\t\t\t\tvalues.close_replaceWith = _getCloseBtn(item.type);\n\t\t\t\t});\n\t\t\t\t_wrapClasses += ' mfp-close-btn-in';\n\t\t\t}\n\t\t}\n\n\t\tif(mfp.st.alignTop) {\n\t\t\t_wrapClasses += ' mfp-align-top';\n\t\t}\n\n\t\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tmfp.wrap.css({\n\t\t\t\toverflow: mfp.st.overflowY,\n\t\t\t\toverflowX: 'hidden',\n\t\t\t\toverflowY: mfp.st.overflowY\n\t\t\t});\n\t\t} else {\n\t\t\tmfp.wrap.css({ \n\t\t\t\ttop: _window.scrollTop(),\n\t\t\t\tposition: 'absolute'\n\t\t\t});\n\t\t}\n\t\tif( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) {\n\t\t\tmfp.bgOverlay.css({\n\t\t\t\theight: _document.height(),\n\t\t\t\tposition: 'absolute'\n\t\t\t});\n\t\t}\n\n\t\t\n\n\t\tif(mfp.st.enableEscapeKey) {\n\t\t\t// Close on ESC key\n\t\t\t_document.on('keyup' + EVENT_NS, function(e) {\n\t\t\t\tif(e.keyCode === 27) {\n\t\t\t\t\tmfp.close();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t_window.on('resize' + EVENT_NS, function() {\n\t\t\tmfp.updateSize();\n\t\t});\n\n\n\t\tif(!mfp.st.closeOnContentClick) {\n\t\t\t_wrapClasses += ' mfp-auto-cursor';\n\t\t}\n\t\t\n\t\tif(_wrapClasses)\n\t\t\tmfp.wrap.addClass(_wrapClasses);\n\n\n\t\t// this triggers recalculation of layout, so we get it once to not to trigger twice\n\t\tvar windowHeight = mfp.wH = _window.height();\n\n\t\t\n\t\tvar windowStyles = {};\n\n\t\tif( mfp.fixedContentPos ) {\n            if(mfp._hasScrollBar(windowHeight)){\n                var s = mfp._getScrollbarSize();\n                if(s) {\n                    windowStyles.paddingRight = s;\n                }\n            }\n        }\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tif(!mfp.isIE7) {\n\t\t\t\twindowStyles.overflow = 'hidden';\n\t\t\t} else {\n\t\t\t\t// ie7 double-scroll bug\n\t\t\t\t$('body, html').css('overflow', 'hidden');\n\t\t\t}\n\t\t}\n\n\t\t\n\t\t\n\t\tvar classesToadd = mfp.st.mainClass;\n\t\tif(mfp.isIE7) {\n\t\t\tclassesToadd += ' mfp-ie7';\n\t\t}\n\t\tif(classesToadd) {\n\t\t\tmfp._addClassToMFP( classesToadd );\n\t\t}\n\n\t\t// add content\n\t\tmfp.updateItemHTML();\n\n\t\t_mfpTrigger('BuildControls');\n\n\n\t\t// remove scrollbar, add padding e.t.c\n\t\t$('html').css(windowStyles);\n\t\t\n\t\t// add everything to DOM\n\t\tmfp.bgOverlay.add(mfp.wrap).prependTo( document.body );\n\n\n\n\t\t// Save last focused element\n\t\tmfp._lastFocusedEl = document.activeElement;\n\t\t\n\t\t// Wait for next cycle to allow CSS transition\n\t\tsetTimeout(function() {\n\t\t\t\n\t\t\tif(mfp.content) {\n\t\t\t\tmfp._addClassToMFP(READY_CLASS);\n\t\t\t\t_setFocus();\n\t\t\t} else {\n\t\t\t\t// if content is not defined (not loaded e.t.c) we add class only for BG\n\t\t\t\tmfp.bgOverlay.addClass(READY_CLASS);\n\t\t\t}\n\t\t\t\n\t\t\t// Trap the focus in popup\n\t\t\t_document.on('focusin' + EVENT_NS, function (e) {\n\t\t\t\tif( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) {\n\t\t\t\t\t_setFocus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t}, 16);\n\n\t\tmfp.isOpen = true;\n\t\tmfp.updateSize(windowHeight);\n\t\t_mfpTrigger(OPEN_EVENT);\n\t},\n\n\t/**\n\t * Closes the popup\n\t */\n\tclose: function() {\n\t\tif(!mfp.isOpen) return;\n\t\t_mfpTrigger(BEFORE_CLOSE_EVENT);\n\n\t\tmfp.isOpen = false;\n\t\t// for CSS3 animation\n\t\tif(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition )  {\n\t\t\tmfp._addClassToMFP(REMOVING_CLASS);\n\t\t\tsetTimeout(function() {\n\t\t\t\tmfp._close();\n\t\t\t}, mfp.st.removalDelay);\n\t\t} else {\n\t\t\tmfp._close();\n\t\t}\n\t},\n\n\t/**\n\t * Helper for close() function\n\t */\n\t_close: function() {\n\t\t_mfpTrigger(CLOSE_EVENT);\n\n\t\tvar classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';\n\n\t\tmfp.bgOverlay.detach();\n\t\tmfp.wrap.detach();\n\t\tmfp.container.empty();\n\n\t\tif(mfp.st.mainClass) {\n\t\t\tclassesToRemove += mfp.st.mainClass + ' ';\n\t\t}\n\n\t\tmfp._removeClassFromMFP(classesToRemove);\n\n\t\tif(mfp.fixedContentPos) {\n\t\t\tvar windowStyles = {paddingRight: ''};\n\t\t\tif(mfp.isIE7) {\n\t\t\t\t$('body, html').css('overflow', '');\n\t\t\t} else {\n\t\t\t\twindowStyles.overflow = '';\n\t\t\t}\n\t\t\t$('html').css(windowStyles);\n\t\t}\n\t\t\n\t\t_document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);\n\t\tmfp.ev.off(EVENT_NS);\n\n\t\t// clean up DOM elements that aren't removed\n\t\tmfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');\n\t\tmfp.bgOverlay.attr('class', 'mfp-bg');\n\t\tmfp.container.attr('class', 'mfp-container');\n\n\t\t// remove close button from target element\n\t\tif(mfp.st.showCloseBtn &&\n\t\t(!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {\n\t\t\tif(mfp.currTemplate.closeBtn)\n\t\t\t\tmfp.currTemplate.closeBtn.detach();\n\t\t}\n\n\n\t\tif(mfp._lastFocusedEl) {\n\t\t\t$(mfp._lastFocusedEl).trigger('focus'); // put tab focus back\n\t\t}\n\t\tmfp.currItem = null;\t\n\t\tmfp.content = null;\n\t\tmfp.currTemplate = null;\n\t\tmfp.prevHeight = 0;\n\n\t\t_mfpTrigger(AFTER_CLOSE_EVENT);\n\t},\n\t\n\tupdateSize: function(winHeight) {\n\n\t\tif(mfp.isIOS) {\n\t\t\t// fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2\n\t\t\tvar zoomLevel = document.documentElement.clientWidth / window.innerWidth;\n\t\t\tvar height = window.innerHeight * zoomLevel;\n\t\t\tmfp.wrap.css('height', height);\n\t\t\tmfp.wH = height;\n\t\t} else {\n\t\t\tmfp.wH = winHeight || _window.height();\n\t\t}\n\t\t// Fixes #84: popup incorrectly positioned with position:relative on body\n\t\tif(!mfp.fixedContentPos) {\n\t\t\tmfp.wrap.css('height', mfp.wH);\n\t\t}\n\n\t\t_mfpTrigger('Resize');\n\n\t},\n\n\t/**\n\t * Set content of popup based on current index\n\t */\n\tupdateItemHTML: function() {\n\t\tvar item = mfp.items[mfp.index];\n\n\t\t// Detach and perform modifications\n\t\tmfp.contentContainer.detach();\n\n\t\tif(mfp.content)\n\t\t\tmfp.content.detach();\n\n\t\tif(!item.parsed) {\n\t\t\titem = mfp.parseEl( mfp.index );\n\t\t}\n\n\t\tvar type = item.type;\t\n\n\t\t_mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);\n\t\t// BeforeChange event works like so:\n\t\t// _mfpOn('BeforeChange', function(e, prevType, newType) { });\n\t\t\n\t\tmfp.currItem = item;\n\n\t\t\n\n\t\t\n\n\t\tif(!mfp.currTemplate[type]) {\n\t\t\tvar markup = mfp.st[type] ? mfp.st[type].markup : false;\n\n\t\t\t// allows to modify markup\n\t\t\t_mfpTrigger('FirstMarkupParse', markup);\n\n\t\t\tif(markup) {\n\t\t\t\tmfp.currTemplate[type] = $(markup);\n\t\t\t} else {\n\t\t\t\t// if there is no markup found we just define that template is parsed\n\t\t\t\tmfp.currTemplate[type] = true;\n\t\t\t}\n\t\t}\n\n\t\tif(_prevContentType && _prevContentType !== item.type) {\n\t\t\tmfp.container.removeClass('mfp-'+_prevContentType+'-holder');\n\t\t}\n\t\t\n\t\tvar newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);\n\t\tmfp.appendContent(newContent, type);\n\n\t\titem.preloaded = true;\n\n\t\t_mfpTrigger(CHANGE_EVENT, item);\n\t\t_prevContentType = item.type;\n\t\t\n\t\t// Append container back after its content changed\n\t\tmfp.container.prepend(mfp.contentContainer);\n\n\t\t_mfpTrigger('AfterChange');\n\t},\n\n\n\t/**\n\t * Set HTML content of popup\n\t */\n\tappendContent: function(newContent, type) {\n\t\tmfp.content = newContent;\n\t\t\n\t\tif(newContent) {\n\t\t\tif(mfp.st.showCloseBtn && mfp.st.closeBtnInside &&\n\t\t\t\tmfp.currTemplate[type] === true) {\n\t\t\t\t// if there is no markup, we just append close button element inside\n\t\t\t\tif(!mfp.content.find('.mfp-close').length) {\n\t\t\t\t\tmfp.content.append(_getCloseBtn());\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmfp.content = newContent;\n\t\t\t}\n\t\t} else {\n\t\t\tmfp.content = '';\n\t\t}\n\n\t\t_mfpTrigger(BEFORE_APPEND_EVENT);\n\t\tmfp.container.addClass('mfp-'+type+'-holder');\n\n\t\tmfp.contentContainer.append(mfp.content);\n\t},\n\n\n\n\t\n\t/**\n\t * Creates Magnific Popup data object based on given data\n\t * @param  {int} index Index of item to parse\n\t */\n\tparseEl: function(index) {\n\t\tvar item = mfp.items[index],\n\t\t\ttype = item.type;\n\n\t\tif(item.tagName) {\n\t\t\titem = { el: $(item) };\n\t\t} else {\n\t\t\titem = { data: item, src: item.src };\n\t\t}\n\n\t\tif(item.el) {\n\t\t\tvar types = mfp.types;\n\n\t\t\t// check for 'mfp-TYPE' class\n\t\t\tfor(var i = 0; i < types.length; i++) {\n\t\t\t\tif( item.el.hasClass('mfp-'+types[i]) ) {\n\t\t\t\t\ttype = types[i];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titem.src = item.el.attr('data-mfp-src');\n\t\t\tif(!item.src) {\n\t\t\t\titem.src = item.el.attr('href');\n\t\t\t}\n\t\t}\n\n\t\titem.type = type || mfp.st.type || 'inline';\n\t\titem.index = index;\n\t\titem.parsed = true;\n\t\tmfp.items[index] = item;\n\t\t_mfpTrigger('ElementParse', item);\n\n\t\treturn mfp.items[index];\n\t},\n\n\n\t/**\n\t * Initializes single popup or a group of popups\n\t */\n\taddGroup: function(el, options) {\n\t\tvar eHandler = function(e) {\n\t\t\te.mfpEl = this;\n\t\t\tmfp._openClick(e, el, options);\n\t\t};\n\n\t\tif(!options) {\n\t\t\toptions = {};\n\t\t} \n\n\t\tvar eName = 'click.magnificPopup';\n\t\toptions.mainEl = el;\n\t\t\n\t\tif(options.items) {\n\t\t\toptions.isObj = true;\n\t\t\tel.off(eName).on(eName, eHandler);\n\t\t} else {\n\t\t\toptions.isObj = false;\n\t\t\tif(options.delegate) {\n\t\t\t\tel.off(eName).on(eName, options.delegate , eHandler);\n\t\t\t} else {\n\t\t\t\toptions.items = el;\n\t\t\t\tel.off(eName).on(eName, eHandler);\n\t\t\t}\n\t\t}\n\t},\n\t_openClick: function(e, el, options) {\n\t\tvar midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;\n\n\n\t\tif(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;\n\n\t\tif(disableOn) {\n\t\t\tif($.isFunction(disableOn)) {\n\t\t\t\tif( !disableOn.call(mfp) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else { // else it's number\n\t\t\t\tif( _window.width() < disableOn ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(e.type) {\n\t\t\te.preventDefault();\n\n\t\t\t// This will prevent popup from closing if element is inside and popup is already opened\n\t\t\tif(mfp.isOpen) {\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t}\n\t\t\t\n\n\t\toptions.el = $(e.mfpEl);\n\t\tif(options.delegate) {\n\t\t\toptions.items = el.find(options.delegate);\n\t\t}\n\t\tmfp.open(options);\n\t},\n\n\n\t/**\n\t * Updates text on preloader\n\t */\n\tupdateStatus: function(status, text) {\n\n\t\tif(mfp.preloader) {\n\t\t\tif(_prevStatus !== status) {\n\t\t\t\tmfp.container.removeClass('mfp-s-'+_prevStatus);\n\t\t\t}\n\n\t\t\tif(!text && status === 'loading') {\n\t\t\t\ttext = mfp.st.tLoading;\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tstatus: status,\n\t\t\t\ttext: text\n\t\t\t};\n\t\t\t// allows to modify status\n\t\t\t_mfpTrigger('UpdateStatus', data);\n\n\t\t\tstatus = data.status;\n\t\t\ttext = data.text;\n\n\t\t\tmfp.preloader.html(text);\n\n\t\t\tmfp.preloader.find('a').on('click', function(e) {\n\t\t\t\te.stopImmediatePropagation();\n\t\t\t});\n\n\t\t\tmfp.container.addClass('mfp-s-'+status);\n\t\t\t_prevStatus = status;\n\t\t}\n\t},\n\n\n\t/*\n\t\t\"Private\" helpers that aren't private at all\n\t */\n\t_addClassToMFP: function(cName) {\n\t\tmfp.bgOverlay.addClass(cName);\n\t\tmfp.wrap.addClass(cName);\n\t},\n\t_removeClassFromMFP: function(cName) {\n\t\tthis.bgOverlay.removeClass(cName);\n\t\tmfp.wrap.removeClass(cName);\n\t},\n\t_hasScrollBar: function(winHeight) {\n\t\treturn (  (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) );\n\t},\n\t_parseMarkup: function(template, values, item) {\n\t\tvar arr;\n\t\tif(item.data) {\n\t\t\tvalues = $.extend(item.data, values);\n\t\t}\n\t\t_mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] );\n\n\t\t$.each(values, function(key, value) {\n\t\t\tif(value === undefined || value === false) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tarr = key.split('_');\n\t\t\tif(arr.length > 1) {\n\t\t\t\tvar el = template.find(EVENT_NS + '-'+arr[0]);\n\n\t\t\t\tif(el.length > 0) {\n\t\t\t\t\tvar attr = arr[1];\n\t\t\t\t\tif(attr === 'replaceWith') {\n\t\t\t\t\t\tif(el[0] !== value[0]) {\n\t\t\t\t\t\t\tel.replaceWith(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(attr === 'img') {\n\t\t\t\t\t\tif(el.is('img')) {\n\t\t\t\t\t\t\tel.attr('src', value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tel.replaceWith( '<img src=\"'+value+'\" class=\"' + el.attr('class') + '\" />' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tel.attr(arr[1], value);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\ttemplate.find(EVENT_NS + '-'+key).html(value);\n\t\t\t}\n\t\t});\n\t},\n\n\t_getScrollbarSize: function() {\n\t\t// thx David\n\t\tif(mfp.scrollbarSize === undefined) {\n\t\t\tvar scrollDiv = document.createElement(\"div\");\n\t\t\tscrollDiv.id = \"mfp-sbm\";\n\t\t\tscrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';\n\t\t\tdocument.body.appendChild(scrollDiv);\n\t\t\tmfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n\t\t\tdocument.body.removeChild(scrollDiv);\n\t\t}\n\t\treturn mfp.scrollbarSize;\n\t}\n\n}; /* MagnificPopup core prototype end */\n\n\n\n\n/**\n * Public static functions\n */\n$.magnificPopup = {\n\tinstance: null,\n\tproto: MagnificPopup.prototype,\n\tmodules: [],\n\n\topen: function(options, index) {\n\t\t_checkInstance();\t\n\n\t\tif(!options) \n\t\t\toptions = {};\n\n\t\toptions.isObj = true;\n\t\toptions.index = index || 0;\n\t\treturn this.instance.open(options);\n\t},\n\n\tclose: function() {\n\t\treturn $.magnificPopup.instance.close();\n\t},\n\n\tregisterModule: function(name, module) {\n\t\tif(module.options) {\n\t\t\t$.magnificPopup.defaults[name] = module.options;\n\t\t}\n\t\t$.extend(this.proto, module.proto);\t\t\t\n\t\tthis.modules.push(name);\n\t},\n\n\tdefaults: {   \n\n\t\t// Info about options is in docs:\n\t\t// http://dimsemenov.com/plugins/magnific-popup/documentation.html#options\n\t\t\n\t\tdisableOn: 0,\t\n\n\t\tkey: null,\n\n\t\tmidClick: false,\n\n\t\tmainClass: '',\n\n\t\tpreloader: true,\n\n\t\tfocus: '', // CSS selector of input to focus after popup is opened\n\t\t\n\t\tcloseOnContentClick: false,\n\n\t\tcloseOnBgClick: true,\n\n\t\tcloseBtnInside: true, \n\n\t\tshowCloseBtn: true,\n\n\t\tenableEscapeKey: true,\n\n\t\tmodal: false,\n\n\t\talignTop: false,\n\t\n\t\tremovalDelay: 0,\n\t\t\n\t\tfixedContentPos: 'auto', \n\t\n\t\tfixedBgPos: 'auto',\n\n\t\toverflowY: 'auto',\n\n\t\tcloseMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-close\">&times;</button>',\n\n\t\ttClose: 'Close (Esc)',\n\n\t\ttLoading: 'Loading...'\n\n\t}\n};\n\n\n\n$.fn.magnificPopup = function(options) {\n\t_checkInstance();\n\n\tvar jqEl = $(this);\n\n\t// We call some API method of first param is a string\n\tif (typeof options === \"string\" ) {\n\n\t\tif(options === 'open') {\n\t\t\tvar items,\n\t\t\t\titemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,\n\t\t\t\tindex = parseInt(arguments[1], 10) || 0;\n\n\t\t\tif(itemOpts.items) {\n\t\t\t\titems = itemOpts.items[index];\n\t\t\t} else {\n\t\t\t\titems = jqEl;\n\t\t\t\tif(itemOpts.delegate) {\n\t\t\t\t\titems = items.find(itemOpts.delegate);\n\t\t\t\t}\n\t\t\t\titems = items.eq( index );\n\t\t\t}\n\t\t\tmfp._openClick({mfpEl:items}, jqEl, itemOpts);\n\t\t} else {\n\t\t\tif(mfp.isOpen)\n\t\t\t\tmfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\n\t} else {\n\n\t\t/*\n\t\t * As Zepto doesn't support .data() method for objects \n\t\t * and it works only in normal browsers\n\t\t * we assign \"options\" object directly to the DOM element. FTW!\n\t\t */\n\t\tif(_isJQ) {\n\t\t\tjqEl.data('magnificPopup', options);\n\t\t} else {\n\t\t\tjqEl[0].magnificPopup = options;\n\t\t}\n\n\t\tmfp.addGroup(jqEl, options);\n\n\t}\n\treturn jqEl;\n};\n\n\n//Quick benchmark\n/*\nvar start = performance.now(),\n\ti,\n\trounds = 1000;\n\nfor(i = 0; i < rounds; i++) {\n\n}\nconsole.log('Test #1:', performance.now() - start);\n\nstart = performance.now();\nfor(i = 0; i < rounds; i++) {\n\n}\nconsole.log('Test #2:', performance.now() - start);\n*/\n\n\n/*>>core*/\n\n/*>>inline*/\n\nvar INLINE_NS = 'inline',\n\t_hiddenClass,\n\t_inlinePlaceholder, \n\t_lastInlineElement,\n\t_putInlineElementsBack = function() {\n\t\tif(_lastInlineElement) {\n\t\t\t_inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach();\n\t\t\t_lastInlineElement = null;\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(INLINE_NS, {\n\toptions: {\n\t\thiddenClass: 'hide', // will be appended with `mfp-` prefix\n\t\tmarkup: '',\n\t\ttNotFound: 'Content not found'\n\t},\n\tproto: {\n\n\t\tinitInline: function() {\n\t\t\tmfp.types.push(INLINE_NS);\n\n\t\t\t_mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() {\n\t\t\t\t_putInlineElementsBack();\n\t\t\t});\n\t\t},\n\n\t\tgetInline: function(item, template) {\n\n\t\t\t_putInlineElementsBack();\n\n\t\t\tif(item.src) {\n\t\t\t\tvar inlineSt = mfp.st.inline,\n\t\t\t\t\tel = $(item.src);\n\n\t\t\t\tif(el.length) {\n\n\t\t\t\t\t// If target element has parent - we replace it with placeholder and put it back after popup is closed\n\t\t\t\t\tvar parent = el[0].parentNode;\n\t\t\t\t\tif(parent && parent.tagName) {\n\t\t\t\t\t\tif(!_inlinePlaceholder) {\n\t\t\t\t\t\t\t_hiddenClass = inlineSt.hiddenClass;\n\t\t\t\t\t\t\t_inlinePlaceholder = _getEl(_hiddenClass);\n\t\t\t\t\t\t\t_hiddenClass = 'mfp-'+_hiddenClass;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// replace target inline element with placeholder\n\t\t\t\t\t\t_lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);\n\t\t\t\t\t}\n\n\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t} else {\n\t\t\t\t\tmfp.updateStatus('error', inlineSt.tNotFound);\n\t\t\t\t\tel = $('<div>');\n\t\t\t\t}\n\n\t\t\t\titem.inlineElement = el;\n\t\t\t\treturn el;\n\t\t\t}\n\n\t\t\tmfp.updateStatus('ready');\n\t\t\tmfp._parseMarkup(template, {}, item);\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n/*>>inline*/\n\n/*>>ajax*/\nvar AJAX_NS = 'ajax',\n\t_ajaxCur,\n\t_removeAjaxCursor = function() {\n\t\tif(_ajaxCur) {\n\t\t\t_body.removeClass(_ajaxCur);\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(AJAX_NS, {\n\n\toptions: {\n\t\tsettings: null,\n\t\tcursor: 'mfp-ajax-cur',\n\t\ttError: '<a href=\"%url%\">The content</a> could not be loaded.'\n\t},\n\n\tproto: {\n\t\tinitAjax: function() {\n\t\t\tmfp.types.push(AJAX_NS);\n\t\t\t_ajaxCur = mfp.st.ajax.cursor;\n\n\t\t\t_mfpOn(CLOSE_EVENT+'.'+AJAX_NS, function() {\n\t\t\t\t_removeAjaxCursor();\n\t\t\t\tif(mfp.req) {\n\t\t\t\t\tmfp.req.abort();\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tgetAjax: function(item) {\n\n\t\t\tif(_ajaxCur)\n\t\t\t\t_body.addClass(_ajaxCur);\n\n\t\t\tmfp.updateStatus('loading');\n\n\t\t\tvar opts = $.extend({\n\t\t\t\turl: item.src,\n\t\t\t\tsuccess: function(data, textStatus, jqXHR) {\n\t\t\t\t\tvar temp = {\n\t\t\t\t\t\tdata:data,\n\t\t\t\t\t\txhr:jqXHR\n\t\t\t\t\t};\n\n\t\t\t\t\t_mfpTrigger('ParseAjax', temp);\n\n\t\t\t\t\tmfp.appendContent( $(temp.data), AJAX_NS );\n\n\t\t\t\t\titem.finished = true;\n\n\t\t\t\t\t_removeAjaxCursor();\n\n\t\t\t\t\t_setFocus();\n\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tmfp.wrap.addClass(READY_CLASS);\n\t\t\t\t\t}, 16);\n\n\t\t\t\t\tmfp.updateStatus('ready');\n\n\t\t\t\t\t_mfpTrigger('AjaxContentAdded');\n\t\t\t\t},\n\t\t\t\terror: function() {\n\t\t\t\t\t_removeAjaxCursor();\n\t\t\t\t\titem.finished = item.loadError = true;\n\t\t\t\t\tmfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));\n\t\t\t\t}\n\t\t\t}, mfp.st.ajax.settings);\n\n\t\t\tmfp.req = $.ajax(opts);\n\n\t\t\treturn '';\n\t\t}\n\t}\n});\n\n\n\n\n\n\t\n\n/*>>ajax*/\n\n/*>>image*/\nvar _imgInterval,\n\t_getTitle = function(item) {\n\t\tif(item.data && item.data.title !== undefined) \n\t\t\treturn item.data.title;\n\n\t\tvar src = mfp.st.image.titleSrc;\n\n\t\tif(src) {\n\t\t\tif($.isFunction(src)) {\n\t\t\t\treturn src.call(mfp, item);\n\t\t\t} else if(item.el) {\n\t\t\t\treturn item.el.attr(src) || '';\n\t\t\t}\n\t\t}\n\t\treturn '';\n\t};\n\n$.magnificPopup.registerModule('image', {\n\n\toptions: {\n\t\tmarkup: '<div class=\"mfp-figure\">'+\n\t\t\t\t\t'<div class=\"mfp-close\"></div>'+\n\t\t\t\t\t'<div class=\"mfp-img\"></div>'+\n\t\t\t\t\t'<div class=\"mfp-bottom-bar\">'+\n\t\t\t\t\t\t'<div class=\"mfp-title\"></div>'+\n\t\t\t\t\t\t'<div class=\"mfp-counter\"></div>'+\n\t\t\t\t\t'</div>'+\n\t\t\t\t'</div>',\n\t\tcursor: 'mfp-zoom-out-cur',\n\t\ttitleSrc: 'title', \n\t\tverticalFit: true,\n\t\ttError: '<a href=\"%url%\">The image</a> could not be loaded.'\n\t},\n\n\tproto: {\n\t\tinitImage: function() {\n\t\t\tvar imgSt = mfp.st.image,\n\t\t\t\tns = '.image';\n\n\t\t\tmfp.types.push('image');\n\n\t\t\t_mfpOn(OPEN_EVENT+ns, function() {\n\t\t\t\tif(mfp.currItem.type === 'image' && imgSt.cursor) {\n\t\t\t\t\t_body.addClass(imgSt.cursor);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\tif(imgSt.cursor) {\n\t\t\t\t\t_body.removeClass(imgSt.cursor);\n\t\t\t\t}\n\t\t\t\t_window.off('resize' + EVENT_NS);\n\t\t\t});\n\n\t\t\t_mfpOn('Resize'+ns, mfp.resizeImage);\n\t\t\tif(mfp.isLowIE) {\n\t\t\t\t_mfpOn('AfterChange', mfp.resizeImage);\n\t\t\t}\n\t\t},\n\t\tresizeImage: function() {\n\t\t\tvar item = mfp.currItem;\n\t\t\tif(!item.img) return;\n\n\t\t\tif(mfp.st.image.verticalFit) {\n\t\t\t\tvar decr = 0;\n\t\t\t\t// fix box-sizing in ie7/8\n\t\t\t\tif(mfp.isLowIE) {\n\t\t\t\t\tdecr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10);\n\t\t\t\t}\n\t\t\t\titem.img.css('max-height', mfp.wH-decr);\n\t\t\t}\n\t\t},\n\t\t_onImageHasSize: function(item) {\n\t\t\tif(item.img) {\n\t\t\t\t\n\t\t\t\titem.hasSize = true;\n\n\t\t\t\tif(_imgInterval) {\n\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\titem.isCheckingImgSize = false;\n\n\t\t\t\t_mfpTrigger('ImageHasSize', item);\n\n\t\t\t\tif(item.imgHidden) {\n\t\t\t\t\tif(mfp.content)\n\t\t\t\t\t\tmfp.content.removeClass('mfp-loading');\n\t\t\t\t\t\n\t\t\t\t\titem.imgHidden = false;\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Function that loops until the image has size to display elements that rely on it asap\n\t\t */\n\t\tfindImageSize: function(item) {\n\n\t\t\tvar counter = 0,\n\t\t\t\timg = item.img[0],\n\t\t\t\tmfpSetInterval = function(delay) {\n\n\t\t\t\t\tif(_imgInterval) {\n\t\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t\t}\n\t\t\t\t\t// decelerating interval that checks for size of an image\n\t\t\t\t\t_imgInterval = setInterval(function() {\n\t\t\t\t\t\tif(img.naturalWidth > 0) {\n\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(counter > 200) {\n\t\t\t\t\t\t\tclearInterval(_imgInterval);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcounter++;\n\t\t\t\t\t\tif(counter === 3) {\n\t\t\t\t\t\t\tmfpSetInterval(10);\n\t\t\t\t\t\t} else if(counter === 40) {\n\t\t\t\t\t\t\tmfpSetInterval(50);\n\t\t\t\t\t\t} else if(counter === 100) {\n\t\t\t\t\t\t\tmfpSetInterval(500);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, delay);\n\t\t\t\t};\n\n\t\t\tmfpSetInterval(1);\n\t\t},\n\n\t\tgetImage: function(item, template) {\n\n\t\t\tvar guard = 0,\n\n\t\t\t\t// image load complete handler\n\t\t\t\tonLoadComplete = function() {\n\t\t\t\t\tif(item) {\n\t\t\t\t\t\tif (item.img[0].complete) {\n\t\t\t\t\t\t\titem.img.off('.mfploader');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(item === mfp.currItem){\n\t\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\n\t\t\t\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\t\t\titem.loaded = true;\n\n\t\t\t\t\t\t\t_mfpTrigger('ImageLoadComplete');\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// if image complete check fails 200 times (20 sec), we assume that there was an error.\n\t\t\t\t\t\t\tguard++;\n\t\t\t\t\t\t\tif(guard < 200) {\n\t\t\t\t\t\t\t\tsetTimeout(onLoadComplete,100);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tonLoadError();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\t// image error handler\n\t\t\t\tonLoadError = function() {\n\t\t\t\t\tif(item) {\n\t\t\t\t\t\titem.img.off('.mfploader');\n\t\t\t\t\t\tif(item === mfp.currItem){\n\t\t\t\t\t\t\tmfp._onImageHasSize(item);\n\t\t\t\t\t\t\tmfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\t\titem.loaded = true;\n\t\t\t\t\t\titem.loadError = true;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\timgSt = mfp.st.image;\n\n\n\t\t\tvar el = template.find('.mfp-img');\n\t\t\tif(el.length) {\n\t\t\t\tvar img = new Image();\n\t\t\t\timg.className = 'mfp-img';\n\t\t\t\titem.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);\n\t\t\t\timg.src = item.src;\n\n\t\t\t\t// without clone() \"error\" event is not firing when IMG is replaced by new IMG\n\t\t\t\t// TODO: find a way to avoid such cloning\n\t\t\t\tif(el.is('img')) {\n\t\t\t\t\titem.img = item.img.clone();\n\t\t\t\t}\n\t\t\t\tif(item.img[0].naturalWidth > 0) {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmfp._parseMarkup(template, {\n\t\t\t\ttitle: _getTitle(item),\n\t\t\t\timg_replaceWith: item.img\n\t\t\t}, item);\n\n\t\t\tmfp.resizeImage();\n\n\t\t\tif(item.hasSize) {\n\t\t\t\tif(_imgInterval) clearInterval(_imgInterval);\n\n\t\t\t\tif(item.loadError) {\n\t\t\t\t\ttemplate.addClass('mfp-loading');\n\t\t\t\t\tmfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );\n\t\t\t\t} else {\n\t\t\t\t\ttemplate.removeClass('mfp-loading');\n\t\t\t\t\tmfp.updateStatus('ready');\n\t\t\t\t}\n\t\t\t\treturn template;\n\t\t\t}\n\n\t\t\tmfp.updateStatus('loading');\n\t\t\titem.loading = true;\n\n\t\t\tif(!item.hasSize) {\n\t\t\t\titem.imgHidden = true;\n\t\t\t\ttemplate.addClass('mfp-loading');\n\t\t\t\tmfp.findImageSize(item);\n\t\t\t} \n\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n\n\n/*>>image*/\n\n/*>>zoom*/\nvar hasMozTransform,\n\tgetHasMozTransform = function() {\n\t\tif(hasMozTransform === undefined) {\n\t\t\thasMozTransform = document.createElement('p').style.MozTransform !== undefined;\n\t\t}\n\t\treturn hasMozTransform;\t\t\n\t};\n\n$.magnificPopup.registerModule('zoom', {\n\n\toptions: {\n\t\tenabled: false,\n\t\teasing: 'ease-in-out',\n\t\tduration: 300,\n\t\topener: function(element) {\n\t\t\treturn element.is('img') ? element : element.find('img');\n\t\t}\n\t},\n\n\tproto: {\n\n\t\tinitZoom: function() {\n\t\t\tvar zoomSt = mfp.st.zoom,\n\t\t\t\tns = '.zoom';\n\t\t\t\t\n\t\t\tif(!zoomSt.enabled || !mfp.supportsTransition) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar duration = zoomSt.duration,\n\t\t\t\tgetElToAnimate = function(image) {\n\t\t\t\t\tvar newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),\n\t\t\t\t\t\ttransition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing,\n\t\t\t\t\t\tcssObj = {\n\t\t\t\t\t\t\tposition: 'fixed',\n\t\t\t\t\t\t\tzIndex: 9999,\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\t'-webkit-backface-visibility': 'hidden'\n\t\t\t\t\t\t},\n\t\t\t\t\t\tt = 'transition';\n\n\t\t\t\t\tcssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition;\n\n\t\t\t\t\tnewImg.css(cssObj);\n\t\t\t\t\treturn newImg;\n\t\t\t\t},\n\t\t\t\tshowMainContent = function() {\n\t\t\t\t\tmfp.content.css('visibility', 'visible');\n\t\t\t\t},\n\t\t\t\topenTimeout,\n\t\t\t\tanimatedImg;\n\n\t\t\t_mfpOn('BuildControls'+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\n\t\t\t\t\tclearTimeout(openTimeout);\n\t\t\t\t\tmfp.content.css('visibility', 'hidden');\n\n\t\t\t\t\t// Basically, all code below does is clones existing image, puts in on top of the current one and animated it\n\t\t\t\t\t\n\t\t\t\t\timage = mfp._getItemToZoom();\n\n\t\t\t\t\tif(!image) {\n\t\t\t\t\t\tshowMainContent();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tanimatedImg = getElToAnimate(image); \n\t\t\t\t\t\n\t\t\t\t\tanimatedImg.css( mfp._getOffset() );\n\n\t\t\t\t\tmfp.wrap.append(animatedImg);\n\n\t\t\t\t\topenTimeout = setTimeout(function() {\n\t\t\t\t\t\tanimatedImg.css( mfp._getOffset( true ) );\n\t\t\t\t\t\topenTimeout = setTimeout(function() {\n\n\t\t\t\t\t\t\tshowMainContent();\n\n\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\tanimatedImg.remove();\n\t\t\t\t\t\t\t\timage = animatedImg = null;\n\t\t\t\t\t\t\t\t_mfpTrigger('ZoomAnimationEnded');\n\t\t\t\t\t\t\t}, 16); // avoid blink when switching images \n\n\t\t\t\t\t\t}, duration); // this timeout equals animation duration\n\n\t\t\t\t\t}, 16); // by adding this timeout we avoid short glitch at the beginning of animation\n\n\n\t\t\t\t\t// Lots of timeouts...\n\t\t\t\t}\n\t\t\t});\n\t\t\t_mfpOn(BEFORE_CLOSE_EVENT+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\n\t\t\t\t\tclearTimeout(openTimeout);\n\n\t\t\t\t\tmfp.st.removalDelay = duration;\n\n\t\t\t\t\tif(!image) {\n\t\t\t\t\t\timage = mfp._getItemToZoom();\n\t\t\t\t\t\tif(!image) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tanimatedImg = getElToAnimate(image);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tanimatedImg.css( mfp._getOffset(true) );\n\t\t\t\t\tmfp.wrap.append(animatedImg);\n\t\t\t\t\tmfp.content.css('visibility', 'hidden');\n\t\t\t\t\t\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tanimatedImg.css( mfp._getOffset() );\n\t\t\t\t\t}, 16);\n\t\t\t\t}\n\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\tif(mfp._allowZoom()) {\n\t\t\t\t\tshowMainContent();\n\t\t\t\t\tif(animatedImg) {\n\t\t\t\t\t\tanimatedImg.remove();\n\t\t\t\t\t}\n\t\t\t\t}\t\n\t\t\t});\n\t\t},\n\n\t\t_allowZoom: function() {\n\t\t\treturn mfp.currItem.type === 'image';\n\t\t},\n\n\t\t_getItemToZoom: function() {\n\t\t\tif(mfp.currItem.hasSize) {\n\t\t\t\treturn mfp.currItem.img;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t// Get element postion relative to viewport\n\t\t_getOffset: function(isLarge) {\n\t\t\tvar el;\n\t\t\tif(isLarge) {\n\t\t\t\tel = mfp.currItem.img;\n\t\t\t} else {\n\t\t\t\tel = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);\n\t\t\t}\n\n\t\t\tvar offset = el.offset();\n\t\t\tvar paddingTop = parseInt(el.css('padding-top'),10);\n\t\t\tvar paddingBottom = parseInt(el.css('padding-bottom'),10);\n\t\t\toffset.top -= ( $(window).scrollTop() - paddingTop );\n\n\n\t\t\t/*\n\t\t\t\n\t\t\tAnimating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.\n\n\t\t\t */\n\t\t\tvar obj = {\n\t\t\t\twidth: el.width(),\n\t\t\t\t// fix Zepto height+padding issue\n\t\t\t\theight: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop\n\t\t\t};\n\n\t\t\t// I hate to do this, but there is no another option\n\t\t\tif( getHasMozTransform() ) {\n\t\t\t\tobj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';\n\t\t\t} else {\n\t\t\t\tobj.left = offset.left;\n\t\t\t\tobj.top = offset.top;\n\t\t\t}\n\t\t\treturn obj;\n\t\t}\n\n\t}\n});\n\n\n\n/*>>zoom*/\n\n/*>>iframe*/\n\nvar IFRAME_NS = 'iframe',\n\t_emptyPage = '//about:blank',\n\t\n\t_fixIframeBugs = function(isShowing) {\n\t\tif(mfp.currTemplate[IFRAME_NS]) {\n\t\t\tvar el = mfp.currTemplate[IFRAME_NS].find('iframe');\n\t\t\tif(el.length) { \n\t\t\t\t// reset src after the popup is closed to avoid \"video keeps playing after popup is closed\" bug\n\t\t\t\tif(!isShowing) {\n\t\t\t\t\tel[0].src = _emptyPage;\n\t\t\t\t}\n\n\t\t\t\t// IE8 black screen bug fix\n\t\t\t\tif(mfp.isIE8) {\n\t\t\t\t\tel.css('display', isShowing ? 'block' : 'none');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n$.magnificPopup.registerModule(IFRAME_NS, {\n\n\toptions: {\n\t\tmarkup: '<div class=\"mfp-iframe-scaler\">'+\n\t\t\t\t\t'<div class=\"mfp-close\"></div>'+\n\t\t\t\t\t'<iframe class=\"mfp-iframe\" src=\"//about:blank\" frameborder=\"0\" allowfullscreen></iframe>'+\n\t\t\t\t'</div>',\n\n\t\tsrcAction: 'iframe_src',\n\n\t\t// we don't care and support only one default type of URL by default\n\t\tpatterns: {\n\t\t\tyoutube: {\n\t\t\t\tindex: 'youtube.com', \n\t\t\t\tid: 'v=', \n\t\t\t\tsrc: '//www.youtube.com/embed/%id%?autoplay=1'\n\t\t\t},\n\t\t\tvimeo: {\n\t\t\t\tindex: 'vimeo.com/',\n\t\t\t\tid: '/',\n\t\t\t\tsrc: '//player.vimeo.com/video/%id%?autoplay=1'\n\t\t\t},\n\t\t\tgmaps: {\n\t\t\t\tindex: '//maps.google.',\n\t\t\t\tsrc: '%id%&output=embed'\n\t\t\t}\n\t\t}\n\t},\n\n\tproto: {\n\t\tinitIframe: function() {\n\t\t\tmfp.types.push(IFRAME_NS);\n\n\t\t\t_mfpOn('BeforeChange', function(e, prevType, newType) {\n\t\t\t\tif(prevType !== newType) {\n\t\t\t\t\tif(prevType === IFRAME_NS) {\n\t\t\t\t\t\t_fixIframeBugs(); // iframe if removed\n\t\t\t\t\t} else if(newType === IFRAME_NS) {\n\t\t\t\t\t\t_fixIframeBugs(true); // iframe is showing\n\t\t\t\t\t} \n\t\t\t\t}// else {\n\t\t\t\t\t// iframe source is switched, don't do anything\n\t\t\t\t//}\n\t\t\t});\n\n\t\t\t_mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() {\n\t\t\t\t_fixIframeBugs();\n\t\t\t});\n\t\t},\n\n\t\tgetIframe: function(item, template) {\n\t\t\tvar embedSrc = item.src;\n\t\t\tvar iframeSt = mfp.st.iframe;\n\t\t\t\t\n\t\t\t$.each(iframeSt.patterns, function() {\n\t\t\t\tif(embedSrc.indexOf( this.index ) > -1) {\n\t\t\t\t\tif(this.id) {\n\t\t\t\t\t\tif(typeof this.id === 'string') {\n\t\t\t\t\t\t\tembedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tembedSrc = this.id.call( this, embedSrc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tembedSrc = this.src.replace('%id%', embedSrc );\n\t\t\t\t\treturn false; // break;\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tvar dataObj = {};\n\t\t\tif(iframeSt.srcAction) {\n\t\t\t\tdataObj[iframeSt.srcAction] = embedSrc;\n\t\t\t}\n\t\t\tmfp._parseMarkup(template, dataObj, item);\n\n\t\t\tmfp.updateStatus('ready');\n\n\t\t\treturn template;\n\t\t}\n\t}\n});\n\n\n\n/*>>iframe*/\n\n/*>>gallery*/\n/**\n * Get looped index depending on number of slides\n */\nvar _getLoopedId = function(index) {\n\t\tvar numSlides = mfp.items.length;\n\t\tif(index > numSlides - 1) {\n\t\t\treturn index - numSlides;\n\t\t} else  if(index < 0) {\n\t\t\treturn numSlides + index;\n\t\t}\n\t\treturn index;\n\t},\n\t_replaceCurrTotal = function(text, curr, total) {\n\t\treturn text.replace('%curr%', curr + 1).replace('%total%', total);\n\t};\n\n$.magnificPopup.registerModule('gallery', {\n\n\toptions: {\n\t\tenabled: false,\n\t\tarrowMarkup: '<button title=\"%title%\" type=\"button\" class=\"mfp-arrow mfp-arrow-%dir%\"></button>',\n\t\tpreload: [0,2],\n\t\tnavigateByImgClick: true,\n\t\tarrows: true,\n\n\t\ttPrev: 'Previous (Left arrow key)',\n\t\ttNext: 'Next (Right arrow key)',\n\t\ttCounter: '%curr% of %total%'\n\t},\n\n\tproto: {\n\t\tinitGallery: function() {\n\n\t\t\tvar gSt = mfp.st.gallery,\n\t\t\t\tns = '.mfp-gallery',\n\t\t\t\tsupportsFastClick = Boolean($.fn.mfpFastClick);\n\n\t\t\tmfp.direction = true; // true - next, false - prev\n\t\t\t\n\t\t\tif(!gSt || !gSt.enabled ) return false;\n\n\t\t\t_wrapClasses += ' mfp-gallery';\n\n\t\t\t_mfpOn(OPEN_EVENT+ns, function() {\n\n\t\t\t\tif(gSt.navigateByImgClick) {\n\t\t\t\t\tmfp.wrap.on('click'+ns, '.mfp-img', function() {\n\t\t\t\t\t\tif(mfp.items.length > 1) {\n\t\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t_document.on('keydown'+ns, function(e) {\n\t\t\t\t\tif (e.keyCode === 37) {\n\t\t\t\t\t\tmfp.prev();\n\t\t\t\t\t} else if (e.keyCode === 39) {\n\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t_mfpOn('UpdateStatus'+ns, function(e, data) {\n\t\t\t\tif(data.text) {\n\t\t\t\t\tdata.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) {\n\t\t\t\tvar l = mfp.items.length;\n\t\t\t\tvalues.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';\n\t\t\t});\n\n\t\t\t_mfpOn('BuildControls' + ns, function() {\n\t\t\t\tif(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {\n\t\t\t\t\tvar markup = gSt.arrowMarkup,\n\t\t\t\t\t\tarrowLeft = mfp.arrowLeft = $( markup.replace('%title%', gSt.tPrev).replace('%dir%', 'left') ).addClass(PREVENT_CLOSE_CLASS),\t\t\t\n\t\t\t\t\t\tarrowRight = mfp.arrowRight = $( markup.replace('%title%', gSt.tNext).replace('%dir%', 'right') ).addClass(PREVENT_CLOSE_CLASS);\n\n\t\t\t\t\tvar eName = supportsFastClick ? 'mfpFastClick' : 'click';\n\t\t\t\t\tarrowLeft[eName](function() {\n\t\t\t\t\t\tmfp.prev();\n\t\t\t\t\t});\t\t\t\n\t\t\t\t\tarrowRight[eName](function() {\n\t\t\t\t\t\tmfp.next();\n\t\t\t\t\t});\t\n\n\t\t\t\t\t// Polyfill for :before and :after (adds elements with classes mfp-a and mfp-b)\n\t\t\t\t\tif(mfp.isIE7) {\n\t\t\t\t\t\t_getEl('b', arrowLeft[0], false, true);\n\t\t\t\t\t\t_getEl('a', arrowLeft[0], false, true);\n\t\t\t\t\t\t_getEl('b', arrowRight[0], false, true);\n\t\t\t\t\t\t_getEl('a', arrowRight[0], false, true);\n\t\t\t\t\t}\n\n\t\t\t\t\tmfp.container.append(arrowLeft.add(arrowRight));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_mfpOn(CHANGE_EVENT+ns, function() {\n\t\t\t\tif(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);\n\n\t\t\t\tmfp._preloadTimeout = setTimeout(function() {\n\t\t\t\t\tmfp.preloadNearbyImages();\n\t\t\t\t\tmfp._preloadTimeout = null;\n\t\t\t\t}, 16);\t\t\n\t\t\t});\n\n\n\t\t\t_mfpOn(CLOSE_EVENT+ns, function() {\n\t\t\t\t_document.off(ns);\n\t\t\t\tmfp.wrap.off('click'+ns);\n\t\t\t\n\t\t\t\tif(mfp.arrowLeft && supportsFastClick) {\n\t\t\t\t\tmfp.arrowLeft.add(mfp.arrowRight).destroyMfpFastClick();\n\t\t\t\t}\n\t\t\t\tmfp.arrowRight = mfp.arrowLeft = null;\n\t\t\t});\n\n\t\t}, \n\t\tnext: function() {\n\t\t\tmfp.direction = true;\n\t\t\tmfp.index = _getLoopedId(mfp.index + 1);\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tprev: function() {\n\t\t\tmfp.direction = false;\n\t\t\tmfp.index = _getLoopedId(mfp.index - 1);\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tgoTo: function(newIndex) {\n\t\t\tmfp.direction = (newIndex >= mfp.index);\n\t\t\tmfp.index = newIndex;\n\t\t\tmfp.updateItemHTML();\n\t\t},\n\t\tpreloadNearbyImages: function() {\n\t\t\tvar p = mfp.st.gallery.preload,\n\t\t\t\tpreloadBefore = Math.min(p[0], mfp.items.length),\n\t\t\t\tpreloadAfter = Math.min(p[1], mfp.items.length),\n\t\t\t\ti;\n\n\t\t\tfor(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {\n\t\t\t\tmfp._preloadItem(mfp.index+i);\n\t\t\t}\n\t\t\tfor(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {\n\t\t\t\tmfp._preloadItem(mfp.index-i);\n\t\t\t}\n\t\t},\n\t\t_preloadItem: function(index) {\n\t\t\tindex = _getLoopedId(index);\n\n\t\t\tif(mfp.items[index].preloaded) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar item = mfp.items[index];\n\t\t\tif(!item.parsed) {\n\t\t\t\titem = mfp.parseEl( index );\n\t\t\t}\n\n\t\t\t_mfpTrigger('LazyLoad', item);\n\n\t\t\tif(item.type === 'image') {\n\t\t\t\titem.img = $('<img class=\"mfp-img\" />').on('load.mfploader', function() {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t}).on('error.mfploader', function() {\n\t\t\t\t\titem.hasSize = true;\n\t\t\t\t\titem.loadError = true;\n\t\t\t\t\t_mfpTrigger('LazyLoadError', item);\n\t\t\t\t}).attr('src', item.src);\n\t\t\t}\n\n\n\t\t\titem.preloaded = true;\n\t\t}\n\t}\n});\n\n/*\nTouch Support that might be implemented some day\n\naddSwipeGesture: function() {\n\tvar startX,\n\t\tmoved,\n\t\tmultipleTouches;\n\n\t\treturn;\n\n\tvar namespace = '.mfp',\n\t\taddEventNames = function(pref, down, move, up, cancel) {\n\t\t\tmfp._tStart = pref + down + namespace;\n\t\t\tmfp._tMove = pref + move + namespace;\n\t\t\tmfp._tEnd = pref + up + namespace;\n\t\t\tmfp._tCancel = pref + cancel + namespace;\n\t\t};\n\n\tif(window.navigator.msPointerEnabled) {\n\t\taddEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');\n\t} else if('ontouchstart' in window) {\n\t\taddEventNames('touch', 'start', 'move', 'end', 'cancel');\n\t} else {\n\t\treturn;\n\t}\n\t_window.on(mfp._tStart, function(e) {\n\t\tvar oE = e.originalEvent;\n\t\tmultipleTouches = moved = false;\n\t\tstartX = oE.pageX || oE.changedTouches[0].pageX;\n\t}).on(mfp._tMove, function(e) {\n\t\tif(e.originalEvent.touches.length > 1) {\n\t\t\tmultipleTouches = e.originalEvent.touches.length;\n\t\t} else {\n\t\t\t//e.preventDefault();\n\t\t\tmoved = true;\n\t\t}\n\t}).on(mfp._tEnd + ' ' + mfp._tCancel, function(e) {\n\t\tif(moved && !multipleTouches) {\n\t\t\tvar oE = e.originalEvent,\n\t\t\t\tdiff = startX - (oE.pageX || oE.changedTouches[0].pageX);\n\n\t\t\tif(diff > 20) {\n\t\t\t\tmfp.next();\n\t\t\t} else if(diff < -20) {\n\t\t\t\tmfp.prev();\n\t\t\t}\n\t\t}\n\t});\n},\n*/\n\n\n/*>>gallery*/\n\n/*>>retina*/\n\nvar RETINA_NS = 'retina';\n\n$.magnificPopup.registerModule(RETINA_NS, {\n\toptions: {\n\t\treplaceSrc: function(item) {\n\t\t\treturn item.src.replace(/\\.\\w+$/, function(m) { return '@2x' + m; });\n\t\t},\n\t\tratio: 1 // Function or number.  Set to 1 to disable.\n\t},\n\tproto: {\n\t\tinitRetina: function() {\n\t\t\tif(window.devicePixelRatio > 1) {\n\n\t\t\t\tvar st = mfp.st.retina,\n\t\t\t\t\tratio = st.ratio;\n\n\t\t\t\tratio = !isNaN(ratio) ? ratio : ratio();\n\n\t\t\t\tif(ratio > 1) {\n\t\t\t\t\t_mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) {\n\t\t\t\t\t\titem.img.css({\n\t\t\t\t\t\t\t'max-width': item.img[0].naturalWidth / ratio,\n\t\t\t\t\t\t\t'width': '100%'\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\t_mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) {\n\t\t\t\t\t\titem.src = st.replaceSrc(item, ratio);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t}\n});\n\n/*>>retina*/\n\n/*>>fastclick*/\n/**\n * FastClick event implementation. (removes 300ms delay on touch devices)\n * Based on https://developers.google.com/mobile/articles/fast_buttons\n *\n * You may use it outside the Magnific Popup by calling just:\n *\n * $('.your-el').mfpFastClick(function() {\n *     console.log('Clicked!');\n * });\n *\n * To unbind:\n * $('.your-el').destroyMfpFastClick();\n * \n * \n * Note that it's a very basic and simple implementation, it blocks ghost click on the same element where it was bound.\n * If you need something more advanced, use plugin by FT Labs https://github.com/ftlabs/fastclick\n * \n */\n\n(function() {\n\tvar ghostClickDelay = 1000,\n\t\tsupportsTouch = 'ontouchstart' in window,\n\t\tunbindTouchMove = function() {\n\t\t\t_window.off('touchmove'+ns+' touchend'+ns);\n\t\t},\n\t\teName = 'mfpFastClick',\n\t\tns = '.'+eName;\n\n\n\t// As Zepto.js doesn't have an easy way to add custom events (like jQuery), so we implement it in this way\n\t$.fn.mfpFastClick = function(callback) {\n\n\t\treturn $(this).each(function() {\n\n\t\t\tvar elem = $(this),\n\t\t\t\tlock;\n\n\t\t\tif( supportsTouch ) {\n\n\t\t\t\tvar timeout,\n\t\t\t\t\tstartX,\n\t\t\t\t\tstartY,\n\t\t\t\t\tpointerMoved,\n\t\t\t\t\tpoint,\n\t\t\t\t\tnumPointers;\n\n\t\t\t\telem.on('touchstart' + ns, function(e) {\n\t\t\t\t\tpointerMoved = false;\n\t\t\t\t\tnumPointers = 1;\n\n\t\t\t\t\tpoint = e.originalEvent ? e.originalEvent.touches[0] : e.touches[0];\n\t\t\t\t\tstartX = point.clientX;\n\t\t\t\t\tstartY = point.clientY;\n\n\t\t\t\t\t_window.on('touchmove'+ns, function(e) {\n\t\t\t\t\t\tpoint = e.originalEvent ? e.originalEvent.touches : e.touches;\n\t\t\t\t\t\tnumPointers = point.length;\n\t\t\t\t\t\tpoint = point[0];\n\t\t\t\t\t\tif (Math.abs(point.clientX - startX) > 10 ||\n\t\t\t\t\t\t\tMath.abs(point.clientY - startY) > 10) {\n\t\t\t\t\t\t\tpointerMoved = true;\n\t\t\t\t\t\t\tunbindTouchMove();\n\t\t\t\t\t\t}\n\t\t\t\t\t}).on('touchend'+ns, function(e) {\n\t\t\t\t\t\tunbindTouchMove();\n\t\t\t\t\t\tif(pointerMoved || numPointers > 1) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlock = true;\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\t\ttimeout = setTimeout(function() {\n\t\t\t\t\t\t\tlock = false;\n\t\t\t\t\t\t}, ghostClickDelay);\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t}\n\n\t\t\telem.on('click' + ns, function() {\n\t\t\t\tif(!lock) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t};\n\n\t$.fn.destroyMfpFastClick = function() {\n\t\t$(this).off('touchstart' + ns + ' click' + ns);\n\t\tif(supportsTouch) _window.off('touchmove'+ns+' touchend'+ns);\n\t};\n})();\n\n/*>>fastclick*/\n})(window.jQuery || window.Zepto);"
  },
  {
    "path": "assets/js/plugins/respond.js",
    "content": "/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\n\nwindow.matchMedia = window.matchMedia || (function( doc, undefined ) {\n\n  \"use strict\";\n\n  var bool,\n      docElem = doc.documentElement,\n      refNode = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement( \"body\" ),\n      div = doc.createElement( \"div\" );\n\n  div.id = \"mq-test-1\";\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n\n  return function(q){\n\n    div.innerHTML = \"&shy;<style media=\\\"\" + q + \"\\\"> #mq-test-1 { width: 42px; }</style>\";\n\n    docElem.insertBefore( fakeBody, refNode );\n    bool = div.offsetWidth === 42;\n    docElem.removeChild( fakeBody );\n\n    return {\n      matches: bool,\n      media: q\n    };\n\n  };\n\n}( document ));\n\n\n\n\n\n/*! Respond.js v1.1.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\n\t\"use strict\";\n\n\t//exposed namespace\n\tvar respond = {};\n\twin.respond = respond;\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update = function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){\n\t\treturn;\n\t}\n\t\n\t//define vars\n\tvar doc = win.document,\n\t\tdocElem = doc.documentElement,\n\t\tmediastyles = [],\n\t\trules = [],\n\t\tappendedEls = [],\n\t\tparsedSheets = {},\n\t\tresizeThrottle = 30,\n\t\thead = doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase = doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks = head.getElementsByTagName( \"link\" ),\n\t\trequestQueue = [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS = function(){\n\n\t\t\tfor( var i = 0; i < links.length; i++ ){\n\t\t\t\tvar sheet = links[ i ],\n\t\t\t\thref = sheet.href,\n\t\t\t\tmedia = sheet.media,\n\t\t\t\tisCSS = sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base) ||\n\t\t\t\t\t\t\thref.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\n\t\t\t\t\t// by wrapping recursive function call in setTimeout \n\t\t\t\t\t// we prevent \"Stack overflow\" error in IE7\n\t\t\t\t\twin.setTimeout(function(){ makeRequests(); },0);\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate = function( styles, href, media ){\n\t\t\tvar qs = styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql = qs && qs.length || 0;\n\n\t\t\t//try to get CSS path\n\t\t\thref = href.substring( 0, href.lastIndexOf( \"/\" ) );\n\n\t\t\tvar repUrls\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia = !ql && media;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\n\t\t\tfor( var i = 0; i < ql; i++ ){\n\t\t\t\tvar fullq, thisq, eachq, eql;\n\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq = qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq = fullq.split( \",\" );\n\t\t\t\teql\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( var j = 0; j < eql; j++ ){\n\t\t\t\t\tthisq = eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia : thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules : rules.length - 1,\n\t\t\t\t\t\thasquery : thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw : thisq.match( /\\(\\s*min\\-width\\s*:\\s*(\\s*[0-9\\.]+)(px|em)\\s*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw : thisq.match( /\\(\\s*max\\-width\\s*:\\s*(\\s*[0-9\\.]+)(px|em)\\s*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue = function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia = function( fromResize ){\n\t\t\tvar name = \"clientWidth\",\n\t\t\t\tdocElemProp = docElem[ name ],\n\t\t\t\tcurrWidth = doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink = links[ links.length-1 ],\n\t\t\t\tnow = (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\twin.clearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = win.setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall = now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tif( mediastyles.hasOwnProperty( i ) ){\n\t\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\t\tminnull = min === null,\n\t\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\t\tem = \"em\";\n\t\t\t\t\t\n\t\t\t\t\tif( !!min ){\n\t\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t\t}\n\t\t\t\t\tif( !!max ){\n\t\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var j in appendedEls ){\n\t\t\t\tif( appendedEls.hasOwnProperty( j ) ){\n\t\t\t\t\tif( appendedEls[ j ] && appendedEls[ j ].parentNode === head ){\n\t\t\t\t\t\thead.removeChild( appendedEls[ j ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var k in styleBlocks ){\n\t\t\t\tif( styleBlocks.hasOwnProperty( k ) ){\n\t\t\t\t\tvar ss = doc.createElement( \"style\" ),\n\t\t\t\t\t\tcss = styleBlocks[ k ].join( \"\\n\" );\n\t\t\t\t\t\n\t\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\t\tss.media = k;\n\t\t\t\t\t\n\t\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\t\n\t\t\t\t\tif ( ss.styleSheet ){ \n\t\t\t\t\t\tss.styleSheet.cssText = css;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\t\tappendedEls.push( ss );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState !== 4 || req.status !== 200 && req.status !== 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t};\n\t\t\tif ( req.readyState === 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new win.XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new win.ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);"
  },
  {
    "path": "assets/less/coderay.less",
    "content": ".CodeRay {\n  font-family: @code-font;\n  .font(12);\n  color: #d0d0d0;\n  margin-bottom: 1.5em;\n  .rounded(3px);\n}\n\n.CodeRay .code pre {\n  margin: 0;\n  padding: 1em;\n  background-color: #272822;\n  border: 1px solid darken(@body-color, 5);\n}\n\ndiv.CodeRay { }\nspan.CodeRay { white-space: pre; border: 0px; padding: 2px }\n\ntable.CodeRay { border-collapse: collapse; width: 100%; padding: 2px }\ntable.CodeRay td {\n  padding: 1em 0.5em;\n  vertical-align: top;\n}\n\n.CodeRay .line-numbers, .CodeRay .no {\n  color: #8f908a;\n  text-align: right;\n}\n\n.CodeRay .line-numbers a {\n  color: #8f908a;\n}\n\n.CodeRay .line-numbers tt { font-weight: bold }\n.CodeRay .line-numbers .highlighted { color: red }\n.CodeRay .line { display: block; float: left; width: 100%; }\n.CodeRay span.line-numbers { padding: 0 24px 0 4px; }\n.CodeRay .code { width: 100% }\n\nol.CodeRay { font-size: 10pt }\nol.CodeRay li { white-space: pre }\n\n.CodeRay .code pre { overflow: auto }\n.CodeRay .debug { color:white ! important; background:blue ! important; }\n\n.CodeRay .doctype,\n.CodeRay .key,\n.CodeRay .instance-variable { color: #f8f8f2; }\n.CodeRay .attribute-name { color: #a6e22e;}\n.CodeRay .symbol,\n.CodeRay .integer,\n.CodeRay .float { color: #ff658b; }\n.CodeRay .string { color: #2dc900; }\n.CodeRay .keyword { color: #66d9ef; }\n.CodeRay .function,\n.CodeRay .class { color: #a6e22e; }\n.CodeRay .regexp,\n.CodeRay .constant,\n.CodeRay .tag { color: #f92672; }\n.CodeRay .modifier,\n.CodeRay .predefined-constant { color: #ff84e4; }\n.CodeRay .comment { color: #75715e; }\n.CodeRay .error { color: #ecc; }\n.CodeRay .content { color: #e6db74; }\n.CodeRay .delimiter { color: #e6db74; }\n.CodeRay .inline { color: #e6db74; }"
  },
  {
    "path": "assets/less/dl-menu.less",
    "content": ".dl-menuwrapper {\n\twidth: 100%;\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 1000;\n\t-webkit-perspective: 1000px;\n\t-moz-perspective: 1000px;\n\tperspective: 1000px;\n\t-webkit-perspective-origin: 50% 200%;\n\t-moz-perspective-origin: 50% 200%;\n\tperspective-origin: 50% 200%;\n\t@media @medium {\n\t\tposition: fixed;\n\t\tmax-width: 175px;\n\t\ttop: 25px;\n\t\tleft: 25px;\n\t}\n\tbutton {\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tbackground: @comp-color;\n\t\tborder: none;\n\t\twidth: 48px;\n\t\theight: 45px;\n\t\ttext-indent: -900em;\n\t\toverflow: hidden;\n\t\tposition: relative;\n\t\tcursor: pointer;\n\t\toutline: none;\n\t\t.border-radius(0,3px,0,0);\n\t\topacity: 0.6;\n\t\t@media @medium {\n\t\t\t.border-radius(3px,3px,3px,3px);\n\t\t}\n\t}\n\tbutton:hover,\n\tbutton.dl-active,\n\tul {\n\t\tbackground: #aaa;\n\t}\n\tbutton:after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\twidth: 68%;\n\t\theight: 5px;\n\t\tbackground: @white;\n\t\ttop: 10px;\n\t\tleft: 16%;\n\t\tbox-shadow: \n\t\t\t0 10px 0 @white, \n\t\t\t0 20px 0 @white;\n\t}\n\tbutton.dl-active {\n\t\tdisplay: none;\n\t}\n\tul {\n\t\tpadding: 0;\n\t\tlist-style: none;\n\t\t-webkit-transform-style: preserve-3d;\n\t\t-moz-transform-style: preserve-3d;\n\t\ttransform-style: preserve-3d;\n\t}\n\tli {\n\t\tposition: relative;\n\t\th4 {\n\t\t\tmargin:0;\n\t\t\tpadding: 15px 20px 0;\n\t\t\tcolor: fade(@white,90);\n\t\t}\n\t\tp {\n\t\t\tmargin: 0;\n\t\t\tpadding: 15px 20px;\n\t\t\t.font-rem(14);\n\t\t\tcolor: fade(@white,80);\n\t\t\ta {\n\t\t\t\tdisplay: inline;\n\t\t\t\tpadding: 0;\n\t\t\t\t.font-rem(14);\n\t\t\t}\n\t\t}\n\t\ti {\n\t\t\tdisplay: inline-block;\n\t\t\twidth: 2em;\n\t\t}\n\t\ta {\n\t\t\tdisplay: block;\n\t\t\tposition: relative;\n\t\t\tpadding: 15px 20px;\n\t\t\t.font-rem(14);\n\t\t\tline-height: 20px;\n\t\t\tfont-weight: 300;\n\t\t\tcolor: @white;\n\t\t\toutline: none;\n\t\t}\n\t\t&.dl-back > a {\n\t\t\tpadding-left: 30px;\n\t\t\tbackground: rgba(0,0,0,0.2);\n\t\t}\n\t\t&.dl-back:after,\n\t\t> a:not(:only-child):after {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tline-height: 50px;\n\t\t\tfont-family: 'fontawesome';\n\t\t\tcolor: @white;\n\t\t\tspeak: none;\n\t\t\t-webkit-font-smoothing: antialiased;\n\t\t\tcontent: \"\\f105\";\n\t\t}\n\t\t&.dl-back:after {\n\t\t\tleft: 10px;\n\t\t\tcolor: rgba(212,204,198,0.5);\n\t\t\t-webkit-transform: rotate(180deg);\n\t\t\t-moz-transform: rotate(180deg);\n\t\t\ttransform: rotate(180deg);\n\t\t}\n\t\t> a:after {\n\t\t\tright: 10px;\n\t\t\tcolor: rgba(0,0,0,0.15);\n\t\t}\n\t}\n\t.dl-menu {\n\t\tmargin: 0;\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\tmax-width: 400px;\n\t\toverflow-y: auto;\n\t\tmax-height: 600px;\n\t\topacity: 0;\n\t\tpointer-events: none;\n\t\tbox-shadow: 0 12px 24px fade(@black,35);\n\t\t-webkit-transform: translateY(10px);\n\t\t-moz-transform: translateY(10px);\n\t\ttransform: translateY(10px);\n\t\t-webkit-backface-visibility: hidden;\n\t\t-moz-backface-visibility: hidden;\n\t\tbackface-visibility: hidden;\n\t\t@media @medium {\n\t\t\t.border-radius(3px,3px,3px,3px);\n\t\t\tmax-height: 650px;\n\t\t}\n\t}\n\t.dl-menu.dl-menu-toggle {\n\t\t-webkit-transition: all 0.3s ease;\n\t\t-moz-transition: all 0.3s ease;\n\t\ttransition: all 0.3s ease;\n\t}\n\t.dl-menu.dl-menuopen {\n\t\topacity: 1;\n\t\tpointer-events: auto;\n\t\t-webkit-transform: translateY(0px);\n\t\t-moz-transform: translateY(0px);\n\t\ttransform: translateY(0px);\n\t}\n\t.dl-submenu {\n\t\t.rounded(3px);\n\t\tbox-shadow: 0 12px 24px fade(@black,35);\n\t}\n\t/* Hide the inner submenus */\n\tli .dl-submenu {\n\t\tdisplay: none;\n\t}\n}\n/* \nWhen a submenu is openend, we will hide all li siblings.\nFor that we give a class to the parent menu called \"dl-subview\".\nWe also hide the submenu link. \nThe opened submenu will get the class \"dl-subviewopen\".\nAll this is done for any sub-level being entered.\n*/\n.dl-menu.dl-subview li,\n.dl-menu.dl-subview li.dl-subviewopen > a,\n.dl-menu.dl-subview li.dl-subview > a {\n\tdisplay: none;\n}\n.dl-menu.dl-subview li.dl-subview,\n.dl-menu.dl-subview li.dl-subview .dl-submenu,\n.dl-menu.dl-subview li.dl-subviewopen,\n.dl-menu.dl-subview li.dl-subviewopen > .dl-submenu,\n.dl-menu.dl-subview li.dl-subviewopen > .dl-submenu > li {\n\tdisplay: block;\n}\n/* Animation classes for moving out and in */\n.dl-menu.dl-animate-out {\n\t-webkit-animation: MenuAnimOut 0.4s ease;\n\t-moz-animation: MenuAnimOut 0.4s ease;\n\tanimation: MenuAnimOut 0.4s ease;\n}\n@-webkit-keyframes MenuAnimOut {\n\t100% {\n\t\t-webkit-transform: translateZ(300px);\n\t\topacity: 0;\n\t}\n}\n@-moz-keyframes MenuAnimOut {\n\t100% {\n\t\t-moz-transform: translateZ(300px);\n\t\topacity: 0;\n\t}\n}\n@keyframes MenuAnimOut {\n\t100% {\n\t\ttransform: translateZ(300px);\n\t\topacity: 0;\n\t}\n}\n.dl-menu.dl-animate-in {\n\t-webkit-animation: MenuAnimIn 0.4s ease;\n\t-moz-animation: MenuAnimIn 0.4s ease;\n\tanimation: MenuAnimIn 0.4s ease;\n}\n@-webkit-keyframes MenuAnimIn {\n\t0% {\n\t\t-webkit-transform: translateZ(300px);\n\t\topacity: 0;\n\t}\n\t100% {\n\t\t-webkit-transform: translateZ(0px);\n\t\topacity: 1;\n\t}\n}\n@-moz-keyframes MenuAnimIn {\n\t0% {\n\t\t-moz-transform: translateZ(300px);\n\t\topacity: 0;\n\t}\n\t100% {\n\t\t-moz-transform: translateZ(0px);\n\t\topacity: 1;\n\t}\n}\n@keyframes MenuAnimIn {\n\t0% {\n\t\ttransform: translateZ(300px);\n\t\topacity: 0;\n\t}\n\t100% {\n\t\ttransform: translateZ(0px);\n\t\topacity: 1;\n\t}\n}\n.dl-menuwrapper > .dl-submenu.dl-animate-in {\n\t-webkit-animation: SubMenuAnimIn 0.4s ease;\n\t-moz-animation: SubMenuAnimIn 0.4s ease;\n\tanimation: SubMenuAnimIn 0.4s ease;\n}\n@-webkit-keyframes SubMenuAnimIn {\n\t0% {\n\t\t-webkit-transform: translateZ(-300px);\n\t\topacity: 0;\n\t}\n\t100% {\n\t\t-webkit-transform: translateZ(0px);\n\t\topacity: 1;\n\t}\n}\n@-moz-keyframes SubMenuAnimIn {\n\t0% {\n\t\t-moz-transform: translateZ(-300px);\n\t\topacity: 0;\n\t}\n\t100% {\n\t\t-moz-transform: translateZ(0px);\n\t\topacity: 1;\n\t}\n}\n@keyframes SubMenuAnimIn {\n\t0% {\n\t\ttransform: translateZ(-300px);\n\t\topacity: 0;\n\t}\n\t100% {\n\t\ttransform: translateZ(0px);\n\t\topacity: 1;\n\t}\n}\n.dl-menuwrapper > .dl-submenu.dl-animate-out {\n\t-webkit-animation: SubMenuAnimOut 0.4s ease;\n\t-moz-animation: SubMenuAnimOut 0.4s ease;\n\tanimation: SubMenuAnimOut 0.4s ease;\n}\n@-webkit-keyframes SubMenuAnimOut {\n\t0% {\n\t\t-webkit-transform: translateZ(0px);\n\t\topacity: 1;\n\t}\n\t100% {\n\t\t-webkit-transform: translateZ(-300px);\n\t\topacity: 0;\n\t}\n}\n@-moz-keyframes SubMenuAnimOut {\n\t0% {\n\t\t-moz-transform: translateZ(0px);\n\t\topacity: 1;\n\t}\n\t100% {\n\t\t-moz-transform: translateZ(-300px);\n\t\topacity: 0;\n\t}\n}\n@keyframes SubMenuAnimOut {\n\t0% {\n\t\ttransform: translateZ(0px);\n\t\topacity: 1;\n\t}\n\t100% {\n\t\ttransform: translateZ(-300px);\n\t\topacity: 0;\n\t}\n}\n/* No Touch Fallback */\n.no-touch .dl-menuwrapper li a:hover {\n\tbackground: rgba(255,248,213,0.1);\n}\n/* No JS Fallback */\n.no-js {\n\t.dl-trigger {\n\t\tdisplay: none;\n\t}\n\t.dl-menuwrapper .dl-menu {\n\t\tposition: relative;\n\t\topacity: 1;\n\t\tpointer-events: auto;\n\t\t-webkit-transform: none;\n\t\t-moz-transform: none;\n\t\ttransform: none;\n\t}\n\t.dl-menuwrapper li .dl-submenu {\n\t\tdisplay: block;\n\t}\n\t.dl-menuwrapper li.dl-back {\n\t\tdisplay: none;\n\t}\n\t.dl-menuwrapper li > a:not(:only-child) {\n\t\tbackground: rgba(0,0,0,0.1);\n\t}\n\t.dl-menuwrapper li > a:not(:only-child):after {\n\t\tcontent: '';\n\t}\n}\n// Menu Color\n.dl-menuwrapper button:hover,\n.dl-menuwrapper button.dl-active,\n.dl-menuwrapper ul {\n\tbackground: @comp-color;\n}\n// Fix for IE\n.dl-menu li {\n\tdisplay: none\n}\n.dl-menuopen li {\n\tdisplay: block\n}\n"
  },
  {
    "path": "assets/less/elements.less",
    "content": "hr { \n    display: block; \n    margin: 1em 0; \n    padding: 0;\n    height: 1px; \n    border: 0; \n    border-top: 1px solid #ccc;\n    border-bottom: 1px solid #fff; \n}\n\n// Figures and images\n// --------------------------------------------------\nfigure {\n  margin: 0;\n  padding-top: 10px;\n  padding-bottom: 10px;\n  .clearfix();\n  img {\n    margin-bottom: 10px;\n  }\n  a { \n    img {\n      .translate(0, 0);\n      -webkit-transition-duration: 0.25s;\n      -moz-transition-duration: 0.25s;\n      -o-transition-duration: 0.25s;\n      &:hover {\n        .translate(0, -5px);\n        .box-shadow(0 0 10px fade(@base-color, 20));\n      }\n    }\n  }\n  &.half {\n    @media @large {\n      img {\n        width: 310px;\n        float: left;\n        margin-right: 10px;\n      }\n      figcaption {\n        clear: left;\n      }\n    }\n  }\n  &.third {\n    @media @large {\n      img {\n        width: 200px;\n        float: left;\n        margin-right: 10px;\n      }\n      figcaption {\n        clear: left;\n      }\n    }\n  }\n}\nsvg:not(:root) {\n  overflow: hidden; \n}\n\n// Buttons\n// --------------------------------------------------\n.btn {\n  display: inline-block;\n  margin-bottom: 20px;\n  padding: 8px 20px;\n  .font-rem(14);\n  background-color: @primary;\n  color: @white;\n  border-width: 2px !important;\n  border-style: solid !important;\n  border-color: @primary;\n  .rounded(3px);\n  &:visited {\n    color: @white;\n  }\n  &:hover {\n    background-color: @white;\n    color: @primary;\n  }\n}\n.btn-success {\n  background-color: @success;\n  color: @white;\n  border-color: @success;\n  &:visited {\n    color: @white;\n  }\n  &:hover {\n    background-color: @white;\n    color: @success;\n  }\n}\n.btn-warning {\n  background-color: @warning;\n  color: @white;\n  border-color: @warning;\n  &:visited {\n    color: @white;\n  }\n  &:hover {\n    background-color: @white;\n    color: @warning;\n  }\n}\n.btn-danger {\n  background-color: @danger;\n  color: @white;\n  border-color: @danger;\n  &:visited {\n    color: @white;\n  }\n  &:hover {\n    background-color: @white;\n    color: @danger;\n  }\n}\n.btn-info {\n  background-color: @info;\n  color: @white;\n  border-color: @info;\n  &:visited {\n    color: @white;\n  }\n  &:hover {\n    background-color: @white;\n    color: @info;\n  }\n}\n\n// Well\n// --------------------------------------------------\n.well {\n  padding: 20px;\n  border: 1px solid @comp-color;\n  .rounded(4px);\n}\n\n// Animations\n// --------------------------------------------------\n.animated{-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;}.animated.hinge{-webkit-animation-duration:2s;-moz-animation-duration:2s;-ms-animation-duration:2s;-o-animation-duration:2s;animation-duration:2s;}@-webkit-keyframes fadeIn {\n  0% {opacity: 0;}  100% {opacity: 1;}\n}\n\n@-moz-keyframes fadeIn {\n  0% {opacity: 0;}  \n  100% {opacity: 1;}\n}\n\n@-o-keyframes fadeIn {\n  0% {opacity: 0;}  \n  100% {opacity: 1;}\n}\n\n@keyframes fadeIn {\n  0% {opacity: 0;}  \n  100% {opacity: 1;}\n}\n\n.fadeIn {\n  -webkit-animation-name: fadeIn;\n  -moz-animation-name: fadeIn;\n  -o-animation-name: fadeIn;\n  animation-name: fadeIn;\n}\n@-webkit-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-20px);\n  }\n  \n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-20px);\n  }\n  \n  100% {\n    opacity: 1;\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-20px);\n  }\n  \n  100% {\n    opacity: 1;\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes fadeInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-20px);\n  }\n  \n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.fadeInDown {\n  -webkit-animation-name: fadeInDown;\n  -moz-animation-name: fadeInDown;\n  -o-animation-name: fadeInDown;\n  animation-name: fadeInDown;\n}\n@-webkit-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-2000px);\n  }\n  \n  100% {\n    opacity: 1;\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-2000px);\n  }\n  \n  100% {\n    opacity: 1;\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-2000px);\n  }\n  \n  100% {\n    opacity: 1;\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes fadeInDownBig {\n  0% {\n    opacity: 0;\n    transform: translateY(-2000px);\n  }\n  \n  100% {\n    opacity: 1;\n    transform: translateY(0);\n  }\n}\n\n.fadeInDownBig {\n  -webkit-animation-name: fadeInDownBig;\n  -moz-animation-name: fadeInDownBig;\n  -o-animation-name: fadeInDownBig;\n  animation-name: fadeInDownBig;\n}\n@-webkit-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -webkit-transform: scale(.3);\n  }\n  \n  50% {\n    opacity: 1;\n    -webkit-transform: scale(1.05);\n  }\n  \n  70% {\n    -webkit-transform: scale(.9);\n  }\n  \n  100% {\n    -webkit-transform: scale(1);\n  }\n}\n\n@-moz-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -moz-transform: scale(.3);\n  }\n  \n  50% {\n    opacity: 1;\n    -moz-transform: scale(1.05);\n  }\n  \n  70% {\n    -moz-transform: scale(.9);\n  }\n  \n  100% {\n    -moz-transform: scale(1);\n  }\n}\n\n@-o-keyframes bounceIn {\n  0% {\n    opacity: 0;\n    -o-transform: scale(.3);\n  }\n  \n  50% {\n    opacity: 1;\n    -o-transform: scale(1.05);\n  }\n  \n  70% {\n    -o-transform: scale(.9);\n  }\n  \n  100% {\n    -o-transform: scale(1);\n  }\n}\n\n@keyframes bounceIn {\n  0% {\n    opacity: 0;\n    transform: scale(.3);\n  }\n  \n  50% {\n    opacity: 1;\n    transform: scale(1.05);\n  }\n  \n  70% {\n    transform: scale(.9);\n  }\n  \n  100% {\n    transform: scale(1);\n  }\n}\n\n.bounceIn {\n  -webkit-animation-name: bounceIn;\n  -moz-animation-name: bounceIn;\n  -o-animation-name: bounceIn;\n  animation-name: bounceIn;\n}\n@-webkit-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -webkit-transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    -webkit-transform: translateY(30px);\n  }\n  \n  80% {\n    -webkit-transform: translateY(-10px);\n  }\n  \n  100% {\n    -webkit-transform: translateY(0);\n  }\n}\n\n@-moz-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -moz-transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    -moz-transform: translateY(30px);\n  }\n  \n  80% {\n    -moz-transform: translateY(-10px);\n  }\n  \n  100% {\n    -moz-transform: translateY(0);\n  }\n}\n\n@-o-keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    -o-transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    -o-transform: translateY(30px);\n  }\n  \n  80% {\n    -o-transform: translateY(-10px);\n  }\n  \n  100% {\n    -o-transform: translateY(0);\n  }\n}\n\n@keyframes bounceInDown {\n  0% {\n    opacity: 0;\n    transform: translateY(-2000px);\n  }\n  \n  60% {\n    opacity: 1;\n    transform: translateY(30px);\n  }\n  \n  80% {\n    transform: translateY(-10px);\n  }\n  \n  100% {\n    transform: translateY(0);\n  }\n}\n\n.bounceInDown {\n  -webkit-animation-name: bounceInDown;\n  -moz-animation-name: bounceInDown;\n  -o-animation-name: bounceInDown;\n  animation-name: bounceInDown;\n}\n\n@-webkit-keyframes drop {\n  0% {\n    -webkit-transform: translateY(-500px);\n  } \n  100% {\n    -webkit-transform: translateY(0);\n  }\n}\n@-moz-keyframes drop {\n  0% {\n    -moz-transform: translateY(-500px);\n  } \n  100% {\n    -moz-transform: translateY(0);\n  }\n}\n@-o-keyframes drop {\n  0% {\n    -o-transform: translateY(-500px);\n  } \n  100% {\n    -o-transform: translateY(0);\n  }\n}\n@keyframes drop {\n  0% {\n    transform: translateY(-500px);\n  } \n  100% {\n    transform: translateY(0);\n  }\n}\n.drop {\n  -webkit-animation-name: drop;\n  -moz-animation-name: drop;\n  -o-animation-name: drop;\n  animation-name: drop;\n}"
  },
  {
    "path": "assets/less/font-awesome/bordered-pulled.less",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em @fa-border-color;\n  border-radius: .1em;\n}\n\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.@{fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "assets/less/font-awesome/core.less",
    "content": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font-family: FontAwesome;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "assets/less/font-awesome/fixed-width.less",
    "content": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "assets/less/font-awesome/font-awesome.less",
    "content": "/*!\n *  Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables.less\";\n@import \"mixins.less\";\n@import \"path.less\";\n@import \"core.less\";\n@import \"larger.less\";\n@import \"fixed-width.less\";\n@import \"list.less\";\n@import \"bordered-pulled.less\";\n@import \"spinning.less\";\n@import \"rotated-flipped.less\";\n@import \"stacked.less\";\n@import \"icons.less\";\n"
  },
  {
    "path": "assets/less/font-awesome/icons.less",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }\n.@{fa-css-prefix}-music:before { content: @fa-var-music; }\n.@{fa-css-prefix}-search:before { content: @fa-var-search; }\n.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }\n.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }\n.@{fa-css-prefix}-star:before { content: @fa-var-star; }\n.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }\n.@{fa-css-prefix}-user:before { content: @fa-var-user; }\n.@{fa-css-prefix}-film:before { content: @fa-var-film; }\n.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }\n.@{fa-css-prefix}-th:before { content: @fa-var-th; }\n.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }\n.@{fa-css-prefix}-check:before { content: @fa-var-check; }\n.@{fa-css-prefix}-times:before { content: @fa-var-times; }\n.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }\n.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }\n.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }\n.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }\n.@{fa-css-prefix}-gear:before,\n.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }\n.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }\n.@{fa-css-prefix}-home:before { content: @fa-var-home; }\n.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }\n.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }\n.@{fa-css-prefix}-road:before { content: @fa-var-road; }\n.@{fa-css-prefix}-download:before { content: @fa-var-download; }\n.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }\n.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }\n.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }\n.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }\n.@{fa-css-prefix}-rotate-right:before,\n.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }\n.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }\n.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }\n.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }\n.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }\n.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }\n.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }\n.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }\n.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }\n.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }\n.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }\n.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }\n.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }\n.@{fa-css-prefix}-book:before { content: @fa-var-book; }\n.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }\n.@{fa-css-prefix}-print:before { content: @fa-var-print; }\n.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }\n.@{fa-css-prefix}-font:before { content: @fa-var-font; }\n.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }\n.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }\n.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }\n.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }\n.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }\n.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }\n.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }\n.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }\n.@{fa-css-prefix}-list:before { content: @fa-var-list; }\n.@{fa-css-prefix}-dedent:before,\n.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }\n.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }\n.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }\n.@{fa-css-prefix}-photo:before,\n.@{fa-css-prefix}-image:before,\n.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }\n.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }\n.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }\n.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }\n.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }\n.@{fa-css-prefix}-edit:before,\n.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }\n.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }\n.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }\n.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }\n.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }\n.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }\n.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }\n.@{fa-css-prefix}-play:before { content: @fa-var-play; }\n.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }\n.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }\n.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }\n.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }\n.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }\n.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }\n.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }\n.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }\n.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }\n.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }\n.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }\n.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }\n.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }\n.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }\n.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }\n.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }\n.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }\n.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }\n.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }\n.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }\n.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }\n.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }\n.@{fa-css-prefix}-mail-forward:before,\n.@{fa-css-prefix}-share:before { content: @fa-var-share; }\n.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }\n.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }\n.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }\n.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }\n.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }\n.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }\n.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }\n.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }\n.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }\n.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }\n.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }\n.@{fa-css-prefix}-warning:before,\n.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }\n.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }\n.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }\n.@{fa-css-prefix}-random:before { content: @fa-var-random; }\n.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }\n.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }\n.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }\n.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }\n.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }\n.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }\n.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }\n.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }\n.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }\n.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }\n.@{fa-css-prefix}-bar-chart-o:before { content: @fa-var-bar-chart-o; }\n.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }\n.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }\n.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }\n.@{fa-css-prefix}-key:before { content: @fa-var-key; }\n.@{fa-css-prefix}-gears:before,\n.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }\n.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }\n.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }\n.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }\n.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }\n.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }\n.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }\n.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }\n.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }\n.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }\n.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }\n.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }\n.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }\n.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }\n.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }\n.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }\n.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }\n.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }\n.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }\n.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }\n.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }\n.@{fa-css-prefix}-github:before { content: @fa-var-github; }\n.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }\n.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }\n.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }\n.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }\n.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }\n.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }\n.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }\n.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }\n.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }\n.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }\n.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }\n.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }\n.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }\n.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }\n.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }\n.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }\n.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }\n.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }\n.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }\n.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }\n.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }\n.@{fa-css-prefix}-group:before,\n.@{fa-css-prefix}-users:before { content: @fa-var-users; }\n.@{fa-css-prefix}-chain:before,\n.@{fa-css-prefix}-link:before { content: @fa-var-link; }\n.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }\n.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }\n.@{fa-css-prefix}-cut:before,\n.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }\n.@{fa-css-prefix}-copy:before,\n.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }\n.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }\n.@{fa-css-prefix}-save:before,\n.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }\n.@{fa-css-prefix}-square:before { content: @fa-var-square; }\n.@{fa-css-prefix}-navicon:before,\n.@{fa-css-prefix}-reorder:before,\n.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }\n.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }\n.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }\n.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }\n.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }\n.@{fa-css-prefix}-table:before { content: @fa-var-table; }\n.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }\n.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }\n.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }\n.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }\n.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }\n.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }\n.@{fa-css-prefix}-money:before { content: @fa-var-money; }\n.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }\n.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }\n.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }\n.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }\n.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }\n.@{fa-css-prefix}-unsorted:before,\n.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }\n.@{fa-css-prefix}-sort-down:before,\n.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }\n.@{fa-css-prefix}-sort-up:before,\n.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }\n.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }\n.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }\n.@{fa-css-prefix}-rotate-left:before,\n.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }\n.@{fa-css-prefix}-legal:before,\n.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }\n.@{fa-css-prefix}-dashboard:before,\n.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }\n.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }\n.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }\n.@{fa-css-prefix}-flash:before,\n.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }\n.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }\n.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }\n.@{fa-css-prefix}-paste:before,\n.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }\n.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }\n.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }\n.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }\n.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }\n.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }\n.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }\n.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }\n.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }\n.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }\n.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }\n.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }\n.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }\n.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }\n.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }\n.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }\n.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }\n.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }\n.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }\n.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }\n.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }\n.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }\n.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }\n.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }\n.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }\n.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }\n.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }\n.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }\n.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }\n.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }\n.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }\n.@{fa-css-prefix}-mobile-phone:before,\n.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }\n.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }\n.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }\n.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }\n.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }\n.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }\n.@{fa-css-prefix}-mail-reply:before,\n.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }\n.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }\n.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }\n.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }\n.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }\n.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }\n.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }\n.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }\n.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }\n.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }\n.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }\n.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }\n.@{fa-css-prefix}-code:before { content: @fa-var-code; }\n.@{fa-css-prefix}-mail-reply-all:before,\n.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }\n.@{fa-css-prefix}-star-half-empty:before,\n.@{fa-css-prefix}-star-half-full:before,\n.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }\n.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }\n.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }\n.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }\n.@{fa-css-prefix}-unlink:before,\n.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }\n.@{fa-css-prefix}-question:before { content: @fa-var-question; }\n.@{fa-css-prefix}-info:before { content: @fa-var-info; }\n.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }\n.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }\n.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }\n.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }\n.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }\n.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }\n.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }\n.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }\n.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }\n.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }\n.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }\n.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }\n.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }\n.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }\n.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }\n.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }\n.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }\n.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }\n.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }\n.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }\n.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }\n.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }\n.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }\n.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }\n.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }\n.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }\n.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }\n.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }\n.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }\n.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }\n.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }\n.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }\n.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }\n.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }\n.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }\n.@{fa-css-prefix}-toggle-down:before,\n.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }\n.@{fa-css-prefix}-toggle-up:before,\n.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }\n.@{fa-css-prefix}-toggle-right:before,\n.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }\n.@{fa-css-prefix}-euro:before,\n.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }\n.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }\n.@{fa-css-prefix}-dollar:before,\n.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }\n.@{fa-css-prefix}-rupee:before,\n.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }\n.@{fa-css-prefix}-cny:before,\n.@{fa-css-prefix}-rmb:before,\n.@{fa-css-prefix}-yen:before,\n.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }\n.@{fa-css-prefix}-ruble:before,\n.@{fa-css-prefix}-rouble:before,\n.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }\n.@{fa-css-prefix}-won:before,\n.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }\n.@{fa-css-prefix}-bitcoin:before,\n.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }\n.@{fa-css-prefix}-file:before { content: @fa-var-file; }\n.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }\n.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }\n.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }\n.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }\n.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }\n.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }\n.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }\n.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }\n.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }\n.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }\n.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }\n.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }\n.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }\n.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }\n.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }\n.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }\n.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }\n.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }\n.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }\n.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }\n.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }\n.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }\n.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }\n.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }\n.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }\n.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }\n.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }\n.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }\n.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }\n.@{fa-css-prefix}-android:before { content: @fa-var-android; }\n.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }\n.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }\n.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }\n.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }\n.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }\n.@{fa-css-prefix}-female:before { content: @fa-var-female; }\n.@{fa-css-prefix}-male:before { content: @fa-var-male; }\n.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; }\n.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }\n.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }\n.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }\n.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }\n.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }\n.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }\n.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }\n.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }\n.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }\n.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }\n.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }\n.@{fa-css-prefix}-toggle-left:before,\n.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }\n.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }\n.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }\n.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }\n.@{fa-css-prefix}-turkish-lira:before,\n.@{fa-css-prefix}-try:before { content: @fa-var-try; }\n.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }\n.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }\n.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }\n.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }\n.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }\n.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }\n.@{fa-css-prefix}-institution:before,\n.@{fa-css-prefix}-bank:before,\n.@{fa-css-prefix}-university:before { content: @fa-var-university; }\n.@{fa-css-prefix}-mortar-board:before,\n.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }\n.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }\n.@{fa-css-prefix}-google:before { content: @fa-var-google; }\n.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }\n.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }\n.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }\n.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }\n.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }\n.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }\n.@{fa-css-prefix}-pied-piper-square:before,\n.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }\n.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }\n.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }\n.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }\n.@{fa-css-prefix}-language:before { content: @fa-var-language; }\n.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }\n.@{fa-css-prefix}-building:before { content: @fa-var-building; }\n.@{fa-css-prefix}-child:before { content: @fa-var-child; }\n.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }\n.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }\n.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }\n.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }\n.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }\n.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }\n.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }\n.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }\n.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }\n.@{fa-css-prefix}-automobile:before,\n.@{fa-css-prefix}-car:before { content: @fa-var-car; }\n.@{fa-css-prefix}-cab:before,\n.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }\n.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }\n.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }\n.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }\n.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }\n.@{fa-css-prefix}-database:before { content: @fa-var-database; }\n.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }\n.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }\n.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }\n.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }\n.@{fa-css-prefix}-file-photo-o:before,\n.@{fa-css-prefix}-file-picture-o:before,\n.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }\n.@{fa-css-prefix}-file-zip-o:before,\n.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }\n.@{fa-css-prefix}-file-sound-o:before,\n.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }\n.@{fa-css-prefix}-file-movie-o:before,\n.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }\n.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }\n.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }\n.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }\n.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }\n.@{fa-css-prefix}-life-bouy:before,\n.@{fa-css-prefix}-life-saver:before,\n.@{fa-css-prefix}-support:before,\n.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }\n.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }\n.@{fa-css-prefix}-ra:before,\n.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }\n.@{fa-css-prefix}-ge:before,\n.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }\n.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }\n.@{fa-css-prefix}-git:before { content: @fa-var-git; }\n.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }\n.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }\n.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }\n.@{fa-css-prefix}-wechat:before,\n.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }\n.@{fa-css-prefix}-send:before,\n.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }\n.@{fa-css-prefix}-send-o:before,\n.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }\n.@{fa-css-prefix}-history:before { content: @fa-var-history; }\n.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }\n.@{fa-css-prefix}-header:before { content: @fa-var-header; }\n.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }\n.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }\n.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }\n.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }\n.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }\n"
  },
  {
    "path": "assets/less/font-awesome/larger.less",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.@{fa-css-prefix}-2x { font-size: 2em; }\n.@{fa-css-prefix}-3x { font-size: 3em; }\n.@{fa-css-prefix}-4x { font-size: 4em; }\n.@{fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "assets/less/font-awesome/list.less",
    "content": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.@{fa-css-prefix}-li {\n  position: absolute;\n  left: -@fa-li-width;\n  width: @fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.@{fa-css-prefix}-lg {\n    left: -@fa-li-width + (4em / 14);\n  }\n}\n"
  },
  {
    "path": "assets/less/font-awesome/mixins.less",
    "content": "// Mixins\n// --------------------------\n\n.fa-icon-rotate(@degrees, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);\n  -webkit-transform: rotate(@degrees);\n     -moz-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n\n.fa-icon-flip(@horiz, @vert, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);\n  -webkit-transform: scale(@horiz, @vert);\n     -moz-transform: scale(@horiz, @vert);\n      -ms-transform: scale(@horiz, @vert);\n       -o-transform: scale(@horiz, @vert);\n          transform: scale(@horiz, @vert);\n}\n"
  },
  {
    "path": "assets/less/font-awesome/path.less",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: ~\"url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}')\";\n  src: ~\"url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype')\",\n    ~\"url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff')\",\n    ~\"url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype')\",\n    ~\"url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg')\";\n//  src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "assets/less/font-awesome/rotated-flipped.less",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }\n.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }\n\n.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }\n.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }\n"
  },
  {
    "path": "assets/less/font-awesome/spinning.less",
    "content": "// Spinning Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: spin 2s infinite linear;\n  -moz-animation: spin 2s infinite linear;\n  -o-animation: spin 2s infinite linear;\n  animation: spin 2s infinite linear;\n}\n\n@-moz-keyframes spin {\n  0% { -moz-transform: rotate(0deg); }\n  100% { -moz-transform: rotate(359deg); }\n}\n@-webkit-keyframes spin {\n  0% { -webkit-transform: rotate(0deg); }\n  100% { -webkit-transform: rotate(359deg); }\n}\n@-o-keyframes spin {\n  0% { -o-transform: rotate(0deg); }\n  100% { -o-transform: rotate(359deg); }\n}\n@keyframes spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "assets/less/font-awesome/stacked.less",
    "content": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.@{fa-css-prefix}-stack-1x { line-height: inherit; }\n.@{fa-css-prefix}-stack-2x { font-size: 2em; }\n.@{fa-css-prefix}-inverse { color: @fa-inverse; }\n"
  },
  {
    "path": "assets/less/font-awesome/variables.less",
    "content": "// Variables\n// --------------------------\n\n@fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.1.0/fonts\"; // for referencing Bootstrap CDN font files directly\n@fa-css-prefix:       fa;\n@fa-version:          \"4.1.0\";\n@fa-border-color:     #eee;\n@fa-inverse:          #fff;\n@fa-li-width:         (30em / 14);\n\n@fa-var-adjust: \"\\f042\";\n@fa-var-adn: \"\\f170\";\n@fa-var-align-center: \"\\f037\";\n@fa-var-align-justify: \"\\f039\";\n@fa-var-align-left: \"\\f036\";\n@fa-var-align-right: \"\\f038\";\n@fa-var-ambulance: \"\\f0f9\";\n@fa-var-anchor: \"\\f13d\";\n@fa-var-android: \"\\f17b\";\n@fa-var-angle-double-down: \"\\f103\";\n@fa-var-angle-double-left: \"\\f100\";\n@fa-var-angle-double-right: \"\\f101\";\n@fa-var-angle-double-up: \"\\f102\";\n@fa-var-angle-down: \"\\f107\";\n@fa-var-angle-left: \"\\f104\";\n@fa-var-angle-right: \"\\f105\";\n@fa-var-angle-up: \"\\f106\";\n@fa-var-apple: \"\\f179\";\n@fa-var-archive: \"\\f187\";\n@fa-var-arrow-circle-down: \"\\f0ab\";\n@fa-var-arrow-circle-left: \"\\f0a8\";\n@fa-var-arrow-circle-o-down: \"\\f01a\";\n@fa-var-arrow-circle-o-left: \"\\f190\";\n@fa-var-arrow-circle-o-right: \"\\f18e\";\n@fa-var-arrow-circle-o-up: \"\\f01b\";\n@fa-var-arrow-circle-right: \"\\f0a9\";\n@fa-var-arrow-circle-up: \"\\f0aa\";\n@fa-var-arrow-down: \"\\f063\";\n@fa-var-arrow-left: \"\\f060\";\n@fa-var-arrow-right: \"\\f061\";\n@fa-var-arrow-up: \"\\f062\";\n@fa-var-arrows: \"\\f047\";\n@fa-var-arrows-alt: \"\\f0b2\";\n@fa-var-arrows-h: \"\\f07e\";\n@fa-var-arrows-v: \"\\f07d\";\n@fa-var-asterisk: \"\\f069\";\n@fa-var-automobile: \"\\f1b9\";\n@fa-var-backward: \"\\f04a\";\n@fa-var-ban: \"\\f05e\";\n@fa-var-bank: \"\\f19c\";\n@fa-var-bar-chart-o: \"\\f080\";\n@fa-var-barcode: \"\\f02a\";\n@fa-var-bars: \"\\f0c9\";\n@fa-var-beer: \"\\f0fc\";\n@fa-var-behance: \"\\f1b4\";\n@fa-var-behance-square: \"\\f1b5\";\n@fa-var-bell: \"\\f0f3\";\n@fa-var-bell-o: \"\\f0a2\";\n@fa-var-bitbucket: \"\\f171\";\n@fa-var-bitbucket-square: \"\\f172\";\n@fa-var-bitcoin: \"\\f15a\";\n@fa-var-bold: \"\\f032\";\n@fa-var-bolt: \"\\f0e7\";\n@fa-var-bomb: \"\\f1e2\";\n@fa-var-book: \"\\f02d\";\n@fa-var-bookmark: \"\\f02e\";\n@fa-var-bookmark-o: \"\\f097\";\n@fa-var-briefcase: \"\\f0b1\";\n@fa-var-btc: \"\\f15a\";\n@fa-var-bug: \"\\f188\";\n@fa-var-building: \"\\f1ad\";\n@fa-var-building-o: \"\\f0f7\";\n@fa-var-bullhorn: \"\\f0a1\";\n@fa-var-bullseye: \"\\f140\";\n@fa-var-cab: \"\\f1ba\";\n@fa-var-calendar: \"\\f073\";\n@fa-var-calendar-o: \"\\f133\";\n@fa-var-camera: \"\\f030\";\n@fa-var-camera-retro: \"\\f083\";\n@fa-var-car: \"\\f1b9\";\n@fa-var-caret-down: \"\\f0d7\";\n@fa-var-caret-left: \"\\f0d9\";\n@fa-var-caret-right: \"\\f0da\";\n@fa-var-caret-square-o-down: \"\\f150\";\n@fa-var-caret-square-o-left: \"\\f191\";\n@fa-var-caret-square-o-right: \"\\f152\";\n@fa-var-caret-square-o-up: \"\\f151\";\n@fa-var-caret-up: \"\\f0d8\";\n@fa-var-certificate: \"\\f0a3\";\n@fa-var-chain: \"\\f0c1\";\n@fa-var-chain-broken: \"\\f127\";\n@fa-var-check: \"\\f00c\";\n@fa-var-check-circle: \"\\f058\";\n@fa-var-check-circle-o: \"\\f05d\";\n@fa-var-check-square: \"\\f14a\";\n@fa-var-check-square-o: \"\\f046\";\n@fa-var-chevron-circle-down: \"\\f13a\";\n@fa-var-chevron-circle-left: \"\\f137\";\n@fa-var-chevron-circle-right: \"\\f138\";\n@fa-var-chevron-circle-up: \"\\f139\";\n@fa-var-chevron-down: \"\\f078\";\n@fa-var-chevron-left: \"\\f053\";\n@fa-var-chevron-right: \"\\f054\";\n@fa-var-chevron-up: \"\\f077\";\n@fa-var-child: \"\\f1ae\";\n@fa-var-circle: \"\\f111\";\n@fa-var-circle-o: \"\\f10c\";\n@fa-var-circle-o-notch: \"\\f1ce\";\n@fa-var-circle-thin: \"\\f1db\";\n@fa-var-clipboard: \"\\f0ea\";\n@fa-var-clock-o: \"\\f017\";\n@fa-var-cloud: \"\\f0c2\";\n@fa-var-cloud-download: \"\\f0ed\";\n@fa-var-cloud-upload: \"\\f0ee\";\n@fa-var-cny: \"\\f157\";\n@fa-var-code: \"\\f121\";\n@fa-var-code-fork: \"\\f126\";\n@fa-var-codepen: \"\\f1cb\";\n@fa-var-coffee: \"\\f0f4\";\n@fa-var-cog: \"\\f013\";\n@fa-var-cogs: \"\\f085\";\n@fa-var-columns: \"\\f0db\";\n@fa-var-comment: \"\\f075\";\n@fa-var-comment-o: \"\\f0e5\";\n@fa-var-comments: \"\\f086\";\n@fa-var-comments-o: \"\\f0e6\";\n@fa-var-compass: \"\\f14e\";\n@fa-var-compress: \"\\f066\";\n@fa-var-copy: \"\\f0c5\";\n@fa-var-credit-card: \"\\f09d\";\n@fa-var-crop: \"\\f125\";\n@fa-var-crosshairs: \"\\f05b\";\n@fa-var-css3: \"\\f13c\";\n@fa-var-cube: \"\\f1b2\";\n@fa-var-cubes: \"\\f1b3\";\n@fa-var-cut: \"\\f0c4\";\n@fa-var-cutlery: \"\\f0f5\";\n@fa-var-dashboard: \"\\f0e4\";\n@fa-var-database: \"\\f1c0\";\n@fa-var-dedent: \"\\f03b\";\n@fa-var-delicious: \"\\f1a5\";\n@fa-var-desktop: \"\\f108\";\n@fa-var-deviantart: \"\\f1bd\";\n@fa-var-digg: \"\\f1a6\";\n@fa-var-dollar: \"\\f155\";\n@fa-var-dot-circle-o: \"\\f192\";\n@fa-var-download: \"\\f019\";\n@fa-var-dribbble: \"\\f17d\";\n@fa-var-dropbox: \"\\f16b\";\n@fa-var-drupal: \"\\f1a9\";\n@fa-var-edit: \"\\f044\";\n@fa-var-eject: \"\\f052\";\n@fa-var-ellipsis-h: \"\\f141\";\n@fa-var-ellipsis-v: \"\\f142\";\n@fa-var-empire: \"\\f1d1\";\n@fa-var-envelope: \"\\f0e0\";\n@fa-var-envelope-o: \"\\f003\";\n@fa-var-envelope-square: \"\\f199\";\n@fa-var-eraser: \"\\f12d\";\n@fa-var-eur: \"\\f153\";\n@fa-var-euro: \"\\f153\";\n@fa-var-exchange: \"\\f0ec\";\n@fa-var-exclamation: \"\\f12a\";\n@fa-var-exclamation-circle: \"\\f06a\";\n@fa-var-exclamation-triangle: \"\\f071\";\n@fa-var-expand: \"\\f065\";\n@fa-var-external-link: \"\\f08e\";\n@fa-var-external-link-square: \"\\f14c\";\n@fa-var-eye: \"\\f06e\";\n@fa-var-eye-slash: \"\\f070\";\n@fa-var-facebook: \"\\f09a\";\n@fa-var-facebook-square: \"\\f082\";\n@fa-var-fast-backward: \"\\f049\";\n@fa-var-fast-forward: \"\\f050\";\n@fa-var-fax: \"\\f1ac\";\n@fa-var-female: \"\\f182\";\n@fa-var-fighter-jet: \"\\f0fb\";\n@fa-var-file: \"\\f15b\";\n@fa-var-file-archive-o: \"\\f1c6\";\n@fa-var-file-audio-o: \"\\f1c7\";\n@fa-var-file-code-o: \"\\f1c9\";\n@fa-var-file-excel-o: \"\\f1c3\";\n@fa-var-file-image-o: \"\\f1c5\";\n@fa-var-file-movie-o: \"\\f1c8\";\n@fa-var-file-o: \"\\f016\";\n@fa-var-file-pdf-o: \"\\f1c1\";\n@fa-var-file-photo-o: \"\\f1c5\";\n@fa-var-file-picture-o: \"\\f1c5\";\n@fa-var-file-powerpoint-o: \"\\f1c4\";\n@fa-var-file-sound-o: \"\\f1c7\";\n@fa-var-file-text: \"\\f15c\";\n@fa-var-file-text-o: \"\\f0f6\";\n@fa-var-file-video-o: \"\\f1c8\";\n@fa-var-file-word-o: \"\\f1c2\";\n@fa-var-file-zip-o: \"\\f1c6\";\n@fa-var-files-o: \"\\f0c5\";\n@fa-var-film: \"\\f008\";\n@fa-var-filter: \"\\f0b0\";\n@fa-var-fire: \"\\f06d\";\n@fa-var-fire-extinguisher: \"\\f134\";\n@fa-var-flag: \"\\f024\";\n@fa-var-flag-checkered: \"\\f11e\";\n@fa-var-flag-o: \"\\f11d\";\n@fa-var-flash: \"\\f0e7\";\n@fa-var-flask: \"\\f0c3\";\n@fa-var-flickr: \"\\f16e\";\n@fa-var-floppy-o: \"\\f0c7\";\n@fa-var-folder: \"\\f07b\";\n@fa-var-folder-o: \"\\f114\";\n@fa-var-folder-open: \"\\f07c\";\n@fa-var-folder-open-o: \"\\f115\";\n@fa-var-font: \"\\f031\";\n@fa-var-forward: \"\\f04e\";\n@fa-var-foursquare: \"\\f180\";\n@fa-var-frown-o: \"\\f119\";\n@fa-var-gamepad: \"\\f11b\";\n@fa-var-gavel: \"\\f0e3\";\n@fa-var-gbp: \"\\f154\";\n@fa-var-ge: \"\\f1d1\";\n@fa-var-gear: \"\\f013\";\n@fa-var-gears: \"\\f085\";\n@fa-var-gift: \"\\f06b\";\n@fa-var-git: \"\\f1d3\";\n@fa-var-git-square: \"\\f1d2\";\n@fa-var-github: \"\\f09b\";\n@fa-var-github-alt: \"\\f113\";\n@fa-var-github-square: \"\\f092\";\n@fa-var-gittip: \"\\f184\";\n@fa-var-glass: \"\\f000\";\n@fa-var-globe: \"\\f0ac\";\n@fa-var-google: \"\\f1a0\";\n@fa-var-google-plus: \"\\f0d5\";\n@fa-var-google-plus-square: \"\\f0d4\";\n@fa-var-graduation-cap: \"\\f19d\";\n@fa-var-group: \"\\f0c0\";\n@fa-var-h-square: \"\\f0fd\";\n@fa-var-hacker-news: \"\\f1d4\";\n@fa-var-hand-o-down: \"\\f0a7\";\n@fa-var-hand-o-left: \"\\f0a5\";\n@fa-var-hand-o-right: \"\\f0a4\";\n@fa-var-hand-o-up: \"\\f0a6\";\n@fa-var-hdd-o: \"\\f0a0\";\n@fa-var-header: \"\\f1dc\";\n@fa-var-headphones: \"\\f025\";\n@fa-var-heart: \"\\f004\";\n@fa-var-heart-o: \"\\f08a\";\n@fa-var-history: \"\\f1da\";\n@fa-var-home: \"\\f015\";\n@fa-var-hospital-o: \"\\f0f8\";\n@fa-var-html5: \"\\f13b\";\n@fa-var-image: \"\\f03e\";\n@fa-var-inbox: \"\\f01c\";\n@fa-var-indent: \"\\f03c\";\n@fa-var-info: \"\\f129\";\n@fa-var-info-circle: \"\\f05a\";\n@fa-var-inr: \"\\f156\";\n@fa-var-instagram: \"\\f16d\";\n@fa-var-institution: \"\\f19c\";\n@fa-var-italic: \"\\f033\";\n@fa-var-joomla: \"\\f1aa\";\n@fa-var-jpy: \"\\f157\";\n@fa-var-jsfiddle: \"\\f1cc\";\n@fa-var-key: \"\\f084\";\n@fa-var-keyboard-o: \"\\f11c\";\n@fa-var-krw: \"\\f159\";\n@fa-var-language: \"\\f1ab\";\n@fa-var-laptop: \"\\f109\";\n@fa-var-leaf: \"\\f06c\";\n@fa-var-legal: \"\\f0e3\";\n@fa-var-lemon-o: \"\\f094\";\n@fa-var-level-down: \"\\f149\";\n@fa-var-level-up: \"\\f148\";\n@fa-var-life-bouy: \"\\f1cd\";\n@fa-var-life-ring: \"\\f1cd\";\n@fa-var-life-saver: \"\\f1cd\";\n@fa-var-lightbulb-o: \"\\f0eb\";\n@fa-var-link: \"\\f0c1\";\n@fa-var-linkedin: \"\\f0e1\";\n@fa-var-linkedin-square: \"\\f08c\";\n@fa-var-linux: \"\\f17c\";\n@fa-var-list: \"\\f03a\";\n@fa-var-list-alt: \"\\f022\";\n@fa-var-list-ol: \"\\f0cb\";\n@fa-var-list-ul: \"\\f0ca\";\n@fa-var-location-arrow: \"\\f124\";\n@fa-var-lock: \"\\f023\";\n@fa-var-long-arrow-down: \"\\f175\";\n@fa-var-long-arrow-left: \"\\f177\";\n@fa-var-long-arrow-right: \"\\f178\";\n@fa-var-long-arrow-up: \"\\f176\";\n@fa-var-magic: \"\\f0d0\";\n@fa-var-magnet: \"\\f076\";\n@fa-var-mail-forward: \"\\f064\";\n@fa-var-mail-reply: \"\\f112\";\n@fa-var-mail-reply-all: \"\\f122\";\n@fa-var-male: \"\\f183\";\n@fa-var-map-marker: \"\\f041\";\n@fa-var-maxcdn: \"\\f136\";\n@fa-var-medkit: \"\\f0fa\";\n@fa-var-meh-o: \"\\f11a\";\n@fa-var-microphone: \"\\f130\";\n@fa-var-microphone-slash: \"\\f131\";\n@fa-var-minus: \"\\f068\";\n@fa-var-minus-circle: \"\\f056\";\n@fa-var-minus-square: \"\\f146\";\n@fa-var-minus-square-o: \"\\f147\";\n@fa-var-mobile: \"\\f10b\";\n@fa-var-mobile-phone: \"\\f10b\";\n@fa-var-money: \"\\f0d6\";\n@fa-var-moon-o: \"\\f186\";\n@fa-var-mortar-board: \"\\f19d\";\n@fa-var-music: \"\\f001\";\n@fa-var-navicon: \"\\f0c9\";\n@fa-var-openid: \"\\f19b\";\n@fa-var-outdent: \"\\f03b\";\n@fa-var-pagelines: \"\\f18c\";\n@fa-var-paper-plane: \"\\f1d8\";\n@fa-var-paper-plane-o: \"\\f1d9\";\n@fa-var-paperclip: \"\\f0c6\";\n@fa-var-paragraph: \"\\f1dd\";\n@fa-var-paste: \"\\f0ea\";\n@fa-var-pause: \"\\f04c\";\n@fa-var-paw: \"\\f1b0\";\n@fa-var-pencil: \"\\f040\";\n@fa-var-pencil-square: \"\\f14b\";\n@fa-var-pencil-square-o: \"\\f044\";\n@fa-var-phone: \"\\f095\";\n@fa-var-phone-square: \"\\f098\";\n@fa-var-photo: \"\\f03e\";\n@fa-var-picture-o: \"\\f03e\";\n@fa-var-pied-piper: \"\\f1a7\";\n@fa-var-pied-piper-alt: \"\\f1a8\";\n@fa-var-pied-piper-square: \"\\f1a7\";\n@fa-var-pinterest: \"\\f0d2\";\n@fa-var-pinterest-square: \"\\f0d3\";\n@fa-var-plane: \"\\f072\";\n@fa-var-play: \"\\f04b\";\n@fa-var-play-circle: \"\\f144\";\n@fa-var-play-circle-o: \"\\f01d\";\n@fa-var-plus: \"\\f067\";\n@fa-var-plus-circle: \"\\f055\";\n@fa-var-plus-square: \"\\f0fe\";\n@fa-var-plus-square-o: \"\\f196\";\n@fa-var-power-off: \"\\f011\";\n@fa-var-print: \"\\f02f\";\n@fa-var-puzzle-piece: \"\\f12e\";\n@fa-var-qq: \"\\f1d6\";\n@fa-var-qrcode: \"\\f029\";\n@fa-var-question: \"\\f128\";\n@fa-var-question-circle: \"\\f059\";\n@fa-var-quote-left: \"\\f10d\";\n@fa-var-quote-right: \"\\f10e\";\n@fa-var-ra: \"\\f1d0\";\n@fa-var-random: \"\\f074\";\n@fa-var-rebel: \"\\f1d0\";\n@fa-var-recycle: \"\\f1b8\";\n@fa-var-reddit: \"\\f1a1\";\n@fa-var-reddit-square: \"\\f1a2\";\n@fa-var-refresh: \"\\f021\";\n@fa-var-renren: \"\\f18b\";\n@fa-var-reorder: \"\\f0c9\";\n@fa-var-repeat: \"\\f01e\";\n@fa-var-reply: \"\\f112\";\n@fa-var-reply-all: \"\\f122\";\n@fa-var-retweet: \"\\f079\";\n@fa-var-rmb: \"\\f157\";\n@fa-var-road: \"\\f018\";\n@fa-var-rocket: \"\\f135\";\n@fa-var-rotate-left: \"\\f0e2\";\n@fa-var-rotate-right: \"\\f01e\";\n@fa-var-rouble: \"\\f158\";\n@fa-var-rss: \"\\f09e\";\n@fa-var-rss-square: \"\\f143\";\n@fa-var-rub: \"\\f158\";\n@fa-var-ruble: \"\\f158\";\n@fa-var-rupee: \"\\f156\";\n@fa-var-save: \"\\f0c7\";\n@fa-var-scissors: \"\\f0c4\";\n@fa-var-search: \"\\f002\";\n@fa-var-search-minus: \"\\f010\";\n@fa-var-search-plus: \"\\f00e\";\n@fa-var-send: \"\\f1d8\";\n@fa-var-send-o: \"\\f1d9\";\n@fa-var-share: \"\\f064\";\n@fa-var-share-alt: \"\\f1e0\";\n@fa-var-share-alt-square: \"\\f1e1\";\n@fa-var-share-square: \"\\f14d\";\n@fa-var-share-square-o: \"\\f045\";\n@fa-var-shield: \"\\f132\";\n@fa-var-shopping-cart: \"\\f07a\";\n@fa-var-sign-in: \"\\f090\";\n@fa-var-sign-out: \"\\f08b\";\n@fa-var-signal: \"\\f012\";\n@fa-var-sitemap: \"\\f0e8\";\n@fa-var-skype: \"\\f17e\";\n@fa-var-slack: \"\\f198\";\n@fa-var-sliders: \"\\f1de\";\n@fa-var-smile-o: \"\\f118\";\n@fa-var-sort: \"\\f0dc\";\n@fa-var-sort-alpha-asc: \"\\f15d\";\n@fa-var-sort-alpha-desc: \"\\f15e\";\n@fa-var-sort-amount-asc: \"\\f160\";\n@fa-var-sort-amount-desc: \"\\f161\";\n@fa-var-sort-asc: \"\\f0de\";\n@fa-var-sort-desc: \"\\f0dd\";\n@fa-var-sort-down: \"\\f0dd\";\n@fa-var-sort-numeric-asc: \"\\f162\";\n@fa-var-sort-numeric-desc: \"\\f163\";\n@fa-var-sort-up: \"\\f0de\";\n@fa-var-soundcloud: \"\\f1be\";\n@fa-var-space-shuttle: \"\\f197\";\n@fa-var-spinner: \"\\f110\";\n@fa-var-spoon: \"\\f1b1\";\n@fa-var-spotify: \"\\f1bc\";\n@fa-var-square: \"\\f0c8\";\n@fa-var-square-o: \"\\f096\";\n@fa-var-stack-exchange: \"\\f18d\";\n@fa-var-stack-overflow: \"\\f16c\";\n@fa-var-star: \"\\f005\";\n@fa-var-star-half: \"\\f089\";\n@fa-var-star-half-empty: \"\\f123\";\n@fa-var-star-half-full: \"\\f123\";\n@fa-var-star-half-o: \"\\f123\";\n@fa-var-star-o: \"\\f006\";\n@fa-var-steam: \"\\f1b6\";\n@fa-var-steam-square: \"\\f1b7\";\n@fa-var-step-backward: \"\\f048\";\n@fa-var-step-forward: \"\\f051\";\n@fa-var-stethoscope: \"\\f0f1\";\n@fa-var-stop: \"\\f04d\";\n@fa-var-strikethrough: \"\\f0cc\";\n@fa-var-stumbleupon: \"\\f1a4\";\n@fa-var-stumbleupon-circle: \"\\f1a3\";\n@fa-var-subscript: \"\\f12c\";\n@fa-var-suitcase: \"\\f0f2\";\n@fa-var-sun-o: \"\\f185\";\n@fa-var-superscript: \"\\f12b\";\n@fa-var-support: \"\\f1cd\";\n@fa-var-table: \"\\f0ce\";\n@fa-var-tablet: \"\\f10a\";\n@fa-var-tachometer: \"\\f0e4\";\n@fa-var-tag: \"\\f02b\";\n@fa-var-tags: \"\\f02c\";\n@fa-var-tasks: \"\\f0ae\";\n@fa-var-taxi: \"\\f1ba\";\n@fa-var-tencent-weibo: \"\\f1d5\";\n@fa-var-terminal: \"\\f120\";\n@fa-var-text-height: \"\\f034\";\n@fa-var-text-width: \"\\f035\";\n@fa-var-th: \"\\f00a\";\n@fa-var-th-large: \"\\f009\";\n@fa-var-th-list: \"\\f00b\";\n@fa-var-thumb-tack: \"\\f08d\";\n@fa-var-thumbs-down: \"\\f165\";\n@fa-var-thumbs-o-down: \"\\f088\";\n@fa-var-thumbs-o-up: \"\\f087\";\n@fa-var-thumbs-up: \"\\f164\";\n@fa-var-ticket: \"\\f145\";\n@fa-var-times: \"\\f00d\";\n@fa-var-times-circle: \"\\f057\";\n@fa-var-times-circle-o: \"\\f05c\";\n@fa-var-tint: \"\\f043\";\n@fa-var-toggle-down: \"\\f150\";\n@fa-var-toggle-left: \"\\f191\";\n@fa-var-toggle-right: \"\\f152\";\n@fa-var-toggle-up: \"\\f151\";\n@fa-var-trash-o: \"\\f014\";\n@fa-var-tree: \"\\f1bb\";\n@fa-var-trello: \"\\f181\";\n@fa-var-trophy: \"\\f091\";\n@fa-var-truck: \"\\f0d1\";\n@fa-var-try: \"\\f195\";\n@fa-var-tumblr: \"\\f173\";\n@fa-var-tumblr-square: \"\\f174\";\n@fa-var-turkish-lira: \"\\f195\";\n@fa-var-twitter: \"\\f099\";\n@fa-var-twitter-square: \"\\f081\";\n@fa-var-umbrella: \"\\f0e9\";\n@fa-var-underline: \"\\f0cd\";\n@fa-var-undo: \"\\f0e2\";\n@fa-var-university: \"\\f19c\";\n@fa-var-unlink: \"\\f127\";\n@fa-var-unlock: \"\\f09c\";\n@fa-var-unlock-alt: \"\\f13e\";\n@fa-var-unsorted: \"\\f0dc\";\n@fa-var-upload: \"\\f093\";\n@fa-var-usd: \"\\f155\";\n@fa-var-user: \"\\f007\";\n@fa-var-user-md: \"\\f0f0\";\n@fa-var-users: \"\\f0c0\";\n@fa-var-video-camera: \"\\f03d\";\n@fa-var-vimeo-square: \"\\f194\";\n@fa-var-vine: \"\\f1ca\";\n@fa-var-vk: \"\\f189\";\n@fa-var-volume-down: \"\\f027\";\n@fa-var-volume-off: \"\\f026\";\n@fa-var-volume-up: \"\\f028\";\n@fa-var-warning: \"\\f071\";\n@fa-var-wechat: \"\\f1d7\";\n@fa-var-weibo: \"\\f18a\";\n@fa-var-weixin: \"\\f1d7\";\n@fa-var-wheelchair: \"\\f193\";\n@fa-var-windows: \"\\f17a\";\n@fa-var-won: \"\\f159\";\n@fa-var-wordpress: \"\\f19a\";\n@fa-var-wrench: \"\\f0ad\";\n@fa-var-xing: \"\\f168\";\n@fa-var-xing-square: \"\\f169\";\n@fa-var-yahoo: \"\\f19e\";\n@fa-var-yen: \"\\f157\";\n@fa-var-youtube: \"\\f167\";\n@fa-var-youtube-play: \"\\f16a\";\n@fa-var-youtube-square: \"\\f166\";"
  },
  {
    "path": "assets/less/font-awesome.less",
    "content": "/*!\n *  Font Awesome 4.1.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables.less\";\n@import \"mixins.less\";\n@import \"path.less\";\n@import \"core.less\";\n@import \"larger.less\";\n@import \"fixed-width.less\";\n@import \"list.less\";\n@import \"bordered-pulled.less\";\n@import \"spinning.less\";\n@import \"rotated-flipped.less\";\n@import \"stacked.less\";\n@import \"icons.less\";\n"
  },
  {
    "path": "assets/less/gist.less",
    "content": ".gist {\n\n  .highlight {\n    color:#000;\n  }\n\n  .render-container .render-viewer-error,\n  .render-container .render-viewer-fatal,\n  .render-container .octospinner {\n    display:none;\n  }\n\n  .gist-render iframe {\n    width:100%;\n  }\n\n  .gist-file.gist-render .highlight {\n    border:none;\n  }\n\n  .gist-file .gist-meta .highlight a {\n    font-weight:700;\n    color:#666;\n    text-decoration:none;\n  }\n\n  .highlight {\n    background:#fff;\n  }\n\n  .highlight .err {\n    color:#a61717;\n    background-color:#e3d2d2;\n  }\n\n  .highlight .cp {\n    color:#999;\n    font-weight:700;\n  }\n\n  .highlight .cs {\n    color:#999;\n    font-weight:700;\n    font-style:italic;\n  }\n\n  .highlight .gd {\n    color:#000;\n    background-color:#fdd;\n  }\n\n  .highlight .gd .x {\n    color:#000;\n    background-color:#faa;\n  }\n\n  .highlight .ge {\n    color:#000;\n    font-style:italic;\n  }\n\n  .highlight .gi {\n    color:#000;\n    background-color:#dfd;\n  }\n\n  .highlight .gi .x {\n    color:#000;\n    background-color:#afa;\n  }\n\n  .highlight .go {\n    color:#888;\n  }\n\n  .highlight .gs {\n    font-weight:700;\n  }\n\n  .highlight .gu {\n    color:#aaa;\n  }\n\n  .highlight .nb {\n    color:#0086b3;\n  }\n\n  .highlight .ni {\n    color:purple;\n  }\n\n  .highlight .nt {\n    color:navy;\n  }\n\n  .highlight .w {\n    color:#bbb;\n  }\n\n  .highlight .sr {\n    color:#009926;\n  }\n\n  .highlight .ss {\n    color:#990073;\n  }\n\n  .highlight .c,\n  .highlight .cm,\n  .highlight .c1 {\n    color:#998;\n    font-style:italic;\n  }\n\n  .highlight .k,\n  .highlight .o,\n  .highlight .kc,\n  .highlight .kd,\n  .highlight .kp,\n  .highlight .kr,\n  .highlight .ow,\n  .highlight .n,\n  .highlight .p {\n    color:#000;\n    font-weight:700;\n  }\n\n  .highlight .gr,\n  .highlight .gt {\n    color:#a00;\n  }\n\n  .highlight .gh,\n  .highlight .bp {\n    color:#999;\n  }\n\n  .highlight .gp,\n  .highlight .nn {\n    color:#555;\n  }\n\n  .highlight .kt,\n  .highlight .nc {\n    color:#458;\n    font-weight:700;\n  }\n\n  .highlight .m,\n  .highlight .mf,\n  .highlight .mh,\n  .highlight .mi,\n  .highlight .mo,\n  .highlight .il {\n    color:#099;\n  }\n\n  .highlight .s,\n  .highlight .sb,\n  .highlight .sc,\n  .highlight .sd,\n  .highlight .s2,\n  .highlight .se,\n  .highlight .sh,\n  .highlight .si,\n  .highlight .sx,\n  .highlight .s1 {\n    color:#d14;\n  }\n\n  .highlight .na,\n  .highlight .no,\n  .highlight .nv,\n  .highlight .vc,\n  .highlight .vg,\n  .highlight .vi {\n    color:teal;\n  }\n\n  .highlight .ne,\n  .highlight .nf {\n    color:#900;\n    font-weight:700;\n  }\n\n}"
  },
  {
    "path": "assets/less/grid.less",
    "content": "// Defining number of columns in the grid.\n// Common Values would be 12, 16 or 24\n@width: 100%;\n@def_grid: 12;\n@margin: 0;\n\n.container(){\n  margin:0 auto;\n  width:@width;\n}\n                                      \n// Works out the width of elements based\n// on total number of columns and width\n// number of columns being displayed.\n// Removes 20px for margins\n.grid(@grid:@def_grid,@cols:'',@float:left,@display:inline){\n  display:@display;\n  float:@float;\n  width:(100%/@grid * @cols) - (@margin * 2);\n}  \n\n// Allows for padding before element\n.prefix(@grid:@def_grid,@cols:''){\n  margin-left:(100%/@grid * @cols);\n}\n// Allows for padding after element\n.suffix(@grid:@def_grid,@cols:''){  \n  margin-right:(100%/@grid * @cols);    \n}\n// Removes left margin\n.first(){\n  margin-left:0;\n}\n// Removes right margin\n.last(){\n  margin-right:0;\n}\n\n.push(@grid:@def_grid,@move:'') {\n  position:relative;\n  left:(100%/@grid * @move);\n} \n\n.pull(@grid:@def_grid,@move:''){\n  position:relative;\n  left:(100%/@grid * @move) * -1;\n}"
  },
  {
    "path": "assets/less/magnific-popup.less",
    "content": "/* Magnific Popup CSS */\n// Modified by Michael Rose\n\n.mfp-bg {\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 502;\n  overflow: hidden;\n  position: fixed;\n  background: #0b0b0b;\n  opacity: 0.8;\n  filter: alpha(opacity=80); }\n\n.mfp-wrap {\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 503;\n  position: fixed;\n  outline: none !important;\n  -webkit-backface-visibility: hidden; }\n\n.mfp-container {\n  height: 100%;\n  text-align: center;\n  position: absolute;\n  width: 100%;\n  height: 100%;\n  left: 0;\n  top: 0;\n  padding: 0 8px;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box; }\n\n.mfp-container:before {\n  content: '';\n  display: inline-block;\n  height: 100%;\n  vertical-align: middle; }\n\n.mfp-align-top .mfp-container:before {\n  display: none; }\n\n.mfp-content {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n  margin: 0 auto;\n  text-align: left;\n  z-index: 505; }\n\n.mfp-inline-holder .mfp-content,\n.mfp-ajax-holder .mfp-content {\n  width: 100%;\n  cursor: auto;\n  &:after {\n    content: '';\n    display: block;\n    width: auto;\n    height: auto;\n    position: absolute;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    right: 0;\n    z-index: -1;\n    box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); \n  }\n}\n\n.mfp-ajax-cur {\n  cursor: progress; }\n\n.mfp-zoom-out-cur,\n.mfp-zoom-out-cur .mfp-image-holder .mfp-close {\n  cursor: -moz-zoom-out;\n  cursor: -webkit-zoom-out;\n  cursor: zoom-out; }\n\n.mfp-zoom, \n.image-popup {\n  cursor: pointer;\n  cursor: -webkit-zoom-in;\n  cursor: -moz-zoom-in;\n  cursor: zoom-in; }\n\n.mfp-auto-cursor .mfp-content {\n  cursor: auto; }\n\n.mfp-close,\n.mfp-arrow,\n.mfp-preloader,\n.mfp-counter {\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none; }\n\n.mfp-loading.mfp-figure {\n  display: none; }\n\n.mfp-hide {\n  display: none !important; }\n\n.mfp-preloader {\n  color: #cccccc;\n  position: absolute;\n  top: 50%;\n  width: auto;\n  text-align: center;\n  margin-top: -0.8em;\n  left: 8px;\n  right: 8px;\n  z-index: 504; }\n\n.mfp-preloader a {\n  color: #cccccc; }\n\n.mfp-preloader a:hover {\n  color: white; }\n\n.mfp-s-ready .mfp-preloader {\n  display: none; }\n\n.mfp-s-error .mfp-content {\n  display: none; }\n\nbutton.mfp-close,\nbutton.mfp-arrow {\n  overflow: visible;\n  cursor: pointer;\n  border: 0;\n  -webkit-appearance: none;\n  display: block;\n  padding: 0;\n  z-index: 506; }\n\nbutton.mfp-close {\n  background: transparent; }\n\nbutton::-moz-focus-inner {\n  padding: 0;\n  border: 0; }\n\n.mfp-close {\n  width: 44px;\n  height: 44px;\n  line-height: 44px;\n  position: absolute;\n  right: 0;\n  top: 0;\n  text-decoration: none;\n  text-align: center;\n  opacity: 0.65;\n  padding: 0 0 18px 10px;\n  color: white;\n  font-style: normal;\n  font-size: 28px;\n  font-family: Arial, Baskerville, monospace; }\n  .mfp-close:hover, .mfp-close:focus {\n    opacity: 1; }\n  .mfp-close:active {\n    top: 1px; }\n\n.mfp-close-btn-in .mfp-close {\n  color: #333333; }\n\n.mfp-image-holder .mfp-close,\n.mfp-iframe-holder .mfp-close {\n  color: white;\n  right: -6px;\n  text-align: right;\n  padding-right: 6px;\n  width: 100%; }\n\n.mfp-counter {\n  position: absolute;\n  top: 0;\n  right: 0;\n  color: #cccccc;\n  font-size: 12px;\n  line-height: 18px; }\n\n.mfp-arrow {\n  .hide-text();\n  position: absolute;\n  top: 0;\n  opacity: 0.65;\n  margin: 0;\n  top: 50%;\n  margin-top: -55px;\n  padding: 0;\n  width: 90px;\n  height: 110px;\n  background-color: @black;\n  .transition(opacity 0.2s ease-in-out);\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }\n\n.mfp-arrow:active {\n  margin-top: -54px; }\n\n.mfp-arrow:hover,\n.mfp-arrow:focus {\n  opacity: 1; }\n\n.mfp-arrow:before, .mfp-arrow:after,\n.mfp-arrow .mfp-b,\n.mfp-arrow .mfp-a {\n  content: '';\n  display: block;\n  width: 0;\n  height: 0;\n  position: absolute;\n  left: 0;\n  top: 0;\n  margin-top: 35px;\n  margin-left: 35px;\n  border: solid transparent; }\n.mfp-arrow:after,\n.mfp-arrow .mfp-a {\n  opacity: 0.8;\n  border-top-width: 12px;\n  border-bottom-width: 12px;\n  top: 8px; }\n.mfp-arrow:before,\n.mfp-arrow .mfp-b {\n  border-top-width: 20px;\n  border-bottom-width: 20px; }\n\n.mfp-arrow-left {\n  left: 0; \n  .border-radius(5px, 5px, 0, 0); }\n  .mfp-arrow-left:after,\n  .mfp-arrow-left .mfp-a {\n    border-right: 12px solid #fff;\n    left: 5px; }\n  .mfp-arrow-left:before,\n  .mfp-arrow-left .mfp-b {\n    border-right: 20px solid #fff; }\n\n.mfp-arrow-right {\n  right: 0; \n  .border-radius(0, 0, 5px, 5px); }\n  .mfp-arrow-right:after,\n  .mfp-arrow-right .mfp-a {\n    border-left: 12px solid #fff;\n    left: 3px; }\n  .mfp-arrow-right:before,\n  .mfp-arrow-right .mfp-b {\n    border-left: 20px solid #fff; }\n\n.mfp-iframe-holder {\n  padding-top: 40px;\n  padding-bottom: 40px; }\n\n.mfp-iframe-holder .mfp-content {\n  line-height: 0;\n  width: 100%;\n  max-width: 900px; }\n\n.mfp-iframe-scaler {\n  width: 100%;\n  height: 0;\n  overflow: hidden;\n  padding-top: 56.25%; }\n\n.mfp-iframe-scaler iframe {\n  position: absolute;\n  display: block;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);\n  background: black; }\n\n.mfp-iframe-holder .mfp-close {\n  top: -40px; }\n\n/* Main image in popup */\nimg.mfp-img {\n  width: auto;\n  max-width: 100%;\n  height: auto;\n  display: block;\n  line-height: 0;\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n  padding: 40px 0 40px;\n  margin: 0 auto; }\n\n/* The shadow behind the image */\n.mfp-figure:after {\n  content: '';\n  position: absolute;\n  left: 0;\n  top: 40px;\n  bottom: 40px;\n  display: block;\n  right: 0;\n  width: auto;\n  height: auto;\n  z-index: -1;\n  box-shadow: 0 0 8px rgba(0, 0, 0, 0.6); }\n\n.mfp-figure {\n  line-height: 0; }\n\n.mfp-bottom-bar {\n  margin-top: -36px;\n  position: absolute;\n  top: 100%;\n  left: 0;\n  width: 100%;\n  cursor: auto; }\n\n.mfp-title {\n  text-align: left;\n  line-height: 18px;\n  color: #f3f3f3; }\n\n.mfp-figure small {\n  color: #bdbdbd;\n  display: block;\n  font-size: 12px;\n  line-height: 14px; }\n\n.mfp-image-holder .mfp-content {\n  max-width: 100%; }\n\n.mfp-gallery .mfp-image-holder .mfp-figure {\n  cursor: pointer; }  \n\n@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {\n  /**\n   * Remove all paddings around the image on small screen\n   */\n  .mfp-img-mobile .mfp-image-holder {\n    padding-left: 0;\n    padding-right: 0; }\n\n  .mfp-img-mobile img.mfp-img {\n    padding: 0; }\n\n  /* The shadow behind the image */\n  .mfp-img-mobile .mfp-figure:after {\n    top: 0;\n    bottom: 0; }\n\n  .mfp-img-mobile .mfp-bottom-bar {\n    background: rgba(0, 0, 0, 0.6);\n    bottom: 0;\n    margin: 0;\n    top: auto;\n    padding: 3px 5px;\n    position: fixed;\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box; }\n\n  .mfp-img-mobile .mfp-bottom-bar:empty {\n    padding: 0; }\n\n  .mfp-img-mobile .mfp-counter {\n    right: 5px;\n    top: 3px; }\n\n  .mfp-img-mobile .mfp-close {\n    top: 0;\n    right: 0;\n    width: 35px;\n    height: 35px;\n    line-height: 35px;\n    background: rgba(0, 0, 0, 0.6);\n    position: fixed;\n    text-align: center;\n    padding: 0; }\n\n  .mfp-img-mobile .mfp-figure small {\n    display: inline;\n    margin-left: 5px; } }\n@media all and (max-width: 800px) {\n  .mfp-arrow {\n    -webkit-transform: scale(0.75);\n    transform: scale(0.75); }\n\n  .mfp-arrow-left {\n    -webkit-transform-origin: 0;\n    transform-origin: 0; }\n\n  .mfp-arrow-right {\n    -webkit-transform-origin: 100%;\n    transform-origin: 100%; }\n\n  .mfp-container {\n    padding-left: 6px;\n    padding-right: 6px; } }\n.mfp-ie7 .mfp-img {\n  padding: 0; }\n.mfp-ie7 .mfp-bottom-bar {\n  width: 600px;\n  left: 50%;\n  margin-left: -300px;\n  margin-top: 5px;\n  padding-bottom: 5px; }\n.mfp-ie7 .mfp-container {\n  padding: 0; }\n.mfp-ie7 .mfp-content {\n  padding-top: 44px; }\n.mfp-ie7 .mfp-close {\n  top: 0;\n  right: 0;\n  padding-top: 0; }\n\n/**\n * Fade-zoom animation for first dialog\n */\n\n/* start state */\n.mfp-fade .zoom-anim-dialog {\n  opacity: 0;\n  .transition(all 0.2s ease-in-out); \n  .scale(0.8);\n}\n\n/* animate in */\n.mfp-fade.mfp-ready .zoom-anim-dialog {\n  opacity: 1;\n  .scale(1);\n}\n\n/* animate out */\n.mfp-fade.mfp-removing .zoom-anim-dialog {\n .scale(0.8); \n  opacity: 0;\n}\n\n/* Dark overlay, start state */\n.mfp-fade.mfp-bg {\n  opacity: 0;\n  .transition(opacity 0.3s ease-out); \n}\n/* animate in */\n.mfp-fade.mfp-ready.mfp-bg {\n  opacity: 0.8;\n}\n/* animate out */\n.mfp-fade.mfp-removing.mfp-bg {\n  opacity: 0;\n}\n"
  },
  {
    "path": "assets/less/main.less",
    "content": "/*! \n// ===========================================================\n// HPSTR Jekyll Theme\n// By: Michael Rose\n// ===========================================================\n*/\n\n// ROOT =======================================================\n// CSS Reset ==================================================\n@import \"reset.less\";\n// Variables and mixins =======================================\n@import \"variables.less\";\n// Site wide styles (html, body, global classes) ==============\n@import \"site.less\";\n// TYPOGRAPHY =================================================\n@import \"typography.less\";\n// Pygments Syntax highlighting ===============================\n@import \"pygments.less\";\n// Coderay Syntax highlighting ================================\n@import \"coderay.less\";\n// Gist Syntax highlighting ===================================\n@import \"gist.less\";\n// MIXINS =====================================================\n@import \"mixins.less\";\n@import \"grid.less\";\n// ELEMENTS ===================================================\n// Figures, images, social media, other elements ==============\n@import \"elements.less\";\n// Drop down menu\n@import \"dl-menu.less\";\n// Font Awesome webfont icons =================================\n@import \"font-awesome/font-awesome.less\";\n// Magnific Popup =============================================\n@import \"magnific-popup.less\";\n// LAYOUT =====================================================\n// Page level layout styles ===================================\n@import \"page.less\";"
  },
  {
    "path": "assets/less/mixins.less",
    "content": "// UTILITY MIXINS\n// --------------------------------------------------\n\n// Clearfix\n// --------------------\n// For clearing floats like a boss h5bp.com/q\n.clearfix {\n  *zoom: 1;\n  &:before,\n  &:after {\n    display: table;\n    content: \"\";\n    // Fixes Opera/contenteditable bug:\n    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952\n    line-height: 0;\n  }\n  &:after {\n    clear: both;\n  }\n}\n\n// Webkit-style focus\n// --------------------\n.tab-focus() {\n  // Default\n  outline: thin dotted #333;\n  // Webkit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n// Center-align a block level element\n// ----------------------------------\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n// TYPOGRAPHY\n// --------------------------------------------------\n\n// Full-fat vertical rhythm\n// ------------------------\n.font-size(@size) {\n  font-size: 0px + @size;\n  font-size: 0rem + @size / @doc-font-size;\n  line-height: 0 + round(@doc-line-height / @size*10000) / 10000;\n  margin-bottom: 0px + @doc-line-height;\n  margin-bottom: 0rem + (@doc-line-height / @doc-font-size);\n}\n\n// Just the REMs\n// -------------\n.font-rem(@size) {\n  font-size: 0px + @size;\n  font-size: 0rem + @size / @doc-font-size;\n}\n\n// Just font-size and line-height\n// ------------------------------\n.font(@size) {\n  font-size: 0px + @size;\n  font-size: 0rem + @size / @doc-font-size;\n  line-height: 0 + round(@doc-line-height / @size*10000) / 10000;\n}\n\n.text-overflow() {\noverflow: hidden;\ntext-overflow: ellipsis;\nwhite-space: nowrap; }\n\n// GRADIENTS\n// --------------------------------------------------\n\n.horizontal(@startColor : @white, @endColor : @lightergrey) {\nbackground-color: @endColor;\nbackground-image  : -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+\nbackground-image  : -webkit-linear-gradient(left, @startColor, @endColor); \t\t\t\t\t // Safari 5.1+, Chrome 10+\nbackground-image  : -moz-linear-gradient(left, @startColor, @endColor); \t\t\t\t\t // FF 3.6+\nbackground-image  : -ms-linear-gradient(left, @startColor, @endColor); \t\t\t\t\t\t // IE10\nbackground-image  : -o-linear-gradient(left, @startColor, @endColor); \t\t\t\t\t\t // Opera 11.10\nbackground-image  : linear-gradient(left, @startColor, @endColor); \t\t\t\t\t\t\t // W3C\nbackground-repeat : repeat-x; }\n\n.vertical(@startColor : @white, @endColor:  @lightergrey) {\nbackground-image  : -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+\nbackground-image  : -webkit-linear-gradient(top, @startColor, @endColor); \t\t\t\t\t // Safari 5.1+, Chrome 10+\nbackground-color  : @endColor;\nbackground-image  : -moz-linear-gradient(top, @startColor, @endColor);   \t\t\t\t\t // FF 3.6+\nbackground-image  : -ms-linear-gradient(top, @startColor, @endColor); \t\t\t\t\t\t // IE10\nbackground-image  : -o-linear-gradient(top, @startColor, @endColor); \t\t\t\t\t\t // Opera 11.10\nbackground-image  : linear-gradient(top, @startColor, @endColor); \t\t\t\t\t\t\t // W3C\nbackground-repeat : repeat-x; }\n\n.directional(@startColor : @white, @endColor : @lightergrey, @deg : 45deg) {\nbackground-color  : @endColor;\nbackground-image  : -moz-linear-gradient(@deg, @startColor, @endColor); \t\t\t\t\t// FF 3.6+\nbackground-image  : -ms-linear-gradient(@deg, @startColor, @endColor); \t\t\t\t\t\t// IE10\nbackground-image  : -webkit-linear-gradient(@deg, @startColor, @endColor); \t\t\t\t\t// Safari 5.1+, Chrome 10+\nbackground-image  : -o-linear-gradient(@deg, @startColor, @endColor); \t\t\t\t\t\t// Opera 11.10\nbackground-image  : linear-gradient(@deg, @startColor, @endColor); \t\t\t\t\t\t\t// W3C\nbackground-repeat : repeat-x; }\n\n// .bordered(COLOR, COLOR, COLOR, COLOR);\n.bordered(@top-color: #eee, @right-color: #eee, @bottom-color: #eee, @left-color: #eee) {\nborder-top : solid 1px @top-color;\nborder-left : solid 1px @left-color;\nborder-right : solid 1px @right-color;\nborder-bottom : solid 1px @bottom-color; }\n\n// ROUND CORNERS\n// --------------------------------------------------\n\n// .rounded(VALUE);\n.rounded(@radius:4px) {\n-webkit-border-radius : @radius;\n-moz-border-radius : @radius;\nborder-radius : @radius; }\n\n// .border-radius(VALUE,VALUE,VALUE,VALUE);\n.border-radius(@topright: 0, @bottomright: 0, @bottomleft: 0, @topleft: 0) {\n-webkit-border-top-right-radius : @topright;\n-webkit-border-bottom-right-radius : @bottomright;\n-webkit-border-bottom-left-radius : @bottomleft;\n-webkit-border-top-left-radius : @topleft;\n-moz-border-radius-topright : @topright;\n-moz-border-radius-bottomright : @bottomright;\n-moz-border-radius-bottomleft : @bottomleft;\n-moz-border-radius-topleft : @topleft;\nborder-top-right-radius : @topright;\nborder-bottom-right-radius : @bottomright;\nborder-bottom-left-radius : @bottomleft;\nborder-top-left-radius : @topleft;\n-webkit-background-clip : padding-box;\n-moz-background-clip : padding;  \nbackground-clip : padding-box; }\n\n// .box-shadow(HORIZONTAL VERTICAL BLUR COLOR))\n.box-shadow(@shadow: 0 1px 3px rgba(0,0,0,.25)) {\n-webkit-box-shadow : @shadow;\n-moz-box-shadow : @shadow;\nbox-shadow : @shadow; }\n\n// .drop-shadow(HORIZONTAL, VERTICAL, BLUR, ALPHA);\n.drop-shadow(@x-axis: 0, @y-axis: 1px, @blur: 2px, @alpha: 0.1) {\n-webkit-box-shadow : @x-axis @y-axis @blur rgba(0, 0, 0, @alpha);\n-moz-box-shadow : @x-axis @y-axis @blur rgba(0, 0, 0, @alpha);\nbox-shadow : @x-axis @y-axis @blur rgba(0, 0, 0, @alpha); }\n\n// .text-shadow();\n.text-shadow(@shadow: 0 2px 3px rgba(0,0,0,.25)) {\ntext-shadow : @shadow; }\n\n// .opacity(VALUE);\n.opacity(@opacity : .5) {\n-webkit-opacity : @opacity;\n-moz-opacity : @opacity;\nopacity : @opacity; }\n\n// TRANSFORMATIONS\n// --------------------------------------------------\n\n// .rotate(VALUEdeg);\n.rotate(@deg) {\n-webkit-transform : rotate(@deg);\n-moz-transform : rotate(@deg);\n-ms-transform : rotate(@deg);\n-o-transform : rotate(@deg);\ntransform : rotate(@deg); }\n\n// .scale(VALUE);\n.scale(@ratio) {\n-webkit-transform : scale(@ratio);\n-moz-transform : scale(@ratio);\n-ms-transform : scale(@ratio);\n-o-transform : scale(@ratio);\ntransform : scale(@ratio); }\n\n// .skew(VALUE, VALUE);\n.skew(@x: 0, @y: 0) {\n-webkit-transform : skew(@x, @y);\n-moz-transform : skew(@x, @y);\n-ms-transform : skew(@x, @y);\n-o-transform : skew(@x, @y);\ntransform : skew(@x, @y); }\n\n// .transition(PROPERTY DURATION DELAY(OPTIONAL) TIMING-FINCTION);\n.transition(@transition) {\n-webkit-transition : @transition;\n-moz-transition : @transition;\n-ms-transition : @transition;\n-o-transition : @transition;\ntransition : @transition; }\n\n// .translate(VALUE, VALUE)\n.translate(@x: 0, @y: 0) {\n-webkit-transform : translate(@x, @y);\n-moz-transform : translate(@x, @y);\n-ms-transform : translate(@x, @y);\n-o-transform : translate(@x, @y);\ntransform : translate(@x, @y); }\n\n.translate3d(@x: 0, @y: 0, @z: 0) {\n-webkit-transform : translate(@x, @y, @z);\n-moz-transform : translate(@x, @y, @z);\n-ms-transform : translate(@x, @y, @z);\n-o-transform : translate(@x, @y, @z);\ntransform : translate(@x, @y, @z); }\n\n.animation(@name, @duration: 300ms, @delay: 0, @ease: ease) {\n  -webkit-animation: @name @duration @delay @ease;\n  -moz-animation:    @name @duration @delay @ease;\n  -ms-animation:     @name @duration @delay @ease;\n}\n\n// BACKGROUND\n// --------------------------------------------------\n\n// .background-alpha(VALUE VALUE);\n.background-alpha(@color: @white, @alpha: 1) {\nbackground-color : hsla(hue(@color), saturation(@color), lightness(@color), @alpha); }\n\n// .background-size(VALUE VALUE);\n.background-size(@size){\n-webkit-background-size : @size;\n-moz-background-size : @size;\n-o-background-size : @size;\nbackground-size : @size; }\n\n// .background-clip(VALUE); (border-box, padding-box, content-box)\n.background-clip(@clip) {\n-webkit-background-clip : @clip;\n-moz-background-clip : @clip;\nbackground-clip : @clip; }\n\n// .box-sizing(VALUE); (border-box, padding-box, content-box)\n.box-sizing(@boxsize: border-box) {\n-webkit-box-sizing : @boxsize;\n-moz-box-sizing : @boxsize;\n-ms-box-sizing : @boxsize;\nbox-sizing : @boxsize; }\n\n// For image replacement\n.hide-text() {\ntext-indent : 100%;\nwhite-space : nowrap;\noverflow : hidden; }\n\n// Hide from visual and speaking browsers\n.hidden() {\ndisplay : none !important; \nvisibility : hidden; }\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n\n// Hide but maintain layout\n.invisible() { \nvisibility : hidden; }\n\n// .resize(VALUE) (none, both, horizontal, vertical, inherit)\n.resize(@direction: both) {\nresize : @direction;\noverflow : auto; }\n\n// .userselect(VALUE) (all, element, none, text)\n.user-select(@select) {\n-webkit-user-select : @select;\n-moz-user-select : @select;\n-o-user-select : @select;\nuser-select : @select; }\n\n// Hidden but available to speaking browsers\n.visuallyhidden() { \noverflow : hidden; \nposition : absolute;\nclip : rect(0 0 0 0); \nheight : 1px; \nwidth : 1px;\nmargin : -1px; \npadding : 0; \nborder : 0; }\n\n// Make visuallyhidden focusable with a keyboard\n.visuallyhidden.focusable:active, \n.visuallyhidden.focusable:focus { \nposition : static;\nclip : auto; \nheight : auto; \nwidth : auto;\nmargin : 0; \noverflow: visible; }\n\n// MEDIA QUERIES\n// --------------------------------------------------\n\n@small:       ~\"only screen and (min-width: 30em)\";\n@medium:      ~\"only screen and (min-width: 48em)\";\n@large:       ~\"only screen and (min-width: 62.5em)\";\n@highdensity: ~\"only screen and (-webkit-min-device-pixel-ratio: 1.5)\",\n              ~\"only screen and (-o-min-device-pixel-ratio: 3/2)\",\n              ~\"only screen and (min-resolution: 144dpi)\",\n              ~\"only screen and (min-resolution: 1.5dppx)\";"
  },
  {
    "path": "assets/less/page.less",
    "content": "body {\n\tmargin: 0;\n\tpadding: 0;\n\twidth: 100%;\n\tbackground-color: @body-color;\n}\n\n// Main\n// --------------------------------------------------\n.entry,\n.hentry {\n\t.clearfix();\n}\n.entry-content {\n\t.font-size(16);\n\t// Dotted line underlines for links\n\tp > a,\n\tli > a {\n\t\tborder-bottom: 1px dotted lighten(@link-color, 50);\n\t\t&:hover {\n\t\t\tborder-bottom-style: solid;\n\t\t}\n\t}\n}\n\n// Entry Header\n// --------------------------------------------------\n.entry-header {\n\twidth: 100%;\n\toverflow: hidden;\n\tposition: relative;\n}\n.header-title {\n\ttext-align: center;\n\tmargin: 30px 0 0;\n\th1 {\n\t\tmargin: 10px 20px;\n\t\tfont-weight: 700;\n\t\t.font-rem(28);\n\t\tcolor: lighten(@base-color,20);\n\t\t@media @medium {\n\t\t\t.font-rem(48);\n\t\t}\n\t\t@media @large {\n\t\t\t.font-rem(60);\n\t\t}\n\t}\n\th2 {\n\t\tmargin: 0;\n\t\t.font-rem(18);\n\t\ttext-transform: uppercase;\n\t\tcolor: lighten(@base-color,40);\n\t\t@media @medium {\n\t\t\t.font-rem(30);\n\t\t}\n\t}\n\tp {\n\t\tcolor: lighten(@base-color,20);\n\t}\n}\n.feature .header-title {\n\tposition: absolute;\n\ttop: 0;\n\tdisplay: table;\n\tmargin-top: 0;\n\twidth: 100%;\n\theight: 400px;\n\toverflow: hidden;\n\t.header-title-wrap {\n\t\tdisplay: table-cell;\n\t\tvertical-align: middle;\n\t\tmargin: 0 auto;\n\t\ttext-align: center;\n\t}\n\th1 {\n\t\tmargin: 10px;\n\t\tfont-weight: 700;\n\t\tmargin: 10px 60px;\n\t\tcolor: @white;\n\t\ttext-shadow: 1px 1px 4px fade(@base-color,60);\n\t\ta {\n\t\t\tcolor: @white;\n\t\t}\n\t\t@media @large {\n\t\t}\n\t}\n\th2 {\n\t\tmargin: 0;\n\t\tcolor: @white;\n\t\ttext-transform: uppercase;\n\t\t@media @medium {\n\t\t\ta {\n\t\t\t\tcolor: @white;\n\t\t\t}\n\t\t}\n\t}\n\tp {\n\t\tcolor: @white;\n\t}\n}\n.entry-image {\n\tposition: relative;\n\ttop: -50%; \n\tleft: -50%; \n\twidth: 200%; \n\theight: 200%;\n\tmin-height: 400px;\n\toverflow: hidden;\n\t&:after {\n\t\tcontent: '';\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbackground-color: fade(@base-color,30);\n\t}\n\timg {\n\t\tposition: absolute; \n\t\ttop: 0; \n\t\tleft: 0; \n\t\tright: 0; \n\t\tbottom: 0; \n\t\tmargin: auto; \n\t\tmin-width: 50%;\n\t\tmin-height: 50%;\n\t}\n}\n// Feature Image Caption\n.image-credit {\n\tposition: absolute;\n\tbottom: 0;\n\tright: 0;\n\tmargin: 0 auto;\n\tmax-width: 440px;\n\tpadding: 10px 15px;\n\tbackground-color: fade(@base-color,50);\n\tcolor: @white;\n\t.font-rem(12);\n\ttext-align: right;\n\t.border-radius(3px,0,0,3px);\n\tz-index: 10;\n\t@media @medium {\n\t\tmax-width: 760px;\n\t}\n\t@media @large {\n\t\tmax-width: 960px;\n\t}\n\ta {\n\t\tcolor: @white;\n\t\ttext-decoration: none;\n\t}\n}\n\n// Single Post and Page\n// --------------------------------------------------\n.entry-meta {\n\t.font-rem(12);\n\ttext-transform: uppercase;\n\tcolor: lighten(@base-color,60);\n\ta {\n\t\tcolor: lighten(@base-color,60);\n\t}\n\t.vcard {\n\t\t&:before {\n\t\t\tcontent: \" by \";\n\t\t}\n\t}\n\t.tag {\n\t\tdisplay: inline-block;\n\t\tmargin: 4px;\n\t\tpadding: 2px 6px;\n\t\tbackground-color: lighten(@base-color,60);\n\t\tcolor: @white;\n\t\t.rounded(3px);\n\t\tcolor: @white;\n\t\tspan {\n\t\t\tvertical-align: super;\n\t\t\t.font-rem(10);\n\t\t}\n\t\t&:hover {\n\t\t\tbackground-color: lighten(@base-color,50);\n\t\t}\n\t\t&:active {\n\t\t\t.translate(0, 1px);\n\t        .box-shadow(0 0 1px fade(@base-color, 20));\n\t\t}\n\t}\n}\n#post,\n#page {\n\t.entry-content {\n\t\tmargin: 40px 2px 20px 2px;\n\t\tpadding: 10px 15px;\n\t\tbackground-color: @white;\n\t\tbox-shadow: 0 0 0 0, 0 6px 12px fade(@black,10);\n\t\t.rounded(3px);\n\t\t@media @medium {\n\t\t\tmargin-left: 10px;\n\t\t\tmargin-right: 10px;\n\t\t\tpadding: 20px 30px;\n\t\t}\n\t\t@media @large {\n\t\t\tmax-width: 800px;\n\t\t\tmargin: 50px auto 30px auto;\n\t\t\tpadding: 50px 80px;\n\t\t\t> p:first-child {\n\t\t\t\t.font-size(20);\n\t\t\t}\n\t\t}\n\t}\n\t#disqus_thread {\n\t\tmargin: 40px 2px 20px 2px;\n\t\tpadding: 10px 15px;\n\t\tbackground-color: @white;\n\t\tbox-shadow: 0 0 0 1px fade(@border-color,10), 0 6px 12px fade(@black,10);\n\t\t.rounded(3px);\n\t\t@media @medium {\n\t\t\tmargin-left: 10px;\n\t\t\tmargin-right: 10px;\n\t\t\tpadding: 20px 30px;\n\t\t}\n\t\t@media @large {\n\t\t\tmax-width: 800px;\n\t\t\tpadding: 50px 80px;\n\t\t\tmargin: 0 auto 30px auto;\n\t\t}\n\t}\n\t.entry-meta {\n\t\tmargin: 50px 30px 30px;\n\t\ttext-align: center;\n\t}\n}\n.entry-tags {\n\tdisplay: block;\n\tmargin-bottom: 6px;\n}\n// Post Pagination Module\n.pagination {\n\tmargin: 20px 10px;\n\ttext-align: center;\n\tul {\n\t\tdisplay: inline;\n\t\tmargin-left: 10px;\n\t\tmargin-right: 10px;\n\t}\n\tli {\n\t\tpadding-left: 4px;\n\t\tpadding-right: 4px;\n\t}\n\t.current-page {\n\t\tfont-weight: 700;\n\t}\n}\n\n// Read More Module\n.read-more {\n\tposition: relative;\n\tmargin: 40px 2px 20px 2px;\n\tpadding: 40px 15px 25px;\n\tbackground-color: @white;\n\tbox-shadow: 0 0 0 1px fade(@border-color,10), 0 6px 12px fade(@black,10);\n\t.rounded(3px);\n\t@media @medium {\n\t\tmargin: 50px 10px 20px 10px;\n\t\tpadding: 50px 40px 25px;\n\t}\n\t@media @large {\n\t\tmax-width: 800px;\n\t\tpadding: 50px 80px;\n\t\tmargin: 60px auto;\n\t}\n\ttext-align: center;\n\t.clearfix();\n}\n.read-more-header {\n\tposition: absolute;\n\ttop: -20px;\n\tleft: 0;\n\tright: 0;\n\theight: 35px;\n\ta {\n\t\t.btn();\n\t}\n}\n.read-more-content {\n\t.font-size(16);\n\t// Dotted line underlines for links\n\tp > a,\n\tli > a {\n\t\tborder-bottom: 1px dotted lighten(@link-color, 50);\n\t\t&:hover {\n\t\t\tborder-bottom-style: solid;\n\t\t}\n\t}\n\th3 {\n\t\tmargin: 0;\n\t\t.font-rem(28);\n\t\ta { \n\t\t\tcolor: @primary;\n\t\t}\n\t\t@media @medium {\n\t\t\t.font-rem(36);\n\t\t}\n\t}\n}\n.read-more-list {\n\tborder-top: solid 1px lighten(@base-color,60);\n}\n.list-item {\n\twidth: 100%;\n\ttext-align: left;\n\th4 { \n\t\t.font-rem(18);\n\t\tmargin-bottom: 0; \n\t}\n\tspan { \n\t\tdisplay: block;\n\t\t.font-rem(14);\n\t\tcolor: lighten(@base-color,50);\n\t}\n\t@media @medium {\n\t\twidth: 49%;\n\t\tfloat: left;\n\t\t&:nth-child(2) {\n\t\t\ttext-align: right;\n\t\t}\n\t}\n}\n\n// Post Index \n// --------------------------------------------------\n#post-index {\n\t#main {\n\t\tmargin: 40px 2px 20px 2px;\n\t\t@media @medium {\n\t\t\tmargin-left: 20px;\n\t\t\tmargin-right: 20px;\n\t\t}\n\t\t@media @large {\n\t\t\tmax-width: 800px;\n\t\t\tmargin-top: 50px;\n\t\t\tmargin-left: auto;\n\t\t\tmargin-right: auto;\n\t\t}\n\t}\n\tarticle {\n\t\tbackground-color: @white;\n\t\tbox-shadow: 0 0 0 0, 0 6px 12px fade(@base-color,10);\n\t\t.rounded(3px);\n\t\tmargin-bottom: 20px;\n\t\tpadding: 25px 15px;\n\t\t@media @medium {\n\t\t\tpadding: 30px;\n\t\t}\n\t\t@media @large {\n\t\t\tmargin-bottom: 30px;\n\t\t\tpadding: 50px 80px;\n\t\t}\n\t}\n}\n\n// Footer\n// --------------------------------------------------\n.footer-wrapper {\n\t.clearfix();\n\tmargin: 2em auto;\n\ttext-align: center;\n\tcolor: lighten(@text-color,20);\n\ta {\n\t\tcolor: lighten(@text-color,20);\n\t}\n}\n\n// Social Share\n// --------------------------------------------------\n.socialcount {\n\t.font-rem(16);\n\tfont-weight: 700;\n\tli { \n\t\tpadding-left: 10px;\n\t\tpadding-right: 10px;\n\t}\n\tp > a,\n\tli > a {\n\t\tborder-bottom-width: 0;\n\t}\n}\n\n\n// Browser Upgrade\n// --------------------------------------------------\n.upgrade {\n\tpadding: 10px;\n\ttext-align: center;\n}\n\n// Google Search\n// --------------------------------------------------\n#goog-fixurl {\n\tul {\n\t\tlist-style: none;\n\t\tmargin-left: 0;\n\t\tpadding-left: 0;\n\t\tli {\n\t\t\tlist-style-type: none;\n\t\t}\n\t}\n}\n#goog-wm-qt {\n\twidth: auto;\n\tmargin-right: 10px;\n\tmargin-bottom: 20px;\n\tpadding: 8px 20px;\n\tdisplay: inline-block;\n\t.font-rem(14);\n\tbackground-color: @white;\n\tcolor: @primary;\n\tborder-width: 2px !important;\n\tborder-style: solid !important;\n\tborder-color: lighten(@primary,50);\n\t.rounded(3px);\n}\n#goog-wm-sb {\n\t.btn();\n}\n"
  },
  {
    "path": "assets/less/pygments.less",
    "content": ".highlight {\n\tmargin-bottom: 1.5em;\n\t.font(12);\n\tcolor: #d0d0d0;\n\tborder: 1px solid darken(@body-color, 5);\n\tbackground-color: #272822;\n\t.rounded(3px);\n\tpre {\n\t\tposition: relative;\n\t\tmargin: 0;\n\t\tpadding: 1em;\n\t}\n\t.lineno { padding-right: 24px; color: #8f908a;}\n\t.hll { background-color: #49483e }\n\t.c { color: #75715e } /* Comment */\n\t.err { color: #960050; background-color: #1e0010 } /* Error */\n\t.k { color: #66d9ef } /* Keyword */\n\t.l { color: #ae81ff } /* Literal */\n\t.n { color: #f8f8f2 } /* Name */\n\t.o { color: #f92672 } /* Operator */\n\t.p { color: #f8f8f2 } /* Punctuation */\n\t.cm { color: #75715e } /* Comment.Multiline */\n\t.cp { color: #75715e } /* Comment.Preproc */\n\t.c1 { color: #75715e } /* Comment.Single */\n\t.cs { color: #75715e } /* Comment.Special */\n\t.ge { font-style: italic } /* Generic.Emph */\n\t.gs { font-weight: bold } /* Generic.Strong */\n\t.kc { color: #66d9ef } /* Keyword.Constant */\n\t.kd { color: #66d9ef } /* Keyword.Declaration */\n\t.kn { color: #f92672 } /* Keyword.Namespace */\n\t.kp { color: #66d9ef } /* Keyword.Pseudo */\n\t.kr { color: #66d9ef } /* Keyword.Reserved */\n\t.kt { color: #66d9ef } /* Keyword.Type */\n\t.ld { color: #e6db74 } /* Literal.Date */\n\t.m { color: #ae81ff } /* Literal.Number */\n\t.s { color: #e6db74 } /* Literal.String */\n\t.na { color: #a6e22e } /* Name.Attribute */\n\t.nb { color: #f8f8f2 } /* Name.Builtin */\n\t.nc { color: #a6e22e } /* Name.Class */\n\t.no { color: #66d9ef } /* Name.Constant */\n\t.nd { color: #a6e22e } /* Name.Decorator */\n\t.ni { color: #f8f8f2 } /* Name.Entity */\n\t.ne { color: #a6e22e } /* Name.Exception */\n\t.nf { color: #a6e22e } /* Name.Function */\n\t.nl { color: #f8f8f2 } /* Name.Label */\n\t.nn { color: #f8f8f2 } /* Name.Namespace */\n\t.nx { color: #a6e22e } /* Name.Other */\n\t.py { color: #f8f8f2 } /* Name.Property */\n\t.nt { color: #f92672 } /* Name.Tag */\n\t.nv { color: #f8f8f2 } /* Name.Variable */\n\t.ow { color: #f92672 } /* Operator.Word */\n\t.w { color: #f8f8f2 } /* Text.Whitespace */\n\t.mf { color: #ae81ff } /* Literal.Number.Float */\n\t.mh { color: #ae81ff } /* Literal.Number.Hex */\n\t.mi { color: #ae81ff } /* Literal.Number.Integer */\n\t.mo { color: #ae81ff } /* Literal.Number.Oct */\n\t.sb { color: #e6db74 } /* Literal.String.Backtick */\n\t.sc { color: #e6db74 } /* Literal.String.Char */\n\t.sd { color: #e6db74 } /* Literal.String.Doc */\n\t.s2 { color: #e6db74 } /* Literal.String.Double */\n\t.se { color: #ae81ff } /* Literal.String.Escape */\n\t.sh { color: #e6db74 } /* Literal.String.Heredoc */\n\t.si { color: #e6db74 } /* Literal.String.Interpol */\n\t.sx { color: #e6db74 } /* Literal.String.Other */\n\t.sr { color: #e6db74 } /* Literal.String.Regex */\n\t.s1 { color: #e6db74 } /* Literal.String.Single */\n\t.ss { color: #e6db74 } /* Literal.String.Symbol */\n\t.bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */\n\t.vc { color: #f8f8f2 } /* Name.Variable.Class */\n\t.vg { color: #f8f8f2 } /* Name.Variable.Global */\n\t.vi { color: #f8f8f2 } /* Name.Variable.Instance */\n\t.il { color: #ae81ff } /* Literal.Number.Integer.Long */\n}"
  },
  {
    "path": "assets/less/reset.less",
    "content": "//\n// Reset CSS\n// Adapted from http://github.com/necolas/normalize.css\n// --------------------------------------------------\n\n*, *:after, *:before {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n// Display in IE6-9 and FF3\n// -------------------------\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\n\n// Display block in IE6-9 and FF3\n// -------------------------\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\n\n// Prevents modern browsers from displaying 'audio' without controls\n// -------------------------\naudio:not([controls]) {\n    display: none;\n}\n\n// Base settings\n// -------------------------\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n// Focus states\na:focus {\n  .tab-focus();\n}\n// Hover & Active\na:hover,\na:active {\n  outline: 0;\n}\n\n// Prevents sub and sup affecting line-height in all browsers\n// -------------------------\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\n\n// Blockquote\n// -------------------------\nblockquote {\n  margin: 0;\n}\n\n// Img border in a's and image quality\n// -------------------------\nimg {\n  /* Responsive images (ensure images don't scale beyond their parents) */\n  max-width: 100%; /* Part 1: Set a maxium relative to the parent */\n  width: auto\\9; /* IE7-8 need help adjusting responsive images */\n  height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */\n\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n\n// Prevent max-width from affecting Google Maps\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\n\n// Forms\n// -------------------------\n// Font size in all browsers, margin changes, misc consistency\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\nbutton,\ninput {\n  *overflow: visible; // Inner spacing ie IE6/7\n  line-height: normal; // FF3/4 have !important on line-height in UA stylesheet\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner { // Inner padding and border oddities in FF3/4\n  padding: 0;\n  border: 0;\n}\nbutton,\nhtml input[type=\"button\"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls.\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n    -webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS.\n    cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.\n}\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n    cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.\n}\ninput[type=\"search\"] { // Appearance in Safari/Chrome\n  .box-sizing(content-box);\n  -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5\n}\ntextarea {\n  overflow: auto; // Remove vertical scrollbar in IE6-9\n  vertical-align: top; // Readability and alignment cross-browser\n}\n\n// Printing\n// -------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n@media print {\n\n  * {\n    text-shadow: none !important;\n    color: #000 !important; // Black prints faster: h5bp.com/s\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  // Don't show links for images, or javascript/internal links\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group; // h5bp.com/t\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}"
  },
  {
    "path": "assets/less/site.less",
    "content": "// Selection\n// --------------------------------------------------\n::-moz-selection { \n\tbackground-color: lighten(@base-color, 65%); \n\tcolor: @base-color; \n\ttext-shadow: none; \n}  \t\n::selection { \n\tbackground-color: lighten(@base-color, 65%); \n\tcolor: @base-color; \n\ttext-shadow: none; \n}\n\n// Global Classes\n// --------------------------------------------------\n.wrap {\n\tmargin: 0 auto;\n}\n.all-caps {\n\ttext-transform: uppercase;\n}\n.pull-left {\n\tfloat: left;\n}\n.pull-right {\n\tfloat:right;\n}\n.unstyled-list {\n\tlist-style: none;\n\tmargin-left: 0;\n\tpadding-left: 0;\n\tli {\n\t\tlist-style-type: none;\n\t}\n}\n.inline-list {\n\tlist-style: none;\n\tmargin-left: 0;\n\tpadding-left: 0;\n\tli {\n\t\tlist-style-type: none;\n\t\tdisplay: inline;\n\t}\n}\n\n// Global Transition\n// ---------------------------------------------------\nb, i, strong, em, blockquote, p, q, span, figure, img, h1, h2, header, input, a {\n\t.transition(all .2s ease);\n}"
  },
  {
    "path": "assets/less/typography.less",
    "content": "// Body\n// --------------------------------------------------\nbody {\n\tfont-family: @base-font;\n\tcolor: @text-color;\n}\n\n// Headings\n// --------------------------------------------------\nh1, h2, h3, h4, h5, h6 {\n\tfont-family: @heading-font;\n}\nh1 {\n\t.font-rem(32);\n}\n\n// Links\n// --------------------------------------------------\na { \n\ttext-decoration: none;\n\tcolor: @link-color; \n\t&:visited { \n\t\tcolor: lighten(@link-color, 20); \n\t}\n\t&:hover { \n\t\tcolor: darken(@link-color, 20); \n\t}\n\t&:focus { \n\t\toutline: thin dotted; \n\t\tcolor: darken(@link-color, 20);\n\t}\n\t&:hover, \n\t&:active { \n\t\toutline: 0; \n\t}\n}\n\n.link-arrow {\n\tfont-weight: 100;\n\ttext-decoration: underline;\n\tfont-style: normal;\n}\n\n// Figures\n// --------------------------------------------------\nfigcaption {\n\tpadding-top: 10px;\n\t.font(14);\n\tline-height: 1.3;\n\tcolor: lighten(@text-color, 10);\n}\n\n// Note text\n// --------------------------------------------------\n.notice {\n\tmargin-top: 1.5em;\n\tpadding: .5em 1em;\n\ttext-indent: 0;\n\t.font-rem(14);\n\tbackground-color: @body-color;\n\tborder: 1px solid darken(@body-color,20);\n\t.rounded(3px);\n}\n\n// Blockquotes\n// --------------------------------------------------\nblockquote {\n\tfont-family: @alt-font;\n\tfont-style: italic;\n\tborder-left: 8px solid @border-color;\n\tpadding-left: 20px;\n\t@media @medium {\n\t\tmargin-left: -28px;\n\t}\n}\n\n// Footnotes\n// --------------------------------------------------\n.entry-content .footnotes {\n\tol, li, p {\n\t\t.font-size(14);\n\t}\n}\n\n// Code\n// --------------------------------------------------\ntt, code, kbd, samp, pre {\n\tfont-family: @code-font;\n}\np,\nli { \n\tcode {\n\t\t.font-rem(12);\n\t\tline-height: 1.5;\n\t\twhite-space: nowrap;\n\t\tmargin: 0 2px;\n\t\tpadding: 0 5px;\n\t\tborder: 1px solid lighten(@black, 90);\n\t\tbackground-color: lighten(@black, 95);\n\t\t.rounded(3px);\n\t}\n}\npre {\n\t.font-rem(12);\n\tline-height: 1.5;\n\toverflow-x: auto;\n\t&::-webkit-scrollbar {\n\t\theight: 12px;\n\t\tbackground-color: #34362e;\n\t\tborder-radius: 0 0 4px 4px;\n\t}\n\t&::-webkit-scrollbar-thumb:horizontal {\n\t\tbackground-color: #6a6d5d;\n\t\t.rounded(4px);\n\t}\n}\n"
  },
  {
    "path": "assets/less/variables.less",
    "content": "// Typography\n// --------------------------------------------------\n\n@base-font: 'Lato', Calibri, Arial, sans-serif;\n@heading-font: @base-font;\n@caption-font: @base-font;\n@code-font: monospace;\n@alt-font: serif;\n\n@doc-font-size: 16;\n@doc-line-height: 26;\n\n\n// set-up the body font-size / line-height\nbody {\n\tmargin-top: 0px + @doc-line-height;\n\tfont-size: 0px + @doc-font-size;\t\n}\n\n// Colors\n// --------------------------------------------------\n@base-color\t\t\t\t: #222;\n@body-color      \t\t: #e8e8e8;\n@text-color      \t\t: #222;\n@comp-color \t \t\t: spin(@base-color, 180); \n@border-color    \t\t: lighten(@base-color,60);\n@white           \t\t: #fff;\n@black           \t\t: #000;\n@link-color \t\t    : #222;\n\n@primary\t\t\t: @base-color;\n@success\t\t\t: #5cb85c;\n@warning\t\t\t: #dd8338;\n@danger\t\t\t\t: #C64537;\n@info\t\t\t\t: #308cbc;\n"
  },
  {
    "path": "common/js/ajax.js",
    "content": "function Ajax(parametObject) {\n \n\tvar xhr, responseType, defineParam, method, url, data;\n\tdefineParam = {\n\t\tmethod : \"GET\",\n\t\ttype : \"json\"\n\t}\n\turl = parametObject.url;\n\tdata = parametObject.data;\n\tresponseType = parametObject.type || defineParam.type;\n\tmethod = parametObject.method || defineParam.method;\n \n\tif(navigator.userAgent.toUpperCase().indexOf('MSIE') >= 0){\n\t    try{\n\t        xhr=new ActiveXObject('microsoft.xmlhttp');\n\t    }catch(e){\n\t        xhr=new ActiveXObject('msxml2.xmlhttp');\n\t    }\n    }else{\n        xhr=new XMLHttpRequest();\n   \t};\n   \txhr.onreadystatechange = function() {\n\t\tif(xhr.readyState == 4) {\n \n\t\t\tif(responseType == \"json\") {\n\t\t\t\tresponseType = xhr.responseText;\n\t\t\t}else {\n\t\t\t\tresponseType = xhr.responseXML;\n\t\t\t}\n \n\t\t\tif(xhr.status== 200 && typeof(parametObject.success) == 'function') {\n\t\t\t\tparametObject.success(responseType);\n\t\t\t}else if(xhr.status != 200 && typeof(parametObject.error) == 'function') {\n\t\t\t\tparametObject.error(responseType);\n\t\t\t}\n\t\t\t\n\t\t}\n\t}\n\tif(method.toUpperCase() == \"GET\") {\n\t\tif(data) {\n\t\t\turl = url + '?' + data + '&random=' +Math.random();\n\t\t}\n\t\txhr.open('GET', url, true);\n\t\txhr.send(null);\n\t}\n\tif(method.toUpperCase() == \"POST\") {\n\t\txhr.open('POST', url, true);\n\t\txhr.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\");\n\t\txhr.send(data);\n\t}\n \n}"
  },
  {
    "path": "common/js/startmove.js",
    "content": "function startMove(obj, json, fnEnd) {\n\tif (obj.timer) {\n\t\tclearInterval(obj.timer);\n\t}\n\tobj.timer = setInterval(function() {\n\t\tdoMove(obj, json, fnEnd);\n\t}, 10);\n\n\tvar oDate = new Date();\n\n\tif (oDate.getTime() - obj.lastMove > 30) {\n\t\tdoMove(obj, json, fnEnd);\n\t}\n}\n\nfunction getStyle(obj, attr){\n\treturn obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj, false)[attr];\n}\n\nfunction doMove(obj, json, speed, fnEnd) {\n\tvar iCur = 0;\n\tvar attr = '';\n\tvar _speed = speed || 8;\n\tvar bStop = true; //假设运动已经该停止了\n\tfor (attr in json) {\n\t\tiCur = attr == 'opacity' ? parseInt(100 * parseFloat(getStyle(obj, 'opacity'))) : parseInt(getStyle(obj, attr));\n\t\tif (isNaN(iCur)) {\n\t\t\tiCur = 0;\n\t\t}\n\t\tvar iSpeed = (json[attr] - iCur) / _speed;\n\t\tiSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);\n\t\tif (parseInt(json[attr]) != iCur) {\n\t\t\tbStop = false;\n\t\t}\n\t\tif (attr == 'opacity') {\n\t\t\tobj.style.filter = \"alpha(opacity:\" + (iCur + iSpeed) + \")\";\n\t\t\tobj.style.opacity = (iCur + iSpeed) / 100;\n\t\t} else {\n\t\t\tobj.style[attr] = iCur + iSpeed + 'px';\n\t\t}\n\t}\n\tif (bStop) {\n\t\tclearInterval(obj.timer);\n\t\tobj.timer = null;\n\n\t\tif (fnEnd) {\n\t\t\tfnEnd();\n\t\t}\n\t}\n\n\tobj.lastMove = (new Date()).getTime();\n}\n"
  },
  {
    "path": "common/js/test.js",
    "content": "test.js"
  },
  {
    "path": "demo/2014-11/ali-media.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>JS Bin</title>\n</head>\n<style type=\"text/css\">\n\t*{\n\t\tmargin: 0;\n\t\tpadding : 0;\n\t}\n\tli {\n\t\tlist-style-type: none;\n\t}\n\t#page {\n\t\twidth: 960px;\n\t\tmargin: 0px auto;\n\t\ttext-align: center;\n\t}\n\theader {\n\t\tmargin-bottom: 20px;\n\t\tbackground: #eee;\n\t\tborder-top: 3px solid black;\n\t\tborder-bottom: 3px solid black;\n\t}\n\n\theader h1 {\n\t\tpadding: 50px 0;\n\t}\n\t#content ul {\n\t\tfloat: left;\n\t\tmargin-right: 20px;\n\t}\n\t#content ul li {\n\t\theight: 30px;\n\t\tcolor: blue;\n\t} \n\n\t#content table{\n\t\tfloat: left;;\n\t\tborder-collapse: collapse;\n        border: none;\n        width: 86%;\n\t}\n\t#content table tr {\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t}\n\t#content table th{\n\t\ttext-align: center;\n        border: 1px solid #000 ;\n\n    }\n \t#content table td{\n \t\twidth: 30%;\n        border: 1px solid #000 ;\n        text-align: left;\n    }\n    @media screen and (max-width:600px) {\n\t    #page {\n\t\t\twidth: 100%;\n\t\t\tmargin: 0px auto;\n\t\t\ttext-align: center;\n\t\t}\n\t\t#content ul {\n\t\t\tfloat: left;\n\t\t\twidth: 100%;\n\t\t\t\n\t\t}\n\n\t\t#content ul li {\n\t\t\tcolor: blue;\n\t\t\tfloat: left;\n\t\t\twidth: 33%;\n\t\t\theight: 150px;\n\t\t\tline-height: 150px;\n\t\t}\n\n\t\t#content table{\n\n\t        width: 100%;\n\t\t}\n    }\n</style>\n<body>\n\t<div id=\"page\">\n\t\t<header>\n\t\t\t<h1>阿里巴巴面试题</h1>\n\t\t</header>\n\t\t<section id=\"content\">\n\t\t\t<ul>\n\t\t\t\t<li>前段工程面试题</li>\n\t\t\t\t<li>设计师面试题</li>\n\t\t\t\t<li>JAVA面试题</li>\n\t\t\t</ul>\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><th>我是标题一</th><th>标题二</th><th>标题三</th></tr>\n\t\t\t\t\t<tr><td>内容</td><td>内容</td><td>内容</td></tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</section>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "demo/2014-11/ali-percent.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>流式布局</title>\n</head>\n<style type=\"text/css\">\n\t*{\n\t\tmargin: 0;\n\t\tpadding : 0;\n\t}\n\tli {\n\t\tlist-style-type: none;\n\t}\n\t#page {\n\t\twidth: 90%;\n\t\tmargin: 0px auto;\n\t\ttext-align: center;\n\t}\n\theader {\n\t\tmargin-bottom: 20px;\n\t\tbackground: #eee;\n\t\tborder-top: 3px solid black;\n\t\tborder-bottom: 3px solid black;\n\t}\n\n\theader h1 {\n\t\tpadding: 50px 0;\n\t}\n\t#content ul {\n\t\tfloat: left;\n\t\twidth: auto;\n\t}\n\t#content ul li {\n\t\theight: 30px;\n\t\tcolor: blue;\n\t} \n\n\t#content table{\n\t\tfloat: right;\n\t\tborder-collapse: collapse;\n        border: none;\n        width: 86%;\n\t}\n\t#content table tr {\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t}\n\t#content table th{\n\t\ttext-align: center;\n        border: 1px solid #000 ;\n\n    }\n \t#content table td{\n \t\twidth: 28%;\n        border: 1px solid #000 ;\n        text-align: left;\n    }\n</style>\n<body>\n\t<div id=\"page\">\n\t\t<header>\n\t\t\t<h1>阿里巴巴面试题</h1>\n\t\t</header>\n\t\t<section id=\"content\">\n\t\t\t<ul>\n\t\t\t\t<li>前段工程面试题</li>\n\t\t\t\t<li>设计师面试题</li>\n\t\t\t\t<li>JAVA面试题</li>\n\t\t\t</ul>\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><th>我是标题一</th><th>标题二</th><th>标题三</th></tr>\n\t\t\t\t\t<tr><td>内容</td><td>内容</td><td>内容</td></tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t<div style=\"clear:both\"></div>\n\t\t</section>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "demo/2014-11/ali-px.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>JS Bin</title>\n</head>\n<style type=\"text/css\">\n\t*{\n\t\tmargin: 0;\n\t\tpadding : 0;\n\t}\n\tli {\n\t\tlist-style-type: none;\n\t}\n\t#page {\n\t\twidth: 960px;\n\t\tmargin: 0px auto;\n\t\ttext-align: center;\n\t}\n\theader {\n\t\tmargin-bottom: 20px;\n\t\tbackground: #eee;\n\t\tborder-top: 3px solid black;\n\t\tborder-bottom: 3px solid black;\n\t}\n\n\theader h1 {\n\t\tpadding: 50px 0;\n\t}\n\t#content ul {\n\t\tfloat: left;\n\t\tmargin-right: 20px;\n\t}\n\t#content ul li {\n\t\theight: 30px;\n\t\tcolor: blue;\n\t} \n\n\t#content table{\n\t\tfloat: left;;\n\t\tborder-collapse: collapse;\n        border: none;\n        width: 810px;\n\t}\n\t#content table tr {\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t}\n\t#content table th{\n\t\ttext-align: center;\n        border: 1px solid #000 ;\n\n    }\n \t#content table td{\n \t\twidth: 270px;\n        border: 1px solid #000 ;\n        text-align: left;\n    }\n</style>\n<body>\n\t<div id=\"page\">\n\t\t<header>\n\t\t\t<h1>阿里巴巴面试题</h1>\n\t\t</header>\n\t\t<section id=\"content\">\n\t\t\t<ul>\n\t\t\t\t<li>前段工程面试题</li>\n\t\t\t\t<li>设计师面试题</li>\n\t\t\t\t<li>JAVA面试题</li>\n\t\t\t</ul>\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><th>我是标题一</th><th>标题二</th><th>标题三</th></tr>\n\t\t\t\t\t<tr><td>内容</td><td>内容</td><td>内容</td></tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</section>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "demo/2014-11/ali-rem.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>弹性布局</title>\n</head>\n<style type=\"text/css\">\n\t*{\n\t\tmargin: 0;\n\t\tpadding : 0;\n\t}\n\thtml { font-size: 62.5%; } \n\tli {\n\t\tlist-style-type: none;\n\t}\n\t#page {\n\t\tmargin: 0px auto;\n\t\ttext-align: center;\n\t}\n\theader {\n\t\tmargin-bottom: 2rem;\n\t\tbackground: #eee;\n\t\tborder-top: 0.3rem solid black;\n\t\tborder-bottom: 0.3rem solid black;\n\t}\n\n\theader h1 {\n\t\tpadding: 5rem 0;\n\t}\n\t#content ul {\n\t\tfloat: left;\n\t\twidth: auto;\n\t\tmargin-right: 5rem;\n\t}\n\t#content ul li {\n\t\theight: 3rem;\n\t\tcolor: blue;\n\t} \n\n\t#content table{\n\t\tfloat: left;\n\t\tborder-collapse: collapse;\n        border: none;\n\t}\n\t#content table tr {\n\t\theight: 3rem;\n\t\tline-height: 3rem;\n\t}\n\t#content table th{\n\t\ttext-align: center;\n        border: 1px solid #000 ;\n\n    }\n \t#content table td{\n \t\twidth: 27rem;\n        border: 1px solid #000 ;\n        text-align: left;\n    }\n</style>\n<body>\n\t<div id=\"page\">\n\t\t<header>\n\t\t\t<h1>阿里巴巴面试题</h1>\n\t\t</header>\n\t\t<section id=\"content\">\n\t\t\t<ul>\n\t\t\t\t<li>前段工程面试题</li>\n\t\t\t\t<li>设计师面试题</li>\n\t\t\t\t<li>JAVA面试题</li>\n\t\t\t</ul>\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><th>我是标题一</th><th>标题二</th><th>标题三</th></tr>\n\t\t\t\t\t<tr><td>内容</td><td>内容</td><td>内容</td></tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t<div style=\"clear:both\"></div>\n\t\t</section>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "demo/absolute_percent.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta name=\"viewport\" content=\"width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\">\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n    <meta name=\"format-detection\" content=\"telephone=no\">\n    <style type=\"text/css\">\n    .wrapper {\n        display: -webkit-box;\n        display:flex;\n    }\n    .left{\n        -webkit-box-flex: 1;\n        flex:1;\n        position: relative;\n        background: red;\n        height: 87px;\n    }\n\n    .center {\n        position: absolute;\n        top: 50%;\n        -webkit-transform: translate(0,-50%);\n        transform: translate(0,-50%);\n        background: black;\n        color: white;\n    }\n\n    .right {\n        background: green;\n    }\n\n    .right img {\n        display: block;\n        height: 87px;\n        width: 70px;\n    }\n\n    label {\n        display: block;\n    }\n\n    .looks-center {\n        position: absolute;\n        top: 14px;\n        /*-webkit-transform: translateY(-50%);*/\n        background: black;\n        color: white;\n    }\n    </style>\n</head>\n<body>\n    <br/><br/><br/>\n    <div class=\"wrapper\">\n        <div class=\"left\">\n            <div class=\"center\">\n                <label>作者：渡边淳一</label>\n                <label>来源：www.abc.com</label>\n                <label>字数：123万字</label>\n            </div>\n        </div>\n        <div class=\"right\">\n            <img src=\"\">\n        </div>\n    </div>\n    <br/>\n    <div class=\"wrapper\">\n        <div class=\"left\">\n            <div class=\"looks-center\">\n                <label>作者：渡边淳一</label>\n                <label>来源：www.abc.com</label>\n                <label>字数：123万字</label>\n            </div>\n        </div>\n        <div class=\"right\">\n            <img src=\"\">\n        </div>\n    </div>\n</body>"
  },
  {
    "path": "demo/cqut-paging/demo.html",
    "content": "<!DOCTYPE HTML>\r\n<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n<title></title>\r\n<style type=\"text/css\">\r\n\t2\r\n1\r\n\t.page a{\r\n\t\ttext-decoration:none;\r\n\t\tdisplay:inline-block;\r\n\t\tline-height:14px;\r\n\t\tpadding:2px 5px;\r\n\t\tcolor:#333;\r\n\t\tborder:1px solid #ccc;\r\n\t\tmargin:0 2px\r\n\t}\r\n\t.page a:hover,.page a.on{\r\n\t\tbackground:#2A8F87;\r\n\t\tcolor:#fff;\r\n\t\tborder:1px solid #333;\r\n\t}\r\n\t.page a.unclick,.page a.unclick:hover{\r\n\t\tbackground:none;\r\n\t\tborder:1px solid #eee;\r\n\t\tcolor:#999;\r\n\t\tcursor:default;\r\n\t}\r\n</style>\r\n</head>\r\n<body>\r\n\r\n\t<h3>页数小于10 iPage(document.getElementsByTagName(\"div\")[0],10,1)</h3>\r\n\t<div class=\"page\"></div>\r\n\t<h3>页数大于10且当前页小于5 iPage(document.getElementsByTagName(\"div\")[1],13,5);</h3>\r\n\t<div class=\"page\"></div>\r\n\t<h3>页数大于10且当前页大于5 iPage(document.getElementsByTagName(\"div\")[1],13,9);</h3>\r\n\t<div class=\"page\"></div>\r\n</body>\r\n<script type=\"text/javascript\">\r\n\t//obj 容器，count 总页数 curPage 当前页数\r\n\tfunction iPage(obj,count,curPage){  \r\n\t\tvar href = 'article.do?page=';\r\n\t\tvar obj=obj;\r\n\t\tvar count=count;\r\n\t\tvar curPage=curPage;\r\n\t\tvar a=[];\r\n\t\t//总页数少于10 全部显示,大于10 显示前3 后3 中间3 其余....\r\n\t\r\n\t\tif(curPage == 1) {\r\n\t\t\ta.push('<a href=\"#\" class=\"unclick\" >首页</a>');\r\n\t\t\ta.push('<a href=\"#\" class=\"unclick\" >上页</a>');\r\n\t\t}\r\n\t\telse {\r\n\t\t\ta.push('<a href=\"' + href + 1 + '\" >首页</a>');\r\n\t\t\ta.push('<a href=\"' + href + (curPage-1) + '\"  >上页</a>');\r\n\t\t}\r\n\r\n\t\t//总页数小于10\r\n\t\tif(count<=10){\r\n\t\t\tfor(var i=1;i<=count;i++){\r\n\t\t\t\tcreatePage(i);\r\n\t\t\t}\r\n\t\t}else {\r\n\t\t\tif(curPage <= 4) {//总页数大于10且当前页远离总页数(小于5)\r\n\t\t\t\tfor(var i = 1; i <=5; i++) {\r\n\t\t\t\t\tcreatePage(i);\r\n\t\t\t\t}\r\n\t\t\t\ta.push('...<a href=\"' + href + count + '\">'+count+'</a>')\r\n\t\t\t}else if(curPage>=count-3){//总页数大于10且当前页接近总页数(小于总页数-3)\r\n\t\t\t\ta.push('<a href=\"' + href + 1 + '\">1</a>');\r\n\t\t\t\tfor(var i=count-4;i<=count;i++){\r\n\t\t\t\t\tcreatePage(i);\r\n\t\t\t\t}\r\n\t\t\t}else{ //除开上面两个情况\r\n\t\t\t\ta.push('<a href=\"' + href + 1 + '\">1</a>...');\r\n\t\t\t\tfor(var i=curPage-2;i<=curPage+2;i++){\r\n\t\t\t\t\tcreatePage(i);\r\n\t\t\t\t}\r\n\t\t\t\ta.push('...<a href=\"' + href + count + '\">'+count+'</a>');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(curPage==count){\r\n\t\t\ta.push('<a href=\"#\" class=\"unclick\">下页</a>');\r\n\t\t\ta.push('<a href=\"#\" class=\"unclick\">尾页</a>');\r\n\t\t}\r\n\t\telse{\r\n\t\t\ta.push('<a href=\"' + href + (curPage + 1) + '\">下页</a>');\r\n\t\t\ta.push('<a href=\"' + href + count + '\">尾页</a>');\r\n\t\t}\r\n\t\t\r\n\t\tobj.innerHTML=a.join(\"\");\r\n\r\n\t\t//生成页面\r\n\t\tfunction createPage(i){\r\n\t\t\tif(curPage==i){\r\n\t\t\t\ta.push('<a href=\"' + href + i + '\" class=\"on\">'+i+'</a>');\r\n\t\t\t}\r\n\t\t\telse{\r\n\t\t\t\ta.push('<a href=\"' + href + i + '\" >'+i+'</a>');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tiPage(document.getElementsByTagName(\"div\")[0],10,1);\r\n\tiPage(document.getElementsByTagName(\"div\")[1],13,4);\r\n\tiPage(document.getElementsByTagName(\"div\")[2],13,9);\r\n</script>\r\n</html>\r\n"
  },
  {
    "path": "demo/css3/imocoo_2.html",
    "content": "<!DOCTYPE HTML>\n<htmllang=\"en-US\">\n    <head>\n        <meta charset=\"UTF-8\">\n        <title>CSS3 Full Background Slider </title>\n        <style type=\"text/css\">\n            @importurl(\"http://www.w3cplus.com/demo/css3/base.css\");\n            @importurl(\"http://fonts.googleapis.com/css?family=Yesteryear\");\n            html,body {\n            height: 100%;\n            }\n            /*ñͼƬȫʾҾ*/\n            img.bg {\n            min-height: 100%;\n            min-width: 1024px;\n            width: 100%;\n            height: auto !important;\n            height: 100%;\n            position: fixed;\n            top: 0;\n            left: 50%;\n            z-index:1;\n              -webkit-transform: translateX(-50%);\n              -moz-transform: translateX(-50%);\n              -o-transform: translateX(-50%);\n              -ms-transform: translateX(-50%);\n            }\n            /*ñͼƬʾĶЧ*/\n            /* Slide Left */\n            \n            @-webkit-keyframes 'slideLeft' {\n            \t0% { left: -500px; }\n            \t100% { left: 0; }\n            }\n            @-moz-keyframes 'slideLeft' {\n            \t0% { left: -500px; }\n            \t100% { left: 0; }\n            }\n            @-o-keyframes 'slideLeft' {\n            \t0% { left: -500px; }\n            \t100% { left: 0; }\n            }\n            @-ms-keyframes 'slideLeft' {\n            \t0% { left: -500px; }\n            \t100% { left: 0; }\n            }\n            @keyframes 'slideLeft' {\n            \t0% { left: -500px; }\n            \t100% { left: 0; }\n            }\n            /*ñͼӵײ򶥲ĶЧ*/\n             /* Slide Bottom */\n            \n            @-webkit-keyframes 'slideBottom' {\n            \t0% { top: 350px; }\n            \t100% { top: 0; }\n            }\n            @-moz-keyframes 'slideBottom' {\n            \t0% { top: 350px; }\n            \t100% { top: 0; }\n            }\n            @-ms-keyframes 'slideBottom' {\n            \t0% { top: 350px; }\n            \t100% { top: 0; }\n            }\n            @-o-keyframes 'slideBottom' {\n            \t0% { top: 350px; }\n            \t100% { top: 0; }\n            }\n            @keyframes 'slideBottom' {\n            \t0% { top: 350px; }\n            \t100% { top: 0; }\n            }\n            /*ñͼƬСŴ󶯻Ч*/\n            /* Zoom In */\n            \n            @-webkit-keyframes 'zoomIn' {\n            \t0% { -webkit-transform: scale(0.1); }\n            \t100% { -webkit-transform: none; }\n            }\n            @-moz-keyframes 'zoomIn' {\n            \t0% { -moz-transform: scale(0.1); }\n            \t100% { -moz-transform: none; }\n            }\n            @-ms-keyframes 'zoomIn' {\n            \t0% { -ms-transform: scale(0.1); }\n            \t100% { -ms-transform: none; }\n            }\n            @-o-keyframes 'zoomIn' {\n            \t0% { -o-transform: scale(0.1); }\n            \t100% { -o-transform: none; }\n            }\n            @keyframes 'zoomIn' {\n            \t0% { transform: scale(0.1); }\n            \t100% { transform: none; }\n            }\n            /*ñͼɴССЧ*/\n            /* Zoom Out */\n            \n            @-webkit-keyframes 'zoomOut' {\n            \t0% { -webkit-transform: scale(2); }\n            \t100% { -webkit-transform: none; }\n            }\n            @-moz-keyframes 'zoomOut' {\n            \t0% { -moz-transform: scale(2); }\n            \t100% { -moz-transform: none; }\n            }\n            @-ms-keyframes 'zoomOut' {\n            \t0% { -ms-transform: scale(2); }\n            \t100% { -ms-transform: none; }\n            }\n            @-o-keyframes 'zoomOut' {\n            \t0% { -o-transform: scale(2); }\n            \t100% { -o-transform: none; }\n            }\n            @keyframes 'zoomOut' {\n            \t0% { transform: scale(2); }\n            \t100% { transform: none; }\n            }\n            /*ͼתֶЧ*/\n            /* Rotate */\n            \n            @-webkit-keyframes 'rotate' {\n            \t0% { -webkit-transform: rotate(-360deg) scale(0.1); }\n            \t100% { -webkit-transform: none; }\n            }\n            @-moz-keyframes 'rotate' {\n            \t0% { -moz-transform: rotate(-360deg) scale(0.1); }\n            \t100% { -moz-transform: none; }\n            }\n            @-ms-keyframes 'rotate' {\n            \t0% { -ms-transform: rotate(-360deg) scale(0.1); }\n            \t100% { -ms-transform: none; }\n            }\n            @-o-keyframes 'rotate' {\n            \t0% { -o-transform: rotate(-360deg) scale(0.1); }\n            \t100% { -o-transform: none; }\n            }\n            @keyframes 'rotate' {\n            \t0% { transform: rotate(-360deg) scale(0.1); }\n            \t100% { transform: none; }\n            }\n            /*ñͼʾЧ*/\n            @-webkit-keyframes 'notTarget' {\n            \t0% { z-index: 75; }\n            \t100% { z-index: 75; }\n            }\n            @-moz-keyframes 'notTarget' {\n            \t0% { z-index: 75; }\n            \t100% { z-index: 75; }\n            }\n            @-ms-keyframes 'notTarget' {\n            \t0% { z-index: 75; }\n            \t100% { z-index: 75; }\n            }\n            @-o-keyframes 'notTarget' {\n            \t0% { z-index: 75; }\n            \t100% { z-index: 75; }\n            }\n            @keyframes 'notTarget' {\n            \t0% { z-index: 75; }\n            \t100% { z-index: 75; }\n            }\n            \n            \n            \n            .slider {\n            position: absolute;\n            width: 100%;\n            text-align: center;\n            z-index: 9999;\n            bottom: 100px;\n            }\n            .slider li {\n            display: inline-block;\n            width: 170px;\n            height: 130px;\n            margin-right: 15px;\n            }\n            .slider a {\n            display: inline-block;\n            width: 170px;\n            padding-top: 70px;\n            padding-bottom: 20px;\n            position: relative;\n            cursor: pointer;\n            border: 2px solid #fff;\n            border-radius: 5px;\n            vertical-align: top;\n            color: #fff;\n            text-decoration: none;\n            font-size: 22px;\n            font-family: 'Yesteryear', cursive;\n            text-shadow: -1px -1px 1px rgba(0, 0, 0, 0.8),-2px -2px 1px rgba(0, 0, 0, 0.3),-3px -3px 1px rgba(0, 0, 0, 0.3);\n            }\n            /*һòͬбıɫ*/\n            .slider ul li:nth-of-type(1) a{\n            background-color: #02646e;\n            }\n            .slider ul li:nth-of-type(2) a{\n            background-color: #eb0837;\n            }\n            .slider ul li:nth-of-type(3) a{\n            background-color: #67b374;\n            }    \n            .slider ul li:nth-of-type(4) a{\n            background-color: #e6674a;\n            }    \n            .slider ul li:nth-of-type(5) a{\n            background-color: #e61061;\n            }\n            /*ͼ״*/\n            .slider ul li ::after{\n            content:\"\";\n            display: block;\n            height: 120px;\n            width: 120px;\n            border: 5px solid #fff;\n            border-radius: 50%;\n            position: absolute;\n            left: 50%;\n            margin-left: -60px;\n            z-index: 9999;\n            top: -80px;\n            }\n            /*ͼͼ*/\n            .slider ul li:nth-of-type(1) ::after{\n            background: url(http://www.w3cplus.com/demo/css3/CSS3Fullbackground/sbg1.jpg) no-repeat center;\n            }\n            .slider ul li:nth-of-type(2) ::after{\n            background: url(http://www.w3cplus.com/demo/css3/CSS3Fullbackground/sbg2.jpg) no-repeat center;\n            }\n            .slider ul li:nth-of-type(3) ::after{\n            background: url(http://www.w3cplus.com/demo/css3/CSS3Fullbackground/sbg3.jpg) no-repeat center;\n            }\n            .slider ul li:nth-of-type(4) ::after{\n            background: url(http://www.w3cplus.com/demo/css3/CSS3Fullbackground/sbg4.jpg) no-repeat center;\n            }\n            .slider ul li:nth-of-type(5) ::after{\n            background: url(http://www.w3cplus.com/demo/css3/CSS3Fullbackground/sbg5.jpg) no-repeat center;\n            }\n            /*ġͼɰЧ*/\n            .slider ul li ::before{\n            content:\"\";\n            display: block;\n            height: 120px;\n            width: 120px;\n            border: 5px solid #fff;\n            border-radius: 50%;\n            position: absolute;\n            left: 50%;\n            margin-left: -60px;\n            z-index: 99999;\n            top: -80px;\n            background: rgba(0,0,0,0.3);\n            }\n            /*塢ʱ޸ͼɰ͸*/\n            .slider ul li:hover ::before{\n            opacity:0;\n            }\n            /*ͼлͼ*/\n            /*ͼҳ*/\n            .slideLeft:target{\n            \tz-index: 100;\n            \t-webkit-animation-name: slideLeft;\n            \t-webkit-animation-duration: 1s;\n            \t-webkit-animation-iteration-count: 1;\n            \t-moz-animation-name: slideLeft;\n            \t-moz-animation-duration: 1s;\n            \t-moz-animation-iteration-count: 1;\n            \t-ms-animation-name: slideLeft;\n            \t-ms-animation-duration: 1s;\n            \t-ms-animation-iteration-count: 1;\n            \t-o-animation-name: slideLeft;\n            \t-o-animation-duration: 1s;\n            \t-o-animation-iteration-count: 1;\n            \tanimation-name: slideLeft;\n            \tanimation-duration: 1s;\n            \tanimation-iteration-count: 1;\n            }\n            /*ͼϳ*/\n            .slideBottom:target{\n            \tz-index: 100;            \n            \t-webkit-animation-name: slideBottom;\n            \t-webkit-animation-duration: 1s;\n            \t-webkit-animation-iteration-count: 1;\n            \t-moz-animation-name: slideBottom;\n            \t-moz-animation-duration: 1s;\n            \t-moz-animation-iteration-count: 1;\n            \t-ms-animation-name: slideBottom;\n            \t-ms-animation-duration: 1s;\n            \t-ms-animation-iteration-count: 1;\n            \t-o-animation-name: slideBottom;\n            \t-o-animation-duration: 1s;\n            \t-o-animation-iteration-count: 1;\n            animation-name: slideBottom;\n            \tanimation-duration: 1s;\n            \tanimation-iteration-count: 1;\n            }\n            /*ͼС*/\n            .zoomIn:target{\n            \tz-index: 100;\n            \t-webkit-animation-name: zoomIn;\n            \t-webkit-animation-duration: 1s;\n            \t-webkit-animation-iteration-count: 1;\n            \t-moz-animation-name: zoomIn;\n            \t-moz-animation-duration: 1s;\n            \t-moz-animation-iteration-count: 1;\n            \t-ms-animation-name: zoomIn;\n            \t-ms-animation-duration: 1s;\n            \t-ms-animation-iteration-count: 1;\n            \t-o-animation-name: zoomIn;\n            \t-o-animation-duration: 1s;\n            \t-o-animation-iteration-count: 1;\n            \tanimation-name: zoomIn;\n            \tanimation-duration: 1s;\n            \tanimation-iteration-count: 1;\n            }\n            \n            /*ͼɴС*/\n            .zoomOut:target{\n            \tz-index: 100;\n            \t-webkit-animation-name: zoomOut;\n            \t-webkit-animation-duration: 1s;\n            \t-webkit-animation-iteration-count: 1;\n            \t-moz-animation-name: zoomOut;\n            \t-moz-animation-duration: 1s;\n            \t-moz-animation-iteration-count: 1;\n            \t-ms-animation-name: zoomOut;\n            \t-ms-animation-duration: 1s;\n            \t-ms-animation-iteration-count: 1;\n            \t-o-animation-name: zoomOut;\n            \t-o-animation-duration: 1s;\n            \t-o-animation-iteration-count: 1;\n            \tanimation-name: zoomOut;\n            \tanimation-duration: 1s;\n            \tanimation-iteration-count: 1;\n            }\n            \n            /*ͼת*/\n            .rotate:target{\n            \tz-index: 100;\n            \t-webkit-animation-name: rotate;\n            \t-webkit-animation-duration: 1s;\n            \t-webkit-animation-iteration-count: 1;\n            \t-moz-animation-name: rotate;\n            \t-moz-animation-duration: 1s;\n            \t-moz-animation-iteration-count: 1;\n            \t-ms-animation-name: rotate;\n            \t-ms-animation-duration: 1s;\n            \t-ms-animation-iteration-count: 1;\n            \t-o-animation-name: rotate;\n            \t-o-animation-duration: 1s;\n            \t-o-animation-iteration-count: 1;\n            \tanimation-name: rotate;\n            \tanimation-duration: 1s;\n            \tanimation-iteration-count: 1;\n            }\n            /*ߡòʾıͼ㼶*/\n            /* Not Target */\n            \n            bg:not(:target){\n            \t-webkit-animation-name: notTarget;\n            \t-webkit-animation-duration: 1s;\n            \t-webkit-animation-iteration-count: 1;\n            \t-moz-animation-name: notTarget;\n            \t-moz-animation-duration: 1s;\n            \t-moz-animation-iteration-count: 1;\n            \t-ms-animation-name: notTarget;\n            \t-ms-animation-duration: 1s;\n            \t-ms-animation-iteration-count: 1;\n            \t-o-animation-name: notTarget;\n            \t-o-animation-duration: 1s;\n            \t-o-animation-iteration-count: 1;\n            \tanimation-name: notTarget;\n            \tanimation-duration: 1s;\n            \tanimation-iteration-count: 1;\n            }\n        </style>\n    </head>\n    <body>\n        <div class=\"slider\">\n            <ul class=\"clearfix\">\n            \t<li><a href=\"#bg1\">Hipster Fashion Haircut </a></li>\n        \t\t<li><a href=\"#bg2\">Cloud Computing Services &amp; Consulting</a></li>\n        \t\t<li><a href=\"#bg3\">My haire is sooo fantastic!</a></li>\n        \t\t<li><a href=\"#bg4\">Eat healthy &amp; excersice!</a></li>\n        \t\t<li><a href=\"#bg5\">Lips so kissable I could die ...</a></li>\n        \t</ul>\n        </div>\n        <img src=\"http://www.w3cplus.com/demo/css3/CSS3Fullbackground/bg1.jpg\" alt=\"\" class=\"bg slideLeft\" id=\"bg1\" />\n        <img src=\"http://www.w3cplus.com/demo/css3/CSS3Fullbackground/bg2.jpg\" alt=\"\" class=\"bg slideBottom\" id=\"bg2\" />\n        <img src=\"http://www.w3cplus.com/demo/css3/CSS3Fullbackground/bg3.jpg\" alt=\"\" class=\"bg zoomIn\" id=\"bg3\" />\n        <img src=\"http://www.w3cplus.com/demo/css3/CSS3Fullbackground/bg4.jpg\" alt=\"\" class=\"bg zoomOut\" id=\"bg4\" />\n        <img src=\"http://www.w3cplus.com/demo/css3/CSS3Fullbackground/bg5.jpg\" alt=\"\" class=\"bg rotate\" id=\"bg5\" />\n    </body>\n</html>"
  },
  {
    "path": "demo/javascript-seamless-handover/css/main.css",
    "content": ".wrap{ width:500px;font-size:22px; margin:20px auto 0; padding:40px 20px;}\n.list{ padding:0 60px;}\n.list li{list-style:decimal; line-height:50px;border-bottom: 1px solid #f2f2f2;}\n.list li a{ display:block; padding:5px 8px;transition:all 0.6s;}\n.list li a:hover{ text-indent:25px;border-radius:5px;color: #fff;text-shadow:0 2px 1px #360;background-color: #393;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);text-decoration:none;}"
  },
  {
    "path": "demo/javascript-seamless-handover/css/reset.css",
    "content": "*{ margin:0; padding:0;}\nbody{font:14px/1.125 Arial,Helvetica,sans-serif;background:#fff;}\ntable{border-collapse:collapse;border-spacing:0;}\nli{list-style:none;}\nfieldset,img{border:0;}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\nq:before,q:after{content:'';}\na:focus,input,textarea{outline-style:none;}\ninput[type=\"text\"],input[type=\"password\"],textarea{outline-style:none;-webkit-appearance:none;}\ntextarea{resize:none}\naddress,caption,cite,code,dfn,em,i,th,var{font-style:normal;font-weight:normal;}\nlegend{color:#000;}\nabbr,acronym{border:0;font-variant:normal;}\na{color:#0a8cd2;text-decoration:none;}\na:hover{text-decoration:underline;}\n.clearfix:after{content:\".\";display:block;height:0;clear:both;visibility:hidden;}\n.clearfix{display:inline-block;}\n.clearfix{display:block;}\n.clear{clear:both;height:0;font:0/0 Arial;visibility:hidden;}\n.none{display:none}\n.shadow{border:1px solid #e6e6e6;border-radius:5px;box-shadow:0px 2px 3px #ececec;background: #fff;}"
  },
  {
    "path": "demo/javascript-seamless-handover/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\"/>\n    <title>test</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/reset.css\" media=\"all\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" media=\"all\"/>\n</head>\n<body>\n<div class=\"wrap shadow\">\n    <ol id=\"ol\" class=\"list\"></ol>\n</div>\n<script type=\"text/javascript\">\n    var str = '',\n        data = [\n            { url : 'slide/bd01.html', title : '百度爱玩 - 图片轮换效果' },\n            { url : 'http://www.sohu.com', title : '百度图片轮换效果' },\n            { url : 'http://www.sohu.com', title : '百度图片轮换效果' }\n        ];\n    for(var i = 0; i < data.length; i++){\n        var items = data[i];\n        str += '<li><a href=\"' + items.url + '\" target=\"_blank\" title=\"\">' + items.title + '</a></li>';\n    }\n    document.getElementById('ol').innerHTML = str;\n</script>\n</body>\n</html>"
  },
  {
    "path": "demo/javascript-seamless-handover/slide/bd01.html",
    "content": "<!DOCTYPE html>\n<html>\n\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>百度爱玩 - 图片轮换效果</title>\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"css/slide.css\" media=\"all\" />\n\t\t<script src=\"js/startmove.js\"></script>\n\t</head>\n\n\t<body>\n\t\t<div id=\"mp-banner\" class=\"mp-banner\">\n\t\t\t<div id=\"j-banner\" class=\"mp-banner-wrap\">\n\t\t\t\t<div class=\"mp-banner-inner\">\n\t\t\t\t\t<ul class=\"mp-banner-ct mp-clearfix\" id=\"mp-banner-ct\">\n\t\t\t\t\t\t<li class=\"mp-banner-item\">\n\t\t\t\t\t\t\t<a href=\"#\" class=\"mp-banner-link\" title=\"大型3D武侠修仙网页游戏，全视角3D战斗！\">开始游戏</a>\n\t\t\t\t\t\t\t<div class=\"mp-banner-back\">\n\t\t\t\t\t\t\t\t<div class=\"mp-btn-start\">开始游戏</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"mp-banner-front\">\n\t\t\t\t\t\t\t\t<img width=\"237\" height=\"163\" alt=\"剑宗\" src=\"images/1.jpg\" class=\"mp-banner-img\">\n\t\t\t\t\t\t\t\t<div class=\"mp-banner-footer2\">\n\t\t\t\t\t\t\t\t\t<span class=\"num\">1</span>\n\t\t\t\t\t\t\t\t\t<h3>剑宗</h3>\n\t\t\t\t\t\t\t\t\t<span class=\"role\">角色扮演</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mp-banner-intro\">大型3D武侠修仙网页游戏，全视角3D战斗！</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"mp-banner-item\">\n\t\t\t\t\t\t\t<a href=\"#\" class=\"mp-banner-link\" title=\"大型3D武侠修仙网页游戏，全视角3D战斗！\">开始游戏</a>\n\t\t\t\t\t\t\t<div class=\"mp-banner-back\">\n\t\t\t\t\t\t\t\t<div class=\"mp-btn-start\">开始游戏</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"mp-banner-front\">\n\t\t\t\t\t\t\t\t<img width=\"237\" height=\"163\" alt=\"剑宗\" src=\"images/2.jpg\" class=\"mp-banner-img\">\n\t\t\t\t\t\t\t\t<div class=\"mp-banner-footer2\">\n\t\t\t\t\t\t\t\t\t<span class=\"num\">1</span>\n\t\t\t\t\t\t\t\t\t<h3>剑宗</h3>\n\t\t\t\t\t\t\t\t\t<span class=\"role\">角色扮演</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mp-banner-intro\">大型3D武侠修仙网页游戏，全视角3D战斗！</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"mp-banner-item\">\n\t\t\t\t\t\t\t<a href=\"#\" class=\"mp-banner-link\" title=\"大型3D武侠修仙网页游戏，全视角3D战斗！\">开始游戏</a>\n\t\t\t\t\t\t\t<div class=\"mp-banner-back\">\n\t\t\t\t\t\t\t\t<div class=\"mp-btn-start\">开始游戏</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"mp-banner-front\">\n\t\t\t\t\t\t\t\t<img width=\"237\" height=\"163\" alt=\"剑宗\" src=\"images/3.jpg\" class=\"mp-banner-img\">\n\t\t\t\t\t\t\t\t<div class=\"mp-banner-footer2\">\n\t\t\t\t\t\t\t\t\t<span class=\"num\">1</span>\n\t\t\t\t\t\t\t\t\t<h3>剑宗</h3>\n\t\t\t\t\t\t\t\t\t<span class=\"role\">角色扮演</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mp-banner-intro\">大型3D武侠修仙网页游戏，全视角3D战斗！</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"mp-banner-item\">\n\t\t\t\t\t\t\t<a href=\"#\" class=\"mp-banner-link\" title=\"大型3D武侠修仙网页游戏，全视角3D战斗！\">开始游戏</a>\n\t\t\t\t\t\t\t<div class=\"mp-banner-back\">\n\t\t\t\t\t\t\t\t<div class=\"mp-btn-start\">开始游戏</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"mp-banner-front\">\n\t\t\t\t\t\t\t\t<img width=\"237\" height=\"163\" alt=\"剑宗\" src=\"images/4.jpg\" class=\"mp-banner-img\">\n\t\t\t\t\t\t\t\t<div class=\"mp-banner-footer2\">\n\t\t\t\t\t\t\t\t\t<span class=\"num\">1</span>\n\t\t\t\t\t\t\t\t\t<h3>剑宗</h3>\n\t\t\t\t\t\t\t\t\t<span class=\"role\">角色扮演</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mp-banner-intro\">大型3D武侠修仙网页游戏，全视角3D战斗！</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"mp-banner-item\">\n\t\t\t\t\t\t\t<a href=\"#\" class=\"mp-banner-link\" title=\"大型3D武侠修仙网页游戏，全视角3D战斗！\">开始游戏</a>\n\t\t\t\t\t\t\t<div class=\"mp-banner-back\">\n\t\t\t\t\t\t\t\t<div class=\"mp-btn-start\">开始游戏</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"mp-banner-front\">\n\t\t\t\t\t\t\t\t<img width=\"237\" height=\"163\" alt=\"剑宗\" src=\"images/5.jpg\" class=\"mp-banner-img\">\n\t\t\t\t\t\t\t\t<div class=\"mp-banner-footer2\">\n\t\t\t\t\t\t\t\t\t<span class=\"num\">1</span>\n\t\t\t\t\t\t\t\t\t<h3>剑宗</h3>\n\t\t\t\t\t\t\t\t\t<span class=\"role\">角色扮演</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mp-banner-intro\">大型3D武侠修仙网页游戏，全视角3D战斗！</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"mp-banner-item\">\n\t\t\t\t\t\t\t<a href=\"#\" class=\"mp-banner-link\" title=\"大型3D武侠修仙网页游戏，全视角3D战斗！\">开始游戏</a>\n\t\t\t\t\t\t\t<div class=\"mp-banner-back\">\n\t\t\t\t\t\t\t\t<div class=\"mp-btn-start\">开始游戏</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"mp-banner-front\">\n\t\t\t\t\t\t\t\t<img width=\"237\" height=\"163\" alt=\"剑宗\" src=\"images/6.jpg\" class=\"mp-banner-img\">\n\t\t\t\t\t\t\t\t<div class=\"mp-banner-footer2\">\n\t\t\t\t\t\t\t\t\t<span class=\"num\">1</span>\n\t\t\t\t\t\t\t\t\t<h3>剑宗</h3>\n\t\t\t\t\t\t\t\t\t<span class=\"role\">角色扮演</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<p class=\"mp-banner-intro\">大型3D武侠修仙网页游戏，全视角3D战斗！</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<div id=\"j-banner-side\" class=\"mp-banner-aside\">\n\t\t\t\t\t<h3 class=\"title\">大家都爱玩<i class=\"mp-icon mp-icon-hot hot\"></i></h3>\n\t\t\t\t\t<ul class=\"list\">\n\t\t\t\t\t\t<li class=\"list-item\">\n\t\t\t\t\t\t\t<a target=\"_blank\" href=\"#\">\n\t\t\t\t\t\t\t\t<img alt=\"大天使之剑\" src=\"images/s1.jpg\" class=\"pic\">\n\t\t\t\t\t\t\t\t<div class=\"txt\">\n\t\t\t\t\t\t\t\t\t<h4 class=\"name\">大天使之剑</h4>\n\t\t\t\t\t\t\t\t\t<p class=\"role\">战争策略</p>\n\t\t\t\t\t\t\t\t\t<p class=\"platform\">37游戏</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"list-item\">\n\t\t\t\t\t\t\t<a target=\"_blank\" href=\"#\">\n\t\t\t\t\t\t\t\t<img alt=\"大天使之剑\" src=\"images/s2.jpg\" class=\"pic\">\n\t\t\t\t\t\t\t\t<div class=\"txt\">\n\t\t\t\t\t\t\t\t\t<h4 class=\"name\">大天使之剑</h4>\n\t\t\t\t\t\t\t\t\t<p class=\"role\">战争策略</p>\n\t\t\t\t\t\t\t\t\t<p class=\"platform\">37游戏</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li class=\"list-item\">\n\t\t\t\t\t\t\t<a target=\"_blank\" href=\"#\">\n\t\t\t\t\t\t\t\t<img alt=\"大天使之剑\" src=\"images/s3.jpg\" class=\"pic\">\n\t\t\t\t\t\t\t\t<div class=\"txt\">\n\t\t\t\t\t\t\t\t\t<h4 class=\"name\">大天使之剑</h4>\n\t\t\t\t\t\t\t\t\t<p class=\"role\">战争策略</p>\n\t\t\t\t\t\t\t\t\t<p class=\"platform\">37游戏</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"mp-banner-pager\">\n\t\t\t\t\t<div class=\"mp-banner-pager-prev OP_LOG_LINK\" id=\"mp-banner-pager-prev\">\n\t\t\t\t\t\t<i class=\"arrow-left mp-png\"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"mp-banner-pager-next OP_LOG_LINK\" id=\"mp-banner-pager-next\">\n\t\t\t\t\t\t<i class=\"arrow-right mp-png\"></i>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"mp-banner-bg\">\n\t\t\t\t<ul>\n\t\t\t\t\t<li class=\"list-item yeyou\"></li>\n\t\t\t\t\t<li class=\"list-item wangyou\" style=\"display: none;\"></li>\n\t\t\t\t\t<li class=\"list-item xiaoyouxi\" style=\"display: none;\"></li>\n\t\t\t\t\t<li class=\"list-item shouyou\" style=\"display: none;\"></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<script type=\"text/javascript\">\n\t\t\t(function(){\n\t\t\t        var box = document.getElementById('j-banner'),\n\t\t\t        \tprev = document.getElementById('mp-banner-pager-prev'),\n\t\t\t        \tnext = document.getElementById('mp-banner-pager-next'),\n\t\t\t        \tlist = document.getElementById('mp-banner-ct'),\n\t\t\t        \titems = list.getElementsByTagName('li'),\n\t\t\t        \tlen = items.length;\n\t\t\t        \tliWidth = items[0].offsetWidth + 20;\n\t\t\t\t\t\tselectNum = 2;     //设定一下切换几个   \t\n\t\t\t        \ttimer = null;\n\t\t\t\n\t\t\t\t\tsetWith();\n\t\t\t        function setWith() {\n\t\t\t        \tlist.style.width = liWidth * items.length + 'px';\n\t\t\t        }\n\t\t\t\t\t\n\t\t\t\t\tsetWith();\n\t\t\t\t\t\n\t\t\t        prev.onclick = function(){\n\t\t\t\t\t\tfor(var i = 0; i < selectNum; i++) {\n\t\t\t\t\t\t\tvar curItem = items[i].cloneNode(true);\n\t\t\t\t\t\t\tlist.appendChild(curItem);\n\t\t\t\t\t\t\tsetWith();\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tstartMove(list,{left:-(liWidth * selectNum)},function(){\n\t\t\t\t\t\t\tfor(var i = 0;i < selectNum; i++) {\n\t\t\t\t\t\t\t\tlist.removeChild(items[0]);\n\t\t\t\t\t\t\t\tlist.style.left = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t        }\n\t\t\t\n\t\t\t        next.onclick = function(){\n\t\t\t\t\t\tfor(var i = selectNum-1,j=0 ;i >= 0 ; i--) {\n\t\t\t\t\t\t\t//此处为bug修改，测试设置一下换两个有问题，又加了一个临时变量j来控制待克隆节点的左边\n\t\t\t\t\t\t\tvar curItem = items[len-(i+(++j))].cloneNode(true);\n\t\t\t\t\t\t\tlist.insertBefore(curItem,list.childNodes[0]);\n\t\t\t\t\t\t\tsetWith();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlist.style.left = -liWidth * selectNum + 'px';\n\t\t\t\t\t\t//console.log(list.style.left);\n\t\t\t\t\t\tstartMove(list,{left:0},function(){\n\t\t\t\t\t\t\tfor(var i = selectNum-1 ;i >= 0 ; i--) {\n\t\t\t\t\t\t\t\tlist.removeChild(items[len-1]);\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t        }\n\t\t\t\t\ttimer = setInterval(play, 4000);\n\t\t\t        box.onmouseover = function(){\n\t\t\t            prev.style.display = 'block';\n\t\t\t            next.style.display = 'block';\n\t\t\t            clearInterval(timer);\n\t\t\t        }\n\t\t\t        box.onmouseout = function(){\n\t\t\t            prev.style.display = 'none';\n\t\t\t            next.style.display = 'none';\n\t\t\t            timer = setInterval(play, 4000);\n\t\t\t        }\n\t\t\t\n\t\t\t        function play(){\n\t\t\t            next.onclick();\n\t\t\t        }\n\n\t\t\t\n\t\t\t    }());\n\t\t</script>\n\t</body>\n\n</html>"
  },
  {
    "path": "demo/javascript-seamless-handover/slide/css/slide.css",
    "content": "/* reset */\n*{ margin:0; padding:0;}\nbody{font:12px/1.125 Arial,Helvetica,sans-serif;background:#fff;}\ntable{border-collapse:collapse;border-spacing:0;}\nli{list-style:none;}\nfieldset,img{border:0;}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\nq:before,q:after{content:'';}\na:focus,input,textarea{outline-style:none;}\ninput[type=\"text\"],input[type=\"password\"],textarea{outline-style:none;-webkit-appearance:none;}\ntextarea{resize:none}\naddress,caption,cite,code,dfn,em,i,th,var{font-style:normal;font-weight:normal;}\nlegend{color:#000;}\nabbr,acronym{border:0;font-variant:normal;}\na{color:#0a8cd2;text-decoration:none;}\na:hover{text-decoration:underline;}\n.clearfix:after{content:\".\";display:block;height:0;clear:both;visibility:hidden;}\n.clearfix{display:inline-block;}\n.clearfix{display:block;}\n.clear{clear:both;height:0;font:0/0 Arial;visibility:hidden;}\n.none{display:none}\n/* main */\n.mp-banner{position:relative;height:303px}\n.mp-banner-wrap{position:relative;width:980px;margin:0 auto;height:303px;}\n.mp-banner-wrap .mp-banner-inner{position:relative;width:757px;height:303px;overflow:hidden}\n.mp-banner-ct{position:absolute;top:20px;left:0;}\n.mp-banner-item{position:relative;float:left;width:237px;height:283px;margin-right:23px}\n.mp-banner-item:hover .mp-banner-back{height:283px;z-index:2}\n.mp-banner-item .show{z-index:2;height:283px}\n.mp-banner-back,.mp-banner-front,.mp-banner-overlay{position:absolute;width:237px;height:283px;top:0;left:0}\n.mp-banner-overlay{background:#000;opacity:.7;filter:alpha(opacity=70);z-index:-1}\n.mp-banner-front{_overflow:hidden}\n.mp-banner-back{color:#fff;z-index:0;height:0;overflow:hidden}\n.mp-banner-back .mp-btn-start{position:absolute;top:182px;right:0;width:75px;height:28px;line-height:28px;background:#ff7a01;border:1px solid #d45f00;text-align:center}\n.mp-banner-link{position:absolute;top:0;left:0;width:100%;height:234px;border-radius:5px;z-index:9;background:url(../images/transparent.gif);text-indent:-9999px;overflow:hidden;text-align:left;direction:ltr}\n.mp-banner-header{position:relative;height:36px;line-height:36px}\n.mp-banner-images{display:block;border:0}\n.mp-banner-pager{position:relative;width:980px;margin:0 auto;font-size:0}\n.mp-banner-pager .arrow-left,.mp-banner-pager .arrow-right{display:block;width:65px;height:65px;background:url(../images/banner-arrow.png) no-repeat}\n.mp-banner-pager-next,.mp-banner-pager-prev{position:absolute;top:-233px;width:65px;height:65px;cursor:pointer;z-index:10; display:none;}\n.mp-banner-pager-prev{left:0}\n.mp-banner-pager-prev .arrow-left{background-position:0 -225px}\n.mp-banner-pager-next{right:223px}\n.mp-banner-pager-next .arrow-right{background-position:0 -160px}\n.hover .mp-banner-pager-next,.hover .mp-banner-pager-prev{visibility:visible}\n.mp-banner-name{padding-left:10px;font-size:16px;color:#333}\n.mp-banner-type{position:absolute;top:0;right:0;height:36px;line-height:36px;font-size:13px;color:#6c6c6c;padding-right:.75em}\n.mp-banner-footer{height:35px;line-height:35px;font-size:13px;color:#6c6c6c;width:237px}\n.mp-banner-footer-center{color:#000;text-align:center}\n.mp-banner-footer-center em{font-style:normal;color:red}\n.mp-banner-bg{position:absolute;top:0;left:0;z-index:-2;height:100%;width:100%}\n.mp-banner-bg ul{width:100%;height:100%}\n.mp-banner-bg .list-item{display:block;height:100%}\n.mp-banner-bg .yeyou{background:url(../images/banner-bg-red.jpg) repeat}\n.mp-banner-bg .wangyou{background:url(../images/banner-bg-blue.jpg) repeat}\n.mp-banner-bg .shouyou{background:url(../images/banner-bg-purple.jpg) repeat}\n.mp-banner-bg .xiaoyouxi{background:url(../images/banner-bg-black.jpg) repeat}\n.mp-banner-footer2{position:relative;height:57px;padding-left:42px}\n.mp-banner-footer2 .num{position:absolute;top:0;left:0;font-size:52px;color:#fff}\n.mp-banner-footer2 h3{padding-top:5px;font-size:18px;height:28px;line-height:28px;color:#fff}\n.mp-banner-footer2 .platform,.mp-banner-footer2 .role{height:16px;line-height:16px;font-size:14px}\n.mp-banner-footer2 .role{color:#ff7a01;margin-right:6px}\n.mp-banner-footer2 .platform{color:#ccc}\n.mp-banner-intro{height:16px;line-height:16px;font-size:14px;color:#fff}\n.mp-banner-aside{position:absolute;top:20px;right:0;z-index:10;width:200px}\n.mp-banner-aside .title{position:relative;height:36px;line-height:36px;color:#fff;font-size:16px;text-align:center;background-image:-webkit-gradient(linear,left top,left bottom,from(#666),to(#4f4f4f));background-image:-webkit-linear-gradient(top,#666,#4f4f4f);background-image:-moz-linear-gradient(top,#666,#4f4f4f);background-image:-o-linear-gradient(top,#666,#4f4f4f);background-image:linear-gradient(to bottom,#666,#4f4f4f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.Gradient(startColorstr='#ff666666',endColorstr='#ff4f4f4f',GradientType=0)}\n.mp-banner-aside .hot{position:absolute;top:0;left:0}\n.mp-banner-aside .list-item{position:relative;height:82px;background:#323232;vertical-align:middle}\n.mp-banner-aside a{display:block;height:100%}\n.mp-banner-aside a:hover{background:#3d3d3d; text-decoration:none;}\n.mp-banner-aside .pic{position:absolute;top:9px;left:9px;width:76px;height:64px}\n.mp-banner-aside .txt{padding-left:95px}\n.mp-banner-aside .txt .name,.mp-banner-aside .txt .platform,.mp-banner-aside .txt .role{height:22px;line-height:22px}\n.mp-banner-aside .txt .name{padding-top:9px;color:#fff;font-size:14px}\n.mp-banner-aside .txt .platform{color:#ee7116;font-size:13px}\n.mp-banner-aside .txt .role{color:#999;font-size:13px}\n\n\n"
  },
  {
    "path": "demo/javascript-seamless-handover/slide/js/startmove.js",
    "content": "function startMove(obj, json, fnEnd) {\n\tif (obj.timer) {\n\t\tclearInterval(obj.timer);\n\t}\n\tobj.timer = setInterval(function() {\n\t\tdoMove(obj, json, fnEnd);\n\t}, 10);\n\n\tvar oDate = new Date();\n\n\tif (oDate.getTime() - obj.lastMove > 30) {\n\t\tdoMove(obj, json, fnEnd);\n\t}\n}\n\nfunction getStyle(obj, attr){\n\treturn obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj, false)[attr];\n}\n\nfunction doMove(obj, json, fnEnd) {\n\tvar iCur = 0;\n\tvar attr = '';\n\tvar bStop = true; //假设运动已经该停止了\n\tfor (attr in json) {\n\t\tiCur = attr == 'opacity' ? parseInt(100 * parseFloat(getStyle(obj, 'opacity'))) : parseInt(getStyle(obj, attr));\n\t\tif (isNaN(iCur)) {\n\t\t\tiCur = 0;\n\t\t}\n\t\tvar iSpeed = (json[attr] - iCur) / 8;\n\t\tiSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);\n\t\tif (parseInt(json[attr]) != iCur) {\n\t\t\tbStop = false;\n\t\t}\n\t\tif (attr == 'opacity') {\n\t\t\tobj.style.filter = \"alpha(opacity:\" + (iCur + iSpeed) + \")\";\n\t\t\tobj.style.opacity = (iCur + iSpeed) / 100;\n\t\t} else {\n\t\t\tobj.style[attr] = iCur + iSpeed + 'px';\n\t\t}\n\t}\n\tif (bStop) {\n\t\tclearInterval(obj.timer);\n\t\tobj.timer = null;\n\n\t\tif (fnEnd) {\n\t\t\tfnEnd();\n\t\t}\n\t}\n\n\tobj.lastMove = (new Date()).getTime();\n}"
  },
  {
    "path": "demo/js-template/demo.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>Js模板引擎</title>\n\t</head>\n\t<body>\n\t\t<div id=\"tmp\">\n\t\t\t<div>\n\t\t\t\t<h1>{title}</h1>\n\t\t\t\t<p>{content}</p>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n\t<script>\n\t\tvar tmp = document.getElementById('tmp').innerHTML;\n\t\t\n\t\t\n//\t\tvar reg = /{(\\w+)}/g;\n//\t\twhile(match = reg.exec('{ss}{dd}')) {\n//\t\t    console.log(match);\n//\t\t}\n//\t\t[\"{ss}\", \"ss\", index: 0, input: \"{ss}{dd}\"]\n//\t\t[\"{dd}\", \"dd\", index: 4, input: \"{ss}{dd}\"] \n\t\t\n\t\tfunction templateEng(template, data) {\n\t\t\tvar match,\n\t\t\tpattens = /{(\\w+)}/g,\n\t\t\treExp = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g, \n\t\t\t\n\t\t\tcode = 'console.log(arguments);' + 'var r=[];\\n', \n\t\t\tcursor = 0;\n\t\t\twhile(match = pattens.exec(template)) {\n\n\t\t\t    insertJsCode(match[1]);\n\t\t\t    cursor = match.index + match[0].length;\n\t\t\t}\n\t\t\tinsertHtml(template.substr(cursor, template.length - cursor))\n\t\t\tcode += 'return r.join(\"\");';\n\t\t\tfunction insertHtml(line) {\n\t\t\t\tcode += line != '' ? 'r.push(\"' + line.replace(/\"/g, '\\\\\"') + '\");\\n' : '';\n\t\t\t\treturn insertHtml;\n\t\t\t}\n\t\t\t\n\t\t\tfunction insertJsCode(line) {\n\t\t\t\tcode += line.match(reExp) ? line + '\\n' : 'r.push(' + line + ');\\n';\n\t\t\t\treturn insertJsCode;\n\t\t\t}\n\t\t\tconsole.log(code);\n\t\t\treturn new Function(code.replace(/[\\r\\t\\n]/g, '')).apply(data);\n\t\t}\n\t\t\n\t\tdocument.getElementById('tmp').innerHTML = templateEng(tmp, [{title:'这是标题', content : '这是内容'}])\n\t\t\n\t</script>\n</html>\n"
  },
  {
    "path": "demo/mobile/position/absolute.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, minimal-ui\" />\n  <meta content=\"yes\"name=\"apple-mobile-web-app-capable\"/>\n  <meta content=\"black\"name=\"apple-mobile-web-app-status-bar-style\"/>\n  <meta name=\"format-detection\"content=\"telphone=no\"/>\n  <title>绝对定位布局</title>\n  <link rel=\"stylesheet\" href=\"reset.css\" media=\"all\">\n  <style>\n.header,.footer,.wrap-page{\n  position:absolute;\n  left:0;\n  right:0;\n}\n.header,.footer{\n  height:44px;\n  background-color: #fff;\n  text-align: center;\n  z-index:900;\n  line-height:44px;\n}\n.header{\n  top: 0;\n  border-bottom: 1px solid #f00;\n}\n.footer{\n  bottom: 0;\n  border-top: 1px solid #f00;\n}\n.wrap-page{\n  top: 44px;\n  bottom: 44px;\n  overflow-y:auto;\n  -webkit-overflow-scrolling:touch;\n}\n.page{\n  padding: 10px;\n}\n.page p{\n  margin-bottom: 10px;\n}\n\n  </style>\n</head>\n<body>\n  <header class=\"header\">header</header>\n  \n  <div class=\"wrap-page\">\n    <div class=\"page\">\n      <p>君子曰：学不可以已。</p>\n\t\t\t\t<p>青，取之于蓝，而青于蓝；冰，水为之，而寒于水。木直中绳，輮以为轮，其曲中规。虽有槁暴（pù），不复挺者，輮使之然也。故木受绳则直，金就砺则利，君子博学而日参省乎己，则知明而行无过矣。</p>\n\t\t\t\t<p>故不登高山，不知天之高也；不临深溪，不知地之厚也；不闻先王之遗言，不知学问之大也。干、越、夷、貉之子，生而同声，长而异俗，教使之然也。诗曰：“嗟尔君子，无恒安息。靖共尔位，好是正直。神之听之，介尔景福。”神莫大于化道，福莫长于无祸。</p>\n\t\t\t\t<p>吾尝终日而思矣，不如须臾之所学也；吾尝跂而望矣，不如登高之博见也。登高而招，臂非加长也，而见者远；顺风而呼，声非加疾也，而闻者彰。假舆马者，非利足也，而致千里；假舟楫者，非能水也，而绝江河。君子生非异也，善假于物也。</p>\n\t\t\t\t<p>君子曰：学不可以已。</p>\n\t\t\t\t<p>青，取之于蓝，而青于蓝；冰，水为之，而寒于水。木直中绳，輮以为轮，其曲中规。虽有槁暴（pù），不复挺者，輮使之然也。故木受绳则直，金就砺则利，君子博学而日参省乎己，则知明而行无过矣。</p>\n\t\t\t\t<p>故不登高山，不知天之高也；不临深溪，不知地之厚也；不闻先王之遗言，不知学问之大也。干、越、夷、貉之子，生而同声，长而异俗，教使之然也。诗曰：“嗟尔君子，无恒安息。靖共尔位，好是正直。神之听之，介尔景福。”神莫大于化道，福莫长于无祸。</p>\n\t\t\t\t<p>吾尝终日而思矣，不如须臾之所学也；吾尝跂而望矣，不如登高之博见也。登高而招，臂非加长也，而见者远；顺风而呼，声非加疾也，而闻者彰。假舆马者，非利足也，而致千里；假舟楫者，非能水也，而绝江河。君子生非异也，善假于物也。</p>\n\t\t\t\t<p>君子曰：学不可以已。</p>\n\t\t\t\t<p>青，取之于蓝，而青于蓝；冰，水为之，而寒于水。木直中绳，輮以为轮，其曲中规。虽有槁暴（pù），不复挺者，輮使之然也。故木受绳则直，金就砺则利，君子博学而日参省乎己，则知明而行无过矣。</p>\n\t\t\t\t<p>故不登高山，不知天之高也；不临深溪，不知地之厚也；不闻先王之遗言，不知学问之大也。干、越、夷、貉之子，生而同声，长而异俗，教使之然也。诗曰：“嗟尔君子，无恒安息。靖共尔位，好是正直。神之听之，介尔景福。”神莫大于化道，福莫长于无祸。</p>\n\t\t\t\t<p>吾尝终日而思矣，不如须臾之所学也；吾尝跂而望矣，不如登高之博见也。登高而招，臂非加长也，而见者远；顺风而呼，声非加疾也，而闻者彰。假舆马者，非利足也，而致千里；假舟楫者，非能水也，而绝江河。君子生非异也，善假于物也。</p>\n    </div>\n  </div>\n  <footer class=\"footer\">footer</footer>\n</body>\n</html>"
  },
  {
    "path": "demo/mobile/position/flex.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=no, minimal-ui\" />\n  <meta content=\"yes\"name=\"apple-mobile-web-app-capable\"/>\n  <meta content=\"black\"name=\"apple-mobile-web-app-status-bar-style\"/>\n  <meta name=\"format-detection\"content=\"telphone=no\"/>\n  <title>绝对定位布局</title>\n  <link rel=\"stylesheet\" href=\"reset.css\" media=\"all\">\n  <style>\nbody {\n    width: 100%;\n    min-height:100%;\n    /**父元素display设置为box**/\n    display:flex;\n    flex-flow: column nowrap;   \n}\n.header,.footer{\n  min-height: 30px;\n  width: 100%;\n  background-color: #fff;\n}\n\n.wrap-page{\n  color: #000;\n  width: 100%;\n  height:100%;\n  flex-grow:1;\n  overflow:auto \n}\n\n\n  </style>\n</head>\n<body>\n  <header class=\"header\">header</header>\n  \n  <div class=\"wrap-page\">\n    <div class=\"page\">\n      <p>君子曰：学不可以已。</p>\n\t\t\t\t<p>青，取之于蓝，而青于蓝；冰，水为之，而寒于水。木直中绳，輮以为轮，其曲中规。虽有槁暴（pù），不复挺者，輮使之然也。故木受绳则直，金就砺则利，君子博学而日参省乎己，则知明而行无过矣。</p>\n\t\t\t\t<p>故不登高山，不知天之高也；不临深溪，不知地之厚也；不闻先王之遗言，不知学问之大也。干、越、夷、貉之子，生而同声，长而异俗，教使之然也。诗曰：“嗟尔君子，无恒安息。靖共尔位，好是正直。神之听之，介尔景福。”神莫大于化道，福莫长于无祸。</p>\n\t\t\t\t<p>吾尝终日而思矣，不如须臾之所学也；吾尝跂而望矣，不如登高之博见也。登高而招，臂非加长也，而见者远；顺风而呼，声非加疾也，而闻者彰。假舆马者，非利足也，而致千里；假舟楫者，非能水也，而绝江河。君子生非异也，善假于物也。</p>\n\t\t\t\t<p>君子曰：学不可以已。</p>\n\t\t\t\t<p>青，取之于蓝，而青于蓝；冰，水为之，而寒于水。木直中绳，輮以为轮，其曲中规。虽有槁暴（pù），不复挺者，輮使之然也。故木受绳则直，金就砺则利，君子博学而日参省乎己，则知明而行无过矣。</p>\n\t\t\t\t<p>故不登高山，不知天之高也；不临深溪，不知地之厚也；不闻先王之遗言，不知学问之大也。干、越、夷、貉之子，生而同声，长而异俗，教使之然也。诗曰：“嗟尔君子，无恒安息。靖共尔位，好是正直。神之听之，介尔景福。”神莫大于化道，福莫长于无祸。</p>\n\t\t\t\t<p>吾尝终日而思矣，不如须臾之所学也；吾尝跂而望矣，不如登高之博见也。登高而招，臂非加长也，而见者远；顺风而呼，声非加疾也，而闻者彰。假舆马者，非利足也，而致千里；假舟楫者，非能水也，而绝江河。君子生非异也，善假于物也。</p>\n\t\t\t\t<p>君子曰：学不可以已。</p>\n\t\t\t\t<p>青，取之于蓝，而青于蓝；冰，水为之，而寒于水。木直中绳，輮以为轮，其曲中规。虽有槁暴（pù），不复挺者，輮使之然也。故木受绳则直，金就砺则利，君子博学而日参省乎己，则知明而行无过矣。</p>\n\t\t\t\t<p>故不登高山，不知天之高也；不临深溪，不知地之厚也；不闻先王之遗言，不知学问之大也。干、越、夷、貉之子，生而同声，长而异俗，教使之然也。诗曰：“嗟尔君子，无恒安息。靖共尔位，好是正直。神之听之，介尔景福。”神莫大于化道，福莫长于无祸。</p>\n\t\t\t\t<p>吾尝终日而思矣，不如须臾之所学也；吾尝跂而望矣，不如登高之博见也。登高而招，臂非加长也，而见者远；顺风而呼，声非加疾也，而闻者彰。假舆马者，非利足也，而致千里；假舟楫者，非能水也，而绝江河。君子生非异也，善假于物也。</p>\n    </div>\n  </div>\n  <footer class=\"footer\">footer</footer>\n</body>\n</html>"
  },
  {
    "path": "demo/mobile/position/reset.css",
    "content": ".clearfix:before,.clearfix:after{content:\"\";display:table}.clearfix:after{clear:both}html,body{height:100%}html{font-family:\"Helvetica Neue\",Helvetica,STHeiTi,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size:62.5%}body{margin:0;font-size:1.4rem;line-height:1.5;color:#333;background-color:#fff}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:transparent;text-decoration:none;-webkit-tap-highlight-color:transparent;color:#08c}a:active{outline:0}a:active{color:#069}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0;vertical-align:middle}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto;white-space:pre;white-space:pre-wrap;word-wrap:break-word}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=\"button\"],input[type=\"reset\"],input[type=\"submit\"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=\"checkbox\"],input[type=\"radio\"]{box-sizing:border-box;padding:0}input[type=\"number\"]::-webkit-inner-spin-button,input[type=\"number\"]::-webkit-outer-spin-button{height:auto}input[type=\"search\"]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=\"search\"]::-webkit-search-cancel-button,input[type=\"search\"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto;resize:vertical}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html,button,input,select,textarea{font-family:\"Helvetica Neue\",Helvetica,STHeiTi,Arial,sans-serif}h1,h2,h3,h4,h5,h6,p,figure,form,blockquote{margin:0}ul,ol,li,dl,dd{margin:0;padding:0}ul,ol{list-style:none outside none}h1,h2,h3{line-height:2;font-weight:normal}h1{font-size:1.8rem}h2{font-size:1.6rem}h3{font-size:1.4rem}input::-moz-placeholder,textarea::-moz-placeholder{color:#ccc}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#ccc}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#ccc}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}\n"
  },
  {
    "path": "demo/my-show-4-angularjs/index.html",
    "content": "﻿<!DOCTYPE html>\n<html ng-app=\"project-show\">\n<head>\n  <meta charset=\"utf-8\">\n  <link href=\"http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.css\" rel=\"stylesheet\">\n  <link href=\"http://libs.baidu.com/fontawesome/4.0.3/css/font-awesome.min.css\" rel=\"stylesheet\">\n  <script src=\"js/angular-1.3.0.js\"></script>\n  <script src=\"js/angular-route.js\"></script>\n  <script src=\"index.js\"></script>\n</head>\n \n<!-- define angular controller -->\n<body ng-controller=\"mainController\">\n \n    <header>\n        <nav class=\"navbar navbar-default\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <a class=\"navbar-brand\" href=\"/\">个人介绍&项目展示</a>\n            </div>\n \n            <ul class=\"nav navbar-nav navbar-right\">\n                <li><a href=\"#\"><i class=\"fa fa-home\"></i> 个人介绍</a></li>\n                <li><a href=\"#roadsideAssistance\"><i class=\"fa fa-shield\"></i> 道路救援</a></li>\n                <li><a href=\"#westom\"><i class=\"fa fa-comment\"></i> 维斯顿智能家居</a></li>\n            </ul>\n        </div>\n        </nav>\n    </header>\n \n<div id=\"main\">\n\n    <div ng-view></div>\n\n</div>"
  },
  {
    "path": "demo/my-show-4-angularjs/index.js",
    "content": "﻿\r\n//将路由注入进来\r\nvar projectShowApp= angular.module('project-show', ['ngRoute']);\r\n \r\n//配置路由\r\nprojectShowApp.config(function($routeProvider) {\r\n    $routeProvider\r\n\t.when('/', {\r\n            templateUrl : 'pages/home.html',\r\n            controller  : 'mainController'\r\n        })\r\n        .when('/roadsideAssistance', {\r\n            templateUrl : 'pages/project.html',\r\n            controller  : 'roadsideAssistanceController'\r\n        })\r\n        .when('/westom', {\r\n            templateUrl : 'pages/project.html',\r\n            controller  : 'westomController'\r\n        });\r\n});\r\nprojectShowApp.controller('mainController', function($scope) {\r\n    $scope.message = {\r\n    \tname : '王兴龙',\r\n    \tmail :　'hacke2@qq.com',\r\n    \tother : '以下填写个人介绍'\r\n    };\r\n});\r\n \r\nprojectShowApp.controller('roadsideAssistanceController', function($scope) {\r\n    $scope.project = {\r\n    \tname : '道路救援',\r\n    \tother : '以下为其他信息'\r\n    };\r\n});\r\n \r\nprojectShowApp.controller('westomController', function($scope) {\r\n    $scope.project = {\r\n    \tname : '威士顿智能家居',\r\n    \tother : '以下为其他信息'\r\n    };\r\n});"
  },
  {
    "path": "demo/my-show-4-angularjs/js/angular-1.3.0.js",
    "content": "/**\n * @license AngularJS v1.3.0-beta.10\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, document, undefined) {'use strict';\n\n/**\n * @description\n *\n * This object provides a utility for producing rich Error messages within\n * Angular. It can be called as follows:\n *\n * var exampleMinErr = minErr('example');\n * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\n *\n * The above creates an instance of minErr in the example namespace. The\n * resulting error will have a namespaced error code of example.one.  The\n * resulting error will replace {0} with the value of foo, and {1} with the\n * value of bar. The object is not restricted in the number of arguments it can\n * take.\n *\n * If fewer arguments are specified than necessary for interpolation, the extra\n * interpolation markers will be preserved in the final string.\n *\n * Since data will be parsed statically during a build step, some restrictions\n * are applied with respect to how minErr instances are created and called.\n * Instances should have names of the form namespaceMinErr for a minErr created\n * using minErr('namespace') . Error codes, namespaces and template strings\n * should all be static strings, not variables or general expressions.\n *\n * @param {string} module The namespace to use for the new minErr instance.\n * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\n */\n\nfunction minErr(module) {\n  return function () {\n    var code = arguments[0],\n      prefix = '[' + (module ? module + ':' : '') + code + '] ',\n      template = arguments[1],\n      templateArgs = arguments,\n      stringify = function (obj) {\n        if (typeof obj === 'function') {\n          return obj.toString().replace(/ \\{[\\s\\S]*$/, '');\n        } else if (typeof obj === 'undefined') {\n          return 'undefined';\n        } else if (typeof obj !== 'string') {\n          return JSON.stringify(obj);\n        }\n        return obj;\n      },\n      message, i;\n\n    message = prefix + template.replace(/\\{\\d+\\}/g, function (match) {\n      var index = +match.slice(1, -1), arg;\n\n      if (index + 2 < templateArgs.length) {\n        arg = templateArgs[index + 2];\n        if (typeof arg === 'function') {\n          return arg.toString().replace(/ ?\\{[\\s\\S]*$/, '');\n        } else if (typeof arg === 'undefined') {\n          return 'undefined';\n        } else if (typeof arg !== 'string') {\n          return toJson(arg);\n        }\n        return arg;\n      }\n      return match;\n    });\n\n    message = message + '\\nhttp://errors.angularjs.org/1.3.0-beta.10/' +\n      (module ? module + '/' : '') + code;\n    for (i = 2; i < arguments.length; i++) {\n      message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +\n        encodeURIComponent(stringify(arguments[i]));\n    }\n\n    return new Error(message);\n  };\n}\n\n/* We need to tell jshint what variables are being exported */\n/* global\n    -angular,\n    -msie,\n    -jqLite,\n    -jQuery,\n    -slice,\n    -push,\n    -toString,\n    -ngMinErr,\n    -angularModule,\n    -nodeName_,\n    -uid,\n\n    -lowercase,\n    -uppercase,\n    -manualLowercase,\n    -manualUppercase,\n    -nodeName_,\n    -isArrayLike,\n    -forEach,\n    -sortedKeys,\n    -forEachSorted,\n    -reverseParams,\n    -nextUid,\n    -setHashKey,\n    -extend,\n    -int,\n    -inherit,\n    -noop,\n    -identity,\n    -valueFn,\n    -isUndefined,\n    -isDefined,\n    -isObject,\n    -isString,\n    -isNumber,\n    -isDate,\n    -isArray,\n    -isFunction,\n    -isRegExp,\n    -isWindow,\n    -isScope,\n    -isFile,\n    -isBlob,\n    -isBoolean,\n    -trim,\n    -isElement,\n    -makeMap,\n    -map,\n    -size,\n    -includes,\n    -indexOf,\n    -arrayRemove,\n    -isLeafNode,\n    -copy,\n    -shallowCopy,\n    -equals,\n    -csp,\n    -concat,\n    -sliceArgs,\n    -bind,\n    -toJsonReplacer,\n    -toJson,\n    -fromJson,\n    -toBoolean,\n    -startingTag,\n    -tryDecodeURIComponent,\n    -parseKeyValue,\n    -toKeyValue,\n    -encodeUriSegment,\n    -encodeUriQuery,\n    -angularInit,\n    -bootstrap,\n    -snake_case,\n    -bindJQuery,\n    -assertArg,\n    -assertArgFn,\n    -assertNotHasOwnProperty,\n    -getter,\n    -getBlockElements,\n    -hasOwnProperty,\n\n*/\n\n////////////////////////////////////\n\n/**\n * @ngdoc module\n * @name ng\n * @module ng\n * @description\n *\n * # ng (core module)\n * The ng module is loaded by default when an AngularJS application is started. The module itself\n * contains the essential components for an AngularJS application to function. The table below\n * lists a high level breakdown of each of the services/factories, filters, directives and testing\n * components available within this core module.\n *\n * <div doc-module-components=\"ng\"></div>\n */\n\n/**\n * @ngdoc function\n * @name angular.lowercase\n * @module ng\n * @function\n *\n * @description Converts the specified string to lowercase.\n * @param {string} string String to be converted to lowercase.\n * @returns {string} Lowercased string.\n */\nvar lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * @ngdoc function\n * @name angular.uppercase\n * @module ng\n * @function\n *\n * @description Converts the specified string to uppercase.\n * @param {string} string String to be converted to uppercase.\n * @returns {string} Uppercased string.\n */\nvar uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};\n\n\nvar manualLowercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})\n      : s;\n};\nvar manualUppercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})\n      : s;\n};\n\n\n// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\n// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\n// with correct but slower alternatives.\nif ('i' !== 'I'.toLowerCase()) {\n  lowercase = manualLowercase;\n  uppercase = manualUppercase;\n}\n\n\nvar /** holds major version number for IE or NaN for real browsers */\n    msie,\n    jqLite,           // delay binding since jQuery could be loaded after us.\n    jQuery,           // delay binding\n    slice             = [].slice,\n    push              = [].push,\n    toString          = Object.prototype.toString,\n    ngMinErr          = minErr('ng'),\n\n    /** @name angular */\n    angular           = window.angular || (window.angular = {}),\n    angularModule,\n    nodeName_,\n    uid               = ['0', '0', '0'];\n\n/**\n * IE 11 changed the format of the UserAgent string.\n * See http://msdn.microsoft.com/en-us/library/ms537503.aspx\n */\nmsie = int((/msie (\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);\nif (isNaN(msie)) {\n  msie = int((/trident\\/.*; rv:(\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);\n}\n\n\n/**\n * @private\n * @param {*} obj\n * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,\n *                   String ...)\n */\nfunction isArrayLike(obj) {\n  if (obj == null || isWindow(obj)) {\n    return false;\n  }\n\n  var length = obj.length;\n\n  if (obj.nodeType === 1 && length) {\n    return true;\n  }\n\n  return isString(obj) || isArray(obj) || length === 0 ||\n         typeof length === 'number' && length > 0 && (length - 1) in obj;\n}\n\n/**\n * @ngdoc function\n * @name angular.forEach\n * @module ng\n * @function\n *\n * @description\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\n * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`\n * is the value of an object property or an array element and `key` is the object property key or\n * array element index. Specifying a `context` for the function is optional.\n *\n * It is worth noting that `.forEach` does not iterate over inherited properties because it filters\n * using the `hasOwnProperty` method.\n *\n   ```js\n     var values = {name: 'misko', gender: 'male'};\n     var log = [];\n     angular.forEach(values, function(value, key) {\n       this.push(key + ': ' + value);\n     }, log);\n     expect(log).toEqual(['name: misko', 'gender: male']);\n   ```\n *\n * @param {Object|Array} obj Object to iterate over.\n * @param {Function} iterator Iterator function.\n * @param {Object=} context Object to become context (`this`) for the iterator function.\n * @returns {Object|Array} Reference to `obj`.\n */\nfunction forEach(obj, iterator, context) {\n  var key;\n  if (obj) {\n    if (isFunction(obj)) {\n      for (key in obj) {\n        // Need to check if hasOwnProperty exists,\n        // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function\n        if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {\n          iterator.call(context, obj[key], key);\n        }\n      }\n    } else if (obj.forEach && obj.forEach !== forEach) {\n      obj.forEach(iterator, context);\n    } else if (isArrayLike(obj)) {\n      for (key = 0; key < obj.length; key++)\n        iterator.call(context, obj[key], key);\n    } else {\n      for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key);\n        }\n      }\n    }\n  }\n  return obj;\n}\n\nfunction sortedKeys(obj) {\n  var keys = [];\n  for (var key in obj) {\n    if (obj.hasOwnProperty(key)) {\n      keys.push(key);\n    }\n  }\n  return keys.sort();\n}\n\nfunction forEachSorted(obj, iterator, context) {\n  var keys = sortedKeys(obj);\n  for ( var i = 0; i < keys.length; i++) {\n    iterator.call(context, obj[keys[i]], keys[i]);\n  }\n  return keys;\n}\n\n\n/**\n * when using forEach the params are value, key, but it is often useful to have key, value.\n * @param {function(string, *)} iteratorFn\n * @returns {function(*, string)}\n */\nfunction reverseParams(iteratorFn) {\n  return function(value, key) { iteratorFn(key, value); };\n}\n\n/**\n * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\n * characters such as '012ABC'. The reason why we are not using simply a number counter is that\n * the number string gets longer over time, and it can also overflow, where as the nextId\n * will grow much slower, it is a string, and it will never overflow.\n *\n * @returns {string} an unique alpha-numeric string\n */\nfunction nextUid() {\n  var index = uid.length;\n  var digit;\n\n  while(index) {\n    index--;\n    digit = uid[index].charCodeAt(0);\n    if (digit == 57 /*'9'*/) {\n      uid[index] = 'A';\n      return uid.join('');\n    }\n    if (digit == 90  /*'Z'*/) {\n      uid[index] = '0';\n    } else {\n      uid[index] = String.fromCharCode(digit + 1);\n      return uid.join('');\n    }\n  }\n  uid.unshift('0');\n  return uid.join('');\n}\n\n\n/**\n * Set or clear the hashkey for an object.\n * @param obj object\n * @param h the hashkey (!truthy to delete the hashkey)\n */\nfunction setHashKey(obj, h) {\n  if (h) {\n    obj.$$hashKey = h;\n  }\n  else {\n    delete obj.$$hashKey;\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.extend\n * @module ng\n * @function\n *\n * @description\n * Extends the destination object `dst` by copying all of the properties from the `src` object(s)\n * to `dst`. You can specify multiple `src` objects.\n *\n * @param {Object} dst Destination object.\n * @param {...Object} src Source object(s).\n * @returns {Object} Reference to `dst`.\n */\nfunction extend(dst) {\n  var h = dst.$$hashKey;\n  forEach(arguments, function(obj) {\n    if (obj !== dst) {\n      forEach(obj, function(value, key) {\n        dst[key] = value;\n      });\n    }\n  });\n\n  setHashKey(dst,h);\n  return dst;\n}\n\nfunction int(str) {\n  return parseInt(str, 10);\n}\n\n\nfunction inherit(parent, extra) {\n  return extend(new (extend(function() {}, {prototype:parent}))(), extra);\n}\n\n/**\n * @ngdoc function\n * @name angular.noop\n * @module ng\n * @function\n *\n * @description\n * A function that performs no operations. This function can be useful when writing code in the\n * functional style.\n   ```js\n     function foo(callback) {\n       var result = calculateResult();\n       (callback || angular.noop)(result);\n     }\n   ```\n */\nfunction noop() {}\nnoop.$inject = [];\n\n\n/**\n * @ngdoc function\n * @name angular.identity\n * @module ng\n * @function\n *\n * @description\n * A function that returns its first argument. This function is useful when writing code in the\n * functional style.\n *\n   ```js\n     function transformer(transformationFn, value) {\n       return (transformationFn || angular.identity)(value);\n     };\n   ```\n */\nfunction identity($) {return $;}\nidentity.$inject = [];\n\n\nfunction valueFn(value) {return function() {return value;};}\n\n/**\n * @ngdoc function\n * @name angular.isUndefined\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is undefined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is undefined.\n */\nfunction isUndefined(value){return typeof value === 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDefined\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is defined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is defined.\n */\nfunction isDefined(value){return typeof value !== 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isObject\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\n * considered to be objects. Note that JavaScript arrays are objects.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Object` but not `null`.\n */\nfunction isObject(value){return value != null && typeof value === 'object';}\n\n\n/**\n * @ngdoc function\n * @name angular.isString\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a `String`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `String`.\n */\nfunction isString(value){return typeof value === 'string';}\n\n\n/**\n * @ngdoc function\n * @name angular.isNumber\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a `Number`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Number`.\n */\nfunction isNumber(value){return typeof value === 'number';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDate\n * @module ng\n * @function\n *\n * @description\n * Determines if a value is a date.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Date`.\n */\nfunction isDate(value) {\n  return toString.call(value) === '[object Date]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isArray\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is an `Array`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Array`.\n */\nfunction isArray(value) {\n  return toString.call(value) === '[object Array]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isFunction\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a `Function`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Function`.\n */\nfunction isFunction(value){return typeof value === 'function';}\n\n\n/**\n * Determines if a value is a regular expression object.\n *\n * @private\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `RegExp`.\n */\nfunction isRegExp(value) {\n  return toString.call(value) === '[object RegExp]';\n}\n\n\n/**\n * Checks if `obj` is a window object.\n *\n * @private\n * @param {*} obj Object to check\n * @returns {boolean} True if `obj` is a window obj.\n */\nfunction isWindow(obj) {\n  return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n}\n\n\nfunction isScope(obj) {\n  return obj && obj.$evalAsync && obj.$watch;\n}\n\n\nfunction isFile(obj) {\n  return toString.call(obj) === '[object File]';\n}\n\n\nfunction isBlob(obj) {\n  return toString.call(obj) === '[object Blob]';\n}\n\n\nfunction isBoolean(value) {\n  return typeof value === 'boolean';\n}\n\n\nvar trim = (function() {\n  // native trim is way faster: http://jsperf.com/angular-trim-test\n  // but IE doesn't have it... :-(\n  // TODO: we should move this into IE/ES5 polyfill\n  if (!String.prototype.trim) {\n    return function(value) {\n      return isString(value) ? value.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '') : value;\n    };\n  }\n  return function(value) {\n    return isString(value) ? value.trim() : value;\n  };\n})();\n\n\n/**\n * @ngdoc function\n * @name angular.isElement\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a DOM element (or wrapped jQuery element).\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\n */\nfunction isElement(node) {\n  return !!(node &&\n    (node.nodeName  // we are a direct element\n    || (node.prop && node.attr && node.find)));  // we have an on and find method part of jQuery API\n}\n\n/**\n * @param str 'key1,key2,...'\n * @returns {object} in the form of {key1:true, key2:true, ...}\n */\nfunction makeMap(str) {\n  var obj = {}, items = str.split(\",\"), i;\n  for ( i = 0; i < items.length; i++ )\n    obj[ items[i] ] = true;\n  return obj;\n}\n\n\nif (msie < 9) {\n  nodeName_ = function(element) {\n    element = element.nodeName ? element : element[0];\n    return (element.scopeName && element.scopeName != 'HTML')\n      ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;\n  };\n} else {\n  nodeName_ = function(element) {\n    return element.nodeName ? element.nodeName : element[0].nodeName;\n  };\n}\n\n\nfunction map(obj, iterator, context) {\n  var results = [];\n  forEach(obj, function(value, index, list) {\n    results.push(iterator.call(context, value, index, list));\n  });\n  return results;\n}\n\n\n/**\n * @description\n * Determines the number of elements in an array, the number of properties an object has, or\n * the length of a string.\n *\n * Note: This function is used to augment the Object type in Angular expressions. See\n * {@link angular.Object} for more information about Angular arrays.\n *\n * @param {Object|Array|string} obj Object, array, or string to inspect.\n * @param {boolean} [ownPropsOnly=false] Count only \"own\" properties in an object\n * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.\n */\nfunction size(obj, ownPropsOnly) {\n  var count = 0, key;\n\n  if (isArray(obj) || isString(obj)) {\n    return obj.length;\n  } else if (isObject(obj)) {\n    for (key in obj)\n      if (!ownPropsOnly || obj.hasOwnProperty(key))\n        count++;\n  }\n\n  return count;\n}\n\n\nfunction includes(array, obj) {\n  return indexOf(array, obj) != -1;\n}\n\nfunction indexOf(array, obj) {\n  if (array.indexOf) return array.indexOf(obj);\n\n  for (var i = 0; i < array.length; i++) {\n    if (obj === array[i]) return i;\n  }\n  return -1;\n}\n\nfunction arrayRemove(array, value) {\n  var index = indexOf(array, value);\n  if (index >=0)\n    array.splice(index, 1);\n  return value;\n}\n\nfunction isLeafNode (node) {\n  if (node) {\n    switch (node.nodeName) {\n    case \"OPTION\":\n    case \"PRE\":\n    case \"TITLE\":\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * @ngdoc function\n * @name angular.copy\n * @module ng\n * @function\n *\n * @description\n * Creates a deep copy of `source`, which should be an object or an array.\n *\n * * If no destination is supplied, a copy of the object or array is created.\n * * If a destination is provided, all of its elements (for array) or properties (for objects)\n *   are deleted and then all elements/properties from the source are copied to it.\n * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.\n * * If `source` is identical to 'destination' an exception will be thrown.\n *\n * @param {*} source The source that will be used to make a copy.\n *                   Can be any type, including primitives, `null`, and `undefined`.\n * @param {(Object|Array)=} destination Destination into which the source is copied. If\n *     provided, must be of the same type as `source`.\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\n *\n * @example\n <example>\n <file name=\"index.html\">\n <div ng-controller=\"Controller\">\n <form novalidate class=\"simple-form\">\n Name: <input type=\"text\" ng-model=\"user.name\" /><br />\n E-mail: <input type=\"email\" ng-model=\"user.email\" /><br />\n Gender: <input type=\"radio\" ng-model=\"user.gender\" value=\"male\" />male\n <input type=\"radio\" ng-model=\"user.gender\" value=\"female\" />female<br />\n <button ng-click=\"reset()\">RESET</button>\n <button ng-click=\"update(user)\">SAVE</button>\n </form>\n <pre>form = {{user | json}}</pre>\n <pre>master = {{master | json}}</pre>\n </div>\n\n <script>\n function Controller($scope) {\n    $scope.master= {};\n\n    $scope.update = function(user) {\n      // Example with 1 argument\n      $scope.master= angular.copy(user);\n    };\n\n    $scope.reset = function() {\n      // Example with 2 arguments\n      angular.copy($scope.master, $scope.user);\n    };\n\n    $scope.reset();\n  }\n </script>\n </file>\n </example>\n */\nfunction copy(source, destination) {\n  if (isWindow(source) || isScope(source)) {\n    throw ngMinErr('cpws',\n      \"Can't copy! Making copies of Window or Scope instances is not supported.\");\n  }\n\n  if (!destination) {\n    destination = source;\n    if (source) {\n      if (isArray(source)) {\n        destination = copy(source, []);\n      } else if (isDate(source)) {\n        destination = new Date(source.getTime());\n      } else if (isRegExp(source)) {\n        destination = new RegExp(source.source);\n      } else if (isObject(source)) {\n        destination = copy(source, {});\n      }\n    }\n  } else {\n    if (source === destination) throw ngMinErr('cpi',\n      \"Can't copy! Source and destination are identical.\");\n    if (isArray(source)) {\n      destination.length = 0;\n      for ( var i = 0; i < source.length; i++) {\n        destination.push(copy(source[i]));\n      }\n    } else {\n      var h = destination.$$hashKey;\n      forEach(destination, function(value, key) {\n        delete destination[key];\n      });\n      for ( var key in source) {\n        destination[key] = copy(source[key]);\n      }\n      setHashKey(destination,h);\n    }\n  }\n  return destination;\n}\n\n/**\n * Create a shallow copy of an object\n */\nfunction shallowCopy(src, dst) {\n  dst = dst || {};\n\n  for(var key in src) {\n    // shallowCopy is only ever called by $compile nodeLinkFn, which has control over src\n    // so we don't need to worry about using our custom hasOwnProperty here\n    if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n      dst[key] = src[key];\n    }\n  }\n\n  return dst;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.equals\n * @module ng\n * @function\n *\n * @description\n * Determines if two objects or two values are equivalent. Supports value types, regular\n * expressions, arrays and objects.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `angular.equals`.\n * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)\n * * Both values represent the same regular expression (In JavaScript,\n *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual\n *   representation matches).\n *\n * During a property comparison, properties of `function` type and properties with names\n * that begin with `$` are ignored.\n *\n * Scope and DOMWindow objects are being compared only by identify (`===`).\n *\n * @param {*} o1 Object or value to compare.\n * @param {*} o2 Object or value to compare.\n * @returns {boolean} True if arguments are equal.\n */\nfunction equals(o1, o2) {\n  if (o1 === o2) return true;\n  if (o1 === null || o2 === null) return false;\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n  if (t1 == t2) {\n    if (t1 == 'object') {\n      if (isArray(o1)) {\n        if (!isArray(o2)) return false;\n        if ((length = o1.length) == o2.length) {\n          for(key=0; key<length; key++) {\n            if (!equals(o1[key], o2[key])) return false;\n          }\n          return true;\n        }\n      } else if (isDate(o1)) {\n        return isDate(o2) && o1.getTime() == o2.getTime();\n      } else if (isRegExp(o1) && isRegExp(o2)) {\n        return o1.toString() == o2.toString();\n      } else {\n        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;\n        keySet = {};\n        for(key in o1) {\n          if (key.charAt(0) === '$' || isFunction(o1[key])) continue;\n          if (!equals(o1[key], o2[key])) return false;\n          keySet[key] = true;\n        }\n        for(key in o2) {\n          if (!keySet.hasOwnProperty(key) &&\n              key.charAt(0) !== '$' &&\n              o2[key] !== undefined &&\n              !isFunction(o2[key])) return false;\n        }\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n\nfunction csp() {\n  return (document.securityPolicy && document.securityPolicy.isActive) ||\n      (document.querySelector &&\n      !!(document.querySelector('[ng-csp]') || document.querySelector('[data-ng-csp]')));\n}\n\n\nfunction concat(array1, array2, index) {\n  return array1.concat(slice.call(array2, index));\n}\n\nfunction sliceArgs(args, startIndex) {\n  return slice.call(args, startIndex || 0);\n}\n\n\n/* jshint -W101 */\n/**\n * @ngdoc function\n * @name angular.bind\n * @module ng\n * @function\n *\n * @description\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\n * `fn`). You can supply optional `args` that are prebound to the function. This feature is also\n * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as\n * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).\n *\n * @param {Object} self Context which `fn` should be evaluated in.\n * @param {function()} fn Function to be bound.\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\n */\n/* jshint +W101 */\nfunction bind(self, fn) {\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\n    return curryArgs.length\n      ? function() {\n          return arguments.length\n            ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))\n            : fn.apply(self, curryArgs);\n        }\n      : function() {\n          return arguments.length\n            ? fn.apply(self, arguments)\n            : fn.call(self);\n        };\n  } else {\n    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)\n    return fn;\n  }\n}\n\n\nfunction toJsonReplacer(key, value) {\n  var val = value;\n\n  if (typeof key === 'string' && key.charAt(0) === '$') {\n    val = undefined;\n  } else if (isWindow(value)) {\n    val = '$WINDOW';\n  } else if (value &&  document === value) {\n    val = '$DOCUMENT';\n  } else if (isScope(value)) {\n    val = '$SCOPE';\n  }\n\n  return val;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.toJson\n * @module ng\n * @function\n *\n * @description\n * Serializes input into a JSON-formatted string. Properties with leading $ characters will be\n * stripped since angular uses this notation internally.\n *\n * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.\n * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.\n * @returns {string|undefined} JSON-ified string representing `obj`.\n */\nfunction toJson(obj, pretty) {\n  if (typeof obj === 'undefined') return undefined;\n  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.fromJson\n * @module ng\n * @function\n *\n * @description\n * Deserializes a JSON string.\n *\n * @param {string} json JSON string to deserialize.\n * @returns {Object|Array|string|number} Deserialized thingy.\n */\nfunction fromJson(json) {\n  return isString(json)\n      ? JSON.parse(json)\n      : json;\n}\n\n\nfunction toBoolean(value) {\n  if (typeof value === 'function') {\n    value = true;\n  } else if (value && value.length !== 0) {\n    var v = lowercase(\"\" + value);\n    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');\n  } else {\n    value = false;\n  }\n  return value;\n}\n\n/**\n * @returns {string} Returns the string representation of the element.\n */\nfunction startingTag(element) {\n  element = jqLite(element).clone();\n  try {\n    // turns out IE does not let you set .html() on elements which\n    // are not allowed to have children. So we just ignore it.\n    element.empty();\n  } catch(e) {}\n  // As Per DOM Standards\n  var TEXT_NODE = 3;\n  var elemHtml = jqLite('<div>').append(element).html();\n  try {\n    return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) :\n        elemHtml.\n          match(/^(<[^>]+>)/)[1].\n          replace(/^<([\\w\\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });\n  } catch(e) {\n    return lowercase(elemHtml);\n  }\n\n}\n\n\n/////////////////////////////////////////////////\n\n/**\n * Tries to decode the URI component without throwing an exception.\n *\n * @private\n * @param str value potential URI component to check.\n * @returns {boolean} True if `value` can be decoded\n * with the decodeURIComponent function.\n */\nfunction tryDecodeURIComponent(value) {\n  try {\n    return decodeURIComponent(value);\n  } catch(e) {\n    // Ignore any invalid uri component\n  }\n}\n\n\n/**\n * Parses an escaped url query string into key-value pairs.\n * @returns {Object.<string,boolean|Array>}\n */\nfunction parseKeyValue(/**string*/keyValue) {\n  var obj = {}, key_value, key;\n  forEach((keyValue || \"\").split('&'), function(keyValue) {\n    if ( keyValue ) {\n      key_value = keyValue.split('=');\n      key = tryDecodeURIComponent(key_value[0]);\n      if ( isDefined(key) ) {\n        var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;\n        if (!obj[key]) {\n          obj[key] = val;\n        } else if(isArray(obj[key])) {\n          obj[key].push(val);\n        } else {\n          obj[key] = [obj[key],val];\n        }\n      }\n    }\n  });\n  return obj;\n}\n\nfunction toKeyValue(obj) {\n  var parts = [];\n  forEach(obj, function(value, key) {\n    if (isArray(value)) {\n      forEach(value, function(arrayValue) {\n        parts.push(encodeUriQuery(key, true) +\n                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));\n      });\n    } else {\n    parts.push(encodeUriQuery(key, true) +\n               (value === true ? '' : '=' + encodeUriQuery(value, true)));\n    }\n  });\n  return parts.length ? parts.join('&') : '';\n}\n\n\n/**\n * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\n * segments:\n *    segment       = *pchar\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriSegment(val) {\n  return encodeUriQuery(val, true).\n             replace(/%26/gi, '&').\n             replace(/%3D/gi, '=').\n             replace(/%2B/gi, '+');\n}\n\n\n/**\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\n * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\n * encoded per http://tools.ietf.org/html/rfc3986:\n *    query       = *( pchar / \"/\" / \"?\" )\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriQuery(val, pctEncodeSpaces) {\n  return encodeURIComponent(val).\n             replace(/%40/gi, '@').\n             replace(/%3A/gi, ':').\n             replace(/%24/g, '$').\n             replace(/%2C/gi, ',').\n             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\n}\n\nvar ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];\n\nfunction getNgAttribute(element, ngAttr) {\n  var attr, i, ii = ngAttrPrefixes.length, j, jj;\n  element = jqLite(element);\n  for (i=0; i<ii; ++i) {\n    attr = ngAttrPrefixes[i] + ngAttr;\n    if (isString(attr = element.attr(attr))) {\n      return attr;\n    }\n  }\n  return null;\n}\n\n/**\n * @ngdoc directive\n * @name ngApp\n * @module ng\n *\n * @element ANY\n * @param {angular.Module} ngApp an optional application\n *   {@link angular.module module} name to load.\n * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be\n *   created in \"strict-di\" mode. This means that the application will fail to invoke functions which\n *   do not use explicit function annotation (and are thus unsuitable for minification), as described\n *   in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in\n *   tracking down the root of these bugs.\n *\n * @description\n *\n * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive\n * designates the **root element** of the application and is typically placed near the root element\n * of the page - e.g. on the `<body>` or `<html>` tags.\n *\n * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`\n * found in the document will be used to define the root element to auto-bootstrap as an\n * application. To run multiple applications in an HTML document you must manually bootstrap them using\n * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.\n *\n * You can specify an **AngularJS module** to be used as the root module for the application.  This\n * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and\n * should contain the application code needed or have dependencies on other modules that will\n * contain the code. See {@link angular.module} for more information.\n *\n * In the example below if the `ngApp` directive were not placed on the `html` element then the\n * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`\n * would not be resolved to `3`.\n *\n * `ngApp` is the easiest, and most common, way to bootstrap an application.\n *\n <example module=\"ngAppDemo\">\n   <file name=\"index.html\">\n   <div ng-controller=\"ngAppDemoController\">\n     I can add: {{a}} + {{b}} =  {{ a+b }}\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {\n     $scope.a = 1;\n     $scope.b = 2;\n   });\n   </file>\n </example>\n *\n * Using `ngStrictDi`, you would see something like this:\n *\n <example ng-app-included=\"true\">\n   <file name=\"index.html\">\n   <div ng-app=\"ngAppStrictDemo\" ng-strict-di>\n       <div ng-controller=\"GoodController1\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style (see\n              script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"GoodController2\">\n           Name: <input ng-model=\"name\"><br />\n           Hello, {{name}}!\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style\n              (see script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"BadController\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>The controller could not be instantiated, due to relying\n              on automatic function annotations (which are disabled in\n              strict mode). As such, the content of this section is not\n              interpolated, and there should be an error in your web console.\n           </p>\n       </div>\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppStrictDemo', [])\n     // BadController will fail to instantiate, due to relying on automatic function annotation,\n     // rather than an explicit annotation\n     .controller('BadController', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     })\n     // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,\n     // due to using explicit annotations using the array style and $inject property, respectively.\n     .controller('GoodController1', ['$scope', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     }])\n     .controller('GoodController2', GoodController2);\n     function GoodController2($scope) {\n       $scope.name = \"World\";\n     }\n     GoodController2.$inject = ['$scope'];\n   </file>\n   <file name=\"style.css\">\n   div[ng-controller] {\n       margin-bottom: 1em;\n       -webkit-border-radius: 4px;\n       border-radius: 4px;\n       border: 1px solid;\n       padding: .5em;\n   }\n   div[ng-controller^=Good] {\n       border-color: #d6e9c6;\n       background-color: #dff0d8;\n       color: #3c763d;\n   }\n   div[ng-controller^=Bad] {\n       border-color: #ebccd1;\n       background-color: #f2dede;\n       color: #a94442;\n       margin-bottom: 0;\n   }\n   </file>\n </example>\n */\nfunction angularInit(element, bootstrap) {\n  var elements = [element],\n      appElement,\n      module,\n      config = {},\n      names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],\n      options = {\n        'boolean': ['strict-di']\n      },\n      NG_APP_CLASS_REGEXP = /\\sng[:\\-]app(:\\s*([\\w\\d_]+);?)?\\s/;\n\n  function append(element) {\n    element && elements.push(element);\n  }\n\n  forEach(names, function(name) {\n    names[name] = true;\n    append(document.getElementById(name));\n    name = name.replace(':', '\\\\:');\n    if (element.querySelectorAll) {\n      forEach(element.querySelectorAll('.' + name), append);\n      forEach(element.querySelectorAll('.' + name + '\\\\:'), append);\n      forEach(element.querySelectorAll('[' + name + ']'), append);\n    }\n  });\n\n  forEach(elements, function(element) {\n    if (!appElement) {\n      var className = ' ' + element.className + ' ';\n      var match = NG_APP_CLASS_REGEXP.exec(className);\n      if (match) {\n        appElement = element;\n        module = (match[2] || '').replace(/\\s+/g, ',');\n      } else {\n        forEach(element.attributes, function(attr) {\n          if (!appElement && names[attr.name]) {\n            appElement = element;\n            module = attr.value;\n          }\n        });\n      }\n    }\n  });\n  if (appElement) {\n    config.strictDi = getNgAttribute(appElement, \"strict-di\") !== null;\n    bootstrap(appElement, module ? [module] : [], config);\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.bootstrap\n * @module ng\n * @description\n * Use this function to manually start up angular application.\n *\n * See: {@link guide/bootstrap Bootstrap}\n *\n * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually.\n * They must use {@link ng.directive:ngApp ngApp}.\n *\n * Angular will detect if it has been loaded into the browser more than once and only allow the\n * first loaded script to be bootstrapped and will report a warning to the browser console for\n * each of the subsequent scripts.   This prevents strange results in applications, where otherwise\n * multiple instances of Angular try to work on the DOM.\n *\n * ```html\n * <!doctype html>\n * <html>\n * <body>\n * <div ng-controller=\"WelcomeController\">\n *   {{greeting}}\n * </div>\n *\n * <script src=\"angular.js\"></script>\n * <script>\n *   var app = angular.module('demo', [])\n *   .controller('WelcomeController', function($scope) {\n *       $scope.greeting = 'Welcome!';\n *   });\n *   angular.bootstrap(document, ['demo']);\n * </script>\n * </body>\n * </html>\n * ```\n *\n * @param {DOMElement} element DOM element which is the root of angular application.\n * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.\n *     Each item in the array should be the name of a predefined module or a (DI annotated)\n *     function that will be invoked by the injector as a run block.\n *     See: {@link angular.module modules}\n * @param {Object=} config an object for defining configuration options for the application. The\n *     following keys are supported:\n *\n *     - `strictDi`: disable automatic function annotation for the application. This is meant to\n *       assist in finding bugs which break minified code.\n *\n * @returns {auto.$injector} Returns the newly created injector for this app.\n */\nfunction bootstrap(element, modules, config) {\n  if (!isObject(config)) config = {};\n  var defaultConfig = {\n    strictDi: false\n  };\n  config = extend(defaultConfig, config);\n  var doBootstrap = function() {\n    element = jqLite(element);\n\n    if (element.injector()) {\n      var tag = (element[0] === document) ? 'document' : startingTag(element);\n      throw ngMinErr('btstrpd', \"App Already Bootstrapped with this Element '{0}'\", tag);\n    }\n\n    modules = modules || [];\n    modules.unshift(['$provide', function($provide) {\n      $provide.value('$rootElement', element);\n    }]);\n    modules.unshift('ng');\n    var injector = createInjector(modules, config.strictDi);\n    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animate',\n       function(scope, element, compile, injector, animate) {\n        scope.$apply(function() {\n          element.data('$injector', injector);\n          compile(element)(scope);\n        });\n      }]\n    );\n    return injector;\n  };\n\n  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;\n\n  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {\n    return doBootstrap();\n  }\n\n  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');\n  angular.resumeBootstrap = function(extraModules) {\n    forEach(extraModules, function(module) {\n      modules.push(module);\n    });\n    doBootstrap();\n  };\n}\n\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\nfunction snake_case(name, separator) {\n  separator = separator || '_';\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n    return (pos ? separator : '') + letter.toLowerCase();\n  });\n}\n\nfunction bindJQuery() {\n  var originalCleanData;\n  // bind to jQuery if present;\n  jQuery = window.jQuery;\n  // Use jQuery if it exists with proper functionality, otherwise default to us.\n  // Angular 1.2+ requires jQuery 1.7.1+ for on()/off() support.\n  if (jQuery && jQuery.fn.on) {\n    jqLite = jQuery;\n    extend(jQuery.fn, {\n      scope: JQLitePrototype.scope,\n      isolateScope: JQLitePrototype.isolateScope,\n      controller: JQLitePrototype.controller,\n      injector: JQLitePrototype.injector,\n      inheritedData: JQLitePrototype.inheritedData\n    });\n\n    originalCleanData = jQuery.cleanData;\n    // Prevent double-proxying.\n    originalCleanData = originalCleanData.$$original || originalCleanData;\n\n    // All nodes removed from the DOM via various jQuery APIs like .remove()\n    // are passed through jQuery.cleanData. Monkey-patch this method to fire\n    // the $destroy event on all removed nodes.\n    jQuery.cleanData = function(elems) {\n      for (var i = 0, elem; (elem = elems[i]) != null; i++) {\n        jQuery(elem).triggerHandler('$destroy');\n      }\n      originalCleanData(elems);\n    };\n    jQuery.cleanData.$$original = originalCleanData;\n  } else {\n    jqLite = JQLite;\n  }\n\n  angular.element = jqLite;\n}\n\n/**\n * throw error if the argument is falsy.\n */\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', \"Argument '{0}' is {1}\", (name || '?'), (reason || \"required\"));\n  }\n  return arg;\n}\n\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\n  if (acceptArrayAnnotation && isArray(arg)) {\n      arg = arg[arg.length - 1];\n  }\n\n  assertArg(isFunction(arg), name, 'not a function, got ' +\n      (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg));\n  return arg;\n}\n\n/**\n * throw error if the name given is hasOwnProperty\n * @param  {String} name    the name to test\n * @param  {String} context the context in which the name is used, such as module or directive\n */\nfunction assertNotHasOwnProperty(name, context) {\n  if (name === 'hasOwnProperty') {\n    throw ngMinErr('badname', \"hasOwnProperty is not a valid {0} name\", context);\n  }\n}\n\n/**\n * Return the value accessible from the object by path. Any undefined traversals are ignored\n * @param {Object} obj starting object\n * @param {String} path path to traverse\n * @param {boolean} [bindFnToScope=true]\n * @returns {Object} value as accessible by path\n */\n//TODO(misko): this function needs to be removed\nfunction getter(obj, path, bindFnToScope) {\n  if (!path) return obj;\n  var keys = path.split('.');\n  var key;\n  var lastInstance = obj;\n  var len = keys.length;\n\n  for (var i = 0; i < len; i++) {\n    key = keys[i];\n    if (obj) {\n      obj = (lastInstance = obj)[key];\n    }\n  }\n  if (!bindFnToScope && isFunction(obj)) {\n    return bind(lastInstance, obj);\n  }\n  return obj;\n}\n\n/**\n * Return the DOM siblings between the first and last node in the given array.\n * @param {Array} array like object\n * @returns {DOMElement} object containing the elements\n */\nfunction getBlockElements(nodes) {\n  var startNode = nodes[0],\n      endNode = nodes[nodes.length - 1];\n  if (startNode === endNode) {\n    return jqLite(startNode);\n  }\n\n  var element = startNode;\n  var elements = [element];\n\n  do {\n    element = element.nextSibling;\n    if (!element) break;\n    elements.push(element);\n  } while (element !== endNode);\n\n  return jqLite(elements);\n}\n\n/**\n * @ngdoc type\n * @name angular.Module\n * @module ng\n * @description\n *\n * Interface for configuring angular {@link angular.module modules}.\n */\n\nfunction setupModuleLoader(window) {\n\n  var $injectorMinErr = minErr('$injector');\n  var ngMinErr = minErr('ng');\n\n  function ensure(obj, name, factory) {\n    return obj[name] || (obj[name] = factory());\n  }\n\n  var angular = ensure(window, 'angular', Object);\n\n  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\n  angular.$$minErr = angular.$$minErr || minErr;\n\n  return ensure(angular, 'module', function() {\n    /** @type {Object.<string, angular.Module>} */\n    var modules = {};\n\n    /**\n     * @ngdoc function\n     * @name angular.module\n     * @module ng\n     * @description\n     *\n     * The `angular.module` is a global place for creating, registering and retrieving Angular\n     * modules.\n     * All modules (angular core or 3rd party) that should be available to an application must be\n     * registered using this mechanism.\n     *\n     * When passed two or more arguments, a new module is created.  If passed only one argument, an\n     * existing module (the name passed as the first argument to `module`) is retrieved.\n     *\n     *\n     * # Module\n     *\n     * A module is a collection of services, directives, filters, and configuration information.\n     * `angular.module` is used to configure the {@link auto.$injector $injector}.\n     *\n     * ```js\n     * // Create a new module\n     * var myModule = angular.module('myModule', []);\n     *\n     * // register a new service\n     * myModule.value('appName', 'MyCoolApp');\n     *\n     * // configure existing services inside initialization blocks.\n     * myModule.config(['$locationProvider', function($locationProvider) {\n     *   // Configure existing providers\n     *   $locationProvider.hashPrefix('!');\n     * }]);\n     * ```\n     *\n     * Then you can create an injector and load your modules like this:\n     *\n     * ```js\n     * var injector = angular.injector(['ng', 'myModule'])\n     * ```\n     *\n     * However it's more likely that you'll just use\n     * {@link ng.directive:ngApp ngApp} or\n     * {@link angular.bootstrap} to simplify this process for you.\n     *\n     * @param {!string} name The name of the module to create or retrieve.\n     * @param {!Array.<string>=} requires If specified then new module is being created. If\n     *        unspecified then the module is being retrieved for further configuration.\n     * @param {Function=} configFn Optional configuration function for the module. Same as\n     *        {@link angular.Module#config Module#config()}.\n     * @returns {module} new module with the {@link angular.Module} api.\n     */\n    return function module(name, requires, configFn) {\n      var assertNotHasOwnProperty = function(name, context) {\n        if (name === 'hasOwnProperty') {\n          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n        }\n      };\n\n      assertNotHasOwnProperty(name, 'module');\n      if (requires && modules.hasOwnProperty(name)) {\n        modules[name] = null;\n      }\n      return ensure(modules, name, function() {\n        if (!requires) {\n          throw $injectorMinErr('nomod', \"Module '{0}' is not available! You either misspelled \" +\n             \"the module name or forgot to load it. If registering a module ensure that you \" +\n             \"specify the dependencies as the second argument.\", name);\n        }\n\n        /** @type {!Array.<Array.<*>>} */\n        var invokeQueue = [];\n\n        /** @type {!Array.<Function>} */\n        var configBlocks = [];\n\n        /** @type {!Array.<Function>} */\n        var runBlocks = [];\n\n        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);\n\n        /** @type {angular.Module} */\n        var moduleInstance = {\n          // Private state\n          _invokeQueue: invokeQueue,\n          _configBlocks: configBlocks,\n          _runBlocks: runBlocks,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#requires\n           * @module ng\n           * @returns {Array.<string>} List of module names which must be loaded before this module.\n           * @description\n           * Holds the list of modules which the injector will load before the current module is\n           * loaded.\n           */\n          requires: requires,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#name\n           * @module ng\n           * @returns {string} Name of the module.\n           * @description\n           */\n          name: name,\n\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#provider\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerType Construction function for creating new instance of the\n           *                                service.\n           * @description\n           * See {@link auto.$provide#provider $provide.provider()}.\n           */\n          provider: invokeLater('$provide', 'provider'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#factory\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerFunction Function for creating new instance of the service.\n           * @description\n           * See {@link auto.$provide#factory $provide.factory()}.\n           */\n          factory: invokeLater('$provide', 'factory'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#service\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} constructor A constructor function that will be instantiated.\n           * @description\n           * See {@link auto.$provide#service $provide.service()}.\n           */\n          service: invokeLater('$provide', 'service'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#value\n           * @module ng\n           * @param {string} name service name\n           * @param {*} object Service instance object.\n           * @description\n           * See {@link auto.$provide#value $provide.value()}.\n           */\n          value: invokeLater('$provide', 'value'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#constant\n           * @module ng\n           * @param {string} name constant name\n           * @param {*} object Constant value.\n           * @description\n           * Because the constant are fixed, they get applied before other provide methods.\n           * See {@link auto.$provide#constant $provide.constant()}.\n           */\n          constant: invokeLater('$provide', 'constant', 'unshift'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#animation\n           * @module ng\n           * @param {string} name animation name\n           * @param {Function} animationFactory Factory function for creating new instance of an\n           *                                    animation.\n           * @description\n           *\n           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\n           *\n           *\n           * Defines an animation hook that can be later used with\n           * {@link ngAnimate.$animate $animate} service and directives that use this service.\n           *\n           * ```js\n           * module.animation('.animation-name', function($inject1, $inject2) {\n           *   return {\n           *     eventName : function(element, done) {\n           *       //code to run the animation\n           *       //once complete, then run done()\n           *       return function cancellationFunction(element) {\n           *         //code to cancel the animation\n           *       }\n           *     }\n           *   }\n           * })\n           * ```\n           *\n           * See {@link ngAnimate.$animateProvider#register $animateProvider.register()} and\n           * {@link ngAnimate ngAnimate module} for more information.\n           */\n          animation: invokeLater('$animateProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#filter\n           * @module ng\n           * @param {string} name Filter name.\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\n           * @description\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\n           */\n          filter: invokeLater('$filterProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#controller\n           * @module ng\n           * @param {string|Object} name Controller name, or an object map of controllers where the\n           *    keys are the names and the values are the constructors.\n           * @param {Function} constructor Controller constructor function.\n           * @description\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\n           */\n          controller: invokeLater('$controllerProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#directive\n           * @module ng\n           * @param {string|Object} name Directive name, or an object map of directives where the\n           *    keys are the names and the values are the factories.\n           * @param {Function} directiveFactory Factory function for creating new instance of\n           * directives.\n           * @description\n           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\n           */\n          directive: invokeLater('$compileProvider', 'directive'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#config\n           * @module ng\n           * @param {Function} configFn Execute this function on module load. Useful for service\n           *    configuration.\n           * @description\n           * Use this method to register work which needs to be performed on module loading.\n           * For more about how to configure services, see\n           * {@link providers#providers_provider-recipe Provider Recipe}.\n           */\n          config: config,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#run\n           * @module ng\n           * @param {Function} initializationFn Execute this function after injector creation.\n           *    Useful for application initialization.\n           * @description\n           * Use this method to register work which should be performed when the injector is done\n           * loading all modules.\n           */\n          run: function(block) {\n            runBlocks.push(block);\n            return this;\n          }\n        };\n\n        if (configFn) {\n          config(configFn);\n        }\n\n        return  moduleInstance;\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @param {String=} insertMethod\n         * @returns {angular.Module}\n         */\n        function invokeLater(provider, method, insertMethod, queue) {\n          if (!queue) queue = invokeQueue;\n          return function() {\n            queue[insertMethod || 'push']([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n      });\n    };\n  });\n\n}\n\n/* global\n    angularModule: true,\n    version: true,\n\n    $LocaleProvider,\n    $CompileProvider,\n\n    htmlAnchorDirective,\n    inputDirective,\n    inputDirective,\n    formDirective,\n    scriptDirective,\n    selectDirective,\n    styleDirective,\n    optionDirective,\n    ngBindDirective,\n    ngBindHtmlDirective,\n    ngBindTemplateDirective,\n    ngClassDirective,\n    ngClassEvenDirective,\n    ngClassOddDirective,\n    ngCspDirective,\n    ngCloakDirective,\n    ngControllerDirective,\n    ngFormDirective,\n    ngHideDirective,\n    ngIfDirective,\n    ngIncludeDirective,\n    ngIncludeFillContentDirective,\n    ngInitDirective,\n    ngNonBindableDirective,\n    ngPluralizeDirective,\n    ngRepeatDirective,\n    ngShowDirective,\n    ngStyleDirective,\n    ngSwitchDirective,\n    ngSwitchWhenDirective,\n    ngSwitchDefaultDirective,\n    ngOptionsDirective,\n    ngTranscludeDirective,\n    ngModelDirective,\n    ngListDirective,\n    ngChangeDirective,\n    requiredDirective,\n    requiredDirective,\n    ngValueDirective,\n    ngModelOptionsDirective,\n    ngAttributeAliasDirectives,\n    ngEventDirectives,\n\n    $AnchorScrollProvider,\n    $AnimateProvider,\n    $BrowserProvider,\n    $CacheFactoryProvider,\n    $ControllerProvider,\n    $DocumentProvider,\n    $ExceptionHandlerProvider,\n    $FilterProvider,\n    $InterpolateProvider,\n    $IntervalProvider,\n    $HttpProvider,\n    $HttpBackendProvider,\n    $LocationProvider,\n    $LogProvider,\n    $ParseProvider,\n    $RootScopeProvider,\n    $QProvider,\n    $$SanitizeUriProvider,\n    $SceProvider,\n    $SceDelegateProvider,\n    $SnifferProvider,\n    $TemplateCacheProvider,\n    $TimeoutProvider,\n    $$RAFProvider,\n    $$AsyncCallbackProvider,\n    $WindowProvider\n*/\n\n\n/**\n * @ngdoc object\n * @name angular.version\n * @module ng\n * @description\n * An object that contains information about the current AngularJS version. This object has the\n * following properties:\n *\n * - `full` – `{string}` – Full version string, such as \"0.9.18\".\n * - `major` – `{number}` – Major version number, such as \"0\".\n * - `minor` – `{number}` – Minor version number, such as \"9\".\n * - `dot` – `{number}` – Dot version number, such as \"18\".\n * - `codeName` – `{string}` – Code name of the release, such as \"jiggling-armfat\".\n */\nvar version = {\n  full: '1.3.0-beta.10',    // all of these placeholder strings will be replaced by grunt's\n  major: 1,    // package task\n  minor: 3,\n  dot: 0,\n  codeName: 'excessive-clarification'\n};\n\n\nfunction publishExternalAPI(angular){\n  extend(angular, {\n    'bootstrap': bootstrap,\n    'copy': copy,\n    'extend': extend,\n    'equals': equals,\n    'element': jqLite,\n    'forEach': forEach,\n    'injector': createInjector,\n    'noop':noop,\n    'bind':bind,\n    'toJson': toJson,\n    'fromJson': fromJson,\n    'identity':identity,\n    'isUndefined': isUndefined,\n    'isDefined': isDefined,\n    'isString': isString,\n    'isFunction': isFunction,\n    'isObject': isObject,\n    'isNumber': isNumber,\n    'isElement': isElement,\n    'isArray': isArray,\n    'version': version,\n    'isDate': isDate,\n    'lowercase': lowercase,\n    'uppercase': uppercase,\n    'callbacks': {counter: 0},\n    '$$minErr': minErr,\n    '$$csp': csp\n  });\n\n  angularModule = setupModuleLoader(window);\n  try {\n    angularModule('ngLocale');\n  } catch (e) {\n    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);\n  }\n\n  angularModule('ng', ['ngLocale'], ['$provide',\n    function ngModule($provide) {\n      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.\n      $provide.provider({\n        $$sanitizeUri: $$SanitizeUriProvider\n      });\n      $provide.provider('$compile', $CompileProvider).\n        directive({\n            a: htmlAnchorDirective,\n            input: inputDirective,\n            textarea: inputDirective,\n            form: formDirective,\n            script: scriptDirective,\n            select: selectDirective,\n            style: styleDirective,\n            option: optionDirective,\n            ngBind: ngBindDirective,\n            ngBindHtml: ngBindHtmlDirective,\n            ngBindTemplate: ngBindTemplateDirective,\n            ngClass: ngClassDirective,\n            ngClassEven: ngClassEvenDirective,\n            ngClassOdd: ngClassOddDirective,\n            ngCloak: ngCloakDirective,\n            ngController: ngControllerDirective,\n            ngForm: ngFormDirective,\n            ngHide: ngHideDirective,\n            ngIf: ngIfDirective,\n            ngInclude: ngIncludeDirective,\n            ngInit: ngInitDirective,\n            ngNonBindable: ngNonBindableDirective,\n            ngPluralize: ngPluralizeDirective,\n            ngRepeat: ngRepeatDirective,\n            ngShow: ngShowDirective,\n            ngStyle: ngStyleDirective,\n            ngSwitch: ngSwitchDirective,\n            ngSwitchWhen: ngSwitchWhenDirective,\n            ngSwitchDefault: ngSwitchDefaultDirective,\n            ngOptions: ngOptionsDirective,\n            ngTransclude: ngTranscludeDirective,\n            ngModel: ngModelDirective,\n            ngList: ngListDirective,\n            ngChange: ngChangeDirective,\n            required: requiredDirective,\n            ngRequired: requiredDirective,\n            ngValue: ngValueDirective,\n            ngModelOptions: ngModelOptionsDirective\n        }).\n        directive({\n          ngInclude: ngIncludeFillContentDirective\n        }).\n        directive(ngAttributeAliasDirectives).\n        directive(ngEventDirectives);\n      $provide.provider({\n        $anchorScroll: $AnchorScrollProvider,\n        $animate: $AnimateProvider,\n        $browser: $BrowserProvider,\n        $cacheFactory: $CacheFactoryProvider,\n        $controller: $ControllerProvider,\n        $document: $DocumentProvider,\n        $exceptionHandler: $ExceptionHandlerProvider,\n        $filter: $FilterProvider,\n        $interpolate: $InterpolateProvider,\n        $interval: $IntervalProvider,\n        $http: $HttpProvider,\n        $httpBackend: $HttpBackendProvider,\n        $location: $LocationProvider,\n        $log: $LogProvider,\n        $parse: $ParseProvider,\n        $rootScope: $RootScopeProvider,\n        $q: $QProvider,\n        $sce: $SceProvider,\n        $sceDelegate: $SceDelegateProvider,\n        $sniffer: $SnifferProvider,\n        $templateCache: $TemplateCacheProvider,\n        $timeout: $TimeoutProvider,\n        $window: $WindowProvider,\n        $$rAF: $$RAFProvider,\n        $$asyncCallback : $$AsyncCallbackProvider\n      });\n    }\n  ]);\n}\n\n/* global\n\n  -JQLitePrototype,\n  -addEventListenerFn,\n  -removeEventListenerFn,\n  -BOOLEAN_ATTR\n*/\n\n//////////////////////////////////\n//JQLite\n//////////////////////////////////\n\n/**\n * @ngdoc function\n * @name angular.element\n * @module ng\n * @function\n *\n * @description\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\n *\n * If jQuery is available, `angular.element` is an alias for the\n * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`\n * delegates to Angular's built-in subset of jQuery, called \"jQuery lite\" or \"jqLite.\"\n *\n * <div class=\"alert alert-success\">jqLite is a tiny, API-compatible subset of jQuery that allows\n * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most\n * commonly needed functionality with the goal of having a very small footprint.</div>\n *\n * To use jQuery, simply load it before `DOMContentLoaded` event fired.\n *\n * <div class=\"alert\">**Note:** all element references in Angular are always wrapped with jQuery or\n * jqLite; they are never raw DOM references.</div>\n *\n * ## Angular's jqLite\n * jqLite provides only the following jQuery methods:\n *\n * - [`addClass()`](http://api.jquery.com/addClass/)\n * - [`after()`](http://api.jquery.com/after/)\n * - [`append()`](http://api.jquery.com/append/)\n * - [`attr()`](http://api.jquery.com/attr/)\n * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData\n * - [`children()`](http://api.jquery.com/children/) - Does not support selectors\n * - [`clone()`](http://api.jquery.com/clone/)\n * - [`contents()`](http://api.jquery.com/contents/)\n * - [`css()`](http://api.jquery.com/css/)\n * - [`data()`](http://api.jquery.com/data/)\n * - [`empty()`](http://api.jquery.com/empty/)\n * - [`eq()`](http://api.jquery.com/eq/)\n * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name\n * - [`hasClass()`](http://api.jquery.com/hasClass/)\n * - [`html()`](http://api.jquery.com/html/)\n * - [`next()`](http://api.jquery.com/next/) - Does not support selectors\n * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData\n * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors\n * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors\n * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors\n * - [`prepend()`](http://api.jquery.com/prepend/)\n * - [`prop()`](http://api.jquery.com/prop/)\n * - [`ready()`](http://api.jquery.com/ready/)\n * - [`remove()`](http://api.jquery.com/remove/)\n * - [`removeAttr()`](http://api.jquery.com/removeAttr/)\n * - [`removeClass()`](http://api.jquery.com/removeClass/)\n * - [`removeData()`](http://api.jquery.com/removeData/)\n * - [`replaceWith()`](http://api.jquery.com/replaceWith/)\n * - [`text()`](http://api.jquery.com/text/)\n * - [`toggleClass()`](http://api.jquery.com/toggleClass/)\n * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.\n * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces\n * - [`val()`](http://api.jquery.com/val/)\n * - [`wrap()`](http://api.jquery.com/wrap/)\n *\n * ## jQuery/jqLite Extras\n * Angular also provides the following additional methods and events to both jQuery and jqLite:\n *\n * ### Events\n * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event\n *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM\n *    element before it is removed.\n *\n * ### Methods\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\n *   `'ngModel'`).\n * - `injector()` - retrieves the injector of the current element or its parent.\n * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current\n *   element or its parent.\n * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the\n *   current element. This getter should be used only on elements that contain a directive which starts a new isolate\n *   scope. Calling `scope()` on this element always returns the original non-isolate scope.\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\n *   parent element is reached.\n *\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\n * @returns {Object} jQuery object.\n */\n\nvar jqCache = JQLite.cache = {},\n    jqName = JQLite.expando = 'ng-' + new Date().getTime(),\n    jqId = 1,\n    addEventListenerFn = (window.document.addEventListener\n      ? function(element, type, fn) {element.addEventListener(type, fn, false);}\n      : function(element, type, fn) {element.attachEvent('on' + type, fn);}),\n    removeEventListenerFn = (window.document.removeEventListener\n      ? function(element, type, fn) {element.removeEventListener(type, fn, false); }\n      : function(element, type, fn) {element.detachEvent('on' + type, fn); });\n\n/*\n * !!! This is an undocumented \"private\" function !!!\n */\nvar jqData = JQLite._data = function(node) {\n  //jQuery always returns an object on cache miss\n  return this.cache[node[this.expando]] || {};\n};\n\nfunction jqNextId() { return ++jqId; }\n\n\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\nvar jqLiteMinErr = minErr('jqLite');\n\n/**\n * Converts snake_case to camelCase.\n * Also there is special case for Moz prefix starting with upper case letter.\n * @param name Name to normalize\n */\nfunction camelCase(name) {\n  return name.\n    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n      return offset ? letter.toUpperCase() : letter;\n    }).\n    replace(MOZ_HACK_REGEXP, 'Moz$1');\n}\n\nvar SINGLE_TAG_REGEXP = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/;\nvar HTML_REGEXP = /<|&#?\\w+;/;\nvar TAG_NAME_REGEXP = /<([\\w:]+)/;\nvar XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi;\n\nvar wrapMap = {\n  'option': [1, '<select multiple=\"multiple\">', '</select>'],\n\n  'thead': [1, '<table>', '</table>'],\n  'col': [2, '<table><colgroup>', '</colgroup></table>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n  'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],\n  '_default': [0, \"\", \"\"]\n};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\nfunction jqLiteIsTextNode(html) {\n  return !HTML_REGEXP.test(html);\n}\n\nfunction jqLiteBuildFragment(html, context) {\n  var elem, tmp, tag, wrap,\n      fragment = context.createDocumentFragment(),\n      nodes = [], i;\n\n  if (jqLiteIsTextNode(html)) {\n    // Convert non-html into a text node\n    nodes.push(context.createTextNode(html));\n  } else {\n    // Convert html into DOM nodes\n    tmp = tmp || fragment.appendChild(context.createElement(\"div\"));\n    tag = (TAG_NAME_REGEXP.exec(html) || [\"\", \"\"])[1].toLowerCase();\n    wrap = wrapMap[tag] || wrapMap._default;\n    tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, \"<$1></$2>\") + wrap[2];\n\n    // Descend through wrappers to the right content\n    i = wrap[0];\n    while (i--) {\n      tmp = tmp.lastChild;\n    }\n\n    nodes = concat(nodes, tmp.childNodes);\n\n    tmp = fragment.firstChild;\n    tmp.textContent = \"\";\n  }\n\n  // Remove wrapper from fragment\n  fragment.textContent = \"\";\n  fragment.innerHTML = \"\"; // Clear inner HTML\n  forEach(nodes, function(node) {\n    fragment.appendChild(node);\n  });\n\n  return fragment;\n}\n\nfunction jqLiteParseHTML(html, context) {\n  context = context || document;\n  var parsed;\n\n  if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {\n    return [context.createElement(parsed[1])];\n  }\n\n  if ((parsed = jqLiteBuildFragment(html, context))) {\n    return parsed.childNodes;\n  }\n\n  return [];\n}\n\n/////////////////////////////////////////////\nfunction JQLite(element) {\n  if (element instanceof JQLite) {\n    return element;\n  }\n  if (isString(element)) {\n    element = trim(element);\n  }\n  if (!(this instanceof JQLite)) {\n    if (isString(element) && element.charAt(0) != '<') {\n      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');\n    }\n    return new JQLite(element);\n  }\n\n  if (isString(element)) {\n    jqLiteAddNodes(this, jqLiteParseHTML(element));\n  } else {\n    jqLiteAddNodes(this, element);\n  }\n}\n\nfunction jqLiteClone(element) {\n  return element.cloneNode(true);\n}\n\nfunction jqLiteDealoc(element){\n  jqLiteRemoveData(element);\n  for ( var i = 0, children = element.childNodes || []; i < children.length; i++) {\n    jqLiteDealoc(children[i]);\n  }\n}\n\nfunction jqLiteOff(element, type, fn, unsupported) {\n  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');\n\n  var events = jqLiteExpandoStore(element, 'events'),\n      handle = jqLiteExpandoStore(element, 'handle');\n\n  if (!handle) return; //no listeners registered\n\n  if (isUndefined(type)) {\n    forEach(events, function(eventHandler, type) {\n      removeEventListenerFn(element, type, eventHandler);\n      delete events[type];\n    });\n  } else {\n    forEach(type.split(' '), function(type) {\n      if (isUndefined(fn)) {\n        removeEventListenerFn(element, type, events[type]);\n        delete events[type];\n      } else {\n        arrayRemove(events[type] || [], fn);\n      }\n    });\n  }\n}\n\nfunction jqLiteRemoveData(element, name) {\n  var expandoId = element[jqName],\n      expandoStore = jqCache[expandoId];\n\n  if (expandoStore) {\n    if (name) {\n      delete jqCache[expandoId].data[name];\n      return;\n    }\n\n    if (expandoStore.handle) {\n      expandoStore.events.$destroy && expandoStore.handle({}, '$destroy');\n      jqLiteOff(element);\n    }\n    delete jqCache[expandoId];\n    element[jqName] = undefined; // ie does not allow deletion of attributes on elements.\n  }\n}\n\nfunction jqLiteExpandoStore(element, key, value) {\n  var expandoId = element[jqName],\n      expandoStore = jqCache[expandoId || -1];\n\n  if (isDefined(value)) {\n    if (!expandoStore) {\n      element[jqName] = expandoId = jqNextId();\n      expandoStore = jqCache[expandoId] = {};\n    }\n    expandoStore[key] = value;\n  } else {\n    return expandoStore && expandoStore[key];\n  }\n}\n\nfunction jqLiteData(element, key, value) {\n  var data = jqLiteExpandoStore(element, 'data'),\n      isSetter = isDefined(value),\n      keyDefined = !isSetter && isDefined(key),\n      isSimpleGetter = keyDefined && !isObject(key);\n\n  if (!data && !isSimpleGetter) {\n    jqLiteExpandoStore(element, 'data', data = {});\n  }\n\n  if (isSetter) {\n    data[key] = value;\n  } else {\n    if (keyDefined) {\n      if (isSimpleGetter) {\n        // don't create data in this case.\n        return data && data[key];\n      } else {\n        extend(data, key);\n      }\n    } else {\n      return data;\n    }\n  }\n}\n\nfunction jqLiteHasClass(element, selector) {\n  if (!element.getAttribute) return false;\n  return ((\" \" + (element.getAttribute('class') || '') + \" \").replace(/[\\n\\t]/g, \" \").\n      indexOf( \" \" + selector + \" \" ) > -1);\n}\n\nfunction jqLiteRemoveClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    forEach(cssClasses.split(' '), function(cssClass) {\n      element.setAttribute('class', trim(\n          (\" \" + (element.getAttribute('class') || '') + \" \")\n          .replace(/[\\n\\t]/g, \" \")\n          .replace(\" \" + trim(cssClass) + \" \", \" \"))\n      );\n    });\n  }\n}\n\nfunction jqLiteAddClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\n                            .replace(/[\\n\\t]/g, \" \");\n\n    forEach(cssClasses.split(' '), function(cssClass) {\n      cssClass = trim(cssClass);\n      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {\n        existingClasses += cssClass + ' ';\n      }\n    });\n\n    element.setAttribute('class', trim(existingClasses));\n  }\n}\n\nfunction jqLiteAddNodes(root, elements) {\n  if (elements) {\n    elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))\n      ? elements\n      : [ elements ];\n    for(var i=0; i < elements.length; i++) {\n      root.push(elements[i]);\n    }\n  }\n}\n\nfunction jqLiteController(element, name) {\n  return jqLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');\n}\n\nfunction jqLiteInheritedData(element, name, value) {\n  element = jqLite(element);\n\n  // if element is the document object work with the html element instead\n  // this makes $(document).scope() possible\n  if(element[0].nodeType == 9) {\n    element = element.find('html');\n  }\n  var names = isArray(name) ? name : [name];\n\n  while (element.length) {\n    var node = element[0];\n    for (var i = 0, ii = names.length; i < ii; i++) {\n      if ((value = element.data(names[i])) !== undefined) return value;\n    }\n\n    // If dealing with a document fragment node with a host element, and no parent, use the host\n    // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM\n    // to lookup parent controllers.\n    element = jqLite(node.parentNode || (node.nodeType === 11 && node.host));\n  }\n}\n\nfunction jqLiteEmpty(element) {\n  for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\n    jqLiteDealoc(childNodes[i]);\n  }\n  while (element.firstChild) {\n    element.removeChild(element.firstChild);\n  }\n}\n\n//////////////////////////////////////////\n// Functions which are declared directly.\n//////////////////////////////////////////\nvar JQLitePrototype = JQLite.prototype = {\n  ready: function(fn) {\n    var fired = false;\n\n    function trigger() {\n      if (fired) return;\n      fired = true;\n      fn();\n    }\n\n    // check if document already is loaded\n    if (document.readyState === 'complete'){\n      setTimeout(trigger);\n    } else {\n      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9\n      // we can not use jqLite since we are not done loading and jQuery could be loaded later.\n      // jshint -W064\n      JQLite(window).on('load', trigger); // fallback to window.onload for others\n      // jshint +W064\n    }\n  },\n  toString: function() {\n    var value = [];\n    forEach(this, function(e){ value.push('' + e);});\n    return '[' + value.join(', ') + ']';\n  },\n\n  eq: function(index) {\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\n  },\n\n  length: 0,\n  push: push,\n  sort: [].sort,\n  splice: [].splice\n};\n\n//////////////////////////////////////////\n// Functions iterating getter/setters.\n// these functions return self on setter and\n// value on get.\n//////////////////////////////////////////\nvar BOOLEAN_ATTR = {};\nforEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {\n  BOOLEAN_ATTR[lowercase(value)] = value;\n});\nvar BOOLEAN_ELEMENTS = {};\nforEach('input,select,option,textarea,button,form,details'.split(','), function(value) {\n  BOOLEAN_ELEMENTS[uppercase(value)] = true;\n});\n\nfunction getBooleanAttrName(element, name) {\n  // check dom last since we will most likely fail on name\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\n\n  // booleanAttr is here twice to minimize DOM access\n  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;\n}\n\nforEach({\n  data: jqLiteData,\n  inheritedData: jqLiteInheritedData,\n\n  scope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);\n  },\n\n  isolateScope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');\n  },\n\n  controller: jqLiteController,\n\n  injector: function(element) {\n    return jqLiteInheritedData(element, '$injector');\n  },\n\n  removeAttr: function(element,name) {\n    element.removeAttribute(name);\n  },\n\n  hasClass: jqLiteHasClass,\n\n  css: function(element, name, value) {\n    name = camelCase(name);\n\n    if (isDefined(value)) {\n      element.style[name] = value;\n    } else {\n      var val;\n\n      if (msie <= 8) {\n        // this is some IE specific weirdness that jQuery 1.6.4 does not sure why\n        val = element.currentStyle && element.currentStyle[name];\n        if (val === '') val = 'auto';\n      }\n\n      val = val || element.style[name];\n\n      if (msie <= 8) {\n        // jquery weirdness :-/\n        val = (val === '') ? undefined : val;\n      }\n\n      return  val;\n    }\n  },\n\n  attr: function(element, name, value){\n    var lowercasedName = lowercase(name);\n    if (BOOLEAN_ATTR[lowercasedName]) {\n      if (isDefined(value)) {\n        if (!!value) {\n          element[name] = true;\n          element.setAttribute(name, lowercasedName);\n        } else {\n          element[name] = false;\n          element.removeAttribute(lowercasedName);\n        }\n      } else {\n        return (element[name] ||\n                 (element.attributes.getNamedItem(name)|| noop).specified)\n               ? lowercasedName\n               : undefined;\n      }\n    } else if (isDefined(value)) {\n      element.setAttribute(name, value);\n    } else if (element.getAttribute) {\n      // the extra argument \"2\" is to get the right thing for a.href in IE, see jQuery code\n      // some elements (e.g. Document) don't have get attribute, so return undefined\n      var ret = element.getAttribute(name, 2);\n      // normalize non-existing attributes to undefined (as jQuery)\n      return ret === null ? undefined : ret;\n    }\n  },\n\n  prop: function(element, name, value) {\n    if (isDefined(value)) {\n      element[name] = value;\n    } else {\n      return element[name];\n    }\n  },\n\n  text: (function() {\n    var NODE_TYPE_TEXT_PROPERTY = [];\n    if (msie < 9) {\n      NODE_TYPE_TEXT_PROPERTY[1] = 'innerText';    /** Element **/\n      NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue';    /** Text **/\n    } else {\n      NODE_TYPE_TEXT_PROPERTY[1] =                 /** Element **/\n      NODE_TYPE_TEXT_PROPERTY[3] = 'textContent';  /** Text **/\n    }\n    getText.$dv = '';\n    return getText;\n\n    function getText(element, value) {\n      var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType];\n      if (isUndefined(value)) {\n        return textProp ? element[textProp] : '';\n      }\n      element[textProp] = value;\n    }\n  })(),\n\n  val: function(element, value) {\n    if (isUndefined(value)) {\n      if (nodeName_(element) === 'SELECT' && element.multiple) {\n        var result = [];\n        forEach(element.options, function (option) {\n          if (option.selected) {\n            result.push(option.value || option.text);\n          }\n        });\n        return result.length === 0 ? null : result;\n      }\n      return element.value;\n    }\n    element.value = value;\n  },\n\n  html: function(element, value) {\n    if (isUndefined(value)) {\n      return element.innerHTML;\n    }\n    for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\n      jqLiteDealoc(childNodes[i]);\n    }\n    element.innerHTML = value;\n  },\n\n  empty: jqLiteEmpty\n}, function(fn, name){\n  /**\n   * Properties: writes return selection, reads return first value\n   */\n  JQLite.prototype[name] = function(arg1, arg2) {\n    var i, key;\n\n    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\n    // in a way that survives minification.\n    // jqLiteEmpty takes no arguments but is a setter.\n    if (fn !== jqLiteEmpty &&\n        (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {\n      if (isObject(arg1)) {\n\n        // we are a write, but the object properties are the key/values\n        for (i = 0; i < this.length; i++) {\n          if (fn === jqLiteData) {\n            // data() takes the whole object in jQuery\n            fn(this[i], arg1);\n          } else {\n            for (key in arg1) {\n              fn(this[i], key, arg1[key]);\n            }\n          }\n        }\n        // return self for chaining\n        return this;\n      } else {\n        // we are a read, so read the first child.\n        var value = fn.$dv;\n        // Only if we have $dv do we iterate over all, otherwise it is just the first element.\n        var jj = (value === undefined) ? Math.min(this.length, 1) : this.length;\n        for (var j = 0; j < jj; j++) {\n          var nodeValue = fn(this[j], arg1, arg2);\n          value = value ? value + nodeValue : nodeValue;\n        }\n        return value;\n      }\n    } else {\n      // we are a write, so apply to all children\n      for (i = 0; i < this.length; i++) {\n        fn(this[i], arg1, arg2);\n      }\n      // return self for chaining\n      return this;\n    }\n  };\n});\n\nfunction createEventHandler(element, events) {\n  var eventHandler = function (event, type) {\n    if (!event.preventDefault) {\n      event.preventDefault = function() {\n        event.returnValue = false; //ie\n      };\n    }\n\n    if (!event.stopPropagation) {\n      event.stopPropagation = function() {\n        event.cancelBubble = true; //ie\n      };\n    }\n\n    if (!event.target) {\n      event.target = event.srcElement || document;\n    }\n\n    if (isUndefined(event.defaultPrevented)) {\n      var prevent = event.preventDefault;\n      event.preventDefault = function() {\n        event.defaultPrevented = true;\n        prevent.call(event);\n      };\n      event.defaultPrevented = false;\n    }\n\n    event.isDefaultPrevented = function() {\n      return event.defaultPrevented || event.returnValue === false;\n    };\n\n    // Copy event handlers in case event handlers array is modified during execution.\n    var eventHandlersCopy = shallowCopy(events[type || event.type] || []);\n\n    forEach(eventHandlersCopy, function(fn) {\n      fn.call(element, event);\n    });\n\n    // Remove monkey-patched methods (IE),\n    // as they would cause memory leaks in IE8.\n    if (msie <= 8) {\n      // IE7/8 does not allow to delete property on native object\n      event.preventDefault = null;\n      event.stopPropagation = null;\n      event.isDefaultPrevented = null;\n    } else {\n      // It shouldn't affect normal browsers (native methods are defined on prototype).\n      delete event.preventDefault;\n      delete event.stopPropagation;\n      delete event.isDefaultPrevented;\n    }\n  };\n  eventHandler.elem = element;\n  return eventHandler;\n}\n\n//////////////////////////////////////////\n// Functions iterating traversal.\n// These functions chain results into a single\n// selector.\n//////////////////////////////////////////\nforEach({\n  removeData: jqLiteRemoveData,\n\n  dealoc: jqLiteDealoc,\n\n  on: function onFn(element, type, fn, unsupported){\n    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');\n\n    var events = jqLiteExpandoStore(element, 'events'),\n        handle = jqLiteExpandoStore(element, 'handle');\n\n    if (!events) jqLiteExpandoStore(element, 'events', events = {});\n    if (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));\n\n    forEach(type.split(' '), function(type){\n      var eventFns = events[type];\n\n      if (!eventFns) {\n        if (type == 'mouseenter' || type == 'mouseleave') {\n          var contains = document.body.contains || document.body.compareDocumentPosition ?\n          function( a, b ) {\n            // jshint bitwise: false\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 = b.parentNode) ) {\n                  if ( b === a ) {\n                    return true;\n                  }\n                }\n              }\n              return false;\n            };\n\n          events[type] = [];\n\n          // Refer to jQuery's implementation of mouseenter & mouseleave\n          // Read about mouseenter and mouseleave:\n          // http://www.quirksmode.org/js/events_mouse.html#link8\n          var eventmap = { mouseleave : \"mouseout\", mouseenter : \"mouseover\"};\n\n          onFn(element, eventmap[type], function(event) {\n            var target = this, related = event.relatedTarget;\n            // For mousenter/leave call the handler if related is outside the target.\n            // NB: No relatedTarget if the mouse left/entered the browser window\n            if ( !related || (related !== target && !contains(target, related)) ){\n              handle(event, type);\n            }\n          });\n\n        } else {\n          addEventListenerFn(element, type, handle);\n          events[type] = [];\n        }\n        eventFns = events[type];\n      }\n      eventFns.push(fn);\n    });\n  },\n\n  off: jqLiteOff,\n\n  one: function(element, type, fn) {\n    element = jqLite(element);\n\n    //add the listener twice so that when it is called\n    //you can remove the original function and still be\n    //able to call element.off(ev, fn) normally\n    element.on(type, function onFn() {\n      element.off(type, fn);\n      element.off(type, onFn);\n    });\n    element.on(type, fn);\n  },\n\n  replaceWith: function(element, replaceNode) {\n    var index, parent = element.parentNode;\n    jqLiteDealoc(element);\n    forEach(new JQLite(replaceNode), function(node){\n      if (index) {\n        parent.insertBefore(node, index.nextSibling);\n      } else {\n        parent.replaceChild(node, element);\n      }\n      index = node;\n    });\n  },\n\n  children: function(element) {\n    var children = [];\n    forEach(element.childNodes, function(element){\n      if (element.nodeType === 1)\n        children.push(element);\n    });\n    return children;\n  },\n\n  contents: function(element) {\n    return element.contentDocument || element.childNodes || [];\n  },\n\n  append: function(element, node) {\n    forEach(new JQLite(node), function(child){\n      if (element.nodeType === 1 || element.nodeType === 11) {\n        element.appendChild(child);\n      }\n    });\n  },\n\n  prepend: function(element, node) {\n    if (element.nodeType === 1) {\n      var index = element.firstChild;\n      forEach(new JQLite(node), function(child){\n        element.insertBefore(child, index);\n      });\n    }\n  },\n\n  wrap: function(element, wrapNode) {\n    wrapNode = jqLite(wrapNode)[0];\n    var parent = element.parentNode;\n    if (parent) {\n      parent.replaceChild(wrapNode, element);\n    }\n    wrapNode.appendChild(element);\n  },\n\n  remove: function(element) {\n    jqLiteDealoc(element);\n    var parent = element.parentNode;\n    if (parent) parent.removeChild(element);\n  },\n\n  after: function(element, newElement) {\n    var index = element, parent = element.parentNode;\n    forEach(new JQLite(newElement), function(node){\n      parent.insertBefore(node, index.nextSibling);\n      index = node;\n    });\n  },\n\n  addClass: jqLiteAddClass,\n  removeClass: jqLiteRemoveClass,\n\n  toggleClass: function(element, selector, condition) {\n    if (selector) {\n      forEach(selector.split(' '), function(className){\n        var classCondition = condition;\n        if (isUndefined(classCondition)) {\n          classCondition = !jqLiteHasClass(element, className);\n        }\n        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);\n      });\n    }\n  },\n\n  parent: function(element) {\n    var parent = element.parentNode;\n    return parent && parent.nodeType !== 11 ? parent : null;\n  },\n\n  next: function(element) {\n    if (element.nextElementSibling) {\n      return element.nextElementSibling;\n    }\n\n    // IE8 doesn't have nextElementSibling\n    var elm = element.nextSibling;\n    while (elm != null && elm.nodeType !== 1) {\n      elm = elm.nextSibling;\n    }\n    return elm;\n  },\n\n  find: function(element, selector) {\n    if (element.getElementsByTagName) {\n      return element.getElementsByTagName(selector);\n    } else {\n      return [];\n    }\n  },\n\n  clone: jqLiteClone,\n\n  triggerHandler: function(element, eventName, eventData) {\n    var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];\n\n    eventData = eventData || [];\n\n    var event = [{\n      preventDefault: noop,\n      stopPropagation: noop\n    }];\n\n    forEach(eventFns, function(fn) {\n      fn.apply(element, event.concat(eventData));\n    });\n  }\n}, function(fn, name){\n  /**\n   * chaining functions\n   */\n  JQLite.prototype[name] = function(arg1, arg2, arg3) {\n    var value;\n    for(var i=0; i < this.length; i++) {\n      if (isUndefined(value)) {\n        value = fn(this[i], arg1, arg2, arg3);\n        if (isDefined(value)) {\n          // any function which returns a value needs to be wrapped\n          value = jqLite(value);\n        }\n      } else {\n        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));\n      }\n    }\n    return isDefined(value) ? value : this;\n  };\n\n  // bind legacy bind/unbind to on/off\n  JQLite.prototype.bind = JQLite.prototype.on;\n  JQLite.prototype.unbind = JQLite.prototype.off;\n});\n\n/**\n * Computes a hash of an 'obj'.\n * Hash of a:\n *  string is string\n *  number is number as string\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\n *         that is also assigned to the $$hashKey property of the object.\n *\n * @param obj\n * @returns {string} hash string such that the same input will have the same hash string.\n *         The resulting string key is in 'type:hashKey' format.\n */\nfunction hashKey(obj) {\n  var objType = typeof obj,\n      key;\n\n  if (objType == 'object' && obj !== null) {\n    if (typeof (key = obj.$$hashKey) == 'function') {\n      // must invoke on object to keep the right this\n      key = obj.$$hashKey();\n    } else if (key === undefined) {\n      key = obj.$$hashKey = nextUid();\n    }\n  } else {\n    key = obj;\n  }\n\n  return objType + ':' + key;\n}\n\n/**\n * HashMap which can use objects as keys\n */\nfunction HashMap(array){\n  forEach(array, this.put, this);\n}\nHashMap.prototype = {\n  /**\n   * Store key value pair\n   * @param key key to store can be any type\n   * @param value value to store can be any type\n   */\n  put: function(key, value) {\n    this[hashKey(key)] = value;\n  },\n\n  /**\n   * @param key\n   * @returns {Object} the value for the key\n   */\n  get: function(key) {\n    return this[hashKey(key)];\n  },\n\n  /**\n   * Remove the key/value pair\n   * @param key\n   */\n  remove: function(key) {\n    var value = this[key = hashKey(key)];\n    delete this[key];\n    return value;\n  }\n};\n\n/**\n * @ngdoc function\n * @module ng\n * @name angular.injector\n * @function\n *\n * @description\n * Creates an injector function that can be used for retrieving services as well as for\n * dependency injection (see {@link guide/di dependency injection}).\n *\n\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\n *        {@link angular.module}. The `ng` module must be explicitly added.\n * @returns {function()} Injector function. See {@link auto.$injector $injector}.\n *\n * @example\n * Typical usage\n * ```js\n *   // create an injector\n *   var $injector = angular.injector(['ng']);\n *\n *   // use the injector to kick off your application\n *   // use the type inference to auto inject arguments, or use implicit injection\n *   $injector.invoke(function($rootScope, $compile, $document){\n *     $compile($document)($rootScope);\n *     $rootScope.$digest();\n *   });\n * ```\n *\n * Sometimes you want to get access to the injector of a currently running Angular app\n * from outside Angular. Perhaps, you want to inject and compile some markup after the\n * application has been bootstrapped. You can do this using the extra `injector()` added\n * to JQuery/jqLite elements. See {@link angular.element}.\n *\n * *This is fairly rare but could be the case if a third party library is injecting the\n * markup.*\n *\n * In the following example a new block of HTML containing a `ng-controller`\n * directive is added to the end of the document body by JQuery. We then compile and link\n * it into the current AngularJS scope.\n *\n * ```js\n * var $div = $('<div ng-controller=\"MyCtrl\">{{content.label}}</div>');\n * $(document.body).append($div);\n *\n * angular.element(document).injector().invoke(function($compile) {\n *   var scope = angular.element($div).scope();\n *   $compile($div)(scope);\n * });\n * ```\n */\n\n\n/**\n * @ngdoc module\n * @name auto\n * @description\n *\n * Implicit module which gets automatically added to each {@link auto.$injector $injector}.\n */\n\nvar FN_ARGS = /^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nvar $injectorMinErr = minErr('$injector');\n\nfunction anonFn(fn) {\n  // For anonymous functions, showing at the very least the function signature can help in\n  // debugging.\n  var fnText = fn.toString().replace(STRIP_COMMENTS, ''),\n      args = fnText.match(FN_ARGS);\n  if (args) {\n    return 'function(' + (args[1] || '').replace(/[\\s\\r\\n]+/, ' ') + ')';\n  }\n  return 'fn';\n}\n\nfunction annotate(fn, strictDi, name) {\n  var $inject,\n      fnText,\n      argDecl,\n      last;\n\n  if (typeof fn == 'function') {\n    if (!($inject = fn.$inject)) {\n      $inject = [];\n      if (fn.length) {\n        if (strictDi) {\n          if (!isString(name) || !name) {\n            name = fn.name || anonFn(fn);\n          }\n          throw $injectorMinErr('strictdi',\n            '{0} is not using explicit annotation and cannot be invoked in strict mode', name);\n        }\n        fnText = fn.toString().replace(STRIP_COMMENTS, '');\n        argDecl = fnText.match(FN_ARGS);\n        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){\n          arg.replace(FN_ARG, function(all, underscore, name){\n            $inject.push(name);\n          });\n        });\n      }\n      fn.$inject = $inject;\n    }\n  } else if (isArray(fn)) {\n    last = fn.length - 1;\n    assertArgFn(fn[last], 'fn');\n    $inject = fn.slice(0, last);\n  } else {\n    assertArgFn(fn, 'fn', true);\n  }\n  return $inject;\n}\n\n///////////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $injector\n * @function\n *\n * @description\n *\n * `$injector` is used to retrieve object instances as defined by\n * {@link auto.$provide provider}, instantiate types, invoke methods,\n * and load modules.\n *\n * The following always holds true:\n *\n * ```js\n *   var $injector = angular.injector();\n *   expect($injector.get('$injector')).toBe($injector);\n *   expect($injector.invoke(function($injector){\n *     return $injector;\n *   }).toBe($injector);\n * ```\n *\n * # Injection Function Annotation\n *\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\n * following are all valid ways of annotating function with injection arguments and are equivalent.\n *\n * ```js\n *   // inferred (only works if code not minified/obfuscated)\n *   $injector.invoke(function(serviceA){});\n *\n *   // annotated\n *   function explicit(serviceA) {};\n *   explicit.$inject = ['serviceA'];\n *   $injector.invoke(explicit);\n *\n *   // inline\n *   $injector.invoke(['serviceA', function(serviceA){}]);\n * ```\n *\n * ## Inference\n *\n * In JavaScript calling `toString()` on a function returns the function definition. The definition\n * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with\n * minification, and obfuscation tools since these tools change the argument names.\n *\n * ## `$inject` Annotation\n * By adding an `$inject` property onto a function the injection parameters can be specified.\n *\n * ## Inline\n * As an array of injection names, where the last item in the array is the function to call.\n */\n\n/**\n * @ngdoc method\n * @name $injector#get\n *\n * @description\n * Return an instance of the service.\n *\n * @param {string} name The name of the instance to retrieve.\n * @return {*} The instance.\n */\n\n/**\n * @ngdoc method\n * @name $injector#invoke\n *\n * @description\n * Invoke the method and supply the method arguments from the `$injector`.\n *\n * @param {!Function} fn The function to invoke. Function parameters are injected according to the\n *   {@link guide/di $inject Annotation} rules.\n * @param {Object=} self The `this` for the invoked method.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n *                         object first, before the `$injector` is consulted.\n * @returns {*} the value returned by the invoked `fn` function.\n */\n\n/**\n * @ngdoc method\n * @name $injector#has\n *\n * @description\n * Allows the user to query if the particular service exists.\n *\n * @param {string} Name of the service to query.\n * @returns {boolean} returns true if injector has given service.\n */\n\n/**\n * @ngdoc method\n * @name $injector#instantiate\n * @description\n * Create a new instance of JS type. The method takes a constructor function, invokes the new\n * operator, and supplies all of the arguments to the constructor function as specified by the\n * constructor annotation.\n *\n * @param {Function} Type Annotated constructor function.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n * object first, before the `$injector` is consulted.\n * @returns {Object} new instance of `Type`.\n */\n\n/**\n * @ngdoc method\n * @name $injector#annotate\n *\n * @description\n * Returns an array of service names which the function is requesting for injection. This API is\n * used by the injector to determine which services need to be injected into the function when the\n * function is invoked. There are three ways in which the function can be annotated with the needed\n * dependencies.\n *\n * # Argument names\n *\n * The simplest form is to extract the dependencies from the arguments of the function. This is done\n * by converting the function into a string using `toString()` method and extracting the argument\n * names.\n * ```js\n *   // Given\n *   function MyController($scope, $route) {\n *     // ...\n *   }\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * This method does not work with code minification / obfuscation. For this reason the following\n * annotation strategies are supported.\n *\n * # The `$inject` property\n *\n * If a function has an `$inject` property and its value is an array of strings, then the strings\n * represent names of services to be injected into the function.\n * ```js\n *   // Given\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\n *     // ...\n *   }\n *   // Define function dependencies\n *   MyController['$inject'] = ['$scope', '$route'];\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * # The array notation\n *\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property\n * is very inconvenient. In these situations using the array notation to specify the dependencies in\n * a way that survives minification is a better choice:\n *\n * ```js\n *   // We wish to write this (not minification / obfuscation safe)\n *   injector.invoke(function($compile, $rootScope) {\n *     // ...\n *   });\n *\n *   // We are forced to write break inlining\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\n *     // ...\n *   };\n *   tmpFn.$inject = ['$compile', '$rootScope'];\n *   injector.invoke(tmpFn);\n *\n *   // To better support inline function the inline annotation is supported\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\n *     // ...\n *   }]);\n *\n *   // Therefore\n *   expect(injector.annotate(\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\n *    ).toEqual(['$compile', '$rootScope']);\n * ```\n *\n * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to\n * be retrieved as described above.\n *\n * @returns {Array.<string>} The names of the services which the function requires.\n */\n\n\n\n\n/**\n * @ngdoc object\n * @name $provide\n *\n * @description\n *\n * The {@link auto.$provide $provide} service has a number of methods for registering components\n * with the {@link auto.$injector $injector}. Many of these functions are also exposed on\n * {@link angular.Module}.\n *\n * An Angular **service** is a singleton object created by a **service factory**.  These **service\n * factories** are functions which, in turn, are created by a **service provider**.\n * The **service providers** are constructor functions. When instantiated they must contain a\n * property called `$get`, which holds the **service factory** function.\n *\n * When you request a service, the {@link auto.$injector $injector} is responsible for finding the\n * correct **service provider**, instantiating it and then calling its `$get` **service factory**\n * function to get the instance of the **service**.\n *\n * Often services have no configuration options and there is no need to add methods to the service\n * provider.  The provider will be no more than a constructor function with a `$get` property. For\n * these cases the {@link auto.$provide $provide} service has additional helper methods to register\n * services without specifying a provider.\n *\n * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the\n *     {@link auto.$injector $injector}\n * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by\n *     providers and services.\n * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by\n *     services, not providers.\n * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,\n *     that will be wrapped in a **service provider** object, whose `$get` property will contain the\n *     given factory function.\n * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`\n *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate\n *      a new object using the given constructor function.\n *\n * See the individual methods for more information and examples.\n */\n\n/**\n * @ngdoc method\n * @name $provide#provider\n * @description\n *\n * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions\n * are constructor functions, whose instances are responsible for \"providing\" a factory for a\n * service.\n *\n * Service provider names start with the name of the service they provide followed by `Provider`.\n * For example, the {@link ng.$log $log} service has a provider called\n * {@link ng.$logProvider $logProvider}.\n *\n * Service provider objects can have additional methods which allow configuration of the provider\n * and its service. Importantly, you can configure what kind of service is created by the `$get`\n * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a\n * method {@link ng.$logProvider#debugEnabled debugEnabled}\n * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the\n * console or not.\n *\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name +\n                        'Provider'` key.\n * @param {(Object|function())} provider If the provider is:\n *\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\n *     {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.\n *   - `Constructor`: a new instance of the provider will be created using\n *     {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.\n *\n * @returns {Object} registered provider instance\n\n * @example\n *\n * The following example shows how to create a simple event tracking service and register it using\n * {@link auto.$provide#provider $provide.provider()}.\n *\n * ```js\n *  // Define the eventTracker provider\n *  function EventTrackerProvider() {\n *    var trackingUrl = '/track';\n *\n *    // A provider method for configuring where the tracked events should been saved\n *    this.setTrackingUrl = function(url) {\n *      trackingUrl = url;\n *    };\n *\n *    // The service factory function\n *    this.$get = ['$http', function($http) {\n *      var trackedEvents = {};\n *      return {\n *        // Call this to track an event\n *        event: function(event) {\n *          var count = trackedEvents[event] || 0;\n *          count += 1;\n *          trackedEvents[event] = count;\n *          return count;\n *        },\n *        // Call this to save the tracked events to the trackingUrl\n *        save: function() {\n *          $http.post(trackingUrl, trackedEvents);\n *        }\n *      };\n *    }];\n *  }\n *\n *  describe('eventTracker', function() {\n *    var postSpy;\n *\n *    beforeEach(module(function($provide) {\n *      // Register the eventTracker provider\n *      $provide.provider('eventTracker', EventTrackerProvider);\n *    }));\n *\n *    beforeEach(module(function(eventTrackerProvider) {\n *      // Configure eventTracker provider\n *      eventTrackerProvider.setTrackingUrl('/custom-track');\n *    }));\n *\n *    it('tracks events', inject(function(eventTracker) {\n *      expect(eventTracker.event('login')).toEqual(1);\n *      expect(eventTracker.event('login')).toEqual(2);\n *    }));\n *\n *    it('saves to the tracking url', inject(function(eventTracker, $http) {\n *      postSpy = spyOn($http, 'post');\n *      eventTracker.event('login');\n *      eventTracker.save();\n *      expect(postSpy).toHaveBeenCalled();\n *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');\n *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');\n *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });\n *    }));\n *  });\n * ```\n */\n\n/**\n * @ngdoc method\n * @name $provide#factory\n * @description\n *\n * Register a **service factory**, which will be called to return the service instance.\n * This is short for registering a service where its provider consists of only a `$get` property,\n * which is the given service factory function.\n * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to\n * configure your service in a provider.\n *\n * @param {string} name The name of the instance.\n * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand\n *                            for `$provide.provider(name, {$get: $getFn})`.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service\n * ```js\n *   $provide.factory('ping', ['$http', function($http) {\n *     return function ping() {\n *       return $http.send('/ping');\n *     };\n *   }]);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#service\n * @description\n *\n * Register a **service constructor**, which will be invoked with `new` to create the service\n * instance.\n * This is short for registering a service where its provider's `$get` property is the service\n * constructor function that will be used to instantiate the service instance.\n *\n * You should use {@link auto.$provide#service $provide.service(class)} if you define your service\n * as a type/class.\n *\n * @param {string} name The name of the instance.\n * @param {Function} constructor A class (constructor function) that will be instantiated.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service using\n * {@link auto.$provide#service $provide.service(class)}.\n * ```js\n *   var Ping = function($http) {\n *     this.$http = $http;\n *   };\n *\n *   Ping.$inject = ['$http'];\n *\n *   Ping.prototype.send = function() {\n *     return this.$http.get('/ping');\n *   };\n *   $provide.service('ping', Ping);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping.send();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#value\n * @description\n *\n * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a\n * number, an array, an object or a function.  This is short for registering a service where its\n * provider's `$get` property is a factory function that takes no arguments and returns the **value\n * service**.\n *\n * Value services are similar to constant services, except that they cannot be injected into a\n * module configuration function (see {@link angular.Module#config}) but they can be overridden by\n * an Angular\n * {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the instance.\n * @param {*} value The value.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here are some examples of creating value services.\n * ```js\n *   $provide.value('ADMIN_USER', 'admin');\n *\n *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });\n *\n *   $provide.value('halfOf', function(value) {\n *     return value / 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#constant\n * @description\n *\n * Register a **constant service**, such as a string, a number, an array, an object or a function,\n * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be\n * injected into a module configuration function (see {@link angular.Module#config}) and it cannot\n * be overridden by an Angular {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the constant.\n * @param {*} value The constant value.\n * @returns {Object} registered instance\n *\n * @example\n * Here a some examples of creating constants:\n * ```js\n *   $provide.constant('SHARD_HEIGHT', 306);\n *\n *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);\n *\n *   $provide.constant('double', function(value) {\n *     return value * 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#decorator\n * @description\n *\n * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator\n * intercepts the creation of a service, allowing it to override or modify the behaviour of the\n * service. The object returned by the decorator may be the original service, or a new service\n * object which replaces or wraps and delegates to the original service.\n *\n * @param {string} name The name of the service to decorate.\n * @param {function()} decorator This function will be invoked when the service needs to be\n *    instantiated and should return the decorated service instance. The function is called using\n *    the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.\n *    Local injection arguments:\n *\n *    * `$delegate` - The original service instance, which can be monkey patched, configured,\n *      decorated or delegated to.\n *\n * @example\n * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting\n * calls to {@link ng.$log#error $log.warn()}.\n * ```js\n *   $provide.decorator('$log', ['$delegate', function($delegate) {\n *     $delegate.warn = $delegate.error;\n *     return $delegate;\n *   }]);\n * ```\n */\n\n\nfunction createInjector(modulesToLoad, strictDi) {\n  strictDi = (strictDi === true);\n  var INSTANTIATING = {},\n      providerSuffix = 'Provider',\n      path = [],\n      loadedModules = new HashMap(),\n      providerCache = {\n        $provide: {\n            provider: supportObject(provider),\n            factory: supportObject(factory),\n            service: supportObject(service),\n            value: supportObject(value),\n            constant: supportObject(constant),\n            decorator: decorator\n          }\n      },\n      providerInjector = (providerCache.$injector =\n          createInternalInjector(providerCache, function() {\n            throw $injectorMinErr('unpr', \"Unknown provider: {0}\", path.join(' <- '));\n          }, strictDi)),\n      instanceCache = {},\n      instanceInjector = (instanceCache.$injector =\n          createInternalInjector(instanceCache, function(servicename) {\n            var provider = providerInjector.get(servicename + providerSuffix);\n            return instanceInjector.invoke(provider.$get, provider, undefined, servicename);\n          }, strictDi));\n\n\n  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });\n\n  return instanceInjector;\n\n  ////////////////////////////////////\n  // $provider\n  ////////////////////////////////////\n\n  function supportObject(delegate) {\n    return function(key, value) {\n      if (isObject(key)) {\n        forEach(key, reverseParams(delegate));\n      } else {\n        return delegate(key, value);\n      }\n    };\n  }\n\n  function provider(name, provider_) {\n    assertNotHasOwnProperty(name, 'service');\n    if (isFunction(provider_) || isArray(provider_)) {\n      provider_ = providerInjector.instantiate(provider_);\n    }\n    if (!provider_.$get) {\n      throw $injectorMinErr('pget', \"Provider '{0}' must define $get factory method.\", name);\n    }\n    return providerCache[name + providerSuffix] = provider_;\n  }\n\n  function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }\n\n  function service(name, constructor) {\n    return factory(name, ['$injector', function($injector) {\n      return $injector.instantiate(constructor);\n    }]);\n  }\n\n  function value(name, val) { return factory(name, valueFn(val)); }\n\n  function constant(name, value) {\n    assertNotHasOwnProperty(name, 'constant');\n    providerCache[name] = value;\n    instanceCache[name] = value;\n  }\n\n  function decorator(serviceName, decorFn) {\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\n        orig$get = origProvider.$get;\n\n    origProvider.$get = function() {\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\n    };\n  }\n\n  ////////////////////////////////////\n  // Module Loading\n  ////////////////////////////////////\n  function loadModules(modulesToLoad){\n    var runBlocks = [], moduleFn, invokeQueue;\n    forEach(modulesToLoad, function(module) {\n      if (loadedModules.get(module)) return;\n      loadedModules.put(module, true);\n\n      function runInvokeQueue(queue) {\n        var i, ii;\n        for(i = 0, ii = queue.length; i < ii; i++) {\n          var invokeArgs = queue[i],\n              provider = providerInjector.get(invokeArgs[0]);\n\n          provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\n        }\n      }\n\n      try {\n        if (isString(module)) {\n          moduleFn = angularModule(module);\n          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\n          runInvokeQueue(moduleFn._invokeQueue);\n          runInvokeQueue(moduleFn._configBlocks);\n        } else if (isFunction(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else if (isArray(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else {\n          assertArgFn(module, 'module');\n        }\n      } catch (e) {\n        if (isArray(module)) {\n          module = module[module.length - 1];\n        }\n        if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {\n          // Safari & FF's stack traces don't contain error.message content\n          // unlike those of Chrome and IE\n          // So if stack doesn't contain message, we create a new string that contains both.\n          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.\n          /* jshint -W022 */\n          e = e.message + '\\n' + e.stack;\n        }\n        throw $injectorMinErr('modulerr', \"Failed to instantiate module {0} due to:\\n{1}\",\n                  module, e.stack || e.message || e);\n      }\n    });\n    return runBlocks;\n  }\n\n  ////////////////////////////////////\n  // internal Injector\n  ////////////////////////////////////\n\n  function createInternalInjector(cache, factory) {\n\n    function getService(serviceName) {\n      if (cache.hasOwnProperty(serviceName)) {\n        if (cache[serviceName] === INSTANTIATING) {\n          throw $injectorMinErr('cdep', 'Circular dependency found: {0}', path.join(' <- '));\n        }\n        return cache[serviceName];\n      } else {\n        try {\n          path.unshift(serviceName);\n          cache[serviceName] = INSTANTIATING;\n          return cache[serviceName] = factory(serviceName);\n        } catch (err) {\n          if (cache[serviceName] === INSTANTIATING) {\n            delete cache[serviceName];\n          }\n          throw err;\n        } finally {\n          path.shift();\n        }\n      }\n    }\n\n    function invoke(fn, self, locals, serviceName){\n      if (typeof locals === 'string') {\n        serviceName = locals;\n        locals = null;\n      }\n\n      var args = [],\n          $inject = annotate(fn, strictDi, serviceName),\n          length, i,\n          key;\n\n      for(i = 0, length = $inject.length; i < length; i++) {\n        key = $inject[i];\n        if (typeof key !== 'string') {\n          throw $injectorMinErr('itkn',\n                  'Incorrect injection token! Expected service name as string, got {0}', key);\n        }\n        args.push(\n          locals && locals.hasOwnProperty(key)\n          ? locals[key]\n          : getService(key)\n        );\n      }\n      if (!fn.$inject) {\n        // this means that we must be an array.\n        fn = fn[length];\n      }\n\n      // http://jsperf.com/angularjs-invoke-apply-vs-switch\n      // #5388\n      return fn.apply(self, args);\n    }\n\n    function instantiate(Type, locals, serviceName) {\n      var Constructor = function() {},\n          instance, returnedValue;\n\n      // Check if Type is annotated and use just the given function at n-1 as parameter\n      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);\n      Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;\n      instance = new Constructor();\n      returnedValue = invoke(Type, instance, locals, serviceName);\n\n      return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;\n    }\n\n    return {\n      invoke: invoke,\n      instantiate: instantiate,\n      get: getService,\n      annotate: annotate,\n      has: function(name) {\n        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);\n      }\n    };\n  }\n}\n\ncreateInjector.$$annotate = annotate;\n\n/**\n * @ngdoc service\n * @name $anchorScroll\n * @kind function\n * @requires $window\n * @requires $location\n * @requires $rootScope\n *\n * @description\n * When called, it checks current value of `$location.hash()` and scrolls to the related element,\n * according to rules specified in\n * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).\n *\n * It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor.\n * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div id=\"scrollArea\" ng-controller=\"ScrollCtrl\">\n         <a ng-click=\"gotoBottom()\">Go to bottom</a>\n         <a id=\"bottom\"></a> You're at the bottom!\n       </div>\n     </file>\n     <file name=\"script.js\">\n       function ScrollCtrl($scope, $location, $anchorScroll) {\n         $scope.gotoBottom = function (){\n           // set the location.hash to the id of\n           // the element you wish to scroll to.\n           $location.hash('bottom');\n\n           // call $anchorScroll()\n           $anchorScroll();\n         };\n       }\n     </file>\n     <file name=\"style.css\">\n       #scrollArea {\n         height: 350px;\n         overflow: auto;\n       }\n\n       #bottom {\n         display: block;\n         margin-top: 2000px;\n       }\n     </file>\n   </example>\n */\nfunction $AnchorScrollProvider() {\n\n  var autoScrollingEnabled = true;\n\n  this.disableAutoScrolling = function() {\n    autoScrollingEnabled = false;\n  };\n\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\n    var document = $window.document;\n\n    // helper function to get first anchor from a NodeList\n    // can't use filter.filter, as it accepts only instances of Array\n    // and IE can't convert NodeList to an array using [].slice\n    // TODO(vojta): use filter if we change it to accept lists as well\n    function getFirstAnchor(list) {\n      var result = null;\n      forEach(list, function(element) {\n        if (!result && lowercase(element.nodeName) === 'a') result = element;\n      });\n      return result;\n    }\n\n    function scroll() {\n      var hash = $location.hash(), elm;\n\n      // empty hash, scroll to the top of the page\n      if (!hash) $window.scrollTo(0, 0);\n\n      // element with given id\n      else if ((elm = document.getElementById(hash))) elm.scrollIntoView();\n\n      // first anchor with given name :-D\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();\n\n      // no element and hash == 'top', scroll to the top of the page\n      else if (hash === 'top') $window.scrollTo(0, 0);\n    }\n\n    // does not scroll when user clicks on anchor link that is currently on\n    // (no url change, no $location.hash() change), browser native does scroll\n    if (autoScrollingEnabled) {\n      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},\n        function autoScrollWatchAction() {\n          $rootScope.$evalAsync(scroll);\n        });\n    }\n\n    return scroll;\n  }];\n}\n\nvar $animateMinErr = minErr('$animate');\n\n/**\n * @ngdoc provider\n * @name $animateProvider\n *\n * @description\n * Default implementation of $animate that doesn't perform any animations, instead just\n * synchronously performs DOM\n * updates and calls done() callbacks.\n *\n * In order to enable animations the ngAnimate module has to be loaded.\n *\n * To see the functional implementation check out src/ngAnimate/animate.js\n */\nvar $AnimateProvider = ['$provide', function($provide) {\n\n\n  this.$$selectors = {};\n\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#register\n   *\n   * @description\n   * Registers a new injectable animation factory function. The factory function produces the\n   * animation object which contains callback functions for each event that is expected to be\n   * animated.\n   *\n   *   * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`\n   *   must be called once the element animation is complete. If a function is returned then the\n   *   animation service will use this function to cancel the animation whenever a cancel event is\n   *   triggered.\n   *\n   *\n   * ```js\n   *   return {\n     *     eventFn : function(element, done) {\n     *       //code to run the animation\n     *       //once complete, then run done()\n     *       return function cancellationFunction() {\n     *         //code to cancel the animation\n     *       }\n     *     }\n     *   }\n   * ```\n   *\n   * @param {string} name The name of the animation.\n   * @param {Function} factory The factory function that will be executed to return the animation\n   *                           object.\n   */\n  this.register = function(name, factory) {\n    var key = name + '-animation';\n    if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',\n        \"Expecting class selector starting with '.' got '{0}'.\", name);\n    this.$$selectors[name.substr(1)] = key;\n    $provide.factory(key, factory);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#classNameFilter\n   *\n   * @description\n   * Sets and/or returns the CSS class regular expression that is checked when performing\n   * an animation. Upon bootstrap the classNameFilter value is not set at all and will\n   * therefore enable $animate to attempt to perform an animation on any element.\n   * When setting the classNameFilter value, animations will only be performed on elements\n   * that successfully match the filter expression. This in turn can boost performance\n   * for low-powered devices as well as applications containing a lot of structural operations.\n   * @param {RegExp=} expression The className expression which will be checked against all animations\n   * @return {RegExp} The current CSS className expression value. If null then there is no expression value\n   */\n  this.classNameFilter = function(expression) {\n    if(arguments.length === 1) {\n      this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;\n    }\n    return this.$$classNameFilter;\n  };\n\n  this.$get = ['$timeout', '$$asyncCallback', function($timeout, $$asyncCallback) {\n\n    function async(fn) {\n      fn && $$asyncCallback(fn);\n    }\n\n    /**\n     *\n     * @ngdoc service\n     * @name $animate\n     * @description The $animate service provides rudimentary DOM manipulation functions to\n     * insert, remove and move elements within the DOM, as well as adding and removing classes.\n     * This service is the core service used by the ngAnimate $animator service which provides\n     * high-level animation hooks for CSS and JavaScript.\n     *\n     * $animate is available in the AngularJS core, however, the ngAnimate module must be included\n     * to enable full out animation support. Otherwise, $animate will only perform simple DOM\n     * manipulation operations.\n     *\n     * To learn more about enabling animation support, click here to visit the {@link ngAnimate\n     * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service\n     * page}.\n     */\n    return {\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enter\n       * @function\n       * @description Inserts the element into the DOM either after the `after` element or\n       * as the first child within the `parent` element. Once complete, the done() callback\n       * will be fired (if provided).\n       * @param {DOMElement} element the element which will be inserted into the DOM\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (if the after element is not present)\n       * @param {DOMElement} after the sibling element which will append the element\n       *   after itself\n       * @param {Function=} done callback function that will be called after the element has been\n       *   inserted into the DOM\n       */\n      enter : function(element, parent, after, done) {\n        after\n            ? after.after(element)\n            : parent.prepend(element);\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#leave\n       * @function\n       * @description Removes the element from the DOM. Once complete, the done() callback will be\n       *   fired (if provided).\n       * @param {DOMElement} element the element which will be removed from the DOM\n       * @param {Function=} done callback function that will be called after the element has been\n       *   removed from the DOM\n       */\n      leave : function(element, done) {\n        element.remove();\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#move\n       * @function\n       * @description Moves the position of the provided element within the DOM to be placed\n       * either after the `after` element or inside of the `parent` element. Once complete, the\n       * done() callback will be fired (if provided).\n       *\n       * @param {DOMElement} element the element which will be moved around within the\n       *   DOM\n       * @param {DOMElement} parent the parent element where the element will be\n       *   inserted into (if the after element is not present)\n       * @param {DOMElement} after the sibling element where the element will be\n       *   positioned next to\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   element has been moved to its new position\n       */\n      move : function(element, parent, after, done) {\n        // Do not remove element before insert. Removing will cause data associated with the\n        // element to be dropped. Insert will implicitly do the remove.\n        this.enter(element, parent, after, done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#addClass\n       * @function\n       * @description Adds the provided className CSS class value to the provided element. Once\n       * complete, the done() callback will be fired (if provided).\n       * @param {DOMElement} element the element which will have the className value\n       *   added to it\n       * @param {string} className the CSS class which will be added to the element\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   className value has been added to the element\n       */\n      addClass : function(element, className, done) {\n        className = isString(className) ?\n                      className :\n                      isArray(className) ? className.join(' ') : '';\n        forEach(element, function (element) {\n          jqLiteAddClass(element, className);\n        });\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#removeClass\n       * @function\n       * @description Removes the provided className CSS class value from the provided element.\n       * Once complete, the done() callback will be fired (if provided).\n       * @param {DOMElement} element the element which will have the className value\n       *   removed from it\n       * @param {string} className the CSS class which will be removed from the element\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   className value has been removed from the element\n       */\n      removeClass : function(element, className, done) {\n        className = isString(className) ?\n                      className :\n                      isArray(className) ? className.join(' ') : '';\n        forEach(element, function (element) {\n          jqLiteRemoveClass(element, className);\n        });\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#setClass\n       * @function\n       * @description Adds and/or removes the given CSS classes to and from the element.\n       * Once complete, the done() callback will be fired (if provided).\n       * @param {DOMElement} element the element which will it's CSS classes changed\n       *   removed from it\n       * @param {string} add the CSS classes which will be added to the element\n       * @param {string} remove the CSS class which will be removed from the element\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   CSS classes have been set on the element\n       */\n      setClass : function(element, add, remove, done) {\n        forEach(element, function (element) {\n          jqLiteAddClass(element, add);\n          jqLiteRemoveClass(element, remove);\n        });\n        async(done);\n      },\n\n      enabled : noop\n    };\n  }];\n}];\n\nfunction $$AsyncCallbackProvider(){\n  this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) {\n    return $$rAF.supported\n      ? function(fn) { return $$rAF(fn); }\n      : function(fn) {\n        return $timeout(fn, 0, false);\n      };\n  }];\n}\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n * @requires $log\n * @description\n * This object has two goals:\n *\n * - hide all the global state in the browser caused by the window object\n * - abstract away all the browser specific features and inconsistencies\n *\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\n * service, which can be used for convenient testing of the application without the interaction with\n * the real browser apis.\n */\n/**\n * @param {object} window The global window object.\n * @param {object} document jQuery wrapped document.\n * @param {function()} XHR XMLHttpRequest constructor.\n * @param {object} $log console.log or an object with the same interface.\n * @param {object} $sniffer $sniffer service\n */\nfunction Browser(window, document, $log, $sniffer) {\n  var self = this,\n      rawDocument = document[0],\n      location = window.location,\n      history = window.history,\n      setTimeout = window.setTimeout,\n      clearTimeout = window.clearTimeout,\n      pendingDeferIds = {};\n\n  self.isMock = false;\n\n  var outstandingRequestCount = 0;\n  var outstandingRequestCallbacks = [];\n\n  // TODO(vojta): remove this temporary api\n  self.$$completeOutstandingRequest = completeOutstandingRequest;\n  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };\n\n  /**\n   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\n   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\n   */\n  function completeOutstandingRequest(fn) {\n    try {\n      fn.apply(null, sliceArgs(arguments, 1));\n    } finally {\n      outstandingRequestCount--;\n      if (outstandingRequestCount === 0) {\n        while(outstandingRequestCallbacks.length) {\n          try {\n            outstandingRequestCallbacks.pop()();\n          } catch (e) {\n            $log.error(e);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * @private\n   * Note: this method is used only by scenario runner\n   * TODO(vojta): prefix this method with $$ ?\n   * @param {function()} callback Function that will be called when no outstanding request\n   */\n  self.notifyWhenNoOutstandingRequests = function(callback) {\n    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire\n    // at some deterministic time in respect to the test runner's actions. Leaving things up to the\n    // regular poller would result in flaky tests.\n    forEach(pollFns, function(pollFn){ pollFn(); });\n\n    if (outstandingRequestCount === 0) {\n      callback();\n    } else {\n      outstandingRequestCallbacks.push(callback);\n    }\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Poll Watcher API\n  //////////////////////////////////////////////////////////////\n  var pollFns = [],\n      pollTimeout;\n\n  /**\n   * @name $browser#addPollFn\n   *\n   * @param {function()} fn Poll function to add\n   *\n   * @description\n   * Adds a function to the list of functions that poller periodically executes,\n   * and starts polling if not started yet.\n   *\n   * @returns {function()} the added function\n   */\n  self.addPollFn = function(fn) {\n    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);\n    pollFns.push(fn);\n    return fn;\n  };\n\n  /**\n   * @param {number} interval How often should browser call poll functions (ms)\n   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.\n   *\n   * @description\n   * Configures the poller to run in the specified intervals, using the specified\n   * setTimeout fn and kicks it off.\n   */\n  function startPoller(interval, setTimeout) {\n    (function check() {\n      forEach(pollFns, function(pollFn){ pollFn(); });\n      pollTimeout = setTimeout(check, interval);\n    })();\n  }\n\n  //////////////////////////////////////////////////////////////\n  // URL API\n  //////////////////////////////////////////////////////////////\n\n  var lastBrowserUrl = location.href,\n      baseElement = document.find('base'),\n      newLocation = null;\n\n  /**\n   * @name $browser#url\n   *\n   * @description\n   * GETTER:\n   * Without any argument, this method just returns current value of location.href.\n   *\n   * SETTER:\n   * With at least one argument, this method sets url to new value.\n   * If html5 history api supported, pushState/replaceState is used, otherwise\n   * location.href/location.replace is used.\n   * Returns its own instance to allow chaining\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to change url.\n   *\n   * @param {string} url New url (when used as setter)\n   * @param {boolean=} replace Should new url replace current history record ?\n   */\n  self.url = function(url, replace) {\n    // Android Browser BFCache causes location, history reference to become stale.\n    if (location !== window.location) location = window.location;\n    if (history !== window.history) history = window.history;\n\n    // setter\n    if (url) {\n      if (lastBrowserUrl == url) return;\n      lastBrowserUrl = url;\n      if ($sniffer.history) {\n        if (replace) history.replaceState(null, '', url);\n        else {\n          history.pushState(null, '', url);\n          // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462\n          baseElement.attr('href', baseElement.attr('href'));\n        }\n      } else {\n        newLocation = url;\n        if (replace) {\n          location.replace(url);\n        } else {\n          location.href = url;\n        }\n      }\n      return self;\n    // getter\n    } else {\n      // - newLocation is a workaround for an IE7-9 issue with location.replace and location.href\n      //   methods not updating location.href synchronously.\n      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\n      return newLocation || location.href.replace(/%27/g,\"'\");\n    }\n  };\n\n  var urlChangeListeners = [],\n      urlChangeInit = false;\n\n  function fireUrlChange() {\n    newLocation = null;\n    if (lastBrowserUrl == self.url()) return;\n\n    lastBrowserUrl = self.url();\n    forEach(urlChangeListeners, function(listener) {\n      listener(self.url());\n    });\n  }\n\n  /**\n   * @name $browser#onUrlChange\n   *\n   * @description\n   * Register callback function that will be called, when url changes.\n   *\n   * It's only called when the url is changed from outside of angular:\n   * - user types different url into address bar\n   * - user clicks on history (forward/back) button\n   * - user clicks on a link\n   *\n   * It's not called when url is changed by $browser.url() method\n   *\n   * The listener gets called with new url as parameter.\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to monitor url changes in angular apps.\n   *\n   * @param {function(string)} listener Listener function to be called when url changes.\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\n   */\n  self.onUrlChange = function(callback) {\n    // TODO(vojta): refactor to use node's syntax for events\n    if (!urlChangeInit) {\n      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)\n      // don't fire popstate when user change the address bar and don't fire hashchange when url\n      // changed by push/replaceState\n\n      // html5 history api - popstate event\n      if ($sniffer.history) jqLite(window).on('popstate', fireUrlChange);\n      // hashchange event\n      if ($sniffer.hashchange) jqLite(window).on('hashchange', fireUrlChange);\n      // polling\n      else self.addPollFn(fireUrlChange);\n\n      urlChangeInit = true;\n    }\n\n    urlChangeListeners.push(callback);\n    return callback;\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Misc API\n  //////////////////////////////////////////////////////////////\n\n  /**\n   * @name $browser#baseHref\n   *\n   * @description\n   * Returns current <base href>\n   * (always relative - without domain)\n   *\n   * @returns {string} The current base href\n   */\n  self.baseHref = function() {\n    var href = baseElement.attr('href');\n    return href ? href.replace(/^(https?\\:)?\\/\\/[^\\/]*/, '') : '';\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Cookies API\n  //////////////////////////////////////////////////////////////\n  var lastCookies = {};\n  var lastCookieString = '';\n  var cookiePath = self.baseHref();\n\n  /**\n   * @name $browser#cookies\n   *\n   * @param {string=} name Cookie name\n   * @param {string=} value Cookie value\n   *\n   * @description\n   * The cookies method provides a 'private' low level access to browser cookies.\n   * It is not meant to be used directly, use the $cookie service instead.\n   *\n   * The return values vary depending on the arguments that the method was called with as follows:\n   *\n   * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify\n   *   it\n   * - cookies(name, value) -> set name to value, if value is undefined delete the cookie\n   * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that\n   *   way)\n   *\n   * @returns {Object} Hash of all cookies (if called without any parameter)\n   */\n  self.cookies = function(name, value) {\n    /* global escape: false, unescape: false */\n    var cookieLength, cookieArray, cookie, i, index;\n\n    if (name) {\n      if (value === undefined) {\n        rawDocument.cookie = escape(name) + \"=;path=\" + cookiePath +\n                                \";expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n      } else {\n        if (isString(value)) {\n          cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) +\n                                ';path=' + cookiePath).length + 1;\n\n          // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:\n          // - 300 cookies\n          // - 20 cookies per unique domain\n          // - 4096 bytes per cookie\n          if (cookieLength > 4096) {\n            $log.warn(\"Cookie '\"+ name +\n              \"' possibly not set or overflowed because it was too large (\"+\n              cookieLength + \" > 4096 bytes)!\");\n          }\n        }\n      }\n    } else {\n      if (rawDocument.cookie !== lastCookieString) {\n        lastCookieString = rawDocument.cookie;\n        cookieArray = lastCookieString.split(\"; \");\n        lastCookies = {};\n\n        for (i = 0; i < cookieArray.length; i++) {\n          cookie = cookieArray[i];\n          index = cookie.indexOf('=');\n          if (index > 0) { //ignore nameless cookies\n            name = unescape(cookie.substring(0, index));\n            // the first value that is seen for a cookie is the most\n            // specific one.  values for the same cookie name that\n            // follow are for less specific paths.\n            if (lastCookies[name] === undefined) {\n              lastCookies[name] = unescape(cookie.substring(index + 1));\n            }\n          }\n        }\n      }\n      return lastCookies;\n    }\n  };\n\n\n  /**\n   * @name $browser#defer\n   * @param {function()} fn A function, who's execution should be deferred.\n   * @param {number=} [delay=0] of milliseconds to defer the function execution.\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\n   *\n   * @description\n   * Executes a fn asynchronously via `setTimeout(fn, delay)`.\n   *\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\n   * via `$browser.defer.flush()`.\n   *\n   */\n  self.defer = function(fn, delay) {\n    var timeoutId;\n    outstandingRequestCount++;\n    timeoutId = setTimeout(function() {\n      delete pendingDeferIds[timeoutId];\n      completeOutstandingRequest(fn);\n    }, delay || 0);\n    pendingDeferIds[timeoutId] = true;\n    return timeoutId;\n  };\n\n\n  /**\n   * @name $browser#defer.cancel\n   *\n   * @description\n   * Cancels a deferred task identified with `deferId`.\n   *\n   * @param {*} deferId Token returned by the `$browser.defer` function.\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n   *                    canceled.\n   */\n  self.defer.cancel = function(deferId) {\n    if (pendingDeferIds[deferId]) {\n      delete pendingDeferIds[deferId];\n      clearTimeout(deferId);\n      completeOutstandingRequest(noop);\n      return true;\n    }\n    return false;\n  };\n\n}\n\nfunction $BrowserProvider(){\n  this.$get = ['$window', '$log', '$sniffer', '$document',\n      function( $window,   $log,   $sniffer,   $document){\n        return new Browser($window, $document, $log, $sniffer);\n      }];\n}\n\n/**\n * @ngdoc service\n * @name $cacheFactory\n *\n * @description\n * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to\n * them.\n *\n * ```js\n *\n *  var cache = $cacheFactory('cacheId');\n *  expect($cacheFactory.get('cacheId')).toBe(cache);\n *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();\n *\n *  cache.put(\"key\", \"value\");\n *  cache.put(\"another key\", \"another value\");\n *\n *  // We've specified no options on creation\n *  expect(cache.info()).toEqual({id: 'cacheId', size: 2});\n *\n * ```\n *\n *\n * @param {string} cacheId Name or id of the newly created cache.\n * @param {object=} options Options object that specifies the cache behavior. Properties:\n *\n *   - `{number=}` `capacity` — turns the cache into LRU cache.\n *\n * @returns {object} Newly created cache object with the following set of methods:\n *\n * - `{object}` `info()` — Returns id, size, and options of cache.\n * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns\n *   it.\n * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.\n * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.\n * - `{void}` `removeAll()` — Removes all cached values.\n * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.\n *\n * @example\n   <example module=\"cacheExampleApp\">\n     <file name=\"index.html\">\n       <div ng-controller=\"CacheController\">\n         <input ng-model=\"newCacheKey\" placeholder=\"Key\">\n         <input ng-model=\"newCacheValue\" placeholder=\"Value\">\n         <button ng-click=\"put(newCacheKey, newCacheValue)\">Cache</button>\n\n         <p ng-if=\"keys.length\">Cached Values</p>\n         <div ng-repeat=\"key in keys\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"cache.get(key)\"></b>\n         </div>\n\n         <p>Cache Info</p>\n         <div ng-repeat=\"(key, value) in cache.info()\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"value\"></b>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('cacheExampleApp', []).\n         controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {\n           $scope.keys = [];\n           $scope.cache = $cacheFactory('cacheId');\n           $scope.put = function(key, value) {\n             $scope.cache.put(key, value);\n             $scope.keys.push(key);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       p {\n         margin: 10px 0 3px;\n       }\n     </file>\n   </example>\n */\nfunction $CacheFactoryProvider() {\n\n  this.$get = function() {\n    var caches = {};\n\n    function cacheFactory(cacheId, options) {\n      if (cacheId in caches) {\n        throw minErr('$cacheFactory')('iid', \"CacheId '{0}' is already taken!\", cacheId);\n      }\n\n      var size = 0,\n          stats = extend({}, options, {id: cacheId}),\n          data = {},\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\n          lruHash = {},\n          freshEnd = null,\n          staleEnd = null;\n\n      /**\n       * @ngdoc type\n       * @name $cacheFactory.Cache\n       *\n       * @description\n       * A cache object used to store and retrieve data, primarily used by\n       * {@link $http $http} and the {@link ng.directive:script script} directive to cache\n       * templates and other data.\n       *\n       * ```js\n       *  angular.module('superCache')\n       *    .factory('superCache', ['$cacheFactory', function($cacheFactory) {\n       *      return $cacheFactory('super-cache');\n       *    }]);\n       * ```\n       *\n       * Example test:\n       *\n       * ```js\n       *  it('should behave like a cache', inject(function(superCache) {\n       *    superCache.put('key', 'value');\n       *    superCache.put('another key', 'another value');\n       *\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 2\n       *    });\n       *\n       *    superCache.remove('another key');\n       *    expect(superCache.get('another key')).toBeUndefined();\n       *\n       *    superCache.removeAll();\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 0\n       *    });\n       *  }));\n       * ```\n       */\n      return caches[cacheId] = {\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#put\n         * @function\n         *\n         * @description\n         * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be\n         * retrieved later, and incrementing the size of the cache if the key was not already\n         * present in the cache. If behaving like an LRU cache, it will also remove stale\n         * entries from the set.\n         *\n         * It will not insert undefined values into the cache.\n         *\n         * @param {string} key the key under which the cached data is stored.\n         * @param {*} value the value to store alongside the key. If it is undefined, the key\n         *    will not be stored.\n         * @returns {*} the value stored.\n         */\n        put: function(key, value) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\n\n            refresh(lruEntry);\n          }\n\n          if (isUndefined(value)) return;\n          if (!(key in data)) size++;\n          data[key] = value;\n\n          if (size > capacity) {\n            this.remove(staleEnd.key);\n          }\n\n          return value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#get\n         * @function\n         *\n         * @description\n         * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the data to be retrieved\n         * @returns {*} the value stored.\n         */\n        get: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            refresh(lruEntry);\n          }\n\n          return data[key];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#remove\n         * @function\n         *\n         * @description\n         * Removes an entry from the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the entry to be removed\n         */\n        remove: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            if (lruEntry == freshEnd) freshEnd = lruEntry.p;\n            if (lruEntry == staleEnd) staleEnd = lruEntry.n;\n            link(lruEntry.n,lruEntry.p);\n\n            delete lruHash[key];\n          }\n\n          delete data[key];\n          size--;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#removeAll\n         * @function\n         *\n         * @description\n         * Clears the cache object of any entries.\n         */\n        removeAll: function() {\n          data = {};\n          size = 0;\n          lruHash = {};\n          freshEnd = staleEnd = null;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#destroy\n         * @function\n         *\n         * @description\n         * Destroys the {@link $cacheFactory.Cache Cache} object entirely,\n         * removing it from the {@link $cacheFactory $cacheFactory} set.\n         */\n        destroy: function() {\n          data = null;\n          stats = null;\n          lruHash = null;\n          delete caches[cacheId];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#info\n         * @function\n         *\n         * @description\n         * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.\n         *\n         * @returns {object} an object with the following properties:\n         *   <ul>\n         *     <li>**id**: the id of the cache instance</li>\n         *     <li>**size**: the number of entries kept in the cache instance</li>\n         *     <li>**...**: any additional properties from the options object when creating the\n         *       cache.</li>\n         *   </ul>\n         */\n        info: function() {\n          return extend({}, stats, {size: size});\n        }\n      };\n\n\n      /**\n       * makes the `entry` the freshEnd of the LRU linked list\n       */\n      function refresh(entry) {\n        if (entry != freshEnd) {\n          if (!staleEnd) {\n            staleEnd = entry;\n          } else if (staleEnd == entry) {\n            staleEnd = entry.n;\n          }\n\n          link(entry.n, entry.p);\n          link(entry, freshEnd);\n          freshEnd = entry;\n          freshEnd.n = null;\n        }\n      }\n\n\n      /**\n       * bidirectionally links two entries of the LRU linked list\n       */\n      function link(nextEntry, prevEntry) {\n        if (nextEntry != prevEntry) {\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\n        }\n      }\n    }\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#info\n   *\n   * @description\n   * Get information about all the caches that have been created\n   *\n   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`\n   */\n    cacheFactory.info = function() {\n      var info = {};\n      forEach(caches, function(cache, cacheId) {\n        info[cacheId] = cache.info();\n      });\n      return info;\n    };\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#get\n   *\n   * @description\n   * Get access to a cache object by the `cacheId` used when it was created.\n   *\n   * @param {string} cacheId Name or id of a cache to access.\n   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.\n   */\n    cacheFactory.get = function(cacheId) {\n      return caches[cacheId];\n    };\n\n\n    return cacheFactory;\n  };\n}\n\n/**\n * @ngdoc service\n * @name $templateCache\n *\n * @description\n * The first time a template is used, it is loaded in the template cache for quick retrieval. You\n * can load templates directly into the cache in a `script` tag, or by consuming the\n * `$templateCache` service directly.\n *\n * Adding via the `script` tag:\n *\n * ```html\n *   <script type=\"text/ng-template\" id=\"templateId.html\">\n *     <p>This is the content of the template</p>\n *   </script>\n * ```\n *\n * **Note:** the `script` tag containing the template does not need to be included in the `head` of\n * the document, but it must be below the `ng-app` definition.\n *\n * Adding via the $templateCache service:\n *\n * ```js\n * var myApp = angular.module('myApp', []);\n * myApp.run(function($templateCache) {\n *   $templateCache.put('templateId.html', 'This is the content of the template');\n * });\n * ```\n *\n * To retrieve the template later, simply use it in your HTML:\n * ```html\n * <div ng-include=\" 'templateId.html' \"></div>\n * ```\n *\n * or get it via Javascript:\n * ```js\n * $templateCache.get('templateId.html')\n * ```\n *\n * See {@link ng.$cacheFactory $cacheFactory}.\n *\n */\nfunction $TemplateCacheProvider() {\n  this.$get = ['$cacheFactory', function($cacheFactory) {\n    return $cacheFactory('templates');\n  }];\n}\n\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\n *\n * DOM-related variables:\n *\n * - \"node\" - DOM Node\n * - \"element\" - DOM Element or Node\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\n *\n *\n * Compiler related stuff:\n *\n * - \"linkFn\" - linking fn of a single directive\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\n */\n\n\n/**\n * @ngdoc service\n * @name $compile\n * @function\n *\n * @description\n * Compiles an HTML string or DOM into a template and produces a template function, which\n * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.\n *\n * The compilation is a process of walking the DOM tree and matching DOM elements to\n * {@link ng.$compileProvider#directive directives}.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** This document is an in-depth reference of all directive options.\n * For a gentle introduction to directives with examples of common use cases,\n * see the {@link guide/directive directive guide}.\n * </div>\n *\n * ## Comprehensive Directive API\n *\n * There are many different options for a directive.\n *\n * The difference resides in the return value of the factory function.\n * You can either return a \"Directive Definition Object\" (see below) that defines the directive properties,\n * or just the `postLink` function (all other properties will have the default values).\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's recommended to use the \"directive definition object\" form.\n * </div>\n *\n * Here's an example directive declared with a Directive Definition Object:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       priority: 0,\n *       template: '<div></div>', // or // function(tElement, tAttrs) { ... },\n *       // or\n *       // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },\n *       transclude: false,\n *       restrict: 'A',\n *       scope: false,\n *       controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },\n *       controllerAs: 'stringAlias',\n *       require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],\n *       compile: function compile(tElement, tAttrs, transclude) {\n *         return {\n *           pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *           post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *         }\n *         // or\n *         // return function postLink( ... ) { ... }\n *       },\n *       // or\n *       // link: {\n *       //  pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *       //  post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *       // }\n *       // or\n *       // link: function postLink( ... ) { ... }\n *     };\n *     return directiveDefinitionObject;\n *   });\n * ```\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Any unspecified options will use the default value. You can see the default values below.\n * </div>\n *\n * Therefore the above can be simplified as:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       link: function postLink(scope, iElement, iAttrs) { ... }\n *     };\n *     return directiveDefinitionObject;\n *     // or\n *     // return function postLink(scope, iElement, iAttrs) { ... }\n *   });\n * ```\n *\n *\n *\n * ### Directive Definition Object\n *\n * The directive definition object provides instructions to the {@link ng.$compile\n * compiler}. The attributes are:\n *\n * #### `priority`\n * When there are multiple directives defined on a single DOM element, sometimes it\n * is necessary to specify the order in which the directives are applied. The `priority` is used\n * to sort the directives before their `compile` functions get called. Priority is defined as a\n * number. Directives with greater numerical `priority` are compiled first. Pre-link functions\n * are also run in priority order, but post-link functions are run in reverse order. The order\n * of directives with the same priority is undefined. The default priority is `0`.\n *\n * #### `terminal`\n * If set to true then the current `priority` will be the last set of directives\n * which will execute (any directives at the current priority will still execute\n * as the order of execution on same `priority` is undefined).\n *\n * #### `scope`\n * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the\n * same element request a new scope, only one new scope is created. The new scope rule does not\n * apply for the root of the template since the root of the template always gets a new scope.\n *\n * **If set to `{}` (object hash),** then a new \"isolate\" scope is created. The 'isolate' scope differs from\n * normal scope in that it does not prototypically inherit from the parent scope. This is useful\n * when creating reusable components, which should not accidentally read or modify data in the\n * parent scope.\n *\n * The 'isolate' scope takes an object hash which defines a set of local scope properties\n * derived from the parent scope. These local properties are useful for aliasing values for\n * templates. Locals definition is a hash of local scope property to its source:\n *\n * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is\n *   always a string since DOM attributes are strings. If no `attr` name is specified  then the\n *   attribute name is assumed to be the same as the local name.\n *   Given `<widget my-attr=\"hello {{name}}\">` and widget definition\n *   of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect\n *   the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the\n *   `localName` property on the widget scope. The `name` is read from the parent scope (not\n *   component scope).\n *\n * * `=` or `=attr` - set up bi-directional binding between a local scope property and the\n *   parent scope property of name defined via the value of the `attr` attribute. If no `attr`\n *   name is specified then the attribute name is assumed to be the same as the local name.\n *   Given `<widget my-attr=\"parentModel\">` and widget definition of\n *   `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the\n *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected\n *   in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent\n *   scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You\n *   can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional.\n *\n * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.\n *   If no `attr` name is specified then the attribute name is assumed to be the same as the\n *   local name. Given `<widget my-attr=\"count = count + value\">` and widget definition of\n *   `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to\n *   a function wrapper for the `count = count + value` expression. Often it's desirable to\n *   pass data from the isolated scope via an expression and to the parent scope, this can be\n *   done by passing a map of local variable names and values into the expression wrapper fn.\n *   For example, if the expression is `increment(amount)` then we can specify the amount value\n *   by calling the `localFn` as `localFn({amount: 22})`.\n *\n *\n *\n * #### `controller`\n * Controller constructor function. The controller is instantiated before the\n * pre-linking phase and it is shared with other directives (see\n * `require` attribute). This allows the directives to communicate with each other and augment\n * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:\n *\n * * `$scope` - Current scope associated with the element\n * * `$element` - Current element\n * * `$attrs` - Current attributes object for the element\n * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope.\n *    The scope can be overridden by an optional first argument.\n *   `function([scope], cloneLinkingFn)`.\n *\n *\n * #### `require`\n * Require another directive and inject its controller as the fourth argument to the linking function. The\n * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the\n * injected argument will be an array in corresponding order. If no such directive can be\n * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with:\n *\n * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.\n * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.\n * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.\n * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the\n *   `link` fn if not found.\n *\n *\n * #### `controllerAs`\n * Controller alias at the directive scope. An alias for the controller so it\n * can be referenced at the directive template. The directive needs to define a scope for this\n * configuration to be used. Useful in the case when directive is used as component.\n *\n *\n * #### `restrict`\n * String of subset of `EACM` which restricts the directive to a specific directive\n * declaration style. If omitted, the default (attributes only) is used.\n *\n * * `E` - Element name: `<my-directive></my-directive>`\n * * `A` - Attribute (default): `<div my-directive=\"exp\"></div>`\n * * `C` - Class: `<div class=\"my-directive: exp;\"></div>`\n * * `M` - Comment: `<!-- directive: my-directive exp -->`\n *\n *\n * #### `type`\n * String representing the document type used by the markup. This is useful for templates where the root\n * node is non-HTML content (such as SVG or MathML). The default value is \"html\".\n *\n * * `html` - All root template nodes are HTML, and don't need to be wrapped. Root nodes may also be\n *   top-level elements such as `<svg>` or `<math>`.\n * * `svg` - The template contains only SVG content, and must be wrapped in an `<svg>` node prior to\n *   processing.\n * * `math` - The template contains only MathML content, and must be wrapped in an `<math>` node prior to\n *   processing.\n *\n * If no `type` is specified, then the type is considered to be html.\n *\n * #### `template`\n * replace the current element with the contents of the HTML. The replacement process\n * migrates all of the attributes / classes from the old element to the new one. See the\n * {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive\n * Directives Guide} for an example.\n *\n * You can specify `template` as a string representing the template or as a function which takes\n * two arguments `tElement` and `tAttrs` (described in the `compile` function api below) and\n * returns a string value representing the template.\n *\n *\n * #### `templateUrl`\n * Same as `template` but the template is loaded from the specified URL. Because\n * the template loading is asynchronous the compilation/linking is suspended until the template\n * is loaded.\n *\n * You can specify `templateUrl` as a string representing the URL or as a function which takes two\n * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns\n * a string value representing the url.  In either case, the template URL is passed through {@link\n * api/ng.$sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.\n *\n *\n * #### `replace` ([*DEPRECATED*!], will be removed in next major release)\n * specify where the template should be inserted. Defaults to `false`.\n *\n * * `true` - the template will replace the current element.\n * * `false` - the template will replace the contents of the current element.\n *\n *\n * #### `transclude`\n * compile the content of the element and make it available to the directive.\n * Typically used with {@link ng.directive:ngTransclude\n * ngTransclude}. The advantage of transclusion is that the linking function receives a\n * transclusion function which is pre-bound to the correct scope. In a typical setup the widget\n * creates an `isolate` scope, but the transclusion is not a child, but a sibling of the `isolate`\n * scope. This makes it possible for the widget to have private state, and the transclusion to\n * be bound to the parent (pre-`isolate`) scope.\n *\n * * `true` - transclude the content of the directive.\n * * `'element'` - transclude the whole element including any directives defined at lower priority.\n *\n *\n * #### `compile`\n *\n * ```js\n *   function compile(tElement, tAttrs, transclude) { ... }\n * ```\n *\n * The compile function deals with transforming the template DOM. Since most directives do not do\n * template transformation, it is not used often. The compile function takes the following arguments:\n *\n *   * `tElement` - template element - The element where the directive has been declared. It is\n *     safe to do template transformation on the element and child elements only.\n *\n *   * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared\n *     between all directive compile functions.\n *\n *   * `transclude` -  [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`\n *\n * <div class=\"alert alert-warning\">\n * **Note:** The template instance and the link instance may be different objects if the template has\n * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that\n * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration\n * should be done in a linking function rather than in a compile function.\n * </div>\n\n * <div class=\"alert alert-warning\">\n * **Note:** The compile function cannot handle directives that recursively use themselves in their\n * own templates or compile functions. Compiling these directives results in an infinite loop and a\n * stack overflow errors.\n *\n * This can be avoided by manually using $compile in the postLink function to imperatively compile\n * a directive's template instead of relying on automatic template compilation via `template` or\n * `templateUrl` declaration or manual compilation inside the compile function.\n * </div>\n *\n * <div class=\"alert alert-error\">\n * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it\n *   e.g. does not know about the right outer scope. Please use the transclude function that is passed\n *   to the link function instead.\n * </div>\n\n * A compile function can have a return value which can be either a function or an object.\n *\n * * returning a (post-link) function - is equivalent to registering the linking function via the\n *   `link` property of the config object when the compile function is empty.\n *\n * * returning an object with function(s) registered via `pre` and `post` properties - allows you to\n *   control when a linking function should be called during the linking phase. See info about\n *   pre-linking and post-linking functions below.\n *\n *\n * #### `link`\n * This property is used only if the `compile` property is not defined.\n *\n * ```js\n *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }\n * ```\n *\n * The link function is responsible for registering DOM listeners as well as updating the DOM. It is\n * executed after the template has been cloned. This is where most of the directive logic will be\n * put.\n *\n *   * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the\n *     directive for registering {@link ng.$rootScope.Scope#$watch watches}.\n *\n *   * `iElement` - instance element - The element where the directive is to be used. It is safe to\n *     manipulate the children of the element only in `postLink` function since the children have\n *     already been linked.\n *\n *   * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared\n *     between all directive linking functions.\n *\n *   * `controller` - a controller instance - A controller instance if at least one directive on the\n *     element defines a controller. The controller is shared among all the directives, which allows\n *     the directives to use the controllers as a communication channel.\n *\n *   * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.\n *     The scope can be overridden by an optional first argument. This is the same as the `$transclude`\n *     parameter of directive controllers.\n *     `function([scope], cloneLinkingFn)`.\n *\n *\n * #### Pre-linking function\n *\n * Executed before the child elements are linked. Not safe to do DOM transformation since the\n * compiler linking function will fail to locate the correct elements for linking.\n *\n * #### Post-linking function\n *\n * Executed after the child elements are linked. It is safe to do DOM transformation in the post-linking function.\n *\n * <a name=\"Attributes\"></a>\n * ### Attributes\n *\n * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the\n * `link()` or `compile()` functions. It has a variety of uses.\n *\n * accessing *Normalized attribute names:*\n * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'.\n * the attributes object allows for normalized access to\n *   the attributes.\n *\n * * *Directive inter-communication:* All directives share the same instance of the attributes\n *   object which allows the directives to use the attributes object as inter directive\n *   communication.\n *\n * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object\n *   allowing other directives to read the interpolated value.\n *\n * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes\n *   that contain interpolation (e.g. `src=\"{{bar}}\"`). Not only is this very efficient but it's also\n *   the only way to easily get the actual value because during the linking phase the interpolation\n *   hasn't been evaluated yet and so the value is at this time set to `undefined`.\n *\n * ```js\n * function linkingFn(scope, elm, attrs, ctrl) {\n *   // get the attribute value\n *   console.log(attrs.ngModel);\n *\n *   // change the attribute\n *   attrs.$set('ngModel', 'new value');\n *\n *   // observe changes to interpolated attribute\n *   attrs.$observe('ngModel', function(value) {\n *     console.log('ngModel has changed value to ' + value);\n *   });\n * }\n * ```\n *\n * Below is an example using `$compileProvider`.\n *\n * <div class=\"alert alert-warning\">\n * **Note**: Typically directives are registered with `module.directive`. The example below is\n * to illustrate how `$compile` works.\n * </div>\n *\n <example module=\"compile\">\n   <file name=\"index.html\">\n    <script>\n      angular.module('compile', [], function($compileProvider) {\n        // configure new 'compile' directive by passing a directive\n        // factory function. The factory function injects the '$compile'\n        $compileProvider.directive('compile', function($compile) {\n          // directive factory creates a link function\n          return function(scope, element, attrs) {\n            scope.$watch(\n              function(scope) {\n                 // watch the 'compile' expression for changes\n                return scope.$eval(attrs.compile);\n              },\n              function(value) {\n                // when the 'compile' expression changes\n                // assign it into the current DOM\n                element.html(value);\n\n                // compile the new DOM and link it to the current\n                // scope.\n                // NOTE: we only compile .childNodes so that\n                // we don't get into infinite loop compiling ourselves\n                $compile(element.contents())(scope);\n              }\n            );\n          };\n        })\n      });\n\n      function Ctrl($scope) {\n        $scope.name = 'Angular';\n        $scope.html = 'Hello {{name}}';\n      }\n    </script>\n    <div ng-controller=\"Ctrl\">\n      <input ng-model=\"name\"> <br>\n      <textarea ng-model=\"html\"></textarea> <br>\n      <div compile=\"html\"></div>\n    </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should auto compile', function() {\n       var textarea = $('textarea');\n       var output = $('div[compile]');\n       // The initial state reads 'Hello Angular'.\n       expect(output.getText()).toBe('Hello Angular');\n       textarea.clear();\n       textarea.sendKeys('{{name}}!');\n       expect(output.getText()).toBe('Angular!');\n     });\n   </file>\n </example>\n\n *\n *\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\n * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives.\n * @param {number} maxPriority only apply directives lower than given priority (Only effects the\n *                 root element(s), not their children)\n * @returns {function(scope, cloneAttachFn=)} a link function which is used to bind template\n * (a DOM element/tree) to a scope. Where:\n *\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\n *  `template` and call the `cloneAttachFn` function allowing the caller to attach the\n *  cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\n *  called as: <br> `cloneAttachFn(clonedElement, scope)` where:\n *\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\n *      * `scope` - is the current scope with which the linking function is working with.\n *\n * Calling the linking function returns the element of the template. It is either the original\n * element passed in, or the clone of the element if the `cloneAttachFn` is provided.\n *\n * After linking the view is not updated until after a call to $digest which typically is done by\n * Angular automatically.\n *\n * If you need access to the bound view, there are two ways to do it:\n *\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\n *   before you send them to the compiler and keep this reference around.\n *   ```js\n *     var element = $compile('<p>{{total}}</p>')(scope);\n *   ```\n *\n * - if on the other hand, you need the element to be cloned, the view reference from the original\n *   example would not point to the clone, but rather to the original template that was cloned. In\n *   this case, you can access the clone via the cloneAttachFn:\n *   ```js\n *     var templateElement = angular.element('<p>{{total}}</p>'),\n *         scope = ....;\n *\n *     var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {\n *       //attach the clone to DOM document at the right place\n *     });\n *\n *     //now we have reference to the cloned DOM via `clonedElement`\n *   ```\n *\n *\n * For information on how the compiler works, see the\n * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\n */\n\nvar $compileMinErr = minErr('$compile');\n\n/**\n * @ngdoc provider\n * @name $compileProvider\n * @function\n *\n * @description\n */\n$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];\nfunction $CompileProvider($provide, $$sanitizeUriProvider) {\n  var hasDirectives = {},\n      Suffix = 'Directive',\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive\\:\\s*([\\d\\w_\\-]+)\\s+(.*)$/,\n      CLASS_DIRECTIVE_REGEXP = /(([\\d\\w_\\-]+)(?:\\:([^;]+))?;?)/,\n      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset');\n\n  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes\n  // The assumption is that future DOM event attribute names will begin with\n  // 'on' and be composed of only English letters.\n  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#directive\n   * @function\n   *\n   * @description\n   * Register a new directive with the compiler.\n   *\n   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which\n   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the\n   *    names and the values are the factories.\n   * @param {Function|Array} directiveFactory An injectable directive factory function. See\n   *    {@link guide/directive} for more info.\n   * @returns {ng.$compileProvider} Self for chaining.\n   */\n   this.directive = function registerDirective(name, directiveFactory) {\n    assertNotHasOwnProperty(name, 'directive');\n    if (isString(name)) {\n      assertArg(directiveFactory, 'directiveFactory');\n      if (!hasDirectives.hasOwnProperty(name)) {\n        hasDirectives[name] = [];\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\n          function($injector, $exceptionHandler) {\n            var directives = [];\n            forEach(hasDirectives[name], function(directiveFactory, index) {\n              try {\n                var directive = $injector.invoke(directiveFactory);\n                if (isFunction(directive)) {\n                  directive = { compile: valueFn(directive) };\n                } else if (!directive.compile && directive.link) {\n                  directive.compile = valueFn(directive.link);\n                }\n                directive.priority = directive.priority || 0;\n                directive.index = index;\n                directive.name = directive.name || name;\n                directive.require = directive.require || (directive.controller && directive.name);\n                directive.restrict = directive.restrict || 'A';\n                directives.push(directive);\n              } catch (e) {\n                $exceptionHandler(e);\n              }\n            });\n            return directives;\n          }]);\n      }\n      hasDirectives[name].push(directiveFactory);\n    } else {\n      forEach(name, reverseParams(registerDirective));\n    }\n    return this;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#aHrefSanitizationWhitelist\n   * @function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#imgSrcSanitizationWhitelist\n   * @function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();\n    }\n  };\n\n  this.$get = [\n            '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',\n            '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',\n    function($injector,   $interpolate,   $exceptionHandler,   $http,   $templateCache,   $parse,\n             $controller,   $rootScope,   $document,   $sce,   $animate,   $$sanitizeUri) {\n\n    var Attributes = function(element, attr) {\n      this.$$element = element;\n      this.$attr = attr || {};\n    };\n\n    Attributes.prototype = {\n      $normalize: directiveNormalize,\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$addClass\n       * @function\n       *\n       * @description\n       * Adds the CSS class value specified by the classVal parameter to the element. If animations\n       * are enabled then an animation will be triggered for the class addition.\n       *\n       * @param {string} classVal The className value that will be added to the element\n       */\n      $addClass : function(classVal) {\n        if(classVal && classVal.length > 0) {\n          $animate.addClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$removeClass\n       * @function\n       *\n       * @description\n       * Removes the CSS class value specified by the classVal parameter from the element. If\n       * animations are enabled then an animation will be triggered for the class removal.\n       *\n       * @param {string} classVal The className value that will be removed from the element\n       */\n      $removeClass : function(classVal) {\n        if(classVal && classVal.length > 0) {\n          $animate.removeClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$updateClass\n       * @function\n       *\n       * @description\n       * Adds and removes the appropriate CSS class values to the element based on the difference\n       * between the new and old CSS class values (specified as newClasses and oldClasses).\n       *\n       * @param {string} newClasses The current CSS className value\n       * @param {string} oldClasses The former CSS className value\n       */\n      $updateClass : function(newClasses, oldClasses) {\n        var toAdd = tokenDifference(newClasses, oldClasses);\n        var toRemove = tokenDifference(oldClasses, newClasses);\n\n        if(toAdd.length === 0) {\n          $animate.removeClass(this.$$element, toRemove);\n        } else if(toRemove.length === 0) {\n          $animate.addClass(this.$$element, toAdd);\n        } else {\n          $animate.setClass(this.$$element, toAdd, toRemove);\n        }\n      },\n\n      /**\n       * Set a normalized attribute on the element in a way such that all directives\n       * can share the attribute. This function properly handles boolean attributes.\n       * @param {string} key Normalized key. (ie ngAttribute)\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\n       *     Defaults to true.\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\n       */\n      $set: function(key, value, writeAttr, attrName) {\n        // TODO: decide whether or not to throw an error if \"class\"\n        //is set through this function since it may cause $updateClass to\n        //become unstable.\n\n        var booleanKey = getBooleanAttrName(this.$$element[0], key),\n            normalizedVal,\n            nodeName;\n\n        if (booleanKey) {\n          this.$$element.prop(key, value);\n          attrName = booleanKey;\n        }\n\n        this[key] = value;\n\n        // translate normalized key to actual key\n        if (attrName) {\n          this.$attr[key] = attrName;\n        } else {\n          attrName = this.$attr[key];\n          if (!attrName) {\n            this.$attr[key] = attrName = snake_case(key, '-');\n          }\n        }\n\n        nodeName = nodeName_(this.$$element);\n\n        // sanitize a[href] and img[src] values\n        if ((nodeName === 'A' && key === 'href') ||\n            (nodeName === 'IMG' && key === 'src')) {\n          this[key] = value = $$sanitizeUri(value, key === 'src');\n        }\n\n        if (writeAttr !== false) {\n          if (value === null || value === undefined) {\n            this.$$element.removeAttr(attrName);\n          } else {\n            this.$$element.attr(attrName, value);\n          }\n        }\n\n        // fire observers\n        var $$observers = this.$$observers;\n        $$observers && forEach($$observers[key], function(fn) {\n          try {\n            fn(value);\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        });\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$observe\n       * @function\n       *\n       * @description\n       * Observes an interpolated attribute.\n       *\n       * The observer function will be invoked once during the next `$digest` following\n       * compilation. The observer is then invoked whenever the interpolated value\n       * changes.\n       *\n       * @param {string} key Normalized key. (ie ngAttribute) .\n       * @param {function(interpolatedValue)} fn Function that will be called whenever\n                the interpolated value of the attribute changes.\n       *        See the {@link guide/directive#Attributes Directives} guide for more info.\n       * @returns {function()} Returns a deregistration function for this observer.\n       */\n      $observe: function(key, fn) {\n        var attrs = this,\n            $$observers = (attrs.$$observers || (attrs.$$observers = {})),\n            listeners = ($$observers[key] || ($$observers[key] = []));\n\n        listeners.push(fn);\n        $rootScope.$evalAsync(function() {\n          if (!listeners.$$inter) {\n            // no one registered attribute interpolation function, so lets call it manually\n            fn(attrs[key]);\n          }\n        });\n\n        return function() {\n          arrayRemove(listeners, fn);\n        };\n      }\n    };\n\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        denormalizeTemplate = (startSymbol == '{{' || endSymbol  == '}}')\n            ? identity\n            : function denormalizeTemplate(template) {\n              return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n        },\n        NG_ATTR_BINDING = /^ngAttr[A-Z]/;\n\n\n    return compile;\n\n    //================================\n\n    function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,\n                        previousCompileContext) {\n      if (!($compileNodes instanceof jqLite)) {\n        // jquery always rewraps, whereas we need to preserve the original selector so that we can\n        // modify it.\n        $compileNodes = jqLite($compileNodes);\n      }\n      // We can not compile top level text elements since text nodes can be merged and we will\n      // not be able to attach scope data to them, so we will wrap them in <span>\n      forEach($compileNodes, function(node, index){\n        if (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\\S+/) /* non-empty */ ) {\n          $compileNodes[index] = node = jqLite(node).wrap('<span></span>').parent()[0];\n        }\n      });\n      var compositeLinkFn =\n              compileNodes($compileNodes, transcludeFn, $compileNodes,\n                           maxPriority, ignoreDirective, previousCompileContext);\n      safeAddClass($compileNodes, 'ng-scope');\n      return function publicLinkFn(scope, cloneConnectFn, transcludeControllers){\n        assertArg(scope, 'scope');\n        // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\n        // and sometimes changes the structure of the DOM.\n        var $linkNode = cloneConnectFn\n          ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!!\n          : $compileNodes;\n\n        forEach(transcludeControllers, function(instance, name) {\n          $linkNode.data('$' + name + 'Controller', instance);\n        });\n\n        // Attach scope only to non-text nodes.\n        for(var i = 0, ii = $linkNode.length; i<ii; i++) {\n          var node = $linkNode[i],\n              nodeType = node.nodeType;\n          if (nodeType === 1 /* element */ || nodeType === 9 /* document */) {\n            $linkNode.eq(i).data('$scope', scope);\n          }\n        }\n\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);\n        return $linkNode;\n      };\n    }\n\n    function safeAddClass($element, className) {\n      try {\n        $element.addClass(className);\n      } catch(e) {\n        // ignore, since it means that we are trying to set class on\n        // SVG element, where class name is read-only.\n      }\n    }\n\n    /**\n     * Compile function matches each node in nodeList against the directives. Once all directives\n     * for a particular node are collected their compile functions are executed. The compile\n     * functions return values - the linking functions - are combined into a composite linking\n     * function, which is the a linking function for the node.\n     *\n     * @param {NodeList} nodeList an array of nodes or NodeList to compile\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then\n     *        the rootElement must be set the jqLite collection of the compile root. This is\n     *        needed so that the jqLite collection items can be replaced with widgets.\n     * @param {number=} maxPriority Max directive priority.\n     * @returns {Function} A composite linking function of all of the matched directives or null.\n     */\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,\n                            previousCompileContext) {\n      var linkFns = [],\n          attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound;\n\n      for (var i = 0; i < nodeList.length; i++) {\n        attrs = new Attributes();\n\n        // we must always refer to nodeList[i] since the nodes can be replaced underneath us.\n        directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,\n                                        ignoreDirective);\n\n        nodeLinkFn = (directives.length)\n            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,\n                                      null, [], [], previousCompileContext)\n            : null;\n\n        if (nodeLinkFn && nodeLinkFn.scope) {\n          safeAddClass(jqLite(nodeList[i]), 'ng-scope');\n        }\n\n        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||\n                      !(childNodes = nodeList[i].childNodes) ||\n                      !childNodes.length)\n            ? null\n            : compileNodes(childNodes,\n                 nodeLinkFn ? nodeLinkFn.transclude : transcludeFn);\n\n        linkFns.push(nodeLinkFn, childLinkFn);\n        linkFnFound = linkFnFound || nodeLinkFn || childLinkFn;\n        //use the previous context only for the first element in the virtual group\n        previousCompileContext = null;\n      }\n\n      // return a linking function if we have found anything, null otherwise\n      return linkFnFound ? compositeLinkFn : null;\n\n      function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) {\n        var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n;\n\n        // copy nodeList so that linking doesn't break due to live list updates.\n        var nodeListLength = nodeList.length,\n            stableNodeList = new Array(nodeListLength);\n        for (i = 0; i < nodeListLength; i++) {\n          stableNodeList[i] = nodeList[i];\n        }\n\n        for(i = 0, n = 0, ii = linkFns.length; i < ii; n++) {\n          node = stableNodeList[n];\n          nodeLinkFn = linkFns[i++];\n          childLinkFn = linkFns[i++];\n          $node = jqLite(node);\n\n          if (nodeLinkFn) {\n            if (nodeLinkFn.scope) {\n              childScope = scope.$new();\n              $node.data('$scope', childScope);\n            } else {\n              childScope = scope;\n            }\n            childTranscludeFn = nodeLinkFn.transclude;\n            if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) {\n              nodeLinkFn(childLinkFn, childScope, node, $rootElement,\n                createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn)\n              );\n            } else {\n              nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn);\n            }\n          } else if (childLinkFn) {\n            childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);\n          }\n        }\n      }\n    }\n\n    function createBoundTranscludeFn(scope, transcludeFn) {\n      return function boundTranscludeFn(transcludedScope, cloneFn, controllers) {\n        var scopeCreated = false;\n\n        if (!transcludedScope) {\n          transcludedScope = scope.$new();\n          transcludedScope.$$transcluded = true;\n          scopeCreated = true;\n        }\n\n        var clone = transcludeFn(transcludedScope, cloneFn, controllers);\n        if (scopeCreated) {\n          clone.on('$destroy', bind(transcludedScope, transcludedScope.$destroy));\n        }\n        return clone;\n      };\n    }\n\n    /**\n     * Looks for directives on the given node and adds them to the directive collection which is\n     * sorted.\n     *\n     * @param node Node to search.\n     * @param directives An array to which the directives are added to. This array is sorted before\n     *        the function returns.\n     * @param attrs The shared attrs object which is used to populate the normalized attributes.\n     * @param {number=} maxPriority Max directive priority.\n     */\n    function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      var nodeType = node.nodeType,\n          attrsMap = attrs.$attr,\n          match,\n          className;\n\n      switch(nodeType) {\n        case 1: /* Element */\n          // use the node name: <directive>\n          addDirective(directives,\n              directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);\n\n          // iterate over the attributes\n          for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\n            var attrStartName = false;\n            var attrEndName = false;\n\n            attr = nAttrs[j];\n            if (!msie || msie >= 8 || attr.specified) {\n              name = attr.name;\n              // support ngAttr attribute binding\n              ngAttrName = directiveNormalize(name);\n              if (NG_ATTR_BINDING.test(ngAttrName)) {\n                name = snake_case(ngAttrName.substr(6), '-');\n              }\n\n              var directiveNName = ngAttrName.replace(/(Start|End)$/, '');\n              if (ngAttrName === directiveNName + 'Start') {\n                attrStartName = name;\n                attrEndName = name.substr(0, name.length - 5) + 'end';\n                name = name.substr(0, name.length - 6);\n              }\n\n              nName = directiveNormalize(name.toLowerCase());\n              attrsMap[nName] = name;\n              attrs[nName] = value = trim(attr.value);\n              if (getBooleanAttrName(node, nName)) {\n                attrs[nName] = true; // presence means true\n              }\n              addAttrInterpolateDirective(node, directives, value, nName);\n              addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,\n                            attrEndName);\n            }\n          }\n\n          // use class as directive\n          className = node.className;\n          if (isString(className) && className !== '') {\n            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {\n              nName = directiveNormalize(match[2]);\n              if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[3]);\n              }\n              className = className.substr(match.index + match[0].length);\n            }\n          }\n          break;\n        case 3: /* Text Node */\n          addTextInterpolateDirective(directives, node.nodeValue);\n          break;\n        case 8: /* Comment */\n          try {\n            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\n            if (match) {\n              nName = directiveNormalize(match[1]);\n              if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[2]);\n              }\n            }\n          } catch (e) {\n            // turns out that under some circumstances IE9 throws errors when one attempts to read\n            // comment's node value.\n            // Just ignore it and continue. (Can't seem to reproduce in test case.)\n          }\n          break;\n      }\n\n      directives.sort(byPriority);\n      return directives;\n    }\n\n    /**\n     * Given a node with an directive-start it collects all of the siblings until it finds\n     * directive-end.\n     * @param node\n     * @param attrStart\n     * @param attrEnd\n     * @returns {*}\n     */\n    function groupScan(node, attrStart, attrEnd) {\n      var nodes = [];\n      var depth = 0;\n      if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {\n        var startNode = node;\n        do {\n          if (!node) {\n            throw $compileMinErr('uterdir',\n                      \"Unterminated attribute, found '{0}' but no matching '{1}' found.\",\n                      attrStart, attrEnd);\n          }\n          if (node.nodeType == 1 /** Element **/) {\n            if (node.hasAttribute(attrStart)) depth++;\n            if (node.hasAttribute(attrEnd)) depth--;\n          }\n          nodes.push(node);\n          node = node.nextSibling;\n        } while (depth > 0);\n      } else {\n        nodes.push(node);\n      }\n\n      return jqLite(nodes);\n    }\n\n    /**\n     * Wrapper for linking function which converts normal linking function into a grouped\n     * linking function.\n     * @param linkFn\n     * @param attrStart\n     * @param attrEnd\n     * @returns {Function}\n     */\n    function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {\n      return function(scope, element, attrs, controllers, transcludeFn) {\n        element = groupScan(element[0], attrStart, attrEnd);\n        return linkFn(scope, element, attrs, controllers, transcludeFn);\n      };\n    }\n\n    /**\n     * Once the directives have been collected, their compile functions are executed. This method\n     * is responsible for inlining directive templates as well as terminating the application\n     * of the directives if the terminal directive has been reached.\n     *\n     * @param {Array} directives Array of collected directives to execute their compile function.\n     *        this needs to be pre-sorted by priority order.\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\n     * @param {Object} templateAttrs The shared attribute function\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *                                                  scope argument is auto-generated to the new\n     *                                                  child of the transcluded parent scope.\n     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this\n     *                              argument has the root jqLite array so that we can replace nodes\n     *                              on it.\n     * @param {Object=} originalReplaceDirective An optional directive that will be ignored when\n     *                                           compiling the transclusion.\n     * @param {Array.<Function>} preLinkFns\n     * @param {Array.<Function>} postLinkFns\n     * @param {Object} previousCompileContext Context used for previous compilation of the current\n     *                                        node\n     * @returns {Function} linkFn\n     */\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,\n                                   jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,\n                                   previousCompileContext) {\n      previousCompileContext = previousCompileContext || {};\n\n      var terminalPriority = -Number.MAX_VALUE,\n          newScopeDirective,\n          controllerDirectives = previousCompileContext.controllerDirectives,\n          newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,\n          templateDirective = previousCompileContext.templateDirective,\n          nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,\n          hasTranscludeDirective = false,\n          hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\n          directive,\n          directiveName,\n          $template,\n          replaceDirective = originalReplaceDirective,\n          childTranscludeFn = transcludeFn,\n          linkFn,\n          directiveValue;\n\n      // executes all directives on the current element\n      for(var i = 0, ii = directives.length; i < ii; i++) {\n        directive = directives[i];\n        var attrStart = directive.$$start;\n        var attrEnd = directive.$$end;\n\n        // collect multiblock sections\n        if (attrStart) {\n          $compileNode = groupScan(compileNode, attrStart, attrEnd);\n        }\n        $template = undefined;\n\n        if (terminalPriority > directive.priority) {\n          break; // prevent further processing of directives\n        }\n\n        if (directiveValue = directive.scope) {\n          newScopeDirective = newScopeDirective || directive;\n\n          // skip the check for directives with async templates, we'll check the derived sync\n          // directive when the template arrives\n          if (!directive.templateUrl) {\n            assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,\n                              $compileNode);\n            if (isObject(directiveValue)) {\n              newIsolateScopeDirective = directive;\n            }\n          }\n        }\n\n        directiveName = directive.name;\n\n        if (!directive.templateUrl && directive.controller) {\n          directiveValue = directive.controller;\n          controllerDirectives = controllerDirectives || {};\n          assertNoDuplicate(\"'\" + directiveName + \"' controller\",\n              controllerDirectives[directiveName], directive, $compileNode);\n          controllerDirectives[directiveName] = directive;\n        }\n\n        if (directiveValue = directive.transclude) {\n          hasTranscludeDirective = true;\n\n          // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.\n          // This option should only be used by directives that know how to safely handle element transclusion,\n          // where the transcluded nodes are added or replaced after linking.\n          if (!directive.$$tlb) {\n            assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);\n            nonTlbTranscludeDirective = directive;\n          }\n\n          if (directiveValue == 'element') {\n            hasElementTranscludeDirective = true;\n            terminalPriority = directive.priority;\n            $template = groupScan(compileNode, attrStart, attrEnd);\n            $compileNode = templateAttrs.$$element =\n                jqLite(document.createComment(' ' + directiveName + ': ' +\n                                              templateAttrs[directiveName] + ' '));\n            compileNode = $compileNode[0];\n            replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode);\n\n            childTranscludeFn = compile($template, transcludeFn, terminalPriority,\n                                        replaceDirective && replaceDirective.name, {\n                                          // Don't pass in:\n                                          // - controllerDirectives - otherwise we'll create duplicates controllers\n                                          // - newIsolateScopeDirective or templateDirective - combining templates with\n                                          //   element transclusion doesn't make sense.\n                                          //\n                                          // We need only nonTlbTranscludeDirective so that we prevent putting transclusion\n                                          // on the same element more than once.\n                                          nonTlbTranscludeDirective: nonTlbTranscludeDirective\n                                        });\n          } else {\n            $template = jqLite(jqLiteClone(compileNode)).contents();\n            $compileNode.empty(); // clear contents\n            childTranscludeFn = compile($template, transcludeFn);\n          }\n        }\n\n        if (directive.template) {\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          directiveValue = (isFunction(directive.template))\n              ? directive.template($compileNode, templateAttrs)\n              : directive.template;\n\n          directiveValue = denormalizeTemplate(directiveValue);\n\n          if (directive.replace) {\n            replaceDirective = directive;\n            if (jqLiteIsTextNode(directiveValue)) {\n              $template = [];\n            } else {\n              $template = jqLite(wrapTemplate(directive.type, trim(directiveValue)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  directiveName, '');\n            }\n\n            replaceWith(jqCollection, $compileNode, compileNode);\n\n            var newTemplateAttrs = {$attr: {}};\n\n            // combine directives from the original node and from the template:\n            // - take the array of directives for this element\n            // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)\n            // - collect directives from the template and sort them by priority\n            // - combine directives as: processed + template + unprocessed\n            var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);\n            var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));\n\n            if (newIsolateScopeDirective) {\n              markDirectivesAsIsolate(templateDirectives);\n            }\n            directives = directives.concat(templateDirectives).concat(unprocessedDirectives);\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\n\n            ii = directives.length;\n          } else {\n            $compileNode.html(directiveValue);\n          }\n        }\n\n        if (directive.templateUrl) {\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          if (directive.replace) {\n            replaceDirective = directive;\n          }\n\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,\n              templateAttrs, jqCollection, childTranscludeFn, preLinkFns, postLinkFns, {\n                controllerDirectives: controllerDirectives,\n                newIsolateScopeDirective: newIsolateScopeDirective,\n                templateDirective: templateDirective,\n                nonTlbTranscludeDirective: nonTlbTranscludeDirective\n              });\n          ii = directives.length;\n        } else if (directive.compile) {\n          try {\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\n            if (isFunction(linkFn)) {\n              addLinkFns(null, linkFn, attrStart, attrEnd);\n            } else if (linkFn) {\n              addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);\n            }\n          } catch (e) {\n            $exceptionHandler(e, startingTag($compileNode));\n          }\n        }\n\n        if (directive.terminal) {\n          nodeLinkFn.terminal = true;\n          terminalPriority = Math.max(terminalPriority, directive.priority);\n        }\n\n      }\n\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;\n      nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn;\n      previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;\n\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\n      return nodeLinkFn;\n\n      ////////////////////\n\n      function addLinkFns(pre, post, attrStart, attrEnd) {\n        if (pre) {\n          if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);\n          pre.require = directive.require;\n          pre.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            pre = cloneAndAnnotateFn(pre, {isolateScope: true});\n          }\n          preLinkFns.push(pre);\n        }\n        if (post) {\n          if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);\n          post.require = directive.require;\n          post.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            post = cloneAndAnnotateFn(post, {isolateScope: true});\n          }\n          postLinkFns.push(post);\n        }\n      }\n\n\n      function getControllers(directiveName, require, $element, elementControllers) {\n        var value, retrievalMethod = 'data', optional = false;\n        if (isString(require)) {\n          while((value = require.charAt(0)) == '^' || value == '?') {\n            require = require.substr(1);\n            if (value == '^') {\n              retrievalMethod = 'inheritedData';\n            }\n            optional = optional || value == '?';\n          }\n          value = null;\n\n          if (elementControllers && retrievalMethod === 'data') {\n            value = elementControllers[require];\n          }\n          value = value || $element[retrievalMethod]('$' + require + 'Controller');\n\n          if (!value && !optional) {\n            throw $compileMinErr('ctreq',\n                \"Controller '{0}', required by directive '{1}', can't be found!\",\n                require, directiveName);\n          }\n          return value;\n        } else if (isArray(require)) {\n          value = [];\n          forEach(require, function(require) {\n            value.push(getControllers(directiveName, require, $element, elementControllers));\n          });\n        }\n        return value;\n      }\n\n\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\n        var attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = {}, transcludeFn;\n\n        if (compileNode === linkNode) {\n          attrs = templateAttrs;\n        } else {\n          attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));\n        }\n        $element = attrs.$$element;\n\n        if (newIsolateScopeDirective) {\n          var LOCAL_REGEXP = /^\\s*([@=&])(\\??)\\s*(\\w*)\\s*$/;\n          var $linkNode = jqLite(linkNode);\n\n          isolateScope = scope.$new(true);\n\n          if (templateDirective && (templateDirective === newIsolateScopeDirective ||\n              templateDirective === newIsolateScopeDirective.$$originalDirective)) {\n            $linkNode.data('$isolateScope', isolateScope) ;\n          } else {\n            $linkNode.data('$isolateScopeNoTemplate', isolateScope);\n          }\n\n\n\n          safeAddClass($linkNode, 'ng-isolate-scope');\n\n          forEach(newIsolateScopeDirective.scope, function(definition, scopeName) {\n            var match = definition.match(LOCAL_REGEXP) || [],\n                attrName = match[3] || scopeName,\n                optional = (match[2] == '?'),\n                mode = match[1], // @, =, or &\n                lastValue,\n                parentGet, parentSet, compare;\n\n            isolateScope.$$isolateBindings[scopeName] = mode + attrName;\n\n            switch (mode) {\n\n              case '@':\n                attrs.$observe(attrName, function(value) {\n                  isolateScope[scopeName] = value;\n                });\n                attrs.$$observers[attrName].$$scope = scope;\n                if( attrs[attrName] ) {\n                  // If the attribute has been provided then we trigger an interpolation to ensure\n                  // the value is there for use in the link fn\n                  isolateScope[scopeName] = $interpolate(attrs[attrName])(scope);\n                }\n                break;\n\n              case '=':\n                if (optional && !attrs[attrName]) {\n                  return;\n                }\n                parentGet = $parse(attrs[attrName]);\n                if (parentGet.literal) {\n                  compare = equals;\n                } else {\n                  compare = function(a,b) { return a === b; };\n                }\n                parentSet = parentGet.assign || function() {\n                  // reset the change, or we will throw this exception on every $digest\n                  lastValue = isolateScope[scopeName] = parentGet(scope);\n                  throw $compileMinErr('nonassign',\n                      \"Expression '{0}' used with directive '{1}' is non-assignable!\",\n                      attrs[attrName], newIsolateScopeDirective.name);\n                };\n                lastValue = isolateScope[scopeName] = parentGet(scope);\n                isolateScope.$watch(function parentValueWatch() {\n                  var parentValue = parentGet(scope);\n                  if (!compare(parentValue, isolateScope[scopeName])) {\n                    // we are out of sync and need to copy\n                    if (!compare(parentValue, lastValue)) {\n                      // parent changed and it has precedence\n                      isolateScope[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(scope, parentValue = isolateScope[scopeName]);\n                    }\n                  }\n                  parentValueWatch.$$unwatch = parentGet.$$unwatch;\n                  return lastValue = parentValue;\n                }, null, parentGet.literal);\n                break;\n\n              case '&':\n                parentGet = $parse(attrs[attrName]);\n                isolateScope[scopeName] = function(locals) {\n                  return parentGet(scope, locals);\n                };\n                break;\n\n              default:\n                throw $compileMinErr('iscp',\n                    \"Invalid isolate scope definition for directive '{0}'.\" +\n                    \" Definition: {... {1}: '{2}' ...}\",\n                    newIsolateScopeDirective.name, scopeName, definition);\n            }\n          });\n        }\n        transcludeFn = boundTranscludeFn && controllersBoundTransclude;\n        if (controllerDirectives) {\n          forEach(controllerDirectives, function(directive) {\n            var locals = {\n              $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,\n              $element: $element,\n              $attrs: attrs,\n              $transclude: transcludeFn\n            }, controllerInstance;\n\n            controller = directive.controller;\n            if (controller == '@') {\n              controller = attrs[directive.name];\n            }\n\n            controllerInstance = $controller(controller, locals);\n            // For directives with element transclusion the element is a comment,\n            // but jQuery .data doesn't support attaching data to comment nodes as it's hard to\n            // clean up (http://bugs.jquery.com/ticket/8335).\n            // Instead, we save the controllers for the element in a local hash and attach to .data\n            // later, once we have the actual element.\n            elementControllers[directive.name] = controllerInstance;\n            if (!hasElementTranscludeDirective) {\n              $element.data('$' + directive.name + 'Controller', controllerInstance);\n            }\n\n            if (directive.controllerAs) {\n              locals.$scope[directive.controllerAs] = controllerInstance;\n            }\n          });\n        }\n\n        // PRELINKING\n        for(i = 0, ii = preLinkFns.length; i < ii; i++) {\n          try {\n            linkFn = preLinkFns[i];\n            linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,\n                linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);\n          } catch (e) {\n            $exceptionHandler(e, startingTag($element));\n          }\n        }\n\n        // RECURSION\n        // We only pass the isolate scope, if the isolate directive has a template,\n        // otherwise the child elements do not belong to the isolate directive.\n        var scopeToChild = scope;\n        if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {\n          scopeToChild = isolateScope;\n        }\n        childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);\n\n        // POSTLINKING\n        for(i = postLinkFns.length - 1; i >= 0; i--) {\n          try {\n            linkFn = postLinkFns[i];\n            linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,\n                linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);\n          } catch (e) {\n            $exceptionHandler(e, startingTag($element));\n          }\n        }\n\n        // This is the function that is injected as `$transclude`.\n        function controllersBoundTransclude(scope, cloneAttachFn) {\n          var transcludeControllers;\n\n          // no scope passed\n          if (arguments.length < 2) {\n            cloneAttachFn = scope;\n            scope = undefined;\n          }\n\n          if (hasElementTranscludeDirective) {\n            transcludeControllers = elementControllers;\n          }\n\n          return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers);\n        }\n      }\n    }\n\n    function markDirectivesAsIsolate(directives) {\n      // mark all directives as needing isolate scope.\n      for (var j = 0, jj = directives.length; j < jj; j++) {\n        directives[j] = inherit(directives[j], {$$isolateScope: true});\n      }\n    }\n\n    /**\n     * looks up the directive and decorates it with exception handling and proper parameters. We\n     * call this the boundDirective.\n     *\n     * @param {string} name name of the directive to look up.\n     * @param {string} location The directive must be found in specific format.\n     *   String containing any of theses characters:\n     *\n     *   * `E`: element name\n     *   * `A': attribute\n     *   * `C`: class\n     *   * `M`: comment\n     * @returns {boolean} true if directive was added.\n     */\n    function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,\n                          endAttrName) {\n      if (name === ignoreDirective) return null;\n      var match = null;\n      if (hasDirectives.hasOwnProperty(name)) {\n        for(var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i<ii; i++) {\n          try {\n            directive = directives[i];\n            if ( (maxPriority === undefined || maxPriority > directive.priority) &&\n                 directive.restrict.indexOf(location) != -1) {\n              if (startAttrName) {\n                directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});\n              }\n              tDirectives.push(directive);\n              match = directive;\n            }\n          } catch(e) { $exceptionHandler(e); }\n        }\n      }\n      return match;\n    }\n\n\n    /**\n     * When the element is replaced with HTML template then the new attributes\n     * on the template need to be merged with the existing attributes in the DOM.\n     * The desired effect is to have both of the attributes present.\n     *\n     * @param {object} dst destination attributes (original DOM)\n     * @param {object} src source attributes (from the directive template)\n     */\n    function mergeTemplateAttributes(dst, src) {\n      var srcAttr = src.$attr,\n          dstAttr = dst.$attr,\n          $element = dst.$$element;\n\n      // reapply the old attributes to the new element\n      forEach(dst, function(value, key) {\n        if (key.charAt(0) != '$') {\n          if (src[key] && src[key] !== value) {\n            value += (key === 'style' ? ';' : ' ') + src[key];\n          }\n          dst.$set(key, value, true, srcAttr[key]);\n        }\n      });\n\n      // copy the new attributes on the old attrs object\n      forEach(src, function(value, key) {\n        if (key == 'class') {\n          safeAddClass($element, value);\n          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;\n        } else if (key == 'style') {\n          $element.attr('style', $element.attr('style') + ';' + value);\n          dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;\n          // `dst` will never contain hasOwnProperty as DOM parser won't let it.\n          // You will get an \"InvalidCharacterError: DOM Exception 5\" error if you\n          // have an attribute like \"has-own-property\" or \"data-has-own-property\", etc.\n        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {\n          dst[key] = value;\n          dstAttr[key] = srcAttr[key];\n        }\n      });\n    }\n\n\n    function compileTemplateUrl(directives, $compileNode, tAttrs,\n        $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {\n      var linkQueue = [],\n          afterTemplateNodeLinkFn,\n          afterTemplateChildLinkFn,\n          beforeTemplateCompileNode = $compileNode[0],\n          origAsyncDirective = directives.shift(),\n          // The fact that we have to copy and patch the directive seems wrong!\n          derivedSyncDirective = extend({}, origAsyncDirective, {\n            templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective\n          }),\n          templateUrl = (isFunction(origAsyncDirective.templateUrl))\n              ? origAsyncDirective.templateUrl($compileNode, tAttrs)\n              : origAsyncDirective.templateUrl,\n          type = origAsyncDirective.type;\n\n      $compileNode.empty();\n\n      $http.get($sce.getTrustedResourceUrl(templateUrl), {cache: $templateCache}).\n        success(function(content) {\n          var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;\n\n          content = denormalizeTemplate(content);\n\n          if (origAsyncDirective.replace) {\n            if (jqLiteIsTextNode(content)) {\n              $template = [];\n            } else {\n              $template = jqLite(wrapTemplate(type, trim(content)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  origAsyncDirective.name, templateUrl);\n            }\n\n            tempTemplateAttrs = {$attr: {}};\n            replaceWith($rootElement, $compileNode, compileNode);\n            var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);\n\n            if (isObject(origAsyncDirective.scope)) {\n              markDirectivesAsIsolate(templateDirectives);\n            }\n            directives = templateDirectives.concat(directives);\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\n          } else {\n            compileNode = beforeTemplateCompileNode;\n            $compileNode.html(content);\n          }\n\n          directives.unshift(derivedSyncDirective);\n\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,\n              childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,\n              previousCompileContext);\n          forEach($rootElement, function(node, i) {\n            if (node == compileNode) {\n              $rootElement[i] = $compileNode[0];\n            }\n          });\n          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);\n\n\n          while(linkQueue.length) {\n            var scope = linkQueue.shift(),\n                beforeTemplateLinkNode = linkQueue.shift(),\n                linkRootElement = linkQueue.shift(),\n                boundTranscludeFn = linkQueue.shift(),\n                linkNode = $compileNode[0];\n\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\n              var oldClasses = beforeTemplateLinkNode.className;\n\n              if (!(previousCompileContext.hasElementTranscludeDirective &&\n                  origAsyncDirective.replace)) {\n                // it was cloned therefore we have to clone as well.\n                linkNode = jqLiteClone(compileNode);\n              }\n\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\n\n              // Copy in CSS classes from original node\n              safeAddClass(jqLite(linkNode), oldClasses);\n            }\n            if (afterTemplateNodeLinkFn.transclude) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude);\n            } else {\n              childBoundTranscludeFn = boundTranscludeFn;\n            }\n            afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,\n              childBoundTranscludeFn);\n          }\n          linkQueue = null;\n        }).\n        error(function(response, code, headers, config) {\n          throw $compileMinErr('tpload', 'Failed to load template: {0}', config.url);\n        });\n\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {\n        if (linkQueue) {\n          linkQueue.push(scope);\n          linkQueue.push(node);\n          linkQueue.push(rootElement);\n          linkQueue.push(boundTranscludeFn);\n        } else {\n          afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, boundTranscludeFn);\n        }\n      };\n    }\n\n\n    /**\n     * Sorting function for bound directives.\n     */\n    function byPriority(a, b) {\n      var diff = b.priority - a.priority;\n      if (diff !== 0) return diff;\n      if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;\n      return a.index - b.index;\n    }\n\n\n    function assertNoDuplicate(what, previousDirective, directive, element) {\n      if (previousDirective) {\n        throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',\n            previousDirective.name, directive.name, what, startingTag(element));\n      }\n    }\n\n\n    function addTextInterpolateDirective(directives, text) {\n      var interpolateFn = $interpolate(text, true);\n      if (interpolateFn) {\n        directives.push({\n          priority: 0,\n          compile: valueFn(function textInterpolateLinkFn(scope, node) {\n            var parent = node.parent(),\n                bindings = parent.data('$binding') || [];\n            // Need to interpolate again in case this is using one-time bindings in multiple clones\n            // of transcluded templates.\n            interpolateFn = $interpolate(text);\n            bindings.push(interpolateFn);\n            safeAddClass(parent.data('$binding', bindings), 'ng-binding');\n            scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {\n              node[0].nodeValue = value;\n            });\n          })\n        });\n      }\n    }\n\n\n    function wrapTemplate(type, template) {\n      type = lowercase(type || 'html');\n      switch(type) {\n      case 'svg':\n      case 'math':\n        var wrapper = document.createElement('div');\n        wrapper.innerHTML = '<'+type+'>'+template+'</'+type+'>';\n        return wrapper.childNodes[0].childNodes;\n      default:\n        return template;\n      }\n    }\n\n\n    function getTrustedContext(node, attrNormalizedName) {\n      if (attrNormalizedName == \"srcdoc\") {\n        return $sce.HTML;\n      }\n      var tag = nodeName_(node);\n      // maction[xlink:href] can source SVG.  It's not limited to <maction>.\n      if (attrNormalizedName == \"xlinkHref\" ||\n          (tag == \"FORM\" && attrNormalizedName == \"action\") ||\n          (tag != \"IMG\" && (attrNormalizedName == \"src\" ||\n                            attrNormalizedName == \"ngSrc\"))) {\n        return $sce.RESOURCE_URL;\n      }\n    }\n\n\n    function addAttrInterpolateDirective(node, directives, value, name) {\n      var interpolateFn = $interpolate(value, true);\n\n      // no interpolation found -> ignore\n      if (!interpolateFn) return;\n\n\n      if (name === \"multiple\" && nodeName_(node) === \"SELECT\") {\n        throw $compileMinErr(\"selmulti\",\n            \"Binding to the 'multiple' attribute is not supported. Element: {0}\",\n            startingTag(node));\n      }\n\n      directives.push({\n        priority: 100,\n        compile: function() {\n            return {\n              pre: function attrInterpolatePreLinkFn(scope, element, attr) {\n                var $$observers = (attr.$$observers || (attr.$$observers = {}));\n\n                if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {\n                  throw $compileMinErr('nodomevents',\n                      \"Interpolations for HTML DOM event attributes are disallowed.  Please use the \" +\n                          \"ng- versions (such as ng-click instead of onclick) instead.\");\n                }\n\n                // we need to interpolate again, in case the attribute value has been updated\n                // (e.g. by another directive's compile function)\n                interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name),\n                    ALL_OR_NOTHING_ATTRS[name]);\n\n                // if attribute was updated so that there is no interpolation going on we don't want to\n                // register any observers\n                if (!interpolateFn) return;\n\n                // initialize attr object so that it's ready in case we need the value for isolate\n                // scope initialization, otherwise the value would not be available from isolate\n                // directive's linking fn during linking phase\n                attr[name] = interpolateFn(scope);\n\n                ($$observers[name] || ($$observers[name] = [])).$$inter = true;\n                (attr.$$observers && attr.$$observers[name].$$scope || scope).\n                  $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {\n                    //special case for class attribute addition + removal\n                    //so that class changes can tap into the animation\n                    //hooks provided by the $animate service. Be sure to\n                    //skip animations when the first digest occurs (when\n                    //both the new and the old values are the same) since\n                    //the CSS classes are the non-interpolated values\n                    if(name === 'class' && newValue != oldValue) {\n                      attr.$updateClass(newValue, oldValue);\n                    } else {\n                      attr.$set(name, newValue);\n                    }\n                  });\n              }\n            };\n          }\n      });\n    }\n\n\n    /**\n     * This is a special jqLite.replaceWith, which can replace items which\n     * have no parents, provided that the containing jqLite collection is provided.\n     *\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\n     *                               in the root of the tree.\n     * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep\n     *                                  the shell, but replace its DOM node reference.\n     * @param {Node} newNode The new DOM node.\n     */\n    function replaceWith($rootElement, elementsToRemove, newNode) {\n      var firstElementToRemove = elementsToRemove[0],\n          removeCount = elementsToRemove.length,\n          parent = firstElementToRemove.parentNode,\n          i, ii;\n\n      if ($rootElement) {\n        for(i = 0, ii = $rootElement.length; i < ii; i++) {\n          if ($rootElement[i] == firstElementToRemove) {\n            $rootElement[i++] = newNode;\n            for (var j = i, j2 = j + removeCount - 1,\n                     jj = $rootElement.length;\n                 j < jj; j++, j2++) {\n              if (j2 < jj) {\n                $rootElement[j] = $rootElement[j2];\n              } else {\n                delete $rootElement[j];\n              }\n            }\n            $rootElement.length -= removeCount - 1;\n            break;\n          }\n        }\n      }\n\n      if (parent) {\n        parent.replaceChild(newNode, firstElementToRemove);\n      }\n      var fragment = document.createDocumentFragment();\n      fragment.appendChild(firstElementToRemove);\n      newNode[jqLite.expando] = firstElementToRemove[jqLite.expando];\n      for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {\n        var element = elementsToRemove[k];\n        jqLite(element).remove(); // must do this way to clean up expando\n        fragment.appendChild(element);\n        delete elementsToRemove[k];\n      }\n\n      elementsToRemove[0] = newNode;\n      elementsToRemove.length = 1;\n    }\n\n\n    function cloneAndAnnotateFn(fn, annotation) {\n      return extend(function() { return fn.apply(null, arguments); }, fn, annotation);\n    }\n  }];\n}\n\nvar PREFIX_REGEXP = /^(x[\\:\\-_]|data[\\:\\-_])/i;\n/**\n * Converts all accepted directives format into proper directive name.\n * All of these will become 'myDirective':\n *   my:Directive\n *   my-directive\n *   x-my-directive\n *   data-my:directive\n *\n * Also there is special case for Moz prefix starting with upper case letter.\n * @param name Name to normalize\n */\nfunction directiveNormalize(name) {\n  return camelCase(name.replace(PREFIX_REGEXP, ''));\n}\n\n/**\n * @ngdoc type\n * @name $compile.directive.Attributes\n *\n * @description\n * A shared object between directive compile / linking functions which contains normalized DOM\n * element attributes. The values reflect current binding state `{{ }}`. The normalization is\n * needed since all of these are treated as equivalent in Angular:\n *\n * ```\n *    <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\n * ```\n */\n\n/**\n * @ngdoc property\n * @name $compile.directive.Attributes#$attr\n * @returns {object} A map of DOM element attribute names to the normalized name. This is\n *                   needed to do reverse lookup from normalized name back to actual name.\n */\n\n\n/**\n * @ngdoc method\n * @name $compile.directive.Attributes#$set\n * @function\n *\n * @description\n * Set DOM element attribute value.\n *\n *\n * @param {string} name Normalized element attribute name of the property to modify. The name is\n *          reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\n *          property to the original name.\n * @param {string} value Value to set the attribute to. The value can be an interpolated string.\n */\n\n\n\n/**\n * Closure compiler type information\n */\n\nfunction nodesetLinkingFn(\n  /* angular.Scope */ scope,\n  /* NodeList */ nodeList,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n){}\n\nfunction directiveLinkingFn(\n  /* nodesetLinkingFn */ nodesetLinkingFn,\n  /* angular.Scope */ scope,\n  /* Node */ node,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n){}\n\nfunction tokenDifference(str1, str2) {\n  var values = '',\n      tokens1 = str1.split(/\\s+/),\n      tokens2 = str2.split(/\\s+/);\n\n  outer:\n  for(var i = 0; i < tokens1.length; i++) {\n    var token = tokens1[i];\n    for(var j = 0; j < tokens2.length; j++) {\n      if(token == tokens2[j]) continue outer;\n    }\n    values += (values.length > 0 ? ' ' : '') + token;\n  }\n  return values;\n}\n\n/**\n * @ngdoc provider\n * @name $controllerProvider\n * @description\n * The {@link ng.$controller $controller service} is used by Angular to create new\n * controllers.\n *\n * This provider allows controller registration via the\n * {@link ng.$controllerProvider#register register} method.\n */\nfunction $ControllerProvider() {\n  var controllers = {},\n      CNTRL_REG = /^(\\S+)(\\s+as\\s+(\\w+))?$/;\n\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Controller name, or an object map of controllers where the keys are\n   *    the names and the values are the constructors.\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\n   *    annotations in the array notation).\n   */\n  this.register = function(name, constructor) {\n    assertNotHasOwnProperty(name, 'controller');\n    if (isObject(name)) {\n      extend(controllers, name);\n    } else {\n      controllers[name] = constructor;\n    }\n  };\n\n\n  this.$get = ['$injector', '$window', function($injector, $window) {\n\n    /**\n     * @ngdoc service\n     * @name $controller\n     * @requires $injector\n     *\n     * @param {Function|string} constructor If called with a function then it's considered to be the\n     *    controller constructor function. Otherwise it's considered to be a string which is used\n     *    to retrieve the controller constructor using the following steps:\n     *\n     *    * check if a controller with given name is registered via `$controllerProvider`\n     *    * check if evaluating the string on the current scope returns a constructor\n     *    * check `window[constructor]` on the global `window` object\n     *\n     * @param {Object} locals Injection locals for Controller.\n     * @return {Object} Instance of given controller.\n     *\n     * @description\n     * `$controller` service is responsible for instantiating controllers.\n     *\n     * It's just a simple call to {@link auto.$injector $injector}, but extracted into\n     * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).\n     */\n    return function(expression, locals) {\n      var instance, match, constructor, identifier;\n\n      if(isString(expression)) {\n        match = expression.match(CNTRL_REG),\n        constructor = match[1],\n        identifier = match[3];\n        expression = controllers.hasOwnProperty(constructor)\n            ? controllers[constructor]\n            : getter(locals.$scope, constructor, true) || getter($window, constructor, true);\n\n        assertArgFn(expression, constructor, true);\n      }\n\n      instance = $injector.instantiate(expression, locals, constructor);\n\n      if (identifier) {\n        if (!(locals && typeof locals.$scope == 'object')) {\n          throw minErr('$controller')('noscp',\n              \"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\",\n              constructor || expression.name, identifier);\n        }\n\n        locals.$scope[identifier] = instance;\n      }\n\n      return instance;\n    };\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $document\n * @requires $window\n *\n * @description\n * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div ng-controller=\"MainCtrl\">\n         <p>$document title: <b ng-bind=\"title\"></b></p>\n         <p>window.document title: <b ng-bind=\"windowTitle\"></b></p>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       function MainCtrl($scope, $document) {\n         $scope.title = $document[0].title;\n         $scope.windowTitle = angular.element(window.document)[0].title;\n       }\n     </file>\n   </example>\n */\nfunction $DocumentProvider(){\n  this.$get = ['$window', function(window){\n    return jqLite(window.document);\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n * @requires ng.$log\n *\n * @description\n * Any uncaught exception in angular expressions is delegated to this service.\n * The default implementation simply delegates to `$log.error` which logs it into\n * the browser console.\n *\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\n * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.\n *\n * ## Example:\n *\n * ```js\n *   angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {\n *     return function (exception, cause) {\n *       exception.message += ' (caused by \"' + cause + '\")';\n *       throw exception;\n *     };\n *   });\n * ```\n *\n * This example will override the normal action of `$exceptionHandler`, to make angular\n * exceptions fail hard when they happen, instead of just logging to the console.\n *\n * @param {Error} exception Exception associated with the error.\n * @param {string=} cause optional information about the context in which\n *       the error was thrown.\n *\n */\nfunction $ExceptionHandlerProvider() {\n  this.$get = ['$log', function($log) {\n    return function(exception, cause) {\n      $log.error.apply($log, arguments);\n    };\n  }];\n}\n\n/**\n * Parse headers into key value object\n *\n * @param {string} headers Raw headers as a string\n * @returns {Object} Parsed headers as key value object\n */\nfunction parseHeaders(headers) {\n  var parsed = {}, key, val, i;\n\n  if (!headers) return parsed;\n\n  forEach(headers.split('\\n'), function(line) {\n    i = line.indexOf(':');\n    key = lowercase(trim(line.substr(0, i)));\n    val = trim(line.substr(i + 1));\n\n    if (key) {\n      if (parsed[key]) {\n        parsed[key] += ', ' + val;\n      } else {\n        parsed[key] = val;\n      }\n    }\n  });\n\n  return parsed;\n}\n\n\n/**\n * Returns a function that provides access to parsed headers.\n *\n * Headers are lazy parsed when first requested.\n * @see parseHeaders\n *\n * @param {(string|Object)} headers Headers to provide access to.\n * @returns {function(string=)} Returns a getter function which if called with:\n *\n *   - if called with single an argument returns a single header value or null\n *   - if called with no arguments returns an object containing all headers.\n */\nfunction headersGetter(headers) {\n  var headersObj = isObject(headers) ? headers : undefined;\n\n  return function(name) {\n    if (!headersObj) headersObj =  parseHeaders(headers);\n\n    if (name) {\n      return headersObj[lowercase(name)] || null;\n    }\n\n    return headersObj;\n  };\n}\n\n\n/**\n * Chain all given functions\n *\n * This function is used for both request and response transforming\n *\n * @param {*} data Data to transform.\n * @param {function(string=)} headers Http headers getter fn.\n * @param {(Function|Array.<Function>)} fns Function or an array of functions.\n * @returns {*} Transformed data.\n */\nfunction transformData(data, headers, fns) {\n  if (isFunction(fns))\n    return fns(data, headers);\n\n  forEach(fns, function(fn) {\n    data = fn(data, headers);\n  });\n\n  return data;\n}\n\n\nfunction isSuccess(status) {\n  return 200 <= status && status < 300;\n}\n\n\nfunction $HttpProvider() {\n  var JSON_START = /^\\s*(\\[|\\{[^\\{])/,\n      JSON_END = /[\\}\\]]\\s*$/,\n      PROTECTION_PREFIX = /^\\)\\]\\}',?\\n/,\n      CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'};\n\n  var defaults = this.defaults = {\n    // transform incoming response data\n    transformResponse: [function(data) {\n      if (isString(data)) {\n        // strip json vulnerability protection prefix\n        data = data.replace(PROTECTION_PREFIX, '');\n        if (JSON_START.test(data) && JSON_END.test(data))\n          data = fromJson(data);\n      }\n      return data;\n    }],\n\n    // transform outgoing request data\n    transformRequest: [function(d) {\n      return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;\n    }],\n\n    // default headers\n    headers: {\n      common: {\n        'Accept': 'application/json, text/plain, */*'\n      },\n      post:   copy(CONTENT_TYPE_APPLICATION_JSON),\n      put:    copy(CONTENT_TYPE_APPLICATION_JSON),\n      patch:  copy(CONTENT_TYPE_APPLICATION_JSON)\n    },\n\n    xsrfCookieName: 'XSRF-TOKEN',\n    xsrfHeaderName: 'X-XSRF-TOKEN'\n  };\n\n  /**\n   * Are ordered by request, i.e. they are applied in the same order as the\n   * array, on request, but reverse order, on response.\n   */\n  var interceptorFactories = this.interceptors = [];\n\n  this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',\n      function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {\n\n    var defaultCache = $cacheFactory('$http');\n\n    /**\n     * Interceptors stored in reverse order. Inner interceptors before outer interceptors.\n     * The reversal is needed so that we can build up the interception chain around the\n     * server request.\n     */\n    var reversedInterceptors = [];\n\n    forEach(interceptorFactories, function(interceptorFactory) {\n      reversedInterceptors.unshift(isString(interceptorFactory)\n          ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\n    });\n\n    /**\n     * @ngdoc service\n     * @kind function\n     * @name $http\n     * @requires ng.$httpBackend\n     * @requires $cacheFactory\n     * @requires $rootScope\n     * @requires $q\n     * @requires $injector\n     *\n     * @description\n     * The `$http` service is a core Angular service that facilitates communication with the remote\n     * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)\n     * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).\n     *\n     * For unit testing applications that use `$http` service, see\n     * {@link ngMock.$httpBackend $httpBackend mock}.\n     *\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\n     * $resource} service.\n     *\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\n     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage\n     * it is important to familiarize yourself with these APIs and the guarantees they provide.\n     *\n     *\n     * # General usage\n     * The `$http` service is a function which takes a single argument — a configuration object —\n     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}\n     * with two $http specific methods: `success` and `error`.\n     *\n     * ```js\n     *   $http({method: 'GET', url: '/someUrl'}).\n     *     success(function(data, status, headers, config) {\n     *       // this callback will be called asynchronously\n     *       // when the response is available\n     *     }).\n     *     error(function(data, status, headers, config) {\n     *       // called asynchronously if an error occurs\n     *       // or server returns response with an error status.\n     *     });\n     * ```\n     *\n     * Since the returned value of calling the $http function is a `promise`, you can also use\n     * the `then` method to register callbacks, and these callbacks will receive a single argument –\n     * an object representing the response. See the API signature and type info below for more\n     * details.\n     *\n     * A response status code between 200 and 299 is considered a success status and\n     * will result in the success callback being called. Note that if the response is a redirect,\n     * XMLHttpRequest will transparently follow it, meaning that the error callback will not be\n     * called for such responses.\n     *\n     * # Writing Unit Tests that use $http\n     * When unit testing (using {@link ngMock ngMock}), it is necessary to call\n     * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending\n     * request using trained responses.\n     *\n     * ```\n     * $httpBackend.expectGET(...);\n     * $http.get(...);\n     * $httpBackend.flush();\n     * ```\n     *\n     * # Shortcut methods\n     *\n     * Shortcut methods are also available. All shortcut methods require passing in the URL, and\n     * request data must be passed in for POST/PUT requests.\n     *\n     * ```js\n     *   $http.get('/someUrl').success(successCallback);\n     *   $http.post('/someUrl', data).success(successCallback);\n     * ```\n     *\n     * Complete list of shortcut methods:\n     *\n     * - {@link ng.$http#get $http.get}\n     * - {@link ng.$http#head $http.head}\n     * - {@link ng.$http#post $http.post}\n     * - {@link ng.$http#put $http.put}\n     * - {@link ng.$http#delete $http.delete}\n     * - {@link ng.$http#jsonp $http.jsonp}\n     *\n     *\n     * # Setting HTTP Headers\n     *\n     * The $http service will automatically add certain HTTP headers to all requests. These defaults\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\n     * object, which currently contains this default configuration:\n     *\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\n     *   - `Accept: application/json, text/plain, * / *`\n     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)\n     *   - `Content-Type: application/json`\n     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)\n     *   - `Content-Type: application/json`\n     *\n     * To add or overwrite these defaults, simply add or remove a property from these configuration\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\n     * with the lowercased HTTP method name as the key, e.g.\n     * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.\n     *\n     * The defaults can also be set at runtime via the `$http.defaults` object in the same\n     * fashion. For example:\n     *\n     * ```\n     * module.run(function($http) {\n     *   $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'\n     * });\n     * ```\n     *\n     * In addition, you can supply a `headers` property in the config object passed when\n     * calling `$http(config)`, which overrides the defaults without changing them globally.\n     *\n     *\n     * # Transforming Requests and Responses\n     *\n     * Both requests and responses can be transformed using transform functions. By default, Angular\n     * applies these transformations:\n     *\n     * Request transformations:\n     *\n     * - If the `data` property of the request configuration object contains an object, serialize it\n     *   into JSON format.\n     *\n     * Response transformations:\n     *\n     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).\n     *  - If JSON response is detected, deserialize it using a JSON parser.\n     *\n     * To globally augment or override the default transforms, modify the\n     * `$httpProvider.defaults.transformRequest` and `$httpProvider.defaults.transformResponse`\n     * properties. These properties are by default an array of transform functions, which allows you\n     * to `push` or `unshift` a new transformation function into the transformation chain. You can\n     * also decide to completely override any default transformations by assigning your\n     * transformation functions to these properties directly without the array wrapper.  These defaults\n     * are again available on the $http factory at run-time, which may be useful if you have run-time\n     * services you wish to be involved in your transformations.\n     *\n     * Similarly, to locally override the request/response transforms, augment the\n     * `transformRequest` and/or `transformResponse` properties of the configuration object passed\n     * into `$http`.\n     *\n     *\n     * # Caching\n     *\n     * To enable caching, set the request configuration `cache` property to `true` (to use default\n     * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}).\n     * When the cache is enabled, `$http` stores the response from the server in the specified\n     * cache. The next time the same request is made, the response is served from the cache without\n     * sending a request to the server.\n     *\n     * Note that even if the response is served from cache, delivery of the data is asynchronous in\n     * the same way that real requests are.\n     *\n     * If there are multiple GET requests for the same URL that should be cached using the same\n     * cache, but the cache is not populated yet, only one request to the server will be made and\n     * the remaining requests will be fulfilled using the response from the first request.\n     *\n     * You can change the default cache to a new object (built with\n     * {@link ng.$cacheFactory `$cacheFactory`}) by updating the\n     * {@link ng.$http#properties_defaults `$http.defaults.cache`} property. All requests who set\n     * their `cache` property to `true` will now use this cache object.\n     *\n     * If you set the default cache to `false` then only requests that specify their own custom\n     * cache object will be cached.\n     *\n     * # Interceptors\n     *\n     * Before you start creating interceptors, be sure to understand the\n     * {@link ng.$q $q and deferred/promise APIs}.\n     *\n     * For purposes of global error handling, authentication, or any kind of synchronous or\n     * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be\n     * able to intercept requests before they are handed to the server and\n     * responses before they are handed over to the application code that\n     * initiated these requests. The interceptors leverage the {@link ng.$q\n     * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.\n     *\n     * The interceptors are service factories that are registered with the `$httpProvider` by\n     * adding them to the `$httpProvider.interceptors` array. The factory is called and\n     * injected with dependencies (if specified) and returns the interceptor.\n     *\n     * There are two kinds of interceptors (and two kinds of rejection interceptors):\n     *\n     *   * `request`: interceptors get called with a http `config` object. The function is free to\n     *     modify the `config` object or create a new one. The function needs to return the `config`\n     *     object directly, or a promise containing the `config` or a new `config` object.\n     *   * `requestError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *   * `response`: interceptors get called with http `response` object. The function is free to\n     *     modify the `response` object or create a new one. The function needs to return the `response`\n     *     object directly, or as a promise containing the `response` or a new `response` object.\n     *   * `responseError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *\n     *\n     * ```js\n     *   // register the interceptor as a service\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\n     *     return {\n     *       // optional method\n     *       'request': function(config) {\n     *         // do something on success\n     *         return config;\n     *       },\n     *\n     *       // optional method\n     *      'requestError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       },\n     *\n     *\n     *\n     *       // optional method\n     *       'response': function(response) {\n     *         // do something on success\n     *         return response;\n     *       },\n     *\n     *       // optional method\n     *      'responseError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       }\n     *     };\n     *   });\n     *\n     *   $httpProvider.interceptors.push('myHttpInterceptor');\n     *\n     *\n     *   // alternatively, register the interceptor via an anonymous factory\n     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {\n     *     return {\n     *      'request': function(config) {\n     *          // same as above\n     *       },\n     *\n     *       'response': function(response) {\n     *          // same as above\n     *       }\n     *     };\n     *   });\n     * ```\n     *\n     * # Security Considerations\n     *\n     * When designing web applications, consider security threats from:\n     *\n     * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\n     *\n     * Both server and the client must cooperate in order to eliminate these threats. Angular comes\n     * pre-configured with strategies that address these issues, but for this to work backend server\n     * cooperation is required.\n     *\n     * ## JSON Vulnerability Protection\n     *\n     * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * allows third party website to turn your JSON resource URL into\n     * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\n     * Angular will automatically strip the prefix before processing it as JSON.\n     *\n     * For example if your server needs to return:\n     * ```js\n     * ['one','two']\n     * ```\n     *\n     * which is vulnerable to attack, your server can return:\n     * ```js\n     * )]}',\n     * ['one','two']\n     * ```\n     *\n     * Angular will strip the prefix, before processing the JSON.\n     *\n     *\n     * ## Cross Site Request Forgery (XSRF) Protection\n     *\n     * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which\n     * an unauthorized site can gain your user's private data. Angular provides a mechanism\n     * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie\n     * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only\n     * JavaScript that runs on your domain could read the cookie, your server can be assured that\n     * the XHR came from JavaScript running on your domain. The header will not be set for\n     * cross-domain requests.\n     *\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\n     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the\n     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\n     * that only JavaScript running on your domain could have sent the request. The token must be\n     * unique for each user and must be verifiable by the server (to prevent the JavaScript from\n     * making up its own tokens). We recommend that the token is a digest of your site's\n     * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography))\n     * for added security.\n     *\n     * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName\n     * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,\n     * or the per-request config object.\n     *\n     *\n     * @param {object} config Object describing the request to be made and how it should be\n     *    processed. The object has following properties:\n     *\n     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)\n     *    - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.\n     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned\n     *      to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be\n     *      JSONified.\n     *    - **data** – `{string|Object}` – Data to be sent as the request message data.\n     *    - **headers** – `{Object}` – Map of strings or functions which return strings representing\n     *      HTTP headers to send to the server. If the return value of a function is null, the\n     *      header will not be sent.\n     *    - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.\n     *    - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.\n     *    - **transformRequest** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      request body and headers and returns its transformed (typically serialized) version.\n     *    - **transformResponse** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      response body and headers and returns its transformed (typically deserialized) version.\n     *    - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the\n     *      GET request, otherwise if a cache instance built with\n     *      {@link ng.$cacheFactory $cacheFactory}, this cache will be used for\n     *      caching.\n     *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}\n     *      that should abort the request when resolved.\n     *    - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the\n     *      XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5\n     *      for more information.\n     *    - **responseType** - `{string}` - see\n     *      [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).\n     *\n     * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the\n     *   standard `then` method and two http specific methods: `success` and `error`. The `then`\n     *   method takes two arguments a success and an error callback which will be called with a\n     *   response object. The `success` and `error` methods take a single argument - a function that\n     *   will be called when the request succeeds or fails respectively. The arguments passed into\n     *   these functions are destructured representation of the response object passed into the\n     *   `then` method. The response object has these properties:\n     *\n     *   - **data** – `{string|Object}` – The response body transformed with the transform\n     *     functions.\n     *   - **status** – `{number}` – HTTP status code of the response.\n     *   - **headers** – `{function([headerName])}` – Header getter function.\n     *   - **config** – `{Object}` – The configuration object that was used to generate the request.\n     *   - **statusText** – `{string}` – HTTP status text of the response.\n     *\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\n     *   requests. This is primarily meant to be used for debugging purposes.\n     *\n     *\n     * @example\n<example>\n<file name=\"index.html\">\n  <div ng-controller=\"FetchCtrl\">\n    <select ng-model=\"method\">\n      <option>GET</option>\n      <option>JSONP</option>\n    </select>\n    <input type=\"text\" ng-model=\"url\" size=\"80\"/>\n    <button id=\"fetchbtn\" ng-click=\"fetch()\">fetch</button><br>\n    <button id=\"samplegetbtn\" ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\n    <button id=\"samplejsonpbtn\"\n      ng-click=\"updateModel('JSONP',\n                    'http://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')\">\n      Sample JSONP\n    </button>\n    <button id=\"invalidjsonpbtn\"\n      ng-click=\"updateModel('JSONP', 'http://angularjs.org/doesntexist&callback=JSON_CALLBACK')\">\n        Invalid JSONP\n      </button>\n    <pre>http status code: {{status}}</pre>\n    <pre>http response data: {{data}}</pre>\n  </div>\n</file>\n<file name=\"script.js\">\n  function FetchCtrl($scope, $http, $templateCache) {\n    $scope.method = 'GET';\n    $scope.url = 'http-hello.html';\n\n    $scope.fetch = function() {\n      $scope.code = null;\n      $scope.response = null;\n\n      $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\n        success(function(data, status) {\n          $scope.status = status;\n          $scope.data = data;\n        }).\n        error(function(data, status) {\n          $scope.data = data || \"Request failed\";\n          $scope.status = status;\n      });\n    };\n\n    $scope.updateModel = function(method, url) {\n      $scope.method = method;\n      $scope.url = url;\n    };\n  }\n</file>\n<file name=\"http-hello.html\">\n  Hello, $http!\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  var status = element(by.binding('status'));\n  var data = element(by.binding('data'));\n  var fetchBtn = element(by.id('fetchbtn'));\n  var sampleGetBtn = element(by.id('samplegetbtn'));\n  var sampleJsonpBtn = element(by.id('samplejsonpbtn'));\n  var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));\n\n  it('should make an xhr GET request', function() {\n    sampleGetBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Hello, \\$http!/);\n  });\n\n  it('should make a JSONP request to angularjs.org', function() {\n    sampleJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Super Hero!/);\n  });\n\n  it('should make JSONP request to invalid URL and invoke the error handler',\n      function() {\n    invalidJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('0');\n    expect(data.getText()).toMatch('Request failed');\n  });\n</file>\n</example>\n     */\n    function $http(requestConfig) {\n      var config = {\n        method: 'get',\n        transformRequest: defaults.transformRequest,\n        transformResponse: defaults.transformResponse\n      };\n      var headers = mergeHeaders(requestConfig);\n\n      extend(config, requestConfig);\n      config.headers = headers;\n      config.method = uppercase(config.method);\n\n      var xsrfValue = urlIsSameOrigin(config.url)\n          ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]\n          : undefined;\n      if (xsrfValue) {\n        headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;\n      }\n\n\n      var serverRequest = function(config) {\n        headers = config.headers;\n        var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);\n\n        // strip content-type if data is undefined\n        if (isUndefined(config.data)) {\n          forEach(headers, function(value, header) {\n            if (lowercase(header) === 'content-type') {\n                delete headers[header];\n            }\n          });\n        }\n\n        if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {\n          config.withCredentials = defaults.withCredentials;\n        }\n\n        // send request\n        return sendReq(config, reqData, headers).then(transformResponse, transformResponse);\n      };\n\n      var chain = [serverRequest, undefined];\n      var promise = $q.when(config);\n\n      // apply interceptors\n      forEach(reversedInterceptors, function(interceptor) {\n        if (interceptor.request || interceptor.requestError) {\n          chain.unshift(interceptor.request, interceptor.requestError);\n        }\n        if (interceptor.response || interceptor.responseError) {\n          chain.push(interceptor.response, interceptor.responseError);\n        }\n      });\n\n      while(chain.length) {\n        var thenFn = chain.shift();\n        var rejectFn = chain.shift();\n\n        promise = promise.then(thenFn, rejectFn);\n      }\n\n      promise.success = function(fn) {\n        promise.then(function(response) {\n          fn(response.data, response.status, response.headers, config);\n        });\n        return promise;\n      };\n\n      promise.error = function(fn) {\n        promise.then(null, function(response) {\n          fn(response.data, response.status, response.headers, config);\n        });\n        return promise;\n      };\n\n      return promise;\n\n      function transformResponse(response) {\n        // make a copy since the response must be cacheable\n        var resp = extend({}, response, {\n          data: transformData(response.data, response.headers, config.transformResponse)\n        });\n        return (isSuccess(response.status))\n          ? resp\n          : $q.reject(resp);\n      }\n\n      function mergeHeaders(config) {\n        var defHeaders = defaults.headers,\n            reqHeaders = extend({}, config.headers),\n            defHeaderName, lowercaseDefHeaderName, reqHeaderName;\n\n        defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);\n\n        // execute if header value is function\n        execHeaders(defHeaders);\n        execHeaders(reqHeaders);\n\n        // using for-in instead of forEach to avoid unecessary iteration after header has been found\n        defaultHeadersIteration:\n        for (defHeaderName in defHeaders) {\n          lowercaseDefHeaderName = lowercase(defHeaderName);\n\n          for (reqHeaderName in reqHeaders) {\n            if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {\n              continue defaultHeadersIteration;\n            }\n          }\n\n          reqHeaders[defHeaderName] = defHeaders[defHeaderName];\n        }\n\n        return reqHeaders;\n\n        function execHeaders(headers) {\n          var headerContent;\n\n          forEach(headers, function(headerFn, header) {\n            if (isFunction(headerFn)) {\n              headerContent = headerFn();\n              if (headerContent != null) {\n                headers[header] = headerContent;\n              } else {\n                delete headers[header];\n              }\n            }\n          });\n        }\n      }\n    }\n\n    $http.pendingRequests = [];\n\n    /**\n     * @ngdoc method\n     * @name $http#get\n     *\n     * @description\n     * Shortcut method to perform `GET` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#delete\n     *\n     * @description\n     * Shortcut method to perform `DELETE` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#head\n     *\n     * @description\n     * Shortcut method to perform `HEAD` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#jsonp\n     *\n     * @description\n     * Shortcut method to perform `JSONP` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request.\n     *                     Should contain `JSON_CALLBACK` string.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n    createShortMethods('get', 'delete', 'head', 'jsonp');\n\n    /**\n     * @ngdoc method\n     * @name $http#post\n     *\n     * @description\n     * Shortcut method to perform `POST` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#put\n     *\n     * @description\n     * Shortcut method to perform `PUT` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n    createShortMethodsWithData('post', 'put');\n\n        /**\n         * @ngdoc property\n         * @name $http#defaults\n         *\n         * @description\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\n         * default headers, withCredentials as well as request and response transformations.\n         *\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\n         */\n    $http.defaults = defaults;\n\n\n    return $http;\n\n\n    function createShortMethods(names) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, config) {\n          return $http(extend(config || {}, {\n            method: name,\n            url: url\n          }));\n        };\n      });\n    }\n\n\n    function createShortMethodsWithData(name) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, data, config) {\n          return $http(extend(config || {}, {\n            method: name,\n            url: url,\n            data: data\n          }));\n        };\n      });\n    }\n\n\n    /**\n     * Makes the request.\n     *\n     * !!! ACCESSES CLOSURE VARS:\n     * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests\n     */\n    function sendReq(config, reqData, reqHeaders) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          cache,\n          cachedResp,\n          url = buildUrl(config.url, config.params);\n\n      $http.pendingRequests.push(config);\n      promise.then(removePendingReq, removePendingReq);\n\n\n      if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') {\n        cache = isObject(config.cache) ? config.cache\n              : isObject(defaults.cache) ? defaults.cache\n              : defaultCache;\n      }\n\n      if (cache) {\n        cachedResp = cache.get(url);\n        if (isDefined(cachedResp)) {\n          if (cachedResp.then) {\n            // cached request has already been sent, but there is no response yet\n            cachedResp.then(removePendingReq, removePendingReq);\n            return cachedResp;\n          } else {\n            // serving from cache\n            if (isArray(cachedResp)) {\n              resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2]), cachedResp[3]);\n            } else {\n              resolvePromise(cachedResp, 200, {}, 'OK');\n            }\n          }\n        } else {\n          // put the promise for the non-transformed response into cache as a placeholder\n          cache.put(url, promise);\n        }\n      }\n\n      // if we won't have the response in cache, send the request to the backend\n      if (isUndefined(cachedResp)) {\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\n            config.withCredentials, config.responseType);\n      }\n\n      return promise;\n\n\n      /**\n       * Callback registered to $httpBackend():\n       *  - caches the response if desired\n       *  - resolves the raw $http promise\n       *  - calls $apply\n       */\n      function done(status, response, headersString, statusText) {\n        if (cache) {\n          if (isSuccess(status)) {\n            cache.put(url, [status, response, parseHeaders(headersString), statusText]);\n          } else {\n            // remove promise from the cache\n            cache.remove(url);\n          }\n        }\n\n        resolvePromise(response, status, headersString, statusText);\n        if (!$rootScope.$$phase) $rootScope.$apply();\n      }\n\n\n      /**\n       * Resolves the raw $http promise.\n       */\n      function resolvePromise(response, status, headers, statusText) {\n        // normalize internal statuses to 0\n        status = Math.max(status, 0);\n\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\n          data: response,\n          status: status,\n          headers: headersGetter(headers),\n          config: config,\n          statusText : statusText\n        });\n      }\n\n\n      function removePendingReq() {\n        var idx = indexOf($http.pendingRequests, config);\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\n      }\n    }\n\n\n    function buildUrl(url, params) {\n          if (!params) return url;\n          var parts = [];\n          forEachSorted(params, function(value, key) {\n            if (value === null || isUndefined(value)) return;\n            if (!isArray(value)) value = [value];\n\n            forEach(value, function(v) {\n              if (isObject(v)) {\n                v = toJson(v);\n              }\n              parts.push(encodeUriQuery(key) + '=' +\n                         encodeUriQuery(v));\n            });\n          });\n          if(parts.length > 0) {\n            url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');\n          }\n          return url;\n        }\n\n\n  }];\n}\n\nfunction createXhr(method) {\n    //if IE and the method is not RFC2616 compliant, or if XMLHttpRequest\n    //is not available, try getting an ActiveXObject. Otherwise, use XMLHttpRequest\n    //if it is available\n    if (msie <= 8 && (!method.match(/^(get|post|head|put|delete|options)$/i) ||\n      !window.XMLHttpRequest)) {\n      return new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n    } else if (window.XMLHttpRequest) {\n      return new window.XMLHttpRequest();\n    }\n\n    throw minErr('$httpBackend')('noxhr', \"This browser does not support XMLHttpRequest.\");\n}\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @requires $window\n * @requires $document\n *\n * @description\n * HTTP backend used by the {@link ng.$http service} that delegates to\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\n *\n * You should never need to use this service directly, instead use the higher-level abstractions:\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\n *\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\n * $httpBackend} which can be trained with responses.\n */\nfunction $HttpBackendProvider() {\n  this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {\n    return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]);\n  }];\n}\n\nfunction createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {\n  var ABORTED = -1;\n\n  // TODO(vojta): fix the signature\n  return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {\n    var status;\n    $browser.$$incOutstandingRequestCount();\n    url = url || $browser.url();\n\n    if (lowercase(method) == 'jsonp') {\n      var callbackId = '_' + (callbacks.counter++).toString(36);\n      callbacks[callbackId] = function(data) {\n        callbacks[callbackId].data = data;\n        callbacks[callbackId].called = true;\n      };\n\n      var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),\n          callbackId, function(status, text) {\n        completeRequest(callback, status, callbacks[callbackId].data, \"\", text);\n        callbacks[callbackId] = noop;\n      });\n    } else {\n\n      var xhr = createXhr(method);\n\n      xhr.open(method, url, true);\n      forEach(headers, function(value, key) {\n        if (isDefined(value)) {\n            xhr.setRequestHeader(key, value);\n        }\n      });\n\n      // In IE6 and 7, this might be called synchronously when xhr.send below is called and the\n      // response is in the cache. the promise api will ensure that to the app code the api is\n      // always async\n      xhr.onreadystatechange = function() {\n        // onreadystatechange might get called multiple times with readyState === 4 on mobile webkit caused by\n        // xhrs that are resolved while the app is in the background (see #5426).\n        // since calling completeRequest sets the `xhr` variable to null, we just check if it's not null before\n        // continuing\n        //\n        // we can't set xhr.onreadystatechange to undefined or delete it because that breaks IE8 (method=PATCH) and\n        // Safari respectively.\n        if (xhr && xhr.readyState == 4) {\n          var responseHeaders = null,\n              response = null;\n\n          if(status !== ABORTED) {\n            responseHeaders = xhr.getAllResponseHeaders();\n\n            // responseText is the old-school way of retrieving response (supported by IE8 & 9)\n            // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)\n            response = ('response' in xhr) ? xhr.response : xhr.responseText;\n          }\n\n          completeRequest(callback,\n              status || xhr.status,\n              response,\n              responseHeaders,\n              xhr.statusText || '');\n        }\n      };\n\n      if (withCredentials) {\n        xhr.withCredentials = true;\n      }\n\n      if (responseType) {\n        try {\n          xhr.responseType = responseType;\n        } catch (e) {\n          // WebKit added support for the json responseType value on 09/03/2013\n          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are\n          // known to throw when setting the value \"json\" as the response type. Other older\n          // browsers implementing the responseType\n          //\n          // The json response type can be ignored if not supported, because JSON payloads are\n          // parsed on the client-side regardless.\n          if (responseType !== 'json') {\n            throw e;\n          }\n        }\n      }\n\n      xhr.send(post || null);\n    }\n\n    if (timeout > 0) {\n      var timeoutId = $browserDefer(timeoutRequest, timeout);\n    } else if (timeout && timeout.then) {\n      timeout.then(timeoutRequest);\n    }\n\n\n    function timeoutRequest() {\n      status = ABORTED;\n      jsonpDone && jsonpDone();\n      xhr && xhr.abort();\n    }\n\n    function completeRequest(callback, status, response, headersString, statusText) {\n      // cancel timeout and subsequent timeout promise resolution\n      timeoutId && $browserDefer.cancel(timeoutId);\n      jsonpDone = xhr = null;\n\n      // fix status code when it is 0 (0 status is undocumented).\n      // Occurs when accessing file resources or on Android 4.1 stock browser\n      // while retrieving files from application cache.\n      if (status === 0) {\n        status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;\n      }\n\n      // normalize IE bug (http://bugs.jquery.com/ticket/1450)\n      status = status === 1223 ? 204 : status;\n      statusText = statusText || '';\n\n      callback(status, response, headersString, statusText);\n      $browser.$$completeOutstandingRequest(noop);\n    }\n  };\n\n  function jsonpReq(url, callbackId, done) {\n    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:\n    // - fetches local scripts via XHR and evals them\n    // - adds and immediately removes script elements from the document\n    var script = rawDocument.createElement('script'), callback = null;\n    script.type = \"text/javascript\";\n    script.src = url;\n    script.async = true;\n\n    callback = function(event) {\n      removeEventListenerFn(script, \"load\", callback);\n      removeEventListenerFn(script, \"error\", callback);\n      rawDocument.body.removeChild(script);\n      script = null;\n      var status = -1;\n      var text = \"unknown\";\n\n      if (event) {\n        if (event.type === \"load\" && !callbacks[callbackId].called) {\n          event = { type: \"error\" };\n        }\n        text = event.type;\n        status = event.type === \"error\" ? 404 : 200;\n      }\n\n      if (done) {\n        done(status, text);\n      }\n    };\n\n    addEventListenerFn(script, \"load\", callback);\n    addEventListenerFn(script, \"error\", callback);\n    rawDocument.body.appendChild(script);\n    return callback;\n  }\n}\n\nvar $interpolateMinErr = minErr('$interpolate');\n\n/**\n * @ngdoc provider\n * @name $interpolateProvider\n * @function\n *\n * @description\n *\n * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.\n *\n * @example\n<example module=\"customInterpolationApp\">\n<file name=\"index.html\">\n<script>\n  var customInterpolationApp = angular.module('customInterpolationApp', []);\n\n  customInterpolationApp.config(function($interpolateProvider) {\n    $interpolateProvider.startSymbol('//');\n    $interpolateProvider.endSymbol('//');\n  });\n\n\n  customInterpolationApp.controller('DemoController', function() {\n      this.label = \"This binding is brought you by // interpolation symbols.\";\n  });\n</script>\n<div ng-app=\"App\" ng-controller=\"DemoController as demo\">\n    //demo.label//\n</div>\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  it('should interpolate binding with custom symbols', function() {\n    expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');\n  });\n</file>\n</example>\n */\nfunction $InterpolateProvider() {\n  var startSymbol = '{{';\n  var endSymbol = '}}';\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#startSymbol\n   * @description\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\n   *\n   * @param {string=} value new value to set the starting symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.startSymbol = function(value){\n    if (value) {\n      startSymbol = value;\n      return this;\n    } else {\n      return startSymbol;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#endSymbol\n   * @description\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n   *\n   * @param {string=} value new value to set the ending symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.endSymbol = function(value){\n    if (value) {\n      endSymbol = value;\n      return this;\n    } else {\n      return endSymbol;\n    }\n  };\n\n\n  this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {\n    var startSymbolLength = startSymbol.length,\n        endSymbolLength = endSymbol.length,\n        escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),\n        escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');\n\n    function escape(ch) {\n      return '\\\\\\\\\\\\' + ch;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $interpolate\n     * @function\n     *\n     * @requires $parse\n     * @requires $sce\n     *\n     * @description\n     *\n     * Compiles a string with markup into an interpolation function. This service is used by the\n     * HTML {@link ng.$compile $compile} service for data binding. See\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\n     * interpolation markup.\n     *\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var exp = $interpolate('Hello {{name | uppercase}}!');\n     *   expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');\n     * ```\n     *\n     * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is\n     * `true`, the interpolation function will return `undefined` unless all embedded expressions\n     * evaluate to a value other than `undefined`.\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var context = {greeting: 'Hello', name: undefined };\n     *\n     *   // default \"forgiving\" mode\n     *   var exp = $interpolate('{{greeting}} {{name}}!');\n     *   expect(exp(context)).toEqual('Hello !');\n     *\n     *   // \"allOrNothing\" mode\n     *   exp = $interpolate('{{greeting}} {{name}}!', false, null, true);\n     *   expect(exp(context, true)).toBeUndefined();\n     *   context.name = 'Angular';\n     *   expect(exp(context, true)).toEqual('Hello Angular!');\n     * ```\n     *\n     * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.\n     *\n     * ####Escaped Interpolation\n     * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers\n     * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).\n     * It will be rendered as a regular start/end marker, and will not be interpreted as an expression\n     * or binding.\n     *\n     * This enables web-servers to prevent script injection attacks and defacing attacks, to some\n     * degree, while also enabling code examples to work without relying on the\n     * {@link ng.directive:ngNonBindable ngNonBindable} directive.\n     *\n     * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,\n     * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all\n     * interpolation start/end markers with their escaped counterparts.**\n     *\n     * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered\n     * output when the $interpolate service processes the text. So, for HTML elements interpolated\n     * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter\n     * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,\n     * this is typically useful only when user-data is used in rendering a template from the server, or\n     * when otherwise untrusted data is used by a directive.\n     *\n     * <example>\n     *  <file name=\"index.html\">\n     *    <div ng-init=\"username='A user'\">\n     *      <p ng-init=\"apptitle='Escaping demo'\">{{apptitle}}: \\{\\{ username = \"defaced value\"; \\}\\}\n     *        </p>\n     *      <p><strong>{{username}}</strong> attempts to inject code which will deface the\n     *        application, but fails to accomplish their task, because the server has correctly\n     *        escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)\n     *        characters.</p>\n     *      <p>Instead, the result of the attempted script injection is visible, and can be removed\n     *        from the database by an administrator.</p>\n     *    </div>\n     *  </file>\n     * </example>\n     *\n     * @param {string} text The text with markup to interpolate.\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\n     *    embedded expression in order to return an interpolation function. Strings with no\n     *    embedded expression will return null for the interpolation function.\n     * @param {string=} trustedContext when provided, the returned function passes the interpolated\n     *    result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,\n     *    trustedContext)} before returning it.  Refer to the {@link ng.$sce $sce} service that\n     *    provides Strict Contextual Escaping for details.\n     * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined\n     *    unless all embedded expressions evaluate to a value other than `undefined`.\n     * @returns {function(context)} an interpolation function which is used to compute the\n     *    interpolated string. The function has these parameters:\n     *\n     * - `context`: evaluation context for all expressions embedded in the interpolated text\n     */\n    function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n      allOrNothing = !!allOrNothing;\n      var startIndex,\n          endIndex,\n          index = 0,\n          separators = [],\n          expressions = [],\n          parseFns = [],\n          textLength = text.length,\n          hasInterpolation = false,\n          hasText = false,\n          exp,\n          concat = [],\n          lastValuesCache = { values: {}, results: {}};\n\n      while(index < textLength) {\n        if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) {\n          if (index !== startIndex) hasText = true;\n          separators.push(text.substring(index, startIndex));\n          exp = text.substring(startIndex + startSymbolLength, endIndex);\n          expressions.push(exp);\n          parseFns.push($parse(exp));\n          index = endIndex + endSymbolLength;\n          hasInterpolation = true;\n        } else {\n          // we did not find an interpolation, so we have to add the remainder to the separators array\n          if (index !== textLength) {\n            hasText = true;\n            separators.push(text.substring(index));\n          }\n          break;\n        }\n      }\n\n      forEach(separators, function(key, i) {\n        separators[i] = separators[i].\n          replace(escapedStartRegexp, startSymbol).\n          replace(escapedEndRegexp, endSymbol);\n      });\n\n      if (separators.length === expressions.length) {\n        separators.push('');\n      }\n\n      // Concatenating expressions makes it hard to reason about whether some combination of\n      // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a\n      // single expression be used for iframe[src], object[src], etc., we ensure that the value\n      // that's used is assigned or constructed by some JS code somewhere that is more testable or\n      // make it obvious that you bound the value to some user controlled value.  This helps reduce\n      // the load when auditing for XSS issues.\n      if (trustedContext && hasInterpolation && (hasText || expressions.length > 1)) {\n          throw $interpolateMinErr('noconcat',\n              \"Error while interpolating: {0}\\nStrict Contextual Escaping disallows \" +\n              \"interpolations that concatenate multiple expressions when a trusted value is \" +\n              \"required.  See http://docs.angularjs.org/api/ng.$sce\", text);\n      }\n\n      if (!mustHaveExpression || hasInterpolation) {\n        concat.length = separators.length + expressions.length;\n\n        var compute = function(values) {\n          for(var i = 0, ii = expressions.length; i < ii; i++) {\n            concat[2*i] = separators[i];\n            concat[(2*i)+1] = values[i];\n          }\n          concat[2*ii] = separators[ii];\n          return concat.join('');\n        };\n\n        var getValue = function (value) {\n          if (trustedContext) {\n            value = $sce.getTrusted(trustedContext, value);\n          } else {\n            value = $sce.valueOf(value);\n          }\n\n          return value;\n        };\n\n        var stringify = function (value) {\n          if (value == null) { // null || undefined\n            return '';\n          }\n          switch (typeof value) {\n            case 'string': {\n              break;\n            }\n            case 'number': {\n              value = '' + value;\n              break;\n            }\n            default: {\n              value = toJson(value);\n            }\n          }\n\n          return value;\n        };\n\n        return extend(function interpolationFn(context) {\n            var scopeId = (context && context.$id) || 'notAScope';\n            var lastValues = lastValuesCache.values[scopeId];\n            var lastResult = lastValuesCache.results[scopeId];\n            var i = 0;\n            var ii = expressions.length;\n            var values = new Array(ii);\n            var val;\n            var inputsChanged = lastResult === undefined ? true: false;\n\n\n            // if we haven't seen this context before, initialize the cache and try to setup\n            // a cleanup routine that purges the cache when the scope goes away.\n            if (!lastValues) {\n              lastValues = [];\n              inputsChanged = true;\n              if (context && context.$on) {\n                context.$on('$destroy', function() {\n                  lastValuesCache.values[scopeId] = null;\n                  lastValuesCache.results[scopeId] = null;\n                });\n              }\n            }\n\n\n            try {\n              interpolationFn.$$unwatch = true;\n              for (; i < ii; i++) {\n                val = getValue(parseFns[i](context));\n                if (allOrNothing && isUndefined(val)) {\n                  interpolationFn.$$unwatch = undefined;\n                  return;\n                }\n                val = stringify(val);\n                if (val !== lastValues[i]) {\n                  inputsChanged = true;\n                }\n                values[i] = val;\n                interpolationFn.$$unwatch = interpolationFn.$$unwatch && parseFns[i].$$unwatch;\n              }\n\n              if (inputsChanged) {\n                lastValuesCache.values[scopeId] = values;\n                lastValuesCache.results[scopeId] = lastResult = compute(values);\n              }\n            } catch(err) {\n              var newErr = $interpolateMinErr('interr', \"Can't interpolate: {0}\\n{1}\", text,\n                  err.toString());\n              $exceptionHandler(newErr);\n            }\n\n            return lastResult;\n          }, {\n          // all of these properties are undocumented for now\n          exp: text, //just for compatibility with regular watchers created via $watch\n          separators: separators,\n          expressions: expressions\n        });\n      }\n    }\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#startSymbol\n     * @description\n     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.\n     *\n     * Use {@link ng.$interpolateProvider#startSymbol $interpolateProvider#startSymbol} to change\n     * the symbol.\n     *\n     * @returns {string} start symbol.\n     */\n    $interpolate.startSymbol = function() {\n      return startSymbol;\n    };\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#endSymbol\n     * @description\n     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n     *\n     * Use {@link ng.$interpolateProvider#endSymbol $interpolateProvider#endSymbol} to change\n     * the symbol.\n     *\n     * @returns {string} end symbol.\n     */\n    $interpolate.endSymbol = function() {\n      return endSymbol;\n    };\n\n    return $interpolate;\n  }];\n}\n\nfunction $IntervalProvider() {\n  this.$get = ['$rootScope', '$window', '$q',\n       function($rootScope,   $window,   $q) {\n    var intervals = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $interval\n      *\n      * @description\n      * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`\n      * milliseconds.\n      *\n      * The return value of registering an interval function is a promise. This promise will be\n      * notified upon each tick of the interval, and will be resolved after `count` iterations, or\n      * run indefinitely if `count` is not defined. The value of the notification will be the\n      * number of iterations that have run.\n      * To cancel an interval, call `$interval.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n      * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n      * time.\n      *\n      * <div class=\"alert alert-warning\">\n      * **Note**: Intervals created by this service must be explicitly destroyed when you are finished\n      * with them.  In particular they are not automatically destroyed when a controller's scope or a\n      * directive's element are destroyed.\n      * You should take this into consideration and make sure to always cancel the interval at the\n      * appropriate moment.  See the example below for more details on how and when to do this.\n      * </div>\n      *\n      * @param {function()} fn A function that should be called repeatedly.\n      * @param {number} delay Number of milliseconds between each function call.\n      * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n      *   indefinitely.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @returns {promise} A promise which will be notified on each iteration.\n      *\n      * @example\n      * <example module=\"time\">\n      *   <file name=\"index.html\">\n      *     <script>\n      *       function Ctrl2($scope,$interval) {\n      *         $scope.format = 'M/d/yy h:mm:ss a';\n      *         $scope.blood_1 = 100;\n      *         $scope.blood_2 = 120;\n      *\n      *         var stop;\n      *         $scope.fight = function() {\n      *           // Don't start a new fight if we are already fighting\n      *           if ( angular.isDefined(stop) ) return;\n      *\n      *           stop = $interval(function() {\n      *             if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {\n      *                 $scope.blood_1 = $scope.blood_1 - 3;\n      *                 $scope.blood_2 = $scope.blood_2 - 4;\n      *             } else {\n      *                 $scope.stopFight();\n      *             }\n      *           }, 100);\n      *         };\n      *\n      *         $scope.stopFight = function() {\n      *           if (angular.isDefined(stop)) {\n      *             $interval.cancel(stop);\n      *             stop = undefined;\n      *           }\n      *         };\n      *\n      *         $scope.resetFight = function() {\n      *           $scope.blood_1 = 100;\n      *           $scope.blood_2 = 120;\n      *         }\n      *\n      *         $scope.$on('$destroy', function() {\n      *           // Make sure that the interval is destroyed too\n      *           $scope.stopFight();\n      *         });\n      *       }\n      *\n      *       angular.module('time', [])\n      *         // Register the 'myCurrentTime' directive factory method.\n      *         // We inject $interval and dateFilter service since the factory method is DI.\n      *         .directive('myCurrentTime', function($interval, dateFilter) {\n      *           // return the directive link function. (compile function not needed)\n      *           return function(scope, element, attrs) {\n      *             var format,  // date format\n      *             stopTime; // so that we can cancel the time updates\n      *\n      *             // used to update the UI\n      *             function updateTime() {\n      *               element.text(dateFilter(new Date(), format));\n      *             }\n      *\n      *             // watch the expression, and update the UI on change.\n      *             scope.$watch(attrs.myCurrentTime, function(value) {\n      *               format = value;\n      *               updateTime();\n      *             });\n      *\n      *             stopTime = $interval(updateTime, 1000);\n      *\n      *             // listen on DOM destroy (removal) event, and cancel the next UI update\n      *             // to prevent updating time ofter the DOM element was removed.\n      *             element.on('$destroy', function() {\n      *               $interval.cancel(stopTime);\n      *             });\n      *           }\n      *         });\n      *     </script>\n      *\n      *     <div>\n      *       <div ng-controller=\"Ctrl2\">\n      *         Date format: <input ng-model=\"format\"> <hr/>\n      *         Current time is: <span my-current-time=\"format\"></span>\n      *         <hr/>\n      *         Blood 1 : <font color='red'>{{blood_1}}</font>\n      *         Blood 2 : <font color='red'>{{blood_2}}</font>\n      *         <button type=\"button\" data-ng-click=\"fight()\">Fight</button>\n      *         <button type=\"button\" data-ng-click=\"stopFight()\">StopFight</button>\n      *         <button type=\"button\" data-ng-click=\"resetFight()\">resetFight</button>\n      *       </div>\n      *     </div>\n      *\n      *   </file>\n      * </example>\n      */\n    function interval(fn, delay, count, invokeApply) {\n      var setInterval = $window.setInterval,\n          clearInterval = $window.clearInterval,\n          deferred = $q.defer(),\n          promise = deferred.promise,\n          iteration = 0,\n          skipApply = (isDefined(invokeApply) && !invokeApply);\n\n      count = isDefined(count) ? count : 0;\n\n      promise.then(null, null, fn);\n\n      promise.$$intervalId = setInterval(function tick() {\n        deferred.notify(iteration++);\n\n        if (count > 0 && iteration >= count) {\n          deferred.resolve(iteration);\n          clearInterval(promise.$$intervalId);\n          delete intervals[promise.$$intervalId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n\n      }, delay);\n\n      intervals[promise.$$intervalId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $interval#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`.\n      *\n      * @param {promise} promise returned by the `$interval` function.\n      * @returns {boolean} Returns `true` if the task was successfully canceled.\n      */\n    interval.cancel = function(promise) {\n      if (promise && promise.$$intervalId in intervals) {\n        intervals[promise.$$intervalId].reject('canceled');\n        clearInterval(promise.$$intervalId);\n        delete intervals[promise.$$intervalId];\n        return true;\n      }\n      return false;\n    };\n\n    return interval;\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $locale\n *\n * @description\n * $locale service provides localization rules for various Angular components. As of right now the\n * only public api is:\n *\n * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)\n */\nfunction $LocaleProvider(){\n  this.$get = function() {\n    return {\n      id: 'en-us',\n\n      NUMBER_FORMATS: {\n        DECIMAL_SEP: '.',\n        GROUP_SEP: ',',\n        PATTERNS: [\n          { // Decimal Pattern\n            minInt: 1,\n            minFrac: 0,\n            maxFrac: 3,\n            posPre: '',\n            posSuf: '',\n            negPre: '-',\n            negSuf: '',\n            gSize: 3,\n            lgSize: 3\n          },{ //Currency Pattern\n            minInt: 1,\n            minFrac: 2,\n            maxFrac: 2,\n            posPre: '\\u00A4',\n            posSuf: '',\n            negPre: '(\\u00A4',\n            negSuf: ')',\n            gSize: 3,\n            lgSize: 3\n          }\n        ],\n        CURRENCY_SYM: '$'\n      },\n\n      DATETIME_FORMATS: {\n        MONTH:\n            'January,February,March,April,May,June,July,August,September,October,November,December'\n            .split(','),\n        SHORTMONTH:  'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),\n        DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),\n        SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),\n        AMPMS: ['AM','PM'],\n        medium: 'MMM d, y h:mm:ss a',\n        short: 'M/d/yy h:mm a',\n        fullDate: 'EEEE, MMMM d, y',\n        longDate: 'MMMM d, y',\n        mediumDate: 'MMM d, y',\n        shortDate: 'M/d/yy',\n        mediumTime: 'h:mm:ss a',\n        shortTime: 'h:mm a'\n      },\n\n      pluralCat: function(num) {\n        if (num === 1) {\n          return 'one';\n        }\n        return 'other';\n      }\n    };\n  };\n}\n\nvar PATH_MATCH = /^([^\\?#]*)(\\?([^#]*))?(#(.*))?$/,\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\nvar $locationMinErr = minErr('$location');\n\n\n/**\n * Encode path using encodeUriSegment, ignoring forward slashes\n *\n * @param {string} path Path to encode\n * @returns {string}\n */\nfunction encodePath(path) {\n  var segments = path.split('/'),\n      i = segments.length;\n\n  while (i--) {\n    segments[i] = encodeUriSegment(segments[i]);\n  }\n\n  return segments.join('/');\n}\n\nfunction parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {\n  var parsedUrl = urlResolve(absoluteUrl, appBase);\n\n  locationObj.$$protocol = parsedUrl.protocol;\n  locationObj.$$host = parsedUrl.hostname;\n  locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\n}\n\n\nfunction parseAppUrl(relativeUrl, locationObj, appBase) {\n  var prefixed = (relativeUrl.charAt(0) !== '/');\n  if (prefixed) {\n    relativeUrl = '/' + relativeUrl;\n  }\n  var match = urlResolve(relativeUrl, appBase);\n  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?\n      match.pathname.substring(1) : match.pathname);\n  locationObj.$$search = parseKeyValue(match.search);\n  locationObj.$$hash = decodeURIComponent(match.hash);\n\n  // make sure path starts with '/';\n  if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {\n    locationObj.$$path = '/' + locationObj.$$path;\n  }\n}\n\n\n/**\n *\n * @param {string} begin\n * @param {string} whole\n * @returns {string} returns text from whole after begin or undefined if it does not begin with\n *                   expected string.\n */\nfunction beginsWith(begin, whole) {\n  if (whole.indexOf(begin) === 0) {\n    return whole.substr(begin.length);\n  }\n}\n\n\nfunction stripHash(url) {\n  var index = url.indexOf('#');\n  return index == -1 ? url : url.substr(0, index);\n}\n\n\nfunction stripFile(url) {\n  return url.substr(0, stripHash(url).lastIndexOf('/') + 1);\n}\n\n/* return the server only (scheme://host:port) */\nfunction serverBase(url) {\n  return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));\n}\n\n\n/**\n * LocationHtml5Url represents an url\n * This object is exposed as $location service when HTML5 mode is enabled and supported\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} basePrefix url path prefix\n */\nfunction LocationHtml5Url(appBase, basePrefix) {\n  this.$$html5 = true;\n  basePrefix = basePrefix || '';\n  var appBaseNoFile = stripFile(appBase);\n  parseAbsoluteUrl(appBase, this, appBase);\n\n\n  /**\n   * Parse given html5 (regular) url string into properties\n   * @param {string} newAbsoluteUrl HTML5 url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var pathUrl = beginsWith(appBaseNoFile, url);\n    if (!isString(pathUrl)) {\n      throw $locationMinErr('ipthprfx', 'Invalid url \"{0}\", missing path prefix \"{1}\".', url,\n          appBaseNoFile);\n    }\n\n    parseAppUrl(pathUrl, this, appBase);\n\n    if (!this.$$path) {\n      this.$$path = '/';\n    }\n\n    this.$$compose();\n  };\n\n  /**\n   * Compose url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'\n  };\n\n  this.$$rewrite = function(url) {\n    var appUrl, prevAppUrl;\n\n    if ( (appUrl = beginsWith(appBase, url)) !== undefined ) {\n      prevAppUrl = appUrl;\n      if ( (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ) {\n        return appBaseNoFile + (beginsWith('/', appUrl) || appUrl);\n      } else {\n        return appBase + prevAppUrl;\n      }\n    } else if ( (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ) {\n      return appBaseNoFile + appUrl;\n    } else if (appBaseNoFile == url + '/') {\n      return appBaseNoFile;\n    }\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when developer doesn't opt into html5 mode.\n * It also serves as the base class for html5 mode fallback on legacy browsers.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangUrl(appBase, hashPrefix) {\n  var appBaseNoFile = stripFile(appBase);\n\n  parseAbsoluteUrl(appBase, this, appBase);\n\n\n  /**\n   * Parse given hashbang url into properties\n   * @param {string} url Hashbang url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);\n    var withoutHashUrl = withoutBaseUrl.charAt(0) == '#'\n        ? beginsWith(hashPrefix, withoutBaseUrl)\n        : (this.$$html5)\n          ? withoutBaseUrl\n          : '';\n\n    if (!isString(withoutHashUrl)) {\n      throw $locationMinErr('ihshprfx', 'Invalid url \"{0}\", missing hash prefix \"{1}\".', url,\n          hashPrefix);\n    }\n    parseAppUrl(withoutHashUrl, this, appBase);\n\n    this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);\n\n    this.$$compose();\n\n    /*\n     * In Windows, on an anchor node on documents loaded from\n     * the filesystem, the browser will return a pathname\n     * prefixed with the drive name ('/C:/path') when a\n     * pathname without a drive is set:\n     *  * a.setAttribute('href', '/foo')\n     *   * a.pathname === '/C:/foo' //true\n     *\n     * Inside of Angular, we're always using pathnames that\n     * do not include drive names for routing.\n     */\n    function removeWindowsDriveName (path, url, base) {\n      /*\n      Matches paths for file protocol on windows,\n      such as /C:/foo/bar, and captures only /foo/bar.\n      */\n      var windowsFilePathExp = /^\\/[A-Z]:(\\/.*)/;\n\n      var firstPathSegmentMatch;\n\n      //Get the relative path from the input URL.\n      if (url.indexOf(base) === 0) {\n        url = url.replace(base, '');\n      }\n\n      // The input URL intentionally contains a first path segment that ends with a colon.\n      if (windowsFilePathExp.exec(url)) {\n        return path;\n      }\n\n      firstPathSegmentMatch = windowsFilePathExp.exec(path);\n      return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;\n    }\n  };\n\n  /**\n   * Compose hashbang url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');\n  };\n\n  this.$$rewrite = function(url) {\n    if(stripHash(appBase) == stripHash(url)) {\n      return url;\n    }\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when html5 history api is enabled but the browser\n * does not support it.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangInHtml5Url(appBase, hashPrefix) {\n  this.$$html5 = true;\n  LocationHashbangUrl.apply(this, arguments);\n\n  var appBaseNoFile = stripFile(appBase);\n\n  this.$$rewrite = function(url) {\n    var appUrl;\n\n    if ( appBase == stripHash(url) ) {\n      return url;\n    } else if ( (appUrl = beginsWith(appBaseNoFile, url)) ) {\n      return appBase + hashPrefix + appUrl;\n    } else if ( appBaseNoFile === url + '/') {\n      return appBaseNoFile;\n    }\n  };\n\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'\n    this.$$absUrl = appBase + hashPrefix + this.$$url;\n  };\n\n}\n\n\nLocationHashbangInHtml5Url.prototype =\n  LocationHashbangUrl.prototype =\n  LocationHtml5Url.prototype = {\n\n  /**\n   * Are we in html5 mode?\n   * @private\n   */\n  $$html5: false,\n\n  /**\n   * Has any change been replacing ?\n   * @private\n   */\n  $$replace: false,\n\n  /**\n   * @ngdoc method\n   * @name $location#absUrl\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return full url representation with all segments encoded according to rules specified in\n   * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).\n   *\n   * @return {string} full url\n   */\n  absUrl: locationGetter('$$absUrl'),\n\n  /**\n   * @ngdoc method\n   * @name $location#url\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.\n   *\n   * Change path, search and hash, when called with parameter and return `$location`.\n   *\n   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)\n   * @param {string=} replace The path that will be changed\n   * @return {string} url\n   */\n  url: function(url, replace) {\n    if (isUndefined(url))\n      return this.$$url;\n\n    var match = PATH_MATCH.exec(url);\n    if (match[1]) this.path(decodeURIComponent(match[1]));\n    if (match[2] || match[1]) this.search(match[3] || '');\n    this.hash(match[5] || '', replace);\n\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#protocol\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return protocol of current url.\n   *\n   * @return {string} protocol of current url\n   */\n  protocol: locationGetter('$$protocol'),\n\n  /**\n   * @ngdoc method\n   * @name $location#host\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return host of current url.\n   *\n   * @return {string} host of current url.\n   */\n  host: locationGetter('$$host'),\n\n  /**\n   * @ngdoc method\n   * @name $location#port\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return port of current url.\n   *\n   * @return {Number} port\n   */\n  port: locationGetter('$$port'),\n\n  /**\n   * @ngdoc method\n   * @name $location#path\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return path of current url when called without any parameter.\n   *\n   * Change path when called with parameter and return `$location`.\n   *\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\n   * if it is missing.\n   *\n   * @param {string=} path New path\n   * @return {string} path\n   */\n  path: locationGetterSetter('$$path', function(path) {\n    return path.charAt(0) == '/' ? path : '/' + path;\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#search\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return search part (as object) of current url when called without any parameter.\n   *\n   * Change search part when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var searchObject = $location.search();\n   * // => {foo: 'bar', baz: 'xoxo'}\n   *\n   *\n   * // set foo to 'yipee'\n   * $location.search('foo', 'yipee');\n   * // => $location\n   * ```\n   *\n   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\n   * hash object.\n   *\n   * When called with a single argument the method acts as a setter, setting the `search` component\n   * of `$location` to the specified value.\n   *\n   * If the argument is a hash object containing an array of values, these values will be encoded\n   * as duplicate search parameters in the url.\n   *\n   * @param {(string|Array<string>)=} paramValue If `search` is a string, then `paramValue` will\n   * override only a single search property.\n   *\n   * If `paramValue` is an array, it will override the property of the `search` component of\n   * `$location` specified via the first argument.\n   *\n   * If `paramValue` is `null`, the property specified via the first argument will be deleted.\n   *\n   * @return {Object} If called with no arguments returns the parsed `search` object. If called with\n   * one or more arguments returns `$location` object itself.\n   */\n  search: function(search, paramValue) {\n    switch (arguments.length) {\n      case 0:\n        return this.$$search;\n      case 1:\n        if (isString(search)) {\n          this.$$search = parseKeyValue(search);\n        } else if (isObject(search)) {\n          this.$$search = search;\n        } else {\n          throw $locationMinErr('isrcharg',\n              'The first argument of the `$location#search()` call must be a string or an object.');\n        }\n        break;\n      default:\n        if (isUndefined(paramValue) || paramValue === null) {\n          delete this.$$search[search];\n        } else {\n          this.$$search[search] = paramValue;\n        }\n    }\n\n    this.$$compose();\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#hash\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return hash fragment when called without any parameter.\n   *\n   * Change hash fragment when called with parameter and return `$location`.\n   *\n   * @param {string=} hash New hash fragment\n   * @return {string} hash\n   */\n  hash: locationGetterSetter('$$hash', identity),\n\n  /**\n   * @ngdoc method\n   * @name $location#replace\n   *\n   * @description\n   * If called, all changes to $location during current `$digest` will be replacing current history\n   * record, instead of adding new one.\n   */\n  replace: function() {\n    this.$$replace = true;\n    return this;\n  }\n};\n\nfunction locationGetter(property) {\n  return function() {\n    return this[property];\n  };\n}\n\n\nfunction locationGetterSetter(property, preprocess) {\n  return function(value) {\n    if (isUndefined(value))\n      return this[property];\n\n    this[property] = preprocess(value);\n    this.$$compose();\n\n    return this;\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $location\n *\n * @requires $rootElement\n *\n * @description\n * The $location service parses the URL in the browser address bar (based on the\n * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL\n * available to your application. Changes to the URL in the address bar are reflected into\n * $location service and changes to $location are reflected into the browser address bar.\n *\n * **The $location service:**\n *\n * - Exposes the current URL in the browser address bar, so you can\n *   - Watch and observe the URL.\n *   - Change the URL.\n * - Synchronizes the URL with the browser when the user\n *   - Changes the address bar.\n *   - Clicks the back or forward button (or clicks a History link).\n *   - Clicks on a link.\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\n *\n * For more information see {@link guide/$location Developer Guide: Using $location}\n */\n\n/**\n * @ngdoc provider\n * @name $locationProvider\n * @description\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\n */\nfunction $LocationProvider(){\n  var hashPrefix = '',\n      html5Mode = false;\n\n  /**\n   * @ngdoc property\n   * @name $locationProvider#hashPrefix\n   * @description\n   * @param {string=} prefix Prefix for hash part (containing path and search)\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.hashPrefix = function(prefix) {\n    if (isDefined(prefix)) {\n      hashPrefix = prefix;\n      return this;\n    } else {\n      return hashPrefix;\n    }\n  };\n\n  /**\n   * @ngdoc property\n   * @name $locationProvider#html5Mode\n   * @description\n   * @param {boolean=} mode Use HTML5 strategy if available.\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.html5Mode = function(mode) {\n    if (isDefined(mode)) {\n      html5Mode = mode;\n      return this;\n    } else {\n      return html5Mode;\n    }\n  };\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeStart\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted before a URL will change. This change can be prevented by calling\n   * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more\n   * details about event object. Upon successful change\n   * {@link ng.$location#events_$locationChangeSuccess $locationChangeSuccess} is fired.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   */\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeSuccess\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted after a URL was changed.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   */\n\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',\n      function( $rootScope,   $browser,   $sniffer,   $rootElement) {\n    var $location,\n        LocationMode,\n        baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''\n        initialUrl = $browser.url(),\n        appBase;\n\n    if (html5Mode) {\n      appBase = serverBase(initialUrl) + (baseHref || '/');\n      LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;\n    } else {\n      appBase = stripHash(initialUrl);\n      LocationMode = LocationHashbangUrl;\n    }\n    $location = new LocationMode(appBase, '#' + hashPrefix);\n    $location.$$parse($location.$$rewrite(initialUrl));\n\n    $rootElement.on('click', function(event) {\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\n      // currently we open nice url link and redirect then\n\n      if (event.ctrlKey || event.metaKey || event.which == 2) return;\n\n      var elm = jqLite(event.target);\n\n      // traverse the DOM up to find first A tag\n      while (lowercase(elm[0].nodeName) !== 'a') {\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\n      }\n\n      var absHref = elm.prop('href');\n\n      if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {\n        // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during\n        // an animation.\n        absHref = urlResolve(absHref.animVal).href;\n      }\n\n      // Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9)\n      // The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or\n      // somewhere#anchor or http://example.com/somewhere\n      if (LocationMode === LocationHashbangInHtml5Url) {\n        // get the actual href attribute - see\n        // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx\n        var href = elm.attr('href') || elm.attr('xlink:href');\n\n        if (href.indexOf('://') < 0) {         // Ignore absolute URLs\n          var prefix = '#' + hashPrefix;\n          if (href[0] == '/') {\n            // absolute path - replace old path\n            absHref = appBase + prefix + href;\n          } else if (href[0] == '#') {\n            // local anchor\n            absHref = appBase + prefix + ($location.path() || '/') + href;\n          } else {\n            // relative path - join with current path\n            var stack = $location.path().split(\"/\"),\n              parts = href.split(\"/\");\n            for (var i=0; i<parts.length; i++) {\n              if (parts[i] == \".\")\n                continue;\n              else if (parts[i] == \"..\")\n                stack.pop();\n              else if (parts[i].length)\n                stack.push(parts[i]);\n            }\n            absHref = appBase + prefix + stack.join('/');\n          }\n        }\n      }\n\n      var rewrittenUrl = $location.$$rewrite(absHref);\n\n      if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {\n        event.preventDefault();\n        if (rewrittenUrl != $browser.url()) {\n          // update location manually\n          $location.$$parse(rewrittenUrl);\n          $rootScope.$apply();\n          // hack to work around FF6 bug 684208 when scenario runner clicks on links\n          window.angular['ff-684208-preventDefault'] = true;\n        }\n      }\n    });\n\n\n    // rewrite hashbang url <> html5 url\n    if ($location.absUrl() != initialUrl) {\n      $browser.url($location.absUrl(), true);\n    }\n\n    // update $location when $browser url changes\n    $browser.onUrlChange(function(newUrl) {\n      if ($location.absUrl() != newUrl) {\n        $rootScope.$evalAsync(function() {\n          var oldUrl = $location.absUrl();\n\n          $location.$$parse(newUrl);\n          if ($rootScope.$broadcast('$locationChangeStart', newUrl,\n                                    oldUrl).defaultPrevented) {\n            $location.$$parse(oldUrl);\n            $browser.url(oldUrl);\n          } else {\n            afterLocationChange(oldUrl);\n          }\n        });\n        if (!$rootScope.$$phase) $rootScope.$digest();\n      }\n    });\n\n    // update browser\n    var changeCounter = 0;\n    $rootScope.$watch(function $locationWatch() {\n      var oldUrl = $browser.url();\n      var currentReplace = $location.$$replace;\n\n      if (!changeCounter || oldUrl != $location.absUrl()) {\n        changeCounter++;\n        $rootScope.$evalAsync(function() {\n          if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n              defaultPrevented) {\n            $location.$$parse(oldUrl);\n          } else {\n            $browser.url($location.absUrl(), currentReplace);\n            afterLocationChange(oldUrl);\n          }\n        });\n      }\n      $location.$$replace = false;\n\n      return changeCounter;\n    });\n\n    return $location;\n\n    function afterLocationChange(oldUrl) {\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);\n    }\n}];\n}\n\n/**\n * @ngdoc service\n * @name $log\n * @requires $window\n *\n * @description\n * Simple service for logging. Default implementation safely writes the message\n * into the browser's console (if present).\n *\n * The main purpose of this service is to simplify debugging and troubleshooting.\n *\n * The default is to log `debug` messages. You can use\n * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.\n *\n * @example\n   <example>\n     <file name=\"script.js\">\n       function LogCtrl($scope, $log) {\n         $scope.$log = $log;\n         $scope.message = 'Hello World!';\n       }\n     </file>\n     <file name=\"index.html\">\n       <div ng-controller=\"LogCtrl\">\n         <p>Reload this page with open console, enter text and hit the log button...</p>\n         Message:\n         <input type=\"text\" ng-model=\"message\"/>\n         <button ng-click=\"$log.log(message)\">log</button>\n         <button ng-click=\"$log.warn(message)\">warn</button>\n         <button ng-click=\"$log.info(message)\">info</button>\n         <button ng-click=\"$log.error(message)\">error</button>\n       </div>\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc provider\n * @name $logProvider\n * @description\n * Use the `$logProvider` to configure how the application logs messages\n */\nfunction $LogProvider(){\n  var debug = true,\n      self = this;\n\n  /**\n   * @ngdoc property\n   * @name $logProvider#debugEnabled\n   * @description\n   * @param {boolean=} flag enable or disable debug level messages\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.debugEnabled = function(flag) {\n    if (isDefined(flag)) {\n      debug = flag;\n    return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = ['$window', function($window){\n    return {\n      /**\n       * @ngdoc method\n       * @name $log#log\n       *\n       * @description\n       * Write a log message\n       */\n      log: consoleLog('log'),\n\n      /**\n       * @ngdoc method\n       * @name $log#info\n       *\n       * @description\n       * Write an information message\n       */\n      info: consoleLog('info'),\n\n      /**\n       * @ngdoc method\n       * @name $log#warn\n       *\n       * @description\n       * Write a warning message\n       */\n      warn: consoleLog('warn'),\n\n      /**\n       * @ngdoc method\n       * @name $log#error\n       *\n       * @description\n       * Write an error message\n       */\n      error: consoleLog('error'),\n\n      /**\n       * @ngdoc method\n       * @name $log#debug\n       *\n       * @description\n       * Write a debug message\n       */\n      debug: (function () {\n        var fn = consoleLog('debug');\n\n        return function() {\n          if (debug) {\n            fn.apply(self, arguments);\n          }\n        };\n      }())\n    };\n\n    function formatError(arg) {\n      if (arg instanceof Error) {\n        if (arg.stack) {\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\n              : arg.stack;\n        } else if (arg.sourceURL) {\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\n        }\n      }\n      return arg;\n    }\n\n    function consoleLog(type) {\n      var console = $window.console || {},\n          logFn = console[type] || console.log || noop,\n          hasApply = false;\n\n      // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.\n      // The reason behind this is that console.log has type \"object\" in IE8...\n      try {\n        hasApply = !!logFn.apply;\n      } catch (e) {}\n\n      if (hasApply) {\n        return function() {\n          var args = [];\n          forEach(arguments, function(arg) {\n            args.push(formatError(arg));\n          });\n          return logFn.apply(console, args);\n        };\n      }\n\n      // we are IE which either doesn't have window.console => this is noop and we do nothing,\n      // or we are IE where console.log doesn't have apply so we log at least first 2 args\n      return function(arg1, arg2) {\n        logFn(arg1, arg2 == null ? '' : arg2);\n      };\n    }\n  }];\n}\n\nvar $parseMinErr = minErr('$parse');\n\n// Sandboxing Angular Expressions\n// ------------------------------\n// Angular expressions are generally considered safe because these expressions only have direct\n// access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by\n// obtaining a reference to native JS functions such as the Function constructor.\n//\n// As an example, consider the following Angular expression:\n//\n//   {}.toString.constructor(alert(\"evil JS code\"))\n//\n// We want to prevent this type of access. For the sake of performance, during the lexing phase we\n// disallow any \"dotted\" access to any member named \"constructor\".\n//\n// For reflective calls (a[b]) we check that the value of the lookup is not the Function constructor\n// while evaluating the expression, which is a stronger but more expensive test. Since reflective\n// calls are expensive anyway, this is not such a big deal compared to static dereferencing.\n//\n// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits\n// against the expression language, but not to prevent exploits that were enabled by exposing\n// sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good\n// practice and therefore we are not even trying to protect against interaction with an object\n// explicitly exposed in this way.\n//\n// A developer could foil the name check by aliasing the Function constructor under a different\n// name on the scope.\n//\n// In general, it is not possible to access a Window object from an angular expression unless a\n// window or some DOM object that has a reference to window is published onto a Scope.\n\nfunction ensureSafeMemberName(name, fullExpression) {\n  if (name === \"constructor\") {\n    throw $parseMinErr('isecfld',\n        'Referencing \"constructor\" field in Angular expressions is disallowed! Expression: {0}',\n        fullExpression);\n  }\n  return name;\n}\n\nfunction ensureSafeObject(obj, fullExpression) {\n  // nifty check if obj is Function that is fast and works across iframes and other contexts\n  if (obj) {\n    if (obj.constructor === obj) {\n      throw $parseMinErr('isecfn',\n          'Referencing Function in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isWindow(obj)\n        obj.document && obj.location && obj.alert && obj.setInterval) {\n      throw $parseMinErr('isecwindow',\n          'Referencing the Window in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isElement(obj)\n        obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {\n      throw $parseMinErr('isecdom',\n          'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    }\n  }\n  return obj;\n}\n\nvar OPERATORS = {\n    /* jshint bitwise : false */\n    'null':function(){return null;},\n    'true':function(){return true;},\n    'false':function(){return false;},\n    undefined:noop,\n    '+':function(self, locals, a,b){\n      a=a(self, locals); b=b(self, locals);\n      if (isDefined(a)) {\n        if (isDefined(b)) {\n          return a + b;\n        }\n        return a;\n      }\n      return isDefined(b)?b:undefined;},\n    '-':function(self, locals, a,b){\n          a=a(self, locals); b=b(self, locals);\n          return (isDefined(a)?a:0)-(isDefined(b)?b:0);\n        },\n    '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);},\n    '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);},\n    '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},\n    '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);},\n    '=':noop,\n    '===':function(self, locals, a, b){return a(self, locals)===b(self, locals);},\n    '!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);},\n    '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},\n    '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},\n    '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},\n    '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);},\n    '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);},\n    '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);},\n    '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);},\n    '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);},\n    '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);},\n//    '|':function(self, locals, a,b){return a|b;},\n    '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));},\n    '!':function(self, locals, a){return !a(self, locals);}\n};\n/* jshint bitwise: true */\nvar ESCAPE = {\"n\":\"\\n\", \"f\":\"\\f\", \"r\":\"\\r\", \"t\":\"\\t\", \"v\":\"\\v\", \"'\":\"'\", '\"':'\"'};\n\n\n/////////////////////////////////////////\n\n\n/**\n * @constructor\n */\nvar Lexer = function (options) {\n  this.options = options;\n};\n\nLexer.prototype = {\n  constructor: Lexer,\n\n  lex: function (text) {\n    this.text = text;\n\n    this.index = 0;\n    this.ch = undefined;\n    this.lastCh = ':'; // can start regexp\n\n    this.tokens = [];\n\n    while (this.index < this.text.length) {\n      this.ch = this.text.charAt(this.index);\n      if (this.is('\"\\'')) {\n        this.readString(this.ch);\n      } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) {\n        this.readNumber();\n      } else if (this.isIdent(this.ch)) {\n        this.readIdent();\n      } else if (this.is('(){}[].,;:?')) {\n        this.tokens.push({\n          index: this.index,\n          text: this.ch\n        });\n        this.index++;\n      } else if (this.isWhitespace(this.ch)) {\n        this.index++;\n        continue;\n      } else {\n        var ch2 = this.ch + this.peek();\n        var ch3 = ch2 + this.peek(2);\n        var fn = OPERATORS[this.ch];\n        var fn2 = OPERATORS[ch2];\n        var fn3 = OPERATORS[ch3];\n        if (fn3) {\n          this.tokens.push({index: this.index, text: ch3, fn: fn3});\n          this.index += 3;\n        } else if (fn2) {\n          this.tokens.push({index: this.index, text: ch2, fn: fn2});\n          this.index += 2;\n        } else if (fn) {\n          this.tokens.push({\n            index: this.index,\n            text: this.ch,\n            fn: fn\n          });\n          this.index += 1;\n        } else {\n          this.throwError('Unexpected next character ', this.index, this.index + 1);\n        }\n      }\n      this.lastCh = this.ch;\n    }\n    return this.tokens;\n  },\n\n  is: function(chars) {\n    return chars.indexOf(this.ch) !== -1;\n  },\n\n  was: function(chars) {\n    return chars.indexOf(this.lastCh) !== -1;\n  },\n\n  peek: function(i) {\n    var num = i || 1;\n    return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;\n  },\n\n  isNumber: function(ch) {\n    return ('0' <= ch && ch <= '9');\n  },\n\n  isWhitespace: function(ch) {\n    // IE treats non-breaking space as \\u00A0\n    return (ch === ' ' || ch === '\\r' || ch === '\\t' ||\n            ch === '\\n' || ch === '\\v' || ch === '\\u00A0');\n  },\n\n  isIdent: function(ch) {\n    return ('a' <= ch && ch <= 'z' ||\n            'A' <= ch && ch <= 'Z' ||\n            '_' === ch || ch === '$');\n  },\n\n  isExpOperator: function(ch) {\n    return (ch === '-' || ch === '+' || this.isNumber(ch));\n  },\n\n  throwError: function(error, start, end) {\n    end = end || this.index;\n    var colStr = (isDefined(start)\n            ? 's ' + start +  '-' + this.index + ' [' + this.text.substring(start, end) + ']'\n            : ' ' + end);\n    throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',\n        error, colStr, this.text);\n  },\n\n  readNumber: function() {\n    var number = '';\n    var start = this.index;\n    while (this.index < this.text.length) {\n      var ch = lowercase(this.text.charAt(this.index));\n      if (ch == '.' || this.isNumber(ch)) {\n        number += ch;\n      } else {\n        var peekCh = this.peek();\n        if (ch == 'e' && this.isExpOperator(peekCh)) {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            peekCh && this.isNumber(peekCh) &&\n            number.charAt(number.length - 1) == 'e') {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            (!peekCh || !this.isNumber(peekCh)) &&\n            number.charAt(number.length - 1) == 'e') {\n          this.throwError('Invalid exponent');\n        } else {\n          break;\n        }\n      }\n      this.index++;\n    }\n    number = 1 * number;\n    this.tokens.push({\n      index: start,\n      text: number,\n      literal: true,\n      constant: true,\n      fn: function() { return number; }\n    });\n  },\n\n  readIdent: function() {\n    var parser = this;\n\n    var ident = '';\n    var start = this.index;\n\n    var lastDot, peekIndex, methodName, ch;\n\n    while (this.index < this.text.length) {\n      ch = this.text.charAt(this.index);\n      if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) {\n        if (ch === '.') lastDot = this.index;\n        ident += ch;\n      } else {\n        break;\n      }\n      this.index++;\n    }\n\n    //check if this is not a method invocation and if it is back out to last dot\n    if (lastDot) {\n      peekIndex = this.index;\n      while (peekIndex < this.text.length) {\n        ch = this.text.charAt(peekIndex);\n        if (ch === '(') {\n          methodName = ident.substr(lastDot - start + 1);\n          ident = ident.substr(0, lastDot - start);\n          this.index = peekIndex;\n          break;\n        }\n        if (this.isWhitespace(ch)) {\n          peekIndex++;\n        } else {\n          break;\n        }\n      }\n    }\n\n\n    var token = {\n      index: start,\n      text: ident\n    };\n\n    // OPERATORS is our own object so we don't need to use special hasOwnPropertyFn\n    if (OPERATORS.hasOwnProperty(ident)) {\n      token.fn = OPERATORS[ident];\n      token.literal = true;\n      token.constant = true;\n    } else {\n      var getter = getterFn(ident, this.options, this.text);\n      token.fn = extend(function(self, locals) {\n        return (getter(self, locals));\n      }, {\n        assign: function(self, value) {\n          return setter(self, ident, value, parser.text, parser.options);\n        }\n      });\n    }\n\n    this.tokens.push(token);\n\n    if (methodName) {\n      this.tokens.push({\n        index:lastDot,\n        text: '.'\n      });\n      this.tokens.push({\n        index: lastDot + 1,\n        text: methodName\n      });\n    }\n  },\n\n  readString: function(quote) {\n    var start = this.index;\n    this.index++;\n    var string = '';\n    var rawString = quote;\n    var escape = false;\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      rawString += ch;\n      if (escape) {\n        if (ch === 'u') {\n          var hex = this.text.substring(this.index + 1, this.index + 5);\n          if (!hex.match(/[\\da-f]{4}/i))\n            this.throwError('Invalid unicode escape [\\\\u' + hex + ']');\n          this.index += 4;\n          string += String.fromCharCode(parseInt(hex, 16));\n        } else {\n          var rep = ESCAPE[ch];\n          if (rep) {\n            string += rep;\n          } else {\n            string += ch;\n          }\n        }\n        escape = false;\n      } else if (ch === '\\\\') {\n        escape = true;\n      } else if (ch === quote) {\n        this.index++;\n        this.tokens.push({\n          index: start,\n          text: rawString,\n          string: string,\n          literal: true,\n          constant: true,\n          fn: function() { return string; }\n        });\n        return;\n      } else {\n        string += ch;\n      }\n      this.index++;\n    }\n    this.throwError('Unterminated quote', start);\n  }\n};\n\n\n/**\n * @constructor\n */\nvar Parser = function (lexer, $filter, options) {\n  this.lexer = lexer;\n  this.$filter = $filter;\n  this.options = options;\n};\n\nParser.ZERO = extend(function () {\n  return 0;\n}, {\n  constant: true\n});\n\nParser.prototype = {\n  constructor: Parser,\n\n  parse: function (text) {\n    this.text = text;\n\n    this.tokens = this.lexer.lex(text);\n\n    var value = this.statements();\n\n    if (this.tokens.length !== 0) {\n      this.throwError('is an unexpected token', this.tokens[0]);\n    }\n\n    value.literal = !!value.literal;\n    value.constant = !!value.constant;\n\n    return value;\n  },\n\n  primary: function () {\n    var primary;\n    if (this.expect('(')) {\n      primary = this.filterChain();\n      this.consume(')');\n    } else if (this.expect('[')) {\n      primary = this.arrayDeclaration();\n    } else if (this.expect('{')) {\n      primary = this.object();\n    } else {\n      var token = this.expect();\n      primary = token.fn;\n      if (!primary) {\n        this.throwError('not a primary expression', token);\n      }\n      primary.literal = !!token.literal;\n      primary.constant = !!token.constant;\n    }\n\n    var next, context;\n    while ((next = this.expect('(', '[', '.'))) {\n      if (next.text === '(') {\n        primary = this.functionCall(primary, context);\n        context = null;\n      } else if (next.text === '[') {\n        context = primary;\n        primary = this.objectIndex(primary);\n      } else if (next.text === '.') {\n        context = primary;\n        primary = this.fieldAccess(primary);\n      } else {\n        this.throwError('IMPOSSIBLE');\n      }\n    }\n    return primary;\n  },\n\n  throwError: function(msg, token) {\n    throw $parseMinErr('syntax',\n        'Syntax Error: Token \\'{0}\\' {1} at column {2} of the expression [{3}] starting at [{4}].',\n          token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));\n  },\n\n  peekToken: function() {\n    if (this.tokens.length === 0)\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    return this.tokens[0];\n  },\n\n  peek: function(e1, e2, e3, e4) {\n    if (this.tokens.length > 0) {\n      var token = this.tokens[0];\n      var t = token.text;\n      if (t === e1 || t === e2 || t === e3 || t === e4 ||\n          (!e1 && !e2 && !e3 && !e4)) {\n        return token;\n      }\n    }\n    return false;\n  },\n\n  expect: function(e1, e2, e3, e4){\n    var token = this.peek(e1, e2, e3, e4);\n    if (token) {\n      this.tokens.shift();\n      return token;\n    }\n    return false;\n  },\n\n  consume: function(e1){\n    if (!this.expect(e1)) {\n      this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());\n    }\n  },\n\n  unaryFn: function(fn, right) {\n    return extend(function(self, locals) {\n      return fn(self, locals, right);\n    }, {\n      constant:right.constant\n    });\n  },\n\n  ternaryFn: function(left, middle, right){\n    return extend(function(self, locals){\n      return left(self, locals) ? middle(self, locals) : right(self, locals);\n    }, {\n      constant: left.constant && middle.constant && right.constant\n    });\n  },\n\n  binaryFn: function(left, fn, right) {\n    return extend(function(self, locals) {\n      return fn(self, locals, left, right);\n    }, {\n      constant:left.constant && right.constant\n    });\n  },\n\n  statements: function() {\n    var statements = [];\n    while (true) {\n      if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))\n        statements.push(this.filterChain());\n      if (!this.expect(';')) {\n        // optimize for the common case where there is only one statement.\n        // TODO(size): maybe we should not support multiple statements?\n        return (statements.length === 1)\n            ? statements[0]\n            : function(self, locals) {\n                var value;\n                for (var i = 0; i < statements.length; i++) {\n                  var statement = statements[i];\n                  if (statement) {\n                    value = statement(self, locals);\n                  }\n                }\n                return value;\n              };\n      }\n    }\n  },\n\n  filterChain: function() {\n    var left = this.expression();\n    var token;\n    while (true) {\n      if ((token = this.expect('|'))) {\n        left = this.binaryFn(left, token.fn, this.filter());\n      } else {\n        return left;\n      }\n    }\n  },\n\n  filter: function() {\n    var token = this.expect();\n    var fn = this.$filter(token.text);\n    var argsFn = [];\n    while (true) {\n      if ((token = this.expect(':'))) {\n        argsFn.push(this.expression());\n      } else {\n        var fnInvoke = function(self, locals, input) {\n          var args = [input];\n          for (var i = 0; i < argsFn.length; i++) {\n            args.push(argsFn[i](self, locals));\n          }\n          return fn.apply(self, args);\n        };\n        return function() {\n          return fnInvoke;\n        };\n      }\n    }\n  },\n\n  expression: function() {\n    return this.assignment();\n  },\n\n  assignment: function() {\n    var left = this.ternary();\n    var right;\n    var token;\n    if ((token = this.expect('='))) {\n      if (!left.assign) {\n        this.throwError('implies assignment but [' +\n            this.text.substring(0, token.index) + '] can not be assigned to', token);\n      }\n      right = this.ternary();\n      return function(scope, locals) {\n        return left.assign(scope, right(scope, locals), locals);\n      };\n    }\n    return left;\n  },\n\n  ternary: function() {\n    var left = this.logicalOR();\n    var middle;\n    var token;\n    if ((token = this.expect('?'))) {\n      middle = this.ternary();\n      if ((token = this.expect(':'))) {\n        return this.ternaryFn(left, middle, this.ternary());\n      } else {\n        this.throwError('expected :', token);\n      }\n    } else {\n      return left;\n    }\n  },\n\n  logicalOR: function() {\n    var left = this.logicalAND();\n    var token;\n    while (true) {\n      if ((token = this.expect('||'))) {\n        left = this.binaryFn(left, token.fn, this.logicalAND());\n      } else {\n        return left;\n      }\n    }\n  },\n\n  logicalAND: function() {\n    var left = this.equality();\n    var token;\n    if ((token = this.expect('&&'))) {\n      left = this.binaryFn(left, token.fn, this.logicalAND());\n    }\n    return left;\n  },\n\n  equality: function() {\n    var left = this.relational();\n    var token;\n    if ((token = this.expect('==','!=','===','!=='))) {\n      left = this.binaryFn(left, token.fn, this.equality());\n    }\n    return left;\n  },\n\n  relational: function() {\n    var left = this.additive();\n    var token;\n    if ((token = this.expect('<', '>', '<=', '>='))) {\n      left = this.binaryFn(left, token.fn, this.relational());\n    }\n    return left;\n  },\n\n  additive: function() {\n    var left = this.multiplicative();\n    var token;\n    while ((token = this.expect('+','-'))) {\n      left = this.binaryFn(left, token.fn, this.multiplicative());\n    }\n    return left;\n  },\n\n  multiplicative: function() {\n    var left = this.unary();\n    var token;\n    while ((token = this.expect('*','/','%'))) {\n      left = this.binaryFn(left, token.fn, this.unary());\n    }\n    return left;\n  },\n\n  unary: function() {\n    var token;\n    if (this.expect('+')) {\n      return this.primary();\n    } else if ((token = this.expect('-'))) {\n      return this.binaryFn(Parser.ZERO, token.fn, this.unary());\n    } else if ((token = this.expect('!'))) {\n      return this.unaryFn(token.fn, this.unary());\n    } else {\n      return this.primary();\n    }\n  },\n\n  fieldAccess: function(object) {\n    var parser = this;\n    var field = this.expect().text;\n    var getter = getterFn(field, this.options, this.text);\n\n    return extend(function(scope, locals, self) {\n      return getter(self || object(scope, locals));\n    }, {\n      assign: function(scope, value, locals) {\n        return setter(object(scope, locals), field, value, parser.text, parser.options);\n      }\n    });\n  },\n\n  objectIndex: function(obj) {\n    var parser = this;\n\n    var indexFn = this.expression();\n    this.consume(']');\n\n    return extend(function(self, locals) {\n      var o = obj(self, locals),\n          i = indexFn(self, locals),\n          v, p;\n\n      if (!o) return undefined;\n      v = ensureSafeObject(o[i], parser.text);\n      return v;\n    }, {\n      assign: function(self, value, locals) {\n        var key = indexFn(self, locals);\n        // prevent overwriting of Function.constructor which would break ensureSafeObject check\n        var safe = ensureSafeObject(obj(self, locals), parser.text);\n        return safe[key] = value;\n      }\n    });\n  },\n\n  functionCall: function(fn, contextGetter) {\n    var argsFn = [];\n    if (this.peekToken().text !== ')') {\n      do {\n        argsFn.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume(')');\n\n    var parser = this;\n\n    return function(scope, locals) {\n      var args = [];\n      var context = contextGetter ? contextGetter(scope, locals) : scope;\n\n      for (var i = 0; i < argsFn.length; i++) {\n        args.push(argsFn[i](scope, locals));\n      }\n      var fnPtr = fn(scope, locals, context) || noop;\n\n      ensureSafeObject(context, parser.text);\n      ensureSafeObject(fnPtr, parser.text);\n\n      // IE stupidity! (IE doesn't have apply for some native functions)\n      var v = fnPtr.apply\n            ? fnPtr.apply(context, args)\n            : fnPtr(args[0], args[1], args[2], args[3], args[4]);\n\n      return ensureSafeObject(v, parser.text);\n    };\n  },\n\n  // This is used with json array declaration\n  arrayDeclaration: function () {\n    var elementFns = [];\n    var allConstant = true;\n    if (this.peekToken().text !== ']') {\n      do {\n        if (this.peek(']')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        var elementFn = this.expression();\n        elementFns.push(elementFn);\n        if (!elementFn.constant) {\n          allConstant = false;\n        }\n      } while (this.expect(','));\n    }\n    this.consume(']');\n\n    return extend(function(self, locals) {\n      var array = [];\n      for (var i = 0; i < elementFns.length; i++) {\n        array.push(elementFns[i](self, locals));\n      }\n      return array;\n    }, {\n      literal: true,\n      constant: allConstant\n    });\n  },\n\n  object: function () {\n    var keyValues = [];\n    var allConstant = true;\n    if (this.peekToken().text !== '}') {\n      do {\n        if (this.peek('}')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        var token = this.expect(),\n        key = token.string || token.text;\n        this.consume(':');\n        var value = this.expression();\n        keyValues.push({key: key, value: value});\n        if (!value.constant) {\n          allConstant = false;\n        }\n      } while (this.expect(','));\n    }\n    this.consume('}');\n\n    return extend(function(self, locals) {\n      var object = {};\n      for (var i = 0; i < keyValues.length; i++) {\n        var keyValue = keyValues[i];\n        object[keyValue.key] = keyValue.value(self, locals);\n      }\n      return object;\n    }, {\n      literal: true,\n      constant: allConstant\n    });\n  }\n};\n\n\n//////////////////////////////////////////////////\n// Parser helper functions\n//////////////////////////////////////////////////\n\nfunction setter(obj, path, setValue, fullExp, options) {\n  //needed?\n  options = options || {};\n\n  var element = path.split('.'), key;\n  for (var i = 0; element.length > 1; i++) {\n    key = ensureSafeMemberName(element.shift(), fullExp);\n    var propertyObj = obj[key];\n    if (!propertyObj) {\n      propertyObj = {};\n      obj[key] = propertyObj;\n    }\n    obj = propertyObj;\n  }\n  key = ensureSafeMemberName(element.shift(), fullExp);\n  obj[key] = setValue;\n  return setValue;\n}\n\nvar getterFnCache = {};\n\n/**\n * Implementation of the \"Black Hole\" variant from:\n * - http://jsperf.com/angularjs-parse-getter/4\n * - http://jsperf.com/path-evaluation-simplified/7\n */\nfunction cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {\n  ensureSafeMemberName(key0, fullExp);\n  ensureSafeMemberName(key1, fullExp);\n  ensureSafeMemberName(key2, fullExp);\n  ensureSafeMemberName(key3, fullExp);\n  ensureSafeMemberName(key4, fullExp);\n\n  return function cspSafeGetter(scope, locals) {\n    var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope;\n\n    if (pathVal == null) return pathVal;\n    pathVal = pathVal[key0];\n\n    if (!key1) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key1];\n\n    if (!key2) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key2];\n\n    if (!key3) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key3];\n\n    if (!key4) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key4];\n\n    return pathVal;\n  };\n}\n\nfunction simpleGetterFn1(key0, fullExp) {\n  ensureSafeMemberName(key0, fullExp);\n\n  return function simpleGetterFn1(scope, locals) {\n    if (scope == null) return undefined;\n    return ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];\n  };\n}\n\nfunction simpleGetterFn2(key0, key1, fullExp) {\n  ensureSafeMemberName(key0, fullExp);\n  ensureSafeMemberName(key1, fullExp);\n\n  return function simpleGetterFn2(scope, locals) {\n    if (scope == null) return undefined;\n    scope = ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];\n    return scope == null ? undefined : scope[key1];\n  };\n}\n\nfunction getterFn(path, options, fullExp) {\n  // Check whether the cache has this getter already.\n  // We can use hasOwnProperty directly on the cache because we ensure,\n  // see below, that the cache never stores a path called 'hasOwnProperty'\n  if (getterFnCache.hasOwnProperty(path)) {\n    return getterFnCache[path];\n  }\n\n  var pathKeys = path.split('.'),\n      pathKeysLength = pathKeys.length,\n      fn;\n\n  // When we have only 1 or 2 tokens, use optimized special case closures.\n  // http://jsperf.com/angularjs-parse-getter/6\n  if (pathKeysLength === 1) {\n    fn = simpleGetterFn1(pathKeys[0], fullExp);\n  } else if (pathKeysLength === 2) {\n    fn = simpleGetterFn2(pathKeys[0], pathKeys[1], fullExp);\n  } else if (options.csp) {\n    if (pathKeysLength < 6) {\n      fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp,\n                          options);\n    } else {\n      fn = function(scope, locals) {\n        var i = 0, val;\n        do {\n          val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++],\n                                pathKeys[i++], fullExp, options)(scope, locals);\n\n          locals = undefined; // clear after first iteration\n          scope = val;\n        } while (i < pathKeysLength);\n        return val;\n      };\n    }\n  } else {\n    var code = 'var p;\\n';\n    forEach(pathKeys, function(key, index) {\n      ensureSafeMemberName(key, fullExp);\n      code += 'if(s == null) return undefined;\\n' +\n              's='+ (index\n                      // we simply dereference 's' on any .dot notation\n                      ? 's'\n                      // but if we are first then we check locals first, and if so read it first\n                      : '((k&&k.hasOwnProperty(\"' + key + '\"))?k:s)') + '[\"' + key + '\"]' + ';\\n';\n    });\n    code += 'return s;';\n\n    /* jshint -W054 */\n    var evaledFnGetter = new Function('s', 'k', code); // s=scope, k=locals\n    /* jshint +W054 */\n    evaledFnGetter.toString = valueFn(code);\n    fn = evaledFnGetter;\n  }\n\n  // Only cache the value if it's not going to mess up the cache object\n  // This is more performant that using Object.prototype.hasOwnProperty.call\n  if (path !== 'hasOwnProperty') {\n    getterFnCache[path] = fn;\n  }\n  return fn;\n}\n\n///////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $parse\n * @kind function\n *\n * @description\n *\n * Converts Angular {@link guide/expression expression} into a function.\n *\n * ```js\n *   var getter = $parse('user.name');\n *   var setter = getter.assign;\n *   var context = {user:{name:'angular'}};\n *   var locals = {user:{name:'local'}};\n *\n *   expect(getter(context)).toEqual('angular');\n *   setter(context, 'newValue');\n *   expect(context.user.name).toEqual('newValue');\n *   expect(getter(context, locals)).toEqual('local');\n * ```\n *\n *\n * @param {string} expression String expression to compile.\n * @returns {function(context, locals)} a function which represents the compiled expression:\n *\n *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n *      are evaluated against (typically a scope object).\n *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n *      `context`.\n *\n *    The returned function also has the following properties:\n *      * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript\n *        literal.\n *      * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript\n *        constant literals.\n *      * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be\n *        set to a function to change its value on the given context.\n *\n */\n\n\n/**\n * @ngdoc provider\n * @name $parseProvider\n * @function\n *\n * @description\n * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}\n *  service.\n */\nfunction $ParseProvider() {\n  var cache = {};\n\n  var $parseOptions = {\n    csp: false\n  };\n\n\n  this.$get = ['$filter', '$sniffer', '$log', function($filter, $sniffer, $log) {\n    $parseOptions.csp = $sniffer.csp;\n\n    return function(exp) {\n      var parsedExpression,\n          oneTime;\n\n      switch (typeof exp) {\n        case 'string':\n\n          if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {\n            oneTime = true;\n            exp = exp.substring(2);\n          }\n\n          if (cache.hasOwnProperty(exp)) {\n            return oneTime ? oneTimeWrapper(cache[exp]) : cache[exp];\n          }\n\n          var lexer = new Lexer($parseOptions);\n          var parser = new Parser(lexer, $filter, $parseOptions);\n          parsedExpression = parser.parse(exp);\n\n          if (exp !== 'hasOwnProperty') {\n            // Only cache the value if it's not going to mess up the cache object\n            // This is more performant that using Object.prototype.hasOwnProperty.call\n            cache[exp] = parsedExpression;\n          }\n\n          if (parsedExpression.constant) {\n            parsedExpression.$$unwatch = true;\n          }\n\n          return oneTime ? oneTimeWrapper(parsedExpression) : parsedExpression;\n\n        case 'function':\n          return exp;\n\n        default:\n          return noop;\n      }\n\n      function oneTimeWrapper(expression) {\n        var stable = false,\n            lastValue;\n        oneTimeParseFn.literal = expression.literal;\n        oneTimeParseFn.constant = expression.constant;\n        oneTimeParseFn.assign = expression.assign;\n        return oneTimeParseFn;\n\n        function oneTimeParseFn(self, locals) {\n          if (!stable) {\n            lastValue = expression(self, locals);\n            oneTimeParseFn.$$unwatch = isDefined(lastValue);\n            if (oneTimeParseFn.$$unwatch && self && self.$$postDigestQueue) {\n              self.$$postDigestQueue.push(function () {\n                // create a copy if the value is defined and it is not a $sce value\n                if ((stable = isDefined(lastValue)) && !lastValue.$$unwrapTrustedValue) {\n                  lastValue = copy(lastValue);\n                }\n              });\n            }\n          }\n          return lastValue;\n        }\n      }\n    };\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $q\n * @requires $rootScope\n *\n * @description\n * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).\n *\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\n * interface for interacting with an object that represents the result of an action that is\n * performed asynchronously, and may or may not be finished at any given point in time.\n *\n * From the perspective of dealing with error handling, deferred and promise APIs are to\n * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q`, `scope` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     var deferred = $q.defer();\n *\n *     setTimeout(function() {\n *       // since this fn executes async in a future turn of the event loop, we need to wrap\n *       // our code into an $apply call so that the model changes are properly observed.\n *       scope.$apply(function() {\n *         deferred.notify('About to greet ' + name + '.');\n *\n *         if (okToGreet(name)) {\n *           deferred.resolve('Hello, ' + name + '!');\n *         } else {\n *           deferred.reject('Greeting ' + name + ' is not allowed.');\n *         }\n *       });\n *     }, 1000);\n *\n *     return deferred.promise;\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   }, function(update) {\n *     alert('Got notification: ' + update);\n *   });\n * ```\n *\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\n * comes in the way of guarantees that promise and deferred APIs make, see\n * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.\n *\n * Additionally the promise api allows for composition that is very hard to do with the\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\n * section on serial or parallel joining of promises.\n *\n *\n * # The Deferred API\n *\n * A new instance of deferred is constructed by calling `$q.defer()`.\n *\n * The purpose of the deferred object is to expose the associated Promise instance as well as APIs\n * that can be used for signaling the successful or unsuccessful completion, as well as the status\n * of the task.\n *\n * **Methods**\n *\n * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection\n *   constructed via `$q.reject`, the promise will be rejected instead.\n * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to\n *   resolving it with a rejection constructed via `$q.reject`.\n * - `notify(value)` - provides updates on the status of the promise's execution. This may be called\n *   multiple times before the promise is either resolved or rejected.\n *\n * **Properties**\n *\n * - promise – `{Promise}` – promise object associated with this deferred.\n *\n *\n * # The Promise API\n *\n * A new promise instance is created when a deferred instance is created and can be retrieved by\n * calling `deferred.promise`.\n *\n * The purpose of the promise object is to allow for interested parties to get access to the result\n * of the deferred task when it completes.\n *\n * **Methods**\n *\n * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or\n *   will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously\n *   as soon as the result is available. The callbacks are called with a single argument: the result\n *   or rejection reason. Additionally, the notify callback may be called zero or more times to\n *   provide a progress indication, before the promise is resolved or rejected.\n *\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\n *   `successCallback`, `errorCallback`. It also notifies via the return value of the\n *   `notifyCallback` method. The promise can not be resolved or rejected from the notifyCallback\n *   method.\n *\n * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`\n *\n * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,\n *   but to do so without modifying the final value. This is useful to release resources or do some\n *   clean-up that needs to be done whether the promise was rejected or resolved. See the [full\n *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for\n *   more information.\n *\n *   Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as\n *   property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to\n *   make your code IE8 and Android 2.x compatible.\n *\n * # Chaining promises\n *\n * Because calling the `then` method of a promise returns a new derived promise, it is easily\n * possible to create a chain of promises:\n *\n * ```js\n *   promiseB = promiseA.then(function(result) {\n *     return result + 1;\n *   });\n *\n *   // promiseB will be resolved immediately after promiseA is resolved and its value\n *   // will be the result of promiseA incremented by 1\n * ```\n *\n * It is possible to create chains of any length and since a promise can be resolved with another\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\n * the promises at any point in the chain. This makes it possible to implement powerful APIs like\n * $http's response interceptors.\n *\n *\n * # Differences between Kris Kowal's Q and $q\n *\n *  There are two main differences:\n *\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\n *   mechanism in angular, which means faster propagation of resolution or rejection into your\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\n * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains\n *   all the important functionality needed for common async tasks.\n *\n *  # Testing\n *\n *  ```js\n *    it('should simulate promise', inject(function($q, $rootScope) {\n *      var deferred = $q.defer();\n *      var promise = deferred.promise;\n *      var resolvedValue;\n *\n *      promise.then(function(value) { resolvedValue = value; });\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Simulate resolving of promise\n *      deferred.resolve(123);\n *      // Note that the 'then' function does not get called synchronously.\n *      // This is because we want the promise API to always be async, whether or not\n *      // it got called synchronously or asynchronously.\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Propagate promise resolution to 'then' functions using $apply().\n *      $rootScope.$apply();\n *      expect(resolvedValue).toEqual(123);\n *    }));\n *  ```\n */\nfunction $QProvider() {\n\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $rootScope.$evalAsync(callback);\n    }, $exceptionHandler);\n  }];\n}\n\n\n/**\n * Constructs a promise manager.\n *\n * @param {function(Function)} nextTick Function for executing functions in the next turn.\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\n *     debugging purposes.\n * @returns {object} Promise manager.\n */\nfunction qFactory(nextTick, exceptionHandler) {\n\n  /**\n   * @ngdoc method\n   * @name $q#defer\n   * @function\n   *\n   * @description\n   * Creates a `Deferred` object which represents a task which will finish in the future.\n   *\n   * @returns {Deferred} Returns a new instance of deferred.\n   */\n  var defer = function() {\n    var pending = [],\n        value, deferred;\n\n    deferred = {\n\n      resolve: function(val) {\n        if (pending) {\n          var callbacks = pending;\n          pending = undefined;\n          value = ref(val);\n\n          if (callbacks.length) {\n            nextTick(function() {\n              var callback;\n              for (var i = 0, ii = callbacks.length; i < ii; i++) {\n                callback = callbacks[i];\n                value.then(callback[0], callback[1], callback[2]);\n              }\n            });\n          }\n        }\n      },\n\n\n      reject: function(reason) {\n        deferred.resolve(createInternalRejectedPromise(reason));\n      },\n\n\n      notify: function(progress) {\n        if (pending) {\n          var callbacks = pending;\n\n          if (pending.length) {\n            nextTick(function() {\n              var callback;\n              for (var i = 0, ii = callbacks.length; i < ii; i++) {\n                callback = callbacks[i];\n                callback[2](progress);\n              }\n            });\n          }\n        }\n      },\n\n\n      promise: {\n        then: function(callback, errback, progressback) {\n          var result = defer();\n\n          var wrappedCallback = function(value) {\n            try {\n              result.resolve((isFunction(callback) ? callback : defaultCallback)(value));\n            } catch(e) {\n              result.reject(e);\n              exceptionHandler(e);\n            }\n          };\n\n          var wrappedErrback = function(reason) {\n            try {\n              result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));\n            } catch(e) {\n              result.reject(e);\n              exceptionHandler(e);\n            }\n          };\n\n          var wrappedProgressback = function(progress) {\n            try {\n              result.notify((isFunction(progressback) ? progressback : defaultCallback)(progress));\n            } catch(e) {\n              exceptionHandler(e);\n            }\n          };\n\n          if (pending) {\n            pending.push([wrappedCallback, wrappedErrback, wrappedProgressback]);\n          } else {\n            value.then(wrappedCallback, wrappedErrback, wrappedProgressback);\n          }\n\n          return result.promise;\n        },\n\n        \"catch\": function(callback) {\n          return this.then(null, callback);\n        },\n\n        \"finally\": function(callback) {\n\n          function makePromise(value, resolved) {\n            var result = defer();\n            if (resolved) {\n              result.resolve(value);\n            } else {\n              result.reject(value);\n            }\n            return result.promise;\n          }\n\n          function handleCallback(value, isResolved) {\n            var callbackOutput = null;\n            try {\n              callbackOutput = (callback ||defaultCallback)();\n            } catch(e) {\n              return makePromise(e, false);\n            }\n            if (callbackOutput && isFunction(callbackOutput.then)) {\n              return callbackOutput.then(function() {\n                return makePromise(value, isResolved);\n              }, function(error) {\n                return makePromise(error, false);\n              });\n            } else {\n              return makePromise(value, isResolved);\n            }\n          }\n\n          return this.then(function(value) {\n            return handleCallback(value, true);\n          }, function(error) {\n            return handleCallback(error, false);\n          });\n        }\n      }\n    };\n\n    return deferred;\n  };\n\n\n  var ref = function(value) {\n    if (value && isFunction(value.then)) return value;\n    return {\n      then: function(callback) {\n        var result = defer();\n        nextTick(function() {\n          result.resolve(callback(value));\n        });\n        return result.promise;\n      }\n    };\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $q#reject\n   * @function\n   *\n   * @description\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\n   * a promise chain, you don't need to worry about it.\n   *\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\n   * a promise error callback and you want to forward the error to the promise derived from the\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\n   * `reject`.\n   *\n   * ```js\n   *   promiseB = promiseA.then(function(result) {\n   *     // success: do something and resolve promiseB\n   *     //          with the old or a new result\n   *     return result;\n   *   }, function(reason) {\n   *     // error: handle the error if possible and\n   *     //        resolve promiseB with newPromiseOrValue,\n   *     //        otherwise forward the rejection to promiseB\n   *     if (canHandle(reason)) {\n   *      // handle the error and recover\n   *      return newPromiseOrValue;\n   *     }\n   *     return $q.reject(reason);\n   *   });\n   * ```\n   *\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\n   */\n  var reject = function(reason) {\n    var result = defer();\n    result.reject(reason);\n    return result.promise;\n  };\n\n  var createInternalRejectedPromise = function(reason) {\n    return {\n      then: function(callback, errback) {\n        var result = defer();\n        nextTick(function() {\n          try {\n            result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));\n          } catch(e) {\n            result.reject(e);\n            exceptionHandler(e);\n          }\n        });\n        return result.promise;\n      }\n    };\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $q#when\n   * @function\n   *\n   * @description\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\n   * This is useful when you are dealing with an object that might or might not be a promise, or if\n   * the promise comes from a source that can't be trusted.\n   *\n   * @param {*} value Value or a promise\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n  var when = function(value, callback, errback, progressback) {\n    var result = defer(),\n        done;\n\n    var wrappedCallback = function(value) {\n      try {\n        return (isFunction(callback) ? callback : defaultCallback)(value);\n      } catch (e) {\n        exceptionHandler(e);\n        return reject(e);\n      }\n    };\n\n    var wrappedErrback = function(reason) {\n      try {\n        return (isFunction(errback) ? errback : defaultErrback)(reason);\n      } catch (e) {\n        exceptionHandler(e);\n        return reject(e);\n      }\n    };\n\n    var wrappedProgressback = function(progress) {\n      try {\n        return (isFunction(progressback) ? progressback : defaultCallback)(progress);\n      } catch (e) {\n        exceptionHandler(e);\n      }\n    };\n\n    nextTick(function() {\n      ref(value).then(function(value) {\n        if (done) return;\n        done = true;\n        result.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback));\n      }, function(reason) {\n        if (done) return;\n        done = true;\n        result.resolve(wrappedErrback(reason));\n      }, function(progress) {\n        if (done) return;\n        result.notify(wrappedProgressback(progress));\n      });\n    });\n\n    return result.promise;\n  };\n\n\n  function defaultCallback(value) {\n    return value;\n  }\n\n\n  function defaultErrback(reason) {\n    return reject(reason);\n  }\n\n\n  /**\n   * @ngdoc method\n   * @name $q#all\n   * @function\n   *\n   * @description\n   * Combines multiple promises into a single promise that is resolved when all of the input\n   * promises are resolved.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,\n   *   each value corresponding to the promise at the same index/key in the `promises` array/hash.\n   *   If any of the promises is resolved with a rejection, this resulting promise will be rejected\n   *   with the same rejection value.\n   */\n  function all(promises) {\n    var deferred = defer(),\n        counter = 0,\n        results = isArray(promises) ? [] : {};\n\n    forEach(promises, function(promise, key) {\n      counter++;\n      ref(promise).then(function(value) {\n        if (results.hasOwnProperty(key)) return;\n        results[key] = value;\n        if (!(--counter)) deferred.resolve(results);\n      }, function(reason) {\n        if (results.hasOwnProperty(key)) return;\n        deferred.reject(reason);\n      });\n    });\n\n    if (counter === 0) {\n      deferred.resolve(results);\n    }\n\n    return deferred.promise;\n  }\n\n  return {\n    defer: defer,\n    reject: reject,\n    when: when,\n    all: all\n  };\n}\n\nfunction $$RAFProvider(){ //rAF\n  this.$get = ['$window', '$timeout', function($window, $timeout) {\n    var requestAnimationFrame = $window.requestAnimationFrame ||\n                                $window.webkitRequestAnimationFrame ||\n                                $window.mozRequestAnimationFrame;\n\n    var cancelAnimationFrame = $window.cancelAnimationFrame ||\n                               $window.webkitCancelAnimationFrame ||\n                               $window.mozCancelAnimationFrame ||\n                               $window.webkitCancelRequestAnimationFrame;\n\n    var rafSupported = !!requestAnimationFrame;\n    var raf = rafSupported\n      ? function(fn) {\n          var id = requestAnimationFrame(fn);\n          return function() {\n            cancelAnimationFrame(id);\n          };\n        }\n      : function(fn) {\n          var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n          return function() {\n            $timeout.cancel(timer);\n          };\n        };\n\n    raf.supported = rafSupported;\n\n    return raf;\n  }];\n}\n\n/**\n * DESIGN NOTES\n *\n * The design decisions behind the scope are heavily favored for speed and memory consumption.\n *\n * The typical use of scope is to watch the expressions, which most of the time return the same\n * value as last time so we optimize the operation.\n *\n * Closures construction is expensive in terms of speed as well as memory:\n *   - No closures, instead use prototypical inheritance for API\n *   - Internal state needs to be stored on scope directly, which means that private state is\n *     exposed as $$____ properties\n *\n * Loop operations are optimized by using while(count--) { ... }\n *   - this means that in order to keep the same order of execution as addition we have to add\n *     items to the array at the beginning (unshift) instead of at the end (push)\n *\n * Child scopes are created and removed often\n *   - Using an array would be slow since inserts in middle are expensive so we use linked list\n *\n * There are few watches then a lot of observers. This is why you don't want the observer to be\n * implemented in the same way as watch. Watch requires return of initialization function which\n * are expensive to construct.\n */\n\n\n/**\n * @ngdoc provider\n * @name $rootScopeProvider\n * @description\n *\n * Provider for the $rootScope service.\n */\n\n/**\n * @ngdoc method\n * @name $rootScopeProvider#digestTtl\n * @description\n *\n * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and\n * assuming that the model is unstable.\n *\n * The current default is 10 iterations.\n *\n * In complex applications it's possible that the dependencies between `$watch`s will result in\n * several digest iterations. However if an application needs more than the default 10 digest\n * iterations for its model to stabilize then you should investigate what is causing the model to\n * continuously change during the digest.\n *\n * Increasing the TTL could have performance implications, so you should not change it without\n * proper justification.\n *\n * @param {number} limit The number of digest iterations.\n */\n\n\n/**\n * @ngdoc service\n * @name $rootScope\n * @description\n *\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\n * All other scopes are descendant scopes of the root scope. Scopes provide separation\n * between the model and the view, via a mechanism for watching the model for changes.\n * They also provide an event emission/broadcast and subscription facility. See the\n * {@link guide/scope developer guide on scopes}.\n */\nfunction $RootScopeProvider(){\n  var TTL = 10;\n  var $rootScopeMinErr = minErr('$rootScope');\n  var lastDirtyWatch = null;\n\n  this.digestTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n    }\n    return TTL;\n  };\n\n  this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',\n      function( $injector,   $exceptionHandler,   $parse,   $browser) {\n\n    /**\n     * @ngdoc type\n     * @name $rootScope.Scope\n     *\n     * @description\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\n     * {@link auto.$injector $injector}. Child scopes are created using the\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\n     * compiled HTML template is executed.)\n     *\n     * Here is a simple scope snippet to show how you can interact with the scope.\n     * ```html\n     * <file src=\"./test/ng/rootScopeSpec.js\" tag=\"docs1\" />\n     * ```\n     *\n     * # Inheritance\n     * A scope can inherit from a parent scope, as in this example:\n     * ```js\n         var parent = $rootScope;\n         var child = parent.$new();\n\n         parent.salutation = \"Hello\";\n         child.name = \"World\";\n         expect(child.salutation).toEqual('Hello');\n\n         child.salutation = \"Welcome\";\n         expect(child.salutation).toEqual('Welcome');\n         expect(parent.salutation).toEqual('Hello');\n     * ```\n     *\n     *\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be\n     *                                       provided for the current scope. Defaults to {@link ng}.\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\n     *                              append/override services provided by `providers`. This is handy\n     *                              when unit-testing and having the need to override a default\n     *                              service.\n     * @returns {Object} Newly created scope.\n     *\n     */\n    function Scope() {\n      this.$id = nextUid();\n      this.$$phase = this.$parent = this.$$watchers =\n                     this.$$nextSibling = this.$$prevSibling =\n                     this.$$childHead = this.$$childTail = null;\n      this['this'] = this.$root =  this;\n      this.$$destroyed = false;\n      this.$$asyncQueue = [];\n      this.$$postDigestQueue = [];\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$isolateBindings = {};\n    }\n\n    /**\n     * @ngdoc property\n     * @name $rootScope.Scope#$id\n     * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for\n     *   debugging.\n     */\n\n\n    Scope.prototype = {\n      constructor: Scope,\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$new\n       * @function\n       *\n       * @description\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\n       *\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and\n       * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the\n       * scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\n       *\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is\n       * desired for the scope and its child scopes to be permanently detached from the parent and\n       * thus stop participating in model change detection and listener notification by invoking.\n       *\n       * @param {boolean} isolate If true, then the scope does not prototypically inherit from the\n       *         parent scope. The scope is isolated, as it can not see parent scope properties.\n       *         When creating widgets, it is useful for the widget to not accidentally read parent\n       *         state.\n       *\n       * @returns {Object} The newly created child scope.\n       *\n       */\n      $new: function(isolate) {\n        var ChildScope,\n            child;\n\n        if (isolate) {\n          child = new Scope();\n          child.$root = this.$root;\n          // ensure that there is just one async queue per $rootScope and its children\n          child.$$asyncQueue = this.$$asyncQueue;\n          child.$$postDigestQueue = this.$$postDigestQueue;\n        } else {\n          // Only create a child scope class if somebody asks for one,\n          // but cache it to allow the VM to optimize lookups.\n          if (!this.$$childScopeClass) {\n            this.$$childScopeClass = function() {\n              this.$$watchers = this.$$nextSibling =\n                  this.$$childHead = this.$$childTail = null;\n              this.$$listeners = {};\n              this.$$listenerCount = {};\n              this.$id = nextUid();\n              this.$$childScopeClass = null;\n            };\n            this.$$childScopeClass.prototype = this;\n          }\n          child = new this.$$childScopeClass();\n        }\n        child['this'] = child;\n        child.$parent = this;\n        child.$$prevSibling = this.$$childTail;\n        if (this.$$childHead) {\n          this.$$childTail.$$nextSibling = child;\n          this.$$childTail = child;\n        } else {\n          this.$$childHead = this.$$childTail = child;\n        }\n        return child;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watch\n       * @function\n       *\n       * @description\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\n       *\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest\n       *   $digest()} and should return the value that will be watched. (Since\n       *   {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the\n       *   `watchExpression` can execute multiple times per\n       *   {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)\n       * - The `listener` is called only when the value from the current `watchExpression` and the\n       *   previous call to `watchExpression` are not equal (with the exception of the initial run,\n       *   see below). The inequality is determined according to\n       *   {@link angular.equals} function. To save the value of the object for later comparison,\n       *   the {@link angular.copy} function is used. It also means that watching complex options\n       *   will have adverse memory and performance implications.\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire.\n       *   This is achieved by rerunning the watchers until no changes are detected. The rerun\n       *   iteration limit is 10 to prevent an infinite loop deadlock.\n       *\n       *\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\n       * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`\n       * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a\n       * change is detected, be prepared for multiple calls to your listener.)\n       *\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\n       * listener was called due to initialization.\n       *\n       * The example below contains an illustration of using a function as your $watch listener\n       *\n       *\n       * # Example\n       * ```js\n           // let's assume that scope was dependency injected as the $rootScope\n           var scope = $rootScope;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // no variable change\n           expect(scope.counter).toEqual(0);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(1);\n\n\n\n           // Using a listener function\n           var food;\n           scope.foodCounter = 0;\n           expect(scope.foodCounter).toEqual(0);\n           scope.$watch(\n             // This is the listener function\n             function() { return food; },\n             // This is the change handler\n             function(newValue, oldValue) {\n               if ( newValue !== oldValue ) {\n                 // Only increment the counter if the value changed\n                 scope.foodCounter = scope.foodCounter + 1;\n               }\n             }\n           );\n           // No digest has been run so the counter will be zero\n           expect(scope.foodCounter).toEqual(0);\n\n           // Run the digest but since food has not changed count will still be zero\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(0);\n\n           // Update food and run digest.  Now the counter will increment\n           food = 'cheeseburger';\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(1);\n\n       * ```\n       *\n       *\n       *\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers\n       *    a call to the `listener`.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(scope)`: called with current `scope` as a parameter.\n       * @param {(function()|string)=} listener Callback called whenever the return value of\n       *   the `watchExpression` changes.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(newValue, oldValue, scope)`: called with current and previous values as\n       *      parameters.\n       *\n       * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of\n       *     comparing for reference equality.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $watch: function(watchExp, listener, objectEquality) {\n        var scope = this,\n            get = compileToFn(watchExp, 'watch'),\n            array = scope.$$watchers,\n            watcher = {\n              fn: listener,\n              last: initWatchVal,\n              get: get,\n              exp: watchExp,\n              eq: !!objectEquality\n            };\n\n        lastDirtyWatch = null;\n\n        // in the case user pass string, we need to compile it, do we really need this ?\n        if (!isFunction(listener)) {\n          var listenFn = compileToFn(listener || noop, 'listener');\n          watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);};\n        }\n\n        if (!array) {\n          array = scope.$$watchers = [];\n        }\n        // we use unshift since we use a while loop in $digest for speed.\n        // the while loop reads in reverse order.\n        array.unshift(watcher);\n\n        return function deregisterWatch() {\n          arrayRemove(array, watcher);\n          lastDirtyWatch = null;\n        };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchGroup\n       * @function\n       *\n       * @description\n       * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.\n       * If any one expression in the collection changes the `listener` is executed.\n       *\n       * - The items in the `watchCollection` array are observed via standard $watch operation and are examined on every\n       *   call to $digest() to see if any items changes.\n       * - The `listener` is called whenever any expression in the `watchExpressions` array changes.\n       *\n       * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually\n       * watched using {@link ng.$rootScope.Scope#$watch $watch()}\n       *\n       * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any\n       *    expression in `watchExpressions` changes\n       *    The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    The `scope` refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for all listeners.\n       */\n      $watchGroup: function(watchExpressions, listener) {\n        var oldValues = new Array(watchExpressions.length);\n        var newValues = new Array(watchExpressions.length);\n        var deregisterFns = [];\n        var changeCount = 0;\n        var self = this;\n        var unwatchFlags = new Array(watchExpressions.length);\n        var unwatchCount = watchExpressions.length;\n\n        forEach(watchExpressions, function (expr, i) {\n          var exprFn = $parse(expr);\n          deregisterFns.push(self.$watch(exprFn, function (value, oldValue) {\n            newValues[i] = value;\n            oldValues[i] = oldValue;\n            changeCount++;\n            if (unwatchFlags[i] && !exprFn.$$unwatch) unwatchCount++;\n            if (!unwatchFlags[i] && exprFn.$$unwatch) unwatchCount--;\n            unwatchFlags[i] = exprFn.$$unwatch;\n          }));\n        }, this);\n\n        deregisterFns.push(self.$watch(watchGroupFn, function () {\n          listener(newValues, oldValues, self);\n          if (unwatchCount === 0) {\n            watchGroupFn.$$unwatch = true;\n          } else {\n            watchGroupFn.$$unwatch = false;\n          }\n        }));\n\n        return function deregisterWatchGroup() {\n          forEach(deregisterFns, function (fn) {\n            fn();\n          });\n        };\n\n        function watchGroupFn() {return changeCount;}\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchCollection\n       * @function\n       *\n       * @description\n       * Shallow watches the properties of an object and fires whenever any of the properties change\n       * (for arrays, this implies watching the array items; for object maps, this implies watching\n       * the properties). If a change is detected, the `listener` callback is fired.\n       *\n       * - The `obj` collection is observed via standard $watch operation and is examined on every\n       *   call to $digest() to see if any items have been added, removed, or moved.\n       * - The `listener` is called whenever anything within the `obj` has changed. Examples include\n       *   adding, removing, and moving items belonging to an object or array.\n       *\n       *\n       * # Example\n       * ```js\n          $scope.names = ['igor', 'matias', 'misko', 'james'];\n          $scope.dataCount = 4;\n\n          $scope.$watchCollection('names', function(newNames, oldNames) {\n            $scope.dataCount = newNames.length;\n          });\n\n          expect($scope.dataCount).toEqual(4);\n          $scope.$digest();\n\n          //still at 4 ... no changes\n          expect($scope.dataCount).toEqual(4);\n\n          $scope.names.pop();\n          $scope.$digest();\n\n          //now there's been a change\n          expect($scope.dataCount).toEqual(3);\n       * ```\n       *\n       *\n       * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The\n       *    expression value should evaluate to an object or an array which is observed on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the\n       *    collection will trigger a call to the `listener`.\n       *\n       * @param {function(newCollection, oldCollection, scope)} listener a callback function called\n       *    when a change is detected.\n       *    - The `newCollection` object is the newly modified data obtained from the `obj` expression\n       *    - The `oldCollection` object is a copy of the former collection data.\n       *      Due to performance considerations, the`oldCollection` value is computed only if the\n       *      `listener` function declares two or more arguments.\n       *    - The `scope` argument refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for this listener. When the\n       *    de-registration function is executed, the internal watch operation is terminated.\n       */\n      $watchCollection: function(obj, listener) {\n        var self = this;\n        // the current value, updated on each dirty-check run\n        var newValue;\n        // a shallow copy of the newValue from the last dirty-check run,\n        // updated to match newValue during dirty-check run\n        var oldValue;\n        // a shallow copy of the newValue from when the last change happened\n        var veryOldValue;\n        // only track veryOldValue if the listener is asking for it\n        var trackVeryOldValue = (listener.length > 1);\n        var changeDetected = 0;\n        var objGetter = $parse(obj);\n        var internalArray = [];\n        var internalObject = {};\n        var initRun = true;\n        var oldLength = 0;\n\n        function $watchCollectionWatch() {\n          newValue = objGetter(self);\n          var newLength, key;\n\n          if (!isObject(newValue)) { // if primitive\n            if (oldValue !== newValue) {\n              oldValue = newValue;\n              changeDetected++;\n            }\n          } else if (isArrayLike(newValue)) {\n            if (oldValue !== internalArray) {\n              // we are transitioning from something which was not an array into array.\n              oldValue = internalArray;\n              oldLength = oldValue.length = 0;\n              changeDetected++;\n            }\n\n            newLength = newValue.length;\n\n            if (oldLength !== newLength) {\n              // if lengths do not match we need to trigger change notification\n              changeDetected++;\n              oldValue.length = oldLength = newLength;\n            }\n            // copy the items to oldValue and look for changes.\n            for (var i = 0; i < newLength; i++) {\n              var bothNaN = (oldValue[i] !== oldValue[i]) &&\n                  (newValue[i] !== newValue[i]);\n              if (!bothNaN && (oldValue[i] !== newValue[i])) {\n                changeDetected++;\n                oldValue[i] = newValue[i];\n              }\n            }\n          } else {\n            if (oldValue !== internalObject) {\n              // we are transitioning from something which was not an object into object.\n              oldValue = internalObject = {};\n              oldLength = 0;\n              changeDetected++;\n            }\n            // copy the items to oldValue and look for changes.\n            newLength = 0;\n            for (key in newValue) {\n              if (newValue.hasOwnProperty(key)) {\n                newLength++;\n                if (oldValue.hasOwnProperty(key)) {\n                  if (oldValue[key] !== newValue[key]) {\n                    changeDetected++;\n                    oldValue[key] = newValue[key];\n                  }\n                } else {\n                  oldLength++;\n                  oldValue[key] = newValue[key];\n                  changeDetected++;\n                }\n              }\n            }\n            if (oldLength > newLength) {\n              // we used to have more keys, need to find them and destroy them.\n              changeDetected++;\n              for(key in oldValue) {\n                if (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) {\n                  oldLength--;\n                  delete oldValue[key];\n                }\n              }\n            }\n          }\n          $watchCollectionWatch.$$unwatch = objGetter.$$unwatch;\n          return changeDetected;\n        }\n\n        function $watchCollectionAction() {\n          if (initRun) {\n            initRun = false;\n            listener(newValue, newValue, self);\n          } else {\n            listener(newValue, veryOldValue, self);\n          }\n\n          // make a copy for the next time a collection is changed\n          if (trackVeryOldValue) {\n            if (!isObject(newValue)) {\n              //primitive\n              veryOldValue = newValue;\n            } else if (isArrayLike(newValue)) {\n              veryOldValue = new Array(newValue.length);\n              for (var i = 0; i < newValue.length; i++) {\n                veryOldValue[i] = newValue[i];\n              }\n            } else { // if object\n              veryOldValue = {};\n              for (var key in newValue) {\n                if (hasOwnProperty.call(newValue, key)) {\n                  veryOldValue[key] = newValue[key];\n                }\n              }\n            }\n          }\n        }\n\n        return this.$watch($watchCollectionWatch, $watchCollectionAction);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$digest\n       * @function\n       *\n       * @description\n       * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and\n       * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change\n       * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}\n       * until no more listeners are firing. This means that it is possible to get into an infinite\n       * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of\n       * iterations exceeds 10.\n       *\n       * Usually, you don't call `$digest()` directly in\n       * {@link ng.directive:ngController controllers} or in\n       * {@link ng.$compileProvider#directive directives}.\n       * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within\n       * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.\n       *\n       * If you want to be notified whenever `$digest()` is called,\n       * you can register a `watchExpression` function with\n       * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.\n       *\n       * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.\n       *\n       * # Example\n       * ```js\n           var scope = ...;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // no variable change\n           expect(scope.counter).toEqual(0);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(1);\n       * ```\n       *\n       */\n      $digest: function() {\n        var watch, value, last,\n            watchers,\n            asyncQueue = this.$$asyncQueue,\n            postDigestQueue = this.$$postDigestQueue,\n            length,\n            dirty, ttl = TTL,\n            next, current, target = this,\n            watchLog = [],\n            stableWatchesCandidates = [],\n            logIdx, logMsg, asyncTask;\n\n        beginPhase('$digest');\n\n        lastDirtyWatch = null;\n\n        do { // \"while dirty\" loop\n          dirty = false;\n          current = target;\n\n          while(asyncQueue.length) {\n            try {\n              asyncTask = asyncQueue.shift();\n              asyncTask.scope.$eval(asyncTask.expression);\n            } catch (e) {\n              clearPhase();\n              $exceptionHandler(e);\n            }\n            lastDirtyWatch = null;\n          }\n\n          traverseScopesLoop:\n          do { // \"traverse the scopes\" loop\n            if ((watchers = current.$$watchers)) {\n              // process our watches\n              length = watchers.length;\n              while (length--) {\n                try {\n                  watch = watchers[length];\n                  // Most common watches are on primitives, in which case we can short\n                  // circuit it with === operator, only when === fails do we use .equals\n                  if (watch) {\n                    if ((value = watch.get(current)) !== (last = watch.last) &&\n                        !(watch.eq\n                            ? equals(value, last)\n                            : (typeof value == 'number' && typeof last == 'number'\n                               && isNaN(value) && isNaN(last)))) {\n                      dirty = true;\n                      lastDirtyWatch = watch;\n                      watch.last = watch.eq ? copy(value) : value;\n                      watch.fn(value, ((last === initWatchVal) ? value : last), current);\n                      if (ttl < 5) {\n                        logIdx = 4 - ttl;\n                        if (!watchLog[logIdx]) watchLog[logIdx] = [];\n                        logMsg = (isFunction(watch.exp))\n                            ? 'fn: ' + (watch.exp.name || watch.exp.toString())\n                            : watch.exp;\n                        logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);\n                        watchLog[logIdx].push(logMsg);\n                      }\n                      if (watch.get.$$unwatch) stableWatchesCandidates.push({watch: watch, array: watchers});\n                    } else if (watch === lastDirtyWatch) {\n                      // If the most recently dirty watcher is now clean, short circuit since the remaining watchers\n                      // have already been tested.\n                      dirty = false;\n                      break traverseScopesLoop;\n                    }\n                  }\n                } catch (e) {\n                  clearPhase();\n                  $exceptionHandler(e);\n                }\n              }\n            }\n\n            // Insanity Warning: scope depth-first traversal\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\n            // this piece should be kept in sync with the traversal in $broadcast\n            if (!(next = (current.$$childHead ||\n                (current !== target && current.$$nextSibling)))) {\n              while(current !== target && !(next = current.$$nextSibling)) {\n                current = current.$parent;\n              }\n            }\n          } while ((current = next));\n\n          // `break traverseScopesLoop;` takes us to here\n\n          if((dirty || asyncQueue.length) && !(ttl--)) {\n            clearPhase();\n            throw $rootScopeMinErr('infdig',\n                '{0} $digest() iterations reached. Aborting!\\n' +\n                'Watchers fired in the last 5 iterations: {1}',\n                TTL, toJson(watchLog));\n          }\n\n        } while (dirty || asyncQueue.length);\n\n        clearPhase();\n\n        while(postDigestQueue.length) {\n          try {\n            postDigestQueue.shift()();\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        }\n\n        for (length = stableWatchesCandidates.length - 1; length >= 0; --length) {\n          var candidate = stableWatchesCandidates[length];\n          if (candidate.watch.get.$$unwatch) {\n            arrayRemove(candidate.array, candidate.watch);\n          }\n        }\n      },\n\n\n      /**\n       * @ngdoc event\n       * @name $rootScope.Scope#$destroy\n       * @eventType broadcast on scope being destroyed\n       *\n       * @description\n       * Broadcasted when a scope and its children are being destroyed.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$destroy\n       * @function\n       *\n       * @description\n       * Removes the current scope (and all of its children) from the parent scope. Removal implies\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\n       * propagate to the current scope and its children. Removal also implies that the current\n       * scope is eligible for garbage collection.\n       *\n       * The `$destroy()` is usually used by directives such as\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\n       * unrolling of the loop.\n       *\n       * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.\n       * Application code can register a `$destroy` event handler that will give it a chance to\n       * perform any necessary cleanup.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n      $destroy: function() {\n        // we can't destroy the root scope or a scope that has been already destroyed\n        if (this.$$destroyed) return;\n        var parent = this.$parent;\n\n        this.$broadcast('$destroy');\n        this.$$destroyed = true;\n        if (this === $rootScope) return;\n\n        forEach(this.$$listenerCount, bind(null, decrementListenerCount, this));\n\n        // sever all the references to parent scopes (after this cleanup, the current scope should\n        // not be retained by any of our references and should be eligible for garbage collection)\n        if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;\n        if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\n\n\n        // All of the code below is bogus code that works around V8's memory leak via optimized code\n        // and inline caches.\n        //\n        // see:\n        // - https://code.google.com/p/v8/issues/detail?id=2073#c26\n        // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909\n        // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451\n\n        this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =\n            this.$$childTail = this.$root = null;\n\n        // don't reset these to null in case some async task tries to register a listener/watch/task\n        this.$$listeners = {};\n        this.$$watchers = this.$$asyncQueue = this.$$postDigestQueue = [];\n\n        // prevent NPEs since these methods have references to properties we nulled out\n        this.$destroy = this.$digest = this.$apply = noop;\n        this.$on = this.$watch = this.$watchGroup = function() { return noop; };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$eval\n       * @function\n       *\n       * @description\n       * Executes the `expression` on the current scope and returns the result. Any exceptions in\n       * the expression are propagated (uncaught). This is useful when evaluating Angular\n       * expressions.\n       *\n       * # Example\n       * ```js\n           var scope = ng.$rootScope.Scope();\n           scope.a = 1;\n           scope.b = 2;\n\n           expect(scope.$eval('a+b')).toEqual(3);\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\n       * ```\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       * @returns {*} The result of evaluating the expression.\n       */\n      $eval: function(expr, locals) {\n        return $parse(expr)(this, locals);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$evalAsync\n       * @function\n       *\n       * @description\n       * Executes the expression on the current scope at a later point in time.\n       *\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only\n       * that:\n       *\n       *   - it will execute after the function that scheduled the evaluation (preferably before DOM\n       *     rendering).\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\n       *     `expression` execution.\n       *\n       * Any exceptions from the execution of the expression are forwarded to the\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle\n       * will be scheduled. However, it is encouraged to always call code that changes the model\n       * from within an `$apply` call. That includes code evaluated via `$evalAsync`.\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       */\n      $evalAsync: function(expr) {\n        // if we are outside of an $digest loop and this is the first time we are scheduling async\n        // task also schedule async auto-flush\n        if (!$rootScope.$$phase && !$rootScope.$$asyncQueue.length) {\n          $browser.defer(function() {\n            if ($rootScope.$$asyncQueue.length) {\n              $rootScope.$digest();\n            }\n          });\n        }\n\n        this.$$asyncQueue.push({scope: this, expression: expr});\n      },\n\n      $$postDigest : function(fn) {\n        this.$$postDigestQueue.push(fn);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$apply\n       * @function\n       *\n       * @description\n       * `$apply()` is used to execute an expression in angular from outside of the angular\n       * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).\n       * Because we are calling into the angular framework we need to perform proper scope life\n       * cycle of {@link ng.$exceptionHandler exception handling},\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\n       *\n       * ## Life cycle\n       *\n       * # Pseudo-Code of `$apply()`\n       * ```js\n           function $apply(expr) {\n             try {\n               return $eval(expr);\n             } catch (e) {\n               $exceptionHandler(e);\n             } finally {\n               $root.$digest();\n             }\n           }\n       * ```\n       *\n       *\n       * Scope's `$apply()` method transitions through the following stages:\n       *\n       * 1. The {@link guide/expression expression} is executed using the\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\n       * 2. Any exceptions from the execution of the expression are forwarded to the\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the\n       *    expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\n       *\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       *\n       * @returns {*} The result of evaluating the expression.\n       */\n      $apply: function(expr) {\n        try {\n          beginPhase('$apply');\n          return this.$eval(expr);\n        } catch (e) {\n          $exceptionHandler(e);\n        } finally {\n          clearPhase();\n          try {\n            $rootScope.$digest();\n          } catch (e) {\n            $exceptionHandler(e);\n            throw e;\n          }\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$on\n       * @function\n       *\n       * @description\n       * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for\n       * discussion of event life cycle.\n       *\n       * The event listener function format is: `function(event, args...)`. The `event` object\n       * passed into the listener has the following attributes:\n       *\n       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or\n       *     `$broadcast`-ed.\n       *   - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the\n       *     event propagates through the scope hierarchy, this property is set to null.\n       *   - `name` - `{string}`: name of the event.\n       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel\n       *     further event propagation (available only for events that were `$emit`-ed).\n       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag\n       *     to true.\n       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.\n       *\n       * @param {string} name Event name to listen on.\n       * @param {function(event, ...args)} listener Function to call when the event is emitted.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $on: function(name, listener) {\n        var namedListeners = this.$$listeners[name];\n        if (!namedListeners) {\n          this.$$listeners[name] = namedListeners = [];\n        }\n        namedListeners.push(listener);\n\n        var current = this;\n        do {\n          if (!current.$$listenerCount[name]) {\n            current.$$listenerCount[name] = 0;\n          }\n          current.$$listenerCount[name]++;\n        } while ((current = current.$parent));\n\n        var self = this;\n        return function() {\n          namedListeners[indexOf(namedListeners, listener)] = null;\n          decrementListenerCount(self, 1, name);\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$emit\n       * @function\n       *\n       * @description\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$emit` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event traverses upwards toward the root scope and calls all\n       * registered listeners along the way. The event will stop propagating if one of the listeners\n       * cancels it.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to emit.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).\n       */\n      $emit: function(name, args) {\n        var empty = [],\n            namedListeners,\n            scope = this,\n            stopPropagation = false,\n            event = {\n              name: name,\n              targetScope: scope,\n              stopPropagation: function() {stopPropagation = true;},\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            i, length;\n\n        do {\n          namedListeners = scope.$$listeners[name] || empty;\n          event.currentScope = scope;\n          for (i=0, length=namedListeners.length; i<length; i++) {\n\n            // if listeners were deregistered, defragment the array\n            if (!namedListeners[i]) {\n              namedListeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n            try {\n              //allow all listeners attached to the current scope to run\n              namedListeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          //if any listener on the current scope stops propagation, prevent bubbling\n          if (stopPropagation) {\n            event.currentScope = null;\n            return event;\n          }\n          //traverse upwards\n          scope = scope.$parent;\n        } while (scope);\n\n        event.currentScope = null;\n\n        return event;\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$broadcast\n       * @function\n       *\n       * @description\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event propagates to all direct and indirect scopes of the current\n       * scope and calls all registered listeners along the way. The event cannot be canceled.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to broadcast.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\n       */\n      $broadcast: function(name, args) {\n        var target = this,\n            current = target,\n            next = target,\n            event = {\n              name: name,\n              targetScope: target,\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            listeners, i, length;\n\n        //down while you can, then up and next sibling or up and next sibling until back at root\n        while ((current = next)) {\n          event.currentScope = current;\n          listeners = current.$$listeners[name] || [];\n          for (i=0, length = listeners.length; i<length; i++) {\n            // if listeners were deregistered, defragment the array\n            if (!listeners[i]) {\n              listeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n\n            try {\n              listeners[i].apply(null, listenerArgs);\n            } catch(e) {\n              $exceptionHandler(e);\n            }\n          }\n\n          // Insanity Warning: scope depth-first traversal\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\n          // this piece should be kept in sync with the traversal in $digest\n          // (though it differs due to having the extra check for $$listenerCount)\n          if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||\n              (current !== target && current.$$nextSibling)))) {\n            while(current !== target && !(next = current.$$nextSibling)) {\n              current = current.$parent;\n            }\n          }\n        }\n\n        event.currentScope = null;\n        return event;\n      }\n    };\n\n    var $rootScope = new Scope();\n\n    return $rootScope;\n\n\n    function beginPhase(phase) {\n      if ($rootScope.$$phase) {\n        throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);\n      }\n\n      $rootScope.$$phase = phase;\n    }\n\n    function clearPhase() {\n      $rootScope.$$phase = null;\n    }\n\n    function compileToFn(exp, name) {\n      var fn = $parse(exp);\n      assertArgFn(fn, name);\n      return fn;\n    }\n\n    function decrementListenerCount(current, count, name) {\n      do {\n        current.$$listenerCount[name] -= count;\n\n        if (current.$$listenerCount[name] === 0) {\n          delete current.$$listenerCount[name];\n        }\n      } while ((current = current.$parent));\n    }\n\n    /**\n     * function used as an initial value for watchers.\n     * because it's unique we can easily tell it apart from other values\n     */\n    function initWatchVal() {}\n  }];\n}\n\n/**\n * @description\n * Private service to sanitize uris for links and images. Used by $compile and $sanitize.\n */\nfunction $$SanitizeUriProvider() {\n  var aHrefSanitizationWhitelist = /^\\s*(https?|ftp|mailto|tel|file):/,\n    imgSrcSanitizationWhitelist = /^\\s*(https?|ftp|file|blob):|data:image\\//;\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      aHrefSanitizationWhitelist = regexp;\n      return this;\n    }\n    return aHrefSanitizationWhitelist;\n  };\n\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      imgSrcSanitizationWhitelist = regexp;\n      return this;\n    }\n    return imgSrcSanitizationWhitelist;\n  };\n\n  this.$get = function() {\n    return function sanitizeUri(uri, isImage) {\n      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;\n      var normalizedVal;\n      // NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case.\n      if (!msie || msie >= 8 ) {\n        normalizedVal = urlResolve(uri).href;\n        if (normalizedVal !== '' && !normalizedVal.match(regex)) {\n          return 'unsafe:'+normalizedVal;\n        }\n      }\n      return uri;\n    };\n  };\n}\n\nvar $sceMinErr = minErr('$sce');\n\nvar SCE_CONTEXTS = {\n  HTML: 'html',\n  CSS: 'css',\n  URL: 'url',\n  // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a\n  // url.  (e.g. ng-include, script src, templateUrl)\n  RESOURCE_URL: 'resourceUrl',\n  JS: 'js'\n};\n\n// Helper functions follow.\n\n// Copied from:\n// http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962\n// Prereq: s is a string.\nfunction escapeForRegexp(s) {\n  return s.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g, '\\\\$1').\n           replace(/\\x08/g, '\\\\x08');\n}\n\n\nfunction adjustMatcher(matcher) {\n  if (matcher === 'self') {\n    return matcher;\n  } else if (isString(matcher)) {\n    // Strings match exactly except for 2 wildcards - '*' and '**'.\n    // '*' matches any character except those from the set ':/.?&'.\n    // '**' matches any character (like .* in a RegExp).\n    // More than 2 *'s raises an error as it's ill defined.\n    if (matcher.indexOf('***') > -1) {\n      throw $sceMinErr('iwcard',\n          'Illegal sequence *** in string matcher.  String: {0}', matcher);\n    }\n    matcher = escapeForRegexp(matcher).\n                  replace('\\\\*\\\\*', '.*').\n                  replace('\\\\*', '[^:/.?&;]*');\n    return new RegExp('^' + matcher + '$');\n  } else if (isRegExp(matcher)) {\n    // The only other type of matcher allowed is a Regexp.\n    // Match entire URL / disallow partial matches.\n    // Flags are reset (i.e. no global, ignoreCase or multiline)\n    return new RegExp('^' + matcher.source + '$');\n  } else {\n    throw $sceMinErr('imatcher',\n        'Matchers may only be \"self\", string patterns or RegExp objects');\n  }\n}\n\n\nfunction adjustMatchers(matchers) {\n  var adjustedMatchers = [];\n  if (isDefined(matchers)) {\n    forEach(matchers, function(matcher) {\n      adjustedMatchers.push(adjustMatcher(matcher));\n    });\n  }\n  return adjustedMatchers;\n}\n\n\n/**\n * @ngdoc service\n * @name $sceDelegate\n * @function\n *\n * @description\n *\n * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict\n * Contextual Escaping (SCE)} services to AngularJS.\n *\n * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of\n * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is\n * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to\n * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things\n * work because `$sce` delegates to `$sceDelegate` for these operations.\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.\n *\n * The default instance of `$sceDelegate` should work out of the box with little pain.  While you\n * can override it completely to change the behavior of `$sce`, the common case would\n * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting\n * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as\n * templates.  Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist\n * $sceDelegateProvider.resourceUrlWhitelist} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n */\n\n/**\n * @ngdoc provider\n * @name $sceDelegateProvider\n * @description\n *\n * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate\n * $sceDelegate} service.  This allows one to get/set the whitelists and blacklists used to ensure\n * that the URLs used for sourcing Angular templates are safe.  Refer {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and\n * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n *\n * For the general details about this service in Angular, read the main page for {@link ng.$sce\n * Strict Contextual Escaping (SCE)}.\n *\n * **Example**:  Consider the following case. <a name=\"example\"></a>\n *\n * - your app is hosted at url `http://myapp.example.com/`\n * - but some of your templates are hosted on other domains you control such as\n *   `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc.\n * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.\n *\n * Here is what a secure configuration for this scenario might look like:\n *\n * <pre class=\"prettyprint\">\n *    angular.module('myApp', []).config(function($sceDelegateProvider) {\n *      $sceDelegateProvider.resourceUrlWhitelist([\n *        // Allow same origin resource loads.\n *        'self',\n *        // Allow loading from our assets domain.  Notice the difference between * and **.\n *        'http://srv*.assets.example.com/**']);\n *\n *      // The blacklist overrides the whitelist so the open redirect here is blocked.\n *      $sceDelegateProvider.resourceUrlBlacklist([\n *        'http://myapp.example.com/clickThru**']);\n *      });\n * </pre>\n */\n\nfunction $SceDelegateProvider() {\n  this.SCE_CONTEXTS = SCE_CONTEXTS;\n\n  // Resource URLs can also be trusted by policy.\n  var resourceUrlWhitelist = ['self'],\n      resourceUrlBlacklist = [];\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlWhitelist\n   * @function\n   *\n   * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   *     Note: **an empty whitelist array will block all URLs**!\n   *\n   * @return {Array} the currently set whitelist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is `['self']` allowing only\n   * same origin resource requests.\n   *\n   * @description\n   * Sets/Gets the whitelist of trusted resource URLs.\n   */\n  this.resourceUrlWhitelist = function (value) {\n    if (arguments.length) {\n      resourceUrlWhitelist = adjustMatchers(value);\n    }\n    return resourceUrlWhitelist;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlBlacklist\n   * @function\n   *\n   * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   *     The typical usage for the blacklist is to **block\n   *     [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as\n   *     these would otherwise be trusted but actually return content from the redirected domain.\n   *\n   *     Finally, **the blacklist overrides the whitelist** and has the final say.\n   *\n   * @return {Array} the currently set blacklist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there\n   * is no blacklist.)\n   *\n   * @description\n   * Sets/Gets the blacklist of trusted resource URLs.\n   */\n\n  this.resourceUrlBlacklist = function (value) {\n    if (arguments.length) {\n      resourceUrlBlacklist = adjustMatchers(value);\n    }\n    return resourceUrlBlacklist;\n  };\n\n  this.$get = ['$injector', function($injector) {\n\n    var htmlSanitizer = function htmlSanitizer(html) {\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    };\n\n    if ($injector.has('$sanitize')) {\n      htmlSanitizer = $injector.get('$sanitize');\n    }\n\n\n    function matchUrl(matcher, parsedUrl) {\n      if (matcher === 'self') {\n        return urlIsSameOrigin(parsedUrl);\n      } else {\n        // definitely a regex.  See adjustMatchers()\n        return !!matcher.exec(parsedUrl.href);\n      }\n    }\n\n    function isResourceUrlAllowedByPolicy(url) {\n      var parsedUrl = urlResolve(url.toString());\n      var i, n, allowed = false;\n      // Ensure that at least one item from the whitelist allows this url.\n      for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {\n        if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {\n          allowed = true;\n          break;\n        }\n      }\n      if (allowed) {\n        // Ensure that no item from the blacklist blocked this url.\n        for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {\n          if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {\n            allowed = false;\n            break;\n          }\n        }\n      }\n      return allowed;\n    }\n\n    function generateHolderType(Base) {\n      var holderType = function TrustedValueHolderType(trustedValue) {\n        this.$$unwrapTrustedValue = function() {\n          return trustedValue;\n        };\n      };\n      if (Base) {\n        holderType.prototype = new Base();\n      }\n      holderType.prototype.valueOf = function sceValueOf() {\n        return this.$$unwrapTrustedValue();\n      };\n      holderType.prototype.toString = function sceToString() {\n        return this.$$unwrapTrustedValue().toString();\n      };\n      return holderType;\n    }\n\n    var trustedValueHolderBase = generateHolderType(),\n        byType = {};\n\n    byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#trustAs\n     *\n     * @description\n     * Returns an object that is trusted by angular for use in specified strict\n     * contextual escaping contexts (such as ng-bind-html, ng-include, any src\n     * attribute interpolation, any dom event binding attribute interpolation\n     * such as for onclick,  etc.) that uses the provided value.\n     * See {@link ng.$sce $sce} for enabling strict contextual escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resourceUrl, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n    function trustAs(type, trustedValue) {\n      var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (!Constructor) {\n        throw $sceMinErr('icontext',\n            'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',\n            type, trustedValue);\n      }\n      if (trustedValue === null || trustedValue === undefined || trustedValue === '') {\n        return trustedValue;\n      }\n      // All the current contexts in SCE_CONTEXTS happen to be strings.  In order to avoid trusting\n      // mutable objects, we ensure here that the value passed in is actually a string.\n      if (typeof trustedValue !== 'string') {\n        throw $sceMinErr('itype',\n            'Attempted to trust a non-string value in a content requiring a string: Context: {0}',\n            type);\n      }\n      return new Constructor(trustedValue);\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#valueOf\n     *\n     * @description\n     * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs\n     * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.\n     *\n     * If the passed parameter is not a value that had been returned by {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.\n     *\n     * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}\n     *      call or anything else.\n     * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns\n     *     `value` unchanged.\n     */\n    function valueOf(maybeTrusted) {\n      if (maybeTrusted instanceof trustedValueHolderBase) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      } else {\n        return maybeTrusted;\n      }\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#getTrusted\n     *\n     * @description\n     * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and\n     * returns the originally supplied value if the queried context type is a supertype of the\n     * created type.  If this condition isn't satisfied, throws an exception.\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} call.\n     * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if valid in this context.  Otherwise, throws an exception.\n     */\n    function getTrusted(type, maybeTrusted) {\n      if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') {\n        return maybeTrusted;\n      }\n      var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (constructor && maybeTrusted instanceof constructor) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      }\n      // If we get here, then we may only take one of two actions.\n      // 1. sanitize the value for the requested type, or\n      // 2. throw an exception.\n      if (type === SCE_CONTEXTS.RESOURCE_URL) {\n        if (isResourceUrlAllowedByPolicy(maybeTrusted)) {\n          return maybeTrusted;\n        } else {\n          throw $sceMinErr('insecurl',\n              'Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}',\n              maybeTrusted.toString());\n        }\n      } else if (type === SCE_CONTEXTS.HTML) {\n        return htmlSanitizer(maybeTrusted);\n      }\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    }\n\n    return { trustAs: trustAs,\n             getTrusted: getTrusted,\n             valueOf: valueOf };\n  }];\n}\n\n\n/**\n * @ngdoc provider\n * @name $sceProvider\n * @description\n *\n * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.\n * -   enable/disable Strict Contextual Escaping (SCE) in a module\n * -   override the default implementation with a custom delegate\n *\n * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.\n */\n\n/* jshint maxlen: false*/\n\n/**\n * @ngdoc service\n * @name $sce\n * @function\n *\n * @description\n *\n * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.\n *\n * # Strict Contextual Escaping\n *\n * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain\n * contexts to result in a value that is marked as safe to use for that context.  One example of\n * such a context is binding arbitrary html controlled by the user via `ng-bind-html`.  We refer\n * to these contexts as privileged or SCE contexts.\n *\n * As of version 1.2, Angular ships with SCE enabled by default.\n *\n * Note:  When enabled (the default), IE8 in quirks mode is not supported.  In this mode, IE8 allows\n * one to execute arbitrary javascript by the use of the expression() syntax.  Refer\n * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.\n * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`\n * to the top of your HTML document.\n *\n * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for\n * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.\n *\n * Here's an example of a binding in a privileged context:\n *\n * <pre class=\"prettyprint\">\n *     <input ng-model=\"userHtml\">\n *     <div ng-bind-html=\"userHtml\">\n * </pre>\n *\n * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE\n * disabled, this application allows the user to render arbitrary HTML into the DIV.\n * In a more realistic example, one may be rendering user comments, blog articles, etc. via\n * bindings.  (HTML is just one example of a context where rendering user controlled input creates\n * security vulnerabilities.)\n *\n * For the case of HTML, you might use a library, either on the client side, or on the server side,\n * to sanitize unsafe HTML before binding to the value and rendering it in the document.\n *\n * How would you ensure that every place that used these types of bindings was bound to a value that\n * was sanitized by your library (or returned as safe for rendering by your server?)  How can you\n * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some\n * properties/fields and forgot to update the binding to the sanitized value?\n *\n * To be secure by default, you want to ensure that any such bindings are disallowed unless you can\n * determine that something explicitly says it's safe to use a value for binding in that\n * context.  You can then audit your code (a simple grep would do) to ensure that this is only done\n * for those values that you can easily tell are safe - because they were received from your server,\n * sanitized by your library, etc.  You can organize your codebase to help with this - perhaps\n * allowing only the files in a specific directory to do this.  Ensuring that the internal API\n * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.\n *\n * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}\n * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to\n * obtain values that will be accepted by SCE / privileged contexts.\n *\n *\n * ## How does it work?\n *\n * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted\n * $sce.getTrusted(context, value)} rather than to the value directly.  Directives use {@link\n * ng.$sce#parse $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the\n * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.\n *\n * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link\n * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly\n * simplified):\n *\n * <pre class=\"prettyprint\">\n *   var ngBindHtmlDirective = ['$sce', function($sce) {\n *     return function(scope, element, attr) {\n *       scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {\n *         element.html(value || '');\n *       });\n *     };\n *   }];\n * </pre>\n *\n * ## Impact on loading templates\n *\n * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as\n * `templateUrl`'s specified by {@link guide/directive directives}.\n *\n * By default, Angular only loads templates from the same domain and protocol as the application\n * document.  This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or\n * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist\n * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.\n *\n * *Please note*:\n * The browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy apply in addition to this and may further restrict whether the template is successfully\n * loaded.  This means that without the right CORS policy, loading templates from a different domain\n * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some\n * browsers.\n *\n * ## This feels like too much overhead\n *\n * It's important to remember that SCE only applies to interpolation expressions.\n *\n * If your expressions are constant literals, they're automatically trusted and you don't need to\n * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.\n * `<div ng-bind-html=\"'<b>implicitly trusted</b>'\"></div>`) just works.\n *\n * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them\n * through {@link ng.$sce#getTrusted $sce.getTrusted}.  SCE doesn't play a role here.\n *\n * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load\n * templates in `ng-include` from your application's domain without having to even know about SCE.\n * It blocks loading templates from other domains or loading templates over http from an https\n * served document.  You can change these by setting your own custom {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.\n *\n * This significantly reduces the overhead.  It is far easier to pay the small overhead and have an\n * application that's secure and can be audited to verify that with much more ease than bolting\n * security onto an application later.\n *\n * <a name=\"contexts\"></a>\n * ## What trusted context types are supported?\n *\n * | Context             | Notes          |\n * |---------------------|----------------|\n * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |\n * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently unused.  Feel free to use it in your own directives. |\n * | `$sce.URL`          | For URLs that are safe to follow as links.  Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |\n * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |\n * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently unused.  Feel free to use it in your own directives. |\n *\n * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name=\"resourceUrlPatternItem\"></a>\n *\n *  Each element in these arrays must be one of the following:\n *\n *  - **'self'**\n *    - The special **string**, `'self'`, can be used to match against all URLs of the **same\n *      domain** as the application document using the **same protocol**.\n *  - **String** (except the special value `'self'`)\n *    - The string is matched against the full *normalized / absolute URL* of the resource\n *      being tested (substring matches are not good enough.)\n *    - There are exactly **two wildcard sequences** - `*` and `**`.  All other characters\n *      match themselves.\n *    - `*`: matches zero or more occurrences of any character other than one of the following 6\n *      characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'.  It's a useful wildcard for use\n *      in a whitelist.\n *    - `**`: matches zero or more occurrences of *any* character.  As such, it's not\n *      not appropriate to use in for a scheme, domain, etc. as it would match too much.  (e.g.\n *      http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might\n *      not have been the intention.)  It's usage at the very end of the path is ok.  (e.g.\n *      http://foo.example.com/templates/**).\n *  - **RegExp** (*see caveat below*)\n *    - *Caveat*:  While regular expressions are powerful and offer great flexibility,  their syntax\n *      (and all the inevitable escaping) makes them *harder to maintain*.  It's easy to\n *      accidentally introduce a bug when one updates a complex expression (imho, all regexes should\n *      have good test coverage.).  For instance, the use of `.` in the regex is correct only in a\n *      small number of cases.  A `.` character in the regex used when matching the scheme or a\n *      subdomain could be matched against a `:` or literal `.` that was likely not intended.   It\n *      is highly recommended to use the string patterns and only fall back to regular expressions\n *      if they as a last resort.\n *    - The regular expression must be an instance of RegExp (i.e. not a string.)  It is\n *      matched against the **entire** *normalized / absolute URL* of the resource being tested\n *      (even when the RegExp did not have the `^` and `$` codes.)  In addition, any flags\n *      present on the RegExp (such as multiline, global, ignoreCase) are ignored.\n *    - If you are generating your JavaScript from some other templating engine (not\n *      recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),\n *      remember to escape your regular expression (and be aware that you might need more than\n *      one level of escaping depending on your templating engine and the way you interpolated\n *      the value.)  Do make use of your platform's escaping mechanism as it might be good\n *      enough before coding your own.  e.g. Ruby has\n *      [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)\n *      and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).\n *      Javascript lacks a similar built in function for escaping.  Take a look at Google\n *      Closure library's [goog.string.regExpEscape(s)](\n *      http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.\n *\n * ## Show me an example using SCE.\n *\n * @example\n<example module=\"mySceApp\" deps=\"angular-sanitize.js\">\n<file name=\"index.html\">\n  <div ng-controller=\"myAppController as myCtrl\">\n    <i ng-bind-html=\"myCtrl.explicitlyTrustedHtml\" id=\"explicitlyTrustedHtml\"></i><br><br>\n    <b>User comments</b><br>\n    By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when\n    $sanitize is available.  If $sanitize isn't available, this results in an error instead of an\n    exploit.\n    <div class=\"well\">\n      <div ng-repeat=\"userComment in myCtrl.userComments\">\n        <b>{{userComment.name}}</b>:\n        <span ng-bind-html=\"userComment.htmlComment\" class=\"htmlComment\"></span>\n        <br>\n      </div>\n    </div>\n  </div>\n</file>\n\n<file name=\"script.js\">\n  var mySceApp = angular.module('mySceApp', ['ngSanitize']);\n\n  mySceApp.controller(\"myAppController\", function myAppController($http, $templateCache, $sce) {\n    var self = this;\n    $http.get(\"test_data.json\", {cache: $templateCache}).success(function(userComments) {\n      self.userComments = userComments;\n    });\n    self.explicitlyTrustedHtml = $sce.trustAsHtml(\n        '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n        'sanitization.&quot;\">Hover over this text.</span>');\n  });\n</file>\n\n<file name=\"test_data.json\">\n[\n  { \"name\": \"Alice\",\n    \"htmlComment\":\n        \"<span onmouseover='this.textContent=\\\"PWN3D!\\\"'>Is <i>anyone</i> reading this?</span>\"\n  },\n  { \"name\": \"Bob\",\n    \"htmlComment\": \"<i>Yes!</i>  Am I the only other one?\"\n  }\n]\n</file>\n\n<file name=\"protractor.js\" type=\"protractor\">\n  describe('SCE doc demo', function() {\n    it('should sanitize untrusted values', function() {\n      expect(element(by.css('.htmlComment')).getInnerHtml())\n          .toBe('<span>Is <i>anyone</i> reading this?</span>');\n    });\n\n    it('should NOT sanitize explicitly trusted values', function() {\n      expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(\n          '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n          'sanitization.&quot;\">Hover over this text.</span>');\n    });\n  });\n</file>\n</example>\n *\n *\n *\n * ## Can I disable SCE completely?\n *\n * Yes, you can.  However, this is strongly discouraged.  SCE gives you a lot of security benefits\n * for little coding overhead.  It will be much harder to take an SCE disabled application and\n * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE\n * for cases where you have a lot of existing code that was written before SCE was introduced and\n * you're migrating them a module at a time.\n *\n * That said, here's how you can completely disable SCE:\n *\n * <pre class=\"prettyprint\">\n *   angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {\n *     // Completely disable SCE.  For demonstration purposes only!\n *     // Do not use in new projects.\n *     $sceProvider.enabled(false);\n *   });\n * </pre>\n *\n */\n/* jshint maxlen: 100 */\n\nfunction $SceProvider() {\n  var enabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $sceProvider#enabled\n   * @function\n   *\n   * @param {boolean=} value If provided, then enables/disables SCE.\n   * @return {boolean} true if SCE is enabled, false otherwise.\n   *\n   * @description\n   * Enables/disables SCE and returns the current value.\n   */\n  this.enabled = function (value) {\n    if (arguments.length) {\n      enabled = !!value;\n    }\n    return enabled;\n  };\n\n\n  /* Design notes on the default implementation for SCE.\n   *\n   * The API contract for the SCE delegate\n   * -------------------------------------\n   * The SCE delegate object must provide the following 3 methods:\n   *\n   * - trustAs(contextEnum, value)\n   *     This method is used to tell the SCE service that the provided value is OK to use in the\n   *     contexts specified by contextEnum.  It must return an object that will be accepted by\n   *     getTrusted() for a compatible contextEnum and return this value.\n   *\n   * - valueOf(value)\n   *     For values that were not produced by trustAs(), return them as is.  For values that were\n   *     produced by trustAs(), return the corresponding input value to trustAs.  Basically, if\n   *     trustAs is wrapping the given values into some type, this operation unwraps it when given\n   *     such a value.\n   *\n   * - getTrusted(contextEnum, value)\n   *     This function should return the a value that is safe to use in the context specified by\n   *     contextEnum or throw and exception otherwise.\n   *\n   * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be\n   * opaque or wrapped in some holder object.  That happens to be an implementation detail.  For\n   * instance, an implementation could maintain a registry of all trusted objects by context.  In\n   * such a case, trustAs() would return the same object that was passed in.  getTrusted() would\n   * return the same object passed in if it was found in the registry under a compatible context or\n   * throw an exception otherwise.  An implementation might only wrap values some of the time based\n   * on some criteria.  getTrusted() might return a value and not throw an exception for special\n   * constants or objects even if not wrapped.  All such implementations fulfill this contract.\n   *\n   *\n   * A note on the inheritance model for SCE contexts\n   * ------------------------------------------------\n   * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types.  This\n   * is purely an implementation details.\n   *\n   * The contract is simply this:\n   *\n   *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)\n   *     will also succeed.\n   *\n   * Inheritance happens to capture this in a natural way.  In some future, we\n   * may not use inheritance anymore.  That is OK because no code outside of\n   * sce.js and sceSpecs.js would need to be aware of this detail.\n   */\n\n  this.$get = ['$parse', '$sniffer', '$sceDelegate', function(\n                $parse,   $sniffer,   $sceDelegate) {\n    // Prereq: Ensure that we're not running in IE8 quirks mode.  In that mode, IE allows\n    // the \"expression(javascript expression)\" syntax which is insecure.\n    if (enabled && $sniffer.msie && $sniffer.msieDocumentMode < 8) {\n      throw $sceMinErr('iequirks',\n        'Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks ' +\n        'mode.  You can fix this by adding the text <!doctype html> to the top of your HTML ' +\n        'document.  See http://docs.angularjs.org/api/ng.$sce for more information.');\n    }\n\n    var sce = copy(SCE_CONTEXTS);\n\n    /**\n     * @ngdoc method\n     * @name $sce#isEnabled\n     * @function\n     *\n     * @return {Boolean} true if SCE is enabled, false otherwise.  If you want to set the value, you\n     * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.\n     *\n     * @description\n     * Returns a boolean indicating if SCE is enabled.\n     */\n    sce.isEnabled = function () {\n      return enabled;\n    };\n    sce.trustAs = $sceDelegate.trustAs;\n    sce.getTrusted = $sceDelegate.getTrusted;\n    sce.valueOf = $sceDelegate.valueOf;\n\n    if (!enabled) {\n      sce.trustAs = sce.getTrusted = function(type, value) { return value; };\n      sce.valueOf = identity;\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sce#parse\n     *\n     * @description\n     * Converts Angular {@link guide/expression expression} into a function.  This is like {@link\n     * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it\n     * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,\n     * *result*)}\n     *\n     * @param {string} type The kind of SCE context in which this result will be used.\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n    sce.parseAs = function sceParseAs(type, expr) {\n      var parsed = $parse(expr);\n      if (parsed.literal && parsed.constant) {\n        return parsed;\n      } else {\n        return function sceParseAsTrusted(self, locals) {\n          var result = sce.getTrusted(type, parsed(self, locals));\n          sceParseAsTrusted.$$unwatch = parsed.$$unwatch;\n          return result;\n        };\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAs\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.  As such,\n     * returns an object that is trusted by angular for use in specified strict contextual\n     * escaping contexts (such as ng-bind-html, ng-include, any src attribute\n     * interpolation, any dom event binding attribute interpolation such as for onclick,  etc.)\n     * that uses the provided value.  See * {@link ng.$sce $sce} for enabling strict contextual\n     * escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resource_url, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsHtml(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml\n     *     $sce.getTrustedHtml(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl\n     *     $sce.getTrustedUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl\n     *     $sce.getTrustedResourceUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the return\n     *     value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsJs(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs\n     *     $sce.getTrustedJs(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrusted\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}.  As such,\n     * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the\n     * originally supplied value if the queried context type is a supertype of the created type.\n     * If this condition isn't satisfied, throws an exception.\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}\n     *                         call.\n     * @returns {*} The value the was originally provided to\n     *              {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.\n     *              Otherwise, throws an exception.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedHtml(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedCss\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedCss(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sceDelegate.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedJs\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedJs(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsHtml(expression string)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.HTML, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsCss(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.CSS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsUrl(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsResourceUrl(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsJs(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.JS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    // Shorthand delegations.\n    var parse = sce.parseAs,\n        getTrusted = sce.getTrusted,\n        trustAs = sce.trustAs;\n\n    forEach(SCE_CONTEXTS, function (enumValue, name) {\n      var lName = lowercase(name);\n      sce[camelCase(\"parse_as_\" + lName)] = function (expr) {\n        return parse(enumValue, expr);\n      };\n      sce[camelCase(\"get_trusted_\" + lName)] = function (value) {\n        return getTrusted(enumValue, value);\n      };\n      sce[camelCase(\"trust_as_\" + lName)] = function (value) {\n        return trustAs(enumValue, value);\n      };\n    });\n\n    return sce;\n  }];\n}\n\n/**\n * !!! This is an undocumented \"private\" service !!!\n *\n * @name $sniffer\n * @requires $window\n * @requires $document\n *\n * @property {boolean} history Does the browser support html5 history api ?\n * @property {boolean} hashchange Does the browser support hashchange event ?\n * @property {boolean} transitions Does the browser support CSS transition events ?\n * @property {boolean} animations Does the browser support CSS animation events ?\n *\n * @description\n * This is very simple implementation of testing browser's features.\n */\nfunction $SnifferProvider() {\n  this.$get = ['$window', '$document', function($window, $document) {\n    var eventSupport = {},\n        android =\n          int((/android (\\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),\n        boxee = /Boxee/i.test(($window.navigator || {}).userAgent),\n        document = $document[0] || {},\n        documentMode = document.documentMode,\n        vendorPrefix,\n        vendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/,\n        bodyStyle = document.body && document.body.style,\n        transitions = false,\n        animations = false,\n        match;\n\n    if (bodyStyle) {\n      for(var prop in bodyStyle) {\n        if(match = vendorRegex.exec(prop)) {\n          vendorPrefix = match[0];\n          vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);\n          break;\n        }\n      }\n\n      if(!vendorPrefix) {\n        vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';\n      }\n\n      transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));\n      animations  = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));\n\n      if (android && (!transitions||!animations)) {\n        transitions = isString(document.body.style.webkitTransition);\n        animations = isString(document.body.style.webkitAnimation);\n      }\n    }\n\n\n    return {\n      // Android has history.pushState, but it does not update location correctly\n      // so let's not use the history API at all.\n      // http://code.google.com/p/android/issues/detail?id=17471\n      // https://github.com/angular/angular.js/issues/904\n\n      // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has\n      // so let's not use the history API also\n      // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined\n      // jshint -W018\n      history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee),\n      // jshint +W018\n      hashchange: 'onhashchange' in $window &&\n                  // IE8 compatible mode lies\n                  (!documentMode || documentMode > 7),\n      hasEvent: function(event) {\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\n        // it. In particular the event is not fired when backspace or delete key are pressed or\n        // when cut operation is performed.\n        if (event == 'input' && msie == 9) return false;\n\n        if (isUndefined(eventSupport[event])) {\n          var divElm = document.createElement('div');\n          eventSupport[event] = 'on' + event in divElm;\n        }\n\n        return eventSupport[event];\n      },\n      csp: csp(),\n      vendorPrefix: vendorPrefix,\n      transitions : transitions,\n      animations : animations,\n      android: android,\n      msie : msie,\n      msieDocumentMode: documentMode\n    };\n  }];\n}\n\nfunction $TimeoutProvider() {\n  this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',\n       function($rootScope,   $browser,   $q,   $exceptionHandler) {\n    var deferreds = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $timeout\n      *\n      * @description\n      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\n      * block and delegates any exceptions to\n      * {@link ng.$exceptionHandler $exceptionHandler} service.\n      *\n      * The return value of registering a timeout function is a promise, which will be resolved when\n      * the timeout is reached and the timeout function is executed.\n      *\n      * To cancel a timeout request, call `$timeout.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\n      * synchronously flush the queue of deferred functions.\n      *\n      * @param {function()} fn A function, whose execution should be delayed.\n      * @param {number=} [delay=0] Delay in milliseconds.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this\n      *   promise will be resolved with is the return value of the `fn` function.\n      *\n      */\n    function timeout(fn, delay, invokeApply) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          timeoutId;\n\n      timeoutId = $browser.defer(function() {\n        try {\n          deferred.resolve(fn());\n        } catch(e) {\n          deferred.reject(e);\n          $exceptionHandler(e);\n        }\n        finally {\n          delete deferreds[promise.$$timeoutId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n      }, delay);\n\n      promise.$$timeoutId = timeoutId;\n      deferreds[timeoutId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $timeout#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`. As a result of this, the promise will be\n      * resolved with a rejection.\n      *\n      * @param {Promise=} promise Promise returned by the `$timeout` function.\n      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n      *   canceled.\n      */\n    timeout.cancel = function(promise) {\n      if (promise && promise.$$timeoutId in deferreds) {\n        deferreds[promise.$$timeoutId].reject('canceled');\n        delete deferreds[promise.$$timeoutId];\n        return $browser.defer.cancel(promise.$$timeoutId);\n      }\n      return false;\n    };\n\n    return timeout;\n  }];\n}\n\n// NOTE:  The usage of window and document instead of $window and $document here is\n// deliberate.  This service depends on the specific behavior of anchor nodes created by the\n// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\n// cause us to break tests.  In addition, when the browser resolves a URL for XHR, it\n// doesn't know about mocked locations and resolves URLs to the real document - which is\n// exactly the behavior needed here.  There is little value is mocking these out for this\n// service.\nvar urlParsingNode = document.createElement(\"a\");\nvar originUrl = urlResolve(window.location.href, true);\n\n\n/**\n *\n * Implementation Notes for non-IE browsers\n * ----------------------------------------\n * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\n * results both in the normalizing and parsing of the URL.  Normalizing means that a relative\n * URL will be resolved into an absolute URL in the context of the application document.\n * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related\n * properties are all populated to reflect the normalized URL.  This approach has wide\n * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc.  See\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *\n * Implementation Notes for IE\n * ---------------------------\n * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other\n * browsers.  However, the parsed components will not be set if the URL assigned did not specify\n * them.  (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.)  We\n * work around that by performing the parsing in a 2nd step by taking a previously normalized\n * URL (e.g. by assigning to a.href) and assigning it a.href again.  This correctly populates the\n * properties such as protocol, hostname, port, etc.\n *\n * IE7 does not normalize the URL when assigned to an anchor node.  (Apparently, it does, if one\n * uses the inner HTML approach to assign the URL as part of an HTML snippet -\n * http://stackoverflow.com/a/472729)  However, setting img[src] does normalize the URL.\n * Unfortunately, setting img[src] to something like \"javascript:foo\" on IE throws an exception.\n * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that\n * method and IE < 8 is unsupported.\n *\n * References:\n *   http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\n *   http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *   http://url.spec.whatwg.org/#urlutils\n *   https://github.com/angular/angular.js/pull/2902\n *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\n *\n * @function\n * @param {string} url The URL to be parsed.\n * @description Normalizes and parses a URL.\n * @returns {object} Returns the normalized URL as a dictionary.\n *\n *   | member name   | Description    |\n *   |---------------|----------------|\n *   | href          | A normalized version of the provided URL if it was not an absolute URL |\n *   | protocol      | The protocol including the trailing colon                              |\n *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |\n *   | search        | The search params, minus the question mark                             |\n *   | hash          | The hash string, minus the hash symbol\n *   | hostname      | The hostname\n *   | port          | The port, without \":\"\n *   | pathname      | The pathname, beginning with \"/\"\n *\n */\nfunction urlResolve(url, base) {\n  var href = url;\n\n  if (msie) {\n    // Normalize before parse.  Refer Implementation Notes on why this is\n    // done in two steps on IE.\n    urlParsingNode.setAttribute(\"href\", href);\n    href = urlParsingNode.href;\n  }\n\n  urlParsingNode.setAttribute('href', href);\n\n  // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n  return {\n    href: urlParsingNode.href,\n    protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n    host: urlParsingNode.host,\n    search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n    hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n    hostname: urlParsingNode.hostname,\n    port: urlParsingNode.port,\n    pathname: (urlParsingNode.pathname.charAt(0) === '/')\n      ? urlParsingNode.pathname\n      : '/' + urlParsingNode.pathname\n  };\n}\n\n/**\n * Parse a request URL and determine whether this is a same-origin request as the application document.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the request is for the same origin as the application document.\n */\nfunction urlIsSameOrigin(requestUrl) {\n  var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;\n  return (parsed.protocol === originUrl.protocol &&\n          parsed.host === originUrl.host);\n}\n\n/**\n * @ngdoc service\n * @name $window\n *\n * @description\n * A reference to the browser's `window` object. While `window`\n * is globally available in JavaScript, it causes testability problems, because\n * it is a global variable. In angular we always refer to it through the\n * `$window` service, so it may be overridden, removed or mocked for testing.\n *\n * Expressions, like the one defined for the `ngClick` directive in the example\n * below, are evaluated with respect to the current scope.  Therefore, there is\n * no risk of inadvertently coding in a dependency on a global value in such an\n * expression.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope, $window) {\n           $scope.greeting = 'Hello, World!';\n           $scope.doGreeting = function(greeting) {\n               $window.alert(greeting);\n           };\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <input type=\"text\" ng-model=\"greeting\" />\n         <button ng-click=\"doGreeting(greeting)\">ALERT</button>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n      it('should display the greeting in the input box', function() {\n       element(by.model('greeting')).sendKeys('Hello, E2E Tests');\n       // If we click the button it will block the test runner\n       // element(':button').click();\n      });\n     </file>\n   </example>\n */\nfunction $WindowProvider(){\n  this.$get = valueFn(window);\n}\n\n/**\n * @ngdoc provider\n * @name $filterProvider\n * @description\n *\n * Filters are just functions which transform input to an output. However filters need to be\n * Dependency Injected. To achieve this a filter definition consists of a factory function which is\n * annotated with dependencies and is responsible for creating a filter function.\n *\n * ```js\n *   // Filter registration\n *   function MyModule($provide, $filterProvider) {\n *     // create a service to demonstrate injection (not always needed)\n *     $provide.value('greet', function(name){\n *       return 'Hello ' + name + '!';\n *     });\n *\n *     // register a filter factory which uses the\n *     // greet service to demonstrate DI.\n *     $filterProvider.register('greet', function(greet){\n *       // return the filter function which uses the greet service\n *       // to generate salutation\n *       return function(text) {\n *         // filters need to be forgiving so check input validity\n *         return text && greet(text) || text;\n *       };\n *     });\n *   }\n * ```\n *\n * The filter function is registered with the `$injector` under the filter name suffix with\n * `Filter`.\n *\n * ```js\n *   it('should be the same instance', inject(\n *     function($filterProvider) {\n *       $filterProvider.register('reverse', function(){\n *         return ...;\n *       });\n *     },\n *     function($filter, reverseFilter) {\n *       expect($filter('reverse')).toBe(reverseFilter);\n *     });\n * ```\n *\n *\n * For more information about how angular filters work, and how to create your own filters, see\n * {@link guide/filter Filters} in the Angular Developer Guide.\n */\n/**\n * @ngdoc method\n * @name $filterProvider#register\n * @description\n * Register filter factory function.\n *\n * @param {String} name Name of the filter.\n * @param {Function} fn The filter factory function which is injectable.\n */\n\n\n/**\n * @ngdoc service\n * @name $filter\n * @function\n * @description\n * Filters are used for formatting data displayed to the user.\n *\n * The general syntax in templates is as follows:\n *\n *         {{ expression [| filter_name[:parameter_value] ... ] }}\n *\n * @param {String} name Name of the filter function to retrieve\n * @return {Function} the filter function\n * @example\n   <example name=\"$filter\" module=\"filterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"MainCtrl\">\n        <h3>{{ originalText }}</h3>\n        <h3>{{ filteredText }}</h3>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n      angular.module('filterExample', [])\n      .controller('MainCtrl', function($scope, $filter) {\n        $scope.originalText = 'hello';\n        $scope.filteredText = $filter('uppercase')($scope.originalText);\n      });\n     </file>\n   </example>\n  */\n$FilterProvider.$inject = ['$provide'];\nfunction $FilterProvider($provide) {\n  var suffix = 'Filter';\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Name of the filter function, or an object map of filters where\n   *    the keys are the filter names and the values are the filter factories.\n   * @returns {Object} Registered filter instance, or if a map of filters was provided then a map\n   *    of the registered filter instances.\n   */\n  function register(name, factory) {\n    if(isObject(name)) {\n      var filters = {};\n      forEach(name, function(filter, key) {\n        filters[key] = register(key, filter);\n      });\n      return filters;\n    } else {\n      return $provide.factory(name + suffix, factory);\n    }\n  }\n  this.register = register;\n\n  this.$get = ['$injector', function($injector) {\n    return function(name) {\n      return $injector.get(name + suffix);\n    };\n  }];\n\n  ////////////////////////////////////////\n\n  /* global\n    currencyFilter: false,\n    dateFilter: false,\n    filterFilter: false,\n    jsonFilter: false,\n    limitToFilter: false,\n    lowercaseFilter: false,\n    numberFilter: false,\n    orderByFilter: false,\n    uppercaseFilter: false,\n  */\n\n  register('currency', currencyFilter);\n  register('date', dateFilter);\n  register('filter', filterFilter);\n  register('json', jsonFilter);\n  register('limitTo', limitToFilter);\n  register('lowercase', lowercaseFilter);\n  register('number', numberFilter);\n  register('orderBy', orderByFilter);\n  register('uppercase', uppercaseFilter);\n}\n\n/**\n * @ngdoc filter\n * @name filter\n * @function\n *\n * @description\n * Selects a subset of items from `array` and returns it as a new array.\n *\n * @param {Array} array The source array.\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\n *   `array`.\n *\n *   Can be one of:\n *\n *   - `string`: The string is evaluated as an expression and the resulting value is used for substring match against\n *     the contents of the `array`. All strings or objects with string properties in `array` that contain this string\n *     will be returned. The predicate can be negated by prefixing the string with `!`.\n *\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\n *     property name `$` can be used (as in `{$:\"text\"}`) to accept a match against any\n *     property of the object. That's equivalent to the simple substring match with a `string`\n *     as described above.\n *\n *   - `function(value)`: A predicate function can be used to write arbitrary filters. The function is\n *     called for each element of `array`. The final result is an array of those elements that\n *     the predicate returned true for.\n *\n * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in\n *     determining if the expected value (from the filter expression) and actual value (from\n *     the object in the array) should be considered a match.\n *\n *   Can be one of:\n *\n *   - `function(actual, expected)`:\n *     The function will be given the object value and the predicate value to compare and\n *     should return true if the item should be included in filtered result.\n *\n *   - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`.\n *     this is essentially strict comparison of expected and actual.\n *\n *   - `false|undefined`: A short hand for a function which will look for a substring match in case\n *     insensitive way.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\n                                {name:'Mary', phone:'800-BIG-MARY'},\n                                {name:'Mike', phone:'555-4321'},\n                                {name:'Adam', phone:'555-5678'},\n                                {name:'Julie', phone:'555-8765'},\n                                {name:'Juliette', phone:'555-5678'}]\"></div>\n\n       Search: <input ng-model=\"searchText\">\n       <table id=\"searchTextResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\n           <td>{{friend.name}}</td>\n           <td>{{friend.phone}}</td>\n         </tr>\n       </table>\n       <hr>\n       Any: <input ng-model=\"search.$\"> <br>\n       Name only <input ng-model=\"search.name\"><br>\n       Phone only <input ng-model=\"search.phone\"><br>\n       Equality <input type=\"checkbox\" ng-model=\"strict\"><br>\n       <table id=\"searchObjResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friendObj in friends | filter:search:strict\">\n           <td>{{friendObj.name}}</td>\n           <td>{{friendObj.phone}}</td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var expectFriendNames = function(expectedNames, key) {\n         element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {\n           arr.forEach(function(wd, i) {\n             expect(wd.getText()).toMatch(expectedNames[i]);\n           });\n         });\n       };\n\n       it('should search across all fields when filtering with a string', function() {\n         var searchText = element(by.model('searchText'));\n         searchText.clear();\n         searchText.sendKeys('m');\n         expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');\n\n         searchText.clear();\n         searchText.sendKeys('76');\n         expectFriendNames(['John', 'Julie'], 'friend');\n       });\n\n       it('should search in specific fields when filtering with a predicate object', function() {\n         var searchAny = element(by.model('search.$'));\n         searchAny.clear();\n         searchAny.sendKeys('i');\n         expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');\n       });\n       it('should use a equal comparison when comparator is true', function() {\n         var searchName = element(by.model('search.name'));\n         var strict = element(by.model('strict'));\n         searchName.clear();\n         searchName.sendKeys('Julie');\n         strict.click();\n         expectFriendNames(['Julie'], 'friendObj');\n       });\n     </file>\n   </example>\n */\nfunction filterFilter() {\n  return function(array, expression, comparator) {\n    if (!isArray(array)) return array;\n\n    var comparatorType = typeof(comparator),\n        predicates = [];\n\n    predicates.check = function(value) {\n      for (var j = 0; j < predicates.length; j++) {\n        if(!predicates[j](value)) {\n          return false;\n        }\n      }\n      return true;\n    };\n\n    if (comparatorType !== 'function') {\n      if (comparatorType === 'boolean' && comparator) {\n        comparator = function(obj, text) {\n          return angular.equals(obj, text);\n        };\n      } else {\n        comparator = function(obj, text) {\n          if (obj && text && typeof obj === 'object' && typeof text === 'object') {\n            for (var objKey in obj) {\n              if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&\n                  comparator(obj[objKey], text[objKey])) {\n                return true;\n              }\n            }\n            return false;\n          }\n          text = (''+text).toLowerCase();\n          return (''+obj).toLowerCase().indexOf(text) > -1;\n        };\n      }\n    }\n\n    var search = function(obj, text){\n      if (typeof text == 'string' && text.charAt(0) === '!') {\n        return !search(obj, text.substr(1));\n      }\n      switch (typeof obj) {\n        case \"boolean\":\n        case \"number\":\n        case \"string\":\n          return comparator(obj, text);\n        case \"object\":\n          switch (typeof text) {\n            case \"object\":\n              return comparator(obj, text);\n            default:\n              for ( var objKey in obj) {\n                if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {\n                  return true;\n                }\n              }\n              break;\n          }\n          return false;\n        case \"array\":\n          for ( var i = 0; i < obj.length; i++) {\n            if (search(obj[i], text)) {\n              return true;\n            }\n          }\n          return false;\n        default:\n          return false;\n      }\n    };\n    switch (typeof expression) {\n      case \"boolean\":\n      case \"number\":\n      case \"string\":\n        // Set up expression object and fall through\n        expression = {$:expression};\n        // jshint -W086\n      case \"object\":\n        // jshint +W086\n        for (var key in expression) {\n          (function(path) {\n            if (typeof expression[path] == 'undefined') return;\n            predicates.push(function(value) {\n              return search(path == '$' ? value : (value && value[path]), expression[path]);\n            });\n          })(key);\n        }\n        break;\n      case 'function':\n        predicates.push(expression);\n        break;\n      default:\n        return array;\n    }\n    var filtered = [];\n    for ( var j = 0; j < array.length; j++) {\n      var value = array[j];\n      if (predicates.check(value)) {\n        filtered.push(value);\n      }\n    }\n    return filtered;\n  };\n}\n\n/**\n * @ngdoc filter\n * @name currency\n * @function\n *\n * @description\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\n * symbol for current locale is used.\n *\n * @param {number} amount Input to filter.\n * @param {string=} symbol Currency symbol or identifier to be displayed.\n * @returns {string} Formatted number.\n *\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.amount = 1234.56;\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <input type=\"number\" ng-model=\"amount\"> <br>\n         default currency symbol ($): <span id=\"currency-default\">{{amount | currency}}</span><br>\n         custom currency identifier (USD$): <span>{{amount | currency:\"USD$\"}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should init with 1234.56', function() {\n         expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');\n         expect(element(by.binding('amount | currency:\"USD$\"')).getText()).toBe('USD$1,234.56');\n       });\n       it('should update', function() {\n         if (browser.params.browser == 'safari') {\n           // Safari does not understand the minus key. See\n           // https://github.com/angular/protractor/issues/481\n           return;\n         }\n         element(by.model('amount')).clear();\n         element(by.model('amount')).sendKeys('-1234');\n         expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');\n         expect(element(by.binding('amount | currency:\"USD$\"')).getText()).toBe('(USD$1,234.00)');\n       });\n     </file>\n   </example>\n */\ncurrencyFilter.$inject = ['$locale'];\nfunction currencyFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(amount, currencySymbol){\n    if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM;\n    return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).\n                replace(/\\u00A4/g, currencySymbol);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name number\n * @function\n *\n * @description\n * Formats a number as text.\n *\n * If the input is not a number an empty string is returned.\n *\n * @param {number|string} number Number to format.\n * @param {(number|string)=} fractionSize Number of decimal places to round the number to.\n * If this is not provided then the fraction size is computed from the current locale's number\n * formatting pattern. In the case of the default locale, it will be 3.\n * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.val = 1234.56789;\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         Enter number: <input ng-model='val'><br>\n         Default formatting: <span id='number-default'>{{val | number}}</span><br>\n         No fractions: <span>{{val | number:0}}</span><br>\n         Negative number: <span>{{-val | number:4}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format numbers', function() {\n         expect(element(by.id('number-default')).getText()).toBe('1,234.568');\n         expect(element(by.binding('val | number:0')).getText()).toBe('1,235');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');\n       });\n\n       it('should update', function() {\n         element(by.model('val')).clear();\n         element(by.model('val')).sendKeys('3374.333');\n         expect(element(by.id('number-default')).getText()).toBe('3,374.333');\n         expect(element(by.binding('val | number:0')).getText()).toBe('3,374');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');\n      });\n     </file>\n   </example>\n */\n\n\nnumberFilter.$inject = ['$locale'];\nfunction numberFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(number, fractionSize) {\n    return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\n      fractionSize);\n  };\n}\n\nvar DECIMAL_SEP = '.';\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\n  if (number == null || !isFinite(number) || isObject(number)) return '';\n\n  var isNegative = number < 0;\n  number = Math.abs(number);\n  var numStr = number + '',\n      formatedText = '',\n      parts = [];\n\n  var hasExponent = false;\n  if (numStr.indexOf('e') !== -1) {\n    var match = numStr.match(/([\\d\\.]+)e(-?)(\\d+)/);\n    if (match && match[2] == '-' && match[3] > fractionSize + 1) {\n      numStr = '0';\n    } else {\n      formatedText = numStr;\n      hasExponent = true;\n    }\n  }\n\n  if (!hasExponent) {\n    var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;\n\n    // determine fractionSize if it is not specified\n    if (isUndefined(fractionSize)) {\n      fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);\n    }\n\n    var pow = Math.pow(10, fractionSize + 1);\n    number = Math.floor(number * pow + 5) / pow;\n    var fraction = ('' + number).split(DECIMAL_SEP);\n    var whole = fraction[0];\n    fraction = fraction[1] || '';\n\n    var i, pos = 0,\n        lgroup = pattern.lgSize,\n        group = pattern.gSize;\n\n    if (whole.length >= (lgroup + group)) {\n      pos = whole.length - lgroup;\n      for (i = 0; i < pos; i++) {\n        if ((pos - i)%group === 0 && i !== 0) {\n          formatedText += groupSep;\n        }\n        formatedText += whole.charAt(i);\n      }\n    }\n\n    for (i = pos; i < whole.length; i++) {\n      if ((whole.length - i)%lgroup === 0 && i !== 0) {\n        formatedText += groupSep;\n      }\n      formatedText += whole.charAt(i);\n    }\n\n    // format fraction part.\n    while(fraction.length < fractionSize) {\n      fraction += '0';\n    }\n\n    if (fractionSize && fractionSize !== \"0\") formatedText += decimalSep + fraction.substr(0, fractionSize);\n  } else {\n\n    if (fractionSize > 0 && number > -1 && number < 1) {\n      formatedText = number.toFixed(fractionSize);\n    }\n  }\n\n  parts.push(isNegative ? pattern.negPre : pattern.posPre);\n  parts.push(formatedText);\n  parts.push(isNegative ? pattern.negSuf : pattern.posSuf);\n  return parts.join('');\n}\n\nfunction padNumber(num, digits, trim) {\n  var neg = '';\n  if (num < 0) {\n    neg =  '-';\n    num = -num;\n  }\n  num = '' + num;\n  while(num.length < digits) num = '0' + num;\n  if (trim)\n    num = num.substr(num.length - digits);\n  return neg + num;\n}\n\n\nfunction dateGetter(name, size, offset, trim) {\n  offset = offset || 0;\n  return function(date) {\n    var value = date['get' + name]();\n    if (offset > 0 || value > -offset)\n      value += offset;\n    if (value === 0 && offset == -12 ) value = 12;\n    return padNumber(value, size, trim);\n  };\n}\n\nfunction dateStrGetter(name, shortForm) {\n  return function(date, formats) {\n    var value = date['get' + name]();\n    var get = uppercase(shortForm ? ('SHORT' + name) : name);\n\n    return formats[get][value];\n  };\n}\n\nfunction timeZoneGetter(date) {\n  var zone = -1 * date.getTimezoneOffset();\n  var paddedZone = (zone >= 0) ? \"+\" : \"\";\n\n  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +\n                padNumber(Math.abs(zone % 60), 2);\n\n  return paddedZone;\n}\n\nfunction getFirstThursdayOfYear(year) {\n    // 0 = index of January\n    var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();\n    // 4 = index of Thursday (+1 to account for 1st = 5)\n    // 11 = index of *next* Thursday (+1 account for 1st = 12)\n    return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);\n}\n\nfunction getThursdayThisWeek(datetime) {\n    return new Date(datetime.getFullYear(), datetime.getMonth(),\n      // 4 = index of Thursday\n      datetime.getDate() + (4 - datetime.getDay()));\n}\n\nfunction weekGetter(size) {\n   return function(date) {\n      var firstThurs = getFirstThursdayOfYear(date.getFullYear()),\n         thisThurs = getThursdayThisWeek(date);\n\n      var diff = +thisThurs - +firstThurs,\n         result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week\n\n      return padNumber(result, size);\n   };\n}\n\nfunction ampmGetter(date, formats) {\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\n}\n\nvar DATE_FORMATS = {\n  yyyy: dateGetter('FullYear', 4),\n    yy: dateGetter('FullYear', 2, 0, true),\n     y: dateGetter('FullYear', 1),\n  MMMM: dateStrGetter('Month'),\n   MMM: dateStrGetter('Month', true),\n    MM: dateGetter('Month', 2, 1),\n     M: dateGetter('Month', 1, 1),\n    dd: dateGetter('Date', 2),\n     d: dateGetter('Date', 1),\n    HH: dateGetter('Hours', 2),\n     H: dateGetter('Hours', 1),\n    hh: dateGetter('Hours', 2, -12),\n     h: dateGetter('Hours', 1, -12),\n    mm: dateGetter('Minutes', 2),\n     m: dateGetter('Minutes', 1),\n    ss: dateGetter('Seconds', 2),\n     s: dateGetter('Seconds', 1),\n     // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n     // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions\n   sss: dateGetter('Milliseconds', 3),\n  EEEE: dateStrGetter('Day'),\n   EEE: dateStrGetter('Day', true),\n     a: ampmGetter,\n     Z: timeZoneGetter,\n    ww: weekGetter(2),\n     w: weekGetter(1)\n};\n\nvar DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,\n    NUMBER_STRING = /^\\-?\\d+$/;\n\n/**\n * @ngdoc filter\n * @name date\n * @function\n *\n * @description\n *   Formats `date` to a string based on the requested `format`.\n *\n *   `format` string can be composed of the following elements:\n *\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\n *   * `'MMMM'`: Month in year (January-December)\n *   * `'MMM'`: Month in year (Jan-Dec)\n *   * `'MM'`: Month in year, padded (01-12)\n *   * `'M'`: Month in year (1-12)\n *   * `'dd'`: Day in month, padded (01-31)\n *   * `'d'`: Day in month (1-31)\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\n *   * `'EEE'`: Day in Week, (Sun-Sat)\n *   * `'HH'`: Hour in day, padded (00-23)\n *   * `'H'`: Hour in day (0-23)\n *   * `'hh'`: Hour in am/pm, padded (01-12)\n *   * `'h'`: Hour in am/pm, (1-12)\n *   * `'mm'`: Minute in hour, padded (00-59)\n *   * `'m'`: Minute in hour (0-59)\n *   * `'ss'`: Second in minute, padded (00-59)\n *   * `'s'`: Second in minute (0-59)\n *   * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)\n *   * `'a'`: am/pm marker\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)\n *   * `'ww'`: ISO-8601 week of year (00-53)\n *   * `'w'`: ISO-8601 week of year (0-53)\n *\n *   `format` string can also be one of the following predefined\n *   {@link guide/i18n localizable formats}:\n *\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\n *     (e.g. Sep 3, 2010 12:05:08 pm)\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 pm)\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US  locale\n *     (e.g. Friday, September 3, 2010)\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)\n *\n *   `format` string can contain literal values. These need to be quoted with single quotes (e.g.\n *   `\"h 'in the morning'\"`). In order to output single quote, use two single quotes in a sequence\n *   (e.g. `\"h 'o''clock'\"`).\n *\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is\n *    specified in the string input, the time is considered to be in the local timezone.\n * @param {string=} format Formatting rules (see Description). If not specified,\n *    `mediumDate` is used.\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\n           <span>{{1288323623006 | date:'medium'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\n          <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\n          <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format date', function() {\n         expect(element(by.binding(\"1288323623006 | date:'medium'\")).getText()).\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\n         expect(element(by.binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).getText()).\n            toMatch(/2010\\-10\\-2\\d \\d{2}:\\d{2}:\\d{2} (\\-|\\+)?\\d{4}/);\n         expect(element(by.binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\n       });\n     </file>\n   </example>\n */\ndateFilter.$inject = ['$locale'];\nfunction dateFilter($locale) {\n\n\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n                     // 1        2       3         4          5          6          7          8  9     10      11\n  function jsonStringToDate(string) {\n    var match;\n    if (match = string.match(R_ISO8601_STR)) {\n      var date = new Date(0),\n          tzHour = 0,\n          tzMin  = 0,\n          dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,\n          timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n      if (match[9]) {\n        tzHour = int(match[9] + match[10]);\n        tzMin = int(match[9] + match[11]);\n      }\n      dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));\n      var h = int(match[4]||0) - tzHour;\n      var m = int(match[5]||0) - tzMin;\n      var s = int(match[6]||0);\n      var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);\n      timeSetter.call(date, h, m, s, ms);\n      return date;\n    }\n    return string;\n  }\n\n\n  return function(date, format) {\n    var text = '',\n        parts = [],\n        fn, match;\n\n    format = format || 'mediumDate';\n    format = $locale.DATETIME_FORMATS[format] || format;\n    if (isString(date)) {\n      if (NUMBER_STRING.test(date)) {\n        date = int(date);\n      } else {\n        date = jsonStringToDate(date);\n      }\n    }\n\n    if (isNumber(date)) {\n      date = new Date(date);\n    }\n\n    if (!isDate(date)) {\n      return date;\n    }\n\n    while(format) {\n      match = DATE_FORMATS_SPLIT.exec(format);\n      if (match) {\n        parts = concat(parts, match, 1);\n        format = parts.pop();\n      } else {\n        parts.push(format);\n        format = null;\n      }\n    }\n\n    forEach(parts, function(value){\n      fn = DATE_FORMATS[value];\n      text += fn ? fn(date, $locale.DATETIME_FORMATS)\n                 : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\n    });\n\n    return text;\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name json\n * @function\n *\n * @description\n *   Allows you to convert a JavaScript object into JSON string.\n *\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\n *   the binding is automatically converted to JSON.\n *\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\n * @returns {string} JSON string.\n *\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <pre>{{ {'name':'value'} | json }}</pre>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should jsonify filtered objects', function() {\n         expect(element(by.binding(\"{'name':'value'}\")).getText()).toMatch(/\\{\\n  \"name\": ?\"value\"\\n}/);\n       });\n     </file>\n   </example>\n *\n */\nfunction jsonFilter() {\n  return function(object) {\n    return toJson(object, true);\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name lowercase\n * @function\n * @description\n * Converts string to lowercase.\n * @see angular.lowercase\n */\nvar lowercaseFilter = valueFn(lowercase);\n\n\n/**\n * @ngdoc filter\n * @name uppercase\n * @function\n * @description\n * Converts string to uppercase.\n * @see angular.uppercase\n */\nvar uppercaseFilter = valueFn(uppercase);\n\n/**\n * @ngdoc filter\n * @name limitTo\n * @function\n *\n * @description\n * Creates a new array or string containing only a specified number of elements. The elements\n * are taken from either the beginning or the end of the source array or string, as specified by\n * the value and sign (positive or negative) of `limit`.\n *\n * @param {Array|string} input Source array or string to be limited.\n * @param {string|number} limit The length of the returned array or string. If the `limit` number\n *     is positive, `limit` number of items from the beginning of the source array/string are copied.\n *     If the number is negative, `limit` number  of items from the end of the source array/string\n *     are copied. The `limit` will be trimmed if it exceeds `array.length`\n * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array\n *     had less than `limit` elements.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.numbers = [1,2,3,4,5,6,7,8,9];\n           $scope.letters = \"abcdefghi\";\n           $scope.numLimit = 3;\n           $scope.letterLimit = 3;\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         Limit {{numbers}} to: <input type=\"integer\" ng-model=\"numLimit\">\n         <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>\n         Limit {{letters}} to: <input type=\"integer\" ng-model=\"letterLimit\">\n         <p>Output letters: {{ letters | limitTo:letterLimit }}</p>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var numLimitInput = element(by.model('numLimit'));\n       var letterLimitInput = element(by.model('letterLimit'));\n       var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));\n       var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));\n\n       it('should limit the number array to first three items', function() {\n         expect(numLimitInput.getAttribute('value')).toBe('3');\n         expect(letterLimitInput.getAttribute('value')).toBe('3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abc');\n       });\n\n       it('should update the output when -3 is entered', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('-3');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('-3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: ghi');\n       });\n\n       it('should not exceed the maximum size of input array', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('100');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('100');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');\n       });\n     </file>\n   </example>\n */\nfunction limitToFilter(){\n  return function(input, limit) {\n    if (!isArray(input) && !isString(input)) return input;\n\n    if (Math.abs(Number(limit)) === Infinity) {\n      limit = Number(limit);\n    } else {\n      limit = int(limit);\n    }\n\n    if (isString(input)) {\n      //NaN check on limit\n      if (limit) {\n        return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);\n      } else {\n        return \"\";\n      }\n    }\n\n    var out = [],\n      i, n;\n\n    // if abs(limit) exceeds maximum length, trim it\n    if (limit > input.length)\n      limit = input.length;\n    else if (limit < -input.length)\n      limit = -input.length;\n\n    if (limit > 0) {\n      i = 0;\n      n = limit;\n    } else {\n      i = input.length + limit;\n      n = input.length;\n    }\n\n    for (; i<n; i++) {\n      out.push(input[i]);\n    }\n\n    return out;\n  };\n}\n\n/**\n * @ngdoc filter\n * @name orderBy\n * @function\n *\n * @description\n * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically\n * for strings and numerically for numbers. Note: if you notice numbers are not being sorted\n * correctly, make sure they are actually being saved as numbers and not strings.\n *\n * @param {Array} array The array to sort.\n * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be\n *    used by the comparator to determine the order of elements.\n *\n *    Can be one of:\n *\n *    - `function`: Getter function. The result of this function will be sorted using the\n *      `<`, `=`, `>` operator.\n *    - `string`: An Angular expression which evaluates to an object to order by, such as 'name'\n *      to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control\n *      ascending or descending sort order (for example, +name or -name).\n *    - `Array`: An array of function or string predicates. The first predicate in the array\n *      is used for sorting, but when two items are equivalent, the next predicate is used.\n *\n * @param {boolean=} reverse Reverse the order of the array.\n * @returns {Array} Sorted copy of the source array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.friends =\n               [{name:'John', phone:'555-1212', age:10},\n                {name:'Mary', phone:'555-9876', age:19},\n                {name:'Mike', phone:'555-4321', age:21},\n                {name:'Adam', phone:'555-5678', age:35},\n                {name:'Julie', phone:'555-8765', age:29}]\n           $scope.predicate = '-age';\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\n         <hr/>\n         [ <a href=\"\" ng-click=\"predicate=''\">unsorted</a> ]\n         <table class=\"friend\">\n           <tr>\n             <th><a href=\"\" ng-click=\"predicate = 'name'; reverse=false\">Name</a>\n                 (<a href=\"\" ng-click=\"predicate = '-name'; reverse=false\">^</a>)</th>\n             <th><a href=\"\" ng-click=\"predicate = 'phone'; reverse=!reverse\">Phone Number</a></th>\n             <th><a href=\"\" ng-click=\"predicate = 'age'; reverse=!reverse\">Age</a></th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:predicate:reverse\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n   </example>\n */\norderByFilter.$inject = ['$parse'];\nfunction orderByFilter($parse){\n  return function(array, sortPredicate, reverseOrder) {\n    if (!isArray(array)) return array;\n    if (!sortPredicate) return array;\n    sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];\n    sortPredicate = map(sortPredicate, function(predicate){\n      var descending = false, get = predicate || identity;\n      if (isString(predicate)) {\n        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {\n          descending = predicate.charAt(0) == '-';\n          predicate = predicate.substring(1);\n        }\n        get = $parse(predicate);\n        if (get.constant) {\n          var key = get();\n          return reverseComparator(function(a,b) {\n            return compare(a[key], b[key]);\n          }, descending);\n        }\n      }\n      return reverseComparator(function(a,b){\n        return compare(get(a),get(b));\n      }, descending);\n    });\n    var arrayCopy = [];\n    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }\n    return arrayCopy.sort(reverseComparator(comparator, reverseOrder));\n\n    function comparator(o1, o2){\n      for ( var i = 0; i < sortPredicate.length; i++) {\n        var comp = sortPredicate[i](o1, o2);\n        if (comp !== 0) return comp;\n      }\n      return 0;\n    }\n    function reverseComparator(comp, descending) {\n      return toBoolean(descending)\n          ? function(a,b){return comp(b,a);}\n          : comp;\n    }\n    function compare(v1, v2){\n      var t1 = typeof v1;\n      var t2 = typeof v2;\n      if (t1 == t2) {\n        if (t1 == \"string\") {\n           v1 = v1.toLowerCase();\n           v2 = v2.toLowerCase();\n        }\n        if (v1 === v2) return 0;\n        return v1 < v2 ? -1 : 1;\n      } else {\n        return t1 < t2 ? -1 : 1;\n      }\n    }\n  };\n}\n\nfunction ngDirective(directive) {\n  if (isFunction(directive)) {\n    directive = {\n      link: directive\n    };\n  }\n  directive.restrict = directive.restrict || 'AC';\n  return valueFn(directive);\n}\n\n/**\n * @ngdoc directive\n * @name a\n * @restrict E\n *\n * @description\n * Modifies the default behavior of the html A tag so that the default action is prevented when\n * the href attribute is empty.\n *\n * This change permits the easy creation of action links with the `ngClick` directive\n * without changing the location or causing page reloads, e.g.:\n * `<a href=\"\" ng-click=\"list.addItem()\">Add Item</a>`\n */\nvar htmlAnchorDirective = valueFn({\n  restrict: 'E',\n  compile: function(element, attr) {\n\n    if (msie <= 8) {\n\n      // turn <a href ng-click=\"..\">link</a> into a stylable link in IE\n      // but only if it doesn't have name attribute, in which case it's an anchor\n      if (!attr.href && !attr.name) {\n        attr.$set('href', '');\n      }\n\n      // add a comment node to anchors to workaround IE bug that causes element content to be reset\n      // to new attribute content if attribute is updated with value containing @ and element also\n      // contains value with @\n      // see issue #1949\n      element.append(document.createComment('IE fix'));\n    }\n\n    if (!attr.href && !attr.xlinkHref && !attr.name) {\n      return function(scope, element) {\n        // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\n        var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?\n                   'xlink:href' : 'href';\n        element.on('click', function(event){\n          // if we have no href url, then don't navigate anywhere.\n          if (!element.attr(href)) {\n            event.preventDefault();\n          }\n        });\n      };\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngHref\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in an href attribute will\n * make the link go to the wrong URL if the user clicks it before\n * Angular has a chance to replace the `{{hash}}` markup with its\n * value. Until Angular replaces the markup the link will be broken\n * and will most likely return a 404 error.\n *\n * The `ngHref` directive solves this problem.\n *\n * The wrong way to write it:\n * ```html\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * @element A\n * @param {template} ngHref any string which can contain `{{}}` markup.\n *\n * @example\n * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes\n * in links and their different behaviors:\n    <example>\n      <file name=\"index.html\">\n        <input ng-model=\"value\" /><br />\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should execute ng-click but not reload when href without value', function() {\n          element(by.id('link-1')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('1');\n          expect(element(by.id('link-1')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when href empty string', function() {\n          element(by.id('link-2')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('2');\n          expect(element(by.id('link-2')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click and change url when ng-href specified', function() {\n          expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\\/123$/);\n\n          element(by.id('link-3')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/123$/);\n            });\n          }, 1000, 'page should navigate to /123');\n        });\n\n        xit('should execute ng-click but not reload when href empty string and name specified', function() {\n          element(by.id('link-4')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('4');\n          expect(element(by.id('link-4')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when no href but name specified', function() {\n          element(by.id('link-5')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('5');\n          expect(element(by.id('link-5')).getAttribute('href')).toBe(null);\n        });\n\n        it('should only change url when only ng-href', function() {\n          element(by.model('value')).clear();\n          element(by.model('value')).sendKeys('6');\n          expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\\/6$/);\n\n          element(by.id('link-6')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/6$/);\n            });\n          }, 1000, 'page should navigate to /6');\n        });\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSrc\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrc` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * @element IMG\n * @param {template} ngSrc any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngSrcset\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrcset` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\n * ```\n *\n * @element IMG\n * @param {template} ngSrcset any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngDisabled\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:\n * ```html\n * <div ng-init=\"scope = { isDisabled: false }\">\n *  <button disabled=\"{{scope.isDisabled}}\">Disabled</button>\n * </div>\n * ```\n *\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as disabled. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngDisabled` directive solves this problem for the `disabled` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle button', function() {\n          expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,\n *     then special attribute \"disabled\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngChecked\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as checked. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngChecked` directive solves this problem for the `checked` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to check both: <input type=\"checkbox\" ng-model=\"master\"><br/>\n        <input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\">\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should check both checkBoxes', function() {\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();\n          element(by.model('master')).click();\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,\n *     then special attribute \"checked\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngReadonly\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as readonly. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngReadonly` directive solves this problem for the `readonly` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\"/>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle readonly attr', function() {\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,\n *     then special attribute \"readonly\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSelected\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as selected. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngSelected` directive solves this problem for the `selected` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to select: <input type=\"checkbox\" ng-model=\"selected\"><br/>\n        <select>\n          <option>Hello!</option>\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\n        </select>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should select Greetings!', function() {\n          expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();\n          element(by.model('selected')).click();\n          expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element OPTION\n * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,\n *     then special attribute \"selected\" will be set on the element\n */\n\n/**\n * @ngdoc directive\n * @name ngOpen\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as open. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngOpen` directive solves this problem for the `open` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n     <example>\n       <file name=\"index.html\">\n         Check me check multiple: <input type=\"checkbox\" ng-model=\"open\"><br/>\n         <details id=\"details\" ng-open=\"open\">\n            <summary>Show/Hide me</summary>\n         </details>\n       </file>\n       <file name=\"protractor.js\" type=\"protractor\">\n         it('should toggle open', function() {\n           expect(element(by.id('details')).getAttribute('open')).toBeFalsy();\n           element(by.model('open')).click();\n           expect(element(by.id('details')).getAttribute('open')).toBeTruthy();\n         });\n       </file>\n     </example>\n *\n * @element DETAILS\n * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,\n *     then special attribute \"open\" will be set on the element\n */\n\nvar ngAttributeAliasDirectives = {};\n\n\n// boolean attrs are evaluated\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\n  // binding to multiple is not supported\n  if (propName == \"multiple\") return;\n\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      priority: 100,\n      link: function(scope, element, attr) {\n        scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {\n          attr.$set(attrName, !!value);\n        });\n      }\n    };\n  };\n});\n\n\n// ng-src, ng-srcset, ng-href are interpolated\nforEach(['src', 'srcset', 'href'], function(attrName) {\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      priority: 99, // it needs to run after the attributes are interpolated\n      link: function(scope, element, attr) {\n        var propName = attrName,\n            name = attrName;\n\n        if (attrName === 'href' &&\n            toString.call(element.prop('href')) === '[object SVGAnimatedString]') {\n          name = 'xlinkHref';\n          attr.$attr[name] = 'xlink:href';\n          propName = null;\n        }\n\n        attr.$observe(normalized, function(value) {\n          if (!value)\n             return;\n\n          attr.$set(name, value);\n\n          // on IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\n          // to set the property as well to achieve the desired effect.\n          // we use attr[attrName] value since $set can sanitize the url.\n          if (msie && propName) element.prop(propName, attr[name]);\n        });\n      }\n    };\n  };\n});\n\n/* global -nullFormCtrl */\nvar nullFormCtrl = {\n  $addControl: noop,\n  $removeControl: noop,\n  $setValidity: noop,\n  $setDirty: noop,\n  $setPristine: noop\n};\n\n/**\n * @ngdoc type\n * @name form.FormController\n *\n * @property {boolean} $pristine True if user has not interacted with the form yet.\n * @property {boolean} $dirty True if user has already interacted with the form.\n * @property {boolean} $valid True if all of the containing forms and controls are valid.\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\n *\n * @property {Object} $error Is an object hash, containing references to all invalid controls or\n *  forms, where:\n *\n *  - keys are validation tokens (error names),\n *  - values are arrays of controls or forms that are invalid for given error name.\n *\n *\n *  Built-in validation tokens:\n *\n *  - `email`\n *  - `max`\n *  - `maxlength`\n *  - `min`\n *  - `minlength`\n *  - `number`\n *  - `pattern`\n *  - `required`\n *  - `url`\n *\n * @description\n * `FormController` keeps track of all its controls and nested forms as well as the state of them,\n * such as being valid/invalid or dirty/pristine.\n *\n * Each {@link ng.directive:form form} directive creates an instance\n * of `FormController`.\n *\n */\n//asks for $scope to fool the BC controller module\nFormController.$inject = ['$element', '$attrs', '$scope', '$animate'];\nfunction FormController(element, attrs, $scope, $animate) {\n  var form = this,\n      parentForm = element.parent().controller('form') || nullFormCtrl,\n      invalidCount = 0, // used to easily determine if we are valid\n      errors = form.$error = {},\n      controls = [];\n\n  // init state\n  form.$name = attrs.name || attrs.ngForm;\n  form.$dirty = false;\n  form.$pristine = true;\n  form.$valid = true;\n  form.$invalid = false;\n\n  parentForm.$addControl(form);\n\n  // Setup initial state of the control\n  element.addClass(PRISTINE_CLASS);\n  toggleValidCss(true);\n\n  // convenience method for easy toggling of classes\n  function toggleValidCss(isValid, validationErrorKey) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n    $animate.removeClass(element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);\n    $animate.addClass(element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\n  }\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$commitViewValue\n   *\n   * @description\n   * Commit all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  form.$commitViewValue = function() {\n    forEach(controls, function(control) {\n      control.$commitViewValue();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$addControl\n   *\n   * @description\n   * Register a control with the form.\n   *\n   * Input elements using ngModelController do this automatically when they are linked.\n   */\n  form.$addControl = function(control) {\n    // Breaking change - before, inputs whose name was \"hasOwnProperty\" were quietly ignored\n    // and not added to the scope.  Now we throw an error.\n    assertNotHasOwnProperty(control.$name, 'input');\n    controls.push(control);\n\n    if (control.$name) {\n      form[control.$name] = control;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$removeControl\n   *\n   * @description\n   * Deregister a control from the form.\n   *\n   * Input elements using ngModelController do this automatically when they are destroyed.\n   */\n  form.$removeControl = function(control) {\n    if (control.$name && form[control.$name] === control) {\n      delete form[control.$name];\n    }\n    forEach(errors, function(queue, validationToken) {\n      form.$setValidity(validationToken, true, control);\n    });\n\n    arrayRemove(controls, control);\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setValidity\n   *\n   * @description\n   * Sets the validity of a form control.\n   *\n   * This method will also propagate to parent forms.\n   */\n  form.$setValidity = function(validationToken, isValid, control) {\n    var queue = errors[validationToken];\n\n    if (isValid) {\n      if (queue) {\n        arrayRemove(queue, control);\n        if (!queue.length) {\n          invalidCount--;\n          if (!invalidCount) {\n            toggleValidCss(isValid);\n            form.$valid = true;\n            form.$invalid = false;\n          }\n          errors[validationToken] = false;\n          toggleValidCss(true, validationToken);\n          parentForm.$setValidity(validationToken, true, form);\n        }\n      }\n\n    } else {\n      if (!invalidCount) {\n        toggleValidCss(isValid);\n      }\n      if (queue) {\n        if (includes(queue, control)) return;\n      } else {\n        errors[validationToken] = queue = [];\n        invalidCount++;\n        toggleValidCss(false, validationToken);\n        parentForm.$setValidity(validationToken, false, form);\n      }\n      queue.push(control);\n\n      form.$valid = false;\n      form.$invalid = true;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setDirty\n   *\n   * @description\n   * Sets the form to a dirty state.\n   *\n   * This method can be called to add the 'ng-dirty' class and set the form to a dirty\n   * state (ng-dirty class). This method will also propagate to parent forms.\n   */\n  form.$setDirty = function() {\n    $animate.removeClass(element, PRISTINE_CLASS);\n    $animate.addClass(element, DIRTY_CLASS);\n    form.$dirty = true;\n    form.$pristine = false;\n    parentForm.$setDirty();\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setPristine\n   *\n   * @description\n   * Sets the form to its pristine state.\n   *\n   * This method can be called to remove the 'ng-dirty' class and set the form to its pristine\n   * state (ng-pristine class). This method will also propagate to all the controls contained\n   * in this form.\n   *\n   * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after\n   * saving or resetting it.\n   */\n  form.$setPristine = function () {\n    $animate.removeClass(element, DIRTY_CLASS);\n    $animate.addClass(element, PRISTINE_CLASS);\n    form.$dirty = false;\n    form.$pristine = true;\n    forEach(controls, function(control) {\n      control.$setPristine();\n    });\n  };\n}\n\n\n/**\n * @ngdoc directive\n * @name ngForm\n * @restrict EAC\n *\n * @description\n * Nestable alias of {@link ng.directive:form `form`} directive. HTML\n * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\n * sub-group of controls needs to be determined.\n *\n * Note: the purpose of `ngForm` is to group controls,\n * but not to be a replacement for the `<form>` tag with all of its capabilities\n * (e.g. posting to the server, ...).\n *\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n *\n */\n\n /**\n * @ngdoc directive\n * @name form\n * @restrict E\n *\n * @description\n * Directive that instantiates\n * {@link form.FormController FormController}.\n *\n * If the `name` attribute is specified, the form controller is published onto the current scope under\n * this name.\n *\n * # Alias: {@link ng.directive:ngForm `ngForm`}\n *\n * In Angular forms can be nested. This means that the outer form is valid when all of the child\n * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so\n * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to\n * `<form>` but can be nested.  This allows you to have nested forms, which is very useful when\n * using Angular validation directives in forms that are dynamically generated using the\n * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name`\n * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an\n * `ngForm` directive and nest these in an outer `form` element.\n *\n *\n * # CSS classes\n *  - `ng-valid` is set if the form is valid.\n *  - `ng-invalid` is set if the form is invalid.\n *  - `ng-pristine` is set if the form is pristine.\n *  - `ng-dirty` is set if the form is dirty.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n *\n * # Submitting a form and preventing the default action\n *\n * Since the role of forms in client-side Angular applications is different than in classical\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\n * to handle the form submission in an application-specific way.\n *\n * For this reason, Angular prevents the default action (form submission to the server) unless the\n * `<form>` element has an `action` attribute specified.\n *\n * You can use one of the following two ways to specify what javascript method should be called when\n * a form is submitted:\n *\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\n * - {@link ng.directive:ngClick ngClick} directive on the first\n  *  button or input field of type submit (input[type=submit])\n *\n * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}\n * or {@link ng.directive:ngClick ngClick} directives.\n * This is because of the following form submission rules in the HTML specification:\n *\n * - If a form has only one input field then hitting enter in this field triggers form submit\n * (`ngSubmit`)\n * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter\n * doesn't trigger submit\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\n *\n * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is\n * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * @param {string=} name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n *\n * ## Animation Hooks\n *\n * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.\n * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any\n * other validations that are performed within the form. Animations in ngForm are similar to how\n * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well\n * as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style a form element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-form {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-form.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n    <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.userType = 'guest';\n         }\n       </script>\n       <style>\n        .my-form {\n          -webkit-transition:all linear 0.5s;\n          transition:all linear 0.5s;\n          background: transparent;\n        }\n        .my-form.ng-invalid {\n          background: red;\n        }\n       </style>\n       <form name=\"myForm\" ng-controller=\"Ctrl\" class=\"my-form\">\n         userType: <input name=\"input\" ng-model=\"userType\" required>\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">Required!</span><br>\n         <tt>userType = {{userType}}</tt><br>\n         <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>\n         <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should initialize to model', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n\n          expect(userType.getText()).toContain('guest');\n          expect(valid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var userInput = element(by.model('userType'));\n\n          userInput.clear();\n          userInput.sendKeys('');\n\n          expect(userType.getText()).toEqual('userType =');\n          expect(valid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n *\n */\nvar formDirectiveFactory = function(isNgForm) {\n  return ['$timeout', function($timeout) {\n    var formDirective = {\n      name: 'form',\n      restrict: isNgForm ? 'EAC' : 'E',\n      controller: FormController,\n      compile: function() {\n        return {\n          pre: function(scope, formElement, attr, controller) {\n            if (!attr.action) {\n              // we can't use jq events because if a form is destroyed during submission the default\n              // action is not prevented. see #1238\n              //\n              // IE 9 is not affected because it doesn't fire a submit event and try to do a full\n              // page reload if the form was destroyed by submission of the form via a click handler\n              // on a button in the form. Looks like an IE9 specific bug.\n              var handleFormSubmission = function(event) {\n                scope.$apply(function() {\n                  controller.$commitViewValue();\n                });\n\n                event.preventDefault\n                  ? event.preventDefault()\n                  : event.returnValue = false; // IE\n              };\n\n              addEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n\n              // unregister the preventDefault listener so that we don't not leak memory but in a\n              // way that will achieve the prevention of the default action.\n              formElement.on('$destroy', function() {\n                $timeout(function() {\n                  removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n                }, 0, false);\n              });\n            }\n\n            var parentFormCtrl = formElement.parent().controller('form'),\n                alias = attr.name || attr.ngForm;\n\n            if (alias) {\n              setter(scope, alias, controller, alias);\n            }\n            if (parentFormCtrl) {\n              formElement.on('$destroy', function() {\n                parentFormCtrl.$removeControl(controller);\n                if (alias) {\n                  setter(scope, alias, undefined, alias);\n                }\n                extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\n              });\n            }\n          }\n        };\n      }\n    };\n\n    return formDirective;\n  }];\n};\n\nvar formDirective = formDirectiveFactory();\nvar ngFormDirective = formDirectiveFactory(true);\n\n/* global\n\n    -VALID_CLASS,\n    -INVALID_CLASS,\n    -PRISTINE_CLASS,\n    -DIRTY_CLASS\n*/\n\nvar URL_REGEXP = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/;\nvar EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\\.[a-z0-9-]+)*$/i;\nvar NUMBER_REGEXP = /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/;\nvar DATE_REGEXP = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nvar DATETIMELOCAL_REGEXP = /^(\\d{4})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)$/;\nvar WEEK_REGEXP = /^(\\d{4})-W(\\d\\d)$/;\nvar MONTH_REGEXP = /^(\\d{4})-(\\d\\d)$/;\nvar TIME_REGEXP = /^(\\d\\d):(\\d\\d)$/;\nvar DEFAULT_REGEXP = /(\\s+|^)default(\\s+|$)/;\n\nvar inputType = {\n\n  /**\n   * @ngdoc input\n   * @name input[text]\n   *\n   * @description\n   * Standard HTML text input with angular data binding.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Adds `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n   *\n   * @example\n      <example name=\"text-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.text = 'guest';\n             $scope.word = /^\\s*\\w*\\s*$/;\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           Single word: <input type=\"text\" name=\"input\" ng-model=\"text\"\n                               ng-pattern=\"word\" required ng-trim=\"false\">\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\n             Single word only!</span>\n\n           <tt>text = {{text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('guest');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if multi word', function() {\n            input.clear();\n            input.sendKeys('hello world');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'text': textInputType,\n\n    /**\n     * @ngdoc input\n     * @name input[date]\n     *\n     * @description\n     * Input with date validation and transformation. In browsers that do not yet support\n     * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601\n     * date format (yyyy-MM-dd), for example: `2009-01-06`. The model must always be a Date object.\n     *\n     * @param {string} ngModel Assignable angular expression to data-bind to.\n     * @param {string=} name Property name of the form under which the control is published.\n     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n     * valid ISO date string (yyyy-MM-dd).\n     * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n     * a valid ISO date string (yyyy-MM-dd).\n     * @param {string=} required Sets `required` validation error key if the value is not entered.\n     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n     *    `required` when you want to data-bind to the `required` attribute.\n     * @param {string=} ngChange Angular expression to be executed when input changes due to user\n     *    interaction with the input element.\n     *\n     * @example\n     <example name=\"date-input-directive\">\n     <file name=\"index.html\">\n       <script>\n          function Ctrl($scope) {\n            $scope.value = new Date(2013, 9, 22);\n          }\n       </script>\n       <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n          Pick a date between in 2013:\n          <input type=\"date\" id=\"exampleInput\" name=\"input\" ng-model=\"value\"\n              placeholder=\"yyyy-MM-dd\" min=\"2013-01-01\" max=\"2013-12-31\" required />\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.date\">\n              Not a valid date!</span>\n           <tt>value = {{value | date: \"yyyy-MM-dd\"}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n       </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        var value = element(by.binding('value | date: \"yyyy-MM-dd\"'));\n        var valid = element(by.binding('myForm.input.$valid'));\n        var input = element(by.model('value'));\n\n        // currently protractor/webdriver does not support\n        // sending keys to all known HTML5 input controls\n        // for various browsers (see https://github.com/angular/protractor/issues/562).\n        function setInput(val) {\n          // set the value of the element and force validation.\n          var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n          \"ipt.value = '\" + val + \"';\" +\n          \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n          browser.executeScript(scr);\n        }\n\n        it('should initialize to model', function() {\n          expect(value.getText()).toContain('2013-10-22');\n          expect(valid.getText()).toContain('myForm.input.$valid = true');\n        });\n\n        it('should be invalid if empty', function() {\n          setInput('');\n          expect(value.getText()).toEqual('value =');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n\n        it('should be invalid if over max', function() {\n          setInput('2015-01-01');\n          expect(value.getText()).toContain('');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n     </file>\n     </example>f\n     */\n  'date': createDateInputType('date', DATE_REGEXP,\n         createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),\n         'yyyy-MM-dd'),\n\n   /**\n    * @ngdoc input\n    * @name input[dateTimeLocal]\n    *\n    * @description\n    * Input with datetime validation and transformation. In browsers that do not yet support\n    * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * local datetime format (yyyy-MM-ddTHH:mm), for example: `2010-12-28T14:57`. The model must be a Date object.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n    * valid ISO datetime format (yyyy-MM-ddTHH:mm).\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n    * a valid ISO datetime format (yyyy-MM-ddTHH:mm).\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"datetimelocal-input-directive\">\n    <file name=\"index.html\">\n      <script>\n        function Ctrl($scope) {\n          $scope.value = new Date(2010, 11, 28, 14, 57);\n        }\n      </script>\n      <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n        Pick a date between in 2013:\n        <input type=\"datetime-local\" id=\"exampleInput\" name=\"input\" ng-model=\"value\"\n            placeholder=\"yyyy-MM-ddTHH:mm\" min=\"2001-01-01T00:00\" max=\"2013-12-31T00:00\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.datetimelocal\">\n            Not a valid date!</span>\n        <tt>value = {{value | date: \"yyyy-MM-ddTHH:mm\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"yyyy-MM-ddTHH:mm\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2010-12-28T14:57');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01-01T23:59');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,\n      createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm']),\n      'yyyy-MM-ddTHH:mm'),\n\n  /**\n   * @ngdoc input\n   * @name input[time]\n   *\n   * @description\n   * Input with time validation and transformation. In browsers that do not yet support\n   * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * local time format (HH:mm), for example: `14:57`. Model must be a Date object. This binding will always output a\n   * Date object to the model of January 1, 1900, or local date `new Date(0, 0, 1, HH, mm)`.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n   * valid ISO time format (HH:mm).\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a\n   * valid ISO time format (HH:mm).\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"time-input-directive\">\n   <file name=\"index.html\">\n     <script>\n      function Ctrl($scope) {\n        $scope.value = new Date(0, 0, 1, 14, 57);\n      }\n     </script>\n     <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n        Pick a between 8am and 5pm:\n        <input type=\"time\" id=\"exampleInput\" name=\"input\" ng-model=\"value\"\n            placeholder=\"HH:mm\" min=\"08:00\" max=\"17:00\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.time\">\n            Not a valid date!</span>\n        <tt>value = {{value | date: \"HH:mm\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"HH:mm\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('14:57');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('23:59');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'time': createDateInputType('time', TIME_REGEXP,\n      createDateParser(TIME_REGEXP, ['HH', 'mm']),\n     'HH:mm'),\n\n   /**\n    * @ngdoc input\n    * @name input[week]\n    *\n    * @description\n    * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support\n    * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * week format (yyyy-W##), for example: `2013-W02`. The model must always be a Date object.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n    * valid ISO week format (yyyy-W##).\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n    * a valid ISO week format (yyyy-W##).\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"week-input-directive\">\n    <file name=\"index.html\">\n      <script>\n      function Ctrl($scope) {\n        $scope.value = new Date(2013, 0, 3);\n      }\n      </script>\n      <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n        Pick a date between in 2013:\n        <input id=\"exampleInput\" type=\"week\" name=\"input\" ng-model=\"value\"\n            placeholder=\"YYYY-W##\" min=\"2012-W32\" max=\"2013-W52\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.week\">\n            Not a valid date!</span>\n        <tt>value = {{value | date: \"yyyy-Www\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"yyyy-Www\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-W01');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-W01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),\n\n  /**\n   * @ngdoc input\n   * @name input[month]\n   *\n   * @description\n   * Input with month validation and transformation. In browsers that do not yet support\n   * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * month format (yyyy-MM), for example: `2009-01`. The model must always be a Date object. In the event the model is\n   * not set to the first of the month, the first of that model's month is assumed.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be\n   * a valid ISO month format (yyyy-MM).\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must\n   * be a valid ISO month format (yyyy-MM).\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"month-input-directive\">\n   <file name=\"index.html\">\n     <script>\n      function Ctrl($scope) {\n        $scope.value = new Date(2013, 9, 1);\n      }\n     </script>\n     <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n       Pick a month int 2013:\n       <input id=\"exampleInput\" type=\"month\" name=\"input\" ng-model=\"value\"\n          placeholder=\"yyyy-MM\" min=\"2013-01\" max=\"2013-12\" required />\n       <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n          Required!</span>\n       <span class=\"error\" ng-show=\"myForm.input.$error.month\">\n          Not a valid month!</span>\n       <tt>value = {{value | date: \"yyyy-MM\"}}</tt><br/>\n       <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n       <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n       <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n       <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"yyyy-MM\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-10');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'month': createDateInputType('month', MONTH_REGEXP,\n     createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),\n     'yyyy-MM'),\n\n  /**\n   * @ngdoc input\n   * @name input[number]\n   *\n   * @description\n   * Text input with number validation and transformation. Sets the `number` validation\n   * error if not a valid number.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"number-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.value = 12;\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           Number: <input type=\"number\" name=\"input\" ng-model=\"value\"\n                          min=\"0\" max=\"99\" required>\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.number\">\n             Not valid number!</span>\n           <tt>value = {{value}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var value = element(by.binding('value'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('value'));\n\n          it('should initialize to model', function() {\n            expect(value.getText()).toContain('12');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if over max', function() {\n            input.clear();\n            input.sendKeys('123');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'number': numberInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[url]\n   *\n   * @description\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\n   * valid URL.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"url-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.text = 'http://google.com';\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           URL: <input type=\"url\" name=\"input\" ng-model=\"text\" required>\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.url\">\n             Not valid url!</span>\n           <tt>text = {{text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('http://google.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not url', function() {\n            input.clear();\n            input.sendKeys('box');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'url': urlInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[email]\n   *\n   * @description\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\n   * address.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"email-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.text = 'me@example.com';\n           }\n         </script>\n           <form name=\"myForm\" ng-controller=\"Ctrl\">\n             Email: <input type=\"email\" name=\"input\" ng-model=\"text\" required>\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.email\">\n               Not valid email!</span>\n             <tt>text = {{text}}</tt><br/>\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\n           </form>\n         </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('me@example.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not email', function() {\n            input.clear();\n            input.sendKeys('xxx');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'email': emailInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[radio]\n   *\n   * @description\n   * HTML radio button.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string} value The value to which the expression should be set when selected.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {string} ngValue Angular expression which sets the value to which the expression should\n   *    be set when selected.\n   *\n   * @example\n      <example name=\"radio-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.color = 'blue';\n             $scope.specialValue = {\n               \"id\": \"12345\",\n               \"value\": \"green\"\n             };\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           <input type=\"radio\" ng-model=\"color\" value=\"red\">  Red <br/>\n           <input type=\"radio\" ng-model=\"color\" ng-value=\"specialValue\"> Green <br/>\n           <input type=\"radio\" ng-model=\"color\" value=\"blue\"> Blue <br/>\n           <tt>color = {{color | json}}</tt><br/>\n          </form>\n          Note that `ng-value=\"specialValue\"` sets radio item's value to be the value of `$scope.specialValue`.\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var color = element(by.binding('color'));\n\n            expect(color.getText()).toContain('blue');\n\n            element.all(by.model('color')).get(0).click();\n\n            expect(color.getText()).toContain('red');\n          });\n        </file>\n      </example>\n   */\n  'radio': radioInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[checkbox]\n   *\n   * @description\n   * HTML checkbox.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngTrueValue The value to which the expression should be set when selected.\n   * @param {string=} ngFalseValue The value to which the expression should be set when not selected.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"checkbox-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.value1 = true;\n             $scope.value2 = 'YES'\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           Value1: <input type=\"checkbox\" ng-model=\"value1\"> <br/>\n           Value2: <input type=\"checkbox\" ng-model=\"value2\"\n                          ng-true-value=\"YES\" ng-false-value=\"NO\"> <br/>\n           <tt>value1 = {{value1}}</tt><br/>\n           <tt>value2 = {{value2}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var value1 = element(by.binding('value1'));\n            var value2 = element(by.binding('value2'));\n\n            expect(value1.getText()).toContain('true');\n            expect(value2.getText()).toContain('YES');\n\n            element(by.model('value1')).click();\n            element(by.model('value2')).click();\n\n            expect(value1.getText()).toContain('false');\n            expect(value2.getText()).toContain('NO');\n          });\n        </file>\n      </example>\n   */\n  'checkbox': checkboxInputType,\n\n  'hidden': noop,\n  'button': noop,\n  'submit': noop,\n  'reset': noop,\n  'file': noop\n};\n\n// A helper function to call $setValidity and return the value / undefined,\n// a pattern that is repeated a lot in the input validation logic.\nfunction validate(ctrl, validatorName, validity, value){\n  ctrl.$setValidity(validatorName, validity);\n  return validity ? value : undefined;\n}\n\n\nfunction addNativeHtml5Validators(ctrl, validatorName, element) {\n  var validity = element.prop('validity');\n  if (isObject(validity)) {\n    var validator = function(value) {\n      // Don't overwrite previous validation, don't consider valueMissing to apply (ng-required can\n      // perform the required validation)\n      if (!ctrl.$error[validatorName] && (validity.badInput || validity.customError ||\n          validity.typeMismatch) && !validity.valueMissing) {\n        ctrl.$setValidity(validatorName, false);\n        return;\n      }\n      return value;\n    };\n    ctrl.$parsers.push(validator);\n  }\n}\n\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  var validity = element.prop('validity');\n  var placeholder = element[0].placeholder, noevent = {};\n\n  // In composition mode, users are still inputing intermediate text buffer,\n  // hold the listener until composition is done.\n  // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent\n  if (!$sniffer.android) {\n    var composing = false;\n\n    element.on('compositionstart', function(data) {\n      composing = true;\n    });\n\n    element.on('compositionend', function() {\n      composing = false;\n      listener();\n    });\n  }\n\n  var listener = function(ev) {\n    if (composing) return;\n    var value = element.val(),\n        event = ev && ev.type;\n\n    // IE (11 and under) seem to emit an 'input' event if the placeholder value changes.\n    // We don't want to dirty the value when this happens, so we abort here. Unfortunately,\n    // IE also sends input events for other non-input-related things, (such as focusing on a\n    // form control), so this change is not entirely enough to solve this.\n    if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {\n      placeholder = element[0].placeholder;\n      return;\n    }\n\n    // By default we will trim the value\n    // If the attribute ng-trim exists we will avoid trimming\n    // e.g. <input ng-model=\"foo\" ng-trim=\"false\">\n    if (toBoolean(attr.ngTrim || 'T')) {\n      value = trim(value);\n    }\n\n    if (ctrl.$viewValue !== value ||\n        // If the value is still empty/falsy, and there is no `required` error, run validators\n        // again. This enables HTML5 constraint validation errors to affect Angular validation\n        // even when the first character entered causes an error.\n        (validity && value === '' && !validity.valueMissing)) {\n      if (scope.$$phase) {\n        ctrl.$setViewValue(value, event);\n      } else {\n        scope.$apply(function() {\n          ctrl.$setViewValue(value, event);\n        });\n      }\n    }\n  };\n\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\n  // input event on backspace, delete or cut\n  if ($sniffer.hasEvent('input')) {\n    element.on('input', listener);\n  } else {\n    var timeout;\n\n    var deferListener = function(ev) {\n      if (!timeout) {\n        timeout = $browser.defer(function() {\n          listener(ev);\n          timeout = null;\n        });\n      }\n    };\n\n    element.on('keydown', function(event) {\n      var key = event.keyCode;\n\n      // ignore\n      //    command            modifiers                   arrows\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\n\n      deferListener(event);\n    });\n\n    // if user modifies input value using context menu in IE, we need \"paste\" and \"cut\" events to catch it\n    if ($sniffer.hasEvent('paste')) {\n      element.on('paste cut', deferListener);\n    }\n  }\n\n  // if user paste into input using mouse on older browser\n  // or form autocomplete on newer browser, we need \"change\" event to catch it\n  element.on('change', listener);\n\n  ctrl.$render = function() {\n    element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);\n  };\n\n  // pattern validator\n  var pattern = attr.ngPattern,\n      patternValidator,\n      match;\n\n  if (pattern) {\n    var validateRegex = function(regexp, value) {\n      return validate(ctrl, 'pattern', ctrl.$isEmpty(value) || regexp.test(value), value);\n    };\n    match = pattern.match(/^\\/(.*)\\/([gim]*)$/);\n    if (match) {\n      pattern = new RegExp(match[1], match[2]);\n      patternValidator = function(value) {\n        return validateRegex(pattern, value);\n      };\n    } else {\n      patternValidator = function(value) {\n        var patternObj = scope.$eval(pattern);\n\n        if (!patternObj || !patternObj.test) {\n          throw minErr('ngPattern')('noregexp',\n            'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern,\n            patternObj, startingTag(element));\n        }\n        return validateRegex(patternObj, value);\n      };\n    }\n\n    ctrl.$formatters.push(patternValidator);\n    ctrl.$parsers.push(patternValidator);\n  }\n\n  // min length validator\n  if (attr.ngMinlength) {\n    var minlength = int(attr.ngMinlength);\n    var minLengthValidator = function(value) {\n      return validate(ctrl, 'minlength', ctrl.$isEmpty(value) || value.length >= minlength, value);\n    };\n\n    ctrl.$parsers.push(minLengthValidator);\n    ctrl.$formatters.push(minLengthValidator);\n  }\n\n  // max length validator\n  if (attr.ngMaxlength) {\n    var maxlength = int(attr.ngMaxlength);\n    var maxLengthValidator = function(value) {\n      return validate(ctrl, 'maxlength', ctrl.$isEmpty(value) || value.length <= maxlength, value);\n    };\n\n    ctrl.$parsers.push(maxLengthValidator);\n    ctrl.$formatters.push(maxLengthValidator);\n  }\n}\n\nfunction weekParser(isoWeek) {\n   if(isDate(isoWeek)) {\n      return isoWeek;\n   }\n\n   if(isString(isoWeek)) {\n      WEEK_REGEXP.lastIndex = 0;\n      var parts = WEEK_REGEXP.exec(isoWeek);\n      if(parts) {\n         var year = +parts[1],\n            week = +parts[2],\n            firstThurs = getFirstThursdayOfYear(year),\n            addDays = (week - 1) * 7;\n         return new Date(year, 0, firstThurs.getDate() + addDays);\n      }\n   }\n\n   return NaN;\n}\n\nfunction createDateParser(regexp, mapping) {\n   return function(iso) {\n      var parts, map;\n\n      if(isDate(iso)) {\n         return iso;\n      }\n\n      if(isString(iso)) {\n         regexp.lastIndex = 0;\n         parts = regexp.exec(iso);\n\n         if(parts) {\n            parts.shift();\n            map = { yyyy: 0, MM: 1, dd: 1, HH: 0, mm: 0 };\n\n            forEach(parts, function(part, index) {\n               if(index < mapping.length) {\n                  map[mapping[index]] = +part;\n               }\n            });\n\n            return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm);\n         }\n      }\n\n      return NaN;\n   };\n}\n\nfunction createDateInputType(type, regexp, parseDate, format) {\n   return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {\n      textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n      ctrl.$parsers.push(function(value) {\n         if(ctrl.$isEmpty(value)) {\n            ctrl.$setValidity(type, true);\n            return null;\n         }\n\n         if(regexp.test(value)) {\n            ctrl.$setValidity(type, true);\n            return parseDate(value);\n         }\n\n         ctrl.$setValidity(type, false);\n         return undefined;\n      });\n\n      ctrl.$formatters.push(function(value) {\n         if(isDate(value)) {\n            return $filter('date')(value, format);\n         }\n         return '';\n      });\n\n      if(attr.min) {\n         var minValidator = function(value) {\n            var valid = ctrl.$isEmpty(value) ||\n               (parseDate(value) >= parseDate(attr.min));\n            ctrl.$setValidity('min', valid);\n            return valid ? value : undefined;\n         };\n\n         ctrl.$parsers.push(minValidator);\n         ctrl.$formatters.push(minValidator);\n      }\n\n      if(attr.max) {\n         var maxValidator = function(value) {\n            var valid = ctrl.$isEmpty(value) ||\n               (parseDate(value) <= parseDate(attr.max));\n            ctrl.$setValidity('max', valid);\n            return valid ? value : undefined;\n         };\n\n         ctrl.$parsers.push(maxValidator);\n         ctrl.$formatters.push(maxValidator);\n      }\n   };\n}\n\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  ctrl.$parsers.push(function(value) {\n    var empty = ctrl.$isEmpty(value);\n    if (empty || NUMBER_REGEXP.test(value)) {\n      ctrl.$setValidity('number', true);\n      return value === '' ? null : (empty ? value : parseFloat(value));\n    } else {\n      ctrl.$setValidity('number', false);\n      return undefined;\n    }\n  });\n\n  addNativeHtml5Validators(ctrl, 'number', element);\n\n  ctrl.$formatters.push(function(value) {\n    return ctrl.$isEmpty(value) ? '' : '' + value;\n  });\n\n  if (attr.min) {\n    var minValidator = function(value) {\n      var min = parseFloat(attr.min);\n      return validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value);\n    };\n\n    ctrl.$parsers.push(minValidator);\n    ctrl.$formatters.push(minValidator);\n  }\n\n  if (attr.max) {\n    var maxValidator = function(value) {\n      var max = parseFloat(attr.max);\n      return validate(ctrl, 'max', ctrl.$isEmpty(value) || value <= max, value);\n    };\n\n    ctrl.$parsers.push(maxValidator);\n    ctrl.$formatters.push(maxValidator);\n  }\n\n  ctrl.$formatters.push(function(value) {\n    return validate(ctrl, 'number', ctrl.$isEmpty(value) || isNumber(value), value);\n  });\n}\n\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var urlValidator = function(value) {\n    return validate(ctrl, 'url', ctrl.$isEmpty(value) || URL_REGEXP.test(value), value);\n  };\n\n  ctrl.$formatters.push(urlValidator);\n  ctrl.$parsers.push(urlValidator);\n}\n\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var emailValidator = function(value) {\n    return validate(ctrl, 'email', ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value), value);\n  };\n\n  ctrl.$formatters.push(emailValidator);\n  ctrl.$parsers.push(emailValidator);\n}\n\nfunction radioInputType(scope, element, attr, ctrl) {\n  // make the name unique, if not defined\n  if (isUndefined(attr.name)) {\n    element.attr('name', nextUid());\n  }\n\n  var listener = function(ev) {\n    if (element[0].checked) {\n      scope.$apply(function() {\n        ctrl.$setViewValue(attr.value, ev && ev.type);\n      });\n    }\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    var value = attr.value;\n    element[0].checked = (value == ctrl.$viewValue);\n  };\n\n  attr.$observe('value', ctrl.$render);\n}\n\nfunction checkboxInputType(scope, element, attr, ctrl) {\n  var trueValue = attr.ngTrueValue,\n      falseValue = attr.ngFalseValue;\n\n  if (!isString(trueValue)) trueValue = true;\n  if (!isString(falseValue)) falseValue = false;\n\n  var listener = function(ev) {\n    scope.$apply(function() {\n      ctrl.$setViewValue(element[0].checked, ev && ev.type);\n    });\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    element[0].checked = ctrl.$viewValue;\n  };\n\n  // Override the standard `$isEmpty` because a value of `false` means empty in a checkbox.\n  ctrl.$isEmpty = function(value) {\n    return value !== trueValue;\n  };\n\n  ctrl.$formatters.push(function(value) {\n    return value === trueValue;\n  });\n\n  ctrl.$parsers.push(function(value) {\n    return value ? trueValue : falseValue;\n  });\n}\n\n\n/**\n * @ngdoc directive\n * @name textarea\n * @restrict E\n *\n * @description\n * HTML textarea element control with angular data-binding. The data-binding and validation\n * properties of this element are exactly the same as those of the\n * {@link ng.directive:input input element}.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength.\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n *    patterns defined as scope expressions.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n */\n\n\n/**\n * @ngdoc directive\n * @name input\n * @restrict E\n *\n * @description\n * HTML input element control with angular data-binding. Input control follows HTML5 input types\n * and polyfills the HTML5 validation behavior for older browsers.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {boolean=} ngRequired Sets `required` attribute if set to true\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength.\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n *    patterns defined as scope expressions.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n *\n * @example\n    <example name=\"input-directive\">\n      <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.user = {name: 'guest', last: 'visitor'};\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <form name=\"myForm\">\n           User name: <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\n           <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\n             Required!</span><br>\n           Last name: <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\n             ng-minlength=\"3\" ng-maxlength=\"10\">\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\n             Too short!</span>\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\n             Too long!</span><br>\n         </form>\n         <hr>\n         <tt>user = {{user}}</tt><br/>\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>\n         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>\n       </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var user = element(by.binding('{{user}}'));\n        var userNameValid = element(by.binding('myForm.userName.$valid'));\n        var lastNameValid = element(by.binding('myForm.lastName.$valid'));\n        var lastNameError = element(by.binding('myForm.lastName.$error'));\n        var formValid = element(by.binding('myForm.$valid'));\n        var userNameInput = element(by.model('user.name'));\n        var userLastInput = element(by.model('user.last'));\n\n        it('should initialize to model', function() {\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty when required', function() {\n          userNameInput.clear();\n          userNameInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('false');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be valid if empty when min length is set', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"\"}');\n          expect(lastNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if less than required min length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('xx');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('minlength');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be invalid if longer than max length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('some ridiculously long name');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('maxlength');\n          expect(formValid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n */\nvar inputDirective = ['$browser', '$sniffer', '$filter', function($browser, $sniffer, $filter) {\n  return {\n    restrict: 'E',\n    require: ['?ngModel'],\n    link: function(scope, element, attr, ctrls) {\n      if (ctrls[0]) {\n        (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,\n                                                            $browser, $filter);\n      }\n    }\n  };\n}];\n\nvar VALID_CLASS = 'ng-valid',\n    INVALID_CLASS = 'ng-invalid',\n    PRISTINE_CLASS = 'ng-pristine',\n    DIRTY_CLASS = 'ng-dirty';\n\n/**\n * @ngdoc type\n * @name ngModel.NgModelController\n *\n * @property {string} $viewValue Actual string value in the view.\n * @property {*} $modelValue The value in the model, that the control is bound to.\n * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever\n       the control reads value from the DOM.  Each function is called, in turn, passing the value\n       through to the next. The last return value is used to populate the model.\n       Used to sanitize / convert the value as well as validation. For validation,\n       the parsers should update the validity state using\n       {@link ngModel.NgModelController#$setValidity $setValidity()},\n       and return `undefined` for invalid values.\n\n *\n * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever\n       the model value changes. Each function is called, in turn, passing the value through to the\n       next. Used to format / convert values for display in the control and validation.\n * ```js\n * function formatter(value) {\n *   if (value) {\n *     return value.toUpperCase();\n *   }\n * }\n * ngModel.$formatters.push(formatter);\n * ```\n *\n * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the\n *     view value has changed. It is called with no arguments, and its return value is ignored.\n *     This can be used in place of additional $watches against the model value.\n *\n * @property {Object} $error An object hash with all errors as keys.\n *\n * @property {boolean} $pristine True if user has not interacted with the control yet.\n * @property {boolean} $dirty True if user has already interacted with the control.\n * @property {boolean} $valid True if there is no error.\n * @property {boolean} $invalid True if at least one error on the control.\n *\n * @description\n *\n * `NgModelController` provides API for the `ng-model` directive. The controller contains\n * services for data-binding, validation, CSS updates, and value formatting and parsing. It\n * purposefully does not contain any logic which deals with DOM rendering or listening to\n * DOM events. Such DOM related logic should be provided by other directives which make use of\n * `NgModelController` for data-binding.\n *\n * ## Custom Control Example\n * This example shows how to use `NgModelController` with a custom control to achieve\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\n * collaborate together to achieve the desired result.\n *\n * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element\n * contents be edited in place by the user.  This will not work on older browsers.\n *\n * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}\n * module to automatically remove \"bad\" content like inline event listener (e.g. `<span onclick=\"...\">`).\n * However, as we are using `$sce` the model can still decide to to provide unsafe content if it marks\n * that content using the `$sce` service.\n *\n * <example name=\"NgModelController\" module=\"customControl\" deps=\"angular-sanitize.js\">\n    <file name=\"style.css\">\n      [contenteditable] {\n        border: 1px solid black;\n        background-color: white;\n        min-height: 20px;\n      }\n\n      .ng-invalid {\n        border: 1px solid red;\n      }\n\n    </file>\n    <file name=\"script.js\">\n      angular.module('customControl', ['ngSanitize']).\n        directive('contenteditable', ['$sce', function($sce) {\n          return {\n            restrict: 'A', // only activate on element attribute\n            require: '?ngModel', // get a hold of NgModelController\n            link: function(scope, element, attrs, ngModel) {\n              if(!ngModel) return; // do nothing if no ng-model\n\n              // Specify how UI should be updated\n              ngModel.$render = function() {\n                element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));\n              };\n\n              // Listen for change events to enable binding\n              element.on('blur keyup change', function() {\n                scope.$apply(read);\n              });\n              read(); // initialize\n\n              // Write data to the model\n              function read() {\n                var html = element.html();\n                // When we clear the content editable the browser leaves a <br> behind\n                // If strip-br attribute is provided then we strip this out\n                if( attrs.stripBr && html == '<br>' ) {\n                  html = '';\n                }\n                ngModel.$setViewValue(html);\n              }\n            }\n          };\n        }]);\n    </file>\n    <file name=\"index.html\">\n      <form name=\"myForm\">\n       <div contenteditable\n            name=\"myWidget\" ng-model=\"userContent\"\n            strip-br=\"true\"\n            required>Change me!</div>\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\n       <hr>\n       <textarea ng-model=\"userContent\"></textarea>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n    it('should data-bind and become invalid', function() {\n      if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') {\n        // SafariDriver can't handle contenteditable\n        // and Firefox driver can't clear contenteditables very well\n        return;\n      }\n      var contentEditable = element(by.css('[contenteditable]'));\n      var content = 'Change me!';\n\n      expect(contentEditable.getText()).toEqual(content);\n\n      contentEditable.clear();\n      contentEditable.sendKeys(protractor.Key.BACK_SPACE);\n      expect(contentEditable.getText()).toEqual('');\n      expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);\n    });\n    </file>\n * </example>\n *\n *\n */\nvar NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout',\n    function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout) {\n  this.$viewValue = Number.NaN;\n  this.$modelValue = Number.NaN;\n  this.$parsers = [];\n  this.$formatters = [];\n  this.$viewChangeListeners = [];\n  this.$pristine = true;\n  this.$dirty = false;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$name = $attr.name;\n\n\n  var ngModelGet = $parse($attr.ngModel),\n      ngModelSet = ngModelGet.assign,\n      pendingDebounce = null,\n      ctrl = this;\n\n  if (!ngModelSet) {\n    throw minErr('ngModel')('nonassign', \"Expression '{0}' is non-assignable. Element: {1}\",\n        $attr.ngModel, startingTag($element));\n  }\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$render\n   *\n   * @description\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\n   * directive will implement this method.\n   */\n  this.$render = noop;\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$isEmpty\n   *\n   * @description\n   * This is called when we need to determine if the value of the input is empty.\n   *\n   * For instance, the required directive does this to work out if the input has data or not.\n   * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.\n   *\n   * You can override this for input directives whose concept of being empty is different to the\n   * default. The `checkboxInputType` directive does this because in its case a value of `false`\n   * implies empty.\n   *\n   * @param {*} value Reference to check.\n   * @returns {boolean} True if `value` is empty.\n   */\n  this.$isEmpty = function(value) {\n    return isUndefined(value) || value === '' || value === null || value !== value;\n  };\n\n  var parentForm = $element.inheritedData('$formController') || nullFormCtrl,\n      invalidCount = 0, // used to easily determine if we are valid\n      $error = this.$error = {}; // keep invalid keys here\n\n\n  // Setup initial state of the control\n  $element.addClass(PRISTINE_CLASS);\n  toggleValidCss(true);\n\n  // convenience method for easy toggling of classes\n  function toggleValidCss(isValid, validationErrorKey) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n    $animate.removeClass($element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);\n    $animate.addClass($element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\n  }\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setValidity\n   *\n   * @description\n   * Change the validity state, and notifies the form when the control changes validity. (i.e. it\n   * does not notify form if given validator is already marked as invalid).\n   *\n   * This method should be called by validators - i.e. the parser or formatter functions.\n   *\n   * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign\n   *        to `$error[validationErrorKey]=isValid` so that it is available for data-binding.\n   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\n   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\n   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .\n   * @param {boolean} isValid Whether the current state is valid (true) or invalid (false).\n   */\n  this.$setValidity = function(validationErrorKey, isValid) {\n    // Purposeful use of ! here to cast isValid to boolean in case it is undefined\n    // jshint -W018\n    if ($error[validationErrorKey] === !isValid) return;\n    // jshint +W018\n\n    if (isValid) {\n      if ($error[validationErrorKey]) invalidCount--;\n      if (!invalidCount) {\n        toggleValidCss(true);\n        ctrl.$valid = true;\n        ctrl.$invalid = false;\n      }\n    } else {\n      toggleValidCss(false);\n      ctrl.$invalid = true;\n      ctrl.$valid = false;\n      invalidCount++;\n    }\n\n    $error[validationErrorKey] = !isValid;\n    toggleValidCss(isValid, validationErrorKey);\n\n    parentForm.$setValidity(validationErrorKey, isValid, ctrl);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setPristine\n   *\n   * @description\n   * Sets the control to its pristine state.\n   *\n   * This method can be called to remove the 'ng-dirty' class and set the control to its pristine\n   * state (ng-pristine class).\n   */\n  this.$setPristine = function () {\n    ctrl.$dirty = false;\n    ctrl.$pristine = true;\n    $animate.removeClass($element, DIRTY_CLASS);\n    $animate.addClass($element, PRISTINE_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$rollbackViewValue\n   *\n   * @description\n   * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,\n   * which may be caused by a pending debounced event or because the input is waiting for a some\n   * future event.\n   *\n   * If you have an input that uses `ng-model-options` to set up debounced events or events such\n   * as blur you can have a situation where there is a period when the `$viewValue`\n   * is out of synch with the ngModel's `$modelValue`.\n   *\n   * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue`\n   * programmatically before these debounced/future events have resolved/occurred, because Angular's\n   * dirty checking mechanism is not able to tell whether the model has actually changed or not.\n   *\n   * The `$rollbackViewValue()` method should be called before programmatically changing the model of an\n   * input which may have such events pending. This is important in order to make sure that the\n   * input field will be updated with the new model value and any pending operations are cancelled.\n   *\n   * <example name=\"ng-model-cancel-update\" module=\"cancel-update-example\">\n   *   <file name=\"app.js\">\n   *     angular.module('cancel-update-example', [])\n   *\n   *     .controller('CancelUpdateCtrl', function($scope) {\n   *       $scope.resetWithCancel = function (e) {\n   *         if (e.keyCode == 27) {\n   *           $scope.myForm.myInput1.$rollbackViewValue();\n   *           $scope.myValue = '';\n   *         }\n   *       };\n   *       $scope.resetWithoutCancel = function (e) {\n   *         if (e.keyCode == 27) {\n   *           $scope.myValue = '';\n   *         }\n   *       };\n   *     });\n   *   </file>\n   *   <file name=\"index.html\">\n   *     <div ng-controller=\"CancelUpdateCtrl\">\n   *       <p>Try typing something in each input.  See that the model only updates when you\n   *          blur off the input.\n   *        </p>\n   *        <p>Now see what happens if you start typing then press the Escape key</p>\n   *\n   *       <form name=\"myForm\" ng-model-options=\"{ updateOn: 'blur' }\">\n   *         <p>With $rollbackViewValue()</p>\n   *         <input name=\"myInput1\" ng-model=\"myValue\" ng-keydown=\"resetWithCancel($event)\"><br/>\n   *         myValue: \"{{ myValue }}\"\n   *\n   *         <p>Without $rollbackViewValue()</p>\n   *         <input name=\"myInput2\" ng-model=\"myValue\" ng-keydown=\"resetWithoutCancel($event)\"><br/>\n   *         myValue: \"{{ myValue }}\"\n   *       </form>\n   *     </div>\n   *   </file>\n   * </example>\n   */\n  this.$rollbackViewValue = function() {\n    $timeout.cancel(pendingDebounce);\n    ctrl.$viewValue = ctrl.$$lastCommittedViewValue;\n    ctrl.$render();\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$commitViewValue\n   *\n   * @description\n   * Commit a pending update to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  this.$commitViewValue = function() {\n    var value = ctrl.$viewValue;\n    $timeout.cancel(pendingDebounce);\n    if (ctrl.$$lastCommittedViewValue === value) {\n      return;\n    }\n    ctrl.$$lastCommittedViewValue = value;\n\n    // change to dirty\n    if (ctrl.$pristine) {\n      ctrl.$dirty = true;\n      ctrl.$pristine = false;\n      $animate.removeClass($element, PRISTINE_CLASS);\n      $animate.addClass($element, DIRTY_CLASS);\n      parentForm.$setDirty();\n    }\n\n    forEach(ctrl.$parsers, function(fn) {\n      value = fn(value);\n    });\n\n    if (ctrl.$modelValue !== value) {\n      ctrl.$modelValue = value;\n      ngModelSet($scope, value);\n      forEach(ctrl.$viewChangeListeners, function(listener) {\n        try {\n          listener();\n        } catch(e) {\n          $exceptionHandler(e);\n        }\n      });\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setViewValue\n   *\n   * @description\n   * Update the view value.\n   *\n   * This method should be called when the view value changes, typically from within a DOM event handler.\n   * For example {@link ng.directive:input input} and\n   * {@link ng.directive:select select} directives call it.\n   *\n   * It will update the $viewValue, then pass this value through each of the functions in `$parsers`,\n   * which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to\n   * `$modelValue` and the **expression** specified in the `ng-model` attribute.\n   *\n   * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.\n   *\n   * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`\n   * and the `default` trigger is not listed, all those actions will remain pending until one of the\n   * `updateOn` events is triggered on the DOM element.\n   * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}\n   * directive is used with a custom debounce for this particular event.\n   *\n   * Note that calling this function does not trigger a `$digest`.\n   *\n   * @param {string} value Value from the view.\n   * @param {string} trigger Event that triggered the update.\n   */\n  this.$setViewValue = function(value, trigger) {\n    ctrl.$viewValue = value;\n    if (!ctrl.$options || ctrl.$options.updateOnDefault) {\n      ctrl.$$debounceViewValueCommit(trigger);\n    }\n  };\n\n  this.$$debounceViewValueCommit = function(trigger) {\n    var debounceDelay = 0,\n        options = ctrl.$options,\n        debounce;\n\n    if(options && isDefined(options.debounce)) {\n      debounce = options.debounce;\n      if(isNumber(debounce)) {\n        debounceDelay = debounce;\n      } else if(isNumber(debounce[trigger])) {\n        debounceDelay = debounce[trigger];\n      } else if (isNumber(debounce['default'])) {\n        debounceDelay = debounce['default'];\n      }\n    }\n\n    $timeout.cancel(pendingDebounce);\n    if (debounceDelay) {\n      pendingDebounce = $timeout(function() {\n        ctrl.$commitViewValue();\n      }, debounceDelay);\n    } else {\n      ctrl.$commitViewValue();\n    }\n  };\n\n  // model -> value\n  $scope.$watch(function ngModelWatch() {\n    var value = ngModelGet($scope);\n\n    // if scope model value and ngModel value are out of sync\n    if (ctrl.$modelValue !== value) {\n\n      var formatters = ctrl.$formatters,\n          idx = formatters.length;\n\n      ctrl.$modelValue = value;\n      while(idx--) {\n        value = formatters[idx](value);\n      }\n\n      if (ctrl.$viewValue !== value) {\n        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = value;\n        ctrl.$render();\n      }\n    }\n\n    return value;\n  });\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngModel\n *\n * @element input\n *\n * @description\n * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a\n * property on the scope using {@link ngModel.NgModelController NgModelController},\n * which is created and exposed by this directive.\n *\n * `ngModel` is responsible for:\n *\n * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`\n *   require.\n * - Providing validation behavior (i.e. required, number, email, url).\n * - Keeping the state of the control (valid/invalid, dirty/pristine, validation errors).\n * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`) including animations.\n * - Registering the control with its parent {@link ng.directive:form form}.\n *\n * Note: `ngModel` will try to bind to the property given by evaluating the expression on the\n * current scope. If the property doesn't already exist on this scope, it will be created\n * implicitly and added to the scope.\n *\n * For best practices on using `ngModel`, see:\n *\n *  - [https://github.com/angular/angular.js/wiki/Understanding-Scopes]\n *\n * For basic examples, how to use `ngModel`, see:\n *\n *  - {@link ng.directive:input input}\n *    - {@link input[text] text}\n *    - {@link input[checkbox] checkbox}\n *    - {@link input[radio] radio}\n *    - {@link input[number] number}\n *    - {@link input[email] email}\n *    - {@link input[url] url}\n *    - {@link input[date] date}\n *    - {@link input[dateTimeLocal] dateTimeLocal}\n *    - {@link input[time] time}\n *    - {@link input[month] month}\n *    - {@link input[week] week}\n *  - {@link ng.directive:select select}\n *  - {@link ng.directive:textarea textarea}\n *\n * # CSS classes\n * The following CSS classes are added and removed on the associated input/select/textarea element\n * depending on the validity of the model.\n *\n *  - `ng-valid` is set if the model is valid.\n *  - `ng-invalid` is set if the model is invalid.\n *  - `ng-pristine` is set if the model is pristine.\n *  - `ng-dirty` is set if the model is dirty.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n * ## Animation Hooks\n *\n * Animations within models are triggered when any of the associated CSS classes are added and removed\n * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`,\n * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.\n * The animations that are triggered within ngModel are similar to how they work in ngClass and\n * animations can be hooked into using CSS transitions, keyframes as well as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style an input element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-input {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-input.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n * <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\">\n     <file name=\"index.html\">\n       <script>\n        function Ctrl($scope) {\n          $scope.val = '1';\n        }\n       </script>\n       <style>\n         .my-input {\n           -webkit-transition:all linear 0.5s;\n           transition:all linear 0.5s;\n           background: transparent;\n         }\n         .my-input.ng-invalid {\n           color:white;\n           background: red;\n         }\n       </style>\n       Update input to see transitions when valid/invalid.\n       Integer is a valid value.\n       <form name=\"testForm\" ng-controller=\"Ctrl\">\n         <input ng-model=\"val\" ng-pattern=\"/^\\d+$/\" name=\"anim\" class=\"my-input\" />\n       </form>\n     </file>\n * </example>\n */\nvar ngModelDirective = function() {\n  return {\n    require: ['ngModel', '^?form', '^?ngModelOptions'],\n    controller: NgModelController,\n    link: {\n      pre: function(scope, element, attr, ctrls) {\n        // Pass the ng-model-options to the ng-model controller\n        if (ctrls[2]) {\n          ctrls[0].$options = ctrls[2].$options;\n        }\n\n        // notify others, especially parent forms\n\n        var modelCtrl = ctrls[0],\n            formCtrl = ctrls[1] || nullFormCtrl;\n\n        formCtrl.$addControl(modelCtrl);\n\n        scope.$on('$destroy', function() {\n          formCtrl.$removeControl(modelCtrl);\n        });\n      },\n      post: function(scope, element, attr, ctrls) {\n        var modelCtrl = ctrls[0];\n        if (modelCtrl.$options && modelCtrl.$options.updateOn) {\n          element.on(modelCtrl.$options.updateOn, function(ev) {\n            scope.$apply(function() {\n              modelCtrl.$$debounceViewValueCommit(ev && ev.type);\n            });\n          });\n        }\n      }\n    }\n  };\n};\n\n\n/**\n * @ngdoc directive\n * @name ngChange\n *\n * @description\n * Evaluate the given expression when the user changes the input.\n * The expression is evaluated immediately, unlike the JavaScript onchange event\n * which only triggers at the end of a change (usually, when the user leaves the\n * form element or presses the return key).\n * The expression is not evaluated when the value change is coming from the model.\n *\n * Note, this directive requires `ngModel` to be present.\n *\n * @element input\n * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change\n * in input value.\n *\n * @example\n * <example name=\"ngChange-directive\">\n *   <file name=\"index.html\">\n *     <script>\n *       function Controller($scope) {\n *         $scope.counter = 0;\n *         $scope.change = function() {\n *           $scope.counter++;\n *         };\n *       }\n *     </script>\n *     <div ng-controller=\"Controller\">\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\n *       <tt>debug = {{confirmed}}</tt><br/>\n *       <tt>counter = {{counter}}</tt><br/>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var counter = element(by.binding('counter'));\n *     var debug = element(by.binding('confirmed'));\n *\n *     it('should evaluate the expression if changing from view', function() {\n *       expect(counter.getText()).toContain('0');\n *\n *       element(by.id('ng-change-example1')).click();\n *\n *       expect(counter.getText()).toContain('1');\n *       expect(debug.getText()).toContain('true');\n *     });\n *\n *     it('should not evaluate the expression if changing from model', function() {\n *       element(by.id('ng-change-example2')).click();\n\n *       expect(counter.getText()).toContain('0');\n *       expect(debug.getText()).toContain('true');\n *     });\n *   </file>\n * </example>\n */\nvar ngChangeDirective = valueFn({\n  require: 'ngModel',\n  link: function(scope, element, attr, ctrl) {\n    ctrl.$viewChangeListeners.push(function() {\n      scope.$eval(attr.ngChange);\n    });\n  }\n});\n\n\nvar requiredDirective = function() {\n  return {\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n      attr.required = true; // force truthy in case we are on non input element\n\n      var validator = function(value) {\n        if (attr.required && ctrl.$isEmpty(value)) {\n          ctrl.$setValidity('required', false);\n          return;\n        } else {\n          ctrl.$setValidity('required', true);\n          return value;\n        }\n      };\n\n      ctrl.$formatters.push(validator);\n      ctrl.$parsers.unshift(validator);\n\n      attr.$observe('required', function() {\n        validator(ctrl.$viewValue);\n      });\n    }\n  };\n};\n\n\n/**\n * @ngdoc directive\n * @name ngList\n *\n * @description\n * Text input that converts between a delimited string and an array of strings. The delimiter\n * can be a fixed string (by default a comma) or a regular expression.\n *\n * @element input\n * @param {string=} ngList optional delimiter that should be used to split the value. If\n *   specified in form `/something/` then the value will be converted into a regular expression.\n *\n * @example\n    <example name=\"ngList-directive\">\n      <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.names = ['igor', 'misko', 'vojta'];\n         }\n       </script>\n       <form name=\"myForm\" ng-controller=\"Ctrl\">\n         List: <input name=\"namesInput\" ng-model=\"names\" ng-list required>\n         <span class=\"error\" ng-show=\"myForm.namesInput.$error.required\">\n           Required!</span>\n         <br>\n         <tt>names = {{names}}</tt><br/>\n         <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\n         <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var listInput = element(by.model('names'));\n        var names = element(by.binding('{{names}}'));\n        var valid = element(by.binding('myForm.namesInput.$valid'));\n        var error = element(by.css('span.error'));\n\n        it('should initialize to model', function() {\n          expect(names.getText()).toContain('[\"igor\",\"misko\",\"vojta\"]');\n          expect(valid.getText()).toContain('true');\n          expect(error.getCssValue('display')).toBe('none');\n        });\n\n        it('should be invalid if empty', function() {\n          listInput.clear();\n          listInput.sendKeys('');\n\n          expect(names.getText()).toContain('');\n          expect(valid.getText()).toContain('false');\n          expect(error.getCssValue('display')).not.toBe('none');        });\n      </file>\n    </example>\n */\nvar ngListDirective = function() {\n  return {\n    require: 'ngModel',\n    link: function(scope, element, attr, ctrl) {\n      var match = /\\/(.*)\\//.exec(attr.ngList),\n          separator = match && new RegExp(match[1]) || attr.ngList || ',';\n\n      var parse = function(viewValue) {\n        // If the viewValue is invalid (say required but empty) it will be `undefined`\n        if (isUndefined(viewValue)) return;\n\n        var list = [];\n\n        if (viewValue) {\n          forEach(viewValue.split(separator), function(value) {\n            if (value) list.push(trim(value));\n          });\n        }\n\n        return list;\n      };\n\n      ctrl.$parsers.push(parse);\n      ctrl.$formatters.push(function(value) {\n        if (isArray(value)) {\n          return value.join(', ');\n        }\n\n        return undefined;\n      });\n\n      // Override the standard $isEmpty because an empty array means the input is empty.\n      ctrl.$isEmpty = function(value) {\n        return !value || !value.length;\n      };\n    }\n  };\n};\n\n\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\n/**\n * @ngdoc directive\n * @name ngValue\n *\n * @description\n * Binds the given expression to the value of `input[select]` or `input[radio]`, so\n * that when the element is selected, the `ngModel` of that element is set to the\n * bound value.\n *\n * `ngValue` is useful when dynamically generating lists of radio buttons using `ng-repeat`, as\n * shown below.\n *\n * @element input\n * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute\n *   of the `input` element\n *\n * @example\n    <example name=\"ngValue-directive\">\n      <file name=\"index.html\">\n       <script>\n          function Ctrl($scope) {\n            $scope.names = ['pizza', 'unicorns', 'robots'];\n            $scope.my = { favorite: 'unicorns' };\n          }\n       </script>\n        <form ng-controller=\"Ctrl\">\n          <h2>Which is your favorite?</h2>\n            <label ng-repeat=\"name in names\" for=\"{{name}}\">\n              {{name}}\n              <input type=\"radio\"\n                     ng-model=\"my.favorite\"\n                     ng-value=\"name\"\n                     id=\"{{name}}\"\n                     name=\"favorite\">\n            </label>\n          <div>You chose {{my.favorite}}</div>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var favorite = element(by.binding('my.favorite'));\n\n        it('should initialize to model', function() {\n          expect(favorite.getText()).toContain('unicorns');\n        });\n        it('should bind the values to the inputs', function() {\n          element.all(by.model('my.favorite')).get(0).click();\n          expect(favorite.getText()).toContain('pizza');\n        });\n      </file>\n    </example>\n */\nvar ngValueDirective = function() {\n  return {\n    priority: 100,\n    compile: function(tpl, tplAttr) {\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\n        return function ngValueConstantLink(scope, elm, attr) {\n          attr.$set('value', scope.$eval(attr.ngValue));\n        };\n      } else {\n        return function ngValueLink(scope, elm, attr) {\n          scope.$watch(attr.ngValue, function valueWatchAction(value) {\n            attr.$set('value', value);\n          });\n        };\n      }\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngModelOptions\n *\n * @description\n * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of\n * events that will trigger a model update and/or a debouncing delay so that the actual update only\n * takes place when a timer expires; this timer will be reset after another change takes place.\n *\n * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might\n * be different than the value in the actual model. This means that if you update the model you\n * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in\n * order to make sure it is synchronized with the model and that any debounced action is canceled.\n *\n * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`}\n * method is by making sure the input is placed inside a form that has a `name` attribute. This is\n * important because `form` controllers are published to the related scope under the name in their\n * `name` attribute.\n *\n * Any pending changes will take place immediately when an enclosing form is submitted via the\n * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:\n *   - `updateOn`: string specifying which event should be the input bound to. You can set several\n *     events using an space delimited list. There is a special event called `default` that\n *     matches the default events belonging of the control.\n *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A\n *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a\n *     custom value for each event. For example:\n *     `ngModelOptions=\"{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }\"`\n *\n * @example\n\n  The following example shows how to override immediate updates. Changes on the inputs within the\n  form will update the model only when the control loses focus (blur event). If `escape` key is\n  pressed while the input field is focused, the value is reset to the value in the current model.\n\n  <example name=\"ngModelOptions-directive-blur\">\n    <file name=\"index.html\">\n      <div ng-controller=\"Ctrl\">\n        <form name=\"userForm\">\n          Name:\n          <input type=\"text\" name=\"userName\"\n                 ng-model=\"user.name\"\n                 ng-model-options=\"{ updateOn: 'blur' }\"\n                 ng-keyup=\"cancel($event)\" /><br />\n\n          Other data:\n          <input type=\"text\" ng-model=\"user.data\" /><br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      function Ctrl($scope) {\n        $scope.user = { name: 'say', data: '' };\n\n        $scope.cancel = function (e) {\n          if (e.keyCode == 27) {\n            $scope.userForm.userName.$rollbackViewValue();\n          }\n        };\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var model = element(by.binding('user.name'));\n      var input = element(by.model('user.name'));\n      var other = element(by.model('user.data'));\n\n      it('should allow custom events', function() {\n        input.sendKeys(' hello');\n        input.click();\n        expect(model.getText()).toEqual('say');\n        other.click();\n        expect(model.getText()).toEqual('say hello');\n      });\n\n      it('should $rollbackViewValue when model changes', function() {\n        input.sendKeys(' hello');\n        expect(input.getAttribute('value')).toEqual('say hello');\n        input.sendKeys(protractor.Key.ESCAPE);\n        expect(input.getAttribute('value')).toEqual('say');\n        other.click();\n        expect(model.getText()).toEqual('say');\n      });\n    </file>\n  </example>\n\n  This one shows how to debounce model changes. Model will be updated only 1 sec after last change.\n  If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.\n\n  <example name=\"ngModelOptions-directive-debounce\">\n    <file name=\"index.html\">\n      <div ng-controller=\"Ctrl\">\n        <form name=\"userForm\">\n          Name:\n          <input type=\"text\" name=\"userName\"\n                 ng-model=\"user.name\"\n                 ng-model-options=\"{ debounce: 1000 }\" />\n          <button ng-click=\"userForm.userName.$rollbackViewValue(); user.name=''\">Clear</button><br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      function Ctrl($scope) {\n        $scope.user = { name: 'say' };\n      }\n    </file>\n  </example>\n */\nvar ngModelOptionsDirective = function() {\n  return {\n    controller: ['$scope', '$attrs', function($scope, $attrs) {\n      var that = this;\n      this.$options = $scope.$eval($attrs.ngModelOptions);\n      // Allow adding/overriding bound events\n      if (this.$options.updateOn !== undefined) {\n        this.$options.updateOnDefault = false;\n        // extract \"default\" pseudo-event from list of events that can trigger a model update\n        this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {\n          that.$options.updateOnDefault = true;\n          return ' ';\n        }));\n      } else {\n        this.$options.updateOnDefault = true;\n      }\n    }]\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngBind\n * @restrict AC\n *\n * @description\n * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\n * with the value of a given expression, and to update the text content when the value of that\n * expression changes.\n *\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\n * `{{ expression }}` which is similar but less verbose.\n *\n * It is preferable to use `ngBind` instead of `{{ expression }}` when a template is momentarily\n * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an\n * element attribute, it makes the bindings invisible to the user while the page is loading.\n *\n * An alternative solution to this problem would be using the\n * {@link ng.directive:ngCloak ngCloak} directive.\n *\n *\n * @element ANY\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\n *\n * @example\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.name = 'Whirled';\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         Enter name: <input type=\"text\" ng-model=\"name\"><br>\n         Hello <span ng-bind=\"name\"></span>!\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var nameInput = element(by.model('name'));\n\n         expect(element(by.binding('name')).getText()).toBe('Whirled');\n         nameInput.clear();\n         nameInput.sendKeys('world');\n         expect(element(by.binding('name')).getText()).toBe('world');\n       });\n     </file>\n   </example>\n */\nvar ngBindDirective = ngDirective(function(scope, element, attr) {\n  element.addClass('ng-binding').data('$binding', attr.ngBind);\n  scope.$watch(attr.ngBind, function ngBindWatchAction(value) {\n    // We are purposefully using == here rather than === because we want to\n    // catch when value is \"null or undefined\"\n    // jshint -W041\n    element.text(value == undefined ? '' : value);\n  });\n});\n\n\n/**\n * @ngdoc directive\n * @name ngBindTemplate\n *\n * @description\n * The `ngBindTemplate` directive specifies that the element\n * text content should be replaced with the interpolation of the template\n * in the `ngBindTemplate` attribute.\n * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`\n * expressions. This directive is needed since some HTML elements\n * (such as TITLE and OPTION) cannot contain SPAN elements.\n *\n * @element ANY\n * @param {string} ngBindTemplate template of form\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\n *\n * @example\n * Try it here: enter text in text box and watch the greeting change.\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.salutation = 'Hello';\n           $scope.name = 'World';\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n        Salutation: <input type=\"text\" ng-model=\"salutation\"><br>\n        Name: <input type=\"text\" ng-model=\"name\"><br>\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var salutationElem = element(by.binding('salutation'));\n         var salutationInput = element(by.model('salutation'));\n         var nameInput = element(by.model('name'));\n\n         expect(salutationElem.getText()).toBe('Hello World!');\n\n         salutationInput.clear();\n         salutationInput.sendKeys('Greetings');\n         nameInput.clear();\n         nameInput.sendKeys('user');\n\n         expect(salutationElem.getText()).toBe('Greetings user!');\n       });\n     </file>\n   </example>\n */\nvar ngBindTemplateDirective = ['$interpolate', function($interpolate) {\n  return function(scope, element, attr) {\n    // TODO: move this to scenario runner\n    var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\n    element.addClass('ng-binding').data('$binding', interpolateFn);\n    attr.$observe('ngBindTemplate', function(value) {\n      element.text(value);\n    });\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindHtml\n *\n * @description\n * Creates a binding that will innerHTML the result of evaluating the `expression` into the current\n * element in a secure way.  By default, the innerHTML-ed content will be sanitized using the {@link\n * ngSanitize.$sanitize $sanitize} service.  To utilize this functionality, ensure that `$sanitize`\n * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in\n * core Angular.)  You may also bypass sanitization for values you know are safe. To do so, bind to\n * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}.  See the example\n * under {@link ng.$sce#Example Strict Contextual Escaping (SCE)}.\n *\n * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you\n * will have an exception (instead of an exploit.)\n *\n * @element ANY\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\n *\n * @example\n   Try it here: enter text in text box and watch the greeting change.\n\n   <example module=\"ngBindHtmlExample\" deps=\"angular-sanitize.js\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ngBindHtmlCtrl\">\n        <p ng-bind-html=\"myHTML\"></p>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n       angular.module('ngBindHtmlExample', ['ngSanitize'])\n\n       .controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) {\n         $scope.myHTML =\n            'I am an <code>HTML</code>string with <a href=\"#\">links!</a> and other <em>stuff</em>';\n       }]);\n     </file>\n\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind-html', function() {\n         expect(element(by.binding('myHTML')).getText()).toBe(\n             'I am an HTMLstring with links! and other stuff');\n       });\n     </file>\n   </example>\n */\nvar ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {\n  return function(scope, element, attr) {\n    element.addClass('ng-binding').data('$binding', attr.ngBindHtml);\n\n    var parsed = $parse(attr.ngBindHtml);\n    function getStringValue() {\n      var value = parsed(scope);\n      getStringValue.$$unwatch = parsed.$$unwatch;\n      return (value || '').toString();\n    }\n\n    scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {\n      element.html($sce.getTrustedHtml(parsed(scope)) || '');\n    });\n  };\n}];\n\nfunction classDirective(name, selector) {\n  name = 'ngClass' + name;\n  return ['$animate', function($animate) {\n    return {\n      restrict: 'AC',\n      link: function(scope, element, attr) {\n        var oldVal;\n\n        scope.$watch(attr[name], ngClassWatchAction, true);\n\n        attr.$observe('class', function(value) {\n          ngClassWatchAction(scope.$eval(attr[name]));\n        });\n\n\n        if (name !== 'ngClass') {\n          scope.$watch('$index', function($index, old$index) {\n            // jshint bitwise: false\n            var mod = $index & 1;\n            if (mod !== (old$index & 1)) {\n              var classes = arrayClasses(scope.$eval(attr[name]));\n              mod === selector ?\n                addClasses(classes) :\n                removeClasses(classes);\n            }\n          });\n        }\n\n        function addClasses(classes) {\n          var newClasses = digestClassCounts(classes, 1);\n          attr.$addClass(newClasses);\n        }\n\n        function removeClasses(classes) {\n          var newClasses = digestClassCounts(classes, -1);\n          attr.$removeClass(newClasses);\n        }\n\n        function digestClassCounts (classes, count) {\n          var classCounts = element.data('$classCounts') || {};\n          var classesToUpdate = [];\n          forEach(classes, function (className) {\n            if (count > 0 || classCounts[className]) {\n              classCounts[className] = (classCounts[className] || 0) + count;\n              if (classCounts[className] === +(count > 0)) {\n                classesToUpdate.push(className);\n              }\n            }\n          });\n          element.data('$classCounts', classCounts);\n          return classesToUpdate.join(' ');\n        }\n\n        function updateClasses (oldClasses, newClasses) {\n          var toAdd = arrayDifference(newClasses, oldClasses);\n          var toRemove = arrayDifference(oldClasses, newClasses);\n          toRemove = digestClassCounts(toRemove, -1);\n          toAdd = digestClassCounts(toAdd, 1);\n\n          if (toAdd.length === 0) {\n            $animate.removeClass(element, toRemove);\n          } else if (toRemove.length === 0) {\n            $animate.addClass(element, toAdd);\n          } else {\n            $animate.setClass(element, toAdd, toRemove);\n          }\n        }\n\n        function ngClassWatchAction(newVal) {\n          if (selector === true || scope.$index % 2 === selector) {\n            var newClasses = arrayClasses(newVal || []);\n            if (!oldVal) {\n              addClasses(newClasses);\n            } else if (!equals(newVal,oldVal)) {\n              var oldClasses = arrayClasses(oldVal);\n              updateClasses(oldClasses, newClasses);\n            }\n          }\n          oldVal = copy(newVal);\n        }\n      }\n    };\n\n    function arrayDifference(tokens1, tokens2) {\n      var values = [];\n\n      outer:\n      for(var i = 0; i < tokens1.length; i++) {\n        var token = tokens1[i];\n        for(var j = 0; j < tokens2.length; j++) {\n          if(token == tokens2[j]) continue outer;\n        }\n        values.push(token);\n      }\n      return values;\n    }\n\n    function arrayClasses (classVal) {\n      if (isArray(classVal)) {\n        return classVal;\n      } else if (isString(classVal)) {\n        return classVal.split(' ');\n      } else if (isObject(classVal)) {\n        var classes = [], i = 0;\n        forEach(classVal, function(v, k) {\n          if (v) {\n            classes.push(k);\n          }\n        });\n        return classes;\n      }\n      return classVal;\n    }\n  }];\n}\n\n/**\n * @ngdoc directive\n * @name ngClass\n * @restrict AC\n *\n * @description\n * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding\n * an expression that represents all classes to be added.\n *\n * The directive operates in three different ways, depending on which of three types the expression\n * evaluates to:\n *\n * 1. If the expression evaluates to a string, the string should be one or more space-delimited class\n * names.\n *\n * 2. If the expression evaluates to an array, each element of the array should be a string that is\n * one or more space-delimited class names.\n *\n * 3. If the expression evaluates to an object, then for each key-value pair of the\n * object with a truthy value the corresponding key is used as a class name.\n *\n * The directive won't add duplicate classes if a particular class was already set.\n *\n * When the expression changes, the previously added classes are removed and only then the\n * new classes are added.\n *\n * @animations\n * add - happens just before the class is applied to the element\n * remove - happens just before the class is removed from the element\n *\n * @element ANY\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class\n *   names, an array, or a map of class names to boolean values. In the case of a map, the\n *   names of the properties whose values are truthy will be added as css classes to the\n *   element.\n *\n * @example Example that demonstrates basic bindings via ngClass directive.\n   <example>\n     <file name=\"index.html\">\n       <p ng-class=\"{strike: deleted, bold: important, red: error}\">Map Syntax Example</p>\n       <input type=\"checkbox\" ng-model=\"deleted\"> deleted (apply \"strike\" class)<br>\n       <input type=\"checkbox\" ng-model=\"important\"> important (apply \"bold\" class)<br>\n       <input type=\"checkbox\" ng-model=\"error\"> error (apply \"red\" class)\n       <hr>\n       <p ng-class=\"style\">Using String Syntax</p>\n       <input type=\"text\" ng-model=\"style\" placeholder=\"Type: bold strike red\">\n       <hr>\n       <p ng-class=\"[style1, style2, style3]\">Using Array Syntax</p>\n       <input ng-model=\"style1\" placeholder=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style2\" placeholder=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style3\" placeholder=\"Type: bold, strike or red\"><br>\n     </file>\n     <file name=\"style.css\">\n       .strike {\n         text-decoration: line-through;\n       }\n       .bold {\n           font-weight: bold;\n       }\n       .red {\n           color: red;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var ps = element.all(by.css('p'));\n\n       it('should let you toggle the class', function() {\n\n         expect(ps.first().getAttribute('class')).not.toMatch(/bold/);\n         expect(ps.first().getAttribute('class')).not.toMatch(/red/);\n\n         element(by.model('important')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/bold/);\n\n         element(by.model('error')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/red/);\n       });\n\n       it('should let you toggle string example', function() {\n         expect(ps.get(1).getAttribute('class')).toBe('');\n         element(by.model('style')).clear();\n         element(by.model('style')).sendKeys('red');\n         expect(ps.get(1).getAttribute('class')).toBe('red');\n       });\n\n       it('array example should have 3 classes', function() {\n         expect(ps.last().getAttribute('class')).toBe('');\n         element(by.model('style1')).sendKeys('bold');\n         element(by.model('style2')).sendKeys('strike');\n         element(by.model('style3')).sendKeys('red');\n         expect(ps.last().getAttribute('class')).toBe('bold strike red');\n       });\n     </file>\n   </example>\n\n   ## Animations\n\n   The example below demonstrates how to perform animations using ngClass.\n\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n     <file name=\"index.html\">\n      <input id=\"setbtn\" type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\n      <input id=\"clearbtn\" type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\n      <br>\n      <span class=\"base-class\" ng-class=\"myVar\">Sample Text</span>\n     </file>\n     <file name=\"style.css\">\n       .base-class {\n         -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n         transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n       }\n\n       .base-class.my-class {\n         color: red;\n         font-size:3em;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class', function() {\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n\n         element(by.id('setbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).\n           toMatch(/my-class/);\n\n         element(by.id('clearbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n       });\n     </file>\n   </example>\n\n\n   ## ngClass and pre-existing CSS3 Transitions/Animations\n   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.\n   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder\n   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure\n   to view the step by step details of {@link ngAnimate.$animate#addclass $animate.addClass} and\n   {@link ngAnimate.$animate#removeclass $animate.removeClass}.\n */\nvar ngClassDirective = classDirective('', true);\n\n/**\n * @ngdoc directive\n * @name ngClassOdd\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}}\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassOddDirective = classDirective('Odd', 0);\n\n/**\n * @ngdoc directive\n * @name ngClassEven\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\n *   result of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}} &nbsp; &nbsp; &nbsp;\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassEvenDirective = classDirective('Even', 1);\n\n/**\n * @ngdoc directive\n * @name ngCloak\n * @restrict AC\n *\n * @description\n * The `ngCloak` directive is used to prevent the Angular html template from being briefly\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\n * directive to avoid the undesirable flicker effect caused by the html template display.\n *\n * The directive can be applied to the `<body>` element, but the preferred usage is to apply\n * multiple `ngCloak` directives to small portions of the page to permit progressive rendering\n * of the browser view.\n *\n * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and\n * `angular.min.js`.\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```css\n * [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n *   display: none !important;\n * }\n * ```\n *\n * When this css rule is loaded by the browser, all html elements (including their children) that\n * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive\n * during the compilation of the template it deletes the `ngCloak` element attribute, making\n * the compiled element visible.\n *\n * For the best result, the `angular.js` script must be loaded in the head section of the html\n * document; alternatively, the css rule above must be included in the external stylesheet of the\n * application.\n *\n * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they\n * cannot match the `[ng\\:cloak]` selector. To work around this limitation, you must add the css\n * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below.\n *\n * @element ANY\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\n        <div id=\"template2\" ng-cloak class=\"ng-cloak\">{{ 'hello IE7' }}</div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should remove the template directive and css class', function() {\n         expect($('#template1').getAttribute('ng-cloak')).\n           toBeNull();\n         expect($('#template2').getAttribute('ng-cloak')).\n           toBeNull();\n       });\n     </file>\n   </example>\n *\n */\nvar ngCloakDirective = ngDirective({\n  compile: function(element, attr) {\n    attr.$set('ngCloak', undefined);\n    element.removeClass('ng-cloak');\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngController\n *\n * @description\n * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular\n * supports the principles behind the Model-View-Controller design pattern.\n *\n * MVC components in angular:\n *\n * * Model — The Model is scope properties; scopes are attached to the DOM where scope properties\n *   are accessed through bindings.\n * * View — The template (HTML with data bindings) that is rendered into the View.\n * * Controller — The `ngController` directive specifies a Controller class; the class contains business\n *   logic behind the application to decorate the scope with functions and values\n *\n * Note that you can also attach controllers to the DOM by declaring it in a route definition\n * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller\n * again using `ng-controller` in the template itself.  This will cause the controller to be attached\n * and executed twice.\n *\n * @element ANY\n * @scope\n * @param {expression} ngController Name of a globally accessible constructor function or an\n *     {@link guide/expression expression} that on the current scope evaluates to a\n *     constructor function. The controller instance can be published into a scope property\n *     by specifying `as propertyName`.\n *\n * @example\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\n * greeting are methods declared on the controller (see source tab). These methods can\n * easily be called from the angular markup. Notice that the scope becomes the `this` for the\n * controller's instance. This allows for easy access to the view data from the controller. Also\n * notice that any changes to the data are automatically reflected in the View without the need\n * for a manual update. The example is shown in two different declaration styles you may use\n * according to preference.\n   <example>\n     <file name=\"index.html\">\n      <script>\n        function SettingsController1() {\n          this.name = \"John Smith\";\n          this.contacts = [\n            {type: 'phone', value: '408 555 1212'},\n            {type: 'email', value: 'john.smith@example.org'} ];\n          };\n\n        SettingsController1.prototype.greet = function() {\n          alert(this.name);\n        };\n\n        SettingsController1.prototype.addContact = function() {\n          this.contacts.push({type: 'email', value: 'yourname@example.org'});\n        };\n\n        SettingsController1.prototype.removeContact = function(contactToRemove) {\n         var index = this.contacts.indexOf(contactToRemove);\n          this.contacts.splice(index, 1);\n        };\n\n        SettingsController1.prototype.clearContact = function(contact) {\n          contact.type = 'phone';\n          contact.value = '';\n        };\n      </script>\n      <div id=\"ctrl-as-exmpl\" ng-controller=\"SettingsController1 as settings\">\n        Name: <input type=\"text\" ng-model=\"settings.name\"/>\n        [ <a href=\"\" ng-click=\"settings.greet()\">greet</a> ]<br/>\n        Contact:\n        <ul>\n          <li ng-repeat=\"contact in settings.contacts\">\n            <select ng-model=\"contact.type\">\n               <option>phone</option>\n               <option>email</option>\n            </select>\n            <input type=\"text\" ng-model=\"contact.value\"/>\n            [ <a href=\"\" ng-click=\"settings.clearContact(contact)\">clear</a>\n            | <a href=\"\" ng-click=\"settings.removeContact(contact)\">X</a> ]\n          </li>\n          <li>[ <a href=\"\" ng-click=\"settings.addContact()\">add</a> ]</li>\n       </ul>\n      </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check controller as', function() {\n         var container = element(by.id('ctrl-as-exmpl'));\n\n         expect(container.findElement(by.model('settings.name'))\n             .getAttribute('value')).toBe('John Smith');\n\n         var firstRepeat =\n             container.findElement(by.repeater('contact in settings.contacts').row(0));\n         var secondRepeat =\n             container.findElement(by.repeater('contact in settings.contacts').row(1));\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('408 555 1212');\n         expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('john.smith@example.org');\n\n         firstRepeat.findElement(by.linkText('clear')).click();\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('');\n\n         container.findElement(by.linkText('add')).click();\n\n         expect(container.findElement(by.repeater('contact in settings.contacts').row(2))\n             .findElement(by.model('contact.value'))\n             .getAttribute('value'))\n             .toBe('yourname@example.org');\n       });\n     </file>\n   </example>\n    <example>\n     <file name=\"index.html\">\n      <script>\n        function SettingsController2($scope) {\n          $scope.name = \"John Smith\";\n          $scope.contacts = [\n            {type:'phone', value:'408 555 1212'},\n            {type:'email', value:'john.smith@example.org'} ];\n\n          $scope.greet = function() {\n           alert($scope.name);\n          };\n\n          $scope.addContact = function() {\n           $scope.contacts.push({type:'email', value:'yourname@example.org'});\n          };\n\n          $scope.removeContact = function(contactToRemove) {\n           var index = $scope.contacts.indexOf(contactToRemove);\n           $scope.contacts.splice(index, 1);\n          };\n\n          $scope.clearContact = function(contact) {\n           contact.type = 'phone';\n           contact.value = '';\n          };\n        }\n      </script>\n      <div id=\"ctrl-exmpl\" ng-controller=\"SettingsController2\">\n        Name: <input type=\"text\" ng-model=\"name\"/>\n        [ <a href=\"\" ng-click=\"greet()\">greet</a> ]<br/>\n        Contact:\n        <ul>\n          <li ng-repeat=\"contact in contacts\">\n            <select ng-model=\"contact.type\">\n               <option>phone</option>\n               <option>email</option>\n            </select>\n            <input type=\"text\" ng-model=\"contact.value\"/>\n            [ <a href=\"\" ng-click=\"clearContact(contact)\">clear</a>\n            | <a href=\"\" ng-click=\"removeContact(contact)\">X</a> ]\n          </li>\n          <li>[ <a href=\"\" ng-click=\"addContact()\">add</a> ]</li>\n       </ul>\n      </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check controller', function() {\n         var container = element(by.id('ctrl-exmpl'));\n\n         expect(container.findElement(by.model('name'))\n             .getAttribute('value')).toBe('John Smith');\n\n         var firstRepeat =\n             container.findElement(by.repeater('contact in contacts').row(0));\n         var secondRepeat =\n             container.findElement(by.repeater('contact in contacts').row(1));\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('408 555 1212');\n         expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('john.smith@example.org');\n\n         firstRepeat.findElement(by.linkText('clear')).click();\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('');\n\n         container.findElement(by.linkText('add')).click();\n\n         expect(container.findElement(by.repeater('contact in contacts').row(2))\n             .findElement(by.model('contact.value'))\n             .getAttribute('value'))\n             .toBe('yourname@example.org');\n       });\n     </file>\n   </example>\n\n */\nvar ngControllerDirective = [function() {\n  return {\n    scope: true,\n    controller: '@',\n    priority: 500\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngCsp\n *\n * @element html\n * @description\n * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.\n *\n * This is necessary when developing things like Google Chrome Extensions.\n *\n * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).\n * For us to be compatible, we just need to implement the \"getterFn\" in $parse without violating\n * any of these restrictions.\n *\n * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`\n * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will\n * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will\n * be raised.\n *\n * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically\n * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).\n * To make those directives work in CSP mode, include the `angular-csp.css` manually.\n *\n * In order to use this feature put the `ngCsp` directive on the root element of the application.\n *\n * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*\n *\n * @example\n * This example shows how to apply the `ngCsp` directive to the `html` tag.\n   ```html\n     <!doctype html>\n     <html ng-app ng-csp>\n     ...\n     ...\n     </html>\n   ```\n */\n\n// ngCsp is not implemented as a proper directive any more, because we need it be processed while we bootstrap\n// the system (before $parse is instantiated), for this reason we just have a csp() fn that looks for ng-csp attribute\n// anywhere in the current doc\n\n/**\n * @ngdoc directive\n * @name ngClick\n *\n * @description\n * The ngClick directive allows you to specify custom behavior when\n * an element is clicked.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\n * click. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\n        Increment\n      </button>\n      count: {{count}}\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-click', function() {\n         expect(element(by.binding('count')).getText()).toMatch('0');\n         element(by.css('button')).click();\n         expect(element(by.binding('count')).getText()).toMatch('1');\n       });\n     </file>\n   </example>\n */\n/*\n * A directive that allows creation of custom onclick handlers that are defined as angular\n * expressions and are compiled and executed within the current scope.\n *\n * Events that are handled via these handler are always configured not to propagate further.\n */\nvar ngEventDirectives = {};\nforEach(\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),\n  function(name) {\n    var directiveName = directiveNormalize('ng-' + name);\n    ngEventDirectives[directiveName] = ['$parse', function($parse) {\n      return {\n        compile: function($element, attr) {\n          var fn = $parse(attr[directiveName]);\n          return function(scope, element, attr) {\n            element.on(lowercase(name), function(event) {\n              scope.$apply(function() {\n                fn(scope, {$event:event});\n              });\n            });\n          };\n        }\n      };\n    }];\n  }\n);\n\n/**\n * @ngdoc directive\n * @name ngDblclick\n *\n * @description\n * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\n * a dblclick. (The Event object is available as `$event`)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-dblclick=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on double click)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousedown\n *\n * @description\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\n * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousedown=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse down)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseup\n *\n * @description\n * Specify custom behavior on mouseup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\n * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseup=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse up)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngMouseover\n *\n * @description\n * Specify custom behavior on mouseover event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\n * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseover=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse is over)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseenter\n *\n * @description\n * Specify custom behavior on mouseenter event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\n * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseenter=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse enters)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseleave\n *\n * @description\n * Specify custom behavior on mouseleave event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\n * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseleave=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse leaves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousemove\n *\n * @description\n * Specify custom behavior on mousemove event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\n * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousemove=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse moves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeydown\n *\n * @description\n * Specify custom behavior on keydown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon\n * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keydown=\"count = count + 1\" ng-init=\"count=0\">\n      key down count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeyup\n *\n * @description\n * Specify custom behavior on keyup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon\n * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keyup=\"count = count + 1\" ng-init=\"count=0\">\n      key up count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeypress\n *\n * @description\n * Specify custom behavior on keypress event.\n *\n * @element ANY\n * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon\n * keypress. ({@link guide/expression#-event- Event object is available as `$event`}\n * and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keypress=\"count = count + 1\" ng-init=\"count=0\">\n      key press count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSubmit\n *\n * @description\n * Enables binding angular expressions to onsubmit events.\n *\n * Additionally it prevents the default action (which for form means sending the request to the\n * server and reloading the current page), but only if the form does not contain `action`,\n * `data-action`, or `x-action` attributes.\n *\n * @element form\n * @priority 0\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\n * ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <script>\n        function Ctrl($scope) {\n          $scope.list = [];\n          $scope.text = 'hello';\n          $scope.submit = function() {\n            if ($scope.text) {\n              $scope.list.push(this.text);\n              $scope.text = '';\n            }\n          };\n        }\n      </script>\n      <form ng-submit=\"submit()\" ng-controller=\"Ctrl\">\n        Enter text and hit enter:\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\n        <pre>list={{list}}</pre>\n      </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-submit', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n         expect(element(by.input('text')).getAttribute('value')).toBe('');\n       });\n       it('should ignore empty strings', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n        });\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngFocus\n *\n * @description\n * Specify custom behavior on focus event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon\n * focus. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngBlur\n *\n * @description\n * Specify custom behavior on blur event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon\n * blur. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngCopy\n *\n * @description\n * Specify custom behavior on copy event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon\n * copy. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-copy=\"copied=true\" ng-init=\"copied=false; value='copy me'\" ng-model=\"value\">\n      copied: {{copied}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngCut\n *\n * @description\n * Specify custom behavior on cut event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon\n * cut. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-cut=\"cut=true\" ng-init=\"cut=false; value='cut me'\" ng-model=\"value\">\n      cut: {{cut}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngPaste\n *\n * @description\n * Specify custom behavior on paste event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon\n * paste. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-paste=\"paste=true\" ng-init=\"paste=false\" placeholder='paste here'>\n      pasted: {{paste}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngIf\n * @restrict A\n *\n * @description\n * The `ngIf` directive removes or recreates a portion of the DOM tree based on an\n * {expression}. If the expression assigned to `ngIf` evaluates to a false\n * value then the element is removed from the DOM, otherwise a clone of the\n * element is reinserted into the DOM.\n *\n * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the\n * element in the DOM rather than changing its visibility via the `display` css property.  A common\n * case when this difference is significant is when using css selectors that rely on an element's\n * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.\n *\n * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope\n * is created when the element is restored.  The scope created within `ngIf` inherits from\n * its parent scope using\n * [prototypal inheritance](https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance).\n * An important implication of this is if `ngModel` is used within `ngIf` to bind to\n * a javascript primitive defined in the parent scope. In this case any modifications made to the\n * variable within the child scope will override (hide) the value in the parent scope.\n *\n * Also, `ngIf` recreates elements using their compiled state. An example of this behavior\n * is if an element's class attribute is directly modified after it's compiled, using something like\n * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element\n * the added class will be lost because the original compiled state is used to regenerate the element.\n *\n * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`\n * and `leave` effects.\n *\n * @animations\n * enter - happens just after the ngIf contents change and a new DOM element is created and injected into the ngIf container\n * leave - happens just before the ngIf contents are removed from the DOM\n *\n * @element ANY\n * @scope\n * @priority 600\n * @param {expression} ngIf If the {@link guide/expression expression} is falsy then\n *     the element is removed from the DOM tree. If it is truthy a copy of the compiled\n *     element is added to the DOM tree.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\" ng-init=\"checked=true\" /><br/>\n      Show when checked:\n      <span ng-if=\"checked\" class=\"animate-if\">\n        I'm removed when the checkbox is unchecked.\n      </span>\n    </file>\n    <file name=\"animations.css\">\n      .animate-if {\n        background:white;\n        border:1px solid black;\n        padding:10px;\n      }\n\n      .animate-if.ng-enter, .animate-if.ng-leave {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n      }\n\n      .animate-if.ng-enter,\n      .animate-if.ng-leave.ng-leave-active {\n        opacity:0;\n      }\n\n      .animate-if.ng-leave,\n      .animate-if.ng-enter.ng-enter-active {\n        opacity:1;\n      }\n    </file>\n  </example>\n */\nvar ngIfDirective = ['$animate', function($animate) {\n  return {\n    transclude: 'element',\n    priority: 600,\n    terminal: true,\n    restrict: 'A',\n    $$tlb: true,\n    link: function ($scope, $element, $attr, ctrl, $transclude) {\n        var block, childScope, previousElements;\n        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {\n\n          if (toBoolean(value)) {\n            if (!childScope) {\n              childScope = $scope.$new();\n              $transclude(childScope, function (clone) {\n                clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when it's template arrives.\n                block = {\n                  clone: clone\n                };\n                $animate.enter(clone, $element.parent(), $element);\n              });\n            }\n          } else {\n            if(previousElements) {\n              previousElements.remove();\n              previousElements = null;\n            }\n            if(childScope) {\n              childScope.$destroy();\n              childScope = null;\n            }\n            if(block) {\n              previousElements = getBlockElements(block.clone);\n              $animate.leave(previousElements, function() {\n                previousElements = null;\n              });\n              block = null;\n            }\n          }\n        });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngInclude\n * @restrict ECA\n *\n * @description\n * Fetches, compiles and includes an external HTML fragment.\n *\n * By default, the template URL is restricted to the same domain and protocol as the\n * application document. This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols\n * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or\n * [wrap them](ng.$sce#trustAsResourceUrl) as trusted values. Refer to Angular's {@link\n * ng.$sce Strict Contextual Escaping}.\n *\n * In addition, the browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy may further restrict whether the template is successfully loaded.\n * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`\n * access on some browsers.\n *\n * @animations\n * enter - animation is used to bring new content into the browser.\n * leave - animation is used to animate existing content away.\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n *\n * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\n *                 make sure you wrap it in **single** quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\n *\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n     <div ng-controller=\"Ctrl\">\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\n        <option value=\"\">(blank)</option>\n       </select>\n       url of the template: <tt>{{template.url}}</tt>\n       <hr/>\n       <div class=\"slide-animate-container\">\n         <div class=\"slide-animate\" ng-include=\"template.url\"></div>\n       </div>\n     </div>\n    </file>\n    <file name=\"script.js\">\n      function Ctrl($scope) {\n        $scope.templates =\n          [ { name: 'template1.html', url: 'template1.html'},\n            { name: 'template2.html', url: 'template2.html'} ];\n        $scope.template = $scope.templates[0];\n      }\n     </file>\n    <file name=\"template1.html\">\n      Content of template1.html\n    </file>\n    <file name=\"template2.html\">\n      Content of template2.html\n    </file>\n    <file name=\"animations.css\">\n      .slide-animate-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .slide-animate {\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter, .slide-animate.ng-leave {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n        display:block;\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter {\n        top:-50px;\n      }\n      .slide-animate.ng-enter.ng-enter-active {\n        top:0;\n      }\n\n      .slide-animate.ng-leave {\n        top:0;\n      }\n      .slide-animate.ng-leave.ng-leave-active {\n        top:50px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var templateSelect = element(by.model('template'));\n      var includeElem = element(by.css('[ng-include]'));\n\n      it('should load template1.html', function() {\n        expect(includeElem.getText()).toMatch(/Content of template1.html/);\n      });\n\n      it('should load template2.html', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          // See https://github.com/angular/protractor/issues/480\n          return;\n        }\n        templateSelect.click();\n        templateSelect.element.all(by.css('option')).get(2).click();\n        expect(includeElem.getText()).toMatch(/Content of template2.html/);\n      });\n\n      it('should change to blank', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          return;\n        }\n        templateSelect.click();\n        templateSelect.element.all(by.css('option')).get(0).click();\n        expect(includeElem.isPresent()).toBe(false);\n      });\n    </file>\n  </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentRequested\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted every time the ngInclude content is requested.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentLoaded\n * @eventType emit on the current ngInclude scope\n * @description\n * Emitted every time the ngInclude content is reloaded.\n */\nvar ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce',\n                  function($http,   $templateCache,   $anchorScroll,   $animate,   $sce) {\n  return {\n    restrict: 'ECA',\n    priority: 400,\n    terminal: true,\n    transclude: 'element',\n    controller: angular.noop,\n    compile: function(element, attr) {\n      var srcExp = attr.ngInclude || attr.src,\n          onloadExp = attr.onload || '',\n          autoScrollExp = attr.autoscroll;\n\n      return function(scope, $element, $attr, ctrl, $transclude) {\n        var changeCounter = 0,\n            currentScope,\n            previousElement,\n            currentElement;\n\n        var cleanupLastIncludeContent = function() {\n          if(previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if(currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if(currentElement) {\n            $animate.leave(currentElement, function() {\n              previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        };\n\n        scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {\n          var afterAnimation = function() {\n            if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n              $anchorScroll();\n            }\n          };\n          var thisChangeId = ++changeCounter;\n\n          if (src) {\n            $http.get(src, {cache: $templateCache}).success(function(response) {\n              if (thisChangeId !== changeCounter) return;\n              var newScope = scope.$new();\n              ctrl.template = response;\n\n              // Note: This will also link all children of ng-include that were contained in the original\n              // html. If that content contains controllers, ... they could pollute/change the scope.\n              // However, using ng-include on an element with additional content does not make sense...\n              // Note: We can't remove them in the cloneAttchFn of $transclude as that\n              // function is called before linking the content, which would apply child\n              // directives to non existing elements.\n              var clone = $transclude(newScope, function(clone) {\n                cleanupLastIncludeContent();\n                $animate.enter(clone, null, $element, afterAnimation);\n              });\n\n              currentScope = newScope;\n              currentElement = clone;\n\n              currentScope.$emit('$includeContentLoaded');\n              scope.$eval(onloadExp);\n            }).error(function() {\n              if (thisChangeId === changeCounter) cleanupLastIncludeContent();\n            });\n            scope.$emit('$includeContentRequested');\n          } else {\n            cleanupLastIncludeContent();\n            ctrl.template = null;\n          }\n        });\n      };\n    }\n  };\n}];\n\n// This directive is called during the $transclude call of the first `ngInclude` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngInclude\n// is called.\nvar ngIncludeFillContentDirective = ['$compile',\n  function($compile) {\n    return {\n      restrict: 'ECA',\n      priority: -400,\n      require: 'ngInclude',\n      link: function(scope, $element, $attr, ctrl) {\n        $element.html(ctrl.template);\n        $compile($element.contents())(scope);\n      }\n    };\n  }];\n\n/**\n * @ngdoc directive\n * @name ngInit\n * @restrict AC\n *\n * @description\n * The `ngInit` directive allows you to evaluate an expression in the\n * current scope.\n *\n * <div class=\"alert alert-error\">\n * The only appropriate use of `ngInit` is for aliasing special properties of\n * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you\n * should use {@link guide/controller controllers} rather than `ngInit`\n * to initialize values on a scope.\n * </div>\n * <div class=\"alert alert-warning\">\n * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make\n * sure you have parenthesis for correct precedence:\n * <pre class=\"prettyprint\">\n *   <div ng-init=\"test1 = (data | orderBy:'name')\"></div>\n * </pre>\n * </div>\n *\n * @priority 450\n *\n * @element ANY\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n   <script>\n     function Ctrl($scope) {\n       $scope.list = [['a', 'b'], ['c', 'd']];\n     }\n   </script>\n   <div ng-controller=\"Ctrl\">\n     <div ng-repeat=\"innerList in list\" ng-init=\"outerIndex = $index\">\n       <div ng-repeat=\"value in innerList\" ng-init=\"innerIndex = $index\">\n          <span class=\"example-init\">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>\n       </div>\n     </div>\n   </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should alias index positions', function() {\n         var elements = element.all(by.css('.example-init'));\n         expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');\n         expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');\n         expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');\n         expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');\n       });\n     </file>\n   </example>\n */\nvar ngInitDirective = ngDirective({\n  priority: 450,\n  compile: function() {\n    return {\n      pre: function(scope, element, attrs) {\n        scope.$eval(attrs.ngInit);\n      }\n    };\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngNonBindable\n * @restrict AC\n * @priority 1000\n *\n * @description\n * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current\n * DOM element. This is useful if the element contains what appears to be Angular directives and\n * bindings but which should be ignored by Angular. This could be the case if you have a site that\n * displays snippets of code, for instance.\n *\n * @element ANY\n *\n * @example\n * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\n * but the one wrapped in `ngNonBindable` is left alone.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <div>Normal: {{1 + 2}}</div>\n        <div ng-non-bindable>Ignored: {{1 + 2}}</div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-non-bindable', function() {\n         expect(element(by.binding('1 + 2')).getText()).toContain('3');\n         expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\n       });\n      </file>\n    </example>\n */\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\n\n/**\n * @ngdoc directive\n * @name ngPluralize\n * @restrict EA\n *\n * @description\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\n * These rules are bundled with angular.js, but can be overridden\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\n * by specifying the mappings between\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * and the strings to be displayed.\n *\n * # Plural categories and explicit number rules\n * There are two\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * in Angular's default en-US locale: \"one\" and \"other\".\n *\n * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\n * any number that is not 1), an explicit number rule can only match one number. For example, the\n * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\n * and explicit number rules throughout the rest of this documentation.\n *\n * # Configuring ngPluralize\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\n * You can also provide an optional attribute, `offset`.\n *\n * The value of the `count` attribute can be either a string or an {@link guide/expression\n * Angular expression}; these are evaluated on the current scope for its bound value.\n *\n * The `when` attribute specifies the mappings between plural categories and the actual\n * string to be displayed. The value of the attribute should be a JSON object.\n *\n * The following example shows how to configure ngPluralize:\n *\n * ```html\n * <ng-pluralize count=\"personCount\"\n                 when=\"{'0': 'Nobody is viewing.',\n *                      'one': '1 person is viewing.',\n *                      'other': '{} people are viewing.'}\">\n * </ng-pluralize>\n *```\n *\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\n * show \"a dozen people are viewing\".\n *\n * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\n * into pluralized strings. In the previous example, Angular will replace `{}` with\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\n * for <span ng-non-bindable>{{numberExpression}}</span>.\n *\n * # Configuring ngPluralize with offset\n * The `offset` attribute allows further customization of pluralized text, which can result in\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\n * you might display \"John, Kate and 2 others are viewing this document\".\n * The offset attribute allows you to offset a number by any desired value.\n * Let's take a look at an example:\n *\n * ```html\n * <ng-pluralize count=\"personCount\" offset=2\n *               when=\"{'0': 'Nobody is viewing.',\n *                      '1': '{{person1}} is viewing.',\n *                      '2': '{{person1}} and {{person2}} are viewing.',\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n * </ng-pluralize>\n * ```\n *\n * Notice that we are still using two plural categories(one, other), but we added\n * three explicit number rules 0, 1 and 2.\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\n * When three people view the document, no explicit number rule is found, so\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\n * In this case, plural category 'one' is matched and \"John, Marry and one other person are viewing\"\n * is shown.\n *\n * Note that when you specify offsets, you must provide explicit number rules for\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\n * plural categories \"one\" and \"other\".\n *\n * @param {string|expression} count The variable to be bound to.\n * @param {string} when The mapping between plural category to its corresponding strings.\n * @param {number=} offset Offset to deduct from the total number.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <script>\n          function Ctrl($scope) {\n            $scope.person1 = 'Igor';\n            $scope.person2 = 'Misko';\n            $scope.personCount = 1;\n          }\n        </script>\n        <div ng-controller=\"Ctrl\">\n          Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /><br/>\n          Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /><br/>\n          Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /><br/>\n\n          <!--- Example with simple pluralization rules for en locale --->\n          Without Offset:\n          <ng-pluralize count=\"personCount\"\n                        when=\"{'0': 'Nobody is viewing.',\n                               'one': '1 person is viewing.',\n                               'other': '{} people are viewing.'}\">\n          </ng-pluralize><br>\n\n          <!--- Example with offset --->\n          With Offset(2):\n          <ng-pluralize count=\"personCount\" offset=2\n                        when=\"{'0': 'Nobody is viewing.',\n                               '1': '{{person1}} is viewing.',\n                               '2': '{{person1}} and {{person2}} are viewing.',\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n          </ng-pluralize>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should show correct pluralized string', function() {\n          var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var countInput = element(by.model('personCount'));\n\n          expect(withoutOffset.getText()).toEqual('1 person is viewing.');\n          expect(withOffset.getText()).toEqual('Igor is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('0');\n\n          expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\n          expect(withOffset.getText()).toEqual('Nobody is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('2');\n\n          expect(withoutOffset.getText()).toEqual('2 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('3');\n\n          expect(withoutOffset.getText()).toEqual('3 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('4');\n\n          expect(withoutOffset.getText()).toEqual('4 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\n        });\n        it('should show data-bound names', function() {\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var personCount = element(by.model('personCount'));\n          var person1 = element(by.model('person1'));\n          var person2 = element(by.model('person2'));\n          personCount.clear();\n          personCount.sendKeys('4');\n          person1.clear();\n          person1.sendKeys('Di');\n          person2.clear();\n          person2.sendKeys('Vojta');\n          expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\n        });\n      </file>\n    </example>\n */\nvar ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {\n  var BRACE = /{}/g;\n  return {\n    restrict: 'EA',\n    link: function(scope, element, attr) {\n      var numberExp = attr.count,\n          whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\n          offset = attr.offset || 0,\n          whens = scope.$eval(whenExp) || {},\n          whensExpFns = {},\n          startSymbol = $interpolate.startSymbol(),\n          endSymbol = $interpolate.endSymbol(),\n          isWhen = /^when(Minus)?(.+)$/;\n\n      forEach(attr, function(expression, attributeName) {\n        if (isWhen.test(attributeName)) {\n          whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] =\n            element.attr(attr.$attr[attributeName]);\n        }\n      });\n      forEach(whens, function(expression, key) {\n        whensExpFns[key] =\n          $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +\n            offset + endSymbol));\n      });\n\n      scope.$watch(function ngPluralizeWatch() {\n        var value = parseFloat(scope.$eval(numberExp));\n\n        if (!isNaN(value)) {\n          //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,\n          //check it against pluralization rules in $locale service\n          if (!(value in whens)) value = $locale.pluralCat(value - offset);\n           return whensExpFns[value](scope);\n        } else {\n          return '';\n        }\n      }, function ngPluralizeWatchAction(newVal) {\n        element.text(newVal);\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRepeat\n *\n * @description\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\n * instance gets its own scope, where the given loop variable is set to the current collection item,\n * and `$index` is set to the item index or key.\n *\n * Special properties are exposed on the local scope of each template instance, including:\n *\n * | Variable  | Type            | Details                                                                     |\n * |-----------|-----------------|-----------------------------------------------------------------------------|\n * | `$index`  | {@type number}  | iterator offset of the repeated element (0..length-1)                       |\n * | `$first`  | {@type boolean} | true if the repeated element is first in the iterator.                      |\n * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\n * | `$last`   | {@type boolean} | true if the repeated element is last in the iterator.                       |\n * | `$even`   | {@type boolean} | true if the iterator position `$index` is even (otherwise false).           |\n * | `$odd`    | {@type boolean} | true if the iterator position `$index` is odd (otherwise false).            |\n *\n * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\n * This may be useful when, for instance, nesting ngRepeats.\n *\n * # Special repeat start and end points\n * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\n * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\n * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\n * up to and including the ending HTML tag where **ng-repeat-end** is placed.\n *\n * The example below makes use of this feature:\n * ```html\n *   <header ng-repeat-start=\"item in items\">\n *     Header {{ item }}\n *   </header>\n *   <div class=\"body\">\n *     Body {{ item }}\n *   </div>\n *   <footer ng-repeat-end>\n *     Footer {{ item }}\n *   </footer>\n * ```\n *\n * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\n * ```html\n *   <header>\n *     Header A\n *   </header>\n *   <div class=\"body\">\n *     Body A\n *   </div>\n *   <footer>\n *     Footer A\n *   </footer>\n *   <header>\n *     Header B\n *   </header>\n *   <div class=\"body\">\n *     Body B\n *   </div>\n *   <footer>\n *     Footer B\n *   </footer>\n * ```\n *\n * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\n * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\n *\n * @animations\n * **.enter** - when a new item is added to the list or when an item is revealed after a filter\n *\n * **.leave** - when an item is removed from the list or when an item is filtered out\n *\n * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered\n *\n * @element ANY\n * @scope\n * @priority 1000\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\n *   formats are currently supported:\n *\n *   * `variable in expression` – where variable is the user defined loop variable and `expression`\n *     is a scope expression giving the collection to enumerate.\n *\n *     For example: `album in artist.albums`.\n *\n *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\n *     and `expression` is the scope expression giving the collection to enumerate.\n *\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\n *\n *   * `variable in expression track by tracking_expression` – You can also provide an optional tracking function\n *     which can be used to associate the objects in the collection with the DOM elements. If no tracking function\n *     is specified the ng-repeat associates elements by identity in the collection. It is an error to have\n *     more than one tracking function to resolve to the same key. (This would mean that two distinct objects are\n *     mapped to the same DOM element, which is not possible.)  Filters should be applied to the expression,\n *     before specifying a tracking expression.\n *\n *     For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements\n *     will be associated by item identity in the array.\n *\n *     For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique\n *     `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements\n *     with the corresponding item in the array by identity. Moving the same object in array would move the DOM\n *     element in the same way in the DOM.\n *\n *     For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this\n *     case the object identity does not matter. Two objects are considered equivalent as long as their `id`\n *     property is same.\n *\n *     For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter\n *     to items in conjunction with a tracking expression.\n *\n * @example\n * This example initializes the scope to a list of names and\n * then uses `ngRepeat` to display every person:\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-init=\"friends = [\n        {name:'John', age:25, gender:'boy'},\n        {name:'Jessie', age:30, gender:'girl'},\n        {name:'Johanna', age:28, gender:'girl'},\n        {name:'Joy', age:15, gender:'girl'},\n        {name:'Mary', age:28, gender:'girl'},\n        {name:'Peter', age:95, gender:'boy'},\n        {name:'Sebastian', age:50, gender:'boy'},\n        {name:'Erika', age:27, gender:'girl'},\n        {name:'Patrick', age:40, gender:'boy'},\n        {name:'Samantha', age:60, gender:'girl'}\n      ]\">\n        I have {{friends.length}} friends. They are:\n        <input type=\"search\" ng-model=\"q\" placeholder=\"filter friends...\" />\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends | filter:q\">\n            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\n          </li>\n        </ul>\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .example-animate-container {\n        background:white;\n        border:1px solid black;\n        list-style:none;\n        margin:0;\n        padding:0 10px;\n      }\n\n      .animate-repeat {\n        line-height:40px;\n        list-style:none;\n        box-sizing:border-box;\n      }\n\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter,\n      .animate-repeat.ng-leave {\n        -webkit-transition:all linear 0.5s;\n        transition:all linear 0.5s;\n      }\n\n      .animate-repeat.ng-leave.ng-leave-active,\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter {\n        opacity:0;\n        max-height:0;\n      }\n\n      .animate-repeat.ng-leave,\n      .animate-repeat.ng-move.ng-move-active,\n      .animate-repeat.ng-enter.ng-enter-active {\n        opacity:1;\n        max-height:40px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var friends = element.all(by.repeater('friend in friends'));\n\n      it('should render initial data set', function() {\n        expect(friends.count()).toBe(10);\n        expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\n        expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\n        expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\n        expect(element(by.binding('friends.length')).getText())\n            .toMatch(\"I have 10 friends. They are:\");\n      });\n\n       it('should update repeater when filter predicate changes', function() {\n         expect(friends.count()).toBe(10);\n\n         element(by.model('q')).sendKeys('ma');\n\n         expect(friends.count()).toBe(2);\n         expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\n         expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\n       });\n      </file>\n    </example>\n */\nvar ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {\n  var NG_REMOVED = '$$NG_REMOVED';\n  var ngRepeatMinErr = minErr('ngRepeat');\n  return {\n    transclude: 'element',\n    priority: 1000,\n    terminal: true,\n    $$tlb: true,\n    link: function($scope, $element, $attr, ctrl, $transclude){\n        var expression = $attr.ngRepeat;\n        var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/),\n          trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn,\n          lhs, rhs, valueIdentifier, keyIdentifier,\n          hashFnLocals = {$id: hashKey};\n\n        if (!match) {\n          throw ngRepeatMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n            expression);\n        }\n\n        lhs = match[1];\n        rhs = match[2];\n        trackByExp = match[3];\n\n        if (trackByExp) {\n          trackByExpGetter = $parse(trackByExp);\n          trackByIdExpFn = function(key, value, index) {\n            // assign key, value, and $index to the locals so that they can be used in hash functions\n            if (keyIdentifier) hashFnLocals[keyIdentifier] = key;\n            hashFnLocals[valueIdentifier] = value;\n            hashFnLocals.$index = index;\n            return trackByExpGetter($scope, hashFnLocals);\n          };\n        } else {\n          trackByIdArrayFn = function(key, value) {\n            return hashKey(value);\n          };\n          trackByIdObjFn = function(key) {\n            return key;\n          };\n        }\n\n        match = lhs.match(/^(?:([\\$\\w]+)|\\(([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\))$/);\n        if (!match) {\n          throw ngRepeatMinErr('iidexp', \"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",\n                                                                    lhs);\n        }\n        valueIdentifier = match[3] || match[1];\n        keyIdentifier = match[2];\n\n        // Store a list of elements from previous run. This is a hash where key is the item from the\n        // iterator, and the value is objects with following properties.\n        //   - scope: bound scope\n        //   - element: previous element.\n        //   - index: position\n        var lastBlockMap = {};\n\n        //watch props\n        $scope.$watchCollection(rhs, function ngRepeatAction(collection){\n          var index, length,\n              previousNode = $element[0],     // current position of the node\n              nextNode,\n              // Same as lastBlockMap but it has the current state. It will become the\n              // lastBlockMap on the next iteration.\n              nextBlockMap = {},\n              arrayLength,\n              childScope,\n              key, value, // key/value of iteration\n              trackById,\n              trackByIdFn,\n              collectionKeys,\n              block,       // last object information {scope, element, id}\n              nextBlockOrder = [],\n              elementsToRemove;\n\n\n          if (isArrayLike(collection)) {\n            collectionKeys = collection;\n            trackByIdFn = trackByIdExpFn || trackByIdArrayFn;\n          } else {\n            trackByIdFn = trackByIdExpFn || trackByIdObjFn;\n            // if object, extract keys, sort them and use to determine order of iteration over obj props\n            collectionKeys = [];\n            for (key in collection) {\n              if (collection.hasOwnProperty(key) && key.charAt(0) != '$') {\n                collectionKeys.push(key);\n              }\n            }\n            collectionKeys.sort();\n          }\n\n          arrayLength = collectionKeys.length;\n\n          // locate existing items\n          length = nextBlockOrder.length = collectionKeys.length;\n          for(index = 0; index < length; index++) {\n           key = (collection === collectionKeys) ? index : collectionKeys[index];\n           value = collection[key];\n           trackById = trackByIdFn(key, value, index);\n           assertNotHasOwnProperty(trackById, '`track by` id');\n           if(lastBlockMap.hasOwnProperty(trackById)) {\n             block = lastBlockMap[trackById];\n             delete lastBlockMap[trackById];\n             nextBlockMap[trackById] = block;\n             nextBlockOrder[index] = block;\n           } else if (nextBlockMap.hasOwnProperty(trackById)) {\n             // restore lastBlockMap\n             forEach(nextBlockOrder, function(block) {\n               if (block && block.scope) lastBlockMap[block.id] = block;\n             });\n             // This is a duplicate and we need to throw an error\n             throw ngRepeatMinErr('dupes', \"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}\",\n                                                                                                                                                    expression,       trackById);\n           } else {\n             // new never before seen block\n             nextBlockOrder[index] = { id: trackById };\n             nextBlockMap[trackById] = false;\n           }\n         }\n\n          // remove existing items\n          for (key in lastBlockMap) {\n            // lastBlockMap is our own object so we don't need to use special hasOwnPropertyFn\n            if (lastBlockMap.hasOwnProperty(key)) {\n              block = lastBlockMap[key];\n              elementsToRemove = getBlockElements(block.clone);\n              $animate.leave(elementsToRemove);\n              forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; });\n              block.scope.$destroy();\n            }\n          }\n\n          // we are not using forEach for perf reasons (trying to avoid #call)\n          for (index = 0, length = collectionKeys.length; index < length; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            block = nextBlockOrder[index];\n            if (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]);\n\n            if (block.scope) {\n              // if we have already seen this object, then we need to reuse the\n              // associated scope/element\n              childScope = block.scope;\n\n              nextNode = previousNode;\n              do {\n                nextNode = nextNode.nextSibling;\n              } while(nextNode && nextNode[NG_REMOVED]);\n\n              if (getBlockStart(block) != nextNode) {\n                // existing item which got moved\n                $animate.move(getBlockElements(block.clone), null, jqLite(previousNode));\n              }\n              previousNode = getBlockEnd(block);\n            } else {\n              // new item which we don't know about\n              childScope = $scope.$new();\n            }\n\n            childScope[valueIdentifier] = value;\n            if (keyIdentifier) childScope[keyIdentifier] = key;\n            childScope.$index = index;\n            childScope.$first = (index === 0);\n            childScope.$last = (index === (arrayLength - 1));\n            childScope.$middle = !(childScope.$first || childScope.$last);\n            // jshint bitwise: false\n            childScope.$odd = !(childScope.$even = (index&1) === 0);\n            // jshint bitwise: true\n\n            if (!block.scope) {\n              $transclude(childScope, function(clone) {\n                clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');\n                $animate.enter(clone, null, jqLite(previousNode));\n                previousNode = clone;\n                block.scope = childScope;\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when it's template arrives.\n                block.clone = clone;\n                nextBlockMap[block.id] = block;\n              });\n            }\n          }\n          lastBlockMap = nextBlockMap;\n        });\n    }\n  };\n\n  function getBlockStart(block) {\n    return block.clone[0];\n  }\n\n  function getBlockEnd(block) {\n    return block.clone[block.clone.length - 1];\n  }\n}];\n\n/**\n * @ngdoc directive\n * @name ngShow\n *\n * @description\n * The `ngShow` directive shows or hides the given HTML element based on the expression\n * provided to the ngShow attribute. The element is shown or hidden by removing or adding\n * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is visible) -->\n * <div ng-show=\"myValue\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is hidden) -->\n * <div ng-show=\"myValue\" class=\"ng-hide\"></div>\n * ```\n *\n * When the ngShow expression evaluates to false then the ng-hide CSS class is added to the class attribute\n * on the element causing it to become hidden. When true, the ng-hide CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding .ng-hide\n *\n * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by\n * restating the styles for the .ng-hide class in CSS:\n * ```css\n * .ng-hide {\n *   /&#42; Not to worry, this will override the AngularJS default...\n *   display:block!important;\n *\n *   /&#42; this is just another form of hiding an element &#42;/\n *   position:absolute;\n *   top:-9999px;\n *   left:-9999px;\n * }\n * ```\n *\n * Just remember to include the important flag so the CSS override will function.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):<br />\n * \"f\" / \"0\" / \"false\" / \"no\" / \"n\" / \"[]\"\n * </div>\n *\n * ## A note about animations with ngShow\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass except that\n * you must also include the !important flag to override the display property\n * so that you can perform an animation when the element is hidden during the time of the animation.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   /&#42; this is required as of 1.3x to properly\n *      apply all styling in a show/hide animation &#42;/\n *   transition:0s linear all;\n *\n *   /&#42; this must be set as block so the animation is visible &#42;/\n *   display:block!important;\n * }\n *\n * .my-element.ng-hide-add-active,\n * .my-element.ng-hide-remove-active {\n *   /&#42; the transition is defined in the active class &#42;/\n *   transition:1s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * @animations\n * addClass: .ng-hide - happens after the ngShow expression evaluates to a truthy value and the just before contents are set to visible\n * removeClass: .ng-hide - happens after the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden\n *\n * @element ANY\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy\n *     then the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-show\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-show\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-show {\n        line-height:20px;\n        opacity:1;\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n\n      .animate-show.ng-hide-add,\n      .animate-show.ng-hide-remove {\n        display:block!important;\n      }\n\n      .animate-show.ng-hide-add.ng-hide-add-active,\n      .animate-show.ng-hide-remove.ng-hide-remove-active {\n        -webkit-transition:all linear 0.5s;\n        transition:all linear 0.5s;\n      }\n\n      .animate-show.ng-hide {\n        line-height:0;\n        opacity:0;\n        padding:0 10px;\n      }\n\n      .check-element {\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngShowDirective = ['$animate', function($animate) {\n  return function(scope, element, attr) {\n    scope.$watch(attr.ngShow, function ngShowWatchAction(value){\n      $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');\n    });\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngHide\n *\n * @description\n * The `ngHide` directive shows or hides the given HTML element based on the expression\n * provided to the ngHide attribute. The element is shown or hidden by removing or adding\n * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is hidden) -->\n * <div ng-hide=\"myValue\" class=\"ng-hide\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is visible) -->\n * <div ng-hide=\"myValue\"></div>\n * ```\n *\n * When the ngHide expression evaluates to true then the .ng-hide CSS class is added to the class attribute\n * on the element causing it to become hidden. When false, the ng-hide CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding .ng-hide\n *\n * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by\n * restating the styles for the .ng-hide class in CSS:\n * ```css\n * .ng-hide {\n *   //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...\n *   display:block!important;\n *\n *   //this is just another form of hiding an element\n *   position:absolute;\n *   top:-9999px;\n *   left:-9999px;\n * }\n * ```\n *\n * Just remember to include the important flag so the CSS override will function.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):<br />\n * \"f\" / \"0\" / \"false\" / \"no\" / \"n\" / \"[]\"\n * </div>\n *\n * ## A note about animations with ngHide\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass, except that\n * you must also include the !important flag to override the display property so\n * that you can perform an animation when the element is hidden during the time of the animation.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition:0.5s linear all;\n *   display:block!important;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * @animations\n * removeClass: .ng-hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden\n * addClass: .ng-hide - happens after the ngHide expression evaluates to a non truthy value and just before the contents are set to visible\n *\n * @element ANY\n * @param {expression} ngHide If the {@link guide/expression expression} is truthy then\n *     the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-hide\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-hide\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-hide {\n        -webkit-transition:all linear 0.5s;\n        transition:all linear 0.5s;\n        line-height:20px;\n        opacity:1;\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n\n      .animate-hide.ng-hide-add,\n      .animate-hide.ng-hide-remove {\n        display:block!important;\n      }\n\n      .animate-hide.ng-hide {\n        line-height:0;\n        opacity:0;\n        padding:0 10px;\n      }\n\n      .check-element {\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngHideDirective = ['$animate', function($animate) {\n  return function(scope, element, attr) {\n    scope.$watch(attr.ngHide, function ngHideWatchAction(value){\n      $animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'ng-hide');\n    });\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngStyle\n * @restrict AC\n *\n * @description\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\n *\n * @element ANY\n * @param {expression} ngStyle\n *\n * {@link guide/expression Expression} which evals to an\n * object whose keys are CSS style names and values are corresponding values for those CSS\n * keys.\n *\n * Since some CSS style names are not valid keys for an object, they must be quoted.\n * See the 'background-color' style in the example below.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <input type=\"button\" value=\"set color\" ng-click=\"myStyle={color:'red'}\">\n        <input type=\"button\" value=\"set background\" ng-click=\"myStyle={'background-color':'blue'}\">\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\n        <br/>\n        <span ng-style=\"myStyle\">Sample Text</span>\n        <pre>myStyle={{myStyle}}</pre>\n     </file>\n     <file name=\"style.css\">\n       span {\n         color: black;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var colorSpan = element(by.css('span'));\n\n       it('should check ng-style', function() {\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n         element(by.css('input[value=\\'set color\\']')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\n         element(by.css('input[value=clear]')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n       });\n     </file>\n   </example>\n */\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\n  scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\n    if (oldStyles && (newStyles !== oldStyles)) {\n      forEach(oldStyles, function(val, style) { element.css(style, '');});\n    }\n    if (newStyles) element.css(newStyles);\n  }, true);\n});\n\n/**\n * @ngdoc directive\n * @name ngSwitch\n * @restrict EA\n *\n * @description\n * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\n * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\n * as specified in the template.\n *\n * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\n * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\n * matches the value obtained from the evaluated expression. In other words, you define a container element\n * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\n * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\n * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\n * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\n * attribute is displayed.\n *\n * <div class=\"alert alert-info\">\n * Be aware that the attribute values to match against cannot be expressions. They are interpreted\n * as literal string values to match against.\n * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\n * value of the expression `$scope.someVal`.\n * </div>\n\n * @animations\n * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container\n * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM\n *\n * @usage\n *\n * ```\n * <ANY ng-switch=\"expression\">\n *   <ANY ng-switch-when=\"matchValue1\">...</ANY>\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\n *   <ANY ng-switch-default>...</ANY>\n * </ANY>\n * ```\n *\n *\n * @scope\n * @priority 800\n * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.\n * On child elements add:\n *\n * * `ngSwitchWhen`: the case statement to match against. If match then this\n *   case will be displayed. If the same match appears multiple times, all the\n *   elements will be displayed.\n * * `ngSwitchDefault`: the default case when no other case match. If there\n *   are multiple default cases, all of them will be displayed when no other\n *   case match.\n *\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-controller=\"Ctrl\">\n        <select ng-model=\"selection\" ng-options=\"item for item in items\">\n        </select>\n        <tt>selection={{selection}}</tt>\n        <hr/>\n        <div class=\"animate-switch-container\"\n          ng-switch on=\"selection\">\n            <div class=\"animate-switch\" ng-switch-when=\"settings\">Settings Div</div>\n            <div class=\"animate-switch\" ng-switch-when=\"home\">Home Span</div>\n            <div class=\"animate-switch\" ng-switch-default>default</div>\n        </div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      function Ctrl($scope) {\n        $scope.items = ['settings', 'home', 'other'];\n        $scope.selection = $scope.items[0];\n      }\n    </file>\n    <file name=\"animations.css\">\n      .animate-switch-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .animate-switch {\n        padding:10px;\n      }\n\n      .animate-switch.ng-animate {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n      }\n\n      .animate-switch.ng-leave.ng-leave-active,\n      .animate-switch.ng-enter {\n        top:-50px;\n      }\n      .animate-switch.ng-leave,\n      .animate-switch.ng-enter.ng-enter-active {\n        top:0;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var switchElem = element(by.css('[ng-switch]'));\n      var select = element(by.model('selection'));\n\n      it('should start in settings', function() {\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should change to home', function() {\n        select.element.all(by.css('option')).get(1).click();\n        expect(switchElem.getText()).toMatch(/Home Span/);\n      });\n      it('should select default', function() {\n        select.element.all(by.css('option')).get(2).click();\n        expect(switchElem.getText()).toMatch(/default/);\n      });\n    </file>\n  </example>\n */\nvar ngSwitchDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'EA',\n    require: 'ngSwitch',\n\n    // asks for $scope to fool the BC controller module\n    controller: ['$scope', function ngSwitchController() {\n     this.cases = {};\n    }],\n    link: function(scope, element, attr, ngSwitchController) {\n      var watchExpr = attr.ngSwitch || attr.on,\n          selectedTranscludes = [],\n          selectedElements = [],\n          previousElements = [],\n          selectedScopes = [];\n\n      scope.$watch(watchExpr, function ngSwitchWatchAction(value) {\n        var i, ii;\n        for (i = 0, ii = previousElements.length; i < ii; ++i) {\n          previousElements[i].remove();\n        }\n        previousElements.length = 0;\n\n        for (i = 0, ii = selectedScopes.length; i < ii; ++i) {\n          var selected = selectedElements[i];\n          selectedScopes[i].$destroy();\n          previousElements[i] = selected;\n          $animate.leave(selected, function() {\n            previousElements.splice(i, 1);\n          });\n        }\n\n        selectedElements.length = 0;\n        selectedScopes.length = 0;\n\n        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\n          scope.$eval(attr.change);\n          forEach(selectedTranscludes, function(selectedTransclude) {\n            var selectedScope = scope.$new();\n            selectedScopes.push(selectedScope);\n            selectedTransclude.transclude(selectedScope, function(caseElement) {\n              var anchor = selectedTransclude.element;\n\n              selectedElements.push(caseElement);\n              $animate.enter(caseElement, anchor.parent(), anchor);\n            });\n          });\n        }\n      });\n    }\n  };\n}];\n\nvar ngSwitchWhenDirective = ngDirective({\n  transclude: 'element',\n  priority: 800,\n  require: '^ngSwitch',\n  link: function(scope, element, attrs, ctrl, $transclude) {\n    ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);\n    ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });\n  }\n});\n\nvar ngSwitchDefaultDirective = ngDirective({\n  transclude: 'element',\n  priority: 800,\n  require: '^ngSwitch',\n  link: function(scope, element, attr, ctrl, $transclude) {\n    ctrl.cases['?'] = (ctrl.cases['?'] || []);\n    ctrl.cases['?'].push({ transclude: $transclude, element: element });\n   }\n});\n\n/**\n * @ngdoc directive\n * @name ngTransclude\n * @restrict AC\n *\n * @description\n * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\n *\n * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.\n *\n * @element ANY\n *\n * @example\n   <example module=\"transclude\">\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.title = 'Lorem Ipsum';\n           $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n         }\n\n         angular.module('transclude', [])\n          .directive('pane', function(){\n             return {\n               restrict: 'E',\n               transclude: true,\n               scope: { title:'@' },\n               template: '<div style=\"border: 1px solid black;\">' +\n                           '<div style=\"background-color: gray\">{{title}}</div>' +\n                           '<div ng-transclude></div>' +\n                         '</div>'\n             };\n         });\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <input ng-model=\"title\"><br>\n         <textarea ng-model=\"text\"></textarea> <br/>\n         <pane title=\"{{title}}\">{{text}}</pane>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        it('should have transcluded', function() {\n          var titleElement = element(by.model('title'));\n          titleElement.clear();\n          titleElement.sendKeys('TITLE');\n          var textElement = element(by.model('text'));\n          textElement.clear();\n          textElement.sendKeys('TEXT');\n          expect(element(by.binding('title')).getText()).toEqual('TITLE');\n          expect(element(by.binding('text')).getText()).toEqual('TEXT');\n        });\n     </file>\n   </example>\n *\n */\nvar ngTranscludeDirective = ngDirective({\n  link: function($scope, $element, $attrs, controller, $transclude) {\n    if (!$transclude) {\n      throw minErr('ngTransclude')('orphan',\n       'Illegal use of ngTransclude directive in the template! ' +\n       'No parent directive that requires a transclusion found. ' +\n       'Element: {0}',\n       startingTag($element));\n    }\n\n    $transclude(function(clone) {\n      $element.empty();\n      $element.append(clone);\n    });\n  }\n});\n\n/**\n * @ngdoc directive\n * @name script\n * @restrict E\n *\n * @description\n * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the\n * template can be used by {@link ng.directive:ngInclude `ngInclude`},\n * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the\n * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be\n * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.\n *\n * @param {string} type Must be set to `'text/ng-template'`.\n * @param {string} id Cache name of the template.\n *\n * @example\n  <example>\n    <file name=\"index.html\">\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\n        Content of the template.\n      </script>\n\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should load template defined inside script tag', function() {\n        element(by.css('#tpl-link')).click();\n        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\n      });\n    </file>\n  </example>\n */\nvar scriptDirective = ['$templateCache', function($templateCache) {\n  return {\n    restrict: 'E',\n    terminal: true,\n    compile: function(element, attr) {\n      if (attr.type == 'text/ng-template') {\n        var templateUrl = attr.id,\n            // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent\n            text = element[0].text;\n\n        $templateCache.put(templateUrl, text);\n      }\n    }\n  };\n}];\n\nvar ngOptionsMinErr = minErr('ngOptions');\n/**\n * @ngdoc directive\n * @name select\n * @restrict E\n *\n * @description\n * HTML `SELECT` element with angular data-binding.\n *\n * # `ngOptions`\n *\n * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`\n * elements for the `<select>` element using the array or object obtained by evaluating the\n * `ngOptions` comprehension_expression.\n *\n * When an item in the `<select>` menu is selected, the array element or object property\n * represented by the selected option will be bound to the model identified by the `ngModel`\n * directive.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** `ngModel` compares by reference, not value. This is important when binding to an\n * array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).\n * </div>\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** `ngOptions` provides an iterator facility for the `<option>` element which should be used instead\n * of {@link ng.directive:ngRepeat ngRepeat} when you want the\n * `select` model to be bound to a non-string value. This is because an option element can only\n * be bound to string values at present.\n * </div>\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required The control is considered valid only if value is entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {comprehension_expression=} ngOptions in one of the following forms:\n *\n *   * for array data sources:\n *     * `label` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\n *     * `label`  **`group by`** `group` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *   * for object data sources:\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`group by`** `group`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *\n * Where:\n *\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\n *   * `value`: local variable which will refer to each item in the `array` or each property value\n *      of `object` during iteration.\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\n *   * `label`: The result of this expression will be the label for `<option>` element. The\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\n *      element. If not specified, `select` expression will default to `value`.\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\n *      DOM element.\n *   * `trackexpr`: Used when working with an array of objects. The result of this expression will be\n *      used to identify the objects in the array. The `trackexpr` will most likely refer to the\n *     `value` variable (e.g. `value.propertyName`).\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <script>\n        function MyCntrl($scope) {\n          $scope.colors = [\n            {name:'black', shade:'dark'},\n            {name:'white', shade:'light'},\n            {name:'red', shade:'dark'},\n            {name:'blue', shade:'dark'},\n            {name:'yellow', shade:'light'}\n          ];\n          $scope.myColor = $scope.colors[2]; // red\n        }\n        </script>\n        <div ng-controller=\"MyCntrl\">\n          <ul>\n            <li ng-repeat=\"color in colors\">\n              Name: <input ng-model=\"color.name\">\n              [<a href ng-click=\"colors.splice($index, 1)\">X</a>]\n            </li>\n            <li>\n              [<a href ng-click=\"colors.push({})\">add</a>]\n            </li>\n          </ul>\n          <hr/>\n          Color (null not allowed):\n          <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\"></select><br>\n\n          Color (null allowed):\n          <span  class=\"nullable\">\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\">\n              <option value=\"\">-- choose color --</option>\n            </select>\n          </span><br/>\n\n          Color grouped by shade:\n          <select ng-model=\"myColor\" ng-options=\"color.name group by color.shade for color in colors\">\n          </select><br/>\n\n\n          Select <a href ng-click=\"myColor = { name:'not in list', shade: 'other' }\">bogus</a>.<br>\n          <hr/>\n          Currently selected: {{ {selected_color:myColor}  }}\n          <div style=\"border:solid 1px black; height:20px\"\n               ng-style=\"{'background-color':myColor.name}\">\n          </div>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n         it('should check ng-options', function() {\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\n           element.all(by.select('myColor')).first().click();\n           element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\n           element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\n           element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\n         });\n      </file>\n    </example>\n */\n\nvar ngOptionsDirective = valueFn({ terminal: true });\n// jshint maxlen: false\nvar selectDirective = ['$compile', '$parse', function($compile,   $parse) {\n                         //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888\n  var NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/,\n      nullModelCtrl = {$setViewValue: noop};\n// jshint maxlen: 100\n\n  return {\n    restrict: 'E',\n    require: ['select', '?ngModel'],\n    controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {\n      var self = this,\n          optionsMap = {},\n          ngModelCtrl = nullModelCtrl,\n          nullOption,\n          unknownOption;\n\n\n      self.databound = $attrs.ngModel;\n\n\n      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {\n        ngModelCtrl = ngModelCtrl_;\n        nullOption = nullOption_;\n        unknownOption = unknownOption_;\n      };\n\n\n      self.addOption = function(value) {\n        assertNotHasOwnProperty(value, '\"option value\"');\n        optionsMap[value] = true;\n\n        if (ngModelCtrl.$viewValue == value) {\n          $element.val(value);\n          if (unknownOption.parent()) unknownOption.remove();\n        }\n      };\n\n\n      self.removeOption = function(value) {\n        if (this.hasOption(value)) {\n          delete optionsMap[value];\n          if (ngModelCtrl.$viewValue == value) {\n            this.renderUnknownOption(value);\n          }\n        }\n      };\n\n\n      self.renderUnknownOption = function(val) {\n        var unknownVal = '? ' + hashKey(val) + ' ?';\n        unknownOption.val(unknownVal);\n        $element.prepend(unknownOption);\n        $element.val(unknownVal);\n        unknownOption.prop('selected', true); // needed for IE\n      };\n\n\n      self.hasOption = function(value) {\n        return optionsMap.hasOwnProperty(value);\n      };\n\n      $scope.$on('$destroy', function() {\n        // disable unknown option so that we don't do work when the whole select is being destroyed\n        self.renderUnknownOption = noop;\n      });\n    }],\n\n    link: function(scope, element, attr, ctrls) {\n      // if ngModel is not defined, we don't need to do anything\n      if (!ctrls[1]) return;\n\n      var selectCtrl = ctrls[0],\n          ngModelCtrl = ctrls[1],\n          multiple = attr.multiple,\n          optionsExp = attr.ngOptions,\n          nullOption = false, // if false, user will not be able to select it (used by ngOptions)\n          emptyOption,\n          // we can't just jqLite('<option>') since jqLite is not smart enough\n          // to create it in <select> and IE barfs otherwise.\n          optionTemplate = jqLite(document.createElement('option')),\n          optGroupTemplate =jqLite(document.createElement('optgroup')),\n          unknownOption = optionTemplate.clone();\n\n      // find \"null\" option\n      for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {\n        if (children[i].value === '') {\n          emptyOption = nullOption = children.eq(i);\n          break;\n        }\n      }\n\n      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);\n\n      // required validator\n      if (multiple) {\n        ngModelCtrl.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n      }\n\n      if (optionsExp) setupAsOptions(scope, element, ngModelCtrl);\n      else if (multiple) setupAsMultiple(scope, element, ngModelCtrl);\n      else setupAsSingle(scope, element, ngModelCtrl, selectCtrl);\n\n\n      ////////////////////////////\n\n\n\n      function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {\n        ngModelCtrl.$render = function() {\n          var viewValue = ngModelCtrl.$viewValue;\n\n          if (selectCtrl.hasOption(viewValue)) {\n            if (unknownOption.parent()) unknownOption.remove();\n            selectElement.val(viewValue);\n            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy\n          } else {\n            if (isUndefined(viewValue) && emptyOption) {\n              selectElement.val('');\n            } else {\n              selectCtrl.renderUnknownOption(viewValue);\n            }\n          }\n        };\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            if (unknownOption.parent()) unknownOption.remove();\n            ngModelCtrl.$setViewValue(selectElement.val());\n          });\n        });\n      }\n\n      function setupAsMultiple(scope, selectElement, ctrl) {\n        var lastView;\n        ctrl.$render = function() {\n          var items = new HashMap(ctrl.$viewValue);\n          forEach(selectElement.find('option'), function(option) {\n            option.selected = isDefined(items.get(option.value));\n          });\n        };\n\n        // we have to do it on each watch since ngModel watches reference, but\n        // we need to work of an array, so we need to see if anything was inserted/removed\n        scope.$watch(function selectMultipleWatch() {\n          if (!equals(lastView, ctrl.$viewValue)) {\n            lastView = copy(ctrl.$viewValue);\n            ctrl.$render();\n          }\n        });\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            var array = [];\n            forEach(selectElement.find('option'), function(option) {\n              if (option.selected) {\n                array.push(option.value);\n              }\n            });\n            ctrl.$setViewValue(array);\n          });\n        });\n      }\n\n      function setupAsOptions(scope, selectElement, ctrl) {\n        var match;\n\n        if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) {\n          throw ngOptionsMinErr('iexp',\n            \"Expected expression in form of \" +\n            \"'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\" +\n            \" but got '{0}'. Element: {1}\",\n            optionsExp, startingTag(selectElement));\n        }\n\n        var displayFn = $parse(match[2] || match[1]),\n            valueName = match[4] || match[6],\n            keyName = match[5],\n            groupByFn = $parse(match[3] || ''),\n            valueFn = $parse(match[2] ? match[1] : valueName),\n            valuesFn = $parse(match[7]),\n            track = match[8],\n            trackFn = track ? $parse(match[8]) : null,\n            // This is an array of array of existing option groups in DOM.\n            // We try to reuse these if possible\n            // - optionGroupsCache[0] is the options with no option group\n            // - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element\n            optionGroupsCache = [[{element: selectElement, label:''}]];\n\n        if (nullOption) {\n          // compile the element since there might be bindings in it\n          $compile(nullOption)(scope);\n\n          // remove the class, which is added automatically because we recompile the element and it\n          // becomes the compilation root\n          nullOption.removeClass('ng-scope');\n\n          // we need to remove it before calling selectElement.empty() because otherwise IE will\n          // remove the label from the element. wtf?\n          nullOption.remove();\n        }\n\n        // clear contents, we'll add what's needed based on the model\n        selectElement.empty();\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            var optionGroup,\n                collection = valuesFn(scope) || [],\n                locals = {},\n                key, value, optionElement, index, groupIndex, length, groupLength, trackIndex;\n\n            if (multiple) {\n              value = [];\n              for (groupIndex = 0, groupLength = optionGroupsCache.length;\n                   groupIndex < groupLength;\n                   groupIndex++) {\n                // list of options for that group. (first item has the parent)\n                optionGroup = optionGroupsCache[groupIndex];\n\n                for(index = 1, length = optionGroup.length; index < length; index++) {\n                  if ((optionElement = optionGroup[index].element)[0].selected) {\n                    key = optionElement.val();\n                    if (keyName) locals[keyName] = key;\n                    if (trackFn) {\n                      for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {\n                        locals[valueName] = collection[trackIndex];\n                        if (trackFn(scope, locals) == key) break;\n                      }\n                    } else {\n                      locals[valueName] = collection[key];\n                    }\n                    value.push(valueFn(scope, locals));\n                  }\n                }\n              }\n            } else {\n              key = selectElement.val();\n              if (key == '?') {\n                value = undefined;\n              } else if (key === ''){\n                value = null;\n              } else {\n                if (trackFn) {\n                  for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {\n                    locals[valueName] = collection[trackIndex];\n                    if (trackFn(scope, locals) == key) {\n                      value = valueFn(scope, locals);\n                      break;\n                    }\n                  }\n                } else {\n                  locals[valueName] = collection[key];\n                  if (keyName) locals[keyName] = key;\n                  value = valueFn(scope, locals);\n                }\n              }\n              // Update the null option's selected property here so $render cleans it up correctly\n              if (optionGroupsCache[0].length > 1) {\n                if (optionGroupsCache[0][1].id !== key) {\n                  optionGroupsCache[0][1].selected = false;\n                }\n              }\n            }\n            ctrl.$setViewValue(value);\n          });\n        });\n\n        ctrl.$render = render;\n\n        // TODO(vojta): can't we optimize this ?\n        scope.$watch(render);\n\n        function render() {\n              // Temporary location for the option groups before we render them\n          var optionGroups = {'':[]},\n              optionGroupNames = [''],\n              optionGroupName,\n              optionGroup,\n              option,\n              existingParent, existingOptions, existingOption,\n              modelValue = ctrl.$modelValue,\n              values = valuesFn(scope) || [],\n              keys = keyName ? sortedKeys(values) : values,\n              key,\n              groupLength, length,\n              groupIndex, index,\n              locals = {},\n              selected,\n              selectedSet = false, // nothing is selected yet\n              lastElement,\n              element,\n              label;\n\n          if (multiple) {\n            if (trackFn && isArray(modelValue)) {\n              selectedSet = new HashMap([]);\n              for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {\n                locals[valueName] = modelValue[trackIndex];\n                selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);\n              }\n            } else {\n              selectedSet = new HashMap(modelValue);\n            }\n          }\n\n          // We now build up the list of options we need (we merge later)\n          for (index = 0; length = keys.length, index < length; index++) {\n\n            key = index;\n            if (keyName) {\n              key = keys[index];\n              if ( key.charAt(0) === '$' ) continue;\n              locals[keyName] = key;\n            }\n\n            locals[valueName] = values[key];\n\n            optionGroupName = groupByFn(scope, locals) || '';\n            if (!(optionGroup = optionGroups[optionGroupName])) {\n              optionGroup = optionGroups[optionGroupName] = [];\n              optionGroupNames.push(optionGroupName);\n            }\n            if (multiple) {\n              selected = isDefined(\n                selectedSet.remove(trackFn ? trackFn(scope, locals) : valueFn(scope, locals))\n              );\n            } else {\n              if (trackFn) {\n                var modelCast = {};\n                modelCast[valueName] = modelValue;\n                selected = trackFn(scope, modelCast) === trackFn(scope, locals);\n              } else {\n                selected = modelValue === valueFn(scope, locals);\n              }\n              selectedSet = selectedSet || selected; // see if at least one item is selected\n            }\n            label = displayFn(scope, locals); // what will be seen by the user\n\n            // doing displayFn(scope, locals) || '' overwrites zero values\n            label = isDefined(label) ? label : '';\n            optionGroup.push({\n              // either the index into array or key from object\n              id: trackFn ? trackFn(scope, locals) : (keyName ? keys[index] : index),\n              label: label,\n              selected: selected                   // determine if we should be selected\n            });\n          }\n          if (!multiple) {\n            if (nullOption || modelValue === null) {\n              // insert null option if we have a placeholder, or the model is null\n              optionGroups[''].unshift({id:'', label:'', selected:!selectedSet});\n            } else if (!selectedSet) {\n              // option could not be found, we have to insert the undefined item\n              optionGroups[''].unshift({id:'?', label:'', selected:true});\n            }\n          }\n\n          // Now we need to update the list of DOM nodes to match the optionGroups we computed above\n          for (groupIndex = 0, groupLength = optionGroupNames.length;\n               groupIndex < groupLength;\n               groupIndex++) {\n            // current option group name or '' if no group\n            optionGroupName = optionGroupNames[groupIndex];\n\n            // list of options for that group. (first item has the parent)\n            optionGroup = optionGroups[optionGroupName];\n\n            if (optionGroupsCache.length <= groupIndex) {\n              // we need to grow the optionGroups\n              existingParent = {\n                element: optGroupTemplate.clone().attr('label', optionGroupName),\n                label: optionGroup.label\n              };\n              existingOptions = [existingParent];\n              optionGroupsCache.push(existingOptions);\n              selectElement.append(existingParent.element);\n            } else {\n              existingOptions = optionGroupsCache[groupIndex];\n              existingParent = existingOptions[0];  // either SELECT (no group) or OPTGROUP element\n\n              // update the OPTGROUP label if not the same.\n              if (existingParent.label != optionGroupName) {\n                existingParent.element.attr('label', existingParent.label = optionGroupName);\n              }\n            }\n\n            lastElement = null;  // start at the beginning\n            for(index = 0, length = optionGroup.length; index < length; index++) {\n              option = optionGroup[index];\n              if ((existingOption = existingOptions[index+1])) {\n                // reuse elements\n                lastElement = existingOption.element;\n                if (existingOption.label !== option.label) {\n                  lastElement.text(existingOption.label = option.label);\n                }\n                if (existingOption.id !== option.id) {\n                  lastElement.val(existingOption.id = option.id);\n                }\n                // lastElement.prop('selected') provided by jQuery has side-effects\n                if (existingOption.selected !== option.selected) {\n                  lastElement.prop('selected', (existingOption.selected = option.selected));\n                }\n              } else {\n                // grow elements\n\n                // if it's a null option\n                if (option.id === '' && nullOption) {\n                  // put back the pre-compiled element\n                  element = nullOption;\n                } else {\n                  // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but\n                  // in this version of jQuery on some browser the .text() returns a string\n                  // rather then the element.\n                  (element = optionTemplate.clone())\n                      .val(option.id)\n                      .attr('selected', option.selected)\n                      .text(option.label);\n                }\n\n                existingOptions.push(existingOption = {\n                    element: element,\n                    label: option.label,\n                    id: option.id,\n                    selected: option.selected\n                });\n                if (lastElement) {\n                  lastElement.after(element);\n                } else {\n                  existingParent.element.append(element);\n                }\n                lastElement = element;\n              }\n            }\n            // remove any excessive OPTIONs in a group\n            index++; // increment since the existingOptions[0] is parent element not OPTION\n            while(existingOptions.length > index) {\n              existingOptions.pop().element.remove();\n            }\n          }\n          // remove any excessive OPTGROUPs from select\n          while(optionGroupsCache.length > groupIndex) {\n            optionGroupsCache.pop()[0].element.remove();\n          }\n        }\n      }\n    }\n  };\n}];\n\nvar optionDirective = ['$interpolate', function($interpolate) {\n  var nullSelectCtrl = {\n    addOption: noop,\n    removeOption: noop\n  };\n\n  return {\n    restrict: 'E',\n    priority: 100,\n    compile: function(element, attr) {\n      if (isUndefined(attr.value)) {\n        var interpolateFn = $interpolate(element.text(), true);\n        if (!interpolateFn) {\n          attr.$set('value', element.text());\n        }\n      }\n\n      return function (scope, element, attr) {\n        var selectCtrlName = '$selectController',\n            parent = element.parent(),\n            selectCtrl = parent.data(selectCtrlName) ||\n              parent.parent().data(selectCtrlName); // in case we are in optgroup\n\n        if (selectCtrl && selectCtrl.databound) {\n          // For some reason Opera defaults to true and if not overridden this messes up the repeater.\n          // We don't want the view to drive the initialization of the model anyway.\n          element.prop('selected', false);\n        } else {\n          selectCtrl = nullSelectCtrl;\n        }\n\n        if (interpolateFn) {\n          scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {\n            attr.$set('value', newVal);\n            if (oldVal !== newVal) {\n              selectCtrl.removeOption(oldVal);\n            }\n            selectCtrl.addOption(newVal);\n          });\n        } else {\n          selectCtrl.addOption(attr.value);\n        }\n\n        element.on('$destroy', function() {\n          selectCtrl.removeOption(attr.value);\n        });\n      };\n    }\n  };\n}];\n\nvar styleDirective = valueFn({\n  restrict: 'E',\n  terminal: false\n});\n\n  if (window.angular.bootstrap) {\n    //AngularJS is already loaded, so we can return here...\n    console.log('WARNING: Tried to load angular more than once.');\n    return;\n  }\n\n  //try to bind to jquery now so that one can write angular.element().read()\n  //but we will rebind on bootstrap again.\n  bindJQuery();\n\n  publishExternalAPI(angular);\n\n  jqLite(document).ready(function() {\n    angularInit(document, bootstrap);\n  });\n\n})(window, document);\n\n!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\\\:form{display:block;}</style>');"
  },
  {
    "path": "demo/my-show-4-angularjs/js/angular-animate.js",
    "content": "/**\n * @license AngularJS v1.3.0-beta.14\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/* jshint maxlen: false */\n\n/**\n * @ngdoc module\n * @name ngAnimate\n * @description\n *\n * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives.\n *\n * <div doc-module-components=\"ngAnimate\"></div>\n *\n * # Usage\n *\n * To see animations in action, all that is required is to define the appropriate CSS classes\n * or to register a JavaScript animation via the myModule.animation() function. The directives that support animation automatically are:\n * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation\n * by using the `$animate` service.\n *\n * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives:\n *\n * | Directive                                                                                                 | Supported Animations                                                     |\n * |-----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|\n * | {@link ng.directive:ngRepeat#usage_animations ngRepeat}                                                   | enter, leave and move                                                    |\n * | {@link ngRoute.directive:ngView#usage_animations ngView}                                                  | enter and leave                                                          |\n * | {@link ng.directive:ngInclude#usage_animations ngInclude}                                                 | enter and leave                                                          |\n * | {@link ng.directive:ngSwitch#usage_animations ngSwitch}                                                   | enter and leave                                                          |\n * | {@link ng.directive:ngIf#usage_animations ngIf}                                                           | enter and leave                                                          |\n * | {@link ng.directive:ngClass#usage_animations ngClass}                                                     | add and remove (the CSS class(es) present)                               |\n * | {@link ng.directive:ngShow#usage_animations ngShow} & {@link ng.directive:ngHide#usage_animations ngHide} | add and remove (the ng-hide class value)                                 |\n * | {@link ng.directive:form#usage_animations form} & {@link ng.directive:ngModel#usage_animations ngModel}   | add and remove (dirty, pristine, valid, invalid & all other validations) |\n * | {@link ngMessages.directive:ngMessage#usage_animations ngMessages}                                        | add and remove (ng-active & ng-inactive)                                 |\n * | {@link ngMessages.directive:ngMessage#usage_animations ngMessage}                                         | enter and leave                                                          |\n *\n * You can find out more information about animations upon visiting each directive page.\n *\n * Below is an example of how to apply animations to a directive that supports animation hooks:\n *\n * ```html\n * <style type=\"text/css\">\n * .slide.ng-enter, .slide.ng-leave {\n *   -webkit-transition:0.5s linear all;\n *   transition:0.5s linear all;\n * }\n *\n * .slide.ng-enter { }        /&#42; starting animations for enter &#42;/\n * .slide.ng-enter-active { } /&#42; terminal animations for enter &#42;/\n * .slide.ng-leave { }        /&#42; starting animations for leave &#42;/\n * .slide.ng-leave-active { } /&#42; terminal animations for leave &#42;/\n * </style>\n *\n * <!--\n * the animate service will automatically add .ng-enter and .ng-leave to the element\n * to trigger the CSS transition/animations\n * -->\n * <ANY class=\"slide\" ng-include=\"...\"></ANY>\n * ```\n *\n * Keep in mind that if an animation is running, any child elements cannot be animated until the parent element's\n * animation has completed.\n *\n * <h2>CSS-defined Animations</h2>\n * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes\n * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported\n * and can be used to play along with this naming structure.\n *\n * The following code below demonstrates how to perform animations using **CSS transitions** with Angular:\n *\n * ```html\n * <style type=\"text/css\">\n * /&#42;\n *  The animate class is apart of the element and the ng-enter class\n *  is attached to the element once the enter animation event is triggered\n * &#42;/\n * .reveal-animation.ng-enter {\n *  -webkit-transition: 1s linear all; /&#42; Safari/Chrome &#42;/\n *  transition: 1s linear all; /&#42; All other modern browsers and IE10+ &#42;/\n *\n *  /&#42; The animation preparation code &#42;/\n *  opacity: 0;\n * }\n *\n * /&#42;\n *  Keep in mind that you want to combine both CSS\n *  classes together to avoid any CSS-specificity\n *  conflicts\n * &#42;/\n * .reveal-animation.ng-enter.ng-enter-active {\n *  /&#42; The animation code itself &#42;/\n *  opacity: 1;\n * }\n * </style>\n *\n * <div class=\"view-container\">\n *   <div ng-view class=\"reveal-animation\"></div>\n * </div>\n * ```\n *\n * The following code below demonstrates how to perform animations using **CSS animations** with Angular:\n *\n * ```html\n * <style type=\"text/css\">\n * .reveal-animation.ng-enter {\n *   -webkit-animation: enter_sequence 1s linear; /&#42; Safari/Chrome &#42;/\n *   animation: enter_sequence 1s linear; /&#42; IE10+ and Future Browsers &#42;/\n * }\n * @-webkit-keyframes enter_sequence {\n *   from { opacity:0; }\n *   to { opacity:1; }\n * }\n * @keyframes enter_sequence {\n *   from { opacity:0; }\n *   to { opacity:1; }\n * }\n * </style>\n *\n * <div class=\"view-container\">\n *   <div ng-view class=\"reveal-animation\"></div>\n * </div>\n * ```\n *\n * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing.\n *\n * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add\n * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically\n * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be\n * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end\n * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element\n * has no CSS transition/animation classes applied to it.\n *\n * ### Structural transition animations\n *\n * Structural transitions (such as enter, leave and move) will always apply a `0s none` transition\n * value to force the browser into rendering the styles defined in the setup (.ng-enter, .ng-leave\n * or .ng-move) class. This means that any active transition animations operating on the element\n * will be cut off to make way for the enter, leave or move animation.\n *\n * ### Class-based transition animations\n *\n * Class-based transitions refer to transition animations that are triggered when a CSS class is\n * added to or removed from the element (via `$animate.addClass`, `$animate.removeClass`,\n * `$animate.setClass`, or by directives such as `ngClass`, `ngModel` and `form`).\n * They are different when compared to structural animations since they **do not cancel existing\n * animations** nor do they **block successive transitions** from rendering on the same element.\n * This distinction allows for **multiple class-based transitions** to be performed on the same element.\n *\n * In addition to ngAnimate supporting the default (natural) functionality of class-based transition\n * animations, ngAnimate also decorates the element with starting and ending CSS classes to aid the\n * developer in further styling the element throughout the transition animation. Earlier versions\n * of ngAnimate may have caused natural CSS transitions to break and not render properly due to\n * $animate temporarily blocking transitions using `0s none` in order to allow the setup CSS class\n * (the `-add` or `-remove` class) to be applied without triggering an animation. However, as of\n * **version 1.3**, this workaround has been removed with ngAnimate and all non-ngAnimate CSS\n * class transitions are compatible with ngAnimate.\n *\n * There is, however, one special case when dealing with class-based transitions in ngAnimate.\n * When rendering class-based transitions that make use of the setup and active CSS classes\n * (e.g. `.fade-add` and `.fade-add-active` for when `.fade` is added) be sure to define\n * the transition value **on the active CSS class** and not the setup class.\n *\n * ```css\n * .fade-add {\n *   /&#42; remember to place a 0s transition here\n *      to ensure that the styles are applied instantly\n *      even if the element already has a transition style &#42;/\n *   transition:0s linear all;\n *\n *   /&#42; starting CSS styles &#42;/\n *   opacity:1;\n * }\n * .fade-add.fade-add-active {\n *   /&#42; this will be the length of the animation &#42;/\n *   transition:1s linear all;\n *   opacity:0;\n * }\n * ```\n *\n * The setup CSS class (in this case `.fade-add`) also has a transition style property, however, it\n * has a duration of zero. This may not be required, however, incase the browser is unable to render\n * the styling present in this CSS class instantly then it could be that the browser is attempting\n * to perform an unnecessary transition.\n *\n * This workaround, however, does not apply to  standard class-based transitions that are rendered\n * when a CSS class containing a transition is applied to an element:\n *\n * ```css\n * .fade {\n *   /&#42; this works as expected &#42;/\n *   transition:1s linear all;\n *   opacity:0;\n * }\n * ```\n *\n * Please keep this in mind when coding the CSS markup that will be used within class-based transitions.\n * Also, try not to mix the two class-based animation flavors together since the CSS code may become\n * overly complex.\n *\n * ### CSS Staggering Animations\n * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a\n * curtain-like effect. The ngAnimate module, as of 1.2.0, supports staggering animations and the stagger effect can be\n * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for\n * the animation. The style property expected within the stagger class can either be a **transition-delay** or an\n * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).\n *\n * ```css\n * .my-animation.ng-enter {\n *   /&#42; standard transition code &#42;/\n *   -webkit-transition: 1s linear all;\n *   transition: 1s linear all;\n *   opacity:0;\n * }\n * .my-animation.ng-enter-stagger {\n *   /&#42; this will have a 100ms delay between each successive leave animation &#42;/\n *   -webkit-transition-delay: 0.1s;\n *   transition-delay: 0.1s;\n *\n *   /&#42; in case the stagger doesn't work then these two values\n *    must be set to 0 to avoid an accidental CSS inheritance &#42;/\n *   -webkit-transition-duration: 0s;\n *   transition-duration: 0s;\n * }\n * .my-animation.ng-enter.ng-enter-active {\n *   /&#42; standard transition styles &#42;/\n *   opacity:1;\n * }\n * ```\n *\n * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations\n * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this\n * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation\n * will also be reset if more than 10ms has passed after the last animation has been fired.\n *\n * The following code will issue the **ng-leave-stagger** event on the element provided:\n *\n * ```js\n * var kids = parent.children();\n *\n * $animate.leave(kids[0]); //stagger index=0\n * $animate.leave(kids[1]); //stagger index=1\n * $animate.leave(kids[2]); //stagger index=2\n * $animate.leave(kids[3]); //stagger index=3\n * $animate.leave(kids[4]); //stagger index=4\n *\n * $timeout(function() {\n *   //stagger has reset itself\n *   $animate.leave(kids[5]); //stagger index=0\n *   $animate.leave(kids[6]); //stagger index=1\n * }, 100, false);\n * ```\n *\n * Stagger animations are currently only supported within CSS-defined animations.\n *\n * <h2>JavaScript-defined Animations</h2>\n * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not\n * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module.\n *\n * ```js\n * //!annotate=\"YourApp\" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application.\n * var ngModule = angular.module('YourApp', ['ngAnimate']);\n * ngModule.animation('.my-crazy-animation', function() {\n *   return {\n *     enter: function(element, done) {\n *       //run the animation here and call done when the animation is complete\n *       return function(cancelled) {\n *         //this (optional) function will be called when the animation\n *         //completes or when the animation is cancelled (the cancelled\n *         //flag will be set to true if cancelled).\n *       };\n *     },\n *     leave: function(element, done) { },\n *     move: function(element, done) { },\n *\n *     //animation that can be triggered before the class is added\n *     beforeAddClass: function(element, className, done) { },\n *\n *     //animation that can be triggered after the class is added\n *     addClass: function(element, className, done) { },\n *\n *     //animation that can be triggered before the class is removed\n *     beforeRemoveClass: function(element, className, done) { },\n *\n *     //animation that can be triggered after the class is removed\n *     removeClass: function(element, className, done) { }\n *   };\n * });\n * ```\n *\n * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run\n * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits\n * the element's CSS class attribute value and then run the matching animation event function (if found).\n * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will\n * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported).\n *\n * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned.\n * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run,\n * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation\n * or transition code that is defined via a stylesheet).\n *\n */\n\nangular.module('ngAnimate', ['ng'])\n\n  /**\n   * @ngdoc provider\n   * @name $animateProvider\n   * @description\n   *\n   * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module.\n   * When an animation is triggered, the $animate service will query the $animate service to find any animations that match\n   * the provided name value.\n   *\n   * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\n   *\n   * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\n   *\n   */\n\n  //this private service is only used within CSS-enabled animations\n  //IE8 + IE9 do not support rAF natively, but that is fine since they\n  //also don't support transitions and keyframes which means that the code\n  //below will never be used by the two browsers.\n  .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) {\n    var bod = $document[0].body;\n    return function(fn) {\n      //the returned function acts as the cancellation function\n      return $$rAF(function() {\n        //the line below will force the browser to perform a repaint\n        //so that all the animated elements within the animation frame\n        //will be properly updated and drawn on screen. This is\n        //required to perform multi-class CSS based animations with\n        //Firefox. DO NOT REMOVE THIS LINE.\n        var a = bod.offsetWidth + 1;\n        fn();\n      });\n    };\n  }])\n\n  .config(['$provide', '$animateProvider', function($provide, $animateProvider) {\n    var noop = angular.noop;\n    var forEach = angular.forEach;\n    var selectors = $animateProvider.$$selectors;\n\n    var ELEMENT_NODE = 1;\n    var NG_ANIMATE_STATE = '$$ngAnimateState';\n    var NG_ANIMATE_CLASS_NAME = 'ng-animate';\n    var rootAnimateState = {running: true};\n\n    function extractElementNode(element) {\n      for(var i = 0; i < element.length; i++) {\n        var elm = element[i];\n        if(elm.nodeType == ELEMENT_NODE) {\n          return elm;\n        }\n      }\n    }\n\n    function prepareElement(element) {\n      return element && angular.element(element);\n    }\n\n    function stripCommentsFromElement(element) {\n      return angular.element(extractElementNode(element));\n    }\n\n    function isMatchingElement(elm1, elm2) {\n      return extractElementNode(elm1) == extractElementNode(elm2);\n    }\n\n    $provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document',\n                            function($delegate,   $injector,   $sniffer,   $rootElement,   $$asyncCallback,    $rootScope,   $document) {\n\n      var globalAnimationCounter = 0;\n      $rootElement.data(NG_ANIMATE_STATE, rootAnimateState);\n\n      // disable animations during bootstrap, but once we bootstrapped, wait again\n      // for another digest until enabling animations. The reason why we digest twice\n      // is because all structural animations (enter, leave and move) all perform a\n      // post digest operation before animating. If we only wait for a single digest\n      // to pass then the structural animation would render its animation on page load.\n      // (which is what we're trying to avoid when the application first boots up.)\n      $rootScope.$$postDigest(function() {\n        $rootScope.$$postDigest(function() {\n          rootAnimateState.running = false;\n        });\n      });\n\n      var classNameFilter = $animateProvider.classNameFilter();\n      var isAnimatableClassName = !classNameFilter\n              ? function() { return true; }\n              : function(className) {\n                return classNameFilter.test(className);\n              };\n\n      function lookup(name) {\n        if (name) {\n          var matches = [],\n              flagMap = {},\n              classes = name.substr(1).split('.');\n\n          //the empty string value is the default animation\n          //operation which performs CSS transition and keyframe\n          //animations sniffing. This is always included for each\n          //element animation procedure if the browser supports\n          //transitions and/or keyframe animations. The default\n          //animation is added to the top of the list to prevent\n          //any previous animations from affecting the element styling\n          //prior to the element being animated.\n          if ($sniffer.transitions || $sniffer.animations) {\n            matches.push($injector.get(selectors['']));\n          }\n\n          for(var i=0; i < classes.length; i++) {\n            var klass = classes[i],\n                selectorFactoryName = selectors[klass];\n            if(selectorFactoryName && !flagMap[klass]) {\n              matches.push($injector.get(selectorFactoryName));\n              flagMap[klass] = true;\n            }\n          }\n          return matches;\n        }\n      }\n\n      function animationRunner(element, animationEvent, className) {\n        //transcluded directives may sometimes fire an animation using only comment nodes\n        //best to catch this early on to prevent any animation operations from occurring\n        var node = element[0];\n        if(!node) {\n          return;\n        }\n\n        var isSetClassOperation = animationEvent == 'setClass';\n        var isClassBased = isSetClassOperation ||\n                           animationEvent == 'addClass' ||\n                           animationEvent == 'removeClass';\n\n        var classNameAdd, classNameRemove;\n        if(angular.isArray(className)) {\n          classNameAdd = className[0];\n          classNameRemove = className[1];\n          className = classNameAdd + ' ' + classNameRemove;\n        }\n\n        var currentClassName = element.attr('class');\n        var classes = currentClassName + ' ' + className;\n        if(!isAnimatableClassName(classes)) {\n          return;\n        }\n\n        var beforeComplete = noop,\n            beforeCancel = [],\n            before = [],\n            afterComplete = noop,\n            afterCancel = [],\n            after = [];\n\n        var animationLookup = (' ' + classes).replace(/\\s+/g,'.');\n        forEach(lookup(animationLookup), function(animationFactory) {\n          var created = registerAnimation(animationFactory, animationEvent);\n          if(!created && isSetClassOperation) {\n            registerAnimation(animationFactory, 'addClass');\n            registerAnimation(animationFactory, 'removeClass');\n          }\n        });\n\n        function registerAnimation(animationFactory, event) {\n          var afterFn = animationFactory[event];\n          var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)];\n          if(afterFn || beforeFn) {\n            if(event == 'leave') {\n              beforeFn = afterFn;\n              //when set as null then animation knows to skip this phase\n              afterFn = null;\n            }\n            after.push({\n              event : event, fn : afterFn\n            });\n            before.push({\n              event : event, fn : beforeFn\n            });\n            return true;\n          }\n        }\n\n        function run(fns, cancellations, allCompleteFn) {\n          var animations = [];\n          forEach(fns, function(animation) {\n            animation.fn && animations.push(animation);\n          });\n\n          var count = 0;\n          function afterAnimationComplete(index) {\n            if(cancellations) {\n              (cancellations[index] || noop)();\n              if(++count < animations.length) return;\n              cancellations = null;\n            }\n            allCompleteFn();\n          }\n\n          //The code below adds directly to the array in order to work with\n          //both sync and async animations. Sync animations are when the done()\n          //operation is called right away. DO NOT REFACTOR!\n          forEach(animations, function(animation, index) {\n            var progress = function() {\n              afterAnimationComplete(index);\n            };\n            switch(animation.event) {\n              case 'setClass':\n                cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress));\n                break;\n              case 'addClass':\n                cancellations.push(animation.fn(element, classNameAdd || className,     progress));\n                break;\n              case 'removeClass':\n                cancellations.push(animation.fn(element, classNameRemove || className,  progress));\n                break;\n              default:\n                cancellations.push(animation.fn(element, progress));\n                break;\n            }\n          });\n\n          if(cancellations && cancellations.length === 0) {\n            allCompleteFn();\n          }\n        }\n\n        return {\n          node : node,\n          event : animationEvent,\n          className : className,\n          isClassBased : isClassBased,\n          isSetClassOperation : isSetClassOperation,\n          before : function(allCompleteFn) {\n            beforeComplete = allCompleteFn;\n            run(before, beforeCancel, function() {\n              beforeComplete = noop;\n              allCompleteFn();\n            });\n          },\n          after : function(allCompleteFn) {\n            afterComplete = allCompleteFn;\n            run(after, afterCancel, function() {\n              afterComplete = noop;\n              allCompleteFn();\n            });\n          },\n          cancel : function() {\n            if(beforeCancel) {\n              forEach(beforeCancel, function(cancelFn) {\n                (cancelFn || noop)(true);\n              });\n              beforeComplete(true);\n            }\n            if(afterCancel) {\n              forEach(afterCancel, function(cancelFn) {\n                (cancelFn || noop)(true);\n              });\n              afterComplete(true);\n            }\n          }\n        };\n      }\n\n      /**\n       * @ngdoc service\n       * @name $animate\n       * @kind function\n       *\n       * @description\n       * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations.\n       * When any of these operations are run, the $animate service\n       * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object)\n       * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run.\n       *\n       * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives\n       * will work out of the box without any extra configuration.\n       *\n       * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\n       *\n       * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\n       *\n       */\n      return {\n        /**\n         * @ngdoc method\n         * @name $animate#enter\n         * @kind function\n         *\n         * @description\n         * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once\n         * the animation is started, the following CSS classes will be present on the element for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during enter animation:\n         *\n         * | Animation Step                                                                                                    | What the element class attribute looks like              |\n         * |-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|\n         * | 1. $animate.enter(...) is called                                                                                  | class=\"my-animation\"                                     |\n         * | 2. element is inserted into the parentElement element or beside the afterElement element                          | class=\"my-animation\"                                     |\n         * | 3. $animate waits for the next digest to start the animation                                                      | class=\"my-animation ng-animate\"                          |\n         * | 4. $animate runs the JavaScript-defined animations detected on the element                                        | class=\"my-animation ng-animate\"                          |\n         * | 5. the .ng-enter class is added to the element                                                                    | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                       | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 7. $animate blocks all CSS transitions on the element to ensure the .ng-enter class styling is applied right away | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 8. $animate waits for a single animation frame (this performs a reflow)                                           | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 9. $animate removes the CSS transition block placed on the element                                                | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 10. the .ng-enter-active class is added (this triggers the CSS transition/animation)                              | class=\"my-animation ng-animate ng-enter ng-enter-active\" |\n         * | 11. $animate waits for the animation to complete (via events and timeout)                                         | class=\"my-animation ng-animate ng-enter ng-enter-active\" |\n         * | 12. The animation ends and all generated CSS classes are removed from the element                                 | class=\"my-animation\"                                     |\n         * | 13. The doneCallback() callback is fired (if provided)                                                            | class=\"my-animation\"                                     |\n         *\n         * @param {DOMElement} element the element that will be the focus of the enter animation\n         * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation\n         * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        enter : function(element, parentElement, afterElement, doneCallback) {\n          element = angular.element(element);\n          parentElement = prepareElement(parentElement);\n          afterElement = prepareElement(afterElement);\n\n          this.enabled(false, element);\n          $delegate.enter(element, parentElement, afterElement);\n          $rootScope.$$postDigest(function() {\n            element = stripCommentsFromElement(element);\n            performAnimation('enter', 'ng-enter', element, parentElement, afterElement, noop, doneCallback);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#leave\n         * @kind function\n         *\n         * @description\n         * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once\n         * the animation is started, the following CSS classes will be added for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during leave animation:\n         *\n         * | Animation Step                                                                                                    | What the element class attribute looks like              |\n         * |-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|\n         * | 1. $animate.leave(...) is called                                                                                  | class=\"my-animation\"                                     |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                                        | class=\"my-animation ng-animate\"                          |\n         * | 3. $animate waits for the next digest to start the animation                                                      | class=\"my-animation ng-animate\"                          |\n         * | 4. the .ng-leave class is added to the element                                                                    | class=\"my-animation ng-animate ng-leave\"                 |\n         * | 5. $animate scans the element styles to get the CSS transition/animation duration and delay                       | class=\"my-animation ng-animate ng-leave\"                 |\n         * | 6. $animate blocks all CSS transitions on the element to ensure the .ng-leave class styling is applied right away | class=\"my-animation ng-animate ng-leave”                 |\n         * | 7. $animate waits for a single animation frame (this performs a reflow)                                           | class=\"my-animation ng-animate ng-leave\"                 |\n         * | 8. $animate removes the CSS transition block placed on the element                                                | class=\"my-animation ng-animate ng-leave”                 |\n         * | 9. the .ng-leave-active class is added (this triggers the CSS transition/animation)                               | class=\"my-animation ng-animate ng-leave ng-leave-active\" |\n         * | 10. $animate waits for the animation to complete (via events and timeout)                                         | class=\"my-animation ng-animate ng-leave ng-leave-active\" |\n         * | 11. The animation ends and all generated CSS classes are removed from the element                                 | class=\"my-animation\"                                     |\n         * | 12. The element is removed from the DOM                                                                           | ...                                                      |\n         * | 13. The doneCallback() callback is fired (if provided)                                                            | ...                                                      |\n         *\n         * @param {DOMElement} element the element that will be the focus of the leave animation\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        leave : function(element, doneCallback) {\n          element = angular.element(element);\n          cancelChildAnimations(element);\n          this.enabled(false, element);\n          $rootScope.$$postDigest(function() {\n            performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() {\n              $delegate.leave(element);\n            }, doneCallback);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#move\n         * @kind function\n         *\n         * @description\n         * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or\n         * add the element directly after the afterElement element if present. Then the move animation will be run. Once\n         * the animation is started, the following CSS classes will be added for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during move animation:\n         *\n         * | Animation Step                                                                                                   | What the element class attribute looks like            |\n         * |------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|\n         * | 1. $animate.move(...) is called                                                                                  | class=\"my-animation\"                                   |\n         * | 2. element is moved into the parentElement element or beside the afterElement element                            | class=\"my-animation\"                                   |\n         * | 3. $animate waits for the next digest to start the animation                                                     | class=\"my-animation ng-animate\"                        |\n         * | 4. $animate runs the JavaScript-defined animations detected on the element                                       | class=\"my-animation ng-animate\"                        |\n         * | 5. the .ng-move class is added to the element                                                                    | class=\"my-animation ng-animate ng-move\"                |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                      | class=\"my-animation ng-animate ng-move\"                |\n         * | 7. $animate blocks all CSS transitions on the element to ensure the .ng-move class styling is applied right away | class=\"my-animation ng-animate ng-move”                |\n         * | 8. $animate waits for a single animation frame (this performs a reflow)                                          | class=\"my-animation ng-animate ng-move\"                |\n         * | 9. $animate removes the CSS transition block placed on the element                                               | class=\"my-animation ng-animate ng-move”                |\n         * | 10. the .ng-move-active class is added (this triggers the CSS transition/animation)                              | class=\"my-animation ng-animate ng-move ng-move-active\" |\n         * | 11. $animate waits for the animation to complete (via events and timeout)                                        | class=\"my-animation ng-animate ng-move ng-move-active\" |\n         * | 12. The animation ends and all generated CSS classes are removed from the element                                | class=\"my-animation\"                                   |\n         * | 13. The doneCallback() callback is fired (if provided)                                                           | class=\"my-animation\"                                   |\n         *\n         * @param {DOMElement} element the element that will be the focus of the move animation\n         * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation\n         * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        move : function(element, parentElement, afterElement, doneCallback) {\n          element = angular.element(element);\n          parentElement = prepareElement(parentElement);\n          afterElement = prepareElement(afterElement);\n\n          cancelChildAnimations(element);\n          this.enabled(false, element);\n          $delegate.move(element, parentElement, afterElement);\n          $rootScope.$$postDigest(function() {\n            element = stripCommentsFromElement(element);\n            performAnimation('move', 'ng-move', element, parentElement, afterElement, noop, doneCallback);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#addClass\n         *\n         * @description\n         * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class.\n         * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide\n         * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions\n         * or keyframes are defined on the -add-active or base CSS class).\n         *\n         * Below is a breakdown of each step that occurs during addClass animation:\n         *\n         * | Animation Step                                                                                     | What the element class attribute looks like                      |\n         * |----------------------------------------------------------------------------------------------------|------------------------------------------------------------------|\n         * | 1. $animate.addClass(element, 'super') is called                                                   | class=\"my-animation\"                                             |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                         | class=\"my-animation ng-animate\"                                  |\n         * | 3. the .super-add class is added to the element                                                    | class=\"my-animation ng-animate super-add\"                        |\n         * | 4. $animate waits for a single animation frame (this performs a reflow)                            | class=\"my-animation ng-animate super-add\"                        |\n         * | 5. the .super and .super-add-active classes are added (this triggers the CSS transition/animation) | class=\"my-animation ng-animate super super-add super-add-active\" |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay        | class=\"my-animation ng-animate super-add\"                        |\n         * | 7. $animate waits for the animation to complete (via events and timeout)                           | class=\"my-animation super super-add super-add-active\"            |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                   | class=\"my-animation super\"                                       |\n         * | 9. The super class is kept on the element                                                          | class=\"my-animation super\"                                       |\n         * | 10. The doneCallback() callback is fired (if provided)                                             | class=\"my-animation super\"                                       |\n         *\n         * @param {DOMElement} element the element that will be animated\n         * @param {string} className the CSS class that will be added to the element and then animated\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        addClass : function(element, className, doneCallback) {\n          element = angular.element(element);\n          element = stripCommentsFromElement(element);\n          performAnimation('addClass', className, element, null, null, function() {\n            $delegate.addClass(element, className);\n          }, doneCallback);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#removeClass\n         *\n         * @description\n         * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value\n         * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in\n         * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if\n         * no CSS transitions or keyframes are defined on the -remove or base CSS classes).\n         *\n         * Below is a breakdown of each step that occurs during removeClass animation:\n         *\n         * | Animation Step                                                                                                   | What the element class attribute looks like                      |\n         * |------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------|\n         * | 1. $animate.removeClass(element, 'super') is called                                                              | class=\"my-animation super\"                                       |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                                       | class=\"my-animation super ng-animate\"                            |\n         * | 3. the .super-remove class is added to the element                                                               | class=\"my-animation super ng-animate super-remove\"               |\n         * | 4. $animate waits for a single animation frame (this performs a reflow)                                          | class=\"my-animation super ng-animate super-remove\"               |\n         * | 5. the .super-remove-active classes are added and .super is removed (this triggers the CSS transition/animation) | class=\"my-animation ng-animate super-remove super-remove-active\" |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                      | class=\"my-animation super ng-animate super-remove\"               |\n         * | 7. $animate waits for the animation to complete (via events and timeout)                                         | class=\"my-animation ng-animate super-remove super-remove-active\" |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                                 | class=\"my-animation\"                                             |\n         * | 9. The doneCallback() callback is fired (if provided)                                                            | class=\"my-animation\"                                             |\n         *\n         *\n         * @param {DOMElement} element the element that will be animated\n         * @param {string} className the CSS class that will be animated and then removed from the element\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        removeClass : function(element, className, doneCallback) {\n          element = angular.element(element);\n          element = stripCommentsFromElement(element);\n          performAnimation('removeClass', className, element, null, null, function() {\n            $delegate.removeClass(element, className);\n          }, doneCallback);\n        },\n\n        /**\n         *\n         * @ngdoc method\n         * @name $animate#setClass\n         *\n         * @description Adds and/or removes the given CSS classes to and from the element.\n         * Once complete, the done() callback will be fired (if provided).\n         *\n         * | Animation Step                                                                                                                       | What the element class attribute looks like                                          |\n         * |--------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|\n         * | 1. $animate.removeClass(element, ‘on’, ‘off’) is called                                                                              | class=\"my-animation super off”                                                       |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                                                           | class=\"my-animation super ng-animate off”                                            |\n         * | 3. the .on-add and .off-remove classes are added to the element                                                                      | class=\"my-animation ng-animate on-add off-remove off”                                |\n         * | 4. $animate waits for a single animation frame (this performs a reflow)                                                              | class=\"my-animation ng-animate on-add off-remove off”                                |\n         * | 5. the .on, .on-add-active and .off-remove-active classes are added and .off is removed (this triggers the CSS transition/animation) | class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active” |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                                          | class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active\" |\n         * | 7. $animate waits for the animation to complete (via events and timeout)                                                             | class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active\" |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                                                     | class=\"my-animation\"                                                                 |\n         * | 9. The doneCallback() callback is fired (if provided)                                                                                | class=\"my-animation\"                                                                 |\n         *\n         * @param {DOMElement} element the element which will have its CSS classes changed\n         *   removed from it\n         * @param {string} add the CSS classes which will be added to the element\n         * @param {string} remove the CSS class which will be removed from the element\n         * @param {Function=} done the callback function (if provided) that will be fired after the\n         *   CSS classes have been set on the element\n         */\n        setClass : function(element, add, remove, doneCallback) {\n          element = angular.element(element);\n          element = stripCommentsFromElement(element);\n          performAnimation('setClass', [add, remove], element, null, null, function() {\n            $delegate.setClass(element, add, remove);\n          }, doneCallback);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#enabled\n         * @kind function\n         *\n         * @param {boolean=} value If provided then set the animation on or off.\n         * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation\n         * @return {boolean} Current animation state.\n         *\n         * @description\n         * Globally enables/disables animations.\n         *\n        */\n        enabled : function(value, element) {\n          switch(arguments.length) {\n            case 2:\n              if(value) {\n                cleanup(element);\n              } else {\n                var data = element.data(NG_ANIMATE_STATE) || {};\n                data.disabled = true;\n                element.data(NG_ANIMATE_STATE, data);\n              }\n            break;\n\n            case 1:\n              rootAnimateState.disabled = !value;\n            break;\n\n            default:\n              value = !rootAnimateState.disabled;\n            break;\n          }\n          return !!value;\n         }\n      };\n\n      /*\n        all animations call this shared animation triggering function internally.\n        The animationEvent variable refers to the JavaScript animation event that will be triggered\n        and the className value is the name of the animation that will be applied within the\n        CSS code. Element, parentElement and afterElement are provided DOM elements for the animation\n        and the onComplete callback will be fired once the animation is fully complete.\n      */\n      function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, doneCallback) {\n\n        var runner = animationRunner(element, animationEvent, className);\n        if(!runner) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          closeAnimation();\n          return;\n        }\n\n        className = runner.className;\n        var elementEvents = angular.element._data(runner.node);\n        elementEvents = elementEvents && elementEvents.events;\n\n        if (!parentElement) {\n          parentElement = afterElement ? afterElement.parent() : element.parent();\n        }\n\n        var ngAnimateState  = element.data(NG_ANIMATE_STATE) || {};\n        var runningAnimations     = ngAnimateState.active || {};\n        var totalActiveAnimations = ngAnimateState.totalActive || 0;\n        var lastAnimation         = ngAnimateState.last;\n\n        //only allow animations if the currently running animation is not structural\n        //or if there is no animation running at all\n        var skipAnimations = runner.isClassBased\n                ? ngAnimateState.disabled || (lastAnimation && !lastAnimation.isClassBased)\n                : false;\n\n        //skip the animation if animations are disabled, a parent is already being animated,\n        //the element is not currently attached to the document body or then completely close\n        //the animation if any matching animations are not found at all.\n        //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found.\n        if (skipAnimations || animationsDisabled(element, parentElement)) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          closeAnimation();\n          return;\n        }\n\n        var skipAnimation = false;\n        if(totalActiveAnimations > 0) {\n          var animationsToCancel = [];\n          if(!runner.isClassBased) {\n            if(animationEvent == 'leave' && runningAnimations['ng-leave']) {\n              skipAnimation = true;\n            } else {\n              //cancel all animations when a structural animation takes place\n              for(var klass in runningAnimations) {\n                animationsToCancel.push(runningAnimations[klass]);\n                cleanup(element, klass);\n              }\n              runningAnimations = {};\n              totalActiveAnimations = 0;\n            }\n          } else if(lastAnimation.event == 'setClass') {\n            animationsToCancel.push(lastAnimation);\n            cleanup(element, className);\n          }\n          else if(runningAnimations[className]) {\n            var current = runningAnimations[className];\n            if(current.event == animationEvent) {\n              skipAnimation = true;\n            } else {\n              animationsToCancel.push(current);\n              cleanup(element, className);\n            }\n          }\n\n          if(animationsToCancel.length > 0) {\n            forEach(animationsToCancel, function(operation) {\n              operation.cancel();\n            });\n          }\n        }\n\n        if(runner.isClassBased && !runner.isSetClassOperation && !skipAnimation) {\n          skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR\n        }\n\n        if(skipAnimation) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          fireDoneCallbackAsync();\n          return;\n        }\n\n        if(animationEvent == 'leave') {\n          //there's no need to ever remove the listener since the element\n          //will be removed (destroyed) after the leave animation ends or\n          //is cancelled midway\n          element.one('$destroy', function(e) {\n            var element = angular.element(this);\n            var state = element.data(NG_ANIMATE_STATE);\n            if(state) {\n              var activeLeaveAnimation = state.active['ng-leave'];\n              if(activeLeaveAnimation) {\n                activeLeaveAnimation.cancel();\n                cleanup(element, 'ng-leave');\n              }\n            }\n          });\n        }\n\n        //the ng-animate class does nothing, but it's here to allow for\n        //parent animations to find and cancel child animations when needed\n        element.addClass(NG_ANIMATE_CLASS_NAME);\n\n        var localAnimationCount = globalAnimationCounter++;\n        totalActiveAnimations++;\n        runningAnimations[className] = runner;\n\n        element.data(NG_ANIMATE_STATE, {\n          last : runner,\n          active : runningAnimations,\n          index : localAnimationCount,\n          totalActive : totalActiveAnimations\n        });\n\n        //first we run the before animations and when all of those are complete\n        //then we perform the DOM operation and run the next set of animations\n        fireBeforeCallbackAsync();\n        runner.before(function(cancelled) {\n          var data = element.data(NG_ANIMATE_STATE);\n          cancelled = cancelled ||\n                        !data || !data.active[className] ||\n                        (runner.isClassBased && data.active[className].event != animationEvent);\n\n          fireDOMOperation();\n          if(cancelled === true) {\n            closeAnimation();\n          } else {\n            fireAfterCallbackAsync();\n            runner.after(closeAnimation);\n          }\n        });\n\n        function fireDOMCallback(animationPhase) {\n          var eventName = '$animate:' + animationPhase;\n          if(elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) {\n            $$asyncCallback(function() {\n              element.triggerHandler(eventName, {\n                event : animationEvent,\n                className : className\n              });\n            });\n          }\n        }\n\n        function fireBeforeCallbackAsync() {\n          fireDOMCallback('before');\n        }\n\n        function fireAfterCallbackAsync() {\n          fireDOMCallback('after');\n        }\n\n        function fireDoneCallbackAsync() {\n          fireDOMCallback('close');\n          if(doneCallback) {\n            $$asyncCallback(function() {\n              doneCallback();\n            });\n          }\n        }\n\n        //it is less complicated to use a flag than managing and canceling\n        //timeouts containing multiple callbacks.\n        function fireDOMOperation() {\n          if(!fireDOMOperation.hasBeenRun) {\n            fireDOMOperation.hasBeenRun = true;\n            domOperation();\n          }\n        }\n\n        function closeAnimation() {\n          if(!closeAnimation.hasBeenRun) {\n            closeAnimation.hasBeenRun = true;\n            var data = element.data(NG_ANIMATE_STATE);\n            if(data) {\n              /* only structural animations wait for reflow before removing an\n                 animation, but class-based animations don't. An example of this\n                 failing would be when a parent HTML tag has a ng-class attribute\n                 causing ALL directives below to skip animations during the digest */\n              if(runner && runner.isClassBased) {\n                cleanup(element, className);\n              } else {\n                $$asyncCallback(function() {\n                  var data = element.data(NG_ANIMATE_STATE) || {};\n                  if(localAnimationCount == data.index) {\n                    cleanup(element, className, animationEvent);\n                  }\n                });\n                element.data(NG_ANIMATE_STATE, data);\n              }\n            }\n            fireDoneCallbackAsync();\n          }\n        }\n      }\n\n      function cancelChildAnimations(element) {\n        var node = extractElementNode(element);\n        if (node) {\n          var nodes = angular.isFunction(node.getElementsByClassName) ?\n            node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) :\n            node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME);\n          forEach(nodes, function(element) {\n            element = angular.element(element);\n            var data = element.data(NG_ANIMATE_STATE);\n            if(data && data.active) {\n              forEach(data.active, function(runner) {\n                runner.cancel();\n              });\n            }\n          });\n        }\n      }\n\n      function cleanup(element, className) {\n        if(isMatchingElement(element, $rootElement)) {\n          if(!rootAnimateState.disabled) {\n            rootAnimateState.running = false;\n            rootAnimateState.structural = false;\n          }\n        } else if(className) {\n          var data = element.data(NG_ANIMATE_STATE) || {};\n\n          var removeAnimations = className === true;\n          if(!removeAnimations && data.active && data.active[className]) {\n            data.totalActive--;\n            delete data.active[className];\n          }\n\n          if(removeAnimations || !data.totalActive) {\n            element.removeClass(NG_ANIMATE_CLASS_NAME);\n            element.removeData(NG_ANIMATE_STATE);\n          }\n        }\n      }\n\n      function animationsDisabled(element, parentElement) {\n        if (rootAnimateState.disabled) return true;\n\n        if(isMatchingElement(element, $rootElement)) {\n          return rootAnimateState.disabled || rootAnimateState.running;\n        }\n\n        do {\n          //the element did not reach the root element which means that it\n          //is not apart of the DOM. Therefore there is no reason to do\n          //any animations on it\n          if(parentElement.length === 0) break;\n\n          var isRoot = isMatchingElement(parentElement, $rootElement);\n          var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {});\n          var result = state.disabled || state.running\n                  ? true\n                  : state.last && !state.last.isClassBased;\n\n          if(isRoot || result) {\n            return result;\n          }\n\n          if(isRoot) return true;\n        }\n        while(parentElement = parentElement.parent());\n\n        return true;\n      }\n    }]);\n\n    $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow',\n                           function($window,   $sniffer,   $timeout,   $$animateReflow) {\n      // Detect proper transitionend/animationend event names.\n      var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;\n\n      // If unprefixed events are not supported but webkit-prefixed are, use the latter.\n      // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.\n      // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`\n      // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.\n      // Register both events in case `window.onanimationend` is not supported because of that,\n      // do the same for `transitionend` as Safari is likely to exhibit similar behavior.\n      // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit\n      // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition\n      if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {\n        CSS_PREFIX = '-webkit-';\n        TRANSITION_PROP = 'WebkitTransition';\n        TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';\n      } else {\n        TRANSITION_PROP = 'transition';\n        TRANSITIONEND_EVENT = 'transitionend';\n      }\n\n      if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {\n        CSS_PREFIX = '-webkit-';\n        ANIMATION_PROP = 'WebkitAnimation';\n        ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';\n      } else {\n        ANIMATION_PROP = 'animation';\n        ANIMATIONEND_EVENT = 'animationend';\n      }\n\n      var DURATION_KEY = 'Duration';\n      var PROPERTY_KEY = 'Property';\n      var DELAY_KEY = 'Delay';\n      var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';\n      var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey';\n      var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data';\n      var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\n      var CLOSING_TIME_BUFFER = 1.5;\n      var ONE_SECOND = 1000;\n\n      var lookupCache = {};\n      var parentCounter = 0;\n      var animationReflowQueue = [];\n      var cancelAnimationReflow;\n      function afterReflow(element, callback) {\n        if(cancelAnimationReflow) {\n          cancelAnimationReflow();\n        }\n        animationReflowQueue.push(callback);\n        cancelAnimationReflow = $$animateReflow(function() {\n          forEach(animationReflowQueue, function(fn) {\n            fn();\n          });\n\n          animationReflowQueue = [];\n          cancelAnimationReflow = null;\n          lookupCache = {};\n        });\n      }\n\n      var closingTimer = null;\n      var closingTimestamp = 0;\n      var animationElementQueue = [];\n      function animationCloseHandler(element, totalTime) {\n        var node = extractElementNode(element);\n        element = angular.element(node);\n\n        //this item will be garbage collected by the closing\n        //animation timeout\n        animationElementQueue.push(element);\n\n        //but it may not need to cancel out the existing timeout\n        //if the timestamp is less than the previous one\n        var futureTimestamp = Date.now() + totalTime;\n        if(futureTimestamp <= closingTimestamp) {\n          return;\n        }\n\n        $timeout.cancel(closingTimer);\n\n        closingTimestamp = futureTimestamp;\n        closingTimer = $timeout(function() {\n          closeAllAnimations(animationElementQueue);\n          animationElementQueue = [];\n        }, totalTime, false);\n      }\n\n      function closeAllAnimations(elements) {\n        forEach(elements, function(element) {\n          var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\n          if(elementData) {\n            (elementData.closeAnimationFn || noop)();\n          }\n        });\n      }\n\n      function getElementAnimationDetails(element, cacheKey) {\n        var data = cacheKey ? lookupCache[cacheKey] : null;\n        if(!data) {\n          var transitionDuration = 0;\n          var transitionDelay = 0;\n          var animationDuration = 0;\n          var animationDelay = 0;\n          var transitionDelayStyle;\n          var animationDelayStyle;\n          var transitionDurationStyle;\n          var transitionPropertyStyle;\n\n          //we want all the styles defined before and after\n          forEach(element, function(element) {\n            if (element.nodeType == ELEMENT_NODE) {\n              var elementStyles = $window.getComputedStyle(element) || {};\n\n              transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY];\n\n              transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration);\n\n              transitionPropertyStyle = elementStyles[TRANSITION_PROP + PROPERTY_KEY];\n\n              transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY];\n\n              transitionDelay  = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay);\n\n              animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY];\n\n              animationDelay   = Math.max(parseMaxTime(animationDelayStyle), animationDelay);\n\n              var aDuration  = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]);\n\n              if(aDuration > 0) {\n                aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1;\n              }\n\n              animationDuration = Math.max(aDuration, animationDuration);\n            }\n          });\n          data = {\n            total : 0,\n            transitionPropertyStyle: transitionPropertyStyle,\n            transitionDurationStyle: transitionDurationStyle,\n            transitionDelayStyle: transitionDelayStyle,\n            transitionDelay: transitionDelay,\n            transitionDuration: transitionDuration,\n            animationDelayStyle: animationDelayStyle,\n            animationDelay: animationDelay,\n            animationDuration: animationDuration\n          };\n          if(cacheKey) {\n            lookupCache[cacheKey] = data;\n          }\n        }\n        return data;\n      }\n\n      function parseMaxTime(str) {\n        var maxValue = 0;\n        var values = angular.isString(str) ?\n          str.split(/\\s*,\\s*/) :\n          [];\n        forEach(values, function(value) {\n          maxValue = Math.max(parseFloat(value) || 0, maxValue);\n        });\n        return maxValue;\n      }\n\n      function getCacheKey(element) {\n        var parentElement = element.parent();\n        var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY);\n        if(!parentID) {\n          parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter);\n          parentID = parentCounter;\n        }\n        return parentID + '-' + extractElementNode(element).getAttribute('class');\n      }\n\n      function animateSetup(animationEvent, element, className) {\n        var structural = ['ng-enter','ng-leave','ng-move'].indexOf(className) >= 0;\n\n        var cacheKey = getCacheKey(element);\n        var eventCacheKey = cacheKey + ' ' + className;\n        var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0;\n\n        var stagger = {};\n        if(itemIndex > 0) {\n          var staggerClassName = className + '-stagger';\n          var staggerCacheKey = cacheKey + ' ' + staggerClassName;\n          var applyClasses = !lookupCache[staggerCacheKey];\n\n          applyClasses && element.addClass(staggerClassName);\n\n          stagger = getElementAnimationDetails(element, staggerCacheKey);\n\n          applyClasses && element.removeClass(staggerClassName);\n        }\n\n        element.addClass(className);\n\n        var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {};\n        var timings = getElementAnimationDetails(element, eventCacheKey);\n        var transitionDuration = timings.transitionDuration;\n        var animationDuration = timings.animationDuration;\n\n        if(structural && transitionDuration === 0 && animationDuration === 0) {\n          element.removeClass(className);\n          return false;\n        }\n\n        var blockTransition = structural && transitionDuration > 0;\n        var blockAnimation = animationDuration > 0 &&\n                             stagger.animationDelay > 0 &&\n                             stagger.animationDuration === 0;\n\n        element.data(NG_ANIMATE_CSS_DATA_KEY, {\n          stagger : stagger,\n          cacheKey : eventCacheKey,\n          running : formerData.running || 0,\n          itemIndex : itemIndex,\n          blockTransition : blockTransition,\n          blockAnimation : blockAnimation,\n          closeAnimationFn : noop\n        });\n\n        var node = extractElementNode(element);\n\n        if(blockTransition) {\n          node.style[TRANSITION_PROP + PROPERTY_KEY] = 'none';\n        }\n\n        if(blockAnimation) {\n          node.style[ANIMATION_PROP] = 'none 0s';\n        }\n\n        return true;\n      }\n\n      function animateRun(animationEvent, element, className, activeAnimationComplete) {\n        var node = extractElementNode(element);\n        var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\n        if(node.getAttribute('class').indexOf(className) == -1 || !elementData) {\n          activeAnimationComplete();\n          return;\n        }\n\n        if(elementData.blockTransition) {\n          node.style[TRANSITION_PROP + PROPERTY_KEY] = '';\n        }\n\n        if(elementData.blockAnimation) {\n          node.style[ANIMATION_PROP] = '';\n        }\n\n        var activeClassName = '';\n        forEach(className.split(' '), function(klass, i) {\n          activeClassName += (i > 0 ? ' ' : '') + klass + '-active';\n        });\n\n        element.addClass(activeClassName);\n        var eventCacheKey = elementData.cacheKey + ' ' + activeClassName;\n        var timings = getElementAnimationDetails(element, eventCacheKey);\n\n        var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration);\n        if(maxDuration === 0) {\n          element.removeClass(activeClassName);\n          animateClose(element, className);\n          activeAnimationComplete();\n          return;\n        }\n\n        var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay);\n        var stagger = elementData.stagger;\n        var itemIndex = elementData.itemIndex;\n        var maxDelayTime = maxDelay * ONE_SECOND;\n\n        var style = '', appliedStyles = [];\n        if(timings.transitionDuration > 0) {\n          var propertyStyle = timings.transitionPropertyStyle;\n          if(propertyStyle.indexOf('all') == -1) {\n            style += CSS_PREFIX + 'transition-property: ' + propertyStyle + ';';\n            style += CSS_PREFIX + 'transition-duration: ' + timings.transitionDurationStyle + ';';\n            appliedStyles.push(CSS_PREFIX + 'transition-property');\n            appliedStyles.push(CSS_PREFIX + 'transition-duration');\n          }\n        }\n\n        if(itemIndex > 0) {\n          if(stagger.transitionDelay > 0 && stagger.transitionDuration === 0) {\n            var delayStyle = timings.transitionDelayStyle;\n            style += CSS_PREFIX + 'transition-delay: ' +\n                     prepareStaggerDelay(delayStyle, stagger.transitionDelay, itemIndex) + '; ';\n            appliedStyles.push(CSS_PREFIX + 'transition-delay');\n          }\n\n          if(stagger.animationDelay > 0 && stagger.animationDuration === 0) {\n            style += CSS_PREFIX + 'animation-delay: ' +\n                     prepareStaggerDelay(timings.animationDelayStyle, stagger.animationDelay, itemIndex) + '; ';\n            appliedStyles.push(CSS_PREFIX + 'animation-delay');\n          }\n        }\n\n        if(appliedStyles.length > 0) {\n          //the element being animated may sometimes contain comment nodes in\n          //the jqLite object, so we're safe to use a single variable to house\n          //the styles since there is always only one element being animated\n          var oldStyle = node.getAttribute('style') || '';\n          node.setAttribute('style', oldStyle + '; ' + style);\n        }\n\n        var startTime = Date.now();\n        var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT;\n\n        element.on(css3AnimationEvents, onAnimationProgress);\n        elementData.closeAnimationFn = function() {\n          onEnd();\n          activeAnimationComplete();\n        };\n\n        var staggerTime       = itemIndex * (Math.max(stagger.animationDelay, stagger.transitionDelay) || 0);\n        var animationTime     = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER;\n        var totalTime         = (staggerTime + animationTime) * ONE_SECOND;\n\n        elementData.running++;\n        animationCloseHandler(element, totalTime);\n        return onEnd;\n\n        // This will automatically be called by $animate so\n        // there is no need to attach this internally to the\n        // timeout done method.\n        function onEnd(cancelled) {\n          element.off(css3AnimationEvents, onAnimationProgress);\n          element.removeClass(activeClassName);\n          animateClose(element, className);\n          var node = extractElementNode(element);\n          for (var i in appliedStyles) {\n            node.style.removeProperty(appliedStyles[i]);\n          }\n        }\n\n        function onAnimationProgress(event) {\n          event.stopPropagation();\n          var ev = event.originalEvent || event;\n          var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now();\n\n          /* Firefox (or possibly just Gecko) likes to not round values up\n           * when a ms measurement is used for the animation */\n          var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));\n\n          /* $manualTimeStamp is a mocked timeStamp value which is set\n           * within browserTrigger(). This is only here so that tests can\n           * mock animations properly. Real events fallback to event.timeStamp,\n           * or, if they don't, then a timeStamp is automatically created for them.\n           * We're checking to see if the timeStamp surpasses the expected delay,\n           * but we're using elapsedTime instead of the timeStamp on the 2nd\n           * pre-condition since animations sometimes close off early */\n          if(Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n            activeAnimationComplete();\n          }\n        }\n      }\n\n      function prepareStaggerDelay(delayStyle, staggerDelay, index) {\n        var style = '';\n        forEach(delayStyle.split(','), function(val, i) {\n          style += (i > 0 ? ',' : '') +\n                   (index * staggerDelay + parseInt(val, 10)) + 's';\n        });\n        return style;\n      }\n\n      function animateBefore(animationEvent, element, className, calculationDecorator) {\n        if(animateSetup(animationEvent, element, className, calculationDecorator)) {\n          return function(cancelled) {\n            cancelled && animateClose(element, className);\n          };\n        }\n      }\n\n      function animateAfter(animationEvent, element, className, afterAnimationComplete) {\n        if(element.data(NG_ANIMATE_CSS_DATA_KEY)) {\n          return animateRun(animationEvent, element, className, afterAnimationComplete);\n        } else {\n          animateClose(element, className);\n          afterAnimationComplete();\n        }\n      }\n\n      function animate(animationEvent, element, className, animationComplete) {\n        //If the animateSetup function doesn't bother returning a\n        //cancellation function then it means that there is no animation\n        //to perform at all\n        var preReflowCancellation = animateBefore(animationEvent, element, className);\n        if(!preReflowCancellation) {\n          animationComplete();\n          return;\n        }\n\n        //There are two cancellation functions: one is before the first\n        //reflow animation and the second is during the active state\n        //animation. The first function will take care of removing the\n        //data from the element which will not make the 2nd animation\n        //happen in the first place\n        var cancel = preReflowCancellation;\n        afterReflow(element, function() {\n          //once the reflow is complete then we point cancel to\n          //the new cancellation function which will remove all of the\n          //animation properties from the active animation\n          cancel = animateAfter(animationEvent, element, className, animationComplete);\n        });\n\n        return function(cancelled) {\n          (cancel || noop)(cancelled);\n        };\n      }\n\n      function animateClose(element, className) {\n        element.removeClass(className);\n        var data = element.data(NG_ANIMATE_CSS_DATA_KEY);\n        if(data) {\n          if(data.running) {\n            data.running--;\n          }\n          if(!data.running || data.running === 0) {\n            element.removeData(NG_ANIMATE_CSS_DATA_KEY);\n          }\n        }\n      }\n\n      return {\n        enter : function(element, animationCompleted) {\n          return animate('enter', element, 'ng-enter', animationCompleted);\n        },\n\n        leave : function(element, animationCompleted) {\n          return animate('leave', element, 'ng-leave', animationCompleted);\n        },\n\n        move : function(element, animationCompleted) {\n          return animate('move', element, 'ng-move', animationCompleted);\n        },\n\n        beforeSetClass : function(element, add, remove, animationCompleted) {\n          var className = suffixClasses(remove, '-remove') + ' ' +\n                          suffixClasses(add, '-add');\n          var cancellationMethod = animateBefore('setClass', element, className);\n          if(cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          animationCompleted();\n        },\n\n        beforeAddClass : function(element, className, animationCompleted) {\n          var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'));\n          if(cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          animationCompleted();\n        },\n\n        beforeRemoveClass : function(element, className, animationCompleted) {\n          var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'));\n          if(cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          animationCompleted();\n        },\n\n        setClass : function(element, add, remove, animationCompleted) {\n          remove = suffixClasses(remove, '-remove');\n          add = suffixClasses(add, '-add');\n          var className = remove + ' ' + add;\n          return animateAfter('setClass', element, className, animationCompleted);\n        },\n\n        addClass : function(element, className, animationCompleted) {\n          return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted);\n        },\n\n        removeClass : function(element, className, animationCompleted) {\n          return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted);\n        }\n      };\n\n      function suffixClasses(classes, suffix) {\n        var className = '';\n        classes = angular.isArray(classes) ? classes : classes.split(/\\s+/);\n        forEach(classes, function(klass, i) {\n          if(klass && klass.length > 0) {\n            className += (i > 0 ? ' ' : '') + klass + suffix;\n          }\n        });\n        return className;\n      }\n    }]);\n  }]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "demo/my-show-4-angularjs/js/angular-route.js",
    "content": "/**\n * @license AngularJS v1.3.0-beta.14\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngRoute\n * @description\n *\n * # ngRoute\n *\n * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.\n *\n * ## Example\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\n *\n *\n * <div doc-module-components=\"ngRoute\"></div>\n */\n /* global -ngRouteModule */\nvar ngRouteModule = angular.module('ngRoute', ['ng']).\n                        provider('$route', $RouteProvider);\n\n/**\n * @ngdoc provider\n * @name $routeProvider\n * @kind function\n *\n * @description\n *\n * Used for configuring routes.\n *\n * ## Example\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\n *\n * ## Dependencies\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n */\nfunction $RouteProvider(){\n  function inherit(parent, extra) {\n    return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra);\n  }\n\n  var routes = {};\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#when\n   *\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\n   *    contains redundant trailing slash or is missing one, the route will still match and the\n   *    `$location.path` will be updated to add or drop the trailing slash to exactly match the\n   *    route definition.\n   *\n   *    * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up\n   *        to the next slash are matched and stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain named groups starting with a colon and ending with a star:\n   *        e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain optional named groups with a question mark: e.g.`:name?`.\n   *\n   *    For example, routes like `/color/:color/largecode/:largecode*\\/edit` will match\n   *    `/color/brown/largecode/code/with/slashes/edit` and extract:\n   *\n   *    * `color: brown`\n   *    * `largecode: code/with/slashes`.\n   *\n   *\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\n   *    match.\n   *\n   *    Object properties:\n   *\n   *    - `controller` – `{(string|function()=}` – Controller fn that should be associated with\n   *      newly created scope or the name of a {@link angular.Module#controller registered\n   *      controller} if passed as a string.\n   *    - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be\n   *      published to scope under the `controllerAs` name.\n   *    - `template` – `{string=|function()=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used by {@link\n   *      ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.\n   *      This property takes precedence over `templateUrl`.\n   *\n   *      If `template` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *    - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html\n   *      template that should be used by {@link ngRoute.directive:ngView ngView}.\n   *\n   *      If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\n   *      be injected into the controller. If any of these dependencies are promises, the router\n   *      will wait for them all to be resolved or one to be rejected before the controller is\n   *      instantiated.\n   *      If all the promises are resolved successfully, the values of the resolved promises are\n   *      injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is\n   *      fired. If any of the promises are rejected the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object\n   *      is:\n   *\n   *      - `key` – `{string}`: a name of a dependency to be injected into the controller.\n   *      - `factory` - `{string|function}`: If `string` then it is an alias for a service.\n   *        Otherwise if function, then it is {@link auto.$injector#invoke injected}\n   *        and the return value is treated as the dependency. If the result is a promise, it is\n   *        resolved before its value is injected into the controller. Be aware that\n   *        `ngRoute.$routeParams` will still refer to the previous route within these resolve\n   *        functions.  Use `$route.current.params` to access the new route parameters, instead.\n   *\n   *    - `redirectTo` – {(string|function())=} – value to update\n   *      {@link ng.$location $location} path with and trigger route redirection.\n   *\n   *      If `redirectTo` is a function, it will be called with the following parameters:\n   *\n   *      - `{Object.<string>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route templateUrl.\n   *      - `{string}` - current `$location.path()`\n   *      - `{Object}` - current `$location.search()`\n   *\n   *      The custom `redirectTo` function is expected to return a string which will be used\n   *      to update `$location.path()` and `$location.search()`.\n   *\n   *    - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`\n   *      or `$location.hash()` changes.\n   *\n   *      If the option is set to `false` and url in the browser changes, then\n   *      `$routeUpdate` event is broadcasted on the root scope.\n   *\n   *    - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive\n   *\n   *      If the option is set to `true`, then the particular route can be matched without being\n   *      case sensitive\n   *\n   * @returns {Object} self\n   *\n   * @description\n   * Adds a new route definition to the `$route` service.\n   */\n  this.when = function(path, route) {\n    routes[path] = angular.extend(\n      {reloadOnSearch: true},\n      route,\n      path && pathRegExp(path, route)\n    );\n\n    // create redirection for trailing slashes\n    if (path) {\n      var redirectPath = (path[path.length-1] == '/')\n            ? path.substr(0, path.length-1)\n            : path +'/';\n\n      routes[redirectPath] = angular.extend(\n        {redirectTo: path},\n        pathRegExp(redirectPath, route)\n      );\n    }\n\n    return this;\n  };\n\n   /**\n    * @param path {string} path\n    * @param opts {Object} options\n    * @return {?Object}\n    *\n    * @description\n    * Normalizes the given path, returning a regular expression\n    * and the original path.\n    *\n    * Inspired by pathRexp in visionmedia/express/lib/utils.js.\n    */\n  function pathRegExp(path, opts) {\n    var insensitive = opts.caseInsensitiveMatch,\n        ret = {\n          originalPath: path,\n          regexp: path\n        },\n        keys = ret.keys = [];\n\n    path = path\n      .replace(/([().])/g, '\\\\$1')\n      .replace(/(\\/)?:(\\w+)([\\?\\*])?/g, function(_, slash, key, option){\n        var optional = option === '?' ? option : null;\n        var star = option === '*' ? option : null;\n        keys.push({ name: key, optional: !!optional });\n        slash = slash || '';\n        return ''\n          + (optional ? '' : slash)\n          + '(?:'\n          + (optional ? slash : '')\n          + (star && '(.+?)' || '([^/]+)')\n          + (optional || '')\n          + ')'\n          + (optional || '');\n      })\n      .replace(/([\\/$\\*])/g, '\\\\$1');\n\n    ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');\n    return ret;\n  }\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#otherwise\n   *\n   * @description\n   * Sets route definition that will be used on route change when no other route definition\n   * is matched.\n   *\n   * @param {Object} params Mapping information to be assigned to `$route.current`.\n   * @returns {Object} self\n   */\n  this.otherwise = function(params) {\n    this.when(null, params);\n    return this;\n  };\n\n\n  this.$get = ['$rootScope',\n               '$location',\n               '$routeParams',\n               '$q',\n               '$injector',\n               '$http',\n               '$templateCache',\n               '$sce',\n      function($rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {\n\n    /**\n     * @ngdoc service\n     * @name $route\n     * @requires $location\n     * @requires $routeParams\n     *\n     * @property {Object} current Reference to the current route definition.\n     * The route definition contains:\n     *\n     *   - `controller`: The controller constructor as define in route definition.\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\n     *     controller instantiation. The `locals` contain\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\n     *\n     *     - `$scope` - The current route scope.\n     *     - `$template` - The current route template HTML.\n     *\n     * @property {Object} routes Object with all route configuration Objects as its properties.\n     *\n     * @description\n     * `$route` is used for deep-linking URLs to controllers and views (HTML partials).\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\n     *\n     * Requires the {@link ngRoute `ngRoute`} module to be installed.\n     *\n     * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.\n     *\n     * The `$route` service is typically used in conjunction with the\n     * {@link ngRoute.directive:ngView `ngView`} directive and the\n     * {@link ngRoute.$routeParams `$routeParams`} service.\n     *\n     * @example\n     * This example shows how changing the URL hash causes the `$route` to match a route against the\n     * URL, and the `ngView` pulls in the partial.\n     *\n     * Note that this example is using {@link ng.directive:script inlined templates}\n     * to get it working on jsfiddle as well.\n     *\n     * <example name=\"$route-service\" module=\"ngRouteExample\"\n     *          deps=\"angular-route.js\" fixBase=\"true\">\n     *   <file name=\"index.html\">\n     *     <div ng-controller=\"MainController\">\n     *       Choose:\n     *       <a href=\"Book/Moby\">Moby</a> |\n     *       <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n     *       <a href=\"Book/Gatsby\">Gatsby</a> |\n     *       <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n     *       <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n     *\n     *       <div ng-view></div>\n     *\n     *       <hr />\n     *\n     *       <pre>$location.path() = {{$location.path()}}</pre>\n     *       <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\n     *       <pre>$route.current.params = {{$route.current.params}}</pre>\n     *       <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\n     *       <pre>$routeParams = {{$routeParams}}</pre>\n     *     </div>\n     *   </file>\n     *\n     *   <file name=\"book.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *   </file>\n     *\n     *   <file name=\"chapter.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *     Chapter Id: {{params.chapterId}}\n     *   </file>\n     *\n     *   <file name=\"script.js\">\n     *     angular.module('ngRouteExample', ['ngRoute'])\n     *\n     *      .controller('MainController', function($scope, $route, $routeParams, $location) {\n     *          $scope.$route = $route;\n     *          $scope.$location = $location;\n     *          $scope.$routeParams = $routeParams;\n     *      })\n     *\n     *      .controller('BookController', function($scope, $routeParams) {\n     *          $scope.name = \"BookController\";\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *      .controller('ChapterController', function($scope, $routeParams) {\n     *          $scope.name = \"ChapterController\";\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *     .config(function($routeProvider, $locationProvider) {\n     *       $routeProvider\n     *        .when('/Book/:bookId', {\n     *         templateUrl: 'book.html',\n     *         controller: 'BookController',\n     *         resolve: {\n     *           // I will cause a 1 second delay\n     *           delay: function($q, $timeout) {\n     *             var delay = $q.defer();\n     *             $timeout(delay.resolve, 1000);\n     *             return delay.promise;\n     *           }\n     *         }\n     *       })\n     *       .when('/Book/:bookId/ch/:chapterId', {\n     *         templateUrl: 'chapter.html',\n     *         controller: 'ChapterController'\n     *       });\n     *\n     *       // configure html5 to get links working on jsfiddle\n     *       $locationProvider.html5Mode(true);\n     *     });\n     *\n     *   </file>\n     *\n     *   <file name=\"protractor.js\" type=\"protractor\">\n     *     it('should load and compile correct template', function() {\n     *       element(by.linkText('Moby: Ch1')).click();\n     *       var content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller\\: ChapterController/);\n     *       expect(content).toMatch(/Book Id\\: Moby/);\n     *       expect(content).toMatch(/Chapter Id\\: 1/);\n     *\n     *       element(by.partialLinkText('Scarlet')).click();\n     *\n     *       content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller\\: BookController/);\n     *       expect(content).toMatch(/Book Id\\: Scarlet/);\n     *     });\n     *   </file>\n     * </example>\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeStart\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted before a route change. At this  point the route services starts\n     * resolving all of the dependencies needed for the route change to occur.\n     * Typically this involves fetching the view template as well as any dependencies\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\n     * `$routeChangeSuccess` is fired.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} next Future route information.\n     * @param {Route} current Current route information.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeSuccess\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted after a route dependencies are resolved.\n     * {@link ngRoute.directive:ngView ngView} listens for the directive\n     * to instantiate the controller and render the view.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} current Current route information.\n     * @param {Route|Undefined} previous Previous route information, or undefined if current is\n     * first route entered.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeError\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if any of the resolve promises are rejected.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current route information.\n     * @param {Route} previous Previous route information.\n     * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeUpdate\n     * @eventType broadcast on root scope\n     * @description\n     *\n     * The `reloadOnSearch` property has been set to false, and we are reusing the same\n     * instance of the Controller.\n     */\n\n    var forceReload = false,\n        $route = {\n          routes: routes,\n\n          /**\n           * @ngdoc method\n           * @name $route#reload\n           *\n           * @description\n           * Causes `$route` service to reload the current route even if\n           * {@link ng.$location $location} hasn't changed.\n           *\n           * As a result of that, {@link ngRoute.directive:ngView ngView}\n           * creates new scope, reinstantiates the controller.\n           */\n          reload: function() {\n            forceReload = true;\n            $rootScope.$evalAsync(updateRoute);\n          }\n        };\n\n    $rootScope.$on('$locationChangeSuccess', updateRoute);\n\n    return $route;\n\n    /////////////////////////////////////////////////////\n\n    /**\n     * @param on {string} current url\n     * @param route {Object} route regexp to match the url against\n     * @return {?Object}\n     *\n     * @description\n     * Check if the route matches the current url.\n     *\n     * Inspired by match in\n     * visionmedia/express/lib/router/router.js.\n     */\n    function switchRouteMatcher(on, route) {\n      var keys = route.keys,\n          params = {};\n\n      if (!route.regexp) return null;\n\n      var m = route.regexp.exec(on);\n      if (!m) return null;\n\n      for (var i = 1, len = m.length; i < len; ++i) {\n        var key = keys[i - 1];\n\n        var val = 'string' == typeof m[i]\n              ? decodeURIComponent(m[i])\n              : m[i];\n\n        if (key && val) {\n          params[key.name] = val;\n        }\n      }\n      return params;\n    }\n\n    function updateRoute() {\n      var next = parseRoute(),\n          last = $route.current;\n\n      if (next && last && next.$$route === last.$$route\n          && angular.equals(next.pathParams, last.pathParams)\n          && !next.reloadOnSearch && !forceReload) {\n        last.params = next.params;\n        angular.copy(last.params, $routeParams);\n        $rootScope.$broadcast('$routeUpdate', last);\n      } else if (next || last) {\n        forceReload = false;\n        $rootScope.$broadcast('$routeChangeStart', next, last);\n        $route.current = next;\n        if (next) {\n          if (next.redirectTo) {\n            if (angular.isString(next.redirectTo)) {\n              $location.path(interpolate(next.redirectTo, next.params)).search(next.params)\n                       .replace();\n            } else {\n              $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))\n                       .replace();\n            }\n          }\n        }\n\n        $q.when(next).\n          then(function() {\n            if (next) {\n              var locals = angular.extend({}, next.resolve),\n                  template, templateUrl;\n\n              angular.forEach(locals, function(value, key) {\n                locals[key] = angular.isString(value) ?\n                    $injector.get(value) : $injector.invoke(value, null, null, key);\n              });\n\n              if (angular.isDefined(template = next.template)) {\n                if (angular.isFunction(template)) {\n                  template = template(next.params);\n                }\n              } else if (angular.isDefined(templateUrl = next.templateUrl)) {\n                if (angular.isFunction(templateUrl)) {\n                  templateUrl = templateUrl(next.params);\n                }\n                templateUrl = $sce.getTrustedResourceUrl(templateUrl);\n                if (angular.isDefined(templateUrl)) {\n                  next.loadedTemplateUrl = templateUrl;\n                  template = $http.get(templateUrl, {cache: $templateCache}).\n                      then(function(response) { return response.data; });\n                }\n              }\n              if (angular.isDefined(template)) {\n                locals['$template'] = template;\n              }\n              return $q.all(locals);\n            }\n          }).\n          // after route change\n          then(function(locals) {\n            if (next == $route.current) {\n              if (next) {\n                next.locals = locals;\n                angular.copy(next.params, $routeParams);\n              }\n              $rootScope.$broadcast('$routeChangeSuccess', next, last);\n            }\n          }, function(error) {\n            if (next == $route.current) {\n              $rootScope.$broadcast('$routeChangeError', next, last, error);\n            }\n          });\n      }\n    }\n\n\n    /**\n     * @returns {Object} the current active route, by matching it against the URL\n     */\n    function parseRoute() {\n      // Match a route\n      var params, match;\n      angular.forEach(routes, function(route, path) {\n        if (!match && (params = switchRouteMatcher($location.path(), route))) {\n          match = inherit(route, {\n            params: angular.extend({}, $location.search(), params),\n            pathParams: params});\n          match.$$route = route;\n        }\n      });\n      // No route matched; fallback to \"otherwise\" route\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\n    }\n\n    /**\n     * @returns {string} interpolation of the redirect path with the parameters\n     */\n    function interpolate(string, params) {\n      var result = [];\n      angular.forEach((string||'').split(':'), function(segment, i) {\n        if (i === 0) {\n          result.push(segment);\n        } else {\n          var segmentMatch = segment.match(/(\\w+)(.*)/);\n          var key = segmentMatch[1];\n          result.push(params[key]);\n          result.push(segmentMatch[2] || '');\n          delete params[key];\n        }\n      });\n      return result.join('');\n    }\n  }];\n}\n\nngRouteModule.provider('$routeParams', $RouteParamsProvider);\n\n\n/**\n * @ngdoc service\n * @name $routeParams\n * @requires $route\n *\n * @description\n * The `$routeParams` service allows you to retrieve the current set of route parameters.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * The route parameters are a combination of {@link ng.$location `$location`}'s\n * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.\n * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.\n *\n * In case of parameter name collision, `path` params take precedence over `search` params.\n *\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\n * (but its properties will likely change) even when a route change occurs.\n *\n * Note that the `$routeParams` are only updated *after* a route change completes successfully.\n * This means that you cannot rely on `$routeParams` being correct in route resolve functions.\n * Instead you can use `$route.current.params` to access the new route's parameters.\n *\n * @example\n * ```js\n *  // Given:\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\n *  // Route: /Chapter/:chapterId/Section/:sectionId\n *  //\n *  // Then\n *  $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}\n * ```\n */\nfunction $RouteParamsProvider() {\n  this.$get = function() { return {}; };\n}\n\nngRouteModule.directive('ngView', ngViewFactory);\nngRouteModule.directive('ngView', ngViewFillContentFactory);\n\n\n/**\n * @ngdoc directive\n * @name ngView\n * @restrict ECA\n *\n * @description\n * # Overview\n * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by\n * including the rendered template of the current route into the main layout (`index.html`) file.\n * Every time the current route changes, the included view changes with it according to the\n * configuration of the `$route` service.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * @animations\n * enter - animation is used to bring new content into the browser.\n * leave - animation is used to animate existing content away.\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n * @param {string=} onload Expression to evaluate whenever the view updates.\n *\n * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the view is updated.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated\n *                    as an expression yields a truthy value.\n * @example\n    <example name=\"ngView-directive\" module=\"ngViewExample\"\n             deps=\"angular-route.js;angular-animate.js\"\n             animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n        <div ng-controller=\"MainCtrl as main\">\n          Choose:\n          <a href=\"Book/Moby\">Moby</a> |\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n          <a href=\"Book/Gatsby\">Gatsby</a> |\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n\n          <div class=\"view-animate-container\">\n            <div ng-view class=\"view-animate\"></div>\n          </div>\n          <hr />\n\n          <pre>$location.path() = {{main.$location.path()}}</pre>\n          <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>\n          <pre>$route.current.params = {{main.$route.current.params}}</pre>\n          <pre>$routeParams = {{main.$routeParams}}</pre>\n        </div>\n      </file>\n\n      <file name=\"book.html\">\n        <div>\n          controller: {{book.name}}<br />\n          Book Id: {{book.params.bookId}}<br />\n        </div>\n      </file>\n\n      <file name=\"chapter.html\">\n        <div>\n          controller: {{chapter.name}}<br />\n          Book Id: {{chapter.params.bookId}}<br />\n          Chapter Id: {{chapter.params.chapterId}}\n        </div>\n      </file>\n\n      <file name=\"animations.css\">\n        .view-animate-container {\n          position:relative;\n          height:100px!important;\n          position:relative;\n          background:white;\n          border:1px solid black;\n          height:40px;\n          overflow:hidden;\n        }\n\n        .view-animate {\n          padding:10px;\n        }\n\n        .view-animate.ng-enter, .view-animate.ng-leave {\n          -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n          transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n\n          display:block;\n          width:100%;\n          border-left:1px solid black;\n\n          position:absolute;\n          top:0;\n          left:0;\n          right:0;\n          bottom:0;\n          padding:10px;\n        }\n\n        .view-animate.ng-enter {\n          left:100%;\n        }\n        .view-animate.ng-enter.ng-enter-active {\n          left:0;\n        }\n        .view-animate.ng-leave.ng-leave-active {\n          left:-100%;\n        }\n      </file>\n\n      <file name=\"script.js\">\n        angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])\n          .config(['$routeProvider', '$locationProvider',\n            function($routeProvider, $locationProvider) {\n              $routeProvider\n                .when('/Book/:bookId', {\n                  templateUrl: 'book.html',\n                  controller: 'BookCtrl',\n                  controllerAs: 'book'\n                })\n                .when('/Book/:bookId/ch/:chapterId', {\n                  templateUrl: 'chapter.html',\n                  controller: 'ChapterCtrl',\n                  controllerAs: 'chapter'\n                });\n\n              // configure html5 to get links working on jsfiddle\n              $locationProvider.html5Mode(true);\n          }])\n          .controller('MainCtrl', ['$route', '$routeParams', '$location',\n            function($route, $routeParams, $location) {\n              this.$route = $route;\n              this.$location = $location;\n              this.$routeParams = $routeParams;\n          }])\n          .controller('BookCtrl', ['$routeParams', function($routeParams) {\n            this.name = \"BookCtrl\";\n            this.params = $routeParams;\n          }])\n          .controller('ChapterCtrl', ['$routeParams', function($routeParams) {\n            this.name = \"ChapterCtrl\";\n            this.params = $routeParams;\n          }]);\n\n      </file>\n\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should load and compile correct template', function() {\n          element(by.linkText('Moby: Ch1')).click();\n          var content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller\\: ChapterCtrl/);\n          expect(content).toMatch(/Book Id\\: Moby/);\n          expect(content).toMatch(/Chapter Id\\: 1/);\n\n          element(by.partialLinkText('Scarlet')).click();\n\n          content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller\\: BookCtrl/);\n          expect(content).toMatch(/Book Id\\: Scarlet/);\n        });\n      </file>\n    </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngView#$viewContentLoaded\n * @eventType emit on the current ngView scope\n * @description\n * Emitted every time the ngView content is reloaded.\n */\nngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];\nfunction ngViewFactory(   $route,   $anchorScroll,   $animate) {\n  return {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    link: function(scope, $element, attr, ctrl, $transclude) {\n        var currentScope,\n            currentElement,\n            previousElement,\n            autoScrollExp = attr.autoscroll,\n            onloadExp = attr.onload || '';\n\n        scope.$on('$routeChangeSuccess', update);\n        update();\n\n        function cleanupLastView() {\n          if(previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if(currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if(currentElement) {\n            $animate.leave(currentElement, function() {\n              previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        }\n\n        function update() {\n          var locals = $route.current && $route.current.locals,\n              template = locals && locals.$template;\n\n          if (angular.isDefined(template)) {\n            var newScope = scope.$new();\n            var current = $route.current;\n\n            // Note: This will also link all children of ng-view that were contained in the original\n            // html. If that content contains controllers, ... they could pollute/change the scope.\n            // However, using ng-view on an element with additional content does not make sense...\n            // Note: We can't remove them in the cloneAttchFn of $transclude as that\n            // function is called before linking the content, which would apply child\n            // directives to non existing elements.\n            var clone = $transclude(newScope, function(clone) {\n              $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {\n                if (angular.isDefined(autoScrollExp)\n                  && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                  $anchorScroll();\n                }\n              });\n              cleanupLastView();\n            });\n\n            currentElement = clone;\n            currentScope = current.scope = newScope;\n            currentScope.$emit('$viewContentLoaded');\n            currentScope.$eval(onloadExp);\n          } else {\n            cleanupLastView();\n          }\n        }\n    }\n  };\n}\n\n// This directive is called during the $transclude call of the first `ngView` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngView\n// is called.\nngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];\nfunction ngViewFillContentFactory($compile, $controller, $route) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    link: function(scope, $element) {\n      var current = $route.current,\n          locals = current.locals;\n\n      $element.html(locals.$template);\n\n      var link = $compile($element.contents());\n\n      if (current.controller) {\n        locals.$scope = scope;\n        var controller = $controller(current.controller, locals);\n        if (current.controllerAs) {\n          scope[current.controllerAs] = controller;\n        }\n        $element.data('$ngControllerController', controller);\n        $element.children().data('$ngControllerController', controller);\n      }\n\n      link(scope);\n    }\n  };\n}\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "demo/my-show-4-angularjs/js/angular-ui-router.js",
    "content": "/**\n * State-based routing for AngularJS\n * @version v0.2.10\n * @link http://angular-ui.github.com/\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n\n/* commonjs package manager support (eg componentjs) */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports){\n  module.exports = 'ui.router';\n}\n\n(function (window, angular, undefined) {\n/*jshint globalstrict:true*/\n/*global angular:false*/\n'use strict';\n\nvar isDefined = angular.isDefined,\n    isFunction = angular.isFunction,\n    isString = angular.isString,\n    isObject = angular.isObject,\n    isArray = angular.isArray,\n    forEach = angular.forEach,\n    extend = angular.extend,\n    copy = angular.copy;\n\nfunction inherit(parent, extra) {\n  return extend(new (extend(function() {}, { prototype: parent }))(), extra);\n}\n\nfunction merge(dst) {\n  forEach(arguments, function(obj) {\n    if (obj !== dst) {\n      forEach(obj, function(value, key) {\n        if (!dst.hasOwnProperty(key)) dst[key] = value;\n      });\n    }\n  });\n  return dst;\n}\n\n/**\n * Finds the common ancestor path between two states.\n *\n * @param {Object} first The first state.\n * @param {Object} second The second state.\n * @return {Array} Returns an array of state names in descending order, not including the root.\n */\nfunction ancestors(first, second) {\n  var path = [];\n\n  for (var n in first.path) {\n    if (first.path[n] !== second.path[n]) break;\n    path.push(first.path[n]);\n  }\n  return path;\n}\n\n/**\n * IE8-safe wrapper for `Object.keys()`.\n *\n * @param {Object} object A JavaScript object.\n * @return {Array} Returns the keys of the object as an array.\n */\nfunction keys(object) {\n  if (Object.keys) {\n    return Object.keys(object);\n  }\n  var result = [];\n\n  angular.forEach(object, function(val, key) {\n    result.push(key);\n  });\n  return result;\n}\n\n/**\n * IE8-safe wrapper for `Array.prototype.indexOf()`.\n *\n * @param {Array} array A JavaScript array.\n * @param {*} value A value to search the array for.\n * @return {Number} Returns the array index value of `value`, or `-1` if not present.\n */\nfunction arraySearch(array, value) {\n  if (Array.prototype.indexOf) {\n    return array.indexOf(value, Number(arguments[2]) || 0);\n  }\n  var len = array.length >>> 0, from = Number(arguments[2]) || 0;\n  from = (from < 0) ? Math.ceil(from) : Math.floor(from);\n\n  if (from < 0) from += len;\n\n  for (; from < len; from++) {\n    if (from in array && array[from] === value) return from;\n  }\n  return -1;\n}\n\n/**\n * Merges a set of parameters with all parameters inherited between the common parents of the\n * current state and a given destination state.\n *\n * @param {Object} currentParams The value of the current state parameters ($stateParams).\n * @param {Object} newParams The set of parameters which will be composited with inherited params.\n * @param {Object} $current Internal definition of object representing the current state.\n * @param {Object} $to Internal definition of object representing state to transition to.\n */\nfunction inheritParams(currentParams, newParams, $current, $to) {\n  var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = [];\n\n  for (var i in parents) {\n    if (!parents[i].params || !parents[i].params.length) continue;\n    parentParams = parents[i].params;\n\n    for (var j in parentParams) {\n      if (arraySearch(inheritList, parentParams[j]) >= 0) continue;\n      inheritList.push(parentParams[j]);\n      inherited[parentParams[j]] = currentParams[parentParams[j]];\n    }\n  }\n  return extend({}, inherited, newParams);\n}\n\n/**\n * Normalizes a set of values to string or `null`, filtering them by a list of keys.\n *\n * @param {Array} keys The list of keys to normalize/return.\n * @param {Object} values An object hash of values to normalize.\n * @return {Object} Returns an object hash of normalized string values.\n */\nfunction normalize(keys, values) {\n  var normalized = {};\n\n  forEach(keys, function (name) {\n    var value = values[name];\n    normalized[name] = (value != null) ? String(value) : null;\n  });\n  return normalized;\n}\n\n/**\n * Performs a non-strict comparison of the subset of two objects, defined by a list of keys.\n *\n * @param {Object} a The first object.\n * @param {Object} b The second object.\n * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified,\n *                     it defaults to the list of keys in `a`.\n * @return {Boolean} Returns `true` if the keys match, otherwise `false`.\n */\nfunction equalForKeys(a, b, keys) {\n  if (!keys) {\n    keys = [];\n    for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility\n  }\n\n  for (var i=0; i<keys.length; i++) {\n    var k = keys[i];\n    if (a[k] != b[k]) return false; // Not '===', values aren't necessarily normalized\n  }\n  return true;\n}\n\n/**\n * Returns the subset of an object, based on a list of keys.\n *\n * @param {Array} keys\n * @param {Object} values\n * @return {Boolean} Returns a subset of `values`.\n */\nfunction filterByKeys(keys, values) {\n  var filtered = {};\n\n  forEach(keys, function (name) {\n    filtered[name] = values[name];\n  });\n  return filtered;\n}\n/**\n * @ngdoc overview\n * @name ui.router.util\n *\n * @description\n * # ui.router.util sub-module\n *\n * This module is a dependency of other sub-modules. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n *\n */\nangular.module('ui.router.util', ['ng']);\n\n/**\n * @ngdoc overview\n * @name ui.router.router\n * \n * @requires ui.router.util\n *\n * @description\n * # ui.router.router sub-module\n *\n * This module is a dependency of other sub-modules. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n */\nangular.module('ui.router.router', ['ui.router.util']);\n\n/**\n * @ngdoc overview\n * @name ui.router.state\n * \n * @requires ui.router.router\n * @requires ui.router.util\n *\n * @description\n * # ui.router.state sub-module\n *\n * This module is a dependency of the main ui.router module. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n * \n */\nangular.module('ui.router.state', ['ui.router.router', 'ui.router.util']);\n\n/**\n * @ngdoc overview\n * @name ui.router\n *\n * @requires ui.router.state\n *\n * @description\n * # ui.router\n * \n * ## The main module for ui.router \n * There are several sub-modules included with the ui.router module, however only this module is needed\n * as a dependency within your angular app. The other modules are for organization purposes. \n *\n * The modules are:\n * * ui.router - the main \"umbrella\" module\n * * ui.router.router - \n * \n * *You'll need to include **only** this module as the dependency within your angular app.*\n * \n * <pre>\n * <!doctype html>\n * <html ng-app=\"myApp\">\n * <head>\n *   <script src=\"js/angular.js\"></script>\n *   <!-- Include the ui-router script -->\n *   <script src=\"js/angular-ui-router.min.js\"></script>\n *   <script>\n *     // ...and add 'ui.router' as a dependency\n *     var myApp = angular.module('myApp', ['ui.router']);\n *   </script>\n * </head>\n * <body>\n * </body>\n * </html>\n * </pre>\n */\nangular.module('ui.router', ['ui.router.state']);\n\nangular.module('ui.router.compat', ['ui.router']);\n\n/**\n * @ngdoc object\n * @name ui.router.util.$resolve\n *\n * @requires $q\n * @requires $injector\n *\n * @description\n * Manages resolution of (acyclic) graphs of promises.\n */\n$Resolve.$inject = ['$q', '$injector'];\nfunction $Resolve(  $q,    $injector) {\n  \n  var VISIT_IN_PROGRESS = 1,\n      VISIT_DONE = 2,\n      NOTHING = {},\n      NO_DEPENDENCIES = [],\n      NO_LOCALS = NOTHING,\n      NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING });\n  \n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$resolve#study\n   * @methodOf ui.router.util.$resolve\n   *\n   * @description\n   * Studies a set of invocables that are likely to be used multiple times.\n   * <pre>\n   * $resolve.study(invocables)(locals, parent, self)\n   * </pre>\n   * is equivalent to\n   * <pre>\n   * $resolve.resolve(invocables, locals, parent, self)\n   * </pre>\n   * but the former is more efficient (in fact `resolve` just calls `study` \n   * internally).\n   *\n   * @param {object} invocables Invocable objects\n   * @return {function} a function to pass in locals, parent and self\n   */\n  this.study = function (invocables) {\n    if (!isObject(invocables)) throw new Error(\"'invocables' must be an object\");\n    \n    // Perform a topological sort of invocables to build an ordered plan\n    var plan = [], cycle = [], visited = {};\n    function visit(value, key) {\n      if (visited[key] === VISIT_DONE) return;\n      \n      cycle.push(key);\n      if (visited[key] === VISIT_IN_PROGRESS) {\n        cycle.splice(0, cycle.indexOf(key));\n        throw new Error(\"Cyclic dependency: \" + cycle.join(\" -> \"));\n      }\n      visited[key] = VISIT_IN_PROGRESS;\n      \n      if (isString(value)) {\n        plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES);\n      } else {\n        var params = $injector.annotate(value);\n        forEach(params, function (param) {\n          if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param);\n        });\n        plan.push(key, value, params);\n      }\n      \n      cycle.pop();\n      visited[key] = VISIT_DONE;\n    }\n    forEach(invocables, visit);\n    invocables = cycle = visited = null; // plan is all that's required\n    \n    function isResolve(value) {\n      return isObject(value) && value.then && value.$$promises;\n    }\n    \n    return function (locals, parent, self) {\n      if (isResolve(locals) && self === undefined) {\n        self = parent; parent = locals; locals = null;\n      }\n      if (!locals) locals = NO_LOCALS;\n      else if (!isObject(locals)) {\n        throw new Error(\"'locals' must be an object\");\n      }       \n      if (!parent) parent = NO_PARENT;\n      else if (!isResolve(parent)) {\n        throw new Error(\"'parent' must be a promise returned by $resolve.resolve()\");\n      }\n      \n      // To complete the overall resolution, we have to wait for the parent\n      // promise and for the promise for each invokable in our plan.\n      var resolution = $q.defer(),\n          result = resolution.promise,\n          promises = result.$$promises = {},\n          values = extend({}, locals),\n          wait = 1 + plan.length/3,\n          merged = false;\n          \n      function done() {\n        // Merge parent values we haven't got yet and publish our own $$values\n        if (!--wait) {\n          if (!merged) merge(values, parent.$$values); \n          result.$$values = values;\n          result.$$promises = true; // keep for isResolve()\n          resolution.resolve(values);\n        }\n      }\n      \n      function fail(reason) {\n        result.$$failure = reason;\n        resolution.reject(reason);\n      }\n      \n      // Short-circuit if parent has already failed\n      if (isDefined(parent.$$failure)) {\n        fail(parent.$$failure);\n        return result;\n      }\n      \n      // Merge parent values if the parent has already resolved, or merge\n      // parent promises and wait if the parent resolve is still in progress.\n      if (parent.$$values) {\n        merged = merge(values, parent.$$values);\n        done();\n      } else {\n        extend(promises, parent.$$promises);\n        parent.then(done, fail);\n      }\n      \n      // Process each invocable in the plan, but ignore any where a local of the same name exists.\n      for (var i=0, ii=plan.length; i<ii; i+=3) {\n        if (locals.hasOwnProperty(plan[i])) done();\n        else invoke(plan[i], plan[i+1], plan[i+2]);\n      }\n      \n      function invoke(key, invocable, params) {\n        // Create a deferred for this invocation. Failures will propagate to the resolution as well.\n        var invocation = $q.defer(), waitParams = 0;\n        function onfailure(reason) {\n          invocation.reject(reason);\n          fail(reason);\n        }\n        // Wait for any parameter that we have a promise for (either from parent or from this\n        // resolve; in that case study() will have made sure it's ordered before us in the plan).\n        forEach(params, function (dep) {\n          if (promises.hasOwnProperty(dep) && !locals.hasOwnProperty(dep)) {\n            waitParams++;\n            promises[dep].then(function (result) {\n              values[dep] = result;\n              if (!(--waitParams)) proceed();\n            }, onfailure);\n          }\n        });\n        if (!waitParams) proceed();\n        function proceed() {\n          if (isDefined(result.$$failure)) return;\n          try {\n            invocation.resolve($injector.invoke(invocable, self, values));\n            invocation.promise.then(function (result) {\n              values[key] = result;\n              done();\n            }, onfailure);\n          } catch (e) {\n            onfailure(e);\n          }\n        }\n        // Publish promise synchronously; invocations further down in the plan may depend on it.\n        promises[key] = invocation.promise;\n      }\n      \n      return result;\n    };\n  };\n  \n  /**\n   * @ngdoc function\n   * @name ui.router.util.$resolve#resolve\n   * @methodOf ui.router.util.$resolve\n   *\n   * @description\n   * Resolves a set of invocables. An invocable is a function to be invoked via \n   * `$injector.invoke()`, and can have an arbitrary number of dependencies. \n   * An invocable can either return a value directly,\n   * or a `$q` promise. If a promise is returned it will be resolved and the \n   * resulting value will be used instead. Dependencies of invocables are resolved \n   * (in this order of precedence)\n   *\n   * - from the specified `locals`\n   * - from another invocable that is part of this `$resolve` call\n   * - from an invocable that is inherited from a `parent` call to `$resolve` \n   *   (or recursively\n   * - from any ancestor `$resolve` of that parent).\n   *\n   * The return value of `$resolve` is a promise for an object that contains \n   * (in this order of precedence)\n   *\n   * - any `locals` (if specified)\n   * - the resolved return values of all injectables\n   * - any values inherited from a `parent` call to `$resolve` (if specified)\n   *\n   * The promise will resolve after the `parent` promise (if any) and all promises \n   * returned by injectables have been resolved. If any invocable \n   * (or `$injector.invoke`) throws an exception, or if a promise returned by an \n   * invocable is rejected, the `$resolve` promise is immediately rejected with the \n   * same error. A rejection of a `parent` promise (if specified) will likewise be \n   * propagated immediately. Once the `$resolve` promise has been rejected, no \n   * further invocables will be called.\n   * \n   * Cyclic dependencies between invocables are not permitted and will caues `$resolve`\n   * to throw an error. As a special case, an injectable can depend on a parameter \n   * with the same name as the injectable, which will be fulfilled from the `parent` \n   * injectable of the same name. This allows inherited values to be decorated. \n   * Note that in this case any other injectable in the same `$resolve` with the same\n   * dependency would see the decorated value, not the inherited value.\n   *\n   * Note that missing dependencies -- unlike cyclic dependencies -- will cause an \n   * (asynchronous) rejection of the `$resolve` promise rather than a (synchronous) \n   * exception.\n   *\n   * Invocables are invoked eagerly as soon as all dependencies are available. \n   * This is true even for dependencies inherited from a `parent` call to `$resolve`.\n   *\n   * As a special case, an invocable can be a string, in which case it is taken to \n   * be a service name to be passed to `$injector.get()`. This is supported primarily \n   * for backwards-compatibility with the `resolve` property of `$routeProvider` \n   * routes.\n   *\n   * @param {object} invocables functions to invoke or \n   * `$injector` services to fetch.\n   * @param {object} locals  values to make available to the injectables\n   * @param {object} parent  a promise returned by another call to `$resolve`.\n   * @param {object} self  the `this` for the invoked methods\n   * @return {object} Promise for an object that contains the resolved return value\n   * of all invocables, as well as any inherited and local values.\n   */\n  this.resolve = function (invocables, locals, parent, self) {\n    return this.study(invocables)(locals, parent, self);\n  };\n}\n\nangular.module('ui.router.util').service('$resolve', $Resolve);\n\n\n/**\n * @ngdoc object\n * @name ui.router.util.$templateFactory\n *\n * @requires $http\n * @requires $templateCache\n * @requires $injector\n *\n * @description\n * Service. Manages loading of templates.\n */\n$TemplateFactory.$inject = ['$http', '$templateCache', '$injector'];\nfunction $TemplateFactory(  $http,   $templateCache,   $injector) {\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromConfig\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template from a configuration object. \n   *\n   * @param {object} config Configuration object for which to load a template. \n   * The following properties are search in the specified order, and the first one \n   * that is defined is used to create the template:\n   *\n   * @param {string|object} config.template html string template or function to \n   * load via {@link ui.router.util.$templateFactory#fromString fromString}.\n   * @param {string|object} config.templateUrl url to load or a function returning \n   * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}.\n   * @param {Function} config.templateProvider function to invoke via \n   * {@link ui.router.util.$templateFactory#fromProvider fromProvider}.\n   * @param {object} params  Parameters to pass to the template function.\n   * @param {object} locals Locals to pass to `invoke` if the template is loaded \n   * via a `templateProvider`. Defaults to `{ params: params }`.\n   *\n   * @return {string|object}  The template html as a string, or a promise for \n   * that string,or `null` if no template is configured.\n   */\n  this.fromConfig = function (config, params, locals) {\n    return (\n      isDefined(config.template) ? this.fromString(config.template, params) :\n      isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) :\n      isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) :\n      null\n    );\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromString\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template from a string or a function returning a string.\n   *\n   * @param {string|object} template html template as a string or function that \n   * returns an html template as a string.\n   * @param {object} params Parameters to pass to the template function.\n   *\n   * @return {string|object} The template html as a string, or a promise for that \n   * string.\n   */\n  this.fromString = function (template, params) {\n    return isFunction(template) ? template(params) : template;\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromUrl\n   * @methodOf ui.router.util.$templateFactory\n   * \n   * @description\n   * Loads a template from the a URL via `$http` and `$templateCache`.\n   *\n   * @param {string|Function} url url of the template to load, or a function \n   * that returns a url.\n   * @param {Object} params Parameters to pass to the url function.\n   * @return {string|Promise.<string>} The template html as a string, or a promise \n   * for that string.\n   */\n  this.fromUrl = function (url, params) {\n    if (isFunction(url)) url = url(params);\n    if (url == null) return null;\n    else return $http\n        .get(url, { cache: $templateCache })\n        .then(function(response) { return response.data; });\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromUrl\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template by invoking an injectable provider function.\n   *\n   * @param {Function} provider Function to invoke via `$injector.invoke`\n   * @param {Object} params Parameters for the template.\n   * @param {Object} locals Locals to pass to `invoke`. Defaults to \n   * `{ params: params }`.\n   * @return {string|Promise.<string>} The template html as a string, or a promise \n   * for that string.\n   */\n  this.fromProvider = function (provider, params, locals) {\n    return $injector.invoke(provider, null, locals || { params: params });\n  };\n}\n\nangular.module('ui.router.util').service('$templateFactory', $TemplateFactory);\n\n/**\n * @ngdoc object\n * @name ui.router.util.type:UrlMatcher\n *\n * @description\n * Matches URLs against patterns and extracts named parameters from the path or the search\n * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list\n * of search parameters. Multiple search parameter names are separated by '&'. Search parameters\n * do not influence whether or not a URL is matched, but their values are passed through into\n * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}.\n * \n * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace\n * syntax, which optionally allows a regular expression for the parameter to be specified:\n *\n * * `':'` name - colon placeholder\n * * `'*'` name - catch-all placeholder\n * * `'{' name '}'` - curly placeholder\n * * `'{' name ':' regexp '}'` - curly placeholder with regexp. Should the regexp itself contain\n *   curly braces, they must be in matched pairs or escaped with a backslash.\n *\n * Parameter names may contain only word characters (latin letters, digits, and underscore) and\n * must be unique within the pattern (across both path and search parameters). For colon \n * placeholders or curly placeholders without an explicit regexp, a path parameter matches any\n * number of characters other than '/'. For catch-all placeholders the path parameter matches\n * any number of characters.\n * \n * Examples:\n * \n * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for\n *   trailing slashes, and patterns have to match the entire path, not just a prefix.\n * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or\n *   '/user/bob/details'. The second path segment will be captured as the parameter 'id'.\n * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax.\n * * `'/user/{id:[^/]*}'` - Same as the previous example.\n * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id\n *   parameter consists of 1 to 8 hex digits.\n * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the\n *   path into the parameter 'path'.\n * * `'/files/*path'` - ditto.\n *\n * @param {string} pattern  the pattern to compile into a matcher.\n *\n * @property {string} prefix  A static prefix of this pattern. The matcher guarantees that any\n *   URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns\n *   non-null) will start with this prefix.\n *\n * @property {string} source  The pattern that was passed into the contructor\n *\n * @property {string} sourcePath  The path portion of the source property\n *\n * @property {string} sourceSearch  The search portion of the source property\n *\n * @property {string} regex  The constructed regex that will be used to match against the url when \n *   it is time to determine which url will match.\n *\n * @returns {Object}  New UrlMatcher object\n */\nfunction UrlMatcher(pattern) {\n\n  // Find all placeholders and create a compiled pattern, using either classic or curly syntax:\n  //   '*' name\n  //   ':' name\n  //   '{' name '}'\n  //   '{' name ':' regexp '}'\n  // The regular expression is somewhat complicated due to the need to allow curly braces\n  // inside the regular expression. The placeholder regexp breaks down as follows:\n  //    ([:*])(\\w+)               classic placeholder ($1 / $2)\n  //    \\{(\\w+)(?:\\:( ... ))?\\}   curly brace placeholder ($3) with optional regexp ... ($4)\n  //    (?: ... | ... | ... )+    the regexp consists of any number of atoms, an atom being either\n  //    [^{}\\\\]+                  - anything other than curly braces or backslash\n  //    \\\\.                       - a backslash escape\n  //    \\{(?:[^{}\\\\]+|\\\\.)*\\}     - a matched set of curly braces containing other atoms\n  var placeholder = /([:*])(\\w+)|\\{(\\w+)(?:\\:((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g,\n      names = {}, compiled = '^', last = 0, m,\n      segments = this.segments = [],\n      params = this.params = [];\n\n  function addParameter(id) {\n    if (!/^\\w+(-+\\w+)*$/.test(id)) throw new Error(\"Invalid parameter name '\" + id + \"' in pattern '\" + pattern + \"'\");\n    if (names[id]) throw new Error(\"Duplicate parameter name '\" + id + \"' in pattern '\" + pattern + \"'\");\n    names[id] = true;\n    params.push(id);\n  }\n\n  function quoteRegExp(string) {\n    return string.replace(/[\\\\\\[\\]\\^$*+?.()|{}]/g, \"\\\\$&\");\n  }\n\n  this.source = pattern;\n\n  // Split into static segments separated by path parameter placeholders.\n  // The number of segments is always 1 more than the number of parameters.\n  var id, regexp, segment;\n  while ((m = placeholder.exec(pattern))) {\n    id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null\n    regexp = m[4] || (m[1] == '*' ? '.*' : '[^/]*');\n    segment = pattern.substring(last, m.index);\n    if (segment.indexOf('?') >= 0) break; // we're into the search part\n    compiled += quoteRegExp(segment) + '(' + regexp + ')';\n    addParameter(id);\n    segments.push(segment);\n    last = placeholder.lastIndex;\n  }\n  segment = pattern.substring(last);\n\n  // Find any search parameter names and remove them from the last segment\n  var i = segment.indexOf('?');\n  if (i >= 0) {\n    var search = this.sourceSearch = segment.substring(i);\n    segment = segment.substring(0, i);\n    this.sourcePath = pattern.substring(0, last+i);\n\n    // Allow parameters to be separated by '?' as well as '&' to make concat() easier\n    forEach(search.substring(1).split(/[&?]/), addParameter);\n  } else {\n    this.sourcePath = pattern;\n    this.sourceSearch = '';\n  }\n\n  compiled += quoteRegExp(segment) + '$';\n  segments.push(segment);\n  this.regexp = new RegExp(compiled);\n  this.prefix = segments[0];\n}\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#concat\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Returns a new matcher for a pattern constructed by appending the path part and adding the\n * search parameters of the specified pattern to this pattern. The current pattern is not\n * modified. This can be understood as creating a pattern for URLs that are relative to (or\n * suffixes of) the current pattern.\n *\n * @example\n * The following two matchers are equivalent:\n * ```\n * new UrlMatcher('/user/{id}?q').concat('/details?date');\n * new UrlMatcher('/user/{id}/details?q&date');\n * ```\n *\n * @param {string} pattern  The pattern to append.\n * @returns {ui.router.util.type:UrlMatcher}  A matcher for the concatenated pattern.\n */\nUrlMatcher.prototype.concat = function (pattern) {\n  // Because order of search parameters is irrelevant, we can add our own search\n  // parameters to the end of the new pattern. Parse the new pattern by itself\n  // and then join the bits together, but it's much easier to do this on a string level.\n  return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch);\n};\n\nUrlMatcher.prototype.toString = function () {\n  return this.source;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#exec\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Tests the specified path against this matcher, and returns an object containing the captured\n * parameter values, or null if the path does not match. The returned object contains the values\n * of any search parameters that are mentioned in the pattern, but their value may be null if\n * they are not present in `searchParams`. This means that search parameters are always treated\n * as optional.\n *\n * @example\n * ```\n * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', { x:'1', q:'hello' });\n * // returns { id:'bob', q:'hello', r:null }\n * ```\n *\n * @param {string} path  The URL path to match, e.g. `$location.path()`.\n * @param {Object} searchParams  URL search parameters, e.g. `$location.search()`.\n * @returns {Object}  The captured parameter values.\n */\nUrlMatcher.prototype.exec = function (path, searchParams) {\n  var m = this.regexp.exec(path);\n  if (!m) return null;\n\n  var params = this.params, nTotal = params.length,\n    nPath = this.segments.length-1,\n    values = {}, i;\n\n  if (nPath !== m.length - 1) throw new Error(\"Unbalanced capture group in route '\" + this.source + \"'\");\n\n  for (i=0; i<nPath; i++) values[params[i]] = m[i+1];\n  for (/**/; i<nTotal; i++) values[params[i]] = searchParams[params[i]];\n\n  return values;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#parameters\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Returns the names of all path and search parameters of this pattern in an unspecified order.\n * \n * @returns {Array.<string>}  An array of parameter names. Must be treated as read-only. If the\n *    pattern has no parameters, an empty array is returned.\n */\nUrlMatcher.prototype.parameters = function () {\n  return this.params;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#format\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Creates a URL that matches this pattern by substituting the specified values\n * for the path and search parameters. Null values for path parameters are\n * treated as empty strings.\n *\n * @example\n * ```\n * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });\n * // returns '/user/bob?q=yes'\n * ```\n *\n * @param {Object} values  the values to substitute for the parameters in this pattern.\n * @returns {string}  the formatted URL (path and optionally search part).\n */\nUrlMatcher.prototype.format = function (values) {\n  var segments = this.segments, params = this.params;\n  if (!values) return segments.join('');\n\n  var nPath = segments.length-1, nTotal = params.length,\n    result = segments[0], i, search, value;\n\n  for (i=0; i<nPath; i++) {\n    value = values[params[i]];\n    // TODO: Maybe we should throw on null here? It's not really good style to use '' and null interchangeabley\n    if (value != null) result += encodeURIComponent(value);\n    result += segments[i+1];\n  }\n  for (/**/; i<nTotal; i++) {\n    value = values[params[i]];\n    if (value != null) {\n      result += (search ? '&' : '?') + params[i] + '=' + encodeURIComponent(value);\n      search = true;\n    }\n  }\n\n  return result;\n};\n\n\n\n/**\n * @ngdoc object\n * @name ui.router.util.$urlMatcherFactory\n *\n * @description\n * Factory for {@link ui.router.util.type:UrlMatcher} instances. The factory is also available to providers\n * under the name `$urlMatcherFactoryProvider`.\n */\nfunction $UrlMatcherFactory() {\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#compile\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Creates a {@link ui.router.util.type:UrlMatcher} for the specified pattern.\n   *   \n   * @param {string} pattern  The URL pattern.\n   * @returns {ui.router.util.type:UrlMatcher}  The UrlMatcher.\n   */\n  this.compile = function (pattern) {\n    return new UrlMatcher(pattern);\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#isMatcher\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Returns true if the specified object is a UrlMatcher, or false otherwise.\n   *\n   * @param {Object} object  The object to perform the type check against.\n   * @returns {Boolean}  Returns `true` if the object has the following functions: `exec`, `format`, and `concat`.\n   */\n  this.isMatcher = function (o) {\n    return isObject(o) && isFunction(o.exec) && isFunction(o.format) && isFunction(o.concat);\n  };\n  \n  /* No need to document $get, since it returns this */\n  this.$get = function () {\n    return this;\n  };\n}\n\n// Register as a provider so it's available to other providers\nangular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory);\n\n/**\n * @ngdoc object\n * @name ui.router.router.$urlRouterProvider\n *\n * @requires ui.router.util.$urlMatcherFactoryProvider\n *\n * @description\n * `$urlRouterProvider` has the responsibility of watching `$location`. \n * When `$location` changes it runs through a list of rules one by one until a \n * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify \n * a url in a state configuration. All urls are compiled into a UrlMatcher object.\n *\n * There are several methods on `$urlRouterProvider` that make it useful to use directly\n * in your module config.\n */\n$UrlRouterProvider.$inject = ['$urlMatcherFactoryProvider'];\nfunction $UrlRouterProvider(  $urlMatcherFactory) {\n  var rules = [], \n      otherwise = null;\n\n  // Returns a string that is a prefix of all strings matching the RegExp\n  function regExpPrefix(re) {\n    var prefix = /^\\^((?:\\\\[^a-zA-Z0-9]|[^\\\\\\[\\]\\^$*+?.()|{}]+)*)/.exec(re.source);\n    return (prefix != null) ? prefix[1].replace(/\\\\(.)/g, \"$1\") : '';\n  }\n\n  // Interpolates matched values into a String.replace()-style pattern\n  function interpolate(pattern, match) {\n    return pattern.replace(/\\$(\\$|\\d{1,2})/, function (m, what) {\n      return match[what === '$' ? 0 : Number(what)];\n    });\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.router.$urlRouterProvider#rule\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Defines rules that are used by `$urlRouterProvider to find matches for\n   * specific URLs.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   // Here's an example of how you might allow case insensitive urls\n   *   $urlRouterProvider.rule(function ($injector, $location) {\n   *     var path = $location.path(),\n   *         normalized = path.toLowerCase();\n   *\n   *     if (path !== normalized) {\n   *       return normalized;\n   *     }\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {object} rule Handler function that takes `$injector` and `$location`\n   * services as arguments. You can use them to return a valid path as a string.\n   *\n   * @return {object} $urlRouterProvider - $urlRouterProvider instance\n   */\n  this.rule =\n    function (rule) {\n      if (!isFunction(rule)) throw new Error(\"'rule' must be a function\");\n      rules.push(rule);\n      return this;\n    };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.router.$urlRouterProvider#otherwise\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Defines a path that is used when an invalied route is requested.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   // if the path doesn't match any of the urls you configured\n   *   // otherwise will take care of routing the user to the\n   *   // specified url\n   *   $urlRouterProvider.otherwise('/index');\n   *\n   *   // Example of using function rule as param\n   *   $urlRouterProvider.otherwise(function ($injector, $location) {\n   *     ...\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string|object} rule The url path you want to redirect to or a function \n   * rule that returns the url path. The function version is passed two params: \n   * `$injector` and `$location` services.\n   *\n   * @return {object} $urlRouterProvider - $urlRouterProvider instance\n   */\n  this.otherwise =\n    function (rule) {\n      if (isString(rule)) {\n        var redirect = rule;\n        rule = function () { return redirect; };\n      }\n      else if (!isFunction(rule)) throw new Error(\"'rule' must be a function\");\n      otherwise = rule;\n      return this;\n    };\n\n\n  function handleIfMatch($injector, handler, match) {\n    if (!match) return false;\n    var result = $injector.invoke(handler, handler, { $match: match });\n    return isDefined(result) ? result : true;\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.router.$urlRouterProvider#when\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Registers a handler for a given url matching. if handle is a string, it is\n   * treated as a redirect, and is interpolated according to the syyntax of match\n   * (i.e. like String.replace() for RegExp, or like a UrlMatcher pattern otherwise).\n   *\n   * If the handler is a function, it is injectable. It gets invoked if `$location`\n   * matches. You have the option of inject the match object as `$match`.\n   *\n   * The handler can return\n   *\n   * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter`\n   *   will continue trying to find another one that matches.\n   * - **string** which is treated as a redirect and passed to `$location.url()`\n   * - **void** or any **truthy** value tells `$urlRouter` that the url was handled.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   $urlRouterProvider.when($state.url, function ($match, $stateParams) {\n   *     if ($state.$current.navigable !== state ||\n   *         !equalForKeys($match, $stateParams) {\n   *      $state.transitionTo(state, $match, false);\n   *     }\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string|object} what The incoming path that you want to redirect.\n   * @param {string|object} handler The path you want to redirect your user to.\n   */\n  this.when =\n    function (what, handler) {\n      var redirect, handlerIsString = isString(handler);\n      if (isString(what)) what = $urlMatcherFactory.compile(what);\n\n      if (!handlerIsString && !isFunction(handler) && !isArray(handler))\n        throw new Error(\"invalid 'handler' in when()\");\n\n      var strategies = {\n        matcher: function (what, handler) {\n          if (handlerIsString) {\n            redirect = $urlMatcherFactory.compile(handler);\n            handler = ['$match', function ($match) { return redirect.format($match); }];\n          }\n          return extend(function ($injector, $location) {\n            return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));\n          }, {\n            prefix: isString(what.prefix) ? what.prefix : ''\n          });\n        },\n        regex: function (what, handler) {\n          if (what.global || what.sticky) throw new Error(\"when() RegExp must not be global or sticky\");\n\n          if (handlerIsString) {\n            redirect = handler;\n            handler = ['$match', function ($match) { return interpolate(redirect, $match); }];\n          }\n          return extend(function ($injector, $location) {\n            return handleIfMatch($injector, handler, what.exec($location.path()));\n          }, {\n            prefix: regExpPrefix(what)\n          });\n        }\n      };\n\n      var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };\n\n      for (var n in check) {\n        if (check[n]) {\n          return this.rule(strategies[n](what, handler));\n        }\n      }\n\n      throw new Error(\"invalid 'what' in when()\");\n    };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.router.$urlRouter\n   *\n   * @requires $location\n   * @requires $rootScope\n   * @requires $injector\n   *\n   * @description\n   *\n   */\n  this.$get =\n    [        '$location', '$rootScope', '$injector',\n    function ($location,   $rootScope,   $injector) {\n      // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree\n      function update(evt) {\n        if (evt && evt.defaultPrevented) return;\n        function check(rule) {\n          var handled = rule($injector, $location);\n          if (handled) {\n            if (isString(handled)) $location.replace().url(handled);\n            return true;\n          }\n          return false;\n        }\n        var n=rules.length, i;\n        for (i=0; i<n; i++) {\n          if (check(rules[i])) return;\n        }\n        // always check otherwise last to allow dynamic updates to the set of rules\n        if (otherwise) check(otherwise);\n      }\n\n      $rootScope.$on('$locationChangeSuccess', update);\n\n      return {\n        /**\n         * @ngdoc function\n         * @name ui.router.router.$urlRouter#sync\n         * @methodOf ui.router.router.$urlRouter\n         *\n         * @description\n         * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.\n         * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event, \n         * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed \n         * with the transition by calling `$urlRouter.sync()`.\n         *\n         * @example\n         * <pre>\n         * angular.module('app', ['ui.router']);\n         *   .run(function($rootScope, $urlRouter) {\n         *     $rootScope.$on('$locationChangeSuccess', function(evt) {\n         *       // Halt state change from even starting\n         *       evt.preventDefault();\n         *       // Perform custom logic\n         *       var meetsRequirement = ...\n         *       // Continue with the update and state transition if logic allows\n         *       if (meetsRequirement) $urlRouter.sync();\n         *     });\n         * });\n         * </pre>\n         */\n        sync: function () {\n          update();\n        }\n      };\n    }];\n}\n\nangular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);\n\n/**\n * @ngdoc object\n * @name ui.router.state.$stateProvider\n *\n * @requires ui.router.router.$urlRouterProvider\n * @requires ui.router.util.$urlMatcherFactoryProvider\n * @requires $locationProvider\n *\n * @description\n * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely\n * on state.\n *\n * A state corresponds to a \"place\" in the application in terms of the overall UI and\n * navigation. A state describes (via the controller / template / view properties) what\n * the UI looks like and does at that place.\n *\n * States often have things in common, and the primary way of factoring out these\n * commonalities in this model is via the state hierarchy, i.e. parent/child states aka\n * nested states.\n *\n * The `$stateProvider` provides interfaces to declare these states for your app.\n */\n$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider', '$locationProvider'];\nfunction $StateProvider(   $urlRouterProvider,   $urlMatcherFactory,           $locationProvider) {\n\n  var root, states = {}, $state, queue = {}, abstractKey = 'abstract';\n\n  // Builds state properties from definition passed to registerState()\n  var stateBuilder = {\n\n    // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.\n    // state.children = [];\n    // if (parent) parent.children.push(state);\n    parent: function(state) {\n      if (isDefined(state.parent) && state.parent) return findState(state.parent);\n      // regex matches any valid composite state name\n      // would match \"contact.list\" but not \"contacts\"\n      var compositeName = /^(.+)\\.[^.]+$/.exec(state.name);\n      return compositeName ? findState(compositeName[1]) : root;\n    },\n\n    // inherit 'data' from parent and override by own values (if any)\n    data: function(state) {\n      if (state.parent && state.parent.data) {\n        state.data = state.self.data = extend({}, state.parent.data, state.data);\n      }\n      return state.data;\n    },\n\n    // Build a URLMatcher if necessary, either via a relative or absolute URL\n    url: function(state) {\n      var url = state.url;\n\n      if (isString(url)) {\n        if (url.charAt(0) == '^') {\n          return $urlMatcherFactory.compile(url.substring(1));\n        }\n        return (state.parent.navigable || root).url.concat(url);\n      }\n\n      if ($urlMatcherFactory.isMatcher(url) || url == null) {\n        return url;\n      }\n      throw new Error(\"Invalid url '\" + url + \"' in state '\" + state + \"'\");\n    },\n\n    // Keep track of the closest ancestor state that has a URL (i.e. is navigable)\n    navigable: function(state) {\n      return state.url ? state : (state.parent ? state.parent.navigable : null);\n    },\n\n    // Derive parameters for this state and ensure they're a super-set of parent's parameters\n    params: function(state) {\n      if (!state.params) {\n        return state.url ? state.url.parameters() : state.parent.params;\n      }\n      if (!isArray(state.params)) throw new Error(\"Invalid params in state '\" + state + \"'\");\n      if (state.url) throw new Error(\"Both params and url specicified in state '\" + state + \"'\");\n      return state.params;\n    },\n\n    // If there is no explicit multi-view configuration, make one up so we don't have\n    // to handle both cases in the view directive later. Note that having an explicit\n    // 'views' property will mean the default unnamed view properties are ignored. This\n    // is also a good time to resolve view names to absolute names, so everything is a\n    // straight lookup at link time.\n    views: function(state) {\n      var views = {};\n\n      forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {\n        if (name.indexOf('@') < 0) name += '@' + state.parent.name;\n        views[name] = view;\n      });\n      return views;\n    },\n\n    ownParams: function(state) {\n      if (!state.parent) {\n        return state.params;\n      }\n      var paramNames = {}; forEach(state.params, function (p) { paramNames[p] = true; });\n\n      forEach(state.parent.params, function (p) {\n        if (!paramNames[p]) {\n          throw new Error(\"Missing required parameter '\" + p + \"' in state '\" + state.name + \"'\");\n        }\n        paramNames[p] = false;\n      });\n      var ownParams = [];\n\n      forEach(paramNames, function (own, p) {\n        if (own) ownParams.push(p);\n      });\n      return ownParams;\n    },\n\n    // Keep a full path from the root down to this state as this is needed for state activation.\n    path: function(state) {\n      return state.parent ? state.parent.path.concat(state) : []; // exclude root from path\n    },\n\n    // Speed up $state.contains() as it's used a lot\n    includes: function(state) {\n      var includes = state.parent ? extend({}, state.parent.includes) : {};\n      includes[state.name] = true;\n      return includes;\n    },\n\n    $delegates: {}\n  };\n\n  function isRelative(stateName) {\n    return stateName.indexOf(\".\") === 0 || stateName.indexOf(\"^\") === 0;\n  }\n\n  function findState(stateOrName, base) {\n    var isStr = isString(stateOrName),\n        name  = isStr ? stateOrName : stateOrName.name,\n        path  = isRelative(name);\n\n    if (path) {\n      if (!base) throw new Error(\"No reference point given for path '\"  + name + \"'\");\n      var rel = name.split(\".\"), i = 0, pathLength = rel.length, current = base;\n\n      for (; i < pathLength; i++) {\n        if (rel[i] === \"\" && i === 0) {\n          current = base;\n          continue;\n        }\n        if (rel[i] === \"^\") {\n          if (!current.parent) throw new Error(\"Path '\" + name + \"' not valid for state '\" + base.name + \"'\");\n          current = current.parent;\n          continue;\n        }\n        break;\n      }\n      rel = rel.slice(i).join(\".\");\n      name = current.name + (current.name && rel ? \".\" : \"\") + rel;\n    }\n    var state = states[name];\n\n    if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {\n      return state;\n    }\n    return undefined;\n  }\n\n  function queueState(parentName, state) {\n    if (!queue[parentName]) {\n      queue[parentName] = [];\n    }\n    queue[parentName].push(state);\n  }\n\n  function registerState(state) {\n    // Wrap a new object around the state so we can store our private details easily.\n    state = inherit(state, {\n      self: state,\n      resolve: state.resolve || {},\n      toString: function() { return this.name; }\n    });\n\n    var name = state.name;\n    if (!isString(name) || name.indexOf('@') >= 0) throw new Error(\"State must have a valid name\");\n    if (states.hasOwnProperty(name)) throw new Error(\"State '\" + name + \"'' is already defined\");\n\n    // Get parent name\n    var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))\n        : (isString(state.parent)) ? state.parent\n        : '';\n\n    // If parent is not registered yet, add state to queue and register later\n    if (parentName && !states[parentName]) {\n      return queueState(parentName, state.self);\n    }\n\n    for (var key in stateBuilder) {\n      if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);\n    }\n    states[name] = state;\n\n    // Register the state in the global state list and with $urlRouter if necessary.\n    if (!state[abstractKey] && state.url) {\n      $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {\n        if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {\n          $state.transitionTo(state, $match, { location: false });\n        }\n      }]);\n    }\n\n    // Register any queued children\n    if (queue[name]) {\n      for (var i = 0; i < queue[name].length; i++) {\n        registerState(queue[name][i]);\n      }\n    }\n\n    return state;\n  }\n\n  // Checks text to see if it looks like a glob.\n  function isGlob (text) {\n    return text.indexOf('*') > -1;\n  }\n\n  // Returns true if glob matches current $state name.\n  function doesStateMatchGlob (glob) {\n    var globSegments = glob.split('.'),\n        segments = $state.$current.name.split('.');\n\n    //match greedy starts\n    if (globSegments[0] === '**') {\n       segments = segments.slice(segments.indexOf(globSegments[1]));\n       segments.unshift('**');\n    }\n    //match greedy ends\n    if (globSegments[globSegments.length - 1] === '**') {\n       segments.splice(segments.indexOf(globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);\n       segments.push('**');\n    }\n\n    if (globSegments.length != segments.length) {\n      return false;\n    }\n\n    //match single stars\n    for (var i = 0, l = globSegments.length; i < l; i++) {\n      if (globSegments[i] === '*') {\n        segments[i] = '*';\n      }\n    }\n\n    return segments.join('') === globSegments.join('');\n  }\n\n\n  // Implicit root state that is always active\n  root = registerState({\n    name: '',\n    url: '^',\n    views: null,\n    'abstract': true\n  });\n  root.navigable = null;\n\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$stateProvider#decorator\n   * @methodOf ui.router.state.$stateProvider\n   *\n   * @description\n   * Allows you to extend (carefully) or override (at your own peril) the \n   * `stateBuilder` object used internally by `$stateProvider`. This can be used \n   * to add custom functionality to ui-router, for example inferring templateUrl \n   * based on the state name.\n   *\n   * When passing only a name, it returns the current (original or decorated) builder\n   * function that matches `name`.\n   *\n   * The builder functions that can be decorated are listed below. Though not all\n   * necessarily have a good use case for decoration, that is up to you to decide.\n   *\n   * In addition, users can attach custom decorators, which will generate new \n   * properties within the state's internal definition. There is currently no clear \n   * use-case for this beyond accessing internal states (i.e. $state.$current), \n   * however, expect this to become increasingly relevant as we introduce additional \n   * meta-programming features.\n   *\n   * **Warning**: Decorators should not be interdependent because the order of \n   * execution of the builder functions in non-deterministic. Builder functions \n   * should only be dependent on the state definition object and super function.\n   *\n   *\n   * Existing builder functions and current return values:\n   *\n   * - **parent** `{object}` - returns the parent state object.\n   * - **data** `{object}` - returns state data, including any inherited data that is not\n   *   overridden by own values (if any).\n   * - **url** `{object}` - returns a {link ui.router.util.type:UrlMatcher} or null.\n   * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is \n   *   navigable).\n   * - **params** `{object}` - returns an array of state params that are ensured to \n   *   be a super-set of parent's params.\n   * - **views** `{object}` - returns a views object where each key is an absolute view \n   *   name (i.e. \"viewName@stateName\") and each value is the config object \n   *   (template, controller) for the view. Even when you don't use the views object \n   *   explicitly on a state config, one is still created for you internally.\n   *   So by decorating this builder function you have access to decorating template \n   *   and controller properties.\n   * - **ownParams** `{object}` - returns an array of params that belong to the state, \n   *   not including any params defined by ancestor states.\n   * - **path** `{string}` - returns the full path from the root down to this state. \n   *   Needed for state activation.\n   * - **includes** `{object}` - returns an object that includes every state that \n   *   would pass a '$state.includes()' test.\n   *\n   * @example\n   * <pre>\n   * // Override the internal 'views' builder with a function that takes the state\n   * // definition, and a reference to the internal function being overridden:\n   * $stateProvider.decorator('views', function ($state, parent) {\n   *   var result = {},\n   *       views = parent(state);\n   *\n   *   angular.forEach(view, function (config, name) {\n   *     var autoName = (state.name + '.' + name).replace('.', '/');\n   *     config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';\n   *     result[name] = config;\n   *   });\n   *   return result;\n   * });\n   *\n   * $stateProvider.state('home', {\n   *   views: {\n   *     'contact.list': { controller: 'ListController' },\n   *     'contact.item': { controller: 'ItemController' }\n   *   }\n   * });\n   *\n   * // ...\n   *\n   * $state.go('home');\n   * // Auto-populates list and item views with /partials/home/contact/list.html,\n   * // and /partials/home/contact/item.html, respectively.\n   * </pre>\n   *\n   * @param {string} name The name of the builder function to decorate. \n   * @param {object} func A function that is responsible for decorating the original \n   * builder function. The function receives two parameters:\n   *\n   *   - `{object}` - state - The state config object.\n   *   - `{object}` - super - The original builder function.\n   *\n   * @return {object} $stateProvider - $stateProvider instance\n   */\n  this.decorator = decorator;\n  function decorator(name, func) {\n    /*jshint validthis: true */\n    if (isString(name) && !isDefined(func)) {\n      return stateBuilder[name];\n    }\n    if (!isFunction(func) || !isString(name)) {\n      return this;\n    }\n    if (stateBuilder[name] && !stateBuilder.$delegates[name]) {\n      stateBuilder.$delegates[name] = stateBuilder[name];\n    }\n    stateBuilder[name] = func;\n    return this;\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$stateProvider#state\n   * @methodOf ui.router.state.$stateProvider\n   *\n   * @description\n   * Registers a state configuration under a given state name. The stateConfig object\n   * has the following acceptable properties.\n   *\n   * <a id='template'></a>\n   *\n   * - **`template`** - {string|function=} - html template as a string or a function that returns\n   *   an html template as a string which should be used by the uiView directives. This property \n   *   takes precedence over templateUrl.\n   *   \n   *   If `template` is a function, it will be called with the following parameters:\n   *\n   *   - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by\n   *     applying the current state\n   *\n   * <a id='templateUrl'></a>\n   *\n   * - **`templateUrl`** - {string|function=} - path or function that returns a path to an html \n   *   template that should be used by uiView.\n   *   \n   *   If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *   - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by \n   *     applying the current state\n   *\n   * <a id='templateProvider'></a>\n   *\n   * - **`templateProvider`** - {function=} - Provider function that returns HTML content\n   *   string.\n   *\n   * <a id='controller'></a>\n   *\n   * - **`controller`** - {string|function=} -  Controller fn that should be associated with newly \n   *   related scope or the name of a registered controller if passed as a string.\n   *\n   * <a id='controllerProvider'></a>\n   *\n   * - **`controllerProvider`** - {function=} - Injectable provider function that returns\n   *   the actual controller or string.\n   *\n   * <a id='controllerAs'></a>\n   * \n   * - **`controllerAs`** – {string=} – A controller alias name. If present the controller will be \n   *   published to scope under the controllerAs name.\n   *\n   * <a id='resolve'></a>\n   *\n   * - **`resolve`** - {object.&lt;string, function&gt;=} - An optional map of dependencies which \n   *   should be injected into the controller. If any of these dependencies are promises, \n   *   the router will wait for them all to be resolved or one to be rejected before the \n   *   controller is instantiated. If all the promises are resolved successfully, the values \n   *   of the resolved promises are injected and $stateChangeSuccess event is fired. If any \n   *   of the promises are rejected the $stateChangeError event is fired. The map object is:\n   *   \n   *   - key - {string}: name of dependency to be injected into controller\n   *   - factory - {string|function}: If string then it is alias for service. Otherwise if function, \n   *     it is injected and return value it treated as dependency. If result is a promise, it is \n   *     resolved before its value is injected into controller.\n   *\n   * <a id='url'></a>\n   *\n   * - **`url`** - {string=} - A url with optional parameters. When a state is navigated or\n   *   transitioned to, the `$stateParams` service will be populated with any \n   *   parameters that were passed.\n   *\n   * <a id='params'></a>\n   *\n   * - **`params`** - {object=} - An array of parameter names or regular expressions. Only \n   *   use this within a state if you are not using url. Otherwise you can specify your\n   *   parameters within the url. When a state is navigated or transitioned to, the \n   *   $stateParams service will be populated with any parameters that were passed.\n   *\n   * <a id='views'></a>\n   *\n   * - **`views`** - {object=} - Use the views property to set up multiple views or to target views\n   *   manually/explicitly.\n   *\n   * <a id='abstract'></a>\n   *\n   * - **`abstract`** - {boolean=} - An abstract state will never be directly activated, \n   *   but can provide inherited properties to its common children states.\n   *\n   * <a id='onEnter'></a>\n   *\n   * - **`onEnter`** - {object=} - Callback function for when a state is entered. Good way\n   *   to trigger an action or dispatch an event, such as opening a dialog.\n   *\n   * <a id='onExit'></a>\n   *\n   * - **`onExit`** - {object=} - Callback function for when a state is exited. Good way to\n   *   trigger an action or dispatch an event, such as opening a dialog.\n   *\n   * <a id='reloadOnSearch'></a>\n   *\n   * - **`reloadOnSearch = true`** - {boolean=} - If `false`, will not retrigger the same state \n   *   just because a search/query parameter has changed (via $location.search() or $location.hash()). \n   *   Useful for when you'd like to modify $location.search() without triggering a reload.\n   *\n   * <a id='data'></a>\n   *\n   * - **`data`** - {object=} - Arbitrary data object, useful for custom configuration.\n   *\n   * @example\n   * <pre>\n   * // Some state name examples\n   *\n   * // stateName can be a single top-level name (must be unique).\n   * $stateProvider.state(\"home\", {});\n   *\n   * // Or it can be a nested state name. This state is a child of the \n   * // above \"home\" state.\n   * $stateProvider.state(\"home.newest\", {});\n   *\n   * // Nest states as deeply as needed.\n   * $stateProvider.state(\"home.newest.abc.xyz.inception\", {});\n   *\n   * // state() returns $stateProvider, so you can chain state declarations.\n   * $stateProvider\n   *   .state(\"home\", {})\n   *   .state(\"about\", {})\n   *   .state(\"contacts\", {});\n   * </pre>\n   *\n   * @param {string} name A unique state name, e.g. \"home\", \"about\", \"contacts\". \n   * To create a parent/child state use a dot, e.g. \"about.sales\", \"home.newest\".\n   * @param {object} definition State configuration object.\n   */\n  this.state = state;\n  function state(name, definition) {\n    /*jshint validthis: true */\n    if (isObject(name)) definition = name;\n    else definition.name = name;\n    registerState(definition);\n    return this;\n  }\n\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$state\n   *\n   * @requires $rootScope\n   * @requires $q\n   * @requires ui.router.state.$view\n   * @requires $injector\n   * @requires ui.router.util.$resolve\n   * @requires ui.router.state.$stateParams\n   *\n   * @property {object} params A param object, e.g. {sectionId: section.id)}, that \n   * you'd like to test against the current active state.\n   * @property {object} current A reference to the state's config object. However \n   * you passed it in. Useful for accessing custom data.\n   * @property {object} transition Currently pending transition. A promise that'll \n   * resolve or reject.\n   *\n   * @description\n   * `$state` service is responsible for representing states as well as transitioning\n   * between them. It also provides interfaces to ask for current state or even states\n   * you're coming from.\n   */\n  // $urlRouter is injected just to ensure it gets instantiated\n  this.$get = $get;\n  $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$location', '$urlRouter', '$browser'];\n  function $get(   $rootScope,   $q,   $view,   $injector,   $resolve,   $stateParams,   $location,   $urlRouter,   $browser) {\n\n    var TransitionSuperseded = $q.reject(new Error('transition superseded'));\n    var TransitionPrevented = $q.reject(new Error('transition prevented'));\n    var TransitionAborted = $q.reject(new Error('transition aborted'));\n    var TransitionFailed = $q.reject(new Error('transition failed'));\n    var currentLocation = $location.url();\n    var baseHref = $browser.baseHref();\n\n    function syncUrl() {\n      if ($location.url() !== currentLocation) {\n        $location.url(currentLocation);\n        $location.replace();\n      }\n    }\n\n    root.locals = { resolve: null, globals: { $stateParams: {} } };\n    $state = {\n      params: {},\n      current: root.self,\n      $current: root,\n      transition: null\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#reload\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A method that force reloads the current state. All resolves are re-resolved, events are not re-fired, \n     * and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon).\n     *\n     * @example\n     * <pre>\n     * var app angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.reload = function(){\n     *     $state.reload();\n     *   }\n     * });\n     * </pre>\n     *\n     * `reload()` is just an alias for:\n     * <pre>\n     * $state.transitionTo($state.current, $stateParams, { \n     *   reload: true, inherit: false, notify: false \n     * });\n     * </pre>\n     */\n    $state.reload = function reload() {\n      $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: false });\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#go\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Convenience method for transitioning to a new state. `$state.go` calls \n     * `$state.transitionTo` internally but automatically sets options to \n     * `{ location: true, inherit: true, relative: $state.$current, notify: true }`. \n     * This allows you to easily use an absolute or relative to path and specify \n     * only the parameters you'd like to update (while letting unspecified parameters \n     * inherit from the currently active ancestor states).\n     *\n     * @example\n     * <pre>\n     * var app = angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.changeState = function () {\n     *     $state.go('contact.detail');\n     *   };\n     * });\n     * </pre>\n     * <img src='../ngdoc_assets/StateGoExamples.png'/>\n     *\n     * @param {string} to Absolute state name or relative state path. Some examples:\n     *\n     * - `$state.go('contact.detail')` - will go to the `contact.detail` state\n     * - `$state.go('^')` - will go to a parent state\n     * - `$state.go('^.sibling')` - will go to a sibling state\n     * - `$state.go('.child.grandchild')` - will go to grandchild state\n     *\n     * @param {object=} params A map of the parameters that will be sent to the state, \n     * will populate $stateParams. Any parameters that are not specified will be inherited from currently \n     * defined parameters. This allows, for example, going to a sibling state that shares parameters\n     * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.\n     * transitioning to a sibling will get you the parameters for all parents, transitioning to a child\n     * will get you all current parameters, etc.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`\n     *    will not. If string, must be `\"replace\"`, which will update url and also replace last history record.\n     * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.\n     * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params \n     *    have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd\n     *    use this when you want to force a reload when *everything* is the same, including search params.\n     *\n     * @returns {promise} A promise representing the state of the new transition.\n     *\n     * Possible success values:\n     *\n     * - $state.current\n     *\n     * <br/>Possible rejection values:\n     *\n     * - 'transition superseded' - when a newer transition has been started after this one\n     * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener\n     * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or\n     *   when a `$stateNotFound` `event.retry` promise errors.\n     * - 'transition failed' - when a state has been unsuccessfully found after 2 tries.\n     * - *resolve error* - when an error has occurred with a `resolve`\n     *\n     */\n    $state.go = function go(to, params, options) {\n      return this.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#transitionTo\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}\n     * uses `transitionTo` internally. `$state.go` is recommended in most situations.\n     *\n     * @example\n     * <pre>\n     * var app = angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.changeState = function () {\n     *     $state.transitionTo('contact.detail');\n     *   };\n     * });\n     * </pre>\n     *\n     * @param {string} to State name.\n     * @param {object=} toParams A map of the parameters that will be sent to the state,\n     * will populate $stateParams.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`\n     *    will not. If string, must be `\"replace\"`, which will update url and also replace last history record.\n     * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.\n     * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params \n     *    have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd\n     *    use this when you want to force a reload when *everything* is the same, including search params.\n     *\n     * @returns {promise} A promise representing the state of the new transition. See\n     * {@link ui.router.state.$state#methods_go $state.go}.\n     */\n    $state.transitionTo = function transitionTo(to, toParams, options) {\n      toParams = toParams || {};\n      options = extend({\n        location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false\n      }, options || {});\n\n      var from = $state.$current, fromParams = $state.params, fromPath = from.path;\n      var evt, toState = findState(to, options.relative);\n\n      if (!isDefined(toState)) {\n        // Broadcast not found event and abort the transition if prevented\n        var redirect = { to: to, toParams: toParams, options: options };\n\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateNotFound\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when a requested state **cannot be found** using the provided state name during transition.\n         * The event is broadcast allowing any handlers a single chance to deal with the error (usually by\n         * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,\n         * you can see its three properties in the example. You can use `event.preventDefault()` to abort the\n         * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.\n         *\n         * @param {Object} event Event object.\n         * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.\n         * @param {State} fromState Current state object.\n         * @param {Object} fromParams Current state params.\n         *\n         * @example\n         *\n         * <pre>\n         * // somewhere, assume lazy.state has not been defined\n         * $state.go(\"lazy.state\", {a:1, b:2}, {inherit:false});\n         *\n         * // somewhere else\n         * $scope.$on('$stateNotFound',\n         * function(event, unfoundState, fromState, fromParams){\n         *     console.log(unfoundState.to); // \"lazy.state\"\n         *     console.log(unfoundState.toParams); // {a:1, b:2}\n         *     console.log(unfoundState.options); // {inherit:false} + default options\n         * })\n         * </pre>\n         */\n        evt = $rootScope.$broadcast('$stateNotFound', redirect, from.self, fromParams);\n        if (evt.defaultPrevented) {\n          syncUrl();\n          return TransitionAborted;\n        }\n\n        // Allow the handler to return a promise to defer state lookup retry\n        if (evt.retry) {\n          if (options.$retry) {\n            syncUrl();\n            return TransitionFailed;\n          }\n          var retryTransition = $state.transition = $q.when(evt.retry);\n          retryTransition.then(function() {\n            if (retryTransition !== $state.transition) return TransitionSuperseded;\n            redirect.options.$retry = true;\n            return $state.transitionTo(redirect.to, redirect.toParams, redirect.options);\n          }, function() {\n            return TransitionAborted;\n          });\n          syncUrl();\n          return retryTransition;\n        }\n\n        // Always retry once if the $stateNotFound was not prevented\n        // (handles either redirect changed or state lazy-definition)\n        to = redirect.to;\n        toParams = redirect.toParams;\n        options = redirect.options;\n        toState = findState(to, options.relative);\n        if (!isDefined(toState)) {\n          if (options.relative) throw new Error(\"Could not resolve '\" + to + \"' from state '\" + options.relative + \"'\");\n          throw new Error(\"No such state '\" + to + \"'\");\n        }\n      }\n      if (toState[abstractKey]) throw new Error(\"Cannot transition to abstract state '\" + to + \"'\");\n      if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);\n      to = toState;\n\n      var toPath = to.path;\n\n      // Starting from the root of the path, keep all levels that haven't changed\n      var keep, state, locals = root.locals, toLocals = [];\n      for (keep = 0, state = toPath[keep];\n           state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams) && !options.reload;\n           keep++, state = toPath[keep]) {\n        locals = toLocals[keep] = state.locals;\n      }\n\n      // If we're going to the same state and all locals are kept, we've got nothing to do.\n      // But clear 'transition', as we still want to cancel any other pending transitions.\n      // TODO: We may not want to bump 'transition' if we're called from a location change that we've initiated ourselves,\n      // because we might accidentally abort a legitimate transition initiated from code?\n      if (shouldTriggerReload(to, from, locals, options) ) {\n        if ( to.self.reloadOnSearch !== false )\n          syncUrl();\n        $state.transition = null;\n        return $q.when($state.current);\n      }\n\n      // Normalize/filter parameters before we pass them to event handlers etc.\n      toParams = normalize(to.params, toParams || {});\n\n      // Broadcast start event and cancel the transition if requested\n      if (options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeStart\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when the state transition **begins**. You can use `event.preventDefault()`\n         * to prevent the transition from happening and then the transition promise will be\n         * rejected with a `'transition prevented'` value.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         *\n         * @example\n         *\n         * <pre>\n         * $rootScope.$on('$stateChangeStart',\n         * function(event, toState, toParams, fromState, fromParams){\n         *     event.preventDefault();\n         *     // transitionTo() promise will be rejected with\n         *     // a 'transition prevented' error\n         * })\n         * </pre>\n         */\n        evt = $rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams);\n        if (evt.defaultPrevented) {\n          syncUrl();\n          return TransitionPrevented;\n        }\n      }\n\n      // Resolve locals for the remaining states, but don't update any global state just\n      // yet -- if anything fails to resolve the current state needs to remain untouched.\n      // We also set up an inheritance chain for the locals here. This allows the view directive\n      // to quickly look up the correct definition for each view in the current state. Even\n      // though we create the locals object itself outside resolveState(), it is initially\n      // empty and gets filled asynchronously. We need to keep track of the promise for the\n      // (fully resolved) current locals, and pass this down the chain.\n      var resolved = $q.when(locals);\n      for (var l=keep; l<toPath.length; l++, state=toPath[l]) {\n        locals = toLocals[l] = inherit(locals);\n        resolved = resolveState(state, toParams, state===to, resolved, locals);\n      }\n\n      // Once everything is resolved, we are ready to perform the actual transition\n      // and return a promise for the new state. We also keep track of what the\n      // current promise is, so that we can detect overlapping transitions and\n      // keep only the outcome of the last transition.\n      var transition = $state.transition = resolved.then(function () {\n        var l, entering, exiting;\n\n        if ($state.transition !== transition) return TransitionSuperseded;\n\n        // Exit 'from' states not kept\n        for (l=fromPath.length-1; l>=keep; l--) {\n          exiting = fromPath[l];\n          if (exiting.self.onExit) {\n            $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);\n          }\n          exiting.locals = null;\n        }\n\n        // Enter 'to' states not kept\n        for (l=keep; l<toPath.length; l++) {\n          entering = toPath[l];\n          entering.locals = toLocals[l];\n          if (entering.self.onEnter) {\n            $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);\n          }\n        }\n\n        // Run it again, to catch any transitions in callbacks\n        if ($state.transition !== transition) return TransitionSuperseded;\n\n        // Update globals in $state\n        $state.$current = to;\n        $state.current = to.self;\n        $state.params = toParams;\n        copy($state.params, $stateParams);\n        $state.transition = null;\n\n        // Update $location\n        var toNav = to.navigable;\n        if (options.location && toNav) {\n          $location.url(toNav.url.format(toNav.locals.globals.$stateParams));\n\n          if (options.location === 'replace') {\n            $location.replace();\n          }\n        }\n\n        if (options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeSuccess\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired once the state transition is **complete**.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         */\n          $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);\n        }\n        currentLocation = $location.url();\n\n        return $state.current;\n      }, function (error) {\n        if ($state.transition !== transition) return TransitionSuperseded;\n\n        $state.transition = null;\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeError\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when an **error occurs** during transition. It's important to note that if you\n         * have any errors in your resolve functions (javascript errors, non-existent services, etc)\n         * they will not throw traditionally. You must listen for this $stateChangeError event to\n         * catch **ALL** errors.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         * @param {Error} error The resolve error object.\n         */\n        $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);\n        syncUrl();\n\n        return $q.reject(error);\n      });\n\n      return transition;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#is\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Similar to {@link ui.router.state.$state#methods_includes $state.includes},\n     * but only checks for the full state name. If params is supplied then it will be \n     * tested for strict equality against the current active params object, so all params \n     * must match with none missing and no extras.\n     *\n     * @example\n     * <pre>\n     * $state.is('contact.details.item'); // returns true\n     * $state.is(contactDetailItemStateObject); // returns true\n     *\n     * // everything else would return false\n     * </pre>\n     *\n     * @param {string|object} stateName The state name or state object you'd like to check.\n     * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like \n     * to test against the current active state.\n     * @returns {boolean} Returns true if it is the state.\n     */\n    $state.is = function is(stateOrName, params) {\n      var state = findState(stateOrName);\n\n      if (!isDefined(state)) {\n        return undefined;\n      }\n\n      if ($state.$current !== state) {\n        return false;\n      }\n\n      return isDefined(params) && params !== null ? angular.equals($stateParams, params) : true;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#includes\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A method to determine if the current active state is equal to or is the child of the \n     * state stateName. If any params are passed then they will be tested for a match as well.\n     * Not all the parameters need to be passed, just the ones you'd like to test for equality.\n     *\n     * @example\n     * <pre>\n     * $state.$current.name = 'contacts.details.item';\n     *\n     * $state.includes(\"contacts\"); // returns true\n     * $state.includes(\"contacts.details\"); // returns true\n     * $state.includes(\"contacts.details.item\"); // returns true\n     * $state.includes(\"contacts.list\"); // returns false\n     * $state.includes(\"about\"); // returns false\n     * </pre>\n     *\n     * @description\n     * Basic globing patterns will also work.\n     *\n     * @example\n     * <pre>\n     * $state.$current.name = 'contacts.details.item.url';\n     *\n     * $state.includes(\"*.details.*.*\"); // returns true\n     * $state.includes(\"*.details.**\"); // returns true\n     * $state.includes(\"**.item.**\"); // returns true\n     * $state.includes(\"*.details.item.url\"); // returns true\n     * $state.includes(\"*.details.*.url\"); // returns true\n     * $state.includes(\"*.details.*\"); // returns false\n     * $state.includes(\"item.**\"); // returns false\n     * </pre>\n     *\n     * @param {string} stateOrName A partial name to be searched for within the current state name.\n     * @param {object} params A param object, e.g. `{sectionId: section.id}`, \n     * that you'd like to test against the current active state.\n     * @returns {boolean} Returns true if it does include the state\n     */\n\n    $state.includes = function includes(stateOrName, params) {\n      if (isString(stateOrName) && isGlob(stateOrName)) {\n        if (doesStateMatchGlob(stateOrName)) {\n          stateOrName = $state.$current.name;\n        } else {\n          return false;\n        }\n      }\n\n      var state = findState(stateOrName);\n      if (!isDefined(state)) {\n        return undefined;\n      }\n\n      if (!isDefined($state.$current.includes[state.name])) {\n        return false;\n      }\n\n      var validParams = true;\n      angular.forEach(params, function(value, key) {\n        if (!isDefined($stateParams[key]) || $stateParams[key] !== value) {\n          validParams = false;\n        }\n      });\n      return validParams;\n    };\n\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#href\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A url generation method that returns the compiled url for the given state populated with the given params.\n     *\n     * @example\n     * <pre>\n     * expect($state.href(\"about.person\", { person: \"bob\" })).toEqual(\"/about/bob\");\n     * </pre>\n     *\n     * @param {string|object} stateOrName The state name or state object you'd like to generate a url from.\n     * @param {object=} params An object of parameter values to fill the state's required parameters.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`lossy`** - {boolean=true} -  If true, and if there is no url associated with the state provided in the\n     *    first parameter, then the constructed href url will be built from the first navigable ancestor (aka\n     *    ancestor with a valid url).\n     * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`absolute`** - {boolean=false},  If true will generate an absolute url, e.g. \"http://www.example.com/fullurl\".\n     * \n     * @returns {string} compiled state url\n     */\n    $state.href = function href(stateOrName, params, options) {\n      options = extend({ lossy: true, inherit: false, absolute: false, relative: $state.$current }, options || {});\n      var state = findState(stateOrName, options.relative);\n      if (!isDefined(state)) return null;\n\n      params = inheritParams($stateParams, params || {}, $state.$current, state);\n      var nav = (state && options.lossy) ? state.navigable : state;\n      var url = (nav && nav.url) ? nav.url.format(normalize(state.params, params || {})) : null;\n      if (!$locationProvider.html5Mode() && url) {\n        url = \"#\" + $locationProvider.hashPrefix() + url;\n      }\n\n      if (baseHref !== '/') {\n        if ($locationProvider.html5Mode()) {\n          url = baseHref.slice(0, -1) + url;\n        } else if (options.absolute){\n          url = baseHref.slice(1) + url;\n        }\n      }\n\n      if (options.absolute && url) {\n        url = $location.protocol() + '://' + \n              $location.host() + \n              ($location.port() == 80 || $location.port() == 443 ? '' : ':' + $location.port()) + \n              (!$locationProvider.html5Mode() && url ? '/' : '') + \n              url;\n      }\n      return url;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#get\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Returns the state configuration object for any specific state or all states.\n     *\n     * @param {string|object=} stateOrName If provided, will only get the config for\n     * the requested state. If not provided, returns an array of ALL state configs.\n     * @returns {object|array} State configuration object or array of all objects.\n     */\n    $state.get = function (stateOrName, context) {\n      if (!isDefined(stateOrName)) {\n        var list = [];\n        forEach(states, function(state) { list.push(state.self); });\n        return list;\n      }\n      var state = findState(stateOrName, context);\n      return (state && state.self) ? state.self : null;\n    };\n\n    function resolveState(state, params, paramsAreFiltered, inherited, dst) {\n      // Make a restricted $stateParams with only the parameters that apply to this state if\n      // necessary. In addition to being available to the controller and onEnter/onExit callbacks,\n      // we also need $stateParams to be available for any $injector calls we make during the\n      // dependency resolution process.\n      var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params, params);\n      var locals = { $stateParams: $stateParams };\n\n      // Resolve 'global' dependencies for the state, i.e. those not specific to a view.\n      // We're also including $stateParams in this; that way the parameters are restricted\n      // to the set that should be visible to the state, and are independent of when we update\n      // the global $state and $stateParams values.\n      dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);\n      var promises = [ dst.resolve.then(function (globals) {\n        dst.globals = globals;\n      }) ];\n      if (inherited) promises.push(inherited);\n\n      // Resolve template and dependencies for all views.\n      forEach(state.views, function (view, name) {\n        var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});\n        injectables.$template = [ function () {\n          return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: false }) || '';\n        }];\n\n        promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {\n          // References to the controller (only instantiated at link time)\n          if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {\n            var injectLocals = angular.extend({}, injectables, locals);\n            result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);\n          } else {\n            result.$$controller = view.controller;\n          }\n          // Provide access to the state itself for internal use\n          result.$$state = state;\n          result.$$controllerAs = view.controllerAs;\n          dst[name] = result;\n        }));\n      });\n\n      // Wait for all the promises and then return the activation object\n      return $q.all(promises).then(function (values) {\n        return dst;\n      });\n    }\n\n    return $state;\n  }\n\n  function shouldTriggerReload(to, from, locals, options) {\n    if ( to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false)) ) {\n      return true;\n    }\n  }\n}\n\nangular.module('ui.router.state')\n  .value('$stateParams', {})\n  .provider('$state', $StateProvider);\n\n\n$ViewProvider.$inject = [];\nfunction $ViewProvider() {\n\n  this.$get = $get;\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$view\n   *\n   * @requires ui.router.util.$templateFactory\n   * @requires $rootScope\n   *\n   * @description\n   *\n   */\n  $get.$inject = ['$rootScope', '$templateFactory'];\n  function $get(   $rootScope,   $templateFactory) {\n    return {\n      // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })\n      /**\n       * @ngdoc function\n       * @name ui.router.state.$view#load\n       * @methodOf ui.router.state.$view\n       *\n       * @description\n       *\n       * @param {string} name name\n       * @param {object} options option object.\n       */\n      load: function load(name, options) {\n        var result, defaults = {\n          template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}\n        };\n        options = extend(defaults, options);\n\n        if (options.view) {\n          result = $templateFactory.fromConfig(options.view, options.params, options.locals);\n        }\n        if (result && options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$viewContentLoading\n         * @eventOf ui.router.state.$view\n         * @eventType broadcast on root scope\n         * @description\n         *\n         * Fired once the view **begins loading**, *before* the DOM is rendered.\n         *\n         * @param {Object} event Event object.\n         * @param {Object} viewConfig The view config properties (template, controller, etc).\n         *\n         * @example\n         *\n         * <pre>\n         * $scope.$on('$viewContentLoading',\n         * function(event, viewConfig){\n         *     // Access to all the view config properties.\n         *     // and one special property 'targetView'\n         *     // viewConfig.targetView\n         * });\n         * </pre>\n         */\n          $rootScope.$broadcast('$viewContentLoading', options);\n        }\n        return result;\n      }\n    };\n  }\n}\n\nangular.module('ui.router.state').provider('$view', $ViewProvider);\n\n/**\n * @ngdoc object\n * @name ui.router.state.$uiViewScrollProvider\n *\n * @description\n * Provider that returns the {@link ui.router.state.$uiViewScroll} service function.\n */\nfunction $ViewScrollProvider() {\n\n  var useAnchorScroll = false;\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll\n   * @methodOf ui.router.state.$uiViewScrollProvider\n   *\n   * @description\n   * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for\n   * scrolling based on the url anchor.\n   */\n  this.useAnchorScroll = function () {\n    useAnchorScroll = true;\n  };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$uiViewScroll\n   *\n   * @requires $anchorScroll\n   * @requires $timeout\n   *\n   * @description\n   * When called with a jqLite element, it scrolls the element into view (after a\n   * `$timeout` so the DOM has time to refresh).\n   *\n   * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor,\n   * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}.\n   */\n  this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) {\n    if (useAnchorScroll) {\n      return $anchorScroll;\n    }\n\n    return function ($element) {\n      $timeout(function () {\n        $element[0].scrollIntoView();\n      }, 0, false);\n    };\n  }];\n}\n\nangular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider);\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-view\n *\n * @requires ui.router.state.$state\n * @requires $compile\n * @requires $controller\n * @requires $injector\n * @requires ui.router.state.$uiViewScroll\n * @requires $document\n *\n * @restrict ECA\n *\n * @description\n * The ui-view directive tells $state where to place your templates.\n *\n * @param {string=} ui-view A view name. The name should be unique amongst the other views in the\n * same state. You can have views of the same name that live in different states.\n *\n * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window\n * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll\n * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you\n * scroll ui-view elements into view when they are populated during a state activation.\n *\n * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll)\n * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.*\n *\n * @param {string=} onload Expression to evaluate whenever the view updates.\n * \n * @example\n * A view can be unnamed or named. \n * <pre>\n * <!-- Unnamed -->\n * <div ui-view></div> \n * \n * <!-- Named -->\n * <div ui-view=\"viewName\"></div>\n * </pre>\n *\n * You can only have one unnamed view within any template (or root html). If you are only using a \n * single view and it is unnamed then you can populate it like so:\n * <pre>\n * <div ui-view></div> \n * $stateProvider.state(\"home\", {\n *   template: \"<h1>HELLO!</h1>\"\n * })\n * </pre>\n * \n * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`}\n * config property, by name, in this case an empty name:\n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     }\n *   }    \n * })\n * </pre>\n * \n * But typically you'll only use the views property if you name your view or have more than one view \n * in the same template. There's not really a compelling reason to name a view if its the only one, \n * but you could if you wanted, like so:\n * <pre>\n * <div ui-view=\"main\"></div>\n * </pre> \n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"main\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     }\n *   }    \n * })\n * </pre>\n * \n * Really though, you'll use views to set up multiple views:\n * <pre>\n * <div ui-view></div>\n * <div ui-view=\"chart\"></div> \n * <div ui-view=\"data\"></div> \n * </pre>\n * \n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     },\n *     \"chart\": {\n *       template: \"<chart_thing/>\"\n *     },\n *     \"data\": {\n *       template: \"<data_thing/>\"\n *     }\n *   }    \n * })\n * </pre>\n *\n * Examples for `autoscroll`:\n *\n * <pre>\n * <!-- If autoscroll present with no expression,\n *      then scroll ui-view into view -->\n * <ui-view autoscroll/>\n *\n * <!-- If autoscroll present with valid expression,\n *      then scroll ui-view into view if expression evaluates to true -->\n * <ui-view autoscroll='true'/>\n * <ui-view autoscroll='false'/>\n * <ui-view autoscroll='scopeVariable'/>\n * </pre>\n */\n$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll'];\nfunction $ViewDirective(   $state,   $injector,   $uiViewScroll) {\n\n  function getService() {\n    return ($injector.has) ? function(service) {\n      return $injector.has(service) ? $injector.get(service) : null;\n    } : function(service) {\n      try {\n        return $injector.get(service);\n      } catch (e) {\n        return null;\n      }\n    };\n  }\n\n  var service = getService(),\n      $animator = service('$animator'),\n      $animate = service('$animate');\n\n  // Returns a set of DOM manipulation functions based on which Angular version\n  // it should use\n  function getRenderer(attrs, scope) {\n    var statics = function() {\n      return {\n        enter: function (element, target, cb) { target.after(element); cb(); },\n        leave: function (element, cb) { element.remove(); cb(); }\n      };\n    };\n\n    if ($animate) {\n      return {\n        enter: function(element, target, cb) { $animate.enter(element, null, target, cb); },\n        leave: function(element, cb) { $animate.leave(element, cb); }\n      };\n    }\n\n    if ($animator) {\n      var animate = $animator && $animator(scope, attrs);\n\n      return {\n        enter: function(element, target, cb) {animate.enter(element, null, target); cb(); },\n        leave: function(element, cb) { animate.leave(element); cb(); }\n      };\n    }\n\n    return statics();\n  }\n\n  var directive = {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    compile: function (tElement, tAttrs, $transclude) {\n      return function (scope, $element, attrs) {\n        var previousEl, currentEl, currentScope, latestLocals,\n            onloadExp     = attrs.onload || '',\n            autoScrollExp = attrs.autoscroll,\n            renderer      = getRenderer(attrs, scope);\n\n        scope.$on('$stateChangeSuccess', function() {\n          updateView(false);\n        });\n        scope.$on('$viewContentLoading', function() {\n          updateView(false);\n        });\n\n        updateView(true);\n\n        function cleanupLastView() {\n          if (previousEl) {\n            previousEl.remove();\n            previousEl = null;\n          }\n\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n\n          if (currentEl) {\n            renderer.leave(currentEl, function() {\n              previousEl = null;\n            });\n\n            previousEl = currentEl;\n            currentEl = null;\n          }\n        }\n\n        function updateView(firstTime) {\n          var newScope        = scope.$new(),\n              name            = currentEl && currentEl.data('$uiViewName'),\n              previousLocals  = name && $state.$current && $state.$current.locals[name];\n\n          if (!firstTime && previousLocals === latestLocals) return; // nothing to do\n\n          var clone = $transclude(newScope, function(clone) {\n            renderer.enter(clone, $element, function onUiViewEnter() {\n              if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) {\n                $uiViewScroll(clone);\n              }\n            });\n            cleanupLastView();\n          });\n\n          latestLocals = $state.$current.locals[clone.data('$uiViewName')];\n\n          currentEl = clone;\n          currentScope = newScope;\n          /**\n           * @ngdoc event\n           * @name ui.router.state.directive:ui-view#$viewContentLoaded\n           * @eventOf ui.router.state.directive:ui-view\n           * @eventType emits on ui-view directive scope\n           * @description           *\n           * Fired once the view is **loaded**, *after* the DOM is rendered.\n           *\n           * @param {Object} event Event object.\n           */\n          currentScope.$emit('$viewContentLoaded');\n          currentScope.$eval(onloadExp);\n        }\n      };\n    }\n  };\n\n  return directive;\n}\n\n$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state'];\nfunction $ViewDirectiveFill ($compile, $controller, $state) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    compile: function (tElement) {\n      var initial = tElement.html();\n      return function (scope, $element, attrs) {\n        var name      = attrs.uiView || attrs.name || '',\n            inherited = $element.inheritedData('$uiView');\n\n        if (name.indexOf('@') < 0) {\n          name = name + '@' + (inherited ? inherited.state.name : '');\n        }\n\n        $element.data('$uiViewName', name);\n\n        var current = $state.$current,\n            locals  = current && current.locals[name];\n\n        if (! locals) {\n          return;\n        }\n\n        $element.data('$uiView', { name: name, state: locals.$$state });\n        $element.html(locals.$template ? locals.$template : initial);\n\n        var link = $compile($element.contents());\n\n        if (locals.$$controller) {\n          locals.$scope = scope;\n          var controller = $controller(locals.$$controller, locals);\n          if (locals.$$controllerAs) {\n            scope[locals.$$controllerAs] = controller;\n          }\n          $element.data('$ngControllerController', controller);\n          $element.children().data('$ngControllerController', controller);\n        }\n\n        link(scope);\n      };\n    }\n  };\n}\n\nangular.module('ui.router.state').directive('uiView', $ViewDirective);\nangular.module('ui.router.state').directive('uiView', $ViewDirectiveFill);\n\nfunction parseStateRef(ref) {\n  var parsed = ref.replace(/\\n/g, \" \").match(/^([^(]+?)\\s*(\\((.*)\\))?$/);\n  if (!parsed || parsed.length !== 4) throw new Error(\"Invalid state ref '\" + ref + \"'\");\n  return { state: parsed[1], paramExpr: parsed[3] || null };\n}\n\nfunction stateContext(el) {\n  var stateData = el.parent().inheritedData('$uiView');\n\n  if (stateData && stateData.state && stateData.state.name) {\n    return stateData.state;\n  }\n}\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-sref\n *\n * @requires ui.router.state.$state\n * @requires $timeout\n *\n * @restrict A\n *\n * @description\n * A directive that binds a link (`<a>` tag) to a state. If the state has an associated \n * URL, the directive will automatically generate & update the `href` attribute via \n * the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking \n * the link will trigger a state transition with optional parameters. \n *\n * Also middle-clicking, right-clicking, and ctrl-clicking on the link will be \n * handled natively by the browser.\n *\n * You can also use relative state paths within ui-sref, just like the relative \n * paths passed to `$state.go()`. You just need to be aware that the path is relative\n * to the state that the link lives in, in other words the state that loaded the \n * template containing the link.\n *\n * You can specify options to pass to {@link ui.router.state.$state#go $state.go()}\n * using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`,\n * and `reload`.\n *\n * @example\n * Here's an example of how you'd use ui-sref and how it would compile. If you have the \n * following template:\n * <pre>\n * <a ui-sref=\"home\">Home</a> | <a ui-sref=\"about\">About</a>\n * \n * <ul>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a ui-sref=\"contacts.detail({ id: contact.id })\">{{ contact.name }}</a>\n *     </li>\n * </ul>\n * </pre>\n * \n * Then the compiled html would be (assuming Html5Mode is off):\n * <pre>\n * <a href=\"#/home\" ui-sref=\"home\">Home</a> | <a href=\"#/about\" ui-sref=\"about\">About</a>\n * \n * <ul>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/1\" ui-sref=\"contacts.detail({ id: contact.id })\">Joe</a>\n *     </li>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/2\" ui-sref=\"contacts.detail({ id: contact.id })\">Alice</a>\n *     </li>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/3\" ui-sref=\"contacts.detail({ id: contact.id })\">Bob</a>\n *     </li>\n * </ul>\n *\n * <a ui-sref=\"home\" ui-sref-opts=\"{reload: true}\">Home</a>\n * </pre>\n *\n * @param {string} ui-sref 'stateName' can be any valid absolute or relative state\n * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#go $state.go()}\n */\n$StateRefDirective.$inject = ['$state', '$timeout'];\nfunction $StateRefDirective($state, $timeout) {\n  var allowedOptions = ['location', 'inherit', 'reload'];\n\n  return {\n    restrict: 'A',\n    require: '?^uiSrefActive',\n    link: function(scope, element, attrs, uiSrefActive) {\n      var ref = parseStateRef(attrs.uiSref);\n      var params = null, url = null, base = stateContext(element) || $state.$current;\n      var isForm = element[0].nodeName === \"FORM\";\n      var attr = isForm ? \"action\" : \"href\", nav = true;\n\n      var options = {\n        relative: base\n      };\n      var optionsOverride = scope.$eval(attrs.uiSrefOpts) || {};\n      angular.forEach(allowedOptions, function(option) {\n        if (option in optionsOverride) {\n          options[option] = optionsOverride[option];\n        }\n      });\n\n      var update = function(newVal) {\n        if (newVal) params = newVal;\n        if (!nav) return;\n\n        var newHref = $state.href(ref.state, params, options);\n\n        if (uiSrefActive) {\n          uiSrefActive.$$setStateInfo(ref.state, params);\n        }\n        if (!newHref) {\n          nav = false;\n          return false;\n        }\n        element[0][attr] = newHref;\n      };\n\n      if (ref.paramExpr) {\n        scope.$watch(ref.paramExpr, function(newVal, oldVal) {\n          if (newVal !== params) update(newVal);\n        }, true);\n        params = scope.$eval(ref.paramExpr);\n      }\n      update();\n\n      if (isForm) return;\n\n      element.bind(\"click\", function(e) {\n        var button = e.which || e.button;\n        if ( !(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr('target')) ) {\n          // HACK: This is to allow ng-clicks to be processed before the transition is initiated:\n          $timeout(function() {\n            $state.go(ref.state, params, options);\n          });\n          e.preventDefault();\n        }\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-sref-active\n *\n * @requires ui.router.state.$state\n * @requires ui.router.state.$stateParams\n * @requires $interpolate\n *\n * @restrict A\n *\n * @description\n * A directive working alongside ui-sref to add classes to an element when the \n * related ui-sref directive's state is active, and removing them when it is inactive.\n * The primary use-case is to simplify the special appearance of navigation menus \n * relying on `ui-sref`, by having the \"active\" state's menu button appear different,\n * distinguishing it from the inactive menu items.\n *\n * @example\n * Given the following template:\n * <pre>\n * <ul>\n *   <li ui-sref-active=\"active\" class=\"item\">\n *     <a href ui-sref=\"app.user({user: 'bilbobaggins'})\">@bilbobaggins</a>\n *   </li>\n * </ul>\n * </pre>\n * \n * When the app state is \"app.user\", and contains the state parameter \"user\" with value \"bilbobaggins\", \n * the resulting HTML will appear as (note the 'active' class):\n * <pre>\n * <ul>\n *   <li ui-sref-active=\"active\" class=\"item active\">\n *     <a ui-sref=\"app.user({user: 'bilbobaggins'})\" href=\"/users/bilbobaggins\">@bilbobaggins</a>\n *   </li>\n * </ul>\n * </pre>\n * \n * The class name is interpolated **once** during the directives link time (any further changes to the \n * interpolated value are ignored). \n * \n * Multiple classes may be specified in a space-separated format:\n * <pre>\n * <ul>\n *   <li ui-sref-active='class1 class2 class3'>\n *     <a ui-sref=\"app.user\">link</a>\n *   </li>\n * </ul>\n * </pre>\n */\n$StateActiveDirective.$inject = ['$state', '$stateParams', '$interpolate'];\nfunction $StateActiveDirective($state, $stateParams, $interpolate) {\n  return {\n    restrict: \"A\",\n    controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n      var state, params, activeClass;\n\n      // There probably isn't much point in $observing this\n      activeClass = $interpolate($attrs.uiSrefActive || '', false)($scope);\n\n      // Allow uiSref to communicate with uiSrefActive\n      this.$$setStateInfo = function(newState, newParams) {\n        state = $state.get(newState, stateContext($element));\n        params = newParams;\n        update();\n      };\n\n      $scope.$on('$stateChangeSuccess', update);\n\n      // Update route state\n      function update() {\n        if ($state.$current.self === state && matchesParams()) {\n          $element.addClass(activeClass);\n        } else {\n          $element.removeClass(activeClass);\n        }\n      }\n\n      function matchesParams() {\n        return !params || equalForKeys(params, $stateParams);\n      }\n    }]\n  };\n}\n\nangular.module('ui.router.state')\n  .directive('uiSref', $StateRefDirective)\n  .directive('uiSrefActive', $StateActiveDirective);\n\n/**\n * @ngdoc filter\n * @name ui.router.state.filter:isState\n *\n * @requires ui.router.state.$state\n *\n * @description\n * Translates to {@link ui.router.state.$state#methods_is $state.is(\"stateName\")}.\n */\n$IsStateFilter.$inject = ['$state'];\nfunction $IsStateFilter($state) {\n  return function(state) {\n    return $state.is(state);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name ui.router.state.filter:includedByState\n *\n * @requires ui.router.state.$state\n *\n * @description\n * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}.\n */\n$IncludedByStateFilter.$inject = ['$state'];\nfunction $IncludedByStateFilter($state) {\n  return function(state) {\n    return $state.includes(state);\n  };\n}\n\nangular.module('ui.router.state')\n  .filter('isState', $IsStateFilter)\n  .filter('includedByState', $IncludedByStateFilter);\n\n/*\n * @ngdoc object\n * @name ui.router.compat.$routeProvider\n *\n * @requires ui.router.state.$stateProvider\n * @requires ui.router.router.$urlRouterProvider\n *\n * @description\n * `$routeProvider` of the `ui.router.compat` module overwrites the existing\n * `routeProvider` from the core. This is done to provide compatibility between\n * the UI Router and the core router.\n *\n * It also provides a `when()` method to register routes that map to certain urls.\n * Behind the scenes it actually delegates either to \n * {@link ui.router.router.$urlRouterProvider $urlRouterProvider} or to the \n * {@link ui.router.state.$stateProvider $stateProvider} to postprocess the given \n * router definition object.\n */\n$RouteProvider.$inject = ['$stateProvider', '$urlRouterProvider'];\nfunction $RouteProvider(  $stateProvider,    $urlRouterProvider) {\n\n  var routes = [];\n\n  onEnterRoute.$inject = ['$$state'];\n  function onEnterRoute(   $$state) {\n    /*jshint validthis: true */\n    this.locals = $$state.locals.globals;\n    this.params = this.locals.$stateParams;\n  }\n\n  function onExitRoute() {\n    /*jshint validthis: true */\n    this.locals = null;\n    this.params = null;\n  }\n\n  this.when = when;\n  /*\n   * @ngdoc function\n   * @name ui.router.compat.$routeProvider#when\n   * @methodOf ui.router.compat.$routeProvider\n   *\n   * @description\n   * Registers a route with a given route definition object. The route definition\n   * object has the same interface the angular core route definition object has.\n   * \n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.compat']);\n   *\n   * app.config(function ($routeProvider) {\n   *   $routeProvider.when('home', {\n   *     controller: function () { ... },\n   *     templateUrl: 'path/to/template'\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string} url URL as string\n   * @param {object} route Route definition object\n   *\n   * @return {object} $routeProvider - $routeProvider instance\n   */\n  function when(url, route) {\n    /*jshint validthis: true */\n    if (route.redirectTo != null) {\n      // Redirect, configure directly on $urlRouterProvider\n      var redirect = route.redirectTo, handler;\n      if (isString(redirect)) {\n        handler = redirect; // leave $urlRouterProvider to handle\n      } else if (isFunction(redirect)) {\n        // Adapt to $urlRouterProvider API\n        handler = function (params, $location) {\n          return redirect(params, $location.path(), $location.search());\n        };\n      } else {\n        throw new Error(\"Invalid 'redirectTo' in when()\");\n      }\n      $urlRouterProvider.when(url, handler);\n    } else {\n      // Regular route, configure as state\n      $stateProvider.state(inherit(route, {\n        parent: null,\n        name: 'route:' + encodeURIComponent(url),\n        url: url,\n        onEnter: onEnterRoute,\n        onExit: onExitRoute\n      }));\n    }\n    routes.push(route);\n    return this;\n  }\n\n  /*\n   * @ngdoc object\n   * @name ui.router.compat.$route\n   *\n   * @requires ui.router.state.$state\n   * @requires $rootScope\n   * @requires $routeParams\n   *\n   * @property {object} routes - Array of registered routes.\n   * @property {object} params - Current route params as object.\n   * @property {string} current - Name of the current route.\n   *\n   * @description\n   * The `$route` service provides interfaces to access defined routes. It also let's\n   * you access route params through `$routeParams` service, so you have fully\n   * control over all the stuff you would actually get from angular's core `$route`\n   * service.\n   */\n  this.$get = $get;\n  $get.$inject = ['$state', '$rootScope', '$routeParams'];\n  function $get(   $state,   $rootScope,   $routeParams) {\n\n    var $route = {\n      routes: routes,\n      params: $routeParams,\n      current: undefined\n    };\n\n    function stateAsRoute(state) {\n      return (state.name !== '') ? state : undefined;\n    }\n\n    $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {\n      $rootScope.$broadcast('$routeChangeStart', stateAsRoute(to), stateAsRoute(from));\n    });\n\n    $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {\n      $route.current = stateAsRoute(to);\n      $rootScope.$broadcast('$routeChangeSuccess', stateAsRoute(to), stateAsRoute(from));\n      copy(toParams, $route.params);\n    });\n\n    $rootScope.$on('$stateChangeError', function (ev, to, toParams, from, fromParams, error) {\n      $rootScope.$broadcast('$routeChangeError', stateAsRoute(to), stateAsRoute(from), error);\n    });\n\n    return $route;\n  }\n}\n\nangular.module('ui.router.compat')\n  .provider('$route', $RouteProvider)\n  .directive('ngView', $ViewDirective);\n})(window, window.angular);"
  },
  {
    "path": "demo/my-show-4-angularjs/js/ui-bootstrap-tpls-0.11.0.js",
    "content": "/*\n * angular-ui-bootstrap\n * http://angular-ui.github.io/bootstrap/\n\n * Version: 0.11.0 - 2014-05-01\n * License: MIT\n */\nangular.module(\"ui.bootstrap\", [\"ui.bootstrap.tpls\", \"ui.bootstrap.transition\",\"ui.bootstrap.collapse\",\"ui.bootstrap.accordion\",\"ui.bootstrap.alert\",\"ui.bootstrap.bindHtml\",\"ui.bootstrap.buttons\",\"ui.bootstrap.carousel\",\"ui.bootstrap.dateparser\",\"ui.bootstrap.position\",\"ui.bootstrap.datepicker\",\"ui.bootstrap.dropdown\",\"ui.bootstrap.modal\",\"ui.bootstrap.pagination\",\"ui.bootstrap.tooltip\",\"ui.bootstrap.popover\",\"ui.bootstrap.progressbar\",\"ui.bootstrap.rating\",\"ui.bootstrap.tabs\",\"ui.bootstrap.timepicker\",\"ui.bootstrap.typeahead\"]);\nangular.module(\"ui.bootstrap.tpls\", [\"template/accordion/accordion-group.html\",\"template/accordion/accordion.html\",\"template/alert/alert.html\",\"template/carousel/carousel.html\",\"template/carousel/slide.html\",\"template/datepicker/datepicker.html\",\"template/datepicker/day.html\",\"template/datepicker/month.html\",\"template/datepicker/popup.html\",\"template/datepicker/year.html\",\"template/modal/backdrop.html\",\"template/modal/window.html\",\"template/pagination/pager.html\",\"template/pagination/pagination.html\",\"template/tooltip/tooltip-html-unsafe-popup.html\",\"template/tooltip/tooltip-popup.html\",\"template/popover/popover.html\",\"template/progressbar/bar.html\",\"template/progressbar/progress.html\",\"template/progressbar/progressbar.html\",\"template/rating/rating.html\",\"template/tabs/tab.html\",\"template/tabs/tabset.html\",\"template/timepicker/timepicker.html\",\"template/typeahead/typeahead-match.html\",\"template/typeahead/typeahead-popup.html\"]);\nangular.module('ui.bootstrap.transition', [])\n\n/**\n * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete.\n * @param  {DOMElement} element  The DOMElement that will be animated.\n * @param  {string|object|function} trigger  The thing that will cause the transition to start:\n *   - As a string, it represents the css class to be added to the element.\n *   - As an object, it represents a hash of style attributes to be applied to the element.\n *   - As a function, it represents a function to be called that will cause the transition to occur.\n * @return {Promise}  A promise that is resolved when the transition finishes.\n */\n.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) {\n\n  var $transition = function(element, trigger, options) {\n    options = options || {};\n    var deferred = $q.defer();\n    var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName'];\n\n    var transitionEndHandler = function(event) {\n      $rootScope.$apply(function() {\n        element.unbind(endEventName, transitionEndHandler);\n        deferred.resolve(element);\n      });\n    };\n\n    if (endEventName) {\n      element.bind(endEventName, transitionEndHandler);\n    }\n\n    // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur\n    $timeout(function() {\n      if ( angular.isString(trigger) ) {\n        element.addClass(trigger);\n      } else if ( angular.isFunction(trigger) ) {\n        trigger(element);\n      } else if ( angular.isObject(trigger) ) {\n        element.css(trigger);\n      }\n      //If browser does not support transitions, instantly resolve\n      if ( !endEventName ) {\n        deferred.resolve(element);\n      }\n    });\n\n    // Add our custom cancel function to the promise that is returned\n    // We can call this if we are about to run a new transition, which we know will prevent this transition from ending,\n    // i.e. it will therefore never raise a transitionEnd event for that transition\n    deferred.promise.cancel = function() {\n      if ( endEventName ) {\n        element.unbind(endEventName, transitionEndHandler);\n      }\n      deferred.reject('Transition cancelled');\n    };\n\n    return deferred.promise;\n  };\n\n  // Work out the name of the transitionEnd event\n  var transElement = document.createElement('trans');\n  var transitionEndEventNames = {\n    'WebkitTransition': 'webkitTransitionEnd',\n    'MozTransition': 'transitionend',\n    'OTransition': 'oTransitionEnd',\n    'transition': 'transitionend'\n  };\n  var animationEndEventNames = {\n    'WebkitTransition': 'webkitAnimationEnd',\n    'MozTransition': 'animationend',\n    'OTransition': 'oAnimationEnd',\n    'transition': 'animationend'\n  };\n  function findEndEventName(endEventNames) {\n    for (var name in endEventNames){\n      if (transElement.style[name] !== undefined) {\n        return endEventNames[name];\n      }\n    }\n  }\n  $transition.transitionEndEventName = findEndEventName(transitionEndEventNames);\n  $transition.animationEndEventName = findEndEventName(animationEndEventNames);\n  return $transition;\n}]);\n\nangular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition'])\n\n  .directive('collapse', ['$transition', function ($transition) {\n\n    return {\n      link: function (scope, element, attrs) {\n\n        var initialAnimSkip = true;\n        var currentTransition;\n\n        function doTransition(change) {\n          var newTransition = $transition(element, change);\n          if (currentTransition) {\n            currentTransition.cancel();\n          }\n          currentTransition = newTransition;\n          newTransition.then(newTransitionDone, newTransitionDone);\n          return newTransition;\n\n          function newTransitionDone() {\n            // Make sure it's this transition, otherwise, leave it alone.\n            if (currentTransition === newTransition) {\n              currentTransition = undefined;\n            }\n          }\n        }\n\n        function expand() {\n          if (initialAnimSkip) {\n            initialAnimSkip = false;\n            expandDone();\n          } else {\n            element.removeClass('collapse').addClass('collapsing');\n            doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone);\n          }\n        }\n\n        function expandDone() {\n          element.removeClass('collapsing');\n          element.addClass('collapse in');\n          element.css({height: 'auto'});\n        }\n\n        function collapse() {\n          if (initialAnimSkip) {\n            initialAnimSkip = false;\n            collapseDone();\n            element.css({height: 0});\n          } else {\n            // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value\n            element.css({ height: element[0].scrollHeight + 'px' });\n            //trigger reflow so a browser realizes that height was updated from auto to a specific value\n            var x = element[0].offsetWidth;\n\n            element.removeClass('collapse in').addClass('collapsing');\n\n            doTransition({ height: 0 }).then(collapseDone);\n          }\n        }\n\n        function collapseDone() {\n          element.removeClass('collapsing');\n          element.addClass('collapse');\n        }\n\n        scope.$watch(attrs.collapse, function (shouldCollapse) {\n          if (shouldCollapse) {\n            collapse();\n          } else {\n            expand();\n          }\n        });\n      }\n    };\n  }]);\n\nangular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])\n\n.constant('accordionConfig', {\n  closeOthers: true\n})\n\n.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) {\n\n  // This array keeps track of the accordion groups\n  this.groups = [];\n\n  // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to\n  this.closeOthers = function(openGroup) {\n    var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;\n    if ( closeOthers ) {\n      angular.forEach(this.groups, function (group) {\n        if ( group !== openGroup ) {\n          group.isOpen = false;\n        }\n      });\n    }\n  };\n\n  // This is called from the accordion-group directive to add itself to the accordion\n  this.addGroup = function(groupScope) {\n    var that = this;\n    this.groups.push(groupScope);\n\n    groupScope.$on('$destroy', function (event) {\n      that.removeGroup(groupScope);\n    });\n  };\n\n  // This is called from the accordion-group directive when to remove itself\n  this.removeGroup = function(group) {\n    var index = this.groups.indexOf(group);\n    if ( index !== -1 ) {\n      this.groups.splice(index, 1);\n    }\n  };\n\n}])\n\n// The accordion directive simply sets up the directive controller\n// and adds an accordion CSS class to itself element.\n.directive('accordion', function () {\n  return {\n    restrict:'EA',\n    controller:'AccordionController',\n    transclude: true,\n    replace: false,\n    templateUrl: 'template/accordion/accordion.html'\n  };\n})\n\n// The accordion-group directive indicates a block of html that will expand and collapse in an accordion\n.directive('accordionGroup', function() {\n  return {\n    require:'^accordion',         // We need this directive to be inside an accordion\n    restrict:'EA',\n    transclude:true,              // It transcludes the contents of the directive into the template\n    replace: true,                // The element containing the directive will be replaced with the template\n    templateUrl:'template/accordion/accordion-group.html',\n    scope: {\n      heading: '@',               // Interpolate the heading attribute onto this scope\n      isOpen: '=?',\n      isDisabled: '=?'\n    },\n    controller: function() {\n      this.setHeading = function(element) {\n        this.heading = element;\n      };\n    },\n    link: function(scope, element, attrs, accordionCtrl) {\n      accordionCtrl.addGroup(scope);\n\n      scope.$watch('isOpen', function(value) {\n        if ( value ) {\n          accordionCtrl.closeOthers(scope);\n        }\n      });\n\n      scope.toggleOpen = function() {\n        if ( !scope.isDisabled ) {\n          scope.isOpen = !scope.isOpen;\n        }\n      };\n    }\n  };\n})\n\n// Use accordion-heading below an accordion-group to provide a heading containing HTML\n// <accordion-group>\n//   <accordion-heading>Heading containing HTML - <img src=\"...\"></accordion-heading>\n// </accordion-group>\n.directive('accordionHeading', function() {\n  return {\n    restrict: 'EA',\n    transclude: true,   // Grab the contents to be used as the heading\n    template: '',       // In effect remove this element!\n    replace: true,\n    require: '^accordionGroup',\n    link: function(scope, element, attr, accordionGroupCtrl, transclude) {\n      // Pass the heading to the accordion-group controller\n      // so that it can be transcluded into the right place in the template\n      // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat]\n      accordionGroupCtrl.setHeading(transclude(scope, function() {}));\n    }\n  };\n})\n\n// Use in the accordion-group template to indicate where you want the heading to be transcluded\n// You must provide the property on the accordion-group controller that will hold the transcluded element\n// <div class=\"accordion-group\">\n//   <div class=\"accordion-heading\" ><a ... accordion-transclude=\"heading\">...</a></div>\n//   ...\n// </div>\n.directive('accordionTransclude', function() {\n  return {\n    require: '^accordionGroup',\n    link: function(scope, element, attr, controller) {\n      scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) {\n        if ( heading ) {\n          element.html('');\n          element.append(heading);\n        }\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.alert', [])\n\n.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) {\n  $scope.closeable = 'close' in $attrs;\n}])\n\n.directive('alert', function () {\n  return {\n    restrict:'EA',\n    controller:'AlertController',\n    templateUrl:'template/alert/alert.html',\n    transclude:true,\n    replace:true,\n    scope: {\n      type: '@',\n      close: '&'\n    }\n  };\n});\n\nangular.module('ui.bootstrap.bindHtml', [])\n\n  .directive('bindHtmlUnsafe', function () {\n    return function (scope, element, attr) {\n      element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe);\n      scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) {\n        element.html(value || '');\n      });\n    };\n  });\nangular.module('ui.bootstrap.buttons', [])\n\n.constant('buttonConfig', {\n  activeClass: 'active',\n  toggleEvent: 'click'\n})\n\n.controller('ButtonsController', ['buttonConfig', function(buttonConfig) {\n  this.activeClass = buttonConfig.activeClass || 'active';\n  this.toggleEvent = buttonConfig.toggleEvent || 'click';\n}])\n\n.directive('btnRadio', function () {\n  return {\n    require: ['btnRadio', 'ngModel'],\n    controller: 'ButtonsController',\n    link: function (scope, element, attrs, ctrls) {\n      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      //model -> UI\n      ngModelCtrl.$render = function () {\n        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio)));\n      };\n\n      //ui->model\n      element.bind(buttonsCtrl.toggleEvent, function () {\n        var isActive = element.hasClass(buttonsCtrl.activeClass);\n\n        if (!isActive || angular.isDefined(attrs.uncheckable)) {\n          scope.$apply(function () {\n            ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio));\n            ngModelCtrl.$render();\n          });\n        }\n      });\n    }\n  };\n})\n\n.directive('btnCheckbox', function () {\n  return {\n    require: ['btnCheckbox', 'ngModel'],\n    controller: 'ButtonsController',\n    link: function (scope, element, attrs, ctrls) {\n      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      function getTrueValue() {\n        return getCheckboxValue(attrs.btnCheckboxTrue, true);\n      }\n\n      function getFalseValue() {\n        return getCheckboxValue(attrs.btnCheckboxFalse, false);\n      }\n\n      function getCheckboxValue(attributeValue, defaultValue) {\n        var val = scope.$eval(attributeValue);\n        return angular.isDefined(val) ? val : defaultValue;\n      }\n\n      //model -> UI\n      ngModelCtrl.$render = function () {\n        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));\n      };\n\n      //ui->model\n      element.bind(buttonsCtrl.toggleEvent, function () {\n        scope.$apply(function () {\n          ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());\n          ngModelCtrl.$render();\n        });\n      });\n    }\n  };\n});\n\n/**\n* @ngdoc overview\n* @name ui.bootstrap.carousel\n*\n* @description\n* AngularJS version of an image carousel.\n*\n*/\nangular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition'])\n.controller('CarouselController', ['$scope', '$timeout', '$transition', function ($scope, $timeout, $transition) {\n  var self = this,\n    slides = self.slides = $scope.slides = [],\n    currentIndex = -1,\n    currentTimeout, isPlaying;\n  self.currentSlide = null;\n\n  var destroyed = false;\n  /* direction: \"prev\" or \"next\" */\n  self.select = $scope.select = function(nextSlide, direction) {\n    var nextIndex = slides.indexOf(nextSlide);\n    //Decide direction if it's not given\n    if (direction === undefined) {\n      direction = nextIndex > currentIndex ? 'next' : 'prev';\n    }\n    if (nextSlide && nextSlide !== self.currentSlide) {\n      if ($scope.$currentTransition) {\n        $scope.$currentTransition.cancel();\n        //Timeout so ng-class in template has time to fix classes for finished slide\n        $timeout(goNext);\n      } else {\n        goNext();\n      }\n    }\n    function goNext() {\n      // Scope has been destroyed, stop here.\n      if (destroyed) { return; }\n      //If we have a slide to transition from and we have a transition type and we're allowed, go\n      if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) {\n        //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime\n        nextSlide.$element.addClass(direction);\n        var reflow = nextSlide.$element[0].offsetWidth; //force reflow\n\n        //Set all other slides to stop doing their stuff for the new transition\n        angular.forEach(slides, function(slide) {\n          angular.extend(slide, {direction: '', entering: false, leaving: false, active: false});\n        });\n        angular.extend(nextSlide, {direction: direction, active: true, entering: true});\n        angular.extend(self.currentSlide||{}, {direction: direction, leaving: true});\n\n        $scope.$currentTransition = $transition(nextSlide.$element, {});\n        //We have to create new pointers inside a closure since next & current will change\n        (function(next,current) {\n          $scope.$currentTransition.then(\n            function(){ transitionDone(next, current); },\n            function(){ transitionDone(next, current); }\n          );\n        }(nextSlide, self.currentSlide));\n      } else {\n        transitionDone(nextSlide, self.currentSlide);\n      }\n      self.currentSlide = nextSlide;\n      currentIndex = nextIndex;\n      //every time you change slides, reset the timer\n      restartTimer();\n    }\n    function transitionDone(next, current) {\n      angular.extend(next, {direction: '', active: true, leaving: false, entering: false});\n      angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false});\n      $scope.$currentTransition = null;\n    }\n  };\n  $scope.$on('$destroy', function () {\n    destroyed = true;\n  });\n\n  /* Allow outside people to call indexOf on slides array */\n  self.indexOfSlide = function(slide) {\n    return slides.indexOf(slide);\n  };\n\n  $scope.next = function() {\n    var newIndex = (currentIndex + 1) % slides.length;\n\n    //Prevent this user-triggered transition from occurring if there is already one in progress\n    if (!$scope.$currentTransition) {\n      return self.select(slides[newIndex], 'next');\n    }\n  };\n\n  $scope.prev = function() {\n    var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1;\n\n    //Prevent this user-triggered transition from occurring if there is already one in progress\n    if (!$scope.$currentTransition) {\n      return self.select(slides[newIndex], 'prev');\n    }\n  };\n\n  $scope.isActive = function(slide) {\n     return self.currentSlide === slide;\n  };\n\n  $scope.$watch('interval', restartTimer);\n  $scope.$on('$destroy', resetTimer);\n\n  function restartTimer() {\n    resetTimer();\n    var interval = +$scope.interval;\n    if (!isNaN(interval) && interval>=0) {\n      currentTimeout = $timeout(timerFn, interval);\n    }\n  }\n\n  function resetTimer() {\n    if (currentTimeout) {\n      $timeout.cancel(currentTimeout);\n      currentTimeout = null;\n    }\n  }\n\n  function timerFn() {\n    if (isPlaying) {\n      $scope.next();\n      restartTimer();\n    } else {\n      $scope.pause();\n    }\n  }\n\n  $scope.play = function() {\n    if (!isPlaying) {\n      isPlaying = true;\n      restartTimer();\n    }\n  };\n  $scope.pause = function() {\n    if (!$scope.noPause) {\n      isPlaying = false;\n      resetTimer();\n    }\n  };\n\n  self.addSlide = function(slide, element) {\n    slide.$element = element;\n    slides.push(slide);\n    //if this is the first slide or the slide is set to active, select it\n    if(slides.length === 1 || slide.active) {\n      self.select(slides[slides.length-1]);\n      if (slides.length == 1) {\n        $scope.play();\n      }\n    } else {\n      slide.active = false;\n    }\n  };\n\n  self.removeSlide = function(slide) {\n    //get the index of the slide inside the carousel\n    var index = slides.indexOf(slide);\n    slides.splice(index, 1);\n    if (slides.length > 0 && slide.active) {\n      if (index >= slides.length) {\n        self.select(slides[index-1]);\n      } else {\n        self.select(slides[index]);\n      }\n    } else if (currentIndex > index) {\n      currentIndex--;\n    }\n  };\n\n}])\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.carousel.directive:carousel\n * @restrict EA\n *\n * @description\n * Carousel is the outer container for a set of image 'slides' to showcase.\n *\n * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide.\n * @param {boolean=} noTransition Whether to disable transitions on the carousel.\n * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover).\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <carousel>\n      <slide>\n        <img src=\"http://placekitten.com/150/150\" style=\"margin:auto;\">\n        <div class=\"carousel-caption\">\n          <p>Beautiful!</p>\n        </div>\n      </slide>\n      <slide>\n        <img src=\"http://placekitten.com/100/150\" style=\"margin:auto;\">\n        <div class=\"carousel-caption\">\n          <p>D'aww!</p>\n        </div>\n      </slide>\n    </carousel>\n  </file>\n  <file name=\"demo.css\">\n    .carousel-indicators {\n      top: auto;\n      bottom: 15px;\n    }\n  </file>\n</example>\n */\n.directive('carousel', [function() {\n  return {\n    restrict: 'EA',\n    transclude: true,\n    replace: true,\n    controller: 'CarouselController',\n    require: 'carousel',\n    templateUrl: 'template/carousel/carousel.html',\n    scope: {\n      interval: '=',\n      noTransition: '=',\n      noPause: '='\n    }\n  };\n}])\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.carousel.directive:slide\n * @restrict EA\n *\n * @description\n * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}.  Must be placed as a child of a carousel element.\n *\n * @param {boolean=} active Model binding, whether or not this slide is currently active.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n<div ng-controller=\"CarouselDemoCtrl\">\n  <carousel>\n    <slide ng-repeat=\"slide in slides\" active=\"slide.active\">\n      <img ng-src=\"{{slide.image}}\" style=\"margin:auto;\">\n      <div class=\"carousel-caption\">\n        <h4>Slide {{$index}}</h4>\n        <p>{{slide.text}}</p>\n      </div>\n    </slide>\n  </carousel>\n  Interval, in milliseconds: <input type=\"number\" ng-model=\"myInterval\">\n  <br />Enter a negative number to stop the interval.\n</div>\n  </file>\n  <file name=\"script.js\">\nfunction CarouselDemoCtrl($scope) {\n  $scope.myInterval = 5000;\n}\n  </file>\n  <file name=\"demo.css\">\n    .carousel-indicators {\n      top: auto;\n      bottom: 15px;\n    }\n  </file>\n</example>\n*/\n\n.directive('slide', function() {\n  return {\n    require: '^carousel',\n    restrict: 'EA',\n    transclude: true,\n    replace: true,\n    templateUrl: 'template/carousel/slide.html',\n    scope: {\n      active: '=?'\n    },\n    link: function (scope, element, attrs, carouselCtrl) {\n      carouselCtrl.addSlide(scope, element);\n      //when the scope is destroyed then remove the slide from the current slides array\n      scope.$on('$destroy', function() {\n        carouselCtrl.removeSlide(scope);\n      });\n\n      scope.$watch('active', function(active) {\n        if (active) {\n          carouselCtrl.select(scope);\n        }\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.dateparser', [])\n\n.service('dateParser', ['$locale', 'orderByFilter', function($locale, orderByFilter) {\n\n  this.parsers = {};\n\n  var formatCodeToRegex = {\n    'yyyy': {\n      regex: '\\\\d{4}',\n      apply: function(value) { this.year = +value; }\n    },\n    'yy': {\n      regex: '\\\\d{2}',\n      apply: function(value) { this.year = +value + 2000; }\n    },\n    'y': {\n      regex: '\\\\d{1,4}',\n      apply: function(value) { this.year = +value; }\n    },\n    'MMMM': {\n      regex: $locale.DATETIME_FORMATS.MONTH.join('|'),\n      apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); }\n    },\n    'MMM': {\n      regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\n      apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); }\n    },\n    'MM': {\n      regex: '0[1-9]|1[0-2]',\n      apply: function(value) { this.month = value - 1; }\n    },\n    'M': {\n      regex: '[1-9]|1[0-2]',\n      apply: function(value) { this.month = value - 1; }\n    },\n    'dd': {\n      regex: '[0-2][0-9]{1}|3[0-1]{1}',\n      apply: function(value) { this.date = +value; }\n    },\n    'd': {\n      regex: '[1-2]?[0-9]{1}|3[0-1]{1}',\n      apply: function(value) { this.date = +value; }\n    },\n    'EEEE': {\n      regex: $locale.DATETIME_FORMATS.DAY.join('|')\n    },\n    'EEE': {\n      regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|')\n    }\n  };\n\n  this.createParser = function(format) {\n    var map = [], regex = format.split('');\n\n    angular.forEach(formatCodeToRegex, function(data, code) {\n      var index = format.indexOf(code);\n\n      if (index > -1) {\n        format = format.split('');\n\n        regex[index] = '(' + data.regex + ')';\n        format[index] = '$'; // Custom symbol to define consumed part of format\n        for (var i = index + 1, n = index + code.length; i < n; i++) {\n          regex[i] = '';\n          format[i] = '$';\n        }\n        format = format.join('');\n\n        map.push({ index: index, apply: data.apply });\n      }\n    });\n\n    return {\n      regex: new RegExp('^' + regex.join('') + '$'),\n      map: orderByFilter(map, 'index')\n    };\n  };\n\n  this.parse = function(input, format) {\n    if ( !angular.isString(input) ) {\n      return input;\n    }\n\n    format = $locale.DATETIME_FORMATS[format] || format;\n\n    if ( !this.parsers[format] ) {\n      this.parsers[format] = this.createParser(format);\n    }\n\n    var parser = this.parsers[format],\n        regex = parser.regex,\n        map = parser.map,\n        results = input.match(regex);\n\n    if ( results && results.length ) {\n      var fields = { year: 1900, month: 0, date: 1, hours: 0 }, dt;\n\n      for( var i = 1, n = results.length; i < n; i++ ) {\n        var mapper = map[i-1];\n        if ( mapper.apply ) {\n          mapper.apply.call(fields, results[i]);\n        }\n      }\n\n      if ( isValid(fields.year, fields.month, fields.date) ) {\n        dt = new Date( fields.year, fields.month, fields.date, fields.hours);\n      }\n\n      return dt;\n    }\n  };\n\n  // Check if date is valid for specific month (and year for February).\n  // Month: 0 = Jan, 1 = Feb, etc\n  function isValid(year, month, date) {\n    if ( month === 1 && date > 28) {\n        return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);\n    }\n\n    if ( month === 3 || month === 5 || month === 8 || month === 10) {\n        return date < 31;\n    }\n\n    return true;\n  }\n}]);\n\nangular.module('ui.bootstrap.position', [])\n\n/**\n * A set of utility methods that can be use to retrieve position of DOM elements.\n * It is meant to be used where we need to absolute-position DOM elements in\n * relation to other, existing elements (this is the case for tooltips, popovers,\n * typeahead suggestions etc.).\n */\n  .factory('$position', ['$document', '$window', function ($document, $window) {\n\n    function getStyle(el, cssprop) {\n      if (el.currentStyle) { //IE\n        return el.currentStyle[cssprop];\n      } else if ($window.getComputedStyle) {\n        return $window.getComputedStyle(el)[cssprop];\n      }\n      // finally try and get inline style\n      return el.style[cssprop];\n    }\n\n    /**\n     * Checks if a given element is statically positioned\n     * @param element - raw DOM element\n     */\n    function isStaticPositioned(element) {\n      return (getStyle(element, 'position') || 'static' ) === 'static';\n    }\n\n    /**\n     * returns the closest, non-statically positioned parentOffset of a given element\n     * @param element\n     */\n    var parentOffsetEl = function (element) {\n      var docDomEl = $document[0];\n      var offsetParent = element.offsetParent || docDomEl;\n      while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) {\n        offsetParent = offsetParent.offsetParent;\n      }\n      return offsetParent || docDomEl;\n    };\n\n    return {\n      /**\n       * Provides read-only equivalent of jQuery's position function:\n       * http://api.jquery.com/position/\n       */\n      position: function (element) {\n        var elBCR = this.offset(element);\n        var offsetParentBCR = { top: 0, left: 0 };\n        var offsetParentEl = parentOffsetEl(element[0]);\n        if (offsetParentEl != $document[0]) {\n          offsetParentBCR = this.offset(angular.element(offsetParentEl));\n          offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop;\n          offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft;\n        }\n\n        var boundingClientRect = element[0].getBoundingClientRect();\n        return {\n          width: boundingClientRect.width || element.prop('offsetWidth'),\n          height: boundingClientRect.height || element.prop('offsetHeight'),\n          top: elBCR.top - offsetParentBCR.top,\n          left: elBCR.left - offsetParentBCR.left\n        };\n      },\n\n      /**\n       * Provides read-only equivalent of jQuery's offset function:\n       * http://api.jquery.com/offset/\n       */\n      offset: function (element) {\n        var boundingClientRect = element[0].getBoundingClientRect();\n        return {\n          width: boundingClientRect.width || element.prop('offsetWidth'),\n          height: boundingClientRect.height || element.prop('offsetHeight'),\n          top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\n          left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\n        };\n      },\n\n      /**\n       * Provides coordinates for the targetEl in relation to hostEl\n       */\n      positionElements: function (hostEl, targetEl, positionStr, appendToBody) {\n\n        var positionStrParts = positionStr.split('-');\n        var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center';\n\n        var hostElPos,\n          targetElWidth,\n          targetElHeight,\n          targetElPos;\n\n        hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl);\n\n        targetElWidth = targetEl.prop('offsetWidth');\n        targetElHeight = targetEl.prop('offsetHeight');\n\n        var shiftWidth = {\n          center: function () {\n            return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2;\n          },\n          left: function () {\n            return hostElPos.left;\n          },\n          right: function () {\n            return hostElPos.left + hostElPos.width;\n          }\n        };\n\n        var shiftHeight = {\n          center: function () {\n            return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2;\n          },\n          top: function () {\n            return hostElPos.top;\n          },\n          bottom: function () {\n            return hostElPos.top + hostElPos.height;\n          }\n        };\n\n        switch (pos0) {\n          case 'right':\n            targetElPos = {\n              top: shiftHeight[pos1](),\n              left: shiftWidth[pos0]()\n            };\n            break;\n          case 'left':\n            targetElPos = {\n              top: shiftHeight[pos1](),\n              left: hostElPos.left - targetElWidth\n            };\n            break;\n          case 'bottom':\n            targetElPos = {\n              top: shiftHeight[pos0](),\n              left: shiftWidth[pos1]()\n            };\n            break;\n          default:\n            targetElPos = {\n              top: hostElPos.top - targetElHeight,\n              left: shiftWidth[pos1]()\n            };\n            break;\n        }\n\n        return targetElPos;\n      }\n    };\n  }]);\n\nangular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position'])\n\n.constant('datepickerConfig', {\n  formatDay: 'dd',\n  formatMonth: 'MMMM',\n  formatYear: 'yyyy',\n  formatDayHeader: 'EEE',\n  formatDayTitle: 'MMMM yyyy',\n  formatMonthTitle: 'yyyy',\n  datepickerMode: 'day',\n  minMode: 'day',\n  maxMode: 'year',\n  showWeeks: true,\n  startingDay: 0,\n  yearRange: 20,\n  minDate: null,\n  maxDate: null\n})\n\n.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) {\n  var self = this,\n      ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl;\n\n  // Modes chain\n  this.modes = ['day', 'month', 'year'];\n\n  // Configuration attributes\n  angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle',\n                   'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange'], function( key, index ) {\n    self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key];\n  });\n\n  // Watchable attributes\n  angular.forEach(['minDate', 'maxDate'], function( key ) {\n    if ( $attrs[key] ) {\n      $scope.$parent.$watch($parse($attrs[key]), function(value) {\n        self[key] = value ? new Date(value) : null;\n        self.refreshView();\n      });\n    } else {\n      self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null;\n    }\n  });\n\n  $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode;\n  $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);\n  this.activeDate = angular.isDefined($attrs.initDate) ? $scope.$parent.$eval($attrs.initDate) : new Date();\n\n  $scope.isActive = function(dateObject) {\n    if (self.compare(dateObject.date, self.activeDate) === 0) {\n      $scope.activeDateId = dateObject.uid;\n      return true;\n    }\n    return false;\n  };\n\n  this.init = function( ngModelCtrl_ ) {\n    ngModelCtrl = ngModelCtrl_;\n\n    ngModelCtrl.$render = function() {\n      self.render();\n    };\n  };\n\n  this.render = function() {\n    if ( ngModelCtrl.$modelValue ) {\n      var date = new Date( ngModelCtrl.$modelValue ),\n          isValid = !isNaN(date);\n\n      if ( isValid ) {\n        this.activeDate = date;\n      } else {\n        $log.error('Datepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\n      }\n      ngModelCtrl.$setValidity('date', isValid);\n    }\n    this.refreshView();\n  };\n\n  this.refreshView = function() {\n    if ( this.element ) {\n      this._refreshView();\n\n      var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null;\n      ngModelCtrl.$setValidity('date-disabled', !date || (this.element && !this.isDisabled(date)));\n    }\n  };\n\n  this.createDateObject = function(date, format) {\n    var model = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null;\n    return {\n      date: date,\n      label: dateFilter(date, format),\n      selected: model && this.compare(date, model) === 0,\n      disabled: this.isDisabled(date),\n      current: this.compare(date, new Date()) === 0\n    };\n  };\n\n  this.isDisabled = function( date ) {\n    return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode})));\n  };\n\n  // Split array into smaller arrays\n  this.split = function(arr, size) {\n    var arrays = [];\n    while (arr.length > 0) {\n      arrays.push(arr.splice(0, size));\n    }\n    return arrays;\n  };\n\n  $scope.select = function( date ) {\n    if ( $scope.datepickerMode === self.minMode ) {\n      var dt = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0);\n      dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() );\n      ngModelCtrl.$setViewValue( dt );\n      ngModelCtrl.$render();\n    } else {\n      self.activeDate = date;\n      $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ];\n    }\n  };\n\n  $scope.move = function( direction ) {\n    var year = self.activeDate.getFullYear() + direction * (self.step.years || 0),\n        month = self.activeDate.getMonth() + direction * (self.step.months || 0);\n    self.activeDate.setFullYear(year, month, 1);\n    self.refreshView();\n  };\n\n  $scope.toggleMode = function( direction ) {\n    direction = direction || 1;\n\n    if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) {\n      return;\n    }\n\n    $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ];\n  };\n\n  // Key event mapper\n  $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' };\n\n  var focusElement = function() {\n    $timeout(function() {\n      self.element[0].focus();\n    }, 0 , false);\n  };\n\n  // Listen for focus requests from popup directive\n  $scope.$on('datepicker.focus', focusElement);\n\n  $scope.keydown = function( evt ) {\n    var key = $scope.keys[evt.which];\n\n    if ( !key || evt.shiftKey || evt.altKey ) {\n      return;\n    }\n\n    evt.preventDefault();\n    evt.stopPropagation();\n\n    if (key === 'enter' || key === 'space') {\n      if ( self.isDisabled(self.activeDate)) {\n        return; // do nothing\n      }\n      $scope.select(self.activeDate);\n      focusElement();\n    } else if (evt.ctrlKey && (key === 'up' || key === 'down')) {\n      $scope.toggleMode(key === 'up' ? 1 : -1);\n      focusElement();\n    } else {\n      self.handleKeyDown(key, evt);\n      self.refreshView();\n    }\n  };\n}])\n\n.directive( 'datepicker', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/datepicker.html',\n    scope: {\n      datepickerMode: '=?',\n      dateDisabled: '&'\n    },\n    require: ['datepicker', '?^ngModel'],\n    controller: 'DatepickerController',\n    link: function(scope, element, attrs, ctrls) {\n      var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if ( ngModelCtrl ) {\n        datepickerCtrl.init( ngModelCtrl );\n      }\n    }\n  };\n})\n\n.directive('daypicker', ['dateFilter', function (dateFilter) {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/day.html',\n    require: '^datepicker',\n    link: function(scope, element, attrs, ctrl) {\n      scope.showWeeks = ctrl.showWeeks;\n\n      ctrl.step = { months: 1 };\n      ctrl.element = element;\n\n      var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n      function getDaysInMonth( year, month ) {\n        return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month];\n      }\n\n      function getDates(startDate, n) {\n        var dates = new Array(n), current = new Date(startDate), i = 0;\n        current.setHours(12); // Prevent repeated dates because of timezone bug\n        while ( i < n ) {\n          dates[i++] = new Date(current);\n          current.setDate( current.getDate() + 1 );\n        }\n        return dates;\n      }\n\n      ctrl._refreshView = function() {\n        var year = ctrl.activeDate.getFullYear(),\n          month = ctrl.activeDate.getMonth(),\n          firstDayOfMonth = new Date(year, month, 1),\n          difference = ctrl.startingDay - firstDayOfMonth.getDay(),\n          numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference,\n          firstDate = new Date(firstDayOfMonth);\n\n        if ( numDisplayedFromPreviousMonth > 0 ) {\n          firstDate.setDate( - numDisplayedFromPreviousMonth + 1 );\n        }\n\n        // 42 is the number of days on a six-month calendar\n        var days = getDates(firstDate, 42);\n        for (var i = 0; i < 42; i ++) {\n          days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), {\n            secondary: days[i].getMonth() !== month,\n            uid: scope.uniqueId + '-' + i\n          });\n        }\n\n        scope.labels = new Array(7);\n        for (var j = 0; j < 7; j++) {\n          scope.labels[j] = {\n            abbr: dateFilter(days[j].date, ctrl.formatDayHeader),\n            full: dateFilter(days[j].date, 'EEEE')\n          };\n        }\n\n        scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle);\n        scope.rows = ctrl.split(days, 7);\n\n        if ( scope.showWeeks ) {\n          scope.weekNumbers = [];\n          var weekNumber = getISO8601WeekNumber( scope.rows[0][0].date ),\n              numWeeks = scope.rows.length;\n          while( scope.weekNumbers.push(weekNumber++) < numWeeks ) {}\n        }\n      };\n\n      ctrl.compare = function(date1, date2) {\n        return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) );\n      };\n\n      function getISO8601WeekNumber(date) {\n        var checkDate = new Date(date);\n        checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday\n        var time = checkDate.getTime();\n        checkDate.setMonth(0); // Compare with Jan 1\n        checkDate.setDate(1);\n        return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n      }\n\n      ctrl.handleKeyDown = function( key, evt ) {\n        var date = ctrl.activeDate.getDate();\n\n        if (key === 'left') {\n          date = date - 1;   // up\n        } else if (key === 'up') {\n          date = date - 7;   // down\n        } else if (key === 'right') {\n          date = date + 1;   // down\n        } else if (key === 'down') {\n          date = date + 7;\n        } else if (key === 'pageup' || key === 'pagedown') {\n          var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1);\n          ctrl.activeDate.setMonth(month, 1);\n          date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date);\n        } else if (key === 'home') {\n          date = 1;\n        } else if (key === 'end') {\n          date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth());\n        }\n        ctrl.activeDate.setDate(date);\n      };\n\n      ctrl.refreshView();\n    }\n  };\n}])\n\n.directive('monthpicker', ['dateFilter', function (dateFilter) {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/month.html',\n    require: '^datepicker',\n    link: function(scope, element, attrs, ctrl) {\n      ctrl.step = { years: 1 };\n      ctrl.element = element;\n\n      ctrl._refreshView = function() {\n        var months = new Array(12),\n            year = ctrl.activeDate.getFullYear();\n\n        for ( var i = 0; i < 12; i++ ) {\n          months[i] = angular.extend(ctrl.createDateObject(new Date(year, i, 1), ctrl.formatMonth), {\n            uid: scope.uniqueId + '-' + i\n          });\n        }\n\n        scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle);\n        scope.rows = ctrl.split(months, 3);\n      };\n\n      ctrl.compare = function(date1, date2) {\n        return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() );\n      };\n\n      ctrl.handleKeyDown = function( key, evt ) {\n        var date = ctrl.activeDate.getMonth();\n\n        if (key === 'left') {\n          date = date - 1;   // up\n        } else if (key === 'up') {\n          date = date - 3;   // down\n        } else if (key === 'right') {\n          date = date + 1;   // down\n        } else if (key === 'down') {\n          date = date + 3;\n        } else if (key === 'pageup' || key === 'pagedown') {\n          var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1);\n          ctrl.activeDate.setFullYear(year);\n        } else if (key === 'home') {\n          date = 0;\n        } else if (key === 'end') {\n          date = 11;\n        }\n        ctrl.activeDate.setMonth(date);\n      };\n\n      ctrl.refreshView();\n    }\n  };\n}])\n\n.directive('yearpicker', ['dateFilter', function (dateFilter) {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/year.html',\n    require: '^datepicker',\n    link: function(scope, element, attrs, ctrl) {\n      var range = ctrl.yearRange;\n\n      ctrl.step = { years: range };\n      ctrl.element = element;\n\n      function getStartingYear( year ) {\n        return parseInt((year - 1) / range, 10) * range + 1;\n      }\n\n      ctrl._refreshView = function() {\n        var years = new Array(range);\n\n        for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) {\n          years[i] = angular.extend(ctrl.createDateObject(new Date(start + i, 0, 1), ctrl.formatYear), {\n            uid: scope.uniqueId + '-' + i\n          });\n        }\n\n        scope.title = [years[0].label, years[range - 1].label].join(' - ');\n        scope.rows = ctrl.split(years, 5);\n      };\n\n      ctrl.compare = function(date1, date2) {\n        return date1.getFullYear() - date2.getFullYear();\n      };\n\n      ctrl.handleKeyDown = function( key, evt ) {\n        var date = ctrl.activeDate.getFullYear();\n\n        if (key === 'left') {\n          date = date - 1;   // up\n        } else if (key === 'up') {\n          date = date - 5;   // down\n        } else if (key === 'right') {\n          date = date + 1;   // down\n        } else if (key === 'down') {\n          date = date + 5;\n        } else if (key === 'pageup' || key === 'pagedown') {\n          date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years;\n        } else if (key === 'home') {\n          date = getStartingYear( ctrl.activeDate.getFullYear() );\n        } else if (key === 'end') {\n          date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1;\n        }\n        ctrl.activeDate.setFullYear(date);\n      };\n\n      ctrl.refreshView();\n    }\n  };\n}])\n\n.constant('datepickerPopupConfig', {\n  datepickerPopup: 'yyyy-MM-dd',\n  currentText: 'Today',\n  clearText: 'Clear',\n  closeText: 'Done',\n  closeOnDateSelection: true,\n  appendToBody: false,\n  showButtonBar: true\n})\n\n.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig',\nfunction ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) {\n  return {\n    restrict: 'EA',\n    require: 'ngModel',\n    scope: {\n      isOpen: '=?',\n      currentText: '@',\n      clearText: '@',\n      closeText: '@',\n      dateDisabled: '&'\n    },\n    link: function(scope, element, attrs, ngModel) {\n      var dateFormat,\n          closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection,\n          appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody;\n\n      scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar;\n\n      scope.getText = function( key ) {\n        return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text'];\n      };\n\n      attrs.$observe('datepickerPopup', function(value) {\n          dateFormat = value || datepickerPopupConfig.datepickerPopup;\n          ngModel.$render();\n      });\n\n      // popup element used to display calendar\n      var popupEl = angular.element('<div datepicker-popup-wrap><div datepicker></div></div>');\n      popupEl.attr({\n        'ng-model': 'date',\n        'ng-change': 'dateSelection()'\n      });\n\n      function cameltoDash( string ){\n        return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); });\n      }\n\n      // datepicker element\n      var datepickerEl = angular.element(popupEl.children()[0]);\n      if ( attrs.datepickerOptions ) {\n        angular.forEach(scope.$parent.$eval(attrs.datepickerOptions), function( value, option ) {\n          datepickerEl.attr( cameltoDash(option), value );\n        });\n      }\n\n      angular.forEach(['minDate', 'maxDate'], function( key ) {\n        if ( attrs[key] ) {\n          scope.$parent.$watch($parse(attrs[key]), function(value){\n            scope[key] = value;\n          });\n          datepickerEl.attr(cameltoDash(key), key);\n        }\n      });\n      if (attrs.dateDisabled) {\n        datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })');\n      }\n\n      function parseDate(viewValue) {\n        if (!viewValue) {\n          ngModel.$setValidity('date', true);\n          return null;\n        } else if (angular.isDate(viewValue) && !isNaN(viewValue)) {\n          ngModel.$setValidity('date', true);\n          return viewValue;\n        } else if (angular.isString(viewValue)) {\n          var date = dateParser.parse(viewValue, dateFormat) || new Date(viewValue);\n          if (isNaN(date)) {\n            ngModel.$setValidity('date', false);\n            return undefined;\n          } else {\n            ngModel.$setValidity('date', true);\n            return date;\n          }\n        } else {\n          ngModel.$setValidity('date', false);\n          return undefined;\n        }\n      }\n      ngModel.$parsers.unshift(parseDate);\n\n      // Inner change\n      scope.dateSelection = function(dt) {\n        if (angular.isDefined(dt)) {\n          scope.date = dt;\n        }\n        ngModel.$setViewValue(scope.date);\n        ngModel.$render();\n\n        if ( closeOnDateSelection ) {\n          scope.isOpen = false;\n          element[0].focus();\n        }\n      };\n\n      element.bind('input change keyup', function() {\n        scope.$apply(function() {\n          scope.date = ngModel.$modelValue;\n        });\n      });\n\n      // Outter change\n      ngModel.$render = function() {\n        var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : '';\n        element.val(date);\n        scope.date = parseDate( ngModel.$modelValue );\n      };\n\n      var documentClickBind = function(event) {\n        if (scope.isOpen && event.target !== element[0]) {\n          scope.$apply(function() {\n            scope.isOpen = false;\n          });\n        }\n      };\n\n      var keydown = function(evt, noApply) {\n        scope.keydown(evt);\n      };\n      element.bind('keydown', keydown);\n\n      scope.keydown = function(evt) {\n        if (evt.which === 27) {\n          evt.preventDefault();\n          evt.stopPropagation();\n          scope.close();\n        } else if (evt.which === 40 && !scope.isOpen) {\n          scope.isOpen = true;\n        }\n      };\n\n      scope.$watch('isOpen', function(value) {\n        if (value) {\n          scope.$broadcast('datepicker.focus');\n          scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n          scope.position.top = scope.position.top + element.prop('offsetHeight');\n\n          $document.bind('click', documentClickBind);\n        } else {\n          $document.unbind('click', documentClickBind);\n        }\n      });\n\n      scope.select = function( date ) {\n        if (date === 'today') {\n          var today = new Date();\n          if (angular.isDate(ngModel.$modelValue)) {\n            date = new Date(ngModel.$modelValue);\n            date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate());\n          } else {\n            date = new Date(today.setHours(0, 0, 0, 0));\n          }\n        }\n        scope.dateSelection( date );\n      };\n\n      scope.close = function() {\n        scope.isOpen = false;\n        element[0].focus();\n      };\n\n      var $popup = $compile(popupEl)(scope);\n      if ( appendToBody ) {\n        $document.find('body').append($popup);\n      } else {\n        element.after($popup);\n      }\n\n      scope.$on('$destroy', function() {\n        $popup.remove();\n        element.unbind('keydown', keydown);\n        $document.unbind('click', documentClickBind);\n      });\n    }\n  };\n}])\n\n.directive('datepickerPopupWrap', function() {\n  return {\n    restrict:'EA',\n    replace: true,\n    transclude: true,\n    templateUrl: 'template/datepicker/popup.html',\n    link:function (scope, element, attrs) {\n      element.bind('click', function(event) {\n        event.preventDefault();\n        event.stopPropagation();\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.dropdown', [])\n\n.constant('dropdownConfig', {\n  openClass: 'open'\n})\n\n.service('dropdownService', ['$document', function($document) {\n  var openScope = null;\n\n  this.open = function( dropdownScope ) {\n    if ( !openScope ) {\n      $document.bind('click', closeDropdown);\n      $document.bind('keydown', escapeKeyBind);\n    }\n\n    if ( openScope && openScope !== dropdownScope ) {\n        openScope.isOpen = false;\n    }\n\n    openScope = dropdownScope;\n  };\n\n  this.close = function( dropdownScope ) {\n    if ( openScope === dropdownScope ) {\n      openScope = null;\n      $document.unbind('click', closeDropdown);\n      $document.unbind('keydown', escapeKeyBind);\n    }\n  };\n\n  var closeDropdown = function( evt ) {\n    if (evt && evt.isDefaultPrevented()) {\n        return;\n    }\n\n    openScope.$apply(function() {\n      openScope.isOpen = false;\n    });\n  };\n\n  var escapeKeyBind = function( evt ) {\n    if ( evt.which === 27 ) {\n      openScope.focusToggleElement();\n      closeDropdown();\n    }\n  };\n}])\n\n.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) {\n  var self = this,\n      scope = $scope.$new(), // create a child scope so we are not polluting original one\n      openClass = dropdownConfig.openClass,\n      getIsOpen,\n      setIsOpen = angular.noop,\n      toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop;\n\n  this.init = function( element ) {\n    self.$element = element;\n\n    if ( $attrs.isOpen ) {\n      getIsOpen = $parse($attrs.isOpen);\n      setIsOpen = getIsOpen.assign;\n\n      $scope.$watch(getIsOpen, function(value) {\n        scope.isOpen = !!value;\n      });\n    }\n  };\n\n  this.toggle = function( open ) {\n    return scope.isOpen = arguments.length ? !!open : !scope.isOpen;\n  };\n\n  // Allow other directives to watch status\n  this.isOpen = function() {\n    return scope.isOpen;\n  };\n\n  scope.focusToggleElement = function() {\n    if ( self.toggleElement ) {\n      self.toggleElement[0].focus();\n    }\n  };\n\n  scope.$watch('isOpen', function( isOpen, wasOpen ) {\n    $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass);\n\n    if ( isOpen ) {\n      scope.focusToggleElement();\n      dropdownService.open( scope );\n    } else {\n      dropdownService.close( scope );\n    }\n\n    setIsOpen($scope, isOpen);\n    if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\n      toggleInvoker($scope, { open: !!isOpen });\n    }\n  });\n\n  $scope.$on('$locationChangeSuccess', function() {\n    scope.isOpen = false;\n  });\n\n  $scope.$on('$destroy', function() {\n    scope.$destroy();\n  });\n}])\n\n.directive('dropdown', function() {\n  return {\n    restrict: 'CA',\n    controller: 'DropdownController',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      dropdownCtrl.init( element );\n    }\n  };\n})\n\n.directive('dropdownToggle', function() {\n  return {\n    restrict: 'CA',\n    require: '?^dropdown',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      if ( !dropdownCtrl ) {\n        return;\n      }\n\n      dropdownCtrl.toggleElement = element;\n\n      var toggleDropdown = function(event) {\n        event.preventDefault();\n\n        if ( !element.hasClass('disabled') && !attrs.disabled ) {\n          scope.$apply(function() {\n            dropdownCtrl.toggle();\n          });\n        }\n      };\n\n      element.bind('click', toggleDropdown);\n\n      // WAI-ARIA\n      element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\n      scope.$watch(dropdownCtrl.isOpen, function( isOpen ) {\n        element.attr('aria-expanded', !!isOpen);\n      });\n\n      scope.$on('$destroy', function() {\n        element.unbind('click', toggleDropdown);\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.modal', ['ui.bootstrap.transition'])\n\n/**\n * A helper, internal data structure that acts as a map but also allows getting / removing\n * elements in the LIFO order\n */\n  .factory('$$stackedMap', function () {\n    return {\n      createNew: function () {\n        var stack = [];\n\n        return {\n          add: function (key, value) {\n            stack.push({\n              key: key,\n              value: value\n            });\n          },\n          get: function (key) {\n            for (var i = 0; i < stack.length; i++) {\n              if (key == stack[i].key) {\n                return stack[i];\n              }\n            }\n          },\n          keys: function() {\n            var keys = [];\n            for (var i = 0; i < stack.length; i++) {\n              keys.push(stack[i].key);\n            }\n            return keys;\n          },\n          top: function () {\n            return stack[stack.length - 1];\n          },\n          remove: function (key) {\n            var idx = -1;\n            for (var i = 0; i < stack.length; i++) {\n              if (key == stack[i].key) {\n                idx = i;\n                break;\n              }\n            }\n            return stack.splice(idx, 1)[0];\n          },\n          removeTop: function () {\n            return stack.splice(stack.length - 1, 1)[0];\n          },\n          length: function () {\n            return stack.length;\n          }\n        };\n      }\n    };\n  })\n\n/**\n * A helper directive for the $modal service. It creates a backdrop element.\n */\n  .directive('modalBackdrop', ['$timeout', function ($timeout) {\n    return {\n      restrict: 'EA',\n      replace: true,\n      templateUrl: 'template/modal/backdrop.html',\n      link: function (scope) {\n\n        scope.animate = false;\n\n        //trigger CSS transitions\n        $timeout(function () {\n          scope.animate = true;\n        });\n      }\n    };\n  }])\n\n  .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) {\n    return {\n      restrict: 'EA',\n      scope: {\n        index: '@',\n        animate: '='\n      },\n      replace: true,\n      transclude: true,\n      templateUrl: function(tElement, tAttrs) {\n        return tAttrs.templateUrl || 'template/modal/window.html';\n      },\n      link: function (scope, element, attrs) {\n        element.addClass(attrs.windowClass || '');\n        scope.size = attrs.size;\n\n        $timeout(function () {\n          // trigger CSS transitions\n          scope.animate = true;\n          // focus a freshly-opened modal\n          element[0].focus();\n        });\n\n        scope.close = function (evt) {\n          var modal = $modalStack.getTop();\n          if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) {\n            evt.preventDefault();\n            evt.stopPropagation();\n            $modalStack.dismiss(modal.key, 'backdrop click');\n          }\n        };\n      }\n    };\n  }])\n\n  .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap',\n    function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) {\n\n      var OPENED_MODAL_CLASS = 'modal-open';\n\n      var backdropDomEl, backdropScope;\n      var openedWindows = $$stackedMap.createNew();\n      var $modalStack = {};\n\n      function backdropIndex() {\n        var topBackdropIndex = -1;\n        var opened = openedWindows.keys();\n        for (var i = 0; i < opened.length; i++) {\n          if (openedWindows.get(opened[i]).value.backdrop) {\n            topBackdropIndex = i;\n          }\n        }\n        return topBackdropIndex;\n      }\n\n      $rootScope.$watch(backdropIndex, function(newBackdropIndex){\n        if (backdropScope) {\n          backdropScope.index = newBackdropIndex;\n        }\n      });\n\n      function removeModalWindow(modalInstance) {\n\n        var body = $document.find('body').eq(0);\n        var modalWindow = openedWindows.get(modalInstance).value;\n\n        //clean up the stack\n        openedWindows.remove(modalInstance);\n\n        //remove window DOM element\n        removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, function() {\n          modalWindow.modalScope.$destroy();\n          body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0);\n          checkRemoveBackdrop();\n        });\n      }\n\n      function checkRemoveBackdrop() {\n          //remove backdrop if no longer needed\n          if (backdropDomEl && backdropIndex() == -1) {\n            var backdropScopeRef = backdropScope;\n            removeAfterAnimate(backdropDomEl, backdropScope, 150, function () {\n              backdropScopeRef.$destroy();\n              backdropScopeRef = null;\n            });\n            backdropDomEl = undefined;\n            backdropScope = undefined;\n          }\n      }\n\n      function removeAfterAnimate(domEl, scope, emulateTime, done) {\n        // Closing animation\n        scope.animate = false;\n\n        var transitionEndEventName = $transition.transitionEndEventName;\n        if (transitionEndEventName) {\n          // transition out\n          var timeout = $timeout(afterAnimating, emulateTime);\n\n          domEl.bind(transitionEndEventName, function () {\n            $timeout.cancel(timeout);\n            afterAnimating();\n            scope.$apply();\n          });\n        } else {\n          // Ensure this call is async\n          $timeout(afterAnimating, 0);\n        }\n\n        function afterAnimating() {\n          if (afterAnimating.done) {\n            return;\n          }\n          afterAnimating.done = true;\n\n          domEl.remove();\n          if (done) {\n            done();\n          }\n        }\n      }\n\n      $document.bind('keydown', function (evt) {\n        var modal;\n\n        if (evt.which === 27) {\n          modal = openedWindows.top();\n          if (modal && modal.value.keyboard) {\n            evt.preventDefault();\n            $rootScope.$apply(function () {\n              $modalStack.dismiss(modal.key, 'escape key press');\n            });\n          }\n        }\n      });\n\n      $modalStack.open = function (modalInstance, modal) {\n\n        openedWindows.add(modalInstance, {\n          deferred: modal.deferred,\n          modalScope: modal.scope,\n          backdrop: modal.backdrop,\n          keyboard: modal.keyboard\n        });\n\n        var body = $document.find('body').eq(0),\n            currBackdropIndex = backdropIndex();\n\n        if (currBackdropIndex >= 0 && !backdropDomEl) {\n          backdropScope = $rootScope.$new(true);\n          backdropScope.index = currBackdropIndex;\n          backdropDomEl = $compile('<div modal-backdrop></div>')(backdropScope);\n          body.append(backdropDomEl);\n        }\n\n        var angularDomEl = angular.element('<div modal-window></div>');\n        angularDomEl.attr({\n          'template-url': modal.windowTemplateUrl,\n          'window-class': modal.windowClass,\n          'size': modal.size,\n          'index': openedWindows.length() - 1,\n          'animate': 'animate'\n        }).html(modal.content);\n\n        var modalDomEl = $compile(angularDomEl)(modal.scope);\n        openedWindows.top().value.modalDomEl = modalDomEl;\n        body.append(modalDomEl);\n        body.addClass(OPENED_MODAL_CLASS);\n      };\n\n      $modalStack.close = function (modalInstance, result) {\n        var modalWindow = openedWindows.get(modalInstance).value;\n        if (modalWindow) {\n          modalWindow.deferred.resolve(result);\n          removeModalWindow(modalInstance);\n        }\n      };\n\n      $modalStack.dismiss = function (modalInstance, reason) {\n        var modalWindow = openedWindows.get(modalInstance).value;\n        if (modalWindow) {\n          modalWindow.deferred.reject(reason);\n          removeModalWindow(modalInstance);\n        }\n      };\n\n      $modalStack.dismissAll = function (reason) {\n        var topModal = this.getTop();\n        while (topModal) {\n          this.dismiss(topModal.key, reason);\n          topModal = this.getTop();\n        }\n      };\n\n      $modalStack.getTop = function () {\n        return openedWindows.top();\n      };\n\n      return $modalStack;\n    }])\n\n  .provider('$modal', function () {\n\n    var $modalProvider = {\n      options: {\n        backdrop: true, //can be also false or 'static'\n        keyboard: true\n      },\n      $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack',\n        function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) {\n\n          var $modal = {};\n\n          function getTemplatePromise(options) {\n            return options.template ? $q.when(options.template) :\n              $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) {\n                return result.data;\n              });\n          }\n\n          function getResolvePromises(resolves) {\n            var promisesArr = [];\n            angular.forEach(resolves, function (value, key) {\n              if (angular.isFunction(value) || angular.isArray(value)) {\n                promisesArr.push($q.when($injector.invoke(value)));\n              }\n            });\n            return promisesArr;\n          }\n\n          $modal.open = function (modalOptions) {\n\n            var modalResultDeferred = $q.defer();\n            var modalOpenedDeferred = $q.defer();\n\n            //prepare an instance of a modal to be injected into controllers and returned to a caller\n            var modalInstance = {\n              result: modalResultDeferred.promise,\n              opened: modalOpenedDeferred.promise,\n              close: function (result) {\n                $modalStack.close(modalInstance, result);\n              },\n              dismiss: function (reason) {\n                $modalStack.dismiss(modalInstance, reason);\n              }\n            };\n\n            //merge and clean up options\n            modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\n            modalOptions.resolve = modalOptions.resolve || {};\n\n            //verify options\n            if (!modalOptions.template && !modalOptions.templateUrl) {\n              throw new Error('One of template or templateUrl options is required.');\n            }\n\n            var templateAndResolvePromise =\n              $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));\n\n\n            templateAndResolvePromise.then(function resolveSuccess(tplAndVars) {\n\n              var modalScope = (modalOptions.scope || $rootScope).$new();\n              modalScope.$close = modalInstance.close;\n              modalScope.$dismiss = modalInstance.dismiss;\n\n              var ctrlInstance, ctrlLocals = {};\n              var resolveIter = 1;\n\n              //controllers\n              if (modalOptions.controller) {\n                ctrlLocals.$scope = modalScope;\n                ctrlLocals.$modalInstance = modalInstance;\n                angular.forEach(modalOptions.resolve, function (value, key) {\n                  ctrlLocals[key] = tplAndVars[resolveIter++];\n                });\n\n                ctrlInstance = $controller(modalOptions.controller, ctrlLocals);\n              }\n\n              $modalStack.open(modalInstance, {\n                scope: modalScope,\n                deferred: modalResultDeferred,\n                content: tplAndVars[0],\n                backdrop: modalOptions.backdrop,\n                keyboard: modalOptions.keyboard,\n                windowClass: modalOptions.windowClass,\n                windowTemplateUrl: modalOptions.windowTemplateUrl,\n                size: modalOptions.size\n              });\n\n            }, function resolveError(reason) {\n              modalResultDeferred.reject(reason);\n            });\n\n            templateAndResolvePromise.then(function () {\n              modalOpenedDeferred.resolve(true);\n            }, function () {\n              modalOpenedDeferred.reject(false);\n            });\n\n            return modalInstance;\n          };\n\n          return $modal;\n        }]\n    };\n\n    return $modalProvider;\n  });\n\nangular.module('ui.bootstrap.pagination', [])\n\n.controller('PaginationController', ['$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) {\n  var self = this,\n      ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\n      setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;\n\n  this.init = function(ngModelCtrl_, config) {\n    ngModelCtrl = ngModelCtrl_;\n    this.config = config;\n\n    ngModelCtrl.$render = function() {\n      self.render();\n    };\n\n    if ($attrs.itemsPerPage) {\n      $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) {\n        self.itemsPerPage = parseInt(value, 10);\n        $scope.totalPages = self.calculateTotalPages();\n      });\n    } else {\n      this.itemsPerPage = config.itemsPerPage;\n    }\n  };\n\n  this.calculateTotalPages = function() {\n    var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage);\n    return Math.max(totalPages || 0, 1);\n  };\n\n  this.render = function() {\n    $scope.page = parseInt(ngModelCtrl.$viewValue, 10) || 1;\n  };\n\n  $scope.selectPage = function(page) {\n    if ( $scope.page !== page && page > 0 && page <= $scope.totalPages) {\n      ngModelCtrl.$setViewValue(page);\n      ngModelCtrl.$render();\n    }\n  };\n\n  $scope.getText = function( key ) {\n    return $scope[key + 'Text'] || self.config[key + 'Text'];\n  };\n  $scope.noPrevious = function() {\n    return $scope.page === 1;\n  };\n  $scope.noNext = function() {\n    return $scope.page === $scope.totalPages;\n  };\n\n  $scope.$watch('totalItems', function() {\n    $scope.totalPages = self.calculateTotalPages();\n  });\n\n  $scope.$watch('totalPages', function(value) {\n    setNumPages($scope.$parent, value); // Readonly variable\n\n    if ( $scope.page > value ) {\n      $scope.selectPage(value);\n    } else {\n      ngModelCtrl.$render();\n    }\n  });\n}])\n\n.constant('paginationConfig', {\n  itemsPerPage: 10,\n  boundaryLinks: false,\n  directionLinks: true,\n  firstText: 'First',\n  previousText: 'Previous',\n  nextText: 'Next',\n  lastText: 'Last',\n  rotate: true\n})\n\n.directive('pagination', ['$parse', 'paginationConfig', function($parse, paginationConfig) {\n  return {\n    restrict: 'EA',\n    scope: {\n      totalItems: '=',\n      firstText: '@',\n      previousText: '@',\n      nextText: '@',\n      lastText: '@'\n    },\n    require: ['pagination', '?ngModel'],\n    controller: 'PaginationController',\n    templateUrl: 'template/pagination/pagination.html',\n    replace: true,\n    link: function(scope, element, attrs, ctrls) {\n      var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if (!ngModelCtrl) {\n         return; // do nothing if no ng-model\n      }\n\n      // Setup configuration parameters\n      var maxSize = angular.isDefined(attrs.maxSize) ? scope.$parent.$eval(attrs.maxSize) : paginationConfig.maxSize,\n          rotate = angular.isDefined(attrs.rotate) ? scope.$parent.$eval(attrs.rotate) : paginationConfig.rotate;\n      scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : paginationConfig.boundaryLinks;\n      scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : paginationConfig.directionLinks;\n\n      paginationCtrl.init(ngModelCtrl, paginationConfig);\n\n      if (attrs.maxSize) {\n        scope.$parent.$watch($parse(attrs.maxSize), function(value) {\n          maxSize = parseInt(value, 10);\n          paginationCtrl.render();\n        });\n      }\n\n      // Create page object used in template\n      function makePage(number, text, isActive) {\n        return {\n          number: number,\n          text: text,\n          active: isActive\n        };\n      }\n\n      function getPages(currentPage, totalPages) {\n        var pages = [];\n\n        // Default page limits\n        var startPage = 1, endPage = totalPages;\n        var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages );\n\n        // recompute if maxSize\n        if ( isMaxSized ) {\n          if ( rotate ) {\n            // Current page is displayed in the middle of the visible ones\n            startPage = Math.max(currentPage - Math.floor(maxSize/2), 1);\n            endPage   = startPage + maxSize - 1;\n\n            // Adjust if limit is exceeded\n            if (endPage > totalPages) {\n              endPage   = totalPages;\n              startPage = endPage - maxSize + 1;\n            }\n          } else {\n            // Visible pages are paginated with maxSize\n            startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1;\n\n            // Adjust last page if limit is exceeded\n            endPage = Math.min(startPage + maxSize - 1, totalPages);\n          }\n        }\n\n        // Add page number links\n        for (var number = startPage; number <= endPage; number++) {\n          var page = makePage(number, number, number === currentPage);\n          pages.push(page);\n        }\n\n        // Add links to move between page sets\n        if ( isMaxSized && ! rotate ) {\n          if ( startPage > 1 ) {\n            var previousPageSet = makePage(startPage - 1, '...', false);\n            pages.unshift(previousPageSet);\n          }\n\n          if ( endPage < totalPages ) {\n            var nextPageSet = makePage(endPage + 1, '...', false);\n            pages.push(nextPageSet);\n          }\n        }\n\n        return pages;\n      }\n\n      var originalRender = paginationCtrl.render;\n      paginationCtrl.render = function() {\n        originalRender();\n        if (scope.page > 0 && scope.page <= scope.totalPages) {\n          scope.pages = getPages(scope.page, scope.totalPages);\n        }\n      };\n    }\n  };\n}])\n\n.constant('pagerConfig', {\n  itemsPerPage: 10,\n  previousText: '« Previous',\n  nextText: 'Next »',\n  align: true\n})\n\n.directive('pager', ['pagerConfig', function(pagerConfig) {\n  return {\n    restrict: 'EA',\n    scope: {\n      totalItems: '=',\n      previousText: '@',\n      nextText: '@'\n    },\n    require: ['pager', '?ngModel'],\n    controller: 'PaginationController',\n    templateUrl: 'template/pagination/pager.html',\n    replace: true,\n    link: function(scope, element, attrs, ctrls) {\n      var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if (!ngModelCtrl) {\n         return; // do nothing if no ng-model\n      }\n\n      scope.align = angular.isDefined(attrs.align) ? scope.$parent.$eval(attrs.align) : pagerConfig.align;\n      paginationCtrl.init(ngModelCtrl, pagerConfig);\n    }\n  };\n}]);\n\n/**\n * The following features are still outstanding: animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html tooltips, and selector delegation.\n */\nangular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] )\n\n/**\n * The $tooltip service creates tooltip- and popover-like directives as well as\n * houses global options for them.\n */\n.provider( '$tooltip', function () {\n  // The default options tooltip and popover.\n  var defaultOptions = {\n    placement: 'top',\n    animation: true,\n    popupDelay: 0\n  };\n\n  // Default hide triggers for each show trigger\n  var triggerMap = {\n    'mouseenter': 'mouseleave',\n    'click': 'click',\n    'focus': 'blur'\n  };\n\n  // The options specified to the provider globally.\n  var globalOptions = {};\n\n  /**\n   * `options({})` allows global configuration of all tooltips in the\n   * application.\n   *\n   *   var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {\n   *     // place tooltips left instead of top by default\n   *     $tooltipProvider.options( { placement: 'left' } );\n   *   });\n   */\n\tthis.options = function( value ) {\n\t\tangular.extend( globalOptions, value );\n\t};\n\n  /**\n   * This allows you to extend the set of trigger mappings available. E.g.:\n   *\n   *   $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' );\n   */\n  this.setTriggers = function setTriggers ( triggers ) {\n    angular.extend( triggerMap, triggers );\n  };\n\n  /**\n   * This is a helper function for translating camel-case to snake-case.\n   */\n  function snake_case(name){\n    var regexp = /[A-Z]/g;\n    var separator = '-';\n    return name.replace(regexp, function(letter, pos) {\n      return (pos ? separator : '') + letter.toLowerCase();\n    });\n  }\n\n  /**\n   * Returns the actual instance of the $tooltip service.\n   * TODO support multiple triggers\n   */\n  this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) {\n    return function $tooltip ( type, prefix, defaultTriggerShow ) {\n      var options = angular.extend( {}, defaultOptions, globalOptions );\n\n      /**\n       * Returns an object of show and hide triggers.\n       *\n       * If a trigger is supplied,\n       * it is used to show the tooltip; otherwise, it will use the `trigger`\n       * option passed to the `$tooltipProvider.options` method; else it will\n       * default to the trigger supplied to this directive factory.\n       *\n       * The hide trigger is based on the show trigger. If the `trigger` option\n       * was passed to the `$tooltipProvider.options` method, it will use the\n       * mapped trigger from `triggerMap` or the passed trigger if the map is\n       * undefined; otherwise, it uses the `triggerMap` value of the show\n       * trigger; else it will just use the show trigger.\n       */\n      function getTriggers ( trigger ) {\n        var show = trigger || options.trigger || defaultTriggerShow;\n        var hide = triggerMap[show] || show;\n        return {\n          show: show,\n          hide: hide\n        };\n      }\n\n      var directiveName = snake_case( type );\n\n      var startSym = $interpolate.startSymbol();\n      var endSym = $interpolate.endSymbol();\n      var template =\n        '<div '+ directiveName +'-popup '+\n          'title=\"'+startSym+'tt_title'+endSym+'\" '+\n          'content=\"'+startSym+'tt_content'+endSym+'\" '+\n          'placement=\"'+startSym+'tt_placement'+endSym+'\" '+\n          'animation=\"tt_animation\" '+\n          'is-open=\"tt_isOpen\"'+\n          '>'+\n        '</div>';\n\n      return {\n        restrict: 'EA',\n        scope: true,\n        compile: function (tElem, tAttrs) {\n          var tooltipLinker = $compile( template );\n\n          return function link ( scope, element, attrs ) {\n            var tooltip;\n            var transitionTimeout;\n            var popupTimeout;\n            var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false;\n            var triggers = getTriggers( undefined );\n            var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']);\n\n            var positionTooltip = function () {\n\n              var ttPosition = $position.positionElements(element, tooltip, scope.tt_placement, appendToBody);\n              ttPosition.top += 'px';\n              ttPosition.left += 'px';\n\n              // Now set the calculated positioning.\n              tooltip.css( ttPosition );\n            };\n\n            // By default, the tooltip is not open.\n            // TODO add ability to start tooltip opened\n            scope.tt_isOpen = false;\n\n            function toggleTooltipBind () {\n              if ( ! scope.tt_isOpen ) {\n                showTooltipBind();\n              } else {\n                hideTooltipBind();\n              }\n            }\n\n            // Show the tooltip with delay if specified, otherwise show it immediately\n            function showTooltipBind() {\n              if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) {\n                return;\n              }\n              if ( scope.tt_popupDelay ) {\n                // Do nothing if the tooltip was already scheduled to pop-up.\n                // This happens if show is triggered multiple times before any hide is triggered.\n                if (!popupTimeout) {\n                  popupTimeout = $timeout( show, scope.tt_popupDelay, false );\n                  popupTimeout.then(function(reposition){reposition();});\n                }\n              } else {\n                show()();\n              }\n            }\n\n            function hideTooltipBind () {\n              scope.$apply(function () {\n                hide();\n              });\n            }\n\n            // Show the tooltip popup element.\n            function show() {\n\n              popupTimeout = null;\n\n              // If there is a pending remove transition, we must cancel it, lest the\n              // tooltip be mysteriously removed.\n              if ( transitionTimeout ) {\n                $timeout.cancel( transitionTimeout );\n                transitionTimeout = null;\n              }\n\n              // Don't show empty tooltips.\n              if ( ! scope.tt_content ) {\n                return angular.noop;\n              }\n\n              createTooltip();\n\n              // Set the initial positioning.\n              tooltip.css({ top: 0, left: 0, display: 'block' });\n\n              // Now we add it to the DOM because need some info about it. But it's not \n              // visible yet anyway.\n              if ( appendToBody ) {\n                  $document.find( 'body' ).append( tooltip );\n              } else {\n                element.after( tooltip );\n              }\n\n              positionTooltip();\n\n              // And show the tooltip.\n              scope.tt_isOpen = true;\n              scope.$digest(); // digest required as $apply is not called\n\n              // Return positioning function as promise callback for correct\n              // positioning after draw.\n              return positionTooltip;\n            }\n\n            // Hide the tooltip popup element.\n            function hide() {\n              // First things first: we don't show it anymore.\n              scope.tt_isOpen = false;\n\n              //if tooltip is going to be shown after delay, we must cancel this\n              $timeout.cancel( popupTimeout );\n              popupTimeout = null;\n\n              // And now we remove it from the DOM. However, if we have animation, we \n              // need to wait for it to expire beforehand.\n              // FIXME: this is a placeholder for a port of the transitions library.\n              if ( scope.tt_animation ) {\n                if (!transitionTimeout) {\n                  transitionTimeout = $timeout(removeTooltip, 500);\n                }\n              } else {\n                removeTooltip();\n              }\n            }\n\n            function createTooltip() {\n              // There can only be one tooltip element per directive shown at once.\n              if (tooltip) {\n                removeTooltip();\n              }\n              tooltip = tooltipLinker(scope, function () {});\n\n              // Get contents rendered into the tooltip\n              scope.$digest();\n            }\n\n            function removeTooltip() {\n              transitionTimeout = null;\n              if (tooltip) {\n                tooltip.remove();\n                tooltip = null;\n              }\n            }\n\n            /**\n             * Observe the relevant attributes.\n             */\n            attrs.$observe( type, function ( val ) {\n              scope.tt_content = val;\n\n              if (!val && scope.tt_isOpen ) {\n                hide();\n              }\n            });\n\n            attrs.$observe( prefix+'Title', function ( val ) {\n              scope.tt_title = val;\n            });\n\n            attrs.$observe( prefix+'Placement', function ( val ) {\n              scope.tt_placement = angular.isDefined( val ) ? val : options.placement;\n            });\n\n            attrs.$observe( prefix+'PopupDelay', function ( val ) {\n              var delay = parseInt( val, 10 );\n              scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay;\n            });\n\n            var unregisterTriggers = function () {\n              element.unbind(triggers.show, showTooltipBind);\n              element.unbind(triggers.hide, hideTooltipBind);\n            };\n\n            attrs.$observe( prefix+'Trigger', function ( val ) {\n              unregisterTriggers();\n\n              triggers = getTriggers( val );\n\n              if ( triggers.show === triggers.hide ) {\n                element.bind( triggers.show, toggleTooltipBind );\n              } else {\n                element.bind( triggers.show, showTooltipBind );\n                element.bind( triggers.hide, hideTooltipBind );\n              }\n            });\n\n            var animation = scope.$eval(attrs[prefix + 'Animation']);\n            scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation;\n\n            attrs.$observe( prefix+'AppendToBody', function ( val ) {\n              appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody;\n            });\n\n            // if a tooltip is attached to <body> we need to remove it on\n            // location change as its parent scope will probably not be destroyed\n            // by the change.\n            if ( appendToBody ) {\n              scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () {\n              if ( scope.tt_isOpen ) {\n                hide();\n              }\n            });\n            }\n\n            // Make sure tooltip is destroyed and removed.\n            scope.$on('$destroy', function onDestroyTooltip() {\n              $timeout.cancel( transitionTimeout );\n              $timeout.cancel( popupTimeout );\n              unregisterTriggers();\n              removeTooltip();\n            });\n          };\n        }\n      };\n    };\n  }];\n})\n\n.directive( 'tooltipPopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/tooltip/tooltip-popup.html'\n  };\n})\n\n.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'tooltip', 'tooltip', 'mouseenter' );\n}])\n\n.directive( 'tooltipHtmlUnsafePopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html'\n  };\n})\n\n.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' );\n}]);\n\n/**\n * The following features are still outstanding: popup delay, animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html popovers, and selector delegatation.\n */\nangular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] )\n\n.directive( 'popoverPopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/popover/popover.html'\n  };\n})\n\n.directive( 'popover', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'popover', 'popover', 'click' );\n}]);\n\nangular.module('ui.bootstrap.progressbar', [])\n\n.constant('progressConfig', {\n  animate: true,\n  max: 100\n})\n\n.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) {\n    var self = this,\n        animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;\n\n    this.bars = [];\n    $scope.max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max;\n\n    this.addBar = function(bar, element) {\n        if ( !animate ) {\n            element.css({'transition': 'none'});\n        }\n\n        this.bars.push(bar);\n\n        bar.$watch('value', function( value ) {\n            bar.percent = +(100 * value / $scope.max).toFixed(2);\n        });\n\n        bar.$on('$destroy', function() {\n            element = null;\n            self.removeBar(bar);\n        });\n    };\n\n    this.removeBar = function(bar) {\n        this.bars.splice(this.bars.indexOf(bar), 1);\n    };\n}])\n\n.directive('progress', function() {\n    return {\n        restrict: 'EA',\n        replace: true,\n        transclude: true,\n        controller: 'ProgressController',\n        require: 'progress',\n        scope: {},\n        templateUrl: 'template/progressbar/progress.html'\n    };\n})\n\n.directive('bar', function() {\n    return {\n        restrict: 'EA',\n        replace: true,\n        transclude: true,\n        require: '^progress',\n        scope: {\n            value: '=',\n            type: '@'\n        },\n        templateUrl: 'template/progressbar/bar.html',\n        link: function(scope, element, attrs, progressCtrl) {\n            progressCtrl.addBar(scope, element);\n        }\n    };\n})\n\n.directive('progressbar', function() {\n    return {\n        restrict: 'EA',\n        replace: true,\n        transclude: true,\n        controller: 'ProgressController',\n        scope: {\n            value: '=',\n            type: '@'\n        },\n        templateUrl: 'template/progressbar/progressbar.html',\n        link: function(scope, element, attrs, progressCtrl) {\n            progressCtrl.addBar(scope, angular.element(element.children()[0]));\n        }\n    };\n});\nangular.module('ui.bootstrap.rating', [])\n\n.constant('ratingConfig', {\n  max: 5,\n  stateOn: null,\n  stateOff: null\n})\n\n.controller('RatingController', ['$scope', '$attrs', 'ratingConfig', function($scope, $attrs, ratingConfig) {\n  var ngModelCtrl  = { $setViewValue: angular.noop };\n\n  this.init = function(ngModelCtrl_) {\n    ngModelCtrl = ngModelCtrl_;\n    ngModelCtrl.$render = this.render;\n\n    this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn;\n    this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff;\n\n    var ratingStates = angular.isDefined($attrs.ratingStates) ? $scope.$parent.$eval($attrs.ratingStates) :\n                        new Array( angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max );\n    $scope.range = this.buildTemplateObjects(ratingStates);\n  };\n\n  this.buildTemplateObjects = function(states) {\n    for (var i = 0, n = states.length; i < n; i++) {\n      states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff }, states[i]);\n    }\n    return states;\n  };\n\n  $scope.rate = function(value) {\n    if ( !$scope.readonly && value >= 0 && value <= $scope.range.length ) {\n      ngModelCtrl.$setViewValue(value);\n      ngModelCtrl.$render();\n    }\n  };\n\n  $scope.enter = function(value) {\n    if ( !$scope.readonly ) {\n      $scope.value = value;\n    }\n    $scope.onHover({value: value});\n  };\n\n  $scope.reset = function() {\n    $scope.value = ngModelCtrl.$viewValue;\n    $scope.onLeave();\n  };\n\n  $scope.onKeydown = function(evt) {\n    if (/(37|38|39|40)/.test(evt.which)) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      $scope.rate( $scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1) );\n    }\n  };\n\n  this.render = function() {\n    $scope.value = ngModelCtrl.$viewValue;\n  };\n}])\n\n.directive('rating', function() {\n  return {\n    restrict: 'EA',\n    require: ['rating', 'ngModel'],\n    scope: {\n      readonly: '=?',\n      onHover: '&',\n      onLeave: '&'\n    },\n    controller: 'RatingController',\n    templateUrl: 'template/rating/rating.html',\n    replace: true,\n    link: function(scope, element, attrs, ctrls) {\n      var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if ( ngModelCtrl ) {\n        ratingCtrl.init( ngModelCtrl );\n      }\n    }\n  };\n});\n\n/**\n * @ngdoc overview\n * @name ui.bootstrap.tabs\n *\n * @description\n * AngularJS version of the tabs directive.\n */\n\nangular.module('ui.bootstrap.tabs', [])\n\n.controller('TabsetController', ['$scope', function TabsetCtrl($scope) {\n  var ctrl = this,\n      tabs = ctrl.tabs = $scope.tabs = [];\n\n  ctrl.select = function(selectedTab) {\n    angular.forEach(tabs, function(tab) {\n      if (tab.active && tab !== selectedTab) {\n        tab.active = false;\n        tab.onDeselect();\n      }\n    });\n    selectedTab.active = true;\n    selectedTab.onSelect();\n  };\n\n  ctrl.addTab = function addTab(tab) {\n    tabs.push(tab);\n    // we can't run the select function on the first tab\n    // since that would select it twice\n    if (tabs.length === 1) {\n      tab.active = true;\n    } else if (tab.active) {\n      ctrl.select(tab);\n    }\n  };\n\n  ctrl.removeTab = function removeTab(tab) {\n    var index = tabs.indexOf(tab);\n    //Select a new tab if the tab to be removed is selected\n    if (tab.active && tabs.length > 1) {\n      //If this is the last tab, select the previous tab. else, the next tab.\n      var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1;\n      ctrl.select(tabs[newActiveIndex]);\n    }\n    tabs.splice(index, 1);\n  };\n}])\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.tabs.directive:tabset\n * @restrict EA\n *\n * @description\n * Tabset is the outer container for the tabs directive\n *\n * @param {boolean=} vertical Whether or not to use vertical styling for the tabs.\n * @param {boolean=} justified Whether or not to use justified styling for the tabs.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <tabset>\n      <tab heading=\"Tab 1\"><b>First</b> Content!</tab>\n      <tab heading=\"Tab 2\"><i>Second</i> Content!</tab>\n    </tabset>\n    <hr />\n    <tabset vertical=\"true\">\n      <tab heading=\"Vertical Tab 1\"><b>First</b> Vertical Content!</tab>\n      <tab heading=\"Vertical Tab 2\"><i>Second</i> Vertical Content!</tab>\n    </tabset>\n    <tabset justified=\"true\">\n      <tab heading=\"Justified Tab 1\"><b>First</b> Justified Content!</tab>\n      <tab heading=\"Justified Tab 2\"><i>Second</i> Justified Content!</tab>\n    </tabset>\n  </file>\n</example>\n */\n.directive('tabset', function() {\n  return {\n    restrict: 'EA',\n    transclude: true,\n    replace: true,\n    scope: {\n      type: '@'\n    },\n    controller: 'TabsetController',\n    templateUrl: 'template/tabs/tabset.html',\n    link: function(scope, element, attrs) {\n      scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false;\n      scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false;\n    }\n  };\n})\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.tabs.directive:tab\n * @restrict EA\n *\n * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}.\n * @param {string=} select An expression to evaluate when the tab is selected.\n * @param {boolean=} active A binding, telling whether or not this tab is selected.\n * @param {boolean=} disabled A binding, telling whether or not this tab is disabled.\n *\n * @description\n * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <div ng-controller=\"TabsDemoCtrl\">\n      <button class=\"btn btn-small\" ng-click=\"items[0].active = true\">\n        Select item 1, using active binding\n      </button>\n      <button class=\"btn btn-small\" ng-click=\"items[1].disabled = !items[1].disabled\">\n        Enable/disable item 2, using disabled binding\n      </button>\n      <br />\n      <tabset>\n        <tab heading=\"Tab 1\">First Tab</tab>\n        <tab select=\"alertMe()\">\n          <tab-heading><i class=\"icon-bell\"></i> Alert me!</tab-heading>\n          Second Tab, with alert callback and html heading!\n        </tab>\n        <tab ng-repeat=\"item in items\"\n          heading=\"{{item.title}}\"\n          disabled=\"item.disabled\"\n          active=\"item.active\">\n          {{item.content}}\n        </tab>\n      </tabset>\n    </div>\n  </file>\n  <file name=\"script.js\">\n    function TabsDemoCtrl($scope) {\n      $scope.items = [\n        { title:\"Dynamic Title 1\", content:\"Dynamic Item 0\" },\n        { title:\"Dynamic Title 2\", content:\"Dynamic Item 1\", disabled: true }\n      ];\n\n      $scope.alertMe = function() {\n        setTimeout(function() {\n          alert(\"You've selected the alert tab!\");\n        });\n      };\n    };\n  </file>\n</example>\n */\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.tabs.directive:tabHeading\n * @restrict EA\n *\n * @description\n * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <tabset>\n      <tab>\n        <tab-heading><b>HTML</b> in my titles?!</tab-heading>\n        And some content, too!\n      </tab>\n      <tab>\n        <tab-heading><i class=\"icon-heart\"></i> Icon heading?!?</tab-heading>\n        That's right.\n      </tab>\n    </tabset>\n  </file>\n</example>\n */\n.directive('tab', ['$parse', function($parse) {\n  return {\n    require: '^tabset',\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/tabs/tab.html',\n    transclude: true,\n    scope: {\n      active: '=?',\n      heading: '@',\n      onSelect: '&select', //This callback is called in contentHeadingTransclude\n                          //once it inserts the tab's content into the dom\n      onDeselect: '&deselect'\n    },\n    controller: function() {\n      //Empty controller so other directives can require being 'under' a tab\n    },\n    compile: function(elm, attrs, transclude) {\n      return function postLink(scope, elm, attrs, tabsetCtrl) {\n        scope.$watch('active', function(active) {\n          if (active) {\n            tabsetCtrl.select(scope);\n          }\n        });\n\n        scope.disabled = false;\n        if ( attrs.disabled ) {\n          scope.$parent.$watch($parse(attrs.disabled), function(value) {\n            scope.disabled = !! value;\n          });\n        }\n\n        scope.select = function() {\n          if ( !scope.disabled ) {\n            scope.active = true;\n          }\n        };\n\n        tabsetCtrl.addTab(scope);\n        scope.$on('$destroy', function() {\n          tabsetCtrl.removeTab(scope);\n        });\n\n        //We need to transclude later, once the content container is ready.\n        //when this link happens, we're inside a tab heading.\n        scope.$transcludeFn = transclude;\n      };\n    }\n  };\n}])\n\n.directive('tabHeadingTransclude', [function() {\n  return {\n    restrict: 'A',\n    require: '^tab',\n    link: function(scope, elm, attrs, tabCtrl) {\n      scope.$watch('headingElement', function updateHeadingElement(heading) {\n        if (heading) {\n          elm.html('');\n          elm.append(heading);\n        }\n      });\n    }\n  };\n}])\n\n.directive('tabContentTransclude', function() {\n  return {\n    restrict: 'A',\n    require: '^tabset',\n    link: function(scope, elm, attrs) {\n      var tab = scope.$eval(attrs.tabContentTransclude);\n\n      //Now our tab is ready to be transcluded: both the tab heading area\n      //and the tab content area are loaded.  Transclude 'em both.\n      tab.$transcludeFn(tab.$parent, function(contents) {\n        angular.forEach(contents, function(node) {\n          if (isTabHeading(node)) {\n            //Let tabHeadingTransclude know.\n            tab.headingElement = node;\n          } else {\n            elm.append(node);\n          }\n        });\n      });\n    }\n  };\n  function isTabHeading(node) {\n    return node.tagName &&  (\n      node.hasAttribute('tab-heading') ||\n      node.hasAttribute('data-tab-heading') ||\n      node.tagName.toLowerCase() === 'tab-heading' ||\n      node.tagName.toLowerCase() === 'data-tab-heading'\n    );\n  }\n})\n\n;\n\nangular.module('ui.bootstrap.timepicker', [])\n\n.constant('timepickerConfig', {\n  hourStep: 1,\n  minuteStep: 1,\n  showMeridian: true,\n  meridians: null,\n  readonlyInput: false,\n  mousewheel: true\n})\n\n.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) {\n  var selected = new Date(),\n      ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\n      meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS;\n\n  this.init = function( ngModelCtrl_, inputs ) {\n    ngModelCtrl = ngModelCtrl_;\n    ngModelCtrl.$render = this.render;\n\n    var hoursInputEl = inputs.eq(0),\n        minutesInputEl = inputs.eq(1);\n\n    var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel;\n    if ( mousewheel ) {\n      this.setupMousewheelEvents( hoursInputEl, minutesInputEl );\n    }\n\n    $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput;\n    this.setupInputEvents( hoursInputEl, minutesInputEl );\n  };\n\n  var hourStep = timepickerConfig.hourStep;\n  if ($attrs.hourStep) {\n    $scope.$parent.$watch($parse($attrs.hourStep), function(value) {\n      hourStep = parseInt(value, 10);\n    });\n  }\n\n  var minuteStep = timepickerConfig.minuteStep;\n  if ($attrs.minuteStep) {\n    $scope.$parent.$watch($parse($attrs.minuteStep), function(value) {\n      minuteStep = parseInt(value, 10);\n    });\n  }\n\n  // 12H / 24H mode\n  $scope.showMeridian = timepickerConfig.showMeridian;\n  if ($attrs.showMeridian) {\n    $scope.$parent.$watch($parse($attrs.showMeridian), function(value) {\n      $scope.showMeridian = !!value;\n\n      if ( ngModelCtrl.$error.time ) {\n        // Evaluate from template\n        var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate();\n        if (angular.isDefined( hours ) && angular.isDefined( minutes )) {\n          selected.setHours( hours );\n          refresh();\n        }\n      } else {\n        updateTemplate();\n      }\n    });\n  }\n\n  // Get $scope.hours in 24H mode if valid\n  function getHoursFromTemplate ( ) {\n    var hours = parseInt( $scope.hours, 10 );\n    var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24);\n    if ( !valid ) {\n      return undefined;\n    }\n\n    if ( $scope.showMeridian ) {\n      if ( hours === 12 ) {\n        hours = 0;\n      }\n      if ( $scope.meridian === meridians[1] ) {\n        hours = hours + 12;\n      }\n    }\n    return hours;\n  }\n\n  function getMinutesFromTemplate() {\n    var minutes = parseInt($scope.minutes, 10);\n    return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined;\n  }\n\n  function pad( value ) {\n    return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value;\n  }\n\n  // Respond on mousewheel spin\n  this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) {\n    var isScrollingUp = function(e) {\n      if (e.originalEvent) {\n        e = e.originalEvent;\n      }\n      //pick correct delta variable depending on event\n      var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY;\n      return (e.detail || delta > 0);\n    };\n\n    hoursInputEl.bind('mousewheel wheel', function(e) {\n      $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() );\n      e.preventDefault();\n    });\n\n    minutesInputEl.bind('mousewheel wheel', function(e) {\n      $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() );\n      e.preventDefault();\n    });\n\n  };\n\n  this.setupInputEvents = function( hoursInputEl, minutesInputEl ) {\n    if ( $scope.readonlyInput ) {\n      $scope.updateHours = angular.noop;\n      $scope.updateMinutes = angular.noop;\n      return;\n    }\n\n    var invalidate = function(invalidHours, invalidMinutes) {\n      ngModelCtrl.$setViewValue( null );\n      ngModelCtrl.$setValidity('time', false);\n      if (angular.isDefined(invalidHours)) {\n        $scope.invalidHours = invalidHours;\n      }\n      if (angular.isDefined(invalidMinutes)) {\n        $scope.invalidMinutes = invalidMinutes;\n      }\n    };\n\n    $scope.updateHours = function() {\n      var hours = getHoursFromTemplate();\n\n      if ( angular.isDefined(hours) ) {\n        selected.setHours( hours );\n        refresh( 'h' );\n      } else {\n        invalidate(true);\n      }\n    };\n\n    hoursInputEl.bind('blur', function(e) {\n      if ( !$scope.invalidHours && $scope.hours < 10) {\n        $scope.$apply( function() {\n          $scope.hours = pad( $scope.hours );\n        });\n      }\n    });\n\n    $scope.updateMinutes = function() {\n      var minutes = getMinutesFromTemplate();\n\n      if ( angular.isDefined(minutes) ) {\n        selected.setMinutes( minutes );\n        refresh( 'm' );\n      } else {\n        invalidate(undefined, true);\n      }\n    };\n\n    minutesInputEl.bind('blur', function(e) {\n      if ( !$scope.invalidMinutes && $scope.minutes < 10 ) {\n        $scope.$apply( function() {\n          $scope.minutes = pad( $scope.minutes );\n        });\n      }\n    });\n\n  };\n\n  this.render = function() {\n    var date = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : null;\n\n    if ( isNaN(date) ) {\n      ngModelCtrl.$setValidity('time', false);\n      $log.error('Timepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\n    } else {\n      if ( date ) {\n        selected = date;\n      }\n      makeValid();\n      updateTemplate();\n    }\n  };\n\n  // Call internally when we know that model is valid.\n  function refresh( keyboardChange ) {\n    makeValid();\n    ngModelCtrl.$setViewValue( new Date(selected) );\n    updateTemplate( keyboardChange );\n  }\n\n  function makeValid() {\n    ngModelCtrl.$setValidity('time', true);\n    $scope.invalidHours = false;\n    $scope.invalidMinutes = false;\n  }\n\n  function updateTemplate( keyboardChange ) {\n    var hours = selected.getHours(), minutes = selected.getMinutes();\n\n    if ( $scope.showMeridian ) {\n      hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system\n    }\n\n    $scope.hours = keyboardChange === 'h' ? hours : pad(hours);\n    $scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes);\n    $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n  }\n\n  function addMinutes( minutes ) {\n    var dt = new Date( selected.getTime() + minutes * 60000 );\n    selected.setHours( dt.getHours(), dt.getMinutes() );\n    refresh();\n  }\n\n  $scope.incrementHours = function() {\n    addMinutes( hourStep * 60 );\n  };\n  $scope.decrementHours = function() {\n    addMinutes( - hourStep * 60 );\n  };\n  $scope.incrementMinutes = function() {\n    addMinutes( minuteStep );\n  };\n  $scope.decrementMinutes = function() {\n    addMinutes( - minuteStep );\n  };\n  $scope.toggleMeridian = function() {\n    addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) );\n  };\n}])\n\n.directive('timepicker', function () {\n  return {\n    restrict: 'EA',\n    require: ['timepicker', '?^ngModel'],\n    controller:'TimepickerController',\n    replace: true,\n    scope: {},\n    templateUrl: 'template/timepicker/timepicker.html',\n    link: function(scope, element, attrs, ctrls) {\n      var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if ( ngModelCtrl ) {\n        timepickerCtrl.init( ngModelCtrl, element.find('input') );\n      }\n    }\n  };\n});\n\nangular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml'])\n\n/**\n * A helper service that can parse typeahead's syntax (string provided by users)\n * Extracted to a separate service for ease of unit testing\n */\n  .factory('typeaheadParser', ['$parse', function ($parse) {\n\n  //                      00000111000000000000022200000000000000003333333333333330000000000044000\n  var TYPEAHEAD_REGEXP = /^\\s*(.*?)(?:\\s+as\\s+(.*?))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*))\\s+in\\s+(.*)$/;\n\n  return {\n    parse:function (input) {\n\n      var match = input.match(TYPEAHEAD_REGEXP);\n      if (!match) {\n        throw new Error(\n          'Expected typeahead specification in form of \"_modelValue_ (as _label_)? for _item_ in _collection_\"' +\n            ' but got \"' + input + '\".');\n      }\n\n      return {\n        itemName:match[3],\n        source:$parse(match[4]),\n        viewMapper:$parse(match[2] || match[1]),\n        modelMapper:$parse(match[1])\n      };\n    }\n  };\n}])\n\n  .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser',\n    function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) {\n\n  var HOT_KEYS = [9, 13, 27, 38, 40];\n\n  return {\n    require:'ngModel',\n    link:function (originalScope, element, attrs, modelCtrl) {\n\n      //SUPPORTED ATTRIBUTES (OPTIONS)\n\n      //minimal no of characters that needs to be entered before typeahead kicks-in\n      var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1;\n\n      //minimal wait time after last character typed before typehead kicks-in\n      var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;\n\n      //should it restrict model values to the ones selected from the popup only?\n      var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;\n\n      //binding to a variable that indicates if matches are being retrieved asynchronously\n      var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;\n\n      //a callback executed when a match is selected\n      var onSelectCallback = $parse(attrs.typeaheadOnSelect);\n\n      var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;\n\n      var appendToBody =  attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false;\n\n      //INTERNAL VARIABLES\n\n      //model setter executed upon match selection\n      var $setModelValue = $parse(attrs.ngModel).assign;\n\n      //expressions used by typeahead\n      var parserResult = typeaheadParser.parse(attrs.typeahead);\n\n      var hasFocus;\n\n      //create a child scope for the typeahead directive so we are not polluting original scope\n      //with typeahead-specific data (matches, query etc.)\n      var scope = originalScope.$new();\n      originalScope.$on('$destroy', function(){\n        scope.$destroy();\n      });\n\n      // WAI-ARIA\n      var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n      element.attr({\n        'aria-autocomplete': 'list',\n        'aria-expanded': false,\n        'aria-owns': popupId\n      });\n\n      //pop-up element used to display matches\n      var popUpEl = angular.element('<div typeahead-popup></div>');\n      popUpEl.attr({\n        id: popupId,\n        matches: 'matches',\n        active: 'activeIdx',\n        select: 'select(activeIdx)',\n        query: 'query',\n        position: 'position'\n      });\n      //custom item template\n      if (angular.isDefined(attrs.typeaheadTemplateUrl)) {\n        popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);\n      }\n\n      var resetMatches = function() {\n        scope.matches = [];\n        scope.activeIdx = -1;\n        element.attr('aria-expanded', false);\n      };\n\n      var getMatchId = function(index) {\n        return popupId + '-option-' + index;\n      };\n\n      // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead.\n      // This attribute is added or removed automatically when the `activeIdx` changes.\n      scope.$watch('activeIdx', function(index) {\n        if (index < 0) {\n          element.removeAttr('aria-activedescendant');\n        } else {\n          element.attr('aria-activedescendant', getMatchId(index));\n        }\n      });\n\n      var getMatchesAsync = function(inputValue) {\n\n        var locals = {$viewValue: inputValue};\n        isLoadingSetter(originalScope, true);\n        $q.when(parserResult.source(originalScope, locals)).then(function(matches) {\n\n          //it might happen that several async queries were in progress if a user were typing fast\n          //but we are interested only in responses that correspond to the current view value\n          var onCurrentRequest = (inputValue === modelCtrl.$viewValue);\n          if (onCurrentRequest && hasFocus) {\n            if (matches.length > 0) {\n\n              scope.activeIdx = 0;\n              scope.matches.length = 0;\n\n              //transform labels\n              for(var i=0; i<matches.length; i++) {\n                locals[parserResult.itemName] = matches[i];\n                scope.matches.push({\n                  id: getMatchId(i),\n                  label: parserResult.viewMapper(scope, locals),\n                  model: matches[i]\n                });\n              }\n\n              scope.query = inputValue;\n              //position pop-up with matches - we need to re-calculate its position each time we are opening a window\n              //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page\n              //due to other elements being rendered\n              scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n              scope.position.top = scope.position.top + element.prop('offsetHeight');\n\n              element.attr('aria-expanded', true);\n            } else {\n              resetMatches();\n            }\n          }\n          if (onCurrentRequest) {\n            isLoadingSetter(originalScope, false);\n          }\n        }, function(){\n          resetMatches();\n          isLoadingSetter(originalScope, false);\n        });\n      };\n\n      resetMatches();\n\n      //we need to propagate user's query so we can higlight matches\n      scope.query = undefined;\n\n      //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later \n      var timeoutPromise;\n\n      //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM\n      //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue\n      modelCtrl.$parsers.unshift(function (inputValue) {\n\n        hasFocus = true;\n\n        if (inputValue && inputValue.length >= minSearch) {\n          if (waitTime > 0) {\n            if (timeoutPromise) {\n              $timeout.cancel(timeoutPromise);//cancel previous timeout\n            }\n            timeoutPromise = $timeout(function () {\n              getMatchesAsync(inputValue);\n            }, waitTime);\n          } else {\n            getMatchesAsync(inputValue);\n          }\n        } else {\n          isLoadingSetter(originalScope, false);\n          resetMatches();\n        }\n\n        if (isEditable) {\n          return inputValue;\n        } else {\n          if (!inputValue) {\n            // Reset in case user had typed something previously.\n            modelCtrl.$setValidity('editable', true);\n            return inputValue;\n          } else {\n            modelCtrl.$setValidity('editable', false);\n            return undefined;\n          }\n        }\n      });\n\n      modelCtrl.$formatters.push(function (modelValue) {\n\n        var candidateViewValue, emptyViewValue;\n        var locals = {};\n\n        if (inputFormatter) {\n\n          locals['$model'] = modelValue;\n          return inputFormatter(originalScope, locals);\n\n        } else {\n\n          //it might happen that we don't have enough info to properly render input value\n          //we need to check for this situation and simply return model value if we can't apply custom formatting\n          locals[parserResult.itemName] = modelValue;\n          candidateViewValue = parserResult.viewMapper(originalScope, locals);\n          locals[parserResult.itemName] = undefined;\n          emptyViewValue = parserResult.viewMapper(originalScope, locals);\n\n          return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue;\n        }\n      });\n\n      scope.select = function (activeIdx) {\n        //called from within the $digest() cycle\n        var locals = {};\n        var model, item;\n\n        locals[parserResult.itemName] = item = scope.matches[activeIdx].model;\n        model = parserResult.modelMapper(originalScope, locals);\n        $setModelValue(originalScope, model);\n        modelCtrl.$setValidity('editable', true);\n\n        onSelectCallback(originalScope, {\n          $item: item,\n          $model: model,\n          $label: parserResult.viewMapper(originalScope, locals)\n        });\n\n        resetMatches();\n\n        //return focus to the input element if a match was selected via a mouse click event\n        // use timeout to avoid $rootScope:inprog error\n        $timeout(function() { element[0].focus(); }, 0, false);\n      };\n\n      //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)\n      element.bind('keydown', function (evt) {\n\n        //typeahead is open and an \"interesting\" key was pressed\n        if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {\n          return;\n        }\n\n        evt.preventDefault();\n\n        if (evt.which === 40) {\n          scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;\n          scope.$digest();\n\n        } else if (evt.which === 38) {\n          scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1;\n          scope.$digest();\n\n        } else if (evt.which === 13 || evt.which === 9) {\n          scope.$apply(function () {\n            scope.select(scope.activeIdx);\n          });\n\n        } else if (evt.which === 27) {\n          evt.stopPropagation();\n\n          resetMatches();\n          scope.$digest();\n        }\n      });\n\n      element.bind('blur', function (evt) {\n        hasFocus = false;\n      });\n\n      // Keep reference to click handler to unbind it.\n      var dismissClickHandler = function (evt) {\n        if (element[0] !== evt.target) {\n          resetMatches();\n          scope.$digest();\n        }\n      };\n\n      $document.bind('click', dismissClickHandler);\n\n      originalScope.$on('$destroy', function(){\n        $document.unbind('click', dismissClickHandler);\n      });\n\n      var $popup = $compile(popUpEl)(scope);\n      if ( appendToBody ) {\n        $document.find('body').append($popup);\n      } else {\n        element.after($popup);\n      }\n    }\n  };\n\n}])\n\n  .directive('typeaheadPopup', function () {\n    return {\n      restrict:'EA',\n      scope:{\n        matches:'=',\n        query:'=',\n        active:'=',\n        position:'=',\n        select:'&'\n      },\n      replace:true,\n      templateUrl:'template/typeahead/typeahead-popup.html',\n      link:function (scope, element, attrs) {\n\n        scope.templateUrl = attrs.templateUrl;\n\n        scope.isOpen = function () {\n          return scope.matches.length > 0;\n        };\n\n        scope.isActive = function (matchIdx) {\n          return scope.active == matchIdx;\n        };\n\n        scope.selectActive = function (matchIdx) {\n          scope.active = matchIdx;\n        };\n\n        scope.selectMatch = function (activeIdx) {\n          scope.select({activeIdx:activeIdx});\n        };\n      }\n    };\n  })\n\n  .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) {\n    return {\n      restrict:'EA',\n      scope:{\n        index:'=',\n        match:'=',\n        query:'='\n      },\n      link:function (scope, element, attrs) {\n        var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html';\n        $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){\n           element.replaceWith($compile(tplContent.trim())(scope));\n        });\n      }\n    };\n  }])\n\n  .filter('typeaheadHighlight', function() {\n\n    function escapeRegexp(queryToEscape) {\n      return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n    }\n\n    return function(matchItem, query) {\n      return query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<strong>$&</strong>') : matchItem;\n    };\n  });\n\nangular.module(\"template/accordion/accordion-group.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/accordion/accordion-group.html\",\n    \"<div class=\\\"panel panel-default\\\">\\n\" +\n    \"  <div class=\\\"panel-heading\\\">\\n\" +\n    \"    <h4 class=\\\"panel-title\\\">\\n\" +\n    \"      <a class=\\\"accordion-toggle\\\" ng-click=\\\"toggleOpen()\\\" accordion-transclude=\\\"heading\\\"><span ng-class=\\\"{'text-muted': isDisabled}\\\">{{heading}}</span></a>\\n\" +\n    \"    </h4>\\n\" +\n    \"  </div>\\n\" +\n    \"  <div class=\\\"panel-collapse\\\" collapse=\\\"!isOpen\\\">\\n\" +\n    \"\t  <div class=\\\"panel-body\\\" ng-transclude></div>\\n\" +\n    \"  </div>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/accordion/accordion.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/accordion/accordion.html\",\n    \"<div class=\\\"panel-group\\\" ng-transclude></div>\");\n}]);\n\nangular.module(\"template/alert/alert.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/alert/alert.html\",\n    \"<div class=\\\"alert\\\" ng-class=\\\"{'alert-{{type || 'warning'}}': true, 'alert-dismissable': closeable}\\\" role=\\\"alert\\\">\\n\" +\n    \"    <button ng-show=\\\"closeable\\\" type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"close()\\\">\\n\" +\n    \"        <span aria-hidden=\\\"true\\\">&times;</span>\\n\" +\n    \"        <span class=\\\"sr-only\\\">Close</span>\\n\" +\n    \"    </button>\\n\" +\n    \"    <div ng-transclude></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/carousel/carousel.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/carousel/carousel.html\",\n    \"<div ng-mouseenter=\\\"pause()\\\" ng-mouseleave=\\\"play()\\\" class=\\\"carousel\\\" ng-swipe-right=\\\"prev()\\\" ng-swipe-left=\\\"next()\\\">\\n\" +\n    \"    <ol class=\\\"carousel-indicators\\\" ng-show=\\\"slides.length > 1\\\">\\n\" +\n    \"        <li ng-repeat=\\\"slide in slides track by $index\\\" ng-class=\\\"{active: isActive(slide)}\\\" ng-click=\\\"select(slide)\\\"></li>\\n\" +\n    \"    </ol>\\n\" +\n    \"    <div class=\\\"carousel-inner\\\" ng-transclude></div>\\n\" +\n    \"    <a class=\\\"left carousel-control\\\" ng-click=\\\"prev()\\\" ng-show=\\\"slides.length > 1\\\"><span class=\\\"glyphicon glyphicon-chevron-left\\\"></span></a>\\n\" +\n    \"    <a class=\\\"right carousel-control\\\" ng-click=\\\"next()\\\" ng-show=\\\"slides.length > 1\\\"><span class=\\\"glyphicon glyphicon-chevron-right\\\"></span></a>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/carousel/slide.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/carousel/slide.html\",\n    \"<div ng-class=\\\"{\\n\" +\n    \"    'active': leaving || (active && !entering),\\n\" +\n    \"    'prev': (next || active) && direction=='prev',\\n\" +\n    \"    'next': (next || active) && direction=='next',\\n\" +\n    \"    'right': direction=='prev',\\n\" +\n    \"    'left': direction=='next'\\n\" +\n    \"  }\\\" class=\\\"item text-center\\\" ng-transclude></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/datepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/datepicker.html\",\n    \"<div ng-switch=\\\"datepickerMode\\\" role=\\\"application\\\" ng-keydown=\\\"keydown($event)\\\">\\n\" +\n    \"  <daypicker ng-switch-when=\\\"day\\\" tabindex=\\\"0\\\"></daypicker>\\n\" +\n    \"  <monthpicker ng-switch-when=\\\"month\\\" tabindex=\\\"0\\\"></monthpicker>\\n\" +\n    \"  <yearpicker ng-switch-when=\\\"year\\\" tabindex=\\\"0\\\"></yearpicker>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/datepicker/day.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/day.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-left\\\"></i></button></th>\\n\" +\n    \"      <th colspan=\\\"{{5 + showWeeks}}\\\"><button id=\\\"{{uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"toggleMode()\\\" tabindex=\\\"-1\\\" style=\\\"width:100%;\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-right\\\"></i></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th ng-show=\\\"showWeeks\\\" class=\\\"text-center\\\"></th>\\n\" +\n    \"      <th ng-repeat=\\\"label in labels track by $index\\\" class=\\\"text-center\\\"><small aria-label=\\\"{{label.full}}\\\">{{label.abbr}}</small></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr ng-repeat=\\\"row in rows track by $index\\\">\\n\" +\n    \"      <td ng-show=\\\"showWeeks\\\" class=\\\"text-center h6\\\"><em>{{ weekNumbers[$index] }}</em></td>\\n\" +\n    \"      <td ng-repeat=\\\"dt in row track by dt.date\\\" class=\\\"text-center\\\" role=\\\"gridcell\\\" id=\\\"{{dt.uid}}\\\" aria-disabled=\\\"{{!!dt.disabled}}\\\">\\n\" +\n    \"        <button type=\\\"button\\\" style=\\\"width:100%;\\\" class=\\\"btn btn-default btn-sm\\\" ng-class=\\\"{'btn-info': dt.selected, active: isActive(dt)}\\\" ng-click=\\\"select(dt.date)\\\" ng-disabled=\\\"dt.disabled\\\" tabindex=\\\"-1\\\"><span ng-class=\\\"{'text-muted': dt.secondary, 'text-info': dt.current}\\\">{{dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/month.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/month.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-left\\\"></i></button></th>\\n\" +\n    \"      <th><button id=\\\"{{uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"toggleMode()\\\" tabindex=\\\"-1\\\" style=\\\"width:100%;\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-right\\\"></i></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr ng-repeat=\\\"row in rows track by $index\\\">\\n\" +\n    \"      <td ng-repeat=\\\"dt in row track by dt.date\\\" class=\\\"text-center\\\" role=\\\"gridcell\\\" id=\\\"{{dt.uid}}\\\" aria-disabled=\\\"{{!!dt.disabled}}\\\">\\n\" +\n    \"        <button type=\\\"button\\\" style=\\\"width:100%;\\\" class=\\\"btn btn-default\\\" ng-class=\\\"{'btn-info': dt.selected, active: isActive(dt)}\\\" ng-click=\\\"select(dt.date)\\\" ng-disabled=\\\"dt.disabled\\\" tabindex=\\\"-1\\\"><span ng-class=\\\"{'text-info': dt.current}\\\">{{dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/popup.html\",\n    \"<ul class=\\\"dropdown-menu\\\" ng-style=\\\"{display: (isOpen && 'block') || 'none', top: position.top+'px', left: position.left+'px'}\\\" ng-keydown=\\\"keydown($event)\\\">\\n\" +\n    \"\t<li ng-transclude></li>\\n\" +\n    \"\t<li ng-if=\\\"showButtonBar\\\" style=\\\"padding:10px 9px 2px\\\">\\n\" +\n    \"\t\t<span class=\\\"btn-group\\\">\\n\" +\n    \"\t\t\t<button type=\\\"button\\\" class=\\\"btn btn-sm btn-info\\\" ng-click=\\\"select('today')\\\">{{ getText('current') }}</button>\\n\" +\n    \"\t\t\t<button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-click=\\\"select(null)\\\">{{ getText('clear') }}</button>\\n\" +\n    \"\t\t</span>\\n\" +\n    \"\t\t<button type=\\\"button\\\" class=\\\"btn btn-sm btn-success pull-right\\\" ng-click=\\\"close()\\\">{{ getText('close') }}</button>\\n\" +\n    \"\t</li>\\n\" +\n    \"</ul>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/year.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/year.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-left\\\"></i></button></th>\\n\" +\n    \"      <th colspan=\\\"3\\\"><button id=\\\"{{uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"toggleMode()\\\" tabindex=\\\"-1\\\" style=\\\"width:100%;\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-right\\\"></i></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr ng-repeat=\\\"row in rows track by $index\\\">\\n\" +\n    \"      <td ng-repeat=\\\"dt in row track by dt.date\\\" class=\\\"text-center\\\" role=\\\"gridcell\\\" id=\\\"{{dt.uid}}\\\" aria-disabled=\\\"{{!!dt.disabled}}\\\">\\n\" +\n    \"        <button type=\\\"button\\\" style=\\\"width:100%;\\\" class=\\\"btn btn-default\\\" ng-class=\\\"{'btn-info': dt.selected, active: isActive(dt)}\\\" ng-click=\\\"select(dt.date)\\\" ng-disabled=\\\"dt.disabled\\\" tabindex=\\\"-1\\\"><span ng-class=\\\"{'text-info': dt.current}\\\">{{dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/modal/backdrop.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/modal/backdrop.html\",\n    \"<div class=\\\"modal-backdrop fade\\\"\\n\" +\n    \"     ng-class=\\\"{in: animate}\\\"\\n\" +\n    \"     ng-style=\\\"{'z-index': 1040 + (index && 1 || 0) + index*10}\\\"\\n\" +\n    \"></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/modal/window.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/modal/window.html\",\n    \"<div tabindex=\\\"-1\\\" role=\\\"dialog\\\" class=\\\"modal fade\\\" ng-class=\\\"{in: animate}\\\" ng-style=\\\"{'z-index': 1050 + index*10, display: 'block'}\\\" ng-click=\\\"close($event)\\\">\\n\" +\n    \"    <div class=\\\"modal-dialog\\\" ng-class=\\\"{'modal-sm': size == 'sm', 'modal-lg': size == 'lg'}\\\"><div class=\\\"modal-content\\\" ng-transclude></div></div>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/pagination/pager.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/pagination/pager.html\",\n    \"<ul class=\\\"pager\\\">\\n\" +\n    \"  <li ng-class=\\\"{disabled: noPrevious(), previous: align}\\\"><a href ng-click=\\\"selectPage(page - 1)\\\">{{getText('previous')}}</a></li>\\n\" +\n    \"  <li ng-class=\\\"{disabled: noNext(), next: align}\\\"><a href ng-click=\\\"selectPage(page + 1)\\\">{{getText('next')}}</a></li>\\n\" +\n    \"</ul>\");\n}]);\n\nangular.module(\"template/pagination/pagination.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/pagination/pagination.html\",\n    \"<ul class=\\\"pagination\\\">\\n\" +\n    \"  <li ng-if=\\\"boundaryLinks\\\" ng-class=\\\"{disabled: noPrevious()}\\\"><a href ng-click=\\\"selectPage(1)\\\">{{getText('first')}}</a></li>\\n\" +\n    \"  <li ng-if=\\\"directionLinks\\\" ng-class=\\\"{disabled: noPrevious()}\\\"><a href ng-click=\\\"selectPage(page - 1)\\\">{{getText('previous')}}</a></li>\\n\" +\n    \"  <li ng-repeat=\\\"page in pages track by $index\\\" ng-class=\\\"{active: page.active}\\\"><a href ng-click=\\\"selectPage(page.number)\\\">{{page.text}}</a></li>\\n\" +\n    \"  <li ng-if=\\\"directionLinks\\\" ng-class=\\\"{disabled: noNext()}\\\"><a href ng-click=\\\"selectPage(page + 1)\\\">{{getText('next')}}</a></li>\\n\" +\n    \"  <li ng-if=\\\"boundaryLinks\\\" ng-class=\\\"{disabled: noNext()}\\\"><a href ng-click=\\\"selectPage(totalPages)\\\">{{getText('last')}}</a></li>\\n\" +\n    \"</ul>\");\n}]);\n\nangular.module(\"template/tooltip/tooltip-html-unsafe-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tooltip/tooltip-html-unsafe-popup.html\",\n    \"<div class=\\\"tooltip {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"  <div class=\\\"tooltip-inner\\\" bind-html-unsafe=\\\"content\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/tooltip/tooltip-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tooltip/tooltip-popup.html\",\n    \"<div class=\\\"tooltip {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"  <div class=\\\"tooltip-inner\\\" ng-bind=\\\"content\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/popover/popover.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/popover/popover.html\",\n    \"<div class=\\\"popover {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"arrow\\\"></div>\\n\" +\n    \"\\n\" +\n    \"  <div class=\\\"popover-inner\\\">\\n\" +\n    \"      <h3 class=\\\"popover-title\\\" ng-bind=\\\"title\\\" ng-show=\\\"title\\\"></h3>\\n\" +\n    \"      <div class=\\\"popover-content\\\" ng-bind=\\\"content\\\"></div>\\n\" +\n    \"  </div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/progressbar/bar.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/progressbar/bar.html\",\n    \"<div class=\\\"progress-bar\\\" ng-class=\\\"type && 'progress-bar-' + type\\\" role=\\\"progressbar\\\" aria-valuenow=\\\"{{value}}\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{max}}\\\" ng-style=\\\"{width: percent + '%'}\\\" aria-valuetext=\\\"{{percent | number:0}}%\\\" ng-transclude></div>\");\n}]);\n\nangular.module(\"template/progressbar/progress.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/progressbar/progress.html\",\n    \"<div class=\\\"progress\\\" ng-transclude></div>\");\n}]);\n\nangular.module(\"template/progressbar/progressbar.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/progressbar/progressbar.html\",\n    \"<div class=\\\"progress\\\">\\n\" +\n    \"  <div class=\\\"progress-bar\\\" ng-class=\\\"type && 'progress-bar-' + type\\\" role=\\\"progressbar\\\" aria-valuenow=\\\"{{value}}\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{max}}\\\" ng-style=\\\"{width: percent + '%'}\\\" aria-valuetext=\\\"{{percent | number:0}}%\\\" ng-transclude></div>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/rating/rating.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/rating/rating.html\",\n    \"<span ng-mouseleave=\\\"reset()\\\" ng-keydown=\\\"onKeydown($event)\\\" tabindex=\\\"0\\\" role=\\\"slider\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{range.length}}\\\" aria-valuenow=\\\"{{value}}\\\">\\n\" +\n    \"    <i ng-repeat=\\\"r in range track by $index\\\" ng-mouseenter=\\\"enter($index + 1)\\\" ng-click=\\\"rate($index + 1)\\\" class=\\\"glyphicon\\\" ng-class=\\\"$index < value && (r.stateOn || 'glyphicon-star') || (r.stateOff || 'glyphicon-star-empty')\\\">\\n\" +\n    \"        <span class=\\\"sr-only\\\">({{ $index < value ? '*' : ' ' }})</span>\\n\" +\n    \"    </i>\\n\" +\n    \"</span>\");\n}]);\n\nangular.module(\"template/tabs/tab.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tabs/tab.html\",\n    \"<li ng-class=\\\"{active: active, disabled: disabled}\\\">\\n\" +\n    \"  <a ng-click=\\\"select()\\\" tab-heading-transclude>{{heading}}</a>\\n\" +\n    \"</li>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/tabs/tabset-titles.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tabs/tabset-titles.html\",\n    \"<ul class=\\\"nav {{type && 'nav-' + type}}\\\" ng-class=\\\"{'nav-stacked': vertical}\\\">\\n\" +\n    \"</ul>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/tabs/tabset.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tabs/tabset.html\",\n    \"\\n\" +\n    \"<div>\\n\" +\n    \"  <ul class=\\\"nav nav-{{type || 'tabs'}}\\\" ng-class=\\\"{'nav-stacked': vertical, 'nav-justified': justified}\\\" ng-transclude></ul>\\n\" +\n    \"  <div class=\\\"tab-content\\\">\\n\" +\n    \"    <div class=\\\"tab-pane\\\" \\n\" +\n    \"         ng-repeat=\\\"tab in tabs\\\" \\n\" +\n    \"         ng-class=\\\"{active: tab.active}\\\"\\n\" +\n    \"         tab-content-transclude=\\\"tab\\\">\\n\" +\n    \"    </div>\\n\" +\n    \"  </div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/timepicker/timepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/timepicker/timepicker.html\",\n    \"<table>\\n\" +\n    \"\t<tbody>\\n\" +\n    \"\t\t<tr class=\\\"text-center\\\">\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"incrementHours()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-up\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td>&nbsp;</td>\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"incrementMinutes()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-up\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td ng-show=\\\"showMeridian\\\"></td>\\n\" +\n    \"\t\t</tr>\\n\" +\n    \"\t\t<tr>\\n\" +\n    \"\t\t\t<td style=\\\"width:50px;\\\" class=\\\"form-group\\\" ng-class=\\\"{'has-error': invalidHours}\\\">\\n\" +\n    \"\t\t\t\t<input type=\\\"text\\\" ng-model=\\\"hours\\\" ng-change=\\\"updateHours()\\\" class=\\\"form-control text-center\\\" ng-mousewheel=\\\"incrementHours()\\\" ng-readonly=\\\"readonlyInput\\\" maxlength=\\\"2\\\">\\n\" +\n    \"\t\t\t</td>\\n\" +\n    \"\t\t\t<td>:</td>\\n\" +\n    \"\t\t\t<td style=\\\"width:50px;\\\" class=\\\"form-group\\\" ng-class=\\\"{'has-error': invalidMinutes}\\\">\\n\" +\n    \"\t\t\t\t<input type=\\\"text\\\" ng-model=\\\"minutes\\\" ng-change=\\\"updateMinutes()\\\" class=\\\"form-control text-center\\\" ng-readonly=\\\"readonlyInput\\\" maxlength=\\\"2\\\">\\n\" +\n    \"\t\t\t</td>\\n\" +\n    \"\t\t\t<td ng-show=\\\"showMeridian\\\"><button type=\\\"button\\\" class=\\\"btn btn-default text-center\\\" ng-click=\\\"toggleMeridian()\\\">{{meridian}}</button></td>\\n\" +\n    \"\t\t</tr>\\n\" +\n    \"\t\t<tr class=\\\"text-center\\\">\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"decrementHours()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-down\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td>&nbsp;</td>\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"decrementMinutes()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-down\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td ng-show=\\\"showMeridian\\\"></td>\\n\" +\n    \"\t\t</tr>\\n\" +\n    \"\t</tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/typeahead/typeahead-match.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/typeahead/typeahead-match.html\",\n    \"<a tabindex=\\\"-1\\\" bind-html-unsafe=\\\"match.label | typeaheadHighlight:query\\\"></a>\");\n}]);\n\nangular.module(\"template/typeahead/typeahead-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/typeahead/typeahead-popup.html\",\n    \"<ul class=\\\"dropdown-menu\\\" ng-if=\\\"isOpen()\\\" ng-style=\\\"{top: position.top+'px', left: position.left+'px'}\\\" style=\\\"display: block;\\\" role=\\\"listbox\\\" aria-hidden=\\\"{{!isOpen()}}\\\">\\n\" +\n    \"    <li ng-repeat=\\\"match in matches track by $index\\\" ng-class=\\\"{active: isActive($index) }\\\" ng-mouseenter=\\\"selectActive($index)\\\" ng-click=\\\"selectMatch($index)\\\" role=\\\"option\\\" id=\\\"{{match.id}}\\\">\\n\" +\n    \"        <div typeahead-match index=\\\"$index\\\" match=\\\"match\\\" query=\\\"query\\\" template-url=\\\"templateUrl\\\"></div>\\n\" +\n    \"    </li>\\n\" +\n    \"</ul>\");\n}]);\n"
  },
  {
    "path": "demo/my-show-4-angularjs/pages/about.html",
    "content": "<!-- about.html -->\r\n<div class=\"jumbotron text-center\">\r\n    <h1>About Page</h1>\r\n \r\n    <p>{{ message }}</p>\r\n</div>"
  },
  {
    "path": "demo/my-show-4-angularjs/pages/contact.html",
    "content": "<!-- contact.html -->\r\n<div class=\"jumbotron text-center\">\r\n    <h1>Contact Page</h1>\r\n \r\n    <p>{{ message }}</p>\r\n</div>"
  },
  {
    "path": "demo/my-show-4-angularjs/pages/home.html",
    "content": "<!-- home.html -->\r\n<div class=\"jumbotron text-center\">\r\n    <h2>{{message.name}}</h2>\r\n \t<h2>{{message.mail}}</h2>\r\n    <p>{{message.other}}</p>\r\n</div>"
  },
  {
    "path": "demo/my-show-4-angularjs/pages/project.html",
    "content": "\r\n<div class=\"jumbotron text-center\">\r\n    <h2>项目名称:{{ project.name }}</h2>\r\n \r\n    <p>{{ project.other }}</p>\r\n</div>"
  },
  {
    "path": "feed.xml",
    "content": "---\nlayout: none\n---\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<feed xmlns=\"http://www.w3.org/2005/Atom\" xml:lang=\"en\">\n<title type=\"text\">{{ site.title }}</title>\n<generator uri=\"https://github.com/mojombo/jekyll\">Jekyll</generator>\n<link rel=\"self\" type=\"application/atom+xml\" href=\"{{ site.url }}/feed.xml\" />\n<link rel=\"alternate\" type=\"text/html\" href=\"{{ site.url }}\" />\n<updated>{{ site.time | date_to_xmlschema }}</updated>\n<id>{{ site.url }}/</id>\n<author>\n  <name>{{ site.owner.name }}</name>\n  <uri>{{ site.url }}/</uri>\n  <email>{{ site.owner.email }}</email>\n</author>\n{% for post in site.posts limit:20 %}\n\n<entry>\n  <title type=\"html\"><![CDATA[{{ post.title | cdata_escape }}]]></title>\n <link rel=\"alternate\" type=\"text/html\" href=\"{% if post.link %}{{ post.link }}{% else %}{{ site.url }}{{ post.url }}{% endif %}\" />\n  <id>{{ site.url }}{{ post.id }}</id>\n  {% if post.modified %}<updated>{{ post.modified | to_xmlschema }}T00:00:00-00:00</updated>\n  <published>{{ post.date | date_to_xmlschema }}</published>\n  {% else %}<published>{{ post.date | date_to_xmlschema }}</published>\n  <updated>{{ post.date | date_to_xmlschema }}</updated>{% endif %}\n  <author>\n    <name>{{ site.owner.name }}</name>\n    <uri>{{ site.url }}</uri>\n    <email>{{ site.owner.email }}</email>\n  </author>\n  <content type=\"html\">{{ post.content | xml_escape }}\n  &lt;p&gt;&lt;a href=&quot;{{ site.url }}{{ post.url }}&quot;&gt;{{ post.title }}&lt;/a&gt; was originally published by {{ site.owner.name }} at &lt;a href=&quot;{{ site.url }}&quot;&gt;{{ site.title }}&lt;/a&gt; on {{ post.date | date: \"%B %d, %Y\" }}.&lt;/p&gt;</content>\n</entry>\n{% endfor %}\n</feed>\n"
  },
  {
    "path": "index.html",
    "content": "---\nlayout: post-index\ntitle: hacke2's blog | WEB前端,一路前行\ndescription: \"hacke2的前端技术博客,分享自己的技术心得,积累前段技能,汇聚前端之路的点点滴滴。\"\ntags: [hacke2, blog, hacke2 blog, 前端技术, javascript]\nimage:\n  feature: shiyanshi.jpg\n  credit: dargadgetz\n  creditlink: http://www.dargadgetz.com/ios-7-abstract-wallpaper-pack-for-iphone-5-and-ipod-touch-retina/\n---\n\n{% for post in paginator.posts %}\n<article class=\"hentry\">\n  <header>\n    <div class=\"entry-meta\">\n      <span class=\"entry-date date published updated\"><time datetime=\"{{ post.date | date_to_xmlschema }}\"><a href=\"{{ site.url }}{{ post.url }}\">{{ post.date | date: \"%B %d, %Y\" }}</a></time></span><span class=\"author vcard\"><span class=\"fn\"><a href=\"{{ site.url }}/about/\" title=\"About {{ site.owner.name }}\">{{ site.owner.name }}</a></span></span>{% if site.disqus_shortname and post.comments %}&nbsp; &bull; &nbsp;<span class=\"entry-comments\"><a href=\"{{ site.url }}{{ post.url }}#disqus_thread\">Comment</a></span>{% endif %}\n      {% if site.reading_time %}\n      <span class=\"entry-reading-time pull-right\">\n        <i class=\"fa fa-clock-o\"></i>\n        {% assign readtime = post.content | number_of_words | divided_by:site.words_per_minute %}\n        Reading time ~{% if readtime <= 1 %}1 minute{% else %}{{ readtime }} minutes{% endif %}\n      </span><!-- /.entry-reading-time -->\n      {% endif %}\n    </div><!-- /.entry-meta -->\n    {% if post.link %}\n      <h1 class=\"entry-title\"><a href=\"{{ site.url }}{{ post.url }}\" rel=\"bookmark\" title=\"{{ post.title }}\"><i class=\"fa fa-angle-double-right\"></i></a> <a href=\"{{ post.link }}\">{{ post.title }}</a></h1>\n    {% else %}\n      <h1 class=\"entry-title\"><a href=\"{{ site.url }}{{ post.url }}\" rel=\"bookmark\" title=\"{{ post.title }}\" itemprop=\"url\">{{ post.title }}</a></h1>\n    {% endif %}\n  </header>\n  <div class=\"entry-content\">\n    {% if post.content contains '<!--more-->' %}\n      {{ post.content | split:'<!--more-->' | first %}}\n      <p><a class=\"btn btn-info\" style=\"float:right;\" href=\"{{ post.url }}\">Read more</a></p>\n    {% else %}\n      {{ post.content }}\n    {% endif %}\n  </div><!-- /.entry-content -->\n</article><!-- /.hentry -->\n{% endfor %}\n\n<div class=\"pagination\">\n  {% if paginator.previous_page %}\n    {% if paginator.previous_page == 1 %}\n      <a href=\"{{ site.url }}\" class=\"btn\">Previous</a>\n    {% else %}\n      <a href=\"{{ site.url }}/page{{ paginator.previous_page }}\" class=\"btn\">Previous</a>\n    {% endif %}\n  {% else %}\n    Previous\n  {% endif %}\n  <ul class=\"inline-list\">\n    <li>\n      {% if paginator.page == 1 %}\n        <span class=\"current-page\">1</span>\n      {% else %}\n        <a href=\"{{ site.url }}\">1</a>\n      {% endif %}\n    </li>\n    {% for count in (2..paginator.total_pages) %}\n      <li>\n        {% if count == paginator.page %}\n          <span class=\"current-page\">{{ count }}</span>\n        {% else %}\n          <a href=\"{{ site.url }}/page{{ count }}\">{{ count }}</a>\n        {% endif %}\n      </li>\n    {% endfor %}\n  </ul>\n  {% if paginator.next_page %}\n    <a href=\"{{ site.url }}/page{{ paginator.next_page }}\" class=\"btn\">Next</a>\n  {% else %}\n    Next\n  {% endif %}\n</div><!-- /.pagination -->"
  },
  {
    "path": "monthly/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<title>Month</title>\n\t<meta http-equiv=\"refresh\" content=\"url=https://github.com/sm-fe/month\"> \n</head>\n<body>\n\t\n</body>\n</html>\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"hpstr-theme\",\n  \"author\": \"Michael Rose <michael@mademistakes.com>\",\n  \"homepage\": \"http://mmistakes.github.io/hpstr-jekyll-theme/\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/mmistakes/hpstr-jekyll-theme.git\"\n  },\n  \"bugs\": {\n    \"url\": \"https://github.com/mmistakes/hpstr-jekyll-theme/issues\"\n  },\n  \"engines\": {\n    \"node\": \">= 0.10.0\"\n  },\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.1\",\n    \"grunt-contrib-clean\": \"~0.5.0\",\n    \"grunt-contrib-jshint\": \"~0.6.3\",\n    \"grunt-contrib-uglify\": \"~0.2.2\",\n    \"grunt-contrib-watch\": \"~0.5.2\",\n    \"grunt-recess\": \"~0.3.5\",\n    \"grunt-contrib-imagemin\": \"~0.2.0\",\n    \"grunt-svgmin\": \"~0.2.0\"\n  }\n}\n"
  },
  {
    "path": "posts.html",
    "content": "---\nlayout: post-index\npermalink: /posts/\ntitle: All Posts\ndescription: \"An archive of posts.\"\n---\n\n{% for post in site.posts %}\n    {% capture this_year %}{{ post.date | date: \"%Y\" }}{% endcapture %}\n    {% capture next_year %}{{ post.previous.date | date: \"%Y\" }}{% endcapture %}\n\n    {% if forloop.first %}\n    <article>\n      <h2 id=\"{{ this_year }}-ref\">{{ this_year }}</h2>\n      <ul>\n    {% endif %}\n\n        <li class=\"entry-title\"><a href=\"{{ site.url }}{{ post.url }}\" title=\"{{ post.title }}\">{{ post.title }}</a></li>\n\n    {% if forloop.last %}\n      </ul>\n    </article>\n    {% else %}\n        {% if this_year != next_year %}\n          </ul>\n        </article>\n        <article>\n          <h2 id=\"{{ next_year }}-ref\">{{next_year}}</h2>\n          <ul>\n        {% endif %}\n    {% endif %}\n{% endfor %}"
  },
  {
    "path": "ppt/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-gear:before,.fa-cog:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-rotate-right:before,.fa-repeat:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-gears:before,.fa-cogs:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-save:before,.fa-floppy-o:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-unsorted:before,.fa-sort:before{content:\"\\f0dc\"}.fa-sort-down:before,.fa-sort-desc:before{content:\"\\f0dd\"}.fa-sort-up:before,.fa-sort-asc:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-legal:before,.fa-gavel:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-flash:before,.fa-bolt:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-paste:before,.fa-clipboard:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-unlink:before,.fa-chain-broken:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\"\\f150\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\"\\f151\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\"\\f152\"}.fa-euro:before,.fa-eur:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-rupee:before,.fa-inr:before{content:\"\\f156\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\"\\f157\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\"\\f158\"}.fa-won:before,.fa-krw:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-turkish-lira:before,.fa-try:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\"\\f19c\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\"\\f1c5\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\"\\f1c6\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before{content:\"\\f1d0\"}.fa-ge:before,.fa-empire:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-hacker-news:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-send:before,.fa-paper-plane:before{content:\"\\f1d8\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}\n"
  },
  {
    "path": "ppt/css/nodeppt.css",
    "content": "@import url(http://fonts.useso.com/css?family=Source%20Code%20Pro:light,regular,semibold);html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:\"\";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}html{height:100%;overflow:hidden}body{margin:0;padding:0;opacity:0;height:100%;width:100%;overflow:hidden;color:#fff;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;-ms-font-smoothing:antialiased;-o-font-smoothing:antialiased;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}body.loaded{opacity:1 !important}input,button{vertical-align:middle}slides>slide[hidden]{display:none !important}slides{width:100%;height:100%;position:absolute;left:0;top:0;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-moz-perspective:1000;-webkit-perspective:1000;perspective:1000;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}slides>slide{display:block;position:absolute;overflow:hidden;left:50%;top:50%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}article.fill iframe{position:absolute;left:0;top:0;width:100%;height:100%;border:0;margin:0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;z-index:-1}slide.fill{background-repeat:no-repeat;-moz-background-size:cover;-o-background-size:cover;-webkit-background-size:cover;background-size:cover}slide.fill img{position:absolute;left:0;top:0;min-width:100%;min-height:100%;z-index:-1}.transparent{opacity:0}::selection{color:#fff;background-color:#ffd14d;text-shadow:none}::-webkit-scrollbar{height:10px;overflow:visible;width:10px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.1);background-clip:padding-box;border:solid transparent;min-height:28px;padding:100px 0 0;-moz-box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);-webkit-box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);border-width:1px 1px 1px 6px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,0.5)}::-webkit-scrollbar-button{height:0;width:0}::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}::-webkit-scrollbar-corner{background:transparent}body{background:black;font-family:\"YaHei Consolas Hybrid\",STHeiti,\"Microsoft Yahei\",Arial,Helvetica,sans-serif}a{color:#ff8c78;padding:0 3px;text-decoration:none;border-bottom:1px dashed #ff8c78;cursor:help;margin:0 5px;background-color:transparent;display:inline-block;vertical-align:middle;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-box-shadow:0 0 1px transparent;-moz-box-shadow:0 0 1px transparent;-ms-box-shadow:0 0 1px transparent;-o-box-shadow:0 0 1px transparent;box-shadow:0 0 1px transparent;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;-moz-osx-font-smoothing:grayscale;position:relative;overflow:hidden}a:hover{color:#ff4d2e;border-bottom:none;background-color:transparent}a:before{content:\"\";position:absolute;z-index:-1;left:50%;right:50%;bottom:0;background:#ff4d2e;height:4px;-webkit-transition-property:left, right;-moz-transition-property:left, right;-ms-transition-property:left, right;-o-transition-property:left, right;transition-property:left, right;-webkit-transition-duration:0.3s;-moz-transition-duration:0.3s;-ms-transition-duration:0.3s;-o-transition-duration:0.3s;transition-duration:0.3s;-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}a:hover:before,a:focus:before,a:active:before{left:0;right:0}h1,h2,h3{font-weight:600;color:#fff;text-shadow:2px 2px 2px #000}h1{font-size:45px;line-height:1.5;color:white;margin-bottom:0.5em;text-shadow:2px 3px 4px #000}h2{font-weight:bold;font-size:34px;line-height:2;color:white}h3{font-size:28px;line-height:1.5;font-weight:inherit;color:white}p{line-height:1.75em}ul{margin-left:1.2em;position:relative;list-style:disc inside;text-align:left;display:inline-block}ul li{line-height:1.75em;list-style-position:outside}ul li ul{margin-left:2em;margin-bottom:0;list-style-type:none;display:block}ul li ul li:before{content:'-';position:absolute;margin-left:-1em;font-weight:600}ul ul{margin-top:.5em}ol{list-style-type:decimal;display:inline-block;text-align:left;margin:0 0 0 1em}ol li{line-height:1.5em}mark{color:#468847;background-color:#dff0d8}pre{font-family:\"Source Code Pro\",Consolas,\"Courier New\",Courier,monospace;font-size:20px;line-height:1.2em;letter-spacing:-1px;margin-bottom:20px;text-align:left;position:relative;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}pre code{font-size:95%;font-family:\"Source Code Pro\",Consolas,\"Courier New\",Courier,monospace;color:black;border:none 0;padding:0;background-color:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}code{margin:0;font-family:\"Source Code Pro\",Consolas,\"Courier New\",Courier,monospace;border:1px solid #ddd;background-color:#f8f8f8;padding:0 3px;margin:0 5px;vertical-align:middle;color:#dd1144;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}iframe{width:100%;height:480px;background:white;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}dt{font-weight:bold}table{width:100%;color:black;border-collapse:-moz-initial;border-collapse:initial;border-spacing:1px;border-bottom:1px solid #797979}table thead th{background-color:#e6e6e6;font-weight:bold}table tr>td:first-child,table th{font-weight:bolder}table tr{background-color:white}table tr:nth-child(even){background-color:#e6e6e6}table td,table th{font-size:18px;padding:1em 0.5em;line-height:1.5}table td.highlight{font-weight:bold;color:#468847;background-color:#dff0d8 !important}table.rows{border-bottom:none;border-right:1px solid #797979}button{border:0 none}.btn{outline:0;-webkit-transition:all 0.3s linear;-moz-transition:all 0.3s linear;-ms-transition:all 0.3s linear;-o-transition:all 0.3s linear;transition:all 0.3s linear;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;padding:9px 12px;font-size:13px;-webkit-font-smoothing:antialiased;line-height:14px}.btn:focus,.btn:active,.btn.active,.btn:active:focus,.btn.active:focus{outline:0}.btn:active,.btn.active{-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.1);-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.1);box-shadow:inset 0 3px 8px rgba(0,0,0,0.1)}.btn-lg,.btn-group-lg>.btn{padding:15px 16px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.btn-sm,.btn-group-sm>.btn{padding:7px 10px}.btn-xs,.btn-group-xs>.btn{padding:3px 5px;font-size:10px}.btn-rounded,.btn-rounded a,.btn-rounded .btn{-moz-border-radius:40px;-webkit-border-radius:40px;border-radius:40px}.btn-default .btn-default{color:#000;background-color:#eaecf6;border-color:#d5d9ed}.btn-default .btn-default:hover,.btn-default .btn-default:focus,.btn-default .btn-default:active,.btn-default .btn-default.active,.btn-default .btn-default.disabled,.btn-default .btn-default[disabled]{background-color:#d8dcee;border-color:#b1b8de}.btn-default .btn-default.btn-outline{background-color:transparent;color:#eaecf6;background-color:#eaecf6;color:#000}.btn-default.btn-outline{color:#000}.btn-primary{color:#fff;background-color:#1582dc;border-color:#1582dc}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#1374c5;border-color:#1166ad}.btn-primary.btn-outline{background-color:transparent;color:#1582dc;background-color:#1582dc;color:#fff}.btn-warning{color:#fff;background-color:#daac16;border-color:#daac16}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#c39a14;border-color:#ac8711}.btn-warning.btn-outline{background-color:transparent;color:#daac16;background-color:#daac16;color:#fff}.btn-success{color:#fff;background-color:#15db81;border-color:#15db81}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#13c473;border-color:#11ac66}.btn-success.btn-outline{background-color:transparent;color:#15db81;background-color:#15db81;color:#fff}.btn-info{color:#fff;background-color:#15acdc;border-color:#15acdc}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#139ac5;border-color:#1188ad}.btn-info.btn-outline{background-color:transparent;color:#15acdc;background-color:#15acdc;color:#fff}.btn-danger{color:#fff;background-color:#da3e16;border-color:#da3e16}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#c33714;border-color:#ac3111}.btn-danger.btn-outline{background-color:transparent;color:#da3e16;background-color:#da3e16;color:#fff}.ptl{position:absolute;top:0;left:0}.ptr{position:absolute;top:0;right:0}.pbl{position:absolute;bottom:0;left:0}.pbr{position:absolute;bottom:0;right:0}.bg-none{background-color:transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.shadow{-moz-box-shadow:0 0 5px rgba(0,0,0,0.2);-webkit-box-shadow:0 0 5px rgba(0,0,0,0.2);box-shadow:0 0 5px rgba(0,0,0,0.2)}.no-shadow{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.no-m{margin:0 !important}.mn{margin-right:-15px;margin-left:-15px}.mrn{margin-right:-15px}.mln{margin-left:-15px}.mbn{margin-bottom:-15px}.ml0{margin-left:0}.mr0{margin-right:0}.mt0{margin-top:0}.mb0{margin-bottom:0}.m25{margin:25px}.mr25{margin-right:25px}.ml25{margin-left:25px}.mt25{margin-top:25px}.mb25{margin-bottom:25px}.m20{margin:20px}.mr20{margin-right:20px}.ml20{margin-left:20px}.mt20{margin-top:20px}.mb20{margin-bottom:20px}.m15{margin:15px}.mr15{margin-right:15px}.ml15{margin-left:15px}.mt15{margin-top:15px}.mb15{margin-bottom:15px}.m10{margin:10px}.mr10{margin-right:10px}.ml10{margin-left:10px}.mt10{margin-top:10px}.mb10{margin-bottom:10px}.m5{margin:5px}.mr5{margin-right:5px}.ml5{margin-left:5px}.mt5{margin-top:5px}.mb5{margin-bottom:5px}.no-p{padding:0 !important}.pl0{padding-left:0}.pr0{padding-right:0}.pt0{padding-top:0}.pb0{padding-bottom:0}.p25{padding:25px}.pr25{padding-right:25px}.pl25{padding-left:25px}.pt25{padding-top:25px}.pb25{padding-bottom:25px}.p20{padding:20px}.pr20{padding-right:20px}.pl20{padding-left:20px}.pt20{padding-top:20px}.pb20{padding-bottom:20px}.p15{padding:15px}.pr15{padding-right:15px}.pl15{padding-left:15px}.pt15{padding-top:15px}.pb15{padding-bottom:15px}.p10{padding:10px}.pr10{padding-right:10px}.pl10{padding-left:10px}.pt10{padding-top:10px}.pb10{padding-bottom:10px}.p5{padding:5px}.pr5{padding-right:5px}.pl5{padding-left:5px}.pt5{padding-top:5px}.pb5{padding-bottom:5px}.draw-board{position:fixed;cursor:url(pen.cur),default;z-index:9999;top:0;left:0;right:0;bottom:0}.slideTip{display:none;padding:10px 0;width:300px;background:rgba(0,0,0,0.3);border-radius:5px;padding:10px;margin:0 auto;color:#FFF;position:fixed;top:40%;left:50%;margin-left:-150px;text-align:center}.progress{position:fixed;height:3px;width:100%;bottom:0;left:0;background:#000}.progress span{display:block;background:#2187E7;height:100%;width:0;border:none;-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0;border-radius:0 2px 2px 0;-moz-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);-o-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);-webkit-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985)}.slides{width:100%;height:100%;text-align:center}slides>slide .slide-wrapper{max-width:900px;text-align:center;margin:0 auto;position:relative;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;height:100%}slides>slide .slide-wrapper>hgroup+article{margin-top:20px}slides>slide .slide-wrapper>hgroup+article.flexbox.vcenter,slides>slide .slide-wrapper>hgroup+article.flexbox.vleft,slides>slide .slide-wrapper>hgroup+article.flexbox.vright{height:80%}slides>slide .slide-wrapper>hgroup+article p>img:only-child{margin-bottom:1em}slides>slide .slide-wrapper>article:only-child h2{font-weight:normal}slides>slide .slide-wrapper>article:only-child>pre{overflow-y:auto;max-height:98%}slides>slide .slide-wrapper>article:only-child>iframe{height:98%}slides>slide .slide-wrapper img{-webkit-justify-content:space-around;justify-content:space-around;max-width:100%;max-height:520px}slides>slide .slide-wrapper blockquote{font-size:28px;line-height:1.5em;padding:5px 5px 5px 20px;background-color:#f9ff95;border-left:5px solid #3e87cf;color:#000;text-align:left;min-width:500px;display:inline-block}slides>slide .slide-wrapper blockquote small{display:block;line-height:20px;color:#999}slides>slide .slide-wrapper blockquote small::before{content:'\\2014 \\00A0'}slides>slide .slide-wrapper blockquote p{margin-bottom:0 !important;font-size:17.5px;font-weight:300;line-height:1.25}slides>slide .slide-wrapper blockquote.pull-right{padding-left:15px;border-right:5px solid #3E87CF;text-align:right;padding-right:20px;border-left:none}slides>slide .slide-wrapper blockquote.pull-right small::before{content:''}slides>slide .slide-wrapper blockquote.pull-right small::after{content:'\\00A0 \\2014'}slides>slide .slide-wrapper b,slides>slide .slide-wrapper strong{font-weight:bold;margin:0 5px;text-shadow:2px 3px 1px rgba(0,0,0,0.8)}slides>slide .slide-wrapper em{margin:0 5px;font-weight:bold;text-shadow:-1px -2px 1px rgba(0,0,0,0.8)}slides>slide .slide-wrapper pre b,slides>slide .slide-wrapper pre strong{margin:0;text-shadow:none}slides>slide{display:none;font-size:26px;color:#fff;background-color:#03c8cb;width:100%;height:100%;position:absolute;top:0;left:0;z-index:9;padding:40px 60px;-moz-transition:all 0.6s ease-in-out;-o-transition:all 0.6s ease-in-out;-webkit-transition:all 0.6s ease-in-out;transition:all 0.6s ease-in-out;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;-o-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}slides>slide.far-past{display:none}slides>slide.past{display:block;opacity:0}slides>slide.current{display:block;opacity:1;z-index:99}slides>slide.current .auto-fadein{opacity:1}slides>slide.current .gdbar{-moz-background-size:100% 100%;-o-background-size:100% 100%;-webkit-background-size:100% 100%;background-size:100% 100%}slides>slide.next{display:block;opacity:0}slides>slide.far-next{display:none}slides>slide.dark{background:#515151 !important}slides>slide.title-slide:after{content:'';position:absolute;bottom:40px;right:40px;width:100%;height:60px}slides>slide.backdrop{z-index:-10;display:block !important;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iODUlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZTZlNmU2Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(85%, #ffffff),color-stop(100%, #e6e6e6));background:-moz-linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background:-webkit-linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background:linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background-color:white}slides>slide.backdrop:after,slides>slide.backdrop:before{display:none}slides>slide:nth-child(6n+1){background-color:#dc6c5f}slides>slide:nth-child(6n+2){background-color:#04aa55}slides>slide:nth-child(6n+3){background-color:#487bd3}slides>slide:nth-child(6n+4){background-color:#049dbf}slides>slide:nth-child(6n+5){background-color:#da4a89}slides>slide .note{color:#000}slides>slide .note h1,slides>slide .note h2,slides>slide .note h3,slides>slide .note h4{color:#000;text-shadow:none}.highlight-code slide.current b,.highlight-code slide.current strong,slide.current .hljs b,slide.current .hljs strong{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:shake;-moz-animation-name:shake;-ms-animation-name:shake;-o-animation-name:shake;animation-name:shake;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current em,slide.current .hljs em{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:flash;-moz-animation-name:flash;-ms-animation-name:flash;-o-animation-name:flash;animation-name:flash;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current .hljs b,.highlight-code slide.current .hljs strong{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:flash;-moz-animation-name:flash;-ms-animation-name:flash;-o-animation-name:flash;animation-name:flash;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current .hljs em{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:shake;-moz-animation-name:shake;-ms-animation-name:shake;-o-animation-name:shake;animation-name:shake;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}slides.layout-faux-widescreen>slide{padding:40px 160px}slides.layout-widescreen>slide .slide-wrapper,slides.layout-faux-widescreen>slide .slide-wrapper{width:100%;max-width:100%}slides.layout-widescreen>slide .slide-wrapper img,slides.layout-faux-widescreen>slide .slide-wrapper img{max-width:980px}slides.layout-widescreen>slide.far-past,slides.layout-faux-widescreen>slide.far-past{display:block;display:none;-moz-transform:translate(-2260px);-ms-transform:translate(-2260px);-webkit-transform:translate(-2260px);transform:translate(-2260px);-moz-transform:translate3d(-2260px, 0, 0);-ms-transform:translate3d(-2260px, 0, 0);-webkit-transform:translate3d(-2260px, 0, 0);transform:translate3d(-2260px, 0, 0)}slides.layout-widescreen>slide.past,slides.layout-faux-widescreen>slide.past{display:block;opacity:0}slides.layout-widescreen>slide.current,slides.layout-faux-widescreen>slide.current{display:block;opacity:1}slides.layout-widescreen>slide.next,slides.layout-faux-widescreen>slide.next{display:block;opacity:0}slides.layout-widescreen>slide.far-next,slides.layout-faux-widescreen>slide.far-next{display:block;display:none;-moz-transform:translate(2260px);-ms-transform:translate(2260px);-webkit-transform:translate(2260px);transform:translate(2260px);-moz-transform:translate3d(2260px, 0, 0);-ms-transform:translate3d(2260px, 0, 0);-webkit-transform:translate3d(2260px, 0, 0);transform:translate3d(2260px, 0, 0)}slides.layout-widescreen #prev-slide-area,slides.layout-faux-widescreen #prev-slide-area{margin-left:-650px}slides.layout-widescreen #next-slide-area,slides.layout-faux-widescreen #next-slide-area{margin-left:550px}:disabled{color:#a9a9a9}.blue{color:#4387fd !important}.blue2,.blue-2{color:#3c8ef3 !important}.blue3,.blue-3{color:#2a7cdf !important}.yellow{color:#ffd14d}.yellow2,.yellow-2{color:#f9cc46 !important}.yellow3,.yellow-3{color:#f6c000 !important}.green{color:#0da861 !important}.green2,.green-2{color:#00a86d !important}.green3,.green-3{color:#009f5d !important}.red{color:#f44a3f}.red2,.red-2{color:#e0543e !important}.red3,.red-3{color:#d94d3a !important}.gray{color:#e6e6e6 !important}.gray2,.gray-2{color:#a9a9a9 !important}.gray3,.gray-3{color:#797979 !important}.gray4,.gray-4{color:#515151 !important}.white{color:white !important}.black{color:black !important}.columns-2,.columns2{-moz-column-count:2;-webkit-column-count:2;column-count:2}.columns-3,.columns3{-moz-column-count:3;-webkit-column-count:3;column-count:3}.label{line-height:inherit;font-weight:400}.label-default{background-color:#eaecf6;color:black;border:1px solid #fafafa}.label-default[href]:hover,.label-default[href]:focus{background-color:#c6cce7}.label-primary{background-color:#1582dc;color:#fff}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1166ad}.label-success{background-color:#15db81}.label-success[href]:hover,.label-success[href]:focus{background-color:#11ac66}.label-info{background-color:#15acdc}.label-info[href]:hover,.label-info[href]:focus{background-color:#1188ad}.label-warning{background-color:#daac16}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ac8711}.label-danger{background-color:#da3e16}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#ac3111}.text-default{color:#eaecf6 !important}.text-primary{color:#1582dc !important}.text-success{color:#15db81 !important}.text-warning{color:#daac16 !important}.text-danger{color:#da3e16 !important}.text-info{color:#15acdc !important}.text-white{color:#fff !important}.text-dark{color:#4f5061 !important}slide.fill{background-repeat:no-repeat;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-background-size:cover;-o-background-size:cover;-webkit-background-size:cover;background-size:cover}article.smaller p,article.smaller ul{font-size:20px;line-height:24px;letter-spacing:0}article.smaller table td,article.smaller table th{font-size:14px}article.smaller pre{font-size:15px;line-height:20px;letter-spacing:0}article.smaller q{font-size:40px;line-height:48px}article.smaller q:before,article.smaller q:after{font-size:60px}.slide .subSlide.tobuild{visibility:hidden}.slide .subSlide.builded.subBuilded{display:none}.subSlide{display:none;opacity:0;visibility:hidden}.subSlide.building{opacity:1;display:block;visibility:visible;-moz-transition:opacity 0.3s ease;-o-transition:opacity 0.3s ease;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}.subSlide.builded{opacity:1;display:block;visibility:visible}.subSlide.subBuilded{display:none;opacity:0;visibility:hidden;-moz-transition:opacity 0.3s ease,display 0.4s ease;-o-transition:opacity 0.3s ease,display 0.4s ease;-webkit-transition:opacity 0.3s ease,display 0.4s ease;transition:opacity 0.3s ease,display 0.4s ease}.fade{display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center}.fade>*{opacity:0;-moz-transition:opacity 0.5s ease-in-out 0.2s;-o-transition:opacity 0.5s ease-in-out 0.2s;-webkit-transition:opacity 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:opacity 0.5s ease-in-out 0.2s}.fade>.tobuild:first-child{display:-webkit-flex;display:flex;visibility:hidden}.fade>.builded{opacity:0;display:none;visibility:hidden}.fade>.builded:last-child{opacity:1;display:-webkit-flex;display:flex;visibility:visible}.fade>.building{display:-webkit-flex;display:flex;opacity:1}.fade .tobuild{opacity:0;display:none}.fadeIn>*{-moz-transition:opacity 0.5s ease-in-out 0.2s;-o-transition:opacity 0.5s ease-in-out 0.2s;-webkit-transition:opacity 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:opacity 0.5s ease-in-out 0.2s}.fadeIn .tobuild{opacity:0}.bounceIn>*,.zoomIn>*{opacity:1}.bounceIn .tobuild,.zoomIn .tobuild{opacity:0}.bounceIn .building,.zoomIn .building{opacity:1;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.bounceIn .building{-webkit-animation-name:bounceIn;animation-name:bounceIn}.zoomIn .building{-webkit-animation-name:zoomIn;animation-name:zoomIn}.moveIn>*{-moz-transition:all 0.5s ease-in-out 0.2s;-o-transition:all 0.5s ease-in-out 0.2s;-webkit-transition:all 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:all 0.5s ease-in-out 0.2s}.moveIn .tobuild{opacity:0;-moz-transform:translate3d(60px, 0, 0);-ms-transform:translate3d(60px, 0, 0);-webkit-transform:translate3d(60px, 0, 0);transform:translate3d(60px, 0, 0)}.rollIn>*{-moz-transition:all 0.4s ease;-o-transition:all 0.4s ease;-webkit-transition:all 0.4s ease;transition:all 0.4s ease}.rollIn .building{opacity:1;visibility:visible;-moz-transform:rotateX(0);-ms-transform:rotateX(0);-webkit-transform:rotateX(0);transform:rotateX(0)}.rollIn .tobuild{opacity:0;visibility:hidden;-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-webkit-transform:rotateX(90deg);transform:rotateX(90deg)}.popup .next .build .tobuild{opacity:1 !important}.popup .next .build .builded{opacity:1 !important}.note{position:absolute;width:100%;height:100%;top:0;left:0;padding:1em;background:rgba(0,0,0,0.3);opacity:0;display:-webkit-flex;display:flex;-webkit-flex-flow:row;flex-flow:row;-webkit-justify-content:center;justify-content:center;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-transition:all 0.4s ease-in-out;-o-transition:all 0.4s ease-in-out;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}.note>section{text-align:left;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:inset 0 0 10px #6f6f6f;-webkit-box-shadow:inset 0 0 10px #6f6f6f;box-shadow:inset 0 0 10px #6f6f6f;width:70%;padding:2em}.qrcode{display:none;position:fixed;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,0.5)}.qrcode #qrcode{width:256px;height:300px;vertical-align:middle;margin:0 auto;position:relative;background-color:white;padding:20px 20px 10px;top:100px}.qrcode p{text-align:center;line-height:44px;position:absolute;top:380px;width:100%}.with-notes.popup.overview slide.next{opacity:0.5 !important}.with-notes .progress{display:none}.with-notes.popup slides.layout-widescreen slide.next,.with-notes.popup slides.layout-faux-widescreen slide.next{-moz-transform:translate3d(690px, 80px, 0) scale(0.35);-ms-transform:translate3d(690px, 80px, 0) scale(0.35);-webkit-transform:translate3d(690px, 80px, 0) scale(0.35);transform:translate3d(690px, 80px, 0) scale(0.35)}.with-notes.popup slides.layout-widescreen slide .note,.with-notes.popup slides.layout-faux-widescreen slide .note{z-index:100;-moz-transform:translate3d(300px, 700px, 0) scale(1.5);-ms-transform:translate3d(300px, 700px, 0) scale(1.5);-webkit-transform:translate3d(300px, 700px, 0) scale(1.5);transform:translate3d(300px, 700px, 0) scale(1.5)}.with-notes.popup slide{width:1100px !important;overflow:visible;-moz-transition:none !important;-o-transition:none !important;-webkit-transition:none !important;transition:none !important;-moz-transform-origin:0 0 !important;-ms-transform-origin:0 0 !important;-webkit-transform-origin:0 0 !important;transform-origin:0 0 !important}.with-notes.popup slide[data-transition].current,.with-notes.popup slide[data-transition].next,.with-notes.popup slide[data-transition].past{top:auto !important;left:auto !important;-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-animation-name:none;animation-name:none}.with-notes.popup slide:not(.backdrop){-moz-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);-ms-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);-webkit-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);transform:scale(0.6) translate3d(0.5em, 0.5em, 0)}.with-notes.popup slide.backdrop{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHJhZGlhbEdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNjAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2IxZGZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQzODdmZCIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px);background-image:-webkit-radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px);background-image:radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px)}.with-notes.popup slide.next{-moz-transform:translate3d(690px, 80px, 0) scale(0.35);-ms-transform:translate3d(690px, 80px, 0) scale(0.35);-webkit-transform:translate3d(690px, 80px, 0) scale(0.35);transform:translate3d(690px, 80px, 0) scale(0.35);opacity:1 !important;-webkit-clip-path:none !important}.with-notes.popup slide.next .note{display:none !important}.with-notes.popup .note{width:100%;height:210px;padding:0;-moz-transform:translate3d(350px, 850px, 0) scale(1.5);-ms-transform:translate3d(350px, 850px, 0) scale(1.5);-webkit-transform:translate3d(350px, 850px, 0) scale(1.5);transform:translate3d(350px, 850px, 0) scale(1.5);-moz-transition:opacity 400ms ease-in-out;-o-transition:opacity 400ms ease-in-out;-webkit-transition:opacity 400ms ease-in-out;transition:opacity 400ms ease-in-out}.with-notes.popup .note>section{background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;overflow:auto;padding:1em}.with-notes .note{display:-webkit-flex;display:flex;opacity:1;-moz-transform:translateY(0);-ms-transform:translateY(0);-webkit-transform:translateY(0);transform:translateY(0);pointer-events:auto;z-index:100}@media screen and (min-width: 1200px){.with-notes.popup .note{-moz-transform:translate3d(350px, 1050px, 0) scale(1.5);-ms-transform:translate3d(350px, 1050px, 0) scale(1.5);-webkit-transform:translate3d(350px, 1050px, 0) scale(1.5);transform:translate3d(350px, 1050px, 0) scale(1.5)}.with-notes.popup slide.next{-moz-transform:translate3d(890px, 80px, 0) scale(0.35);-ms-transform:translate3d(890px, 80px, 0) scale(0.35);-webkit-transform:translate3d(890px, 80px, 0) scale(0.35);transform:translate3d(890px, 80px, 0) scale(0.35)}}#_timer_{display:block;position:fixed;bottom:1em;left:0.5em}.img-full{-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-moz-transition:opacity 800ms;-o-transition:opacity 800ms;-webkit-transition:opacity 800ms;transition:opacity 800ms;background-color:#000;bottom:0;display:-webkit-box;display:-moz-box;display:box;left:0;overflow:auto;position:fixed;right:0;top:0;display:none}.img-full img{background:#000;color:#333;padding:0;position:fixed;min-width:100px;z-index:0;top:20px;left:50%;-webkit-transition:800ms -webkit-transform;-moz-transition:800ms -moz-transform;transition:800ms transform}.img-full img.transparent{-moz-transform:scale(0.99) translateY(-20px);-ms-transform:scale(0.99) translateY(-20px);-webkit-transform:scale(0.99) translateY(-20px);transform:scale(0.99) translateY(-20px)}#_buttons{position:fixed;bottom:0.25em;z-index:9999;right:0.25em}#_buttons ._btn-box{display:inline-block}#_buttons button{font-size:1rem;background:none;border:0 none;color:rgba(0,0,0,0.3);text-shadow:0 0 transparent}#_buttons button:hover{color:black}.popup.with-notes #_buttons ._btn-box,.overview #_buttons ._btn-box{display:inline-block !important}.popup.with-notes #_buttons #_btn-bar,.overview #_buttons #_btn-bar{display:none !important}.popup.with-notes #_buttons button,.overview #_buttons button{color:white}.source{font-size:14px;color:#a9a9a9;position:absolute;line-height:2em;bottom:70px;left:60px}.centered{text-align:center}.reflect{-webkit-box-reflect:below 3px -webkit-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-moz-box-reflect:below 3px -moz-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-o-box-reflect:below 3px -o-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-ms-box-reflect:below 3px -ms-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);box-reflect:below 3px linear-gradient(rgba(255,255,255,0) 85%,#ffffff 150%)}.flexbox{display:-webkit-flex;display:flex;-webkit-flex-flow:row;flex-flow:row}.flexbox.vcenter{display:-webkit-flex;display:flex;-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;height:100%;width:100%}.flexbox.vleft{-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;height:100%;width:100%;text-align:left}.flexbox.vright{-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:flex-end;align-content:flex-end;text-align:right;height:100%;width:100%}.auto-fadein{-moz-transition:opacity 0.6s ease-in 1s;-o-transition:opacity 0.6s ease-in 1s;-webkit-transition:opacity 0.6s ease-in;-webkit-transition-delay:1s;transition:opacity 0.6s ease-in 1s;opacity:0}.slide-area{z-index:1000;position:absolute;left:0;top:0;width:100px;height:600px;left:50%;top:50%;cursor:pointer;margin-top:-300px}#prev-slide-area{margin-left:-550px}#next-slide-area{margin-left:450px}.logoslide img{width:383px;height:92px}.segue{padding:60px 120px}.segue h2{color:#e6e6e6;font-size:60px}.segue h3{color:#e6e6e6;line-height:2.8}.segue hgroup{position:absolute;bottom:225px}.thank-you-slide{background:#4387fd !important;color:#fff}.thank-you-slide h2{font-size:60px;color:inherit}.thank-you-slide h3{font-size:52px;color:inherit;text-align:right}.thank-you-slide article>p{margin-top:2em;font-size:20pt}.thank-you-slide>p{position:absolute;bottom:80px;font-size:24pt;line-height:1.3em}aside.gdbar{height:97px;width:215px;position:absolute;left:-1px;top:125px;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0;border-radius:0 10px 10px 0;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U2ZTZlNiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U2ZTZlNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==') no-repeat;background:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e6e6e6),color-stop(100%, #e6e6e6)) no-repeat;background:-moz-linear-gradient(left, #e6e6e6,#e6e6e6) no-repeat;background:-webkit-linear-gradient(left, #e6e6e6,#e6e6e6) no-repeat;background:linear-gradient(to right, #e6e6e6,#e6e6e6) no-repeat;-moz-background-size:0% 100%;-o-background-size:0% 100%;-webkit-background-size:0% 100%;background-size:0% 100%;-moz-transition:all 0.5s ease-out 0.5s;-o-transition:all 0.5s ease-out 0.5s;-webkit-transition:all 0.5s ease-out;-webkit-transition-delay:0.5s;transition:all 0.5s ease-out 0.5s}aside.gdbar.right{right:0;left:-moz-initial;left:initial;top:204px;-moz-transform:rotateZ(180deg);-ms-transform:rotateZ(180deg);-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}aside.gdbar.right img{-moz-transform:rotateZ(180deg);-ms-transform:rotateZ(180deg);-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}aside.gdbar.bottom{top:-moz-initial;top:initial;bottom:60px}aside.gdbar img{width:85px;height:85px;position:absolute;right:0;margin:8px 15px}.title-slide hgroup{bottom:100px}.title-slide hgroup h1{font-size:65px;line-height:1.4;letter-spacing:-3px;color:#515151}.title-slide hgroup h2{font-size:34px;color:#a9a9a9;font-weight:inherit}.title-slide hgroup p{font-size:20px;color:#797979;line-height:1.3;margin-top:2em}.quote{color:#e6e6e6}.quote .author{font-size:24px;position:absolute;bottom:80px;line-height:1.4}.overview.popup .note{display:none !important}.overview slides slide{display:block;cursor:pointer;opacity:0.5;pointer-events:auto !important;width:1100px}.overview slides slide.backdrop{display:none !important}.overview slides slide.far-past,.overview slides slide.past,.overview slides slide.next,.overview slides slide.far-next,.overview slides slide.far-past{opacity:0.5 !important;display:block !important}.overview slides slide.current{opacity:1 !important}.overview .slide-area{display:none}slide[data-transition=\"zoomout\"].past,slide[data-transition=\"zoomin\"].next{-moz-transform:scale(1.2);-ms-transform:scale(1.2);-webkit-transform:scale(1.2);transform:scale(1.2)}slide[data-transition=\"zoomin\"].past,slide[data-transition=\"zoomout\"].next{-moz-transform:scale(0.8);-ms-transform:scale(0.8);-webkit-transform:scale(0.8);transform:scale(0.8)}slide[data-transition=\"horizontal\"].current{-moz-transform-origin:20% 80% 50%;-ms-transform-origin:20% 80% 50%;-webkit-transform-origin:20% 80% 50%;transform-origin:20% 80% 50%}slide[data-transition=\"horizontal\"].next,slide[data-transition=\"horizontal\"].past{-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg);-webkit-transform:rotate(-30deg);transform:rotate(-30deg)}slide[data-transition=\"horizontal\"].next{left:450px}slide[data-transition=\"horizontal\"].past{left:-450px}slides.layout-widescreen>slide[data-transition=\"horizontal\"].next{left:550px}slides.layout-widescreen>slide[data-transition=\"horizontal\"].past{left:-550px}slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform-origin:50% 50% -450px 50%;-ms-transform-origin:50% 50% -450px 50%;-webkit-transform-origin:50% 50% -450px 50%;transform-origin:50% 50% -450px 50%}.layout-widescreen slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-origin:50% 50% -550px 50%;-ms-transform-origin:50% 50% -550px 50%;-webkit-transform-origin:50% 50% -550px 50%;transform-origin:50% 50% -550px 50%}slide[data-transition=\"horizontal3d\"].next{-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}slide[data-transition=\"horizontal3d\"].past{-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}slide[data-transition=\"vertical3d\"].next{top:300px;-moz-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);-ms-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);-webkit-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0)}slide[data-transition=\"vertical3d\"].past{-moz-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);-ms-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);-webkit-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);top:-300px}slide[data-transition=\"cards\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform-origin:0 100% 0 50%;-ms-transform-origin:0 100% 0 50%;-webkit-transform-origin:0 100% 0 50%;transform-origin:0 100% 0 50%}slide[data-transition=\"cards\"].next{-moz-transform:translate3d(50px, 0, -100px);-ms-transform:translate3d(50px, 0, -100px);-webkit-transform:translate3d(50px, 0, -100px);transform:translate3d(50px, 0, -100px);opacity:0}slide[data-transition=\"cards\"].past{-moz-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);-ms-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);-webkit-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);opacity:0}slide.pagedown[data-transition=\"glue\"].current{-webkit-animation:moveFromRight 0.6s ease both;-moz-animation:moveFromRight 0.6s ease both;-ms-animation:moveFromRight 0.6s ease both;-o-animation:moveFromRight 0.6s ease both;animation:moveFromRight 0.6s ease both;-webkit-animation-delay:0.3s;-moz-animation-delay:0.3s;-ms-animation-delay:0.3s;-o-animation-delay:0.3s;animation-delay:0.3s;z-index:999}slide.pagedown[data-transition=\"glue\"].next{-webkit-transform-origin:0 50%;-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-o-transform-origin:0 50%;transform-origin:0 50%;-webkit-animation:rotateRightSideFirst 0.8s both ease-in;-moz-animation:rotateRightSideFirst 0.8s both ease-in;-ms-animation:rotateRightSideFirst 0.8s both ease-in;-o-animation:rotateRightSideFirst 0.8s both ease-in;animation:rotateRightSideFirst 0.8s both ease-in;opacity:1}slide.pagedown[data-transition=\"glue\"].past{-webkit-transform-origin:100% 50%;-moz-transform-origin:100% 50%;-ms-transform-origin:100% 50%;-o-transform-origin:100% 50%;transform-origin:100% 50%}slide.pageup[data-transition=\"glue\"].current{-webkit-animation:moveFromLeft 0.6s ease both;-moz-animation:moveFromLeft 0.6s ease both;-ms-animation:moveFromLeft 0.6s ease both;-o-animation:moveFromLeft 0.6s ease both;animation:moveFromLeft 0.6s ease both;-webkit-animation-delay:0.3s;-moz-animation-delay:0.3s;-ms-animation-delay:0.3s;-o-animation-delay:0.3s;animation-delay:0.3s;z-index:999}slide.pageup[data-transition=\"glue\"].next{-webkit-transform-origin:0 50%;-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-o-transform-origin:0 50%;transform-origin:0 50%}slide.pageup[data-transition=\"glue\"].past{-webkit-transform-origin:100% 50%;-moz-transform-origin:100% 50%;-ms-transform-origin:100% 50%;-o-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-animation:rotateLeftSideFirst 0.8s both ease-in;-moz-animation:rotateLeftSideFirst 0.8s both ease-in;-ms-animation:rotateLeftSideFirst 0.8s both ease-in;-o-animation:rotateLeftSideFirst 0.8s both ease-in;animation:rotateLeftSideFirst 0.8s both ease-in;opacity:1}slide.pagedown[data-transition=\"kontext\"]{-moz-transform:translateZ(-100px);-ms-transform:translateZ(-100px);-webkit-transform:translateZ(-100px);transform:translateZ(-100px)}slide.pagedown[data-transition=\"kontext\"].current{-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:show-right 1s forwards ease;-moz-animation:show-right 1s forwards ease;-ms-animation:show-right 1s forwards ease;-o-animation:show-right 1s forwards ease;animation:show-right 1s forwards ease;z-index:999}slide.pagedown[data-transition=\"kontext\"].past{-webkit-animation:hide-right 1s forwards ease;-moz-animation:hide-right 1s forwards ease;-ms-animation:hide-right 1s forwards ease;-o-animation:hide-right 1s forwards ease;animation:hide-right 1s forwards ease;opacity:1;z-index:99}slide.pageup[data-transition=\"kontext\"].current{-webkit-animation:show-left 1s forwards ease;-moz-animation:show-left 1s forwards ease;-ms-animation:show-left 1s forwards ease;-o-animation:show-left 1s forwards ease;animation:show-left 1s forwards ease;-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}slide.pageup[data-transition=\"kontext\"].next{-webkit-animation:hide-left 1s forwards ease;-moz-animation:hide-left 1s forwards ease;-ms-animation:hide-left 1s forwards ease;-o-animation:hide-left 1s forwards ease;animation:hide-left 1s forwards ease;opacity:1;z-index:99}slide[data-transition=\"newspaper\"].current{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:rotateInNewspaper 0.5s both ease-out;-moz-animation:rotateInNewspaper 0.5s both ease-out;-ms-animation:rotateInNewspaper 0.5s both ease-out;-o-animation:rotateInNewspaper 0.5s both ease-out;animation:rotateInNewspaper 0.5s both ease-out;-webkit-animation-delay:0.5s;-moz-animation-delay:0.5s;-ms-animation-delay:0.5s;-o-animation-delay:0.5s;animation-delay:0.5s;z-index:999}slide[data-transition=\"newspaper\"].past{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:rotateOutNewspaper 0.5s both ease-out;-moz-animation:rotateOutNewspaper 0.5s both ease-out;-ms-animation:rotateOutNewspaper 0.5s both ease-out;-o-animation:rotateOutNewspaper 0.5s both ease-out;animation:rotateOutNewspaper 0.5s both ease-out;opacity:1;z-index:99}slide[data-transition=\"newspaper\"].next{z-index:99}slide.pagedown[data-transition=\"move\"]{z-index:99}slide.pagedown[data-transition=\"move\"].current{-webkit-animation:moveFromRight 0.6s ease both;-moz-animation:moveFromRight 0.6s ease both;-ms-animation:moveFromRight 0.6s ease both;-o-animation:moveFromRight 0.6s ease both;animation:moveFromRight 0.6s ease both;z-index:999}slide.pagedown[data-transition=\"move\"].past{-webkit-animation:moveToLeft 0.7s ease-in-out both;-moz-animation:moveToLeft 0.7s ease-in-out both;-ms-animation:moveToLeft 0.7s ease-in-out both;-o-animation:moveToLeft 0.7s ease-in-out both;animation:moveToLeft 0.7s ease-in-out both;opacity:1;z-index:999}slide.pageup[data-transition=\"move\"].current{-webkit-animation:moveFromLeft 0.6s ease both;-moz-animation:moveFromLeft 0.6s ease both;-ms-animation:moveFromLeft 0.6s ease both;-o-animation:moveFromLeft 0.6s ease both;animation:moveFromLeft 0.6s ease both;z-index:999}slide.pageup[data-transition=\"move\"].next{-webkit-animation:moveToRight 0.7s ease-in-out both;-moz-animation:moveToRight 0.7s ease-in-out both;-ms-animation:moveToRight 0.7s ease-in-out both;-o-animation:moveToRight 0.7s ease-in-out both;animation:moveToRight 0.7s ease-in-out both;opacity:1;z-index:99}slide.pagedown[data-transition=\"stick\"],slide.pageup[data-transition=\"stick\"]{-webkit-perspective:1600px;-moz-perspective:1600px;-ms-perspective:1600px;-o-perspective:1600px;perspective:1600px;opacity:0;z-index:999}slide.pagedown[data-transition=\"stick\"].current{z-index:1001;opacity:1;-webkit-animation:slideInFromBottomDelayed 0.8s forwards;-moz-animation:slideInFromBottomDelayed 0.8s forwards;-ms-animation:slideInFromBottomDelayed 0.8s forwards;-o-animation:slideInFromBottomDelayed 0.8s forwards;animation:slideInFromBottomDelayed 0.8s forwards}slide.pagedown[data-transition=\"stick\"].past{opacity:0;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;-o-transform-origin:50% 0;transform-origin:50% 0;-webkit-animation:rotateBottomSideOut 0.8s forwards ease-in;-moz-animation:rotateBottomSideOut 0.8s forwards ease-in;-ms-animation:rotateBottomSideOut 0.8s forwards ease-in;-o-animation:rotateBottomSideOut 0.8s forwards ease-in;animation:rotateBottomSideOut 0.8s forwards ease-in}slide.pageup[data-transition=\"stick\"].current{opacity:1;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;-o-transform-origin:50% 0;transform-origin:50% 0;-webkit-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;-moz-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;-ms-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;-o-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in}slide.pageup[data-transition=\"stick\"].next{opacity:1;-webkit-animation:slideOutToBottom 0.8s forwards;-moz-animation:slideOutToBottom 0.8s forwards;-ms-animation:slideOutToBottom 0.8s forwards;-o-animation:slideOutToBottom 0.8s forwards;animation:slideOutToBottom 0.8s forwards}slide[data-transition=\"vkontext\"]{-webkit-perspective:1000px;-moz-perspective:1000px;-ms-perspective:1000px;-o-perspective:1000px;perspective:1000px}slide.pagedown[data-transition=\"vkontext\"].current{-webkit-animation:showRight 1s forwards;-moz-animation:showRight 1s forwards;-ms-animation:showRight 1s forwards;-o-animation:showRight 1s forwards;animation:showRight 1s forwards}slide.pagedown[data-transition=\"vkontext\"].past{-webkit-animation:hideLeft 1s forwards;-moz-animation:hideLeft 1s forwards;-ms-animation:hideLeft 1s forwards;-o-animation:hideLeft 1s forwards;animation:hideLeft 1s forwards}slide.pageup[data-transition=\"vkontext\"].current{-webkit-animation:showLeft 1s forwards;-moz-animation:showLeft 1s forwards;-ms-animation:showLeft 1s forwards;-o-animation:showLeft 1s forwards;animation:showLeft 1s forwards}slide.pageup[data-transition=\"vkontext\"].next{-webkit-animation:hideRight 1s forwards;-moz-animation:hideRight 1s forwards;-ms-animation:hideRight 1s forwards;-o-animation:hideRight 1s forwards;animation:hideRight 1s forwards}slide.pagedown[data-transition=\"earthquake\"].current{-webkit-animation:pushFromTop 1s 0.1s forwards;-moz-animation:pushFromTop 1s 0.1s forwards;-ms-animation:pushFromTop 1s 0.1s forwards;-o-animation:pushFromTop 1s 0.1s forwards;animation:pushFromTop 1s 0.1s forwards;opacity:1}slide.pagedown[data-transition=\"earthquake\"].past{opacity:1;-webkit-animation:shakeSlideBottom 1s 0.1s forwards;-moz-animation:shakeSlideBottom 1s 0.1s forwards;-ms-animation:shakeSlideBottom 1s 0.1s forwards;-o-animation:shakeSlideBottom 1s 0.1s forwards;animation:shakeSlideBottom 1s 0.1s forwards}slide.pageup[data-transition=\"earthquake\"].current{opacity:1;-webkit-animation:pushFromBottom 1s 0.1s forwards;-moz-animation:pushFromBottom 1s 0.1s forwards;-ms-animation:pushFromBottom 1s 0.1s forwards;-o-animation:pushFromBottom 1s 0.1s forwards;animation:pushFromBottom 1s 0.1s forwards}slide.pageup[data-transition=\"earthquake\"].next{opacity:1;-webkit-animation:shakeSlideTop 1s 0.1s forwards;-moz-animation:shakeSlideTop 1s 0.1s forwards;-ms-animation:shakeSlideTop 1s 0.1s forwards;-o-animation:shakeSlideTop 1s 0.1s forwards;animation:shakeSlideTop 1s 0.1s forwards}slide[data-transition=\"earthquake\"]::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;pointer-events:none;background-color:rgba(0,0,0,0.3);transition:opacity 0.5s}slide[data-transition=\"earthquake\"].next::after,slide[data-transition=\"earthquake\"].past::after{opacity:1}slide.pagedown[data-transition=\"circle\"],slide.pageup[data-transition=\"circle\"]{-webkit-transform-origin:50% 400%;transform-origin:50% 400%}slide.pagedown[data-transition=\"circle\"]::after,slide.pageup[data-transition=\"circle\"]::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;pointer-events:none;background-color:#000;-webkit-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);-moz-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);-ms-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);-o-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"circle\"].current{opacity:1;-webkit-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"circle\"].past{opacity:1;-webkit-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"circle\"].current{opacity:1;-webkit-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"circle\"].next{opacity:1;-webkit-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide[data-transition=\"circle\"].next::after,slide[data-transition=\"circle\"].past::after{opacity:1}slide.pagedown[data-transition=\"pulse\"],slide.pageup[data-transition=\"pulse\"]{opacity:0}slide.pagedown[data-transition=\"pulse\"].past,slide.pageup[data-transition=\"pulse\"].next{-webkit-animation:scaleUpFadeOut 0.8s forwards ease-in;-moz-animation:scaleUpFadeOut 0.8s forwards ease-in;-ms-animation:scaleUpFadeOut 0.8s forwards ease-in;-o-animation:scaleUpFadeOut 0.8s forwards ease-in;animation:scaleUpFadeOut 0.8s forwards ease-in}slide.pageup[data-transition=\"pulse\"].current,slide.pagedown[data-transition=\"pulse\"].current{-webkit-animation:scaleDownFadeIn 0.8s forwards ease-out;-moz-animation:scaleDownFadeIn 0.8s forwards ease-out;-ms-animation:scaleDownFadeIn 0.8s forwards ease-out;-o-animation:scaleDownFadeIn 0.8s forwards ease-out;animation:scaleDownFadeIn 0.8s forwards ease-out}slide.pagedown[data-transition=\"slide\"].past{-webkit-animation:rotateSlideOutToLeft 1s both ease;-moz-animation:rotateSlideOutToLeft 1s both ease;-ms-animation:rotateSlideOutToLeft 1s both ease;-o-animation:rotateSlideOutToLeft 1s both ease;animation:rotateSlideOutToLeft 1s both ease}slide.pagedown[data-transition=\"slide\"].current{-webkit-animation:rotateSlideInFromRight 1s both ease;-moz-animation:rotateSlideInFromRight 1s both ease;-ms-animation:rotateSlideInFromRight 1s both ease;-o-animation:rotateSlideInFromRight 1s both ease;animation:rotateSlideInFromRight 1s both ease}slide.pageup[data-transition=\"slide\"].current{-webkit-animation:rotateSlideInFromLeft 1s both ease;-moz-animation:rotateSlideInFromLeft 1s both ease;-ms-animation:rotateSlideInFromLeft 1s both ease;-o-animation:rotateSlideInFromLeft 1s both ease;animation:rotateSlideInFromLeft 1s both ease}slide.pageup[data-transition=\"slide\"].next{-webkit-animation:rotateSlideOutToRight 1s both ease;-moz-animation:rotateSlideOutToRight 1s both ease;-ms-animation:rotateSlideOutToRight 1s both ease;-o-animation:rotateSlideOutToRight 1s both ease;animation:rotateSlideOutToRight 1s both ease}slide.pagedown[data-transition=\"slide2\"].past{-webkit-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"slide2\"].current{opacity:1;-webkit-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"slide2\"].next{-webkit-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"slide2\"].current{opacity:1;-webkit-animation:slideInFromLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideInFromLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"slide3\"].past{-webkit-animation:slideOutScaleLeft 1.2s forwards;-moz-animation:slideOutScaleLeft 1.2s forwards;-ms-animation:slideOutScaleLeft 1.2s forwards;-o-animation:slideOutScaleLeft 1.2s forwards;animation:slideOutScaleLeft 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide.pagedown[data-transition=\"slide3\"].current{opacity:1;-webkit-animation:slideInFromRight 1.2s forwards;-moz-animation:slideInFromRight 1.2s forwards;-ms-animation:slideInFromRight 1.2s forwards;-o-animation:slideInFromRight 1.2s forwards;animation:slideInFromRight 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide.pageup[data-transition=\"slide3\"].current{opacity:1;-webkit-animation:slideInFromLeft 1.2s forwards;-moz-animation:slideInFromLeft 1.2s forwards;-ms-animation:slideInFromLeft 1.2s forwards;-o-animation:slideInFromLeft 1.2s forwards;animation:slideInFromLeft 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide.pageup[data-transition=\"slide3\"].next{opacity:1;-webkit-animation:slideOutScaleRight 1.2s forwards;-moz-animation:slideOutScaleRight 1.2s forwards;-ms-animation:slideOutScaleRight 1.2s forwards;-o-animation:slideOutScaleRight 1.2s forwards;animation:slideOutScaleRight 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide[data-transition=\"cover-diamond\"]{-moz-transition:opacity 0s,-webkit-clip-path 1s;-o-transition:opacity 0s,-webkit-clip-path 1s;-webkit-transition:opacity 0s,-webkit-clip-path 1s;transition:opacity 0s,-webkit-clip-path 1s;opacity:0;-webkit-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);-moz-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);-ms-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);-o-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%)}slide[data-transition=\"cover-diamond\"].current{opacity:1;-webkit-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);-moz-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);-ms-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);-o-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%)}slide[data-transition=\"cover-diamond\"].past{-moz-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;-o-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;-webkit-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s}slide[data-transition=\"cover-circle\"]{opacity:0;-moz-transition:opacity 0,-webkit-clip-path 1s;-o-transition:opacity 0,-webkit-clip-path 1s;-webkit-transition:opacity 0,-webkit-clip-path 1s;transition:opacity 0,-webkit-clip-path 1s;-webkit-clip-path:circle(5% at 50% 50%);-moz-clip-path:circle(5% at 50% 50%);-ms-clip-path:circle(5% at 50% 50%);-o-clip-path:circle(5% at 50% 50%);clip-path:circle(5% at 50% 50%)}slide[data-transition=\"cover-circle\"].current{opacity:1;-webkit-clip-path:circle(80% at 50% 50%);-moz-clip-path:circle(80% at 50% 50%);-ms-clip-path:circle(80% at 50% 50%);-o-clip-path:circle(80% at 50% 50%);clip-path:circle(80% at 50% 50%)}slide[data-transition=\"cover-circle\"].past{opacity:0;-moz-transition:opacity,0 ease-in;-o-transition:opacity,0 ease-in;-webkit-transition:opacity,0 ease-in;transition:opacity,0 ease-in}@-webkit-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-moz-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-ms-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-o-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-webkit-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-moz-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-ms-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-o-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-webkit-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-moz-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-ms-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-o-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-webkit-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-webkit-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-moz-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-ms-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-o-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-webkit-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-moz-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-ms-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-o-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-webkit-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-moz-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-ms-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-o-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-webkit-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-moz-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-ms-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-o-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-webkit-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-moz-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-ms-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-o-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-webkit-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-moz-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-ms-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-o-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-webkit-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-moz-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-ms-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-o-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-webkit-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-moz-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-ms-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-o-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-webkit-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-moz-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-ms-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-o-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-webkit-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-moz-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-ms-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-o-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-webkit-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-moz-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-ms-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-o-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-webkit-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-moz-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-ms-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-o-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-webkit-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-moz-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-ms-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-o-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-webkit-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes fade{to{opacity:0.3}}@-moz-keyframes fade{to{opacity:0.3}}@-ms-keyframes fade{to{opacity:0.3}}@-o-keyframes fade{to{opacity:0.3}}@keyframes fade{to{opacity:0.3}}@-webkit-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-moz-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-ms-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-o-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-webkit-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-moz-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-ms-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-o-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-webkit-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-moz-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-ms-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-o-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-webkit-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-moz-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-ms-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-o-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-webkit-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-moz-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-ms-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-o-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-webkit-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-moz-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-ms-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-o-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-webkit-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-moz-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-ms-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-o-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-webkit-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-moz-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-ms-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-o-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-webkit-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-moz-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-ms-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-o-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-webkit-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-moz-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-ms-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-o-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-webkit-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-moz-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-ms-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-o-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-webkit-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-moz-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-ms-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-o-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-webkit-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-moz-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-ms-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-o-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-webkit-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-moz-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-ms-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-o-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-webkit-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-moz-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-ms-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-o-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-webkit-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-moz-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-ms-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-o-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-webkit-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-moz-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-ms-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-o-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-webkit-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-moz-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-ms-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-o-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-webkit-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-moz-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-ms-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-o-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-webkit-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-moz-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-ms-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-o-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-webkit-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-moz-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-ms-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-o-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-webkit-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-moz-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-ms-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-o-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-webkit-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-moz-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-ms-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-o-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-webkit-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-moz-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-ms-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-o-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-webkit-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-moz-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-ms-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-o-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-webkit-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-moz-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-ms-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-o-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-moz-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-ms-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-o-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-moz-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-ms-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-o-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-moz-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-ms-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-o-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-moz-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-ms-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-o-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-moz-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-ms-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-o-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-moz-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-ms-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-o-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-moz-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-ms-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-o-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-moz-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-ms-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-o-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-webkit-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-moz-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-ms-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-o-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-webkit-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-moz-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-ms-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-o-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-webkit-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-moz-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-ms-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-o-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-webkit-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-moz-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-ms-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-o-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-webkit-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-moz-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-ms-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-o-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-webkit-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-moz-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-ms-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-o-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-webkit-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-moz-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-ms-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-o-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-webkit-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-moz-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-ms-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-o-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-moz-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-ms-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-o-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-webkit-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-moz-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-ms-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-o-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-moz-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-ms-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-o-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-webkit-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-moz-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-ms-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-o-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-moz-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-ms-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-o-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-webkit-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-moz-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-ms-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-o-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-moz-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-ms-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-o-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-webkit-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-moz-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-ms-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-o-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-webkit-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-moz-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-ms-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-o-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-webkit-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-moz-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-ms-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-o-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-webkit-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-moz-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-ms-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-o-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-webkit-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-moz-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-ms-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-o-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-webkit-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-moz-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-ms-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-o-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-webkit-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-moz-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-ms-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-o-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-webkit-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-moz-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-ms-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-o-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-webkit-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-moz-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-ms-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-o-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-webkit-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-moz-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-ms-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-o-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-webkit-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-moz-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-ms-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-o-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-webkit-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-moz-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-ms-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-o-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-webkit-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-moz-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-ms-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-o-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-webkit-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-moz-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-ms-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-o-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-moz-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-ms-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-o-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-moz-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-ms-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-o-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-moz-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-ms-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-o-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-moz-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-ms-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-o-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-webkit-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-moz-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-ms-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-o-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-webkit-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-moz-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-ms-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-o-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-webkit-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}\n"
  },
  {
    "path": "ppt/css/pdf.css",
    "content": "*{-webkit-print-color-adjust:exact}body{margin:0 auto !important;border:0;padding:0;float:none !important;overflow:visible}html{width:100%;height:100%;overflow:visible}slides>slide{display:block !important;position:relative;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important;width:100%;height:100%;page-break-after:always;top:auto !important;left:auto !important;margin-top:0 !important;margin-left:0 !important;opacity:1 !important}slides>slide.far-past,slides>slide.past,slides>slide.next,slides>slide.far-next,slides>slide.far-past,slides>slide.current{opacity:1 !important;display:block !important}slides>slide .build>*{-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none}slides>slide .build .to-build,slides>slide .build .build-fade{opacity:1}slides>slide .auto-fadein{opacity:1 !important}slides>slide.backdrop{display:none !important}slides>slide table.rows{border-right:0}slides>slide[hidden]{display:none !important}.slide-area{display:none}pre,code{font-family:'Source Code Pro',monospace !important}slides>slide{-webkit-clip-path:none !important;opacity:1 !important;visibility:visible !important;padding:0}slides>slide .slide-wrapper,slides>slide.past .slide-wrapper,slides>slide.far-past .slide-wrapper,slides>slide.far-next .slide-wrapper,slides>slide.next .slide-wrapper{opacity:1 !important;visibility:visible !important;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;position:static;width:1100px !important;left:0;top:0;right:0;bottom:0;margin:0 auto 10pt !important;overflow:visible;-moz-perspective:none !important;-webkit-perspective:none !important;perspective:none !important;-moz-perspective-origin:50% 50% !important;-webkit-perspective-origin:50% 50% !important;perspective-origin:50% 50% !important;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}slides>slide .slide-wrapper .build-fade,slides>slide .slide-wrapper .to-buid,slides>slide .slide-wrapper .building,slides>slide.past .slide-wrapper .build-fade,slides>slide.past .slide-wrapper .to-buid,slides>slide.past .slide-wrapper .building,slides>slide.far-past .slide-wrapper .build-fade,slides>slide.far-past .slide-wrapper .to-buid,slides>slide.far-past .slide-wrapper .building,slides>slide.far-next .slide-wrapper .build-fade,slides>slide.far-next .slide-wrapper .to-buid,slides>slide.far-next .slide-wrapper .building,slides>slide.next .slide-wrapper .build-fade,slides>slide.next .slide-wrapper .to-buid,slides>slide.next .slide-wrapper .building{opacity:1 !important;visibility:visible !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}slides>slide .slide-wrapper *,slides>slide.past .slide-wrapper *,slides>slide.far-past .slide-wrapper *,slides>slide.far-next .slide-wrapper *,slides>slide.next .slide-wrapper *{opacity:1 !important;visibility:visible !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}#_buttons,#drawBoard,.progress,#tip{display:none !important}\n"
  },
  {
    "path": "ppt/css/phone.css",
    "content": "slides>slide{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;-webkit-transition:none !important;transition:none !important;-moz-transform-origin:0 0 !important;-ms-transform-origin:0 0 !important;-webkit-transform-origin:0 0 !important;transform-origin:0 0 !important}slides>slide[data-transition].current,slides>slide[data-transition].next,slides>slide[data-transition].past{-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-animation-name:none;animation-name:none}\n"
  },
  {
    "path": "ppt/css/theme.blue.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#f47f40;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #086fd1,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #086fd1,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:#000;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #2e87d3;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px white solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#086fd1}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#086fd1}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#4fff00}slides>slide .slide-wrapper blockquote{position:relative;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/css/theme.dark.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#fa5b04;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #232323,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #232323,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:black;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#232323}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#232323}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00ced1}slides>slide .slide-wrapper blockquote{position:relative;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/css/theme.green.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#ff8c78;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #699b98,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #699b98,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:#f8f7f7;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#699b98}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#699b98}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00ced1}slides>slide .slide-wrapper blockquote{position:relative;background-color:#ace2d2;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/css/theme.light.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#fa5b04;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#000;text-shadow:1px 2px 0px #e8efee,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #e8efee,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:#232323;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#232323;letter-spacing:2px;background-color:#e8efee}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#e8efee}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00ced1}slides>slide .slide-wrapper blockquote{position:relative;background-color:#ace2d2;border-left:0 none;color:#232323;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#232323;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/css/theme.moon.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#f9d905;background-color:transparent;border-bottom:0}a:hover{color:#f5be78;background-color:transparent}h1,h2,h3{color:#e8f0f3;text-shadow:1px 2px 0px #152e4f,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #152e4f,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:black;border-bottom:0 none;-moz-box-shadow:1px 1px 10px #000;-webkit-box-shadow:1px 1px 10px #000;box-shadow:1px 1px 10px #000}table thead th{background-color:#e6e6e6}table tr{background-color:white}table tr:nth-child(even){background-color:#e6e6e6}table td.highlight{color:#468847;background-color:#dff0d8 !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#e8f0f3;letter-spacing:2px;background-color:#152e4f}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#152e4f}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#16d5b5}slides>slide .slide-wrapper blockquote{position:relative;background-color:#0b6c96;border-left:0 none;color:#e5dcdc;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#999;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/express.html",
    "content": "<!--\n    Powered By nodePPT - This is probably the best web presentation tool so far!\n    version: 1.2.3\n    site: https://github.com/ksky521/nodePPT\n-->\n<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>express介绍及实战 - By 王兴龙</title>\n    <link rel=\"stylesheet\" media=\"all\" href=\"./css/nodeppt.css\">\n    <link rel=\"stylesheet\" media=\"only screen and (max-device-width: 480px)\" href=\"./css/phone.css\">\n    <link rel=\"stylesheet\" media=\"print\" href=\"./css/pdf.css\">\n    <link rel=\"stylesheet\" href=\"./js/highlight/styles/monokai_sublime.css\">\n    <link rel=\"stylesheet\" href=\"./css/font-awesome.css\">\n</head>\n<body>\n<div class=\"slides\">\n    <slides id=\"container\">\n        <slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<style type=\"text/css\">\n    .flex {\n        display:box;\n        display: -webkit-box;\n    }\n\n    .auto-flex {\n        box-flex:1;\n        flex:1;\n        width: 50%;\n        margin-right: 20px;\n    }\n\n    .last-fixed {\n        margin-right: 0px;\n    }\n\n</style><h1>express介绍及实战</h1>\n<p><small>2015年09月11日 王兴龙</small></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express介绍</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>TJ Holowaychuk</li>\n<li>Connect与Express</li>\n<li>SSH与MEAN.js</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express的安装</h1>\n\n</hgroup><article>\n\n<blockquote>\n<p>$ npm install express</p>\n<p>$ npm install -g express-generator</p>\n</blockquote>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express的入口</h1>\n\n</hgroup><article>\n\n<div class=\"flex\">\n    <div class=\"auto-flex\">\n    <pre><code class=\"javascript\">\nvar express = require('express')\nvar app = express()\napp.get('/', function (req, res) {\n      res.send('Hello World')\n})\napp.listen(3000)\n    </code></pre>\n    </div>    <div  class=\"auto-flex last-fixed\">\n    <pre><code class=\"javascript\">\nvar http = require(&#39;http&#39;);\nhttp.createServer(function(req, res) {\n     res.write(&#39;hello world&#39;);\n     res.end();\n}).listen(8000);\n    </code></pre>\n    </div>\n</div>\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>理解app</h1>\n\n</hgroup><article>\n\n<p><a href=\"https://github.com/strongloop/express/blob/master/lib/application.js\" target=\"_blank\">https://github.com/strongloop/express/blob/master/lib/application.js</a></p>\n<pre><code class=\"javascript\">var app = function(req, res, next) {\n  app.handle(req, res, next);\n};\n\napp.listen = function(){\n  var server = http.createServer(this);\n  return server.listen.apply(server, arguments);\n};\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express模板引擎</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>Jade</li>\n<li>Handlebars</li>\n<li>EJS(与UTC一致)</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>中间件</h1>\n<pre><code class=\"javascript\">app.use(&#39;/public&#39;,express.static(__dirname + &#39;/public&#39;));\napp.use(logger());\napp.use(function(req, res, next){\n    console.log(&#39;hello middleware&#39;);\n    next();\n});\napp.get(&#39;/&#39;, function(req, res){\nres.send(&#39;Hello World&#39;);\n});\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<p><img src=\"http://images.cnitblog.com/blog/304265/201312/22104418-e0efc8bc5ffb46e4bc92843a2b3ae3d5.png\" alt=\"\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>URL组成部分</h1>\n\n</hgroup><article>\n\n<table>\n<thead>\n<tr>\n<th style=\"text-align:center\">http://</th>\n<th style=\"text-align:center\">m.sm.cn</th>\n<th style=\"text-align:center\">/s</th>\n<th style=\"text-align:center\">?q=周杰伦</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:center\">协议</td>\n<td style=\"text-align:center\">主机名</td>\n<td  class=\"highlight\" style=\"text-align:center;\">路径</td>\n<td  class=\"highlight\" style=\"text-align:center;\">查询字符串</td>\n</tr>\n</tbody>\n</table>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>路由</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>将请求路由到处理他们的代码去得一种机制</li>\n<li>路由处理器是中间件</li>\n<li>支持正则表达式</li>\n<li>路由参数</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>一个例子</h1>\n\n</hgroup><article>\n\n<pre><code class=\"javascript\">app.get(&#39;staff/:city/:name&#39;, function(req, res){\n    //req.params.city\n})\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>路由组织</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>给路由处理器用命令函数</li>\n<li>按逻辑分组</li>\n<li>路由的命名</li>\n<li>路由参数</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>路由组织例子</h1>\n\n</hgroup><article>\n\n<pre><code class=\"javascript\">//route.js\nmodule.exports = function(app) {\n    app.get(&#39;/&#39;, function(req, res){\n\n    })\n}\n\n//index.js\nrequrie(&#39;./route.js&#39;)(app)\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>自动化渲染视图</h1>\n\n</hgroup><article>\n\n<p>添加一个foo.ejs就可以通过/foo来访问\n场景：适合不需要首屏的静态模板</p>\n<pre><code class=\"javascript\">var autoViews = {};\nvar fs = require(&#39;fs&#39;);\n\napp.use(function(req, res, next) {\n    var path = req.path.toLowerCase();\n    //检查缓存\n    if(autoView[path]) return res.render(autoViews[path])；\n    //不在缓存\n    if(fs.exitsSync(__dirname + &#39;/views&#39; + path + &#39;.ejs&#39;)) {\n        autoViews[path] = path.repalce(/^\\//, &#39;&#39;);\n        reuturn res.render(autoViews[path]);\n    }\n    //没发现到404\n    next();\n})\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>持久化</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>文件持久化</li>\n<li>云持久化</li>\n<li>数据库持久化</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h2>数据库持久化</h2>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>结构化数据库<ul>\n<li>Oracle、MySQL、SQL Server、</li>\n</ul>\n</li>\n<li>NoSQL<ul>\n<li>MongoDB</li>\n<li><a href=\"https://cnodejs.org/topic/504b4924e2b84515770103dd\" target=\"_blank\">https://cnodejs.org/topic/504b4924e2b84515770103dd</a></li>\n</ul>\n</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h2>一些框架</h2>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>mongoose<ul>\n<li><a href=\"https://github.com/Automattic/mongoose\" target=\"_blank\">https://github.com/Automattic/mongoose</a></li>\n</ul>\n</li>\n<li>orm2 <ul>\n<li><a href=\"https://github.com/dresende/node-orm2\" target=\"_blank\">https://github.com/dresende/node-orm2</a></li>\n</ul>\n</li>\n<li>AWS<ul>\n<li><a href=\"https://aws.amazon.com/sdkfornodejs\" target=\"_blank\">https://aws.amazon.com/sdkfornodejs</a></li>\n</ul>\n</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>进程管理:PM2</h1>\n<blockquote>\n<p><a href=\"https://github.com/Unitech/pm2\" target=\"_blank\">https://github.com/Unitech/pm2</a></p>\n</blockquote>\n<p><img src=\"https://github.com/unitech/pm2/raw/master/pres/pm2-list.png\" alt=\"pm2\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>实战：动效平台</h1>\n<h2>https://github.com/mingzhi22/inspiration/tree/master</h2>\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>架构图</h1>\n<p><img src=\"http://ww1.sinaimg.cn/large/8ae515a4jw1evwkb97qvjj20sg0lcdi6.jpg\" alt=\"jiagoutu\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>路由</h1>\n<pre><code class=\"javascript\">// 新建组件页面\napp.get(&#39;/component/create&#39;, ComponentController.renderCreationPage);\n\n// 组件类的路由\napp.post(&#39;/component/create&#39;, multipartMiddleware, ComponentController.create);\n\napp.put(&#39;...&#39;, ...);\napp.delete(&#39;...&#39;, ...);\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>控制器</h1>\n<pre><code class=\"javascript\">create: function(req, res) {\n    var data = req.body,\n        files = req.files;\n    //当组件存储完成、文件上传完成，才响应\n    createComponent(data, files).then(function(data) {\n        //渲染页面\n        //res.render(&#39;index&#39;, data.componentHistory.componentHistoryID);\n        res.send(JSON.stringify(data));\n    }).catch(function(e) {\n        console.error(e);\n        res.redirect(&#39;error&#39;);\n    });\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<pre><code class=\"javascript\">//创建组件、组件项\nfunction createComponent(data, files) {\n    //组件\n    var component = new Component(data.name, data.categoryID, &#39;userid&#39;, data.remarks); //用户ID后期通过session给值\n    //历史版本\n    var componentHistory = new ComponentHistory(component.componentID, data.html, data.js, data.css, &#39;userid&#39;, data.updata); //用户ID后期通过session给值\n\n    //首先保存到数据然，然后再保存到文件中\n    return Promise.all([\n            ComponentDAL.createComponent(component),\n            ComponentHistoryDAL.createComponentHistory(componentHistory),\n            saveFile({\n                files : files,\n                component : component.componentID\n            })\n        ]);\n\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>DAL层</h1>\n<pre><code class=\"javascript\">//创建组件\nfunction createComponent(component) {\n    return new Promise(function(resolve, reject) {\n        ComponentTable.create([component],function(err, data) {\n            if(err) {\n                console.error(err);\n                reject(err);\n            }else {\n                console.debug(&#39;上传组件成功&#39;, JSON.stringify(data));\n                resolve(JSON.stringify(data));\n            }\n        });\n\n    });\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>复杂SQL</h1>\n<pre><code class=\"javascript\">var getComponentHistoryByComponentIDSQL = &#39;SELECT componentHistory.componentHistoryID, componentHistory.html, componentHistory.js, componentHistory.css, component.componentID , component.name, component.remarks FROM (SELECT componentID, name, remarks FROM component WHERE component.componentID = ?) component inner join componentHistory ON componentHistory.componentID = component.componentID ORDER BY componentHistory.createTime DESC LIMIT 1&#39;;\n//找到某一个组件下最新版本的组件历史\nfunction getComponentHistoryByComponentID(componentID) {\n    return new Promise(function(resolve, reject) {\n        db.driver.execQuery(getComponentHistoryByComponentIDSQL,  [componentID], function(err, data) {\n            if(err) {\n                console.error(err);\n                throw err;\n            }else {\n                resolve(data);\n            }\n        });\n    });\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>日志处理:Log4Js</h1>\n<pre><code class=\"javascript\">var log4js = require(&#39;log4js&#39;);\n\nlog4js.configure({\n    appenders: [\n        //控制台输出\n        {\n            type: &#39;console&#39;,\n            category: &quot;console&quot;\n        }\n        ////线上打开，否则没有这个软件会报错\n        //{\n        //    type: &quot;dateFile&quot;,\n        //    filename: &#39;logs/log.log&#39;,\n        //    pattern: &quot;_yyyy-MM-dd&quot;,\n        //    alwaysIncludePattern: false,\n        //    category: &#39;dateFileLog&#39;\n        //}//日期文件格式\n    ],\n    replaceConsole: true,   //替换console.log\n    levels:{\n        dateFileLog: &#39;ERROR&#39;,\n        console : &#39;DEBUG&#39;\n    }\n});\n\nvar dateFileLog = log4js.getLogger(&#39;dateFileLog&#39;);\n\nmodule.exports = function(app) {\n    //页面请求日志,用auto的话,默认级别是WARN\n    app.use(log4js.connectLogger(dateFileLog, {level:dateFileLog.level.ERROR, format:&#39;:method :url&#39;}));\n};\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>效果展示</h1>\n<p><img src=\"http://ww2.sinaimg.cn/large/8ae515a4jw1evwl2nx52bj21kw0x7437.jpg\" alt=\"\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>下一步要做的</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>脚手架</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>拥抱ES6(2015), ES7(2016)</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<h2>Class, Generator ,async</h2>\n<pre><code class=\"javascript\">class Component extend BaseClass {\n    constructor(name) {\n        this.name = name;\n    }\n    getComponentName() {\n    }\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>回顾</h1>\n<p>想实现一个基于mvc的web系统</p>\n<ul class=\"rollIn\">\n<li>templet</li>\n<li>route</li>\n<li>controller</li>\n<li>dal</li>\n<li>model</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Q&amp;A</h1>\n\n</hgroup><article>\n\n\n</article></section></slide>\n        <!--slide class=\"slide thank-you-slide segue nobackground\">\n            <article class=\"flexbox vleft auto-fadein\">\n                <h2>Q &amp; A</h2>\n                <h3>&lt;Thank You!&gt;</h3>\n            </article>\n        </slide-->\n        <slide class=\"slide logoslide dark nobackground\">\n            <article class=\"flexbox vcenter\">\n              <h2 style=\"color: white;\">Powered By nodePPT v1.2.3</h2>\n            </article>\n          </slide>\n        <div class=\"slideTip\" id=\"tip\"></div>\n    </slides>\n</div>\n<canvas id=\"drawBoard\" class=\"draw-board\" width=\"900\" height=\"700\"></canvas>\n<div class=\"progress\"><span id=\"progress\"></span></div>\n<div id=\"_buttons\">\n    <div class=\"_btn-box\" id=\"_btn-box\" style=\"display:none;\">\n        <button class=\"fa fa-arrow-circle-left\" id=\"_btn-prev\"></button>\n        <button class=\"fa fa-arrow-circle-right\" id=\"_btn-next\"></button>\n        <button class=\"fa fa-paint-brush\" id=\"_btn-brush\"></button>\n        <button class=\"fa fa-compress\" id=\"_btn-overview\" data-toggle=\"fa fa-expand\"></button>\n    </div>\n    <button class=\"fa fa-bars\" id=\"_btn-bar\"  data-toggle=\"fa fa-close\"></button>\n</div>\n<script src=\"./js/mixjs/lib/mix.0.3.0.min.js\"></script>\n<script>\nvar base = location.protocol + '//' + location.host;\n\nvar path = location.pathname.split('/').filter(function(v){\n    return !!v;\n});\npath.pop();\npath = path.join('/');\nMixJS.config({\n    baseURL: [ base, path, 'js'].join('/')+'/'\n});\n\n</script>\n<script src=\"./js/mixjs/lib/event/broadcast.js\"></script>\n<script src=\"./js/nodeppt.js\"></script>\n<script>\nSlide.init({\n    containerID: 'container',\n    drawBoardID: 'drawBoard',\n    slideClass: '.slide',\n    buildClass: '.build',\n    progressID: 'progress',\n    transition: 'move',\n    width: 1100,\n    dir: './',\n    \n    //打开下面的注释就开启postMessage方式\n    //访问网址127.0.0.1:8080/ppt/demo#client\n    control:{\n        type: 'postMessage',\n        args:{\n            isControl:  false\n        }\n    },\n    \n    tipID: 'tip'\n});\nMixJS.loadJS('highlight/hljs-0.8.js',function(){\n    hljs.tabReplace = '  ';\n    hljs.initHighlightingOnLoad();\n});\n</script>\n<script src=\"./js/demo.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/demo.css\">\n<script src=\"./js/zoom.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/theme.moon.css\">\n<!--placeholder-->\n</body>\n</html>\n"
  },
  {
    "path": "ppt/js/event/broadcast.js",
    "content": "/**\n * 广播事件处理\n * 状态：稳定\n * \n * 目标: 为了尽可能的减少模块之间业务逻辑的耦合度, 而开发了这个eventbus, 主要用于业务逻辑的事件传递\n * 使用规范: 每个js模块尽可能通过事件去通信, 减少模块之间的直接调用和依赖(耦合)\n * 使用示例：\n *     //触发\n *     MixJS.event.broadcast.fire('abc',{abc:1}) \n *     //订阅\n *     MixJS.event.broadcast.on('abc',function(a){\n *         console.log(a);\n *     }, scope);\n    \n * @return {[type]} \n * @author  theowang\n * $Id: broadcast.js 65871 2012-11-05 01:51:42Z theowang $\n */\nMixJS.define('event/broadcast', function($) {\n    var _cache = {};\n    var broadcast = {\n\n        /**\n         * 派发\n         * @param  {[type]} type 事件类型\n         * @param  {[type]} data 回调数据\n         * @return {[type]}      [description]\n         */\n        fire: function(type, data) {\n            var listeners = _cache[type],\n                len = 0;\n            if (!$.isUndefined(listeners)) {\n                var args = [].slice.call(arguments, 0);\n                args = args.length > 2 ? args.splice(2, args.length - 1) : [];\n                args = [data].concat(args);\n\n                len = listeners.length;\n                for (var i = 0; i < len; i++) {\n                    var listener = listeners[i];\n                    if (listener && listener.callback) {\n                        args = args.concat(listener.args);\n                        listener.callback.apply(listener.scope, args);\n                    }\n                }\n            }\n            return this;\n        },\n        /**\n         * 订阅广播事件\n         * @param  {[type]}   types     事件类型，支持,分隔符\n         * @param  {Function} callback 回调函数\n         * @param  {[type]}   scope    回调函数上下文\n         * @return {[type]}            this\n         */\n        on: function(types, callback, scope) {\n            types = types || [];\n            var args = [].slice.call(arguments);\n\n            if ($.isString(types)) {\n                types = types.split(',');\n            }\n            var len = types.length;\n            if (len === 0) {\n                return this;\n            }\n            args = args.length > 3 ? args.splice(3, args.length - 1) : [];\n            for (var i = 0; i < len; i++) {\n                var type = types[i];\n                _cache[type] = _cache[type] || [];\n                _cache[type].push({\n                    callback: callback,\n                    scope: scope,\n                    args: args\n                });\n            }\n            return this;\n        },\n        /**\n         * 退订\n         * @param  {[type]}   type     [description]\n         * @param  {Function} callback 假如传入则移出传入的监控事件，否则移出全部\n         * @return {[type]}            [description]\n         */\n        un: function(type, callback, scope) {\n            var listeners = _cache[type];\n            if (!listeners) {\n                return this;\n            }\n            if (callback) {\n                var len = listeners.length,\n                    tmp = [];\n\n                for (var i = 0; i < len; i++) {\n                    var listener = listeners[i];\n                    if (listener.callback == callback && listener.scope == scope) {} else {\n                        tmp.push(listener);\n                    }\n                }\n                listeners = tmp;\n            } else {\n                listeners.length = 0;\n            }\n            return this;\n        },\n\n\n        removeAll: function() {\n            _cache = {};\n            return this;\n        }\n    };\n    return broadcast;\n});"
  },
  {
    "path": "ppt/js/highlight/default.css",
    "content": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\npre code {\n  display: block; padding: 0.5em;\n  /*background: #F0F0F0;*/\n}\n\npre code,\npre .ruby .subst,\npre .tag .title,\npre .lisp .title {\n  color: black;\n}\n\npre .string,\npre .title,\npre .constant,\npre .parent,\npre .tag .value,\npre .rules .value,\npre .rules .value .number,\npre .preprocessor,\npre .ruby .symbol,\npre .ruby .symbol .string,\npre .ruby .symbol .keyword,\npre .ruby .symbol .keymethods,\npre .instancevar,\npre .aggregate,\npre .template_tag,\npre .django .variable,\npre .smalltalk .class,\npre .addition,\npre .flow,\npre .stream,\npre .bash .variable,\npre .apache .tag,\npre .apache .cbracket,\npre .tex .command,\npre .tex .special,\npre .erlang_repl .function_or_atom,\npre .markdown .header {\n  color: #800;\n}\n\npre .comment,\npre .annotation,\npre .template_comment,\npre .diff .header,\npre .chunk,\npre .markdown .blockquote {\n  color: #888;\n}\n\npre .number,\npre .date,\npre .regexp,\npre .literal,\npre .smalltalk .symbol,\npre .smalltalk .char,\npre .go .constant,\npre .change,\npre .markdown .bullet,\npre .markdown .link_url {\n  color: #080;\n}\n\npre .label,\npre .javadoc,\npre .ruby .string,\npre .decorator,\npre .filter .argument,\npre .localvars,\npre .array,\npre .attr_selector,\npre .important,\npre .pseudo,\npre .pi,\npre .doctype,\npre .deletion,\npre .envvar,\npre .shebang,\npre .apache .sqbracket,\npre .nginx .built_in,\npre .tex .formula,\npre .erlang_repl .reserved,\npre .input_number,\npre .markdown .link_label {\n  color: #88F\n}\n\npre .keyword,\npre .id,\npre .phpdoc,\npre .title,\npre .built_in,\npre .aggregate,\npre .css .tag,\npre .javadoctag,\npre .phpdoc,\npre .yardoctag,\npre .smalltalk .class,\npre .winutils,\npre .bash .variable,\npre .apache .tag,\npre .go .typename,\npre .tex .command,\npre .markdown .strong {\n  font-weight: bold;\n}\n\npre .markdown .emphasis {\n  font-style: italic;\n}\n\npre .nginx .built_in {\n  font-weight: normal;\n}\n\npre .coffeescript .javascript,\npre .xml .css,\npre .xml .javascript,\npre .xml .vbscript,\npre .tex .formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/highlight.pack.js",
    "content": "var hljs=new function(){function m(p){return p.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\")}function c(r,q,p){return RegExp(q,\"m\"+(r.cI?\"i\":\"\")+(p?\"g\":\"\"))}function j(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName==\"CODE\"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\\s+/))){break}}}function g(t,s){var r=\"\";for(var q=0;q<t.childNodes.length;q++){if(t.childNodes[q].nodeType==3){var p=t.childNodes[q].nodeValue;if(s){p=p.replace(/\\n/g,\"\")}r+=p}else{if(t.childNodes[q].nodeName==\"BR\"){r+=\"\\n\"}else{r+=g(t.childNodes[q])}}}if(/MSIE [678]/.test(navigator.userAgent)){r=r.replace(/\\r/g,\"\\n\")}return r}function a(s){var q=s.className.split(/\\s+/);q=q.concat(s.parentNode.className.split(/\\s+/));for(var p=0;p<q.length;p++){var r=q[p].replace(/^language-/,\"\");if(d[r]||r==\"no-highlight\"){return r}}}function b(p){var q=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName==\"BR\"){t+=1}else{if(s.childNodes[r].nodeType==1){q.push({event:\"start\",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);q.push({event:\"stop\",offset:t,node:s.childNodes[r]})}}}}return t})(p,0);return q}function l(y,z,x){var r=0;var w=\"\";var t=[];function u(){if(y.length&&z.length){if(y[0].offset!=z[0].offset){return(y[0].offset<z[0].offset)?y:z}else{return z[0].event==\"start\"?y:z}}else{return y.length?y:z}}function s(C){var D=\"<\"+C.nodeName.toLowerCase();for(var A=0;A<C.attributes.length;A++){var B=C.attributes[A];D+=\" \"+B.nodeName.toLowerCase();if(B.value!==undefined&&B.value!==false&&B.value!==null){D+='=\"'+m(B.value)+'\"'}}return D+\">\"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event==\"start\"){w+=s(v.node);t.push(v.node)}else{if(v.event==\"stop\"){var p,q=t.length;do{q--;p=t[q];w+=(\"</\"+p.nodeName.toLowerCase()+\">\")}while(p!=v.node);t.splice(q,1);while(q<t.length){w+=s(t[q]);q++}}}}return w+m(x.substr(r))}function i(){function p(w,u,x){if(w.compiled){return}var t;if(!x){w.bR=c(u,w.b?w.b:\"\\\\B|\\\\b\");if(!w.e&&!w.eW){w.e=\"\\\\B|\\\\b\"}if(w.e){w.eR=c(u,w.e)}}if(w.i){w.iR=c(u,w.i)}if(w.r===undefined){w.r=1}if(w.k){w.lR=c(u,w.l||hljs.IR,true);for(var v in w.k){if(!w.k.hasOwnProperty(v)){continue}if(w.k[v] instanceof Object){t=w.k[v]}else{t=w.k;v=\"keyword\"}for(var s in t){if(!t.hasOwnProperty(s)){continue}w.k[s]=[v,t[s]]}}}if(!w.c){w.c=[]}w.compiled=true;for(var r=0;r<w.c.length;r++){if(w.c[r]==\"self\"){w.c[r]=w}p(w.c[r],u,false)}if(w.starts){p(w.starts,u,false)}}for(var q in d){if(!d.hasOwnProperty(q)){continue}p(d[q].dM,d[q],true)}}function e(J,D){if(!i.called){i();i.called=true}function z(r,M){for(var L=0;L<M.c.length;L++){if(M.c[L].bR.test(r)){return M.c[L]}}}function w(L,r){if(C[L].e&&C[L].eR.test(r)){return 1}if(C[L].eW){var M=w(L-1,r);return M?M+1:0}return 0}function x(r,L){return L.i&&L.iR.test(r)}function A(O,N){var M=[];for(var L=0;L<O.c.length;L++){M.push(O.c[L].b)}var r=C.length-1;do{if(C[r].e){M.push(C[r].e)}r--}while(C[r+1].eW);if(O.i){M.push(O.i)}return c(N,\"(\"+M.join(\"|\")+\")\",true)}function s(M,L){var N=C[C.length-1];if(!N.t){N.t=A(N,H)}N.t.lastIndex=L;var r=N.t.exec(M);if(r){return[M.substr(L,r.index-L),r[0],false]}else{return[M.substr(L),\"\",true]}}function p(N,r){var L=H.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(M,O){M=m(M);if(!O.k){return M}var N=\"\";var P=0;O.lR.lastIndex=0;var L=O.lR.exec(M);while(L){N+=M.substr(P,L.index-P);var r=p(O,L);if(r){t+=r[1];N+='<span class=\"'+r[0]+'\">'+L[0]+\"</span>\"}else{N+=L[0]}P=O.lR.lastIndex;L=O.lR.exec(M)}return N+M.substr(P,M.length-P)}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'<span class=\"'+M.cN+'\">':\"\";if(M.rB){q+=L;M.buffer=\"\"}else{if(M.eB){q+=m(r)+L;M.buffer=\"\"}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?\"</span>\":\"\";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?\"</span>\":\"\";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer=\"\";if(P.starts){I(P.starts,\"\")}return R.rE}if(x(L,R)){throw\"Illegal\"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q=\"\";try{var y,v=0;H.dM.buffer=\"\";do{y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw\"Illegal\"}return{r:B,keyword_count:t,value:q}}catch(G){if(G==\"Illegal\"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\\t)+)/gm,function(t,w,v,u){return w.replace(/\\t/g,q)})}if(p){r=r.replace(/\\n/g,\"<br>\")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);var w,r;if(s==\"no-highlight\"){return}if(s){w=e(s,y)}else{w=f(y);s=w.language}var p=b(u);if(p.length){r=document.createElement(\"pre\");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match(\"(\\\\s|^)(language-)?\"+s+\"(\\\\s|$)\")){t=t?(t+\" \"+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName==\"CODE\"&&u.parentNode.tagName==\"PRE\"){r=u.parentNode;var v=document.createElement(\"div\");v.innerHTML=\"<pre><code>\"+w.value+\"</code></pre>\";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName(\"pre\");for(var p=0;p<r.length;p++){var q=j(r[p]);if(q){o(q,hljs.tabReplace)}}}function n(){if(window.addEventListener){window.addEventListener(\"DOMContentLoaded\",k,false);window.addEventListener(\"load\",k,false)}else{if(window.attachEvent){window.attachEvent(\"onload\",k)}else{window.onload=k}}}var d={};this.LANGUAGES=d;this.highlight=e;this.highlightAuto=f;this.fixMarkup=h;this.highlightBlock=o;this.initHighlighting=k;this.initHighlightingOnLoad=n;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|\\\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\.\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE],r:0};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE],r:0};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.bash=function(){var d={\"true\":1,\"false\":1};var c={cN:\"variable\",b:\"\\\\$([a-zA-Z0-9_]+)\\\\b\"};var a={cN:\"variable\",b:\"\\\\$\\\\{(([^}])|(\\\\\\\\}))+\\\\}\",c:[hljs.CNM]};var f={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[hljs.BE,c,a],r:0};var b={cN:\"string\",b:\"'\",e:\"'\",r:0};var e={cN:\"test_condition\",b:\"\",e:\"\",c:[f,b,c,a,hljs.CNM],k:{literal:d},r:0};return{dM:{k:{keyword:{\"if\":1,then:1,\"else\":1,fi:1,\"for\":1,\"break\":1,\"continue\":1,\"while\":1,\"in\":1,\"do\":1,done:1,echo:1,exit:1,\"return\":1,set:1,declare:1},literal:d},c:[{cN:\"shebang\",b:\"(#!\\\\/bin\\\\/bash)|(#!\\\\/bin\\\\/sh)\",r:10},c,a,hljs.HCM,hljs.CNM,f,b,hljs.inherit(e,{b:\"\\\\[ \",e:\" \\\\]\",r:0}),hljs.inherit(e,{b:\"\\\\[\\\\[ \",e:\" \\\\]\\\\]\"})]}}}();hljs.LANGUAGES.erlang=function(){var h=\"[a-z'][a-zA-Z0-9_']*\";var m=\"(\"+h+\":\"+h+\"|\"+h+\")\";var d={keyword:{after:1,and:1,andalso:10,band:1,begin:1,bnot:1,bor:1,bsl:1,bzr:1,bxor:1,\"case\":1,\"catch\":1,cond:1,div:1,end:1,fun:1,let:1,not:1,of:1,orelse:10,query:1,receive:1,rem:1,\"try\":1,when:1,xor:1},literal:{\"false\":1,\"true\":1}};var k={cN:\"comment\",b:\"%\",e:\"$\",r:0};var f={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0};var c={b:\"fun\\\\s+\"+h+\"/\\\\d+\"};var n={b:m+\"\\\\(\",e:\"\\\\)\",rB:true,r:0,c:[{cN:\"function_name\",b:m,r:0},{b:\"\\\\(\",e:\"\\\\)\",eW:true,rE:true,r:0}]};var g={cN:\"tuple\",b:\"{\",e:\"}\",r:0};var a={cN:\"variable\",b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",r:0};var l={cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_]*\",r:0};var i={b:\"#\",e:\"}\",i:\".\",r:0,rB:true,c:[{cN:\"record_name\",b:\"#\"+hljs.UIR,r:0},{b:\"{\",eW:true,r:0}]};var j={k:d,b:\"(fun|receive|if|try|case)\",e:\"end\"};j.c=[k,c,hljs.inherit(hljs.ASM,{cN:\"\"}),j,n,hljs.QSM,f,g,a,l,i];var b=[k,c,j,n,hljs.QSM,f,g,a,l,i];n.c[1].c=b;g.c=b;i.c[1].c=b;var e={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",eW:true,c:b};return{dM:{k:d,i:\"(</|\\\\*=|\\\\+=|-=|/=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+h+\"\\\\(\",e:\";|\\\\.\",rB:true,c:[e,{cN:\"title\",b:h},{k:d,b:\"->\",eW:true,c:b}]},k,{cN:\"pp\",b:\"^-\",e:\"\\\\.\",r:0,eE:true,rB:true,l:\"-\"+hljs.IR,k:{\"-module\":1,\"-record\":1,\"-undef\":1,\"-export\":1,\"-ifdef\":1,\"-ifndef\":1,\"-author\":1,\"-copyright\":1,\"-doc\":1,\"-vsn\":1,\"-import\":1,\"-include\":1,\"-include_lib\":1,\"-compile\":1,\"-define\":1,\"-else\":1,\"-endif\":1,\"-file\":1,\"-behaviour\":1,\"-behavior\":1},c:[e]},f,hljs.QSM,i,a,l,g]}}}();hljs.LANGUAGES.cs={dM:{k:{\"abstract\":1,as:1,base:1,bool:1,\"break\":1,\"byte\":1,\"case\":1,\"catch\":1,\"char\":1,checked:1,\"class\":1,\"const\":1,\"continue\":1,decimal:1,\"default\":1,delegate:1,\"do\":1,\"double\":1,\"else\":1,\"enum\":1,event:1,explicit:1,extern:1,\"false\":1,\"finally\":1,fixed:1,\"float\":1,\"for\":1,foreach:1,\"goto\":1,\"if\":1,implicit:1,\"in\":1,\"int\":1,\"interface\":1,internal:1,is:1,lock:1,\"long\":1,namespace:1,\"new\":1,\"null\":1,object:1,operator:1,out:1,override:1,params:1,\"private\":1,\"protected\":1,\"public\":1,readonly:1,ref:1,\"return\":1,sbyte:1,sealed:1,\"short\":1,sizeof:1,stackalloc:1,\"static\":1,string:1,struct:1,\"switch\":1,\"this\":1,\"throw\":1,\"true\":1,\"try\":1,\"typeof\":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,\"volatile\":1,\"void\":1,\"while\":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,\"var\":1,where:1,yield:1},c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},hljs.CLCM,hljs.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:{\"if\":1,\"else\":1,elif:1,endif:1,define:1,undef:1,warning:1,error:1,line:1,region:1,endregion:1,pragma:1,checksum:1}},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var c=\"[a-zA-Z_][a-zA-Z0-9_]*(\\\\!|\\\\?)?\";var i=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var a={keyword:{and:1,\"false\":1,then:1,defined:1,module:1,\"in\":1,\"return\":1,redo:1,\"if\":1,BEGIN:1,retry:1,end:1,\"for\":1,\"true\":1,self:1,when:1,next:1,until:1,\"do\":1,begin:1,unless:1,END:1,rescue:1,nil:1,\"else\":1,\"break\":1,undef:1,not:1,\"super\":1,\"class\":1,\"case\":1,require:1,yield:1,alias:1,\"while\":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,\"all?\":1,allocate:1,ancestors:1,\"any?\":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,\"autoload?\":1,\"between?\":1,binding:1,binmode:1,\"block_given?\":1,call:1,callcc:1,caller:1,capitalize:1,\"capitalize!\":1,casecmp:1,\"catch\":1,ceil:1,center:1,chomp:1,\"chomp!\":1,chop:1,\"chop!\":1,chr:1,\"class\":1,class_eval:1,\"class_variable_defined?\":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,\"closed?\":1,coerce:1,collect:1,\"collect!\":1,compact:1,\"compact!\":1,concat:1,\"const_defined?\":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,\"default\":1,default_proc:1,\"delete\":1,\"delete!\":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,\"downcase!\":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,\"empty?\":1,entries:1,eof:1,\"eof?\":1,\"eql?\":1,\"equal?\":1,\"eval\":1,exec:1,exit:1,\"exit!\":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,\"flatten!\":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,\"frozen?\":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,\"gsub!\":1,\"has_key?\":1,\"has_value?\":1,hash:1,hex:1,id:1,include:1,\"include?\":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,\"instance_of?\":1,\"instance_variable_defined?\":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,\"integer?\":1,intern:1,invert:1,ioctl:1,\"is_a?\":1,isatty:1,\"iterator?\":1,join:1,\"key?\":1,keys:1,\"kind_of?\":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,\"lstrip!\":1,map:1,\"map!\":1,match:1,max:1,\"member?\":1,merge:1,\"merge!\":1,method:1,\"method_defined?\":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,\"new\":1,next:1,\"next!\":1,\"nil?\":1,nitems:1,\"nonzero?\":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,\"private_method_defined?\":1,private_methods:1,proc:1,protected_instance_methods:1,\"protected_method_defined?\":1,protected_methods:1,public_class_method:1,public_instance_methods:1,\"public_method_defined?\":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,\"reject!\":1,remainder:1,reopen:1,replace:1,require:1,\"respond_to?\":1,reverse:1,\"reverse!\":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,\"rstrip!\":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,\"slice!\":1,sort:1,\"sort!\":1,sort_by:1,split:1,sprintf:1,squeeze:1,\"squeeze!\":1,srand:1,stat:1,step:1,store:1,strip:1,\"strip!\":1,sub:1,\"sub!\":1,succ:1,\"succ!\":1,sum:1,superclass:1,swapcase:1,\"swapcase!\":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,\"tainted?\":1,tell:1,test:1,\"throw\":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,\"tr!\":1,tr_s:1,\"tr_s!\":1,trace_var:1,transpose:1,trap:1,truncate:1,\"tty?\":1,type:1,ungetc:1,uniq:1,\"uniq!\":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,\"upcase!\":1,update:1,upto:1,\"value?\":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,\"zero?\":1,zip:1}};var d={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var k=[{cN:\"comment\",b:\"#\",e:\"$\",c:[d]},{cN:\"comment\",b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[d],r:10},{cN:\"comment\",b:\"^__END__\",e:\"\\\\n$\"}];var e={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:c,k:a};var g=[hljs.BE,e];var f=[{cN:\"string\",b:\"'\",e:\"'\",c:g,r:0},{cN:\"string\",b:'\"',e:'\"',c:g,r:0},{cN:\"string\",b:\"%[qw]?\\\\(\",e:\"\\\\)\",c:g,r:10},{cN:\"string\",b:\"%[qw]?\\\\[\",e:\"\\\\]\",c:g,r:10},{cN:\"string\",b:\"%[qw]?{\",e:\"}\",c:g,r:10},{cN:\"string\",b:\"%[qw]?<\",e:\">\",c:g,r:10},{cN:\"string\",b:\"%[qw]?/\",e:\"/\",c:g,r:10},{cN:\"string\",b:\"%[qw]?%\",e:\"%\",c:g,r:10},{cN:\"string\",b:\"%[qw]?-\",e:\"-\",c:g,r:10},{cN:\"string\",b:\"%[qw]?\\\\|\",e:\"\\\\|\",c:g,r:10}];var h={cN:\"function\",b:\"\\\\bdef\\\\s+\",e:\" |$|;\",l:c,k:a,c:[{cN:\"title\",b:i,l:c,k:a},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:c,k:a}].concat(k)};var j={cN:\"identifier\",b:c,l:c,k:a,r:0};var b=k.concat(f.concat([{cN:\"class\",b:\"\\\\b(class|module)\\\\b\",e:\"$|;\",k:{\"class\":1,module:1},c:[{cN:\"title\",b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\",r:0},{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+hljs.IR+\"::)?\"+hljs.IR}]}].concat(k)},h,{cN:\"constant\",b:\"(::)?([A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:f.concat([j]),r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"number\",b:\"\\\\?\\\\w\"},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},j,{b:\"(\"+hljs.RSR+\")\\\\s*\",c:k.concat([{cN:\"regexp\",b:\"/\",e:\"/[a-z]*\",i:\"\\\\n\",c:[hljs.BE]}]),r:0}]));e.c=b;h.c[1].c=b;return{dM:{l:c,k:a,c:b}}}();hljs.LANGUAGES.rust=function(){var c={cN:\"title\",b:hljs.UIR};var d={cN:\"string\",b:'\"',e:'\"',c:[hljs.BE],r:0};var b={cN:\"number\",b:\"\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)\",r:0};var a={alt:1,any:1,as:1,assert:1,be:1,bind:1,block:1,bool:1,\"break\":1,\"char\":1,check:1,claim:1,\"const\":1,cont:1,dir:1,\"do\":1,\"else\":1,\"enum\":1,\"export\":1,f32:1,f64:1,fail:1,\"false\":1,\"float\":1,fn:10,\"for\":1,i16:1,i32:1,i64:1,i8:1,\"if\":1,iface:10,impl:10,\"import\":1,\"in\":1,\"int\":1,let:1,log:1,mod:1,mutable:1,\"native\":1,note:1,of:1,prove:1,pure:10,resource:1,ret:1,self:1,str:1,syntax:1,\"true\":1,type:1,u16:1,u32:1,u64:1,u8:1,uint:1,unchecked:1,unsafe:1,use:1,vec:1,\"while\":1};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,d,hljs.ASM,b,{cN:\"function\",b:\"fn\",e:\"(\\\\(|<)\",k:{fn:1},c:[c]},{cN:\"preprocessor\",b:\"#\\\\[\",e:\"\\\\]\"},{b:\"type\",e:\"(=|<)\",k:{type:1},c:[c]},{b:\"iface\",e:\"({|<)\",k:{iface:1},c:[c]},{b:\"enum\",e:\"({|<)\",k:{\"enum\":1},c:[c]}]}}}();hljs.LANGUAGES.diff={cI:true,dM:{c:[{cN:\"chunk\",b:\"^\\\\@\\\\@ +\\\\-\\\\d+,\\\\d+ +\\\\+\\\\d+,\\\\d+ +\\\\@\\\\@$\",r:10},{cN:\"chunk\",b:\"^\\\\*\\\\*\\\\* +\\\\d+,\\\\d+ +\\\\*\\\\*\\\\*\\\\*$\",r:10},{cN:\"chunk\",b:\"^\\\\-\\\\-\\\\- +\\\\d+,\\\\d+ +\\\\-\\\\-\\\\-\\\\-$\",r:10},{cN:\"header\",b:\"Index: \",e:\"$\"},{cN:\"header\",b:\"=====\",e:\"=====$\"},{cN:\"header\",b:\"^\\\\-\\\\-\\\\-\",e:\"$\"},{cN:\"header\",b:\"^\\\\*{3} \",e:\"$\"},{cN:\"header\",b:\"^\\\\+\\\\+\\\\+\",e:\"$\"},{cN:\"header\",b:\"\\\\*{5}\",e:\"\\\\*{5}$\"},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}};hljs.LANGUAGES.rib={dM:{k:{keyword:{ArchiveRecord:1,AreaLightSource:1,Atmosphere:1,Attribute:1,AttributeBegin:1,AttributeEnd:1,Basis:1,Begin:1,Blobby:1,Bound:1,Clipping:1,ClippingPlane:1,Color:1,ColorSamples:1,ConcatTransform:1,Cone:1,CoordinateSystem:1,CoordSysTransform:1,CropWindow:1,Curves:1,Cylinder:1,DepthOfField:1,Detail:1,DetailRange:1,Disk:1,Displacement:1,Display:1,End:1,ErrorHandler:1,Exposure:1,Exterior:1,Format:1,FrameAspectRatio:1,FrameBegin:1,FrameEnd:1,GeneralPolygon:1,GeometricApproximation:1,Geometry:1,Hider:1,Hyperboloid:1,Identity:1,Illuminate:1,Imager:1,Interior:1,LightSource:1,MakeCubeFaceEnvironment:1,MakeLatLongEnvironment:1,MakeShadow:1,MakeTexture:1,Matte:1,MotionBegin:1,MotionEnd:1,NuPatch:1,ObjectBegin:1,ObjectEnd:1,ObjectInstance:1,Opacity:1,Option:1,Orientation:1,Paraboloid:1,Patch:1,PatchMesh:1,Perspective:1,PixelFilter:1,PixelSamples:1,PixelVariance:1,Points:1,PointsGeneralPolygons:1,PointsPolygons:1,Polygon:1,Procedural:1,Projection:1,Quantize:1,ReadArchive:1,RelativeDetail:1,ReverseOrientation:1,Rotate:1,Scale:1,ScreenWindow:1,ShadingInterpolation:1,ShadingRate:1,Shutter:1,Sides:1,Skew:1,SolidBegin:1,SolidEnd:1,Sphere:1,SubdivisionMesh:1,Surface:1,TextureCoordinates:1,Torus:1,Transform:1,TransformBegin:1,TransformEnd:1,TransformPoints:1,Translate:1,TrimCurve:1,WorldBegin:1,WorldEnd:1}},i:\"</\",c:[hljs.HCM,hljs.CNM,hljs.ASM,hljs.QSM]}};hljs.LANGUAGES.rsl={dM:{k:{keyword:{\"float\":1,color:1,point:1,normal:1,vector:1,matrix:1,\"while\":1,\"for\":1,\"if\":1,\"do\":1,\"return\":1,\"else\":1,\"break\":1,extern:1,\"continue\":1},built_in:{abs:1,acos:1,ambient:1,area:1,asin:1,atan:1,atmosphere:1,attribute:1,calculatenormal:1,ceil:1,cellnoise:1,clamp:1,comp:1,concat:1,cos:1,degrees:1,depth:1,Deriv:1,diffuse:1,distance:1,Du:1,Dv:1,environment:1,exp:1,faceforward:1,filterstep:1,floor:1,format:1,fresnel:1,incident:1,length:1,lightsource:1,log:1,match:1,max:1,min:1,mod:1,noise:1,normalize:1,ntransform:1,opposite:1,option:1,phong:1,pnoise:1,pow:1,printf:1,ptlined:1,radians:1,random:1,reflect:1,refract:1,renderinfo:1,round:1,setcomp:1,setxcomp:1,setycomp:1,setzcomp:1,shadow:1,sign:1,sin:1,smoothstep:1,specular:1,specularbrdf:1,spline:1,sqrt:1,step:1,tan:1,texture:1,textureinfo:1,trace:1,transform:1,vtransform:1,xcomp:1,ycomp:1,zcomp:1}},i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,hljs.ASM,hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"shader\",b:\"surface |displacement |light |volume |imager \",e:\"\\\\(\",k:{surface:1,displacement:1,light:1,volume:1,imager:1}},{cN:\"shading\",b:\"illuminate|illuminance|gather\",e:\"\\\\(\",k:{illuminate:1,illuminance:1,gather:1}}]}};hljs.LANGUAGES.javascript={dM:{k:{keyword:{\"in\":1,\"if\":1,\"for\":1,\"while\":1,\"finally\":1,\"var\":1,\"new\":1,\"function\":1,\"do\":1,\"return\":1,\"void\":1,\"else\":1,\"break\":1,\"catch\":1,\"instanceof\":1,\"with\":1,\"throw\":1,\"case\":1,\"default\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"typeof\":1,\"delete\":1},literal:{\"true\":1,\"false\":1,\"null\":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:\"(\"+hljs.RSR+\"|case|return|throw)\\\\s*\",k:{\"return\":1,\"throw\":1,\"case\":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:\"regexp\",b:\"/\",e:\"/[gim]*\",c:[{b:\"\\\\\\\\/\"}]}],r:0},{cN:\"function\",b:\"\\\\bfunction\\\\b\",e:\"{\",k:{\"function\":1},c:[{cN:\"title\",b:\"[A-Za-z$_][0-9A-Za-z$_]*\"},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.lua=function(){var b=\"\\\\[=*\\\\[\";var d=\"\\\\]=*\\\\]\";var a={b:b,e:d,c:[\"self\"]};var c=[{cN:\"comment\",b:\"--(?!\"+b+\")\",e:\"$\"},{cN:\"comment\",b:\"--\"+b,e:d,c:[a],r:10}];return{dM:{l:hljs.UIR,k:{keyword:{and:1,\"break\":1,\"do\":1,\"else\":1,elseif:1,end:1,\"false\":1,\"for\":1,\"if\":1,\"in\":1,local:1,nil:1,not:1,or:1,repeat:1,\"return\":1,then:1,\"true\":1,until:1,\"while\":1},built_in:{_G:1,_VERSION:1,assert:1,collectgarbage:1,dofile:1,error:1,getfenv:1,getmetatable:1,ipairs:1,load:1,loadfile:1,loadstring:1,module:1,next:1,pairs:1,pcall:1,print:1,rawequal:1,rawget:1,rawset:1,require:1,select:1,setfenv:1,setmetatable:1,tonumber:1,tostring:1,type:1,unpack:1,xpcall:1,coroutine:1,debug:1,io:1,math:1,os:1,\"package\":1,string:1,table:1}},c:c.concat([{cN:\"function\",b:\"\\\\bfunction\\\\b\",e:\"\\\\)\",k:{\"function\":1},c:[{cN:\"title\",b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"},{cN:\"params\",b:\"\\\\(\",eW:true,c:c}].concat(c)},hljs.CNM,hljs.ASM,hljs.QSM,{cN:\"string\",b:b,e:d,c:[a],r:10}])}}}();hljs.LANGUAGES.xml=function(){var b=\"[A-Za-z0-9\\\\._:-]+\";var a={eW:true,c:[{cN:\"attribute\",b:b,r:0},{b:'=\"',rB:true,e:'\"',c:[{cN:\"value\",b:'\"',eW:true}]},{b:\"='\",rB:true,e:\"'\",c:[{cN:\"value\",b:\"'\",eW:true}]},{b:\"=\",c:[{cN:\"value\",b:\"[^\\\\s/>]+\"}]}]};return{cI:true,dM:{c:[{cN:\"pi\",b:\"<\\\\?\",e:\"\\\\?>\",r:10},{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:{style:1}},c:[a],starts:{cN:\"css\",e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:{script:1}},c:[a],starts:{cN:\"javascript\",e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{cN:\"vbscript\",b:\"<%\",e:\"%>\",sL:\"vbscript\"},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ />]+\"},a]}]}}}();hljs.LANGUAGES.markdown={cI:true,dM:{c:[{cN:\"header\",b:\"^#{1,3}\",e:\"$\"},{cN:\"header\",b:\"^.+?\\\\n[=-]{2,}$\"},{b:\"<\",e:\">\",sL:\"xml\"},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",b:\"[*_].+?[*_]\"},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",b:\"`.+?`\"},{cN:\"code\",b:\"^    \",e:\"$\",r:0},{cN:\"horizontal_rule\",b:\"^-{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\]\\\\(.+?\\\\)\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[.+\\\\]\"},{cN:\"link_url\",b:\"\\\\(\",e:\"\\\\)\",eB:true,eE:true}]}]}};hljs.LANGUAGES.css=function(){var a={cN:\"function\",b:hljs.IR+\"\\\\(\",e:\"\\\\)\",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:\"[=/|']\",c:[hljs.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:{\"font-face\":1,page:1}},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",eE:true,k:{\"import\":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:\"tag\",b:hljs.IR,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[hljs.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:\"hexcolor\",b:\"\\\\#[0-9A-F]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}}}();hljs.LANGUAGES.lisp=function(){var k=\"[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#]*\";var m=\"(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\";var a={cN:\"literal\",b:\"\\\\b(t{1}|nil)\\\\b\"};var f=[{cN:\"number\",b:m},{cN:\"number\",b:\"#b[0-1]+(/[0-1]+)?\"},{cN:\"number\",b:\"#o[0-7]+(/[0-7]+)?\"},{cN:\"number\",b:\"#x[0-9a-f]+(/[0-9a-f]+)?\"},{cN:\"number\",b:\"#c\\\\(\"+m+\" +\"+m,e:\"\\\\)\"}];var b={cN:\"string\",b:'\"',e:'\"',c:[hljs.BE],r:0};var l={cN:\"comment\",b:\";\",e:\"$\"};var c={cN:\"variable\",b:\"\\\\*\",e:\"\\\\*\"};var j={cN:\"keyword\",b:\"[:&]\"+k};var h={b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",a,b].concat(f)};var e={cN:\"quoted\",b:\"['`]\\\\(\",e:\"\\\\)\",c:f.concat([b,c,j,h])};var d={cN:\"quoted\",b:\"\\\\(quote \",e:\"\\\\)\",k:{title:{quote:1}},c:f.concat([b,c,j,h])};var i={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var g={cN:\"body\",eW:true,eE:true};i.c=[{cN:\"title\",b:k},g];g.c=[e,d,i,a].concat(f).concat([b,l,c,j]);return{cI:true,dM:{i:\"[^\\\\s]\",c:f.concat([a,b,l,e,d,i])}}}();hljs.LANGUAGES.profile={dM:{c:[hljs.CNM,{cN:\"builtin\",b:\"{\",e:\"}$\",eB:true,eE:true,c:[hljs.ASM,hljs.QSM],r:0},{cN:\"filename\",b:\"[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}\",e:\":\",eE:true},{cN:\"header\",b:\"(ncalls|tottime|cumtime)\",e:\"$\",k:{ncalls:1,tottime:10,cumtime:10,filename:1},r:10},{cN:\"summary\",b:\"function calls\",e:\"$\",c:[hljs.CNM],r:10},hljs.ASM,hljs.QSM,{cN:\"function\",b:\"\\\\(\",e:\"\\\\)$\",c:[{cN:\"title\",b:hljs.UIR,r:0}],r:0}]}};hljs.LANGUAGES.java={dM:{k:{\"false\":1,\"synchronized\":1,\"int\":1,\"abstract\":1,\"float\":1,\"private\":1,\"char\":1,\"interface\":1,\"boolean\":1,\"static\":1,\"null\":1,\"if\":1,\"const\":1,\"for\":1,\"true\":1,\"while\":1,\"long\":1,\"throw\":1,strictfp:1,\"finally\":1,\"protected\":1,\"extends\":1,\"import\":1,\"native\":1,\"final\":1,\"implements\":1,\"return\":1,\"void\":1,\"enum\":1,\"else\":1,\"break\":1,\"transient\":1,\"new\":1,\"catch\":1,\"instanceof\":1,\"byte\":1,\"super\":1,\"class\":1,\"volatile\":1,\"case\":1,assert:1,\"short\":1,\"package\":1,\"default\":1,\"double\":1,\"public\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"throws\":1},c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:\"class\",b:\"(class |interface )\",e:\"{\",k:{\"class\":1,\"interface\":1},i:\":\",c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:10},{cN:\"title\",b:hljs.UIR}]},hljs.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,\"abstract\":1,global:1,\"private\":1,echo:1,\"interface\":1,as:1,\"static\":1,endswitch:1,array:1,\"null\":1,\"if\":1,endwhile:1,or:1,\"const\":1,\"for\":1,endforeach:1,self:1,\"var\":1,\"while\":1,isset:1,\"public\":1,\"protected\":1,exit:1,foreach:1,\"throw\":1,elseif:1,\"extends\":1,include:1,__FILE__:1,empty:1,require_once:1,\"function\":1,\"do\":1,xor:1,\"return\":1,\"implements\":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,\"else\":1,\"break\":1,print:1,\"eval\":1,\"new\":1,\"catch\":1,__METHOD__:1,\"class\":1,\"case\":1,exception:1,php_user_filter:1,\"default\":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,\"final\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,endfor:1,endif:1,declare:1,unset:1,\"true\":1,\"false\":1,namespace:1,trait:1,\"goto\":1,\"instanceof\":1,__DIR__:1,__NAMESPACE__:1,__halt_compiler:1},c:[hljs.CLCM,hljs.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"}]},{cN:\"comment\",eB:true,b:\"__halt_compiler[^;]+;\",e:\"[\\\\n\\\\r]$\"},hljs.CNM,hljs.BNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:\"string\",b:'b\"',e:'\"',c:[hljs.BE]},{cN:\"string\",b:\"b'\",e:\"'\",c:[hljs.BE]},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[hljs.BE]},{cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"},{cN:\"preprocessor\",b:\"<\\\\?php\",r:10},{cN:\"preprocessor\",b:\"\\\\?>\"}]}};hljs.LANGUAGES.haskell=function(){var a={cN:\"label\",b:\"\\\\b[A-Z][\\\\w']*\",r:0};var b={cN:\"container\",b:\"\\\\(\",e:\"\\\\)\",c:[{cN:\"label\",b:\"\\\\b[A-Z][\\\\w\\\\(\\\\)\\\\.']*\"},{cN:\"title\",b:\"[_a-z][\\\\w']*\"}]};return{dM:{k:{keyword:{let:1,\"in\":1,\"if\":1,then:1,\"else\":1,\"case\":1,of:1,where:1,\"do\":1,module:1,\"import\":1,hiding:1,qualified:1,type:1,data:1,newtype:1,deriving:1,\"class\":1,instance:1,\"null\":1,not:1,as:1}},c:[{cN:\"comment\",b:\"--\",e:\"$\"},{cN:\"comment\",b:\"{-\",e:\"-}\"},{cN:\"string\",b:\"\\\\s+'\",e:\"'\",c:[hljs.BE],r:0},hljs.QSM,{cN:\"import\",b:\"\\\\bimport\",e:\"$\",k:{\"import\":1,qualified:1,as:1,hiding:1},c:[b]},{cN:\"module\",b:\"\\\\bmodule\",e:\"where\",k:{module:1,where:1},c:[b]},{cN:\"class\",b:\"\\\\b(class|instance|data|(new)?type)\",e:\"(where|$)\",k:{\"class\":1,where:1,instance:1,data:1,type:1,newtype:1,deriving:1},c:[a]},hljs.CNM,{cN:\"shebang\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,{cN:\"title\",b:\"^[_a-z][\\\\w']*\"}]}}}();hljs.LANGUAGES[\"1c\"]=function(){var b=\"[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*\";var e={\"возврат\":1,\"дата\":1,\"для\":1,\"если\":1,\"и\":1,\"или\":1,\"иначе\":1,\"иначеесли\":1,\"исключение\":1,\"конецесли\":1,\"конецпопытки\":1,\"конецпроцедуры\":1,\"конецфункции\":1,\"конеццикла\":1,\"константа\":1,\"не\":1,\"перейти\":1,\"перем\":1,\"перечисление\":1,\"по\":1,\"пока\":1,\"попытка\":1,\"прервать\":1,\"продолжить\":1,\"процедура\":1,\"строка\":1,\"тогда\":1,\"фс\":1,\"функция\":1,\"цикл\":1,\"число\":1,\"экспорт\":1};var d={ansitooem:1,oemtoansi:1,\"ввестивидсубконто\":1,\"ввестидату\":1,\"ввестизначение\":1,\"ввестиперечисление\":1,\"ввестипериод\":1,\"ввестиплансчетов\":1,\"ввестистроку\":1,\"ввестичисло\":1,\"вопрос\":1,\"восстановитьзначение\":1,\"врег\":1,\"выбранныйплансчетов\":1,\"вызватьисключение\":1,\"датагод\":1,\"датамесяц\":1,\"датачисло\":1,\"добавитьмесяц\":1,\"завершитьработусистемы\":1,\"заголовоксистемы\":1,\"записьжурналарегистрации\":1,\"запуститьприложение\":1,\"зафиксироватьтранзакцию\":1,\"значениевстроку\":1,\"значениевстрокувнутр\":1,\"значениевфайл\":1,\"значениеизстроки\":1,\"значениеизстрокивнутр\":1,\"значениеизфайла\":1,\"имякомпьютера\":1,\"имяпользователя\":1,\"каталогвременныхфайлов\":1,\"каталогиб\":1,\"каталогпользователя\":1,\"каталогпрограммы\":1,\"кодсимв\":1,\"командасистемы\":1,\"конгода\":1,\"конецпериодаби\":1,\"конецрассчитанногопериодаби\":1,\"конецстандартногоинтервала\":1,\"конквартала\":1,\"конмесяца\":1,\"коннедели\":1,\"лев\":1,\"лог\":1,\"лог10\":1,\"макс\":1,\"максимальноеколичествосубконто\":1,\"мин\":1,\"монопольныйрежим\":1,\"названиеинтерфейса\":1,\"названиенабораправ\":1,\"назначитьвид\":1,\"назначитьсчет\":1,\"найти\":1,\"найтипомеченныенаудаление\":1,\"найтиссылки\":1,\"началопериодаби\":1,\"началостандартногоинтервала\":1,\"начатьтранзакцию\":1,\"начгода\":1,\"начквартала\":1,\"начмесяца\":1,\"начнедели\":1,\"номерднягода\":1,\"номерднянедели\":1,\"номернеделигода\":1,\"нрег\":1,\"обработкаожидания\":1,\"окр\":1,\"описаниеошибки\":1,\"основнойжурналрасчетов\":1,\"основнойплансчетов\":1,\"основнойязык\":1,\"открытьформу\":1,\"открытьформумодально\":1,\"отменитьтранзакцию\":1,\"очиститьокносообщений\":1,\"периодстр\":1,\"полноеимяпользователя\":1,\"получитьвремята\":1,\"получитьдатута\":1,\"получитьдокументта\":1,\"получитьзначенияотбора\":1,\"получитьпозициюта\":1,\"получитьпустоезначение\":1,\"получитьта\":1,\"прав\":1,\"праводоступа\":1,\"предупреждение\":1,\"префиксавтонумерации\":1,\"пустаястрока\":1,\"пустоезначение\":1,\"рабочаядаттьпустоезначение\":1,\"рабочаядата\":1,\"разделительстраниц\":1,\"разделительстрок\":1,\"разм\":1,\"разобратьпозициюдокумента\":1,\"рассчитатьрегистрына\":1,\"рассчитатьрегистрыпо\":1,\"сигнал\":1,\"симв\":1,\"символтабуляции\":1,\"создатьобъект\":1,\"сокрл\":1,\"сокрлп\":1,\"сокрп\":1,\" сообщить\":1,\"состояние\":1,\"сохранитьзначение\":1,\"сред\":1,\"статусвозврата\":1,\"стрдлина\":1,\"стрзаменить\":1,\"стрколичествострок\":1,\"стрполучитьстроку\":1,\" стрчисловхождений\":1,\"сформироватьпозициюдокумента\":1,\"счетпокоду\":1,\"текущаядата\":1,\"текущеевремя\":1,\"типзначения\":1,\"типзначениястр\":1,\"удалитьобъекты\":1,\"установитьтана\":1,\"установитьтапо\":1,\"фиксшаблон\":1,\"формат\":1,\"цел\":1,\"шаблон\":1};var a={cN:\"dquote\",b:'\"\"'};var c={cN:\"string\",b:'\"',e:'\"|$',c:[a],r:0};var f={cN:\"string\",b:\"\\\\|\",e:'\"|$',c:[a]};return{cI:true,dM:{l:b,k:{keyword:e,built_in:d},c:[hljs.CLCM,hljs.NM,c,f,{cN:\"function\",b:\"(процедура|функция)\",e:\"$\",l:b,k:{\"процедура\":1,\"экспорт\":1,\"функция\":1},c:[{cN:\"title\",b:b},{cN:\"tail\",eW:true,c:[{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:b,k:{\"знач\":1},c:[c,f]},{cN:\"export\",b:\"экспорт\",eW:true,l:b,k:{\"экспорт\":1},c:[hljs.CLCM]}]},hljs.CLCM]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"date\",b:\"'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})'\"}]}}}();hljs.LANGUAGES.python=function(){var a=[{cN:\"string\",b:\"(u|b)?r?'''\",e:\"'''\",r:10},{cN:\"string\",b:'(u|b)?r?\"\"\"',e:'\"\"\"',r:10},{cN:\"string\",b:\"(u|r|ur)'\",e:\"'\",c:[hljs.BE],r:10},{cN:\"string\",b:'(u|r|ur)\"',e:'\"',c:[hljs.BE],r:10},{cN:\"string\",b:\"(b|br)'\",e:\"'\",c:[hljs.BE]},{cN:\"string\",b:'(b|br)\"',e:'\"',c:[hljs.BE]}].concat([hljs.ASM,hljs.QSM]);var b={cN:\"title\",b:hljs.UIR};var c={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:a.concat([hljs.CNM])};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,\"in\":1,\"if\":1,from:1,raise:1,\"for\":1,except:1,\"finally\":1,print:1,\"import\":1,pass:1,\"return\":1,exec:1,\"else\":1,\"break\":1,not:1,\"with\":1,\"class\":1,assert:1,yield:1,\"try\":1,\"while\":1,\"continue\":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:\"(</|->|\\\\?)\",c:a.concat([hljs.HCM,{cN:\"function\",b:\"\\\\bdef \",e:\":\",i:\"$\",k:{def:1},c:[b,c],r:10},{cN:\"class\",b:\"\\\\bclass \",e:\":\",i:\"[${]\",k:{\"class\":1},c:[b,c],r:10},hljs.CNM,{cN:\"decorator\",b:\"@\",e:\"$\"}])}}}();hljs.LANGUAGES.smalltalk=function(){var b=\"[a-z][a-zA-Z0-9_]*\";var c={cN:\"char\",b:\"\\\\$.{1}\"};var a={cN:\"symbol\",b:\"#\"+hljs.UIR};return{dM:{k:{self:1,\"super\":1,nil:1,\"true\":1,\"false\":1,thisContext:1},c:[{cN:\"comment\",b:'\"',e:'\"',r:0},hljs.ASM,{cN:\"class\",b:\"\\\\b[A-Z][A-Za-z0-9_]*\",r:0},{cN:\"method\",b:b+\":\"},hljs.CNM,a,c,{cN:\"localvars\",b:\"\\\\|\\\\s*((\"+b+\")\\\\s*)+\\\\|\"},{cN:\"array\",b:\"\\\\#\\\\(\",e:\"\\\\)\",c:[hljs.ASM,c,hljs.CNM,a]}]}}}();hljs.LANGUAGES.tex=function(){var c={cN:\"command\",b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]?\",r:10};var b={cN:\"command\",b:\"\\\\\\\\[^a-zA-Zа-яА-я0-9]\",r:0};var a={cN:\"special\",b:\"[{}\\\\[\\\\]\\\\&#~]\",r:0};return{dM:{c:[{b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",rB:true,c:[c,b,{cN:\"number\",b:\" *=\",e:\"-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",eB:true}],r:10},c,b,a,{cN:\"formula\",b:\"\\\\$\\\\$\",e:\"\\\\$\\\\$\",c:[c,b,a],r:0},{cN:\"formula\",b:\"\\\\$\",e:\"\\\\$\",c:[c,b,a],r:0},{cN:\"comment\",b:\"%\",e:\"$\",r:0}]}}}();hljs.LANGUAGES.actionscript=function(){var c=\"[a-zA-Z_$][a-zA-Z0-9_$]*\";var a=\"([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)\";var d={cN:\"rest_arg\",b:\"[.]{3}\",e:c,r:10};var b={cN:\"title\",b:c};return{dM:{k:{keyword:{as:1,\"break\":1,\"case\":1,\"catch\":1,\"class\":1,\"const\":1,\"continue\":1,\"default\":1,\"delete\":1,\"do\":1,dynamic:5,each:1,\"else\":1,\"extends\":1,\"final\":1,\"finally\":1,\"for\":1,\"function\":1,get:1,\"if\":1,\"implements\":1,\"import\":1,\"in\":1,include:1,\"instanceof\":1,\"interface\":1,internal:1,is:1,namespace:1,\"native\":1,\"new\":1,override:1,\"package\":1,\"private\":1,\"protected\":1,\"public\":1,\"return\":1,set:1,\"static\":1,\"super\":5,\"switch\":1,\"this\":1,\"throw\":1,\"try\":1,\"typeof\":1,use:1,\"var\":1,\"void\":1,\"while\":1,\"with\":1},literal:{\"true\":1,\"false\":1,\"null\":1,\"undefined\":1},reserved:{\"abstract\":0,\"boolean\":0,\"byte\":0,cast:0,\"char\":0,\"debugger\":0,\"double\":0,\"enum\":0,\"export\":0,\"float\":0,\"goto\":0,intrinsic:0,\"long\":0,prototype:0,\"short\":0,\"synchronized\":0,\"throws\":0,to:0,\"transient\":0,type:0,virtual:0,\"volatile\":0}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{cN:\"package\",b:\"package ?\",e:\"{\",k:{\"package\":1},c:[b]},{cN:\"class\",b:\"(class|interface) \",e:\"{\",k:{\"class\":1,\"interface\":1},c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:5},b]},{cN:\"preprocessor\",b:\"(import|include)\\\\b\",e:\";\",k:{\"import\":1,include:1}},{cN:\"function\",b:\"function \",e:\"[{;]\",k:{\"function\":1},c:[b,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,d]},{cN:\"type\",b:\":\",e:a,r:10}]}]}}}();hljs.LANGUAGES.sql={cI:true,dM:{i:\"[^\\\\s]\",c:[{cN:\"operator\",b:\"(begin|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\\\b\",e:\";|$\",k:{keyword:{all:1,partial:1,global:1,month:1,current_timestamp:1,using:1,go:1,revoke:1,smallint:1,indicator:1,\"end-exec\":1,disconnect:1,zone:1,\"with\":1,character:1,assertion:1,to:1,add:1,current_user:1,usage:1,input:1,local:1,alter:1,match:1,collate:1,real:1,then:1,rollback:1,get:1,read:1,timestamp:1,session_user:1,not:1,integer:1,bit:1,unique:1,day:1,minute:1,desc:1,insert:1,execute:1,like:1,ilike:2,level:1,decimal:1,drop:1,\"continue\":1,isolation:1,found:1,where:1,constraints:1,domain:1,right:1,national:1,some:1,module:1,transaction:1,relative:1,second:1,connect:1,escape:1,close:1,system_user:1,\"for\":1,deferred:1,section:1,cast:1,current:1,sqlstate:1,allocate:1,intersect:1,deallocate:1,numeric:1,\"public\":1,preserve:1,full:1,\"goto\":1,initially:1,asc:1,no:1,key:1,output:1,collation:1,group:1,by:1,union:1,session:1,both:1,last:1,language:1,constraint:1,column:1,of:1,space:1,foreign:1,deferrable:1,prior:1,connection:1,unknown:1,action:1,commit:1,view:1,or:1,first:1,into:1,\"float\":1,year:1,primary:1,cascaded:1,except:1,restrict:1,set:1,references:1,names:1,table:1,outer:1,open:1,select:1,size:1,are:1,rows:1,from:1,prepare:1,distinct:1,leading:1,create:1,only:1,next:1,inner:1,authorization:1,schema:1,corresponding:1,option:1,declare:1,precision:1,immediate:1,\"else\":1,timezone_minute:1,external:1,varying:1,translation:1,\"true\":1,\"case\":1,exception:1,join:1,hour:1,\"default\":1,\"double\":1,scroll:1,value:1,cursor:1,descriptor:1,values:1,dec:1,fetch:1,procedure:1,\"delete\":1,and:1,\"false\":1,\"int\":1,is:1,describe:1,\"char\":1,as:1,at:1,\"in\":1,varchar:1,\"null\":1,trailing:1,any:1,absolute:1,current_time:1,end:1,grant:1,privileges:1,when:1,cross:1,check:1,write:1,current_date:1,pad:1,begin:1,temporary:1,exec:1,time:1,update:1,catalog:1,user:1,sql:1,date:1,on:1,identity:1,timezone_hour:1,natural:1,whenever:1,interval:1,work:1,order:1,cascade:1,diagnostics:1,nchar:1,having:1,left:1,call:1,\"do\":1,handler:1,load:1,replace:1,truncate:1,start:1,lock:1,show:1,pragma:1},aggregate:{count:1,sum:1,min:1,max:1,avg:1}},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,{b:\"''\"}],r:0},{cN:\"string\",b:'\"',e:'\"',c:[hljs.BE,{b:'\"\"'}],r:0},{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},hljs.CNM,{b:\"\\\\n\"}]},hljs.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}};hljs.LANGUAGES.vala={dM:{k:{keyword:{\"char\":1,uchar:1,unichar:1,\"int\":1,uint:1,\"long\":1,ulong:1,\"short\":1,ushort:1,int8:1,int16:1,int32:1,int64:1,uint8:1,uint16:1,uint32:1,uint64:1,\"float\":1,\"double\":1,bool:1,struct:1,\"enum\":1,string:1,\"void\":1,weak:5,unowned:5,owned:5,async:5,signal:5,\"static\":1,\"abstract\":1,\"interface\":1,override:1,\"while\":1,\"do\":1,\"for\":1,foreach:1,\"else\":1,\"switch\":1,\"case\":1,\"break\":1,\"default\":1,\"return\":1,\"try\":1,\"catch\":1,\"public\":1,\"private\":1,\"protected\":1,internal:1,using:1,\"new\":1,\"this\":1,get:1,set:1,\"const\":1,stdout:1,stdin:1,stderr:1,\"var\":1,DBus:2,GLib:2,CCode:10,Gee:10,Object:1},literal:{\"false\":1,\"true\":1,\"null\":1}},c:[{cN:\"class\",b:\"(class |interface |delegate |namespace )\",e:\"{\",k:{\"class\":1,\"interface\":1},c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1}},{cN:\"title\",b:hljs.UIR}]},hljs.CLCM,hljs.CBLCLM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',r:5},hljs.ASM,hljs.QSM,hljs.CNM,{cN:\"preprocessor\",b:\"^#\",e:\"$\",r:2},{cN:\"constant\",b:\" [A-Z_]+ \",r:0}]}};hljs.LANGUAGES.ini={cI:true,dM:{i:\"[^\\\\s]\",c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9_\\\\[\\\\]]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:{on:1,off:1,\"true\":1,\"false\":1,yes:1,no:1},c:[hljs.QSM,hljs.NM]}]}]}};hljs.LANGUAGES.axapta={dM:{k:{\"false\":1,\"int\":1,\"abstract\":1,\"private\":1,\"char\":1,\"interface\":1,\"boolean\":1,\"static\":1,\"null\":1,\"if\":1,\"for\":1,\"true\":1,\"while\":1,\"long\":1,\"throw\":1,\"finally\":1,\"protected\":1,\"extends\":1,\"final\":1,\"implements\":1,\"return\":1,\"void\":1,\"enum\":1,\"else\":1,\"break\":1,\"new\":1,\"catch\":1,\"byte\":1,\"super\":1,\"class\":1,\"case\":1,\"short\":1,\"default\":1,\"double\":1,\"public\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,reverse:1,firstfast:1,firstonly:1,forupdate:1,nofetch:1,sum:1,avg:1,minof:1,maxof:1,count:1,order:1,group:1,by:1,asc:1,desc:1,index:1,hint:1,like:1,dispaly:1,edit:1,client:1,server:1,ttsbegin:1,ttscommit:1,str:1,real:1,date:1,container:1,anytype:1,common:1,div:1,mod:1},c:[hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(class |interface )\",e:\"{\",i:\":\",k:{\"class\":1,\"interface\":1},c:[{cN:\"inheritance\",b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:10},{cN:\"title\",b:hljs.UIR}]}]}};hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,\"do\":1,\"return\":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,\"continue\":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,\"for\":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,\"goto\":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,\"int\":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,\"else\":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,\"while\":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,\"delete\":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,\"package\":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,\"if\":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,\"eval\":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var e={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:c,r:10};var b={cN:\"variable\",b:\"\\\\$\\\\d\"};var a={cN:\"variable\",b:\"[\\\\$\\\\%\\\\@\\\\*](\\\\^\\\\w\\\\b|#\\\\w+(\\\\:\\\\:\\\\w+)*|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+(\\\\:\\\\:\\\\w*)*)\"};var h=[hljs.BE,e,b,a];var g={b:\"->\",c:[{b:hljs.IR},{b:\"{\",e:\"}\"}]};var d={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var f=[b,a,hljs.HCM,d,g,{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",c:h,r:5},{cN:\"string\",b:\"qw\\\\s+q\",e:\"q\",c:h,r:5},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE],r:0},{cN:\"string\",b:'\"',e:'\"',c:h,r:0},{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},{cN:\"string\",b:\"{\\\\w+}\",r:0},{cN:\"string\",b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\"+hljs.RSR+\"|split|return|print|reverse|grep)\\\\s*\",k:{split:1,\"return\":1,print:1,reverse:1,grep:1},r:0,c:[hljs.HCM,d,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[hljs.BE],r:0}]},{cN:\"sub\",b:\"\\\\bsub\\\\b\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",k:{sub:1},r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0},{cN:\"pod\",b:\"\\\\=\\\\w\",e:\"\\\\=cut\"}];e.c=f;g.c[1].c=f;return{dM:{k:c,c:f}}}();hljs.LANGUAGES.scala=function(){var a={cN:\"annotation\",b:\"@[A-Za-z]+\"};var b={cN:\"string\",b:'u?r?\"\"\"',e:'\"\"\"',r:10};return{dM:{k:{type:1,yield:1,lazy:1,override:1,def:1,\"with\":1,val:1,\"var\":1,\"false\":1,\"true\":1,sealed:1,\"abstract\":1,\"private\":1,trait:1,object:1,\"null\":1,\"if\":1,\"for\":1,\"while\":1,\"throw\":1,\"finally\":1,\"protected\":1,\"extends\":1,\"import\":1,\"final\":1,\"return\":1,\"else\":1,\"break\":1,\"new\":1,\"catch\":1,\"super\":1,\"class\":1,\"case\":1,\"package\":1,\"default\":1,\"try\":1,\"this\":1,match:1,\"continue\":1,\"throws\":1},c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,b,{cN:\"class\",b:\"((case )?class |object |trait )\",e:\"({|$)\",i:\":\",k:{\"case\":1,\"class\":1,trait:1,object:1},c:[{b:\"(extends|with)\",k:{\"extends\":1,\"with\":1},r:10},{cN:\"title\",b:hljs.UIR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,b,a]}]},hljs.CNM,a]}}}();hljs.LANGUAGES.cmake={cI:true,dM:{k:{add_custom_command:2,add_custom_target:2,add_definitions:2,add_dependencies:2,add_executable:2,add_library:2,add_subdirectory:2,add_test:2,aux_source_directory:2,\"break\":1,build_command:2,cmake_minimum_required:3,cmake_policy:3,configure_file:1,create_test_sourcelist:1,define_property:1,\"else\":1,elseif:1,enable_language:2,enable_testing:2,endforeach:1,endfunction:1,endif:1,endmacro:1,endwhile:1,execute_process:2,\"export\":1,find_file:1,find_library:2,find_package:2,find_path:1,find_program:1,fltk_wrap_ui:2,foreach:1,\"function\":1,get_cmake_property:3,get_directory_property:1,get_filename_component:1,get_property:1,get_source_file_property:1,get_target_property:1,get_test_property:1,\"if\":1,include:1,include_directories:2,include_external_msproject:1,include_regular_expression:2,install:1,link_directories:1,load_cache:1,load_command:1,macro:1,mark_as_advanced:1,message:1,option:1,output_required_files:1,project:1,qt_wrap_cpp:2,qt_wrap_ui:2,remove_definitions:2,\"return\":1,separate_arguments:1,set:1,set_directory_properties:1,set_property:1,set_source_files_properties:1,set_target_properties:1,set_tests_properties:1,site_name:1,source_group:1,string:1,target_link_libraries:2,try_compile:2,try_run:2,unset:1,variable_watch:2,\"while\":1,build_name:1,exec_program:1,export_library_dependencies:1,install_files:1,install_programs:1,install_targets:1,link_libraries:1,make_directory:1,remove:1,subdir_depends:1,subdirs:1,use_mangled_mesa:1,utility_source:1,variable_requires:1,write_file:1},c:[{cN:\"envvar\",b:\"\\\\${\",e:\"}\"},hljs.HCM,hljs.QSM,hljs.NM]}};hljs.LANGUAGES.objectivec=function(){var a={keyword:{\"false\":1,\"int\":1,\"float\":1,\"while\":1,\"private\":1,\"char\":1,\"catch\":1,\"export\":1,sizeof:2,typedef:2,\"const\":1,struct:1,\"for\":1,union:1,unsigned:1,\"long\":1,\"volatile\":2,\"static\":1,\"protected\":1,bool:1,mutable:1,\"if\":1,\"public\":1,\"do\":1,\"return\":1,\"goto\":1,\"void\":2,\"enum\":1,\"else\":1,\"break\":1,extern:1,\"true\":1,\"class\":1,asm:1,\"case\":1,\"short\":1,\"default\":1,\"double\":1,\"throw\":1,register:1,explicit:1,signed:1,typename:1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,wchar_t:1,inline:1,readonly:1,assign:1,property:1,protocol:10,self:1,\"synchronized\":1,end:1,synthesize:50,id:1,optional:1,required:1,implementation:10,nonatomic:1,\"interface\":1,\"super\":1,unichar:1,\"finally\":2,dynamic:2,nil:1},built_in:{YES:5,NO:5,NULL:1,IBOutlet:50,IBAction:50,NSString:50,NSDictionary:50,CGRect:50,CGPoint:50,NSRange:50,release:1,retain:1,autorelease:50,UIButton:50,UILabel:50,UITextView:50,UIWebView:50,MKMapView:50,UISegmentedControl:50,NSObject:50,UITableViewDelegate:50,UITableViewDataSource:50,NSThread:50,UIActivityIndicator:50,UITabbar:50,UIToolBar:50,UIBarButtonItem:50,UIImageView:50,NSAutoreleasePool:50,UITableView:50,BOOL:1,NSInteger:20,CGFloat:20,NSException:50,NSLog:50,NSMutableString:50,NSMutableArray:50,NSMutableDictionary:50,NSURL:50}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.CNM,hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"interface|class|protocol|implementation\",e:\"({|$)\",k:{\"interface\":1,\"class\":1,protocol:5,implementation:5},c:[{cN:\"id\",b:hljs.UIR}]}]}}}();hljs.LANGUAGES.avrasm={cI:true,dM:{k:{keyword:{adc:1,add:1,adiw:1,and:1,andi:1,asr:1,bclr:1,bld:1,brbc:1,brbs:1,brcc:1,brcs:1,\"break\":1,breq:1,brge:1,brhc:1,brhs:1,brid:1,brie:1,brlo:1,brlt:1,brmi:1,brne:1,brpl:1,brsh:1,brtc:1,brts:1,brvc:1,brvs:1,bset:1,bst:1,call:1,cbi:1,cbr:1,clc:1,clh:1,cli:1,cln:1,clr:1,cls:1,clt:1,clv:1,clz:1,com:1,cp:1,cpc:1,cpi:1,cpse:1,dec:1,eicall:1,eijmp:1,elpm:1,eor:1,fmul:1,fmuls:1,fmulsu:1,icall:1,ijmp:1,\"in\":1,inc:1,jmp:1,ld:1,ldd:1,ldi:1,lds:1,lpm:1,lsl:1,lsr:1,mov:1,movw:1,mul:1,muls:1,mulsu:1,neg:1,nop:1,or:1,ori:1,out:1,pop:1,push:1,rcall:1,ret:1,reti:1,rjmp:1,rol:1,ror:1,sbc:1,sbr:1,sbrc:1,sbrs:1,sec:1,seh:1,sbi:1,sbci:1,sbic:1,sbis:1,sbiw:1,sei:1,sen:1,ser:1,ses:1,set:1,sev:1,sez:1,sleep:1,spm:1,st:1,std:1,sts:1,sub:1,subi:1,swap:1,tst:1,wdr:1},built_in:{r0:1,r1:1,r2:1,r3:1,r4:1,r5:1,r6:1,r7:1,r8:1,r9:1,r10:1,r11:1,r12:1,r13:1,r14:1,r15:1,r16:1,r17:1,r18:1,r19:1,r20:1,r21:1,r22:1,r23:1,r24:1,r25:1,r26:1,r27:1,r28:1,r29:1,r30:1,r31:1,x:1,xh:1,xl:1,y:1,yh:1,yl:1,z:1,zh:1,zl:1,ucsr1c:1,udr1:1,ucsr1a:1,ucsr1b:1,ubrr1l:1,ubrr1h:1,ucsr0c:1,ubrr0h:1,tccr3c:1,tccr3a:1,tccr3b:1,tcnt3h:1,tcnt3l:1,ocr3ah:1,ocr3al:1,ocr3bh:1,ocr3bl:1,ocr3ch:1,ocr3cl:1,icr3h:1,icr3l:1,etimsk:1,etifr:1,tccr1c:1,ocr1ch:1,ocr1cl:1,twcr:1,twdr:1,twar:1,twsr:1,twbr:1,osccal:1,xmcra:1,xmcrb:1,eicra:1,spmcsr:1,spmcr:1,portg:1,ddrg:1,ping:1,portf:1,ddrf:1,sreg:1,sph:1,spl:1,xdiv:1,rampz:1,eicrb:1,eimsk:1,gimsk:1,gicr:1,eifr:1,gifr:1,timsk:1,tifr:1,mcucr:1,mcucsr:1,tccr0:1,tcnt0:1,ocr0:1,assr:1,tccr1a:1,tccr1b:1,tcnt1h:1,tcnt1l:1,ocr1ah:1,ocr1al:1,ocr1bh:1,ocr1bl:1,icr1h:1,icr1l:1,tccr2:1,tcnt2:1,ocr2:1,ocdr:1,wdtcr:1,sfior:1,eearh:1,eearl:1,eedr:1,eecr:1,porta:1,ddra:1,pina:1,portb:1,ddrb:1,pinb:1,portc:1,ddrc:1,pinc:1,portd:1,ddrd:1,pind:1,spdr:1,spsr:1,spcr:1,udr0:1,ucsr0a:1,ucsr0b:1,ubrr0l:1,acsr:1,admux:1,adcsr:1,adch:1,adcl:1,porte:1,ddre:1,pine:1,pinf:1}},c:[hljs.CBLCLM,{cN:\"comment\",b:\";\",e:\"$\"},hljs.CNM,hljs.BNM,{cN:\"number\",b:\"\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)\"},hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"label\",b:\"^[A-Za-z0-9_.$]+:\"},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"preprocessor\",b:\"\\\\.[a-zA-Z]+\"},{cN:\"localvars\",b:\"@[0-9]+\"}]}};hljs.LANGUAGES.vhdl={cI:true,dM:{k:{keyword:{abs:1,access:1,after:1,alias:1,all:1,and:1,architecture:2,array:1,assert:1,attribute:1,begin:1,block:1,body:1,buffer:1,bus:1,\"case\":1,component:2,configuration:1,constant:1,disconnect:2,downto:2,\"else\":1,elsif:1,end:1,entity:2,exit:1,file:1,\"for\":1,\"function\":1,generate:2,generic:2,group:1,guarded:2,\"if\":0,impure:2,\"in\":1,inertial:1,inout:1,is:1,label:1,library:1,linkage:1,literal:1,loop:1,map:1,mod:1,nand:1,\"new\":1,next:1,nor:1,not:1,\"null\":1,of:1,on:1,open:1,or:1,others:1,out:1,\"package\":1,port:2,postponed:1,procedure:1,process:1,pure:2,range:1,record:1,register:1,reject:1,\"return\":1,rol:1,ror:1,select:1,severity:1,signal:1,shared:1,sla:1,sli:1,sra:1,srl:1,subtype:2,then:1,to:1,transport:1,type:1,units:1,until:1,use:1,variable:1,wait:1,when:1,\"while\":1,\"with\":1,xnor:1,xor:1},type:{\"boolean\":1,bit:1,character:1,severity_level:2,integer:1,time:1,delay_length:2,natural:1,positive:1,string:1,bit_vector:2,file_open_kind:2,file_open_status:2,std_ulogic:2,std_ulogic_vector:2,std_logic:2,std_logic_vector:2}},i:\"{\",c:[{cN:\"comment\",b:\"--\",e:\"$\"},hljs.QSM,hljs.CNM,{cN:\"literal\",b:\"'(U|X|0|1|Z|W|L|H|-)\",e:\"'\",c:[hljs.BE]}]}};hljs.LANGUAGES.coffeescript=function(){var d={keyword:{\"in\":1,\"if\":1,\"for\":1,\"while\":1,\"finally\":1,\"new\":1,\"do\":1,\"return\":1,\"else\":1,\"break\":1,\"catch\":1,\"instanceof\":1,\"throw\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"typeof\":1,\"delete\":1,\"debugger\":1,\"class\":1,\"extends\":1,\"super\":1,then:1,unless:1,until:1,loop:2,of:2,by:1,when:2,and:1,or:1,is:1,isnt:2,not:1},literal:{\"true\":1,\"false\":1,\"null\":1,\"undefined\":1,yes:1,no:1,on:1,off:1},reserved:{\"case\":1,\"default\":1,\"function\":1,\"var\":1,\"void\":1,\"with\":1,\"const\":1,let:1,\"enum\":1,\"export\":1,\"import\":1,\"native\":1,__hasProp:1,__extends:1,__slice:1,__bind:1,__indexOf:1}};var a=\"[A-Za-z$_][0-9A-Za-z$_]*\";var b={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:d,c:[hljs.CNM,hljs.BNM]};var c={cN:\"string\",b:'\"',e:'\"',r:0,c:[hljs.BE,b]};var h={cN:\"string\",b:'\"\"\"',e:'\"\"\"',c:[hljs.BE,b]};var g={cN:\"comment\",b:\"###\",e:\"###\"};var f={cN:\"regexp\",b:\"///\",e:\"///\",c:[hljs.HCM]};var i={cN:\"function\",b:a+\"\\\\s*=\\\\s*(\\\\(.+\\\\))?\\\\s*[-=]>\",rB:true,c:[{cN:\"title\",b:a},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]};var e={cN:\"javascript\",b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"};return{dM:{k:d,c:[hljs.CNM,hljs.BNM,hljs.ASM,h,c,g,hljs.HCM,f,e,i]}}}();hljs.LANGUAGES.nginx=function(){var c={cN:\"variable\",b:\"\\\\$\\\\d+\"};var b={cN:\"variable\",b:\"\\\\${\",e:\"}\"};var a={cN:\"variable\",b:\"[\\\\$\\\\@]\"+hljs.UIR};return{dM:{c:[hljs.HCM,{b:hljs.UIR,e:\";|{\",rE:true,k:{accept_mutex:1,accept_mutex_delay:1,access_log:1,add_after_body:1,add_before_body:1,add_header:1,addition_types:1,alias:1,allow:1,ancient_browser:1,ancient_browser_value:1,auth_basic:1,auth_basic_user_file:1,autoindex:1,autoindex_exact_size:1,autoindex_localtime:1,\"break\":1,charset:1,charset_map:1,charset_types:1,client_body_buffer_size:1,client_body_in_file_only:1,client_body_in_single_buffer:1,client_body_temp_path:1,client_body_timeout:1,client_header_buffer_size:1,client_header_timeout:1,client_max_body_size:1,connection_pool_size:1,connections:1,create_full_put_path:1,daemon:1,dav_access:1,dav_methods:1,debug_connection:1,debug_points:1,default_type:1,deny:1,directio:1,directio_alignment:1,echo:1,echo_after_body:1,echo_before_body:1,echo_blocking_sleep:1,echo_duplicate:1,echo_end:1,echo_exec:1,echo_flush:1,echo_foreach_split:1,echo_location:1,echo_location_async:1,echo_read_request_body:1,echo_request_body:1,echo_reset_timer:1,echo_sleep:1,echo_subrequest:1,echo_subrequest_async:1,empty_gif:1,env:1,error_log:1,error_page:1,events:1,expires:1,fastcgi_bind:1,fastcgi_buffer_size:1,fastcgi_buffers:1,fastcgi_busy_buffers_size:1,fastcgi_cache:1,fastcgi_cache_key:1,fastcgi_cache_methods:1,fastcgi_cache_min_uses:1,fastcgi_cache_path:1,fastcgi_cache_use_stale:1,fastcgi_cache_valid:1,fastcgi_catch_stderr:1,fastcgi_connect_timeout:1,fastcgi_hide_header:1,fastcgi_ignore_client_abort:1,fastcgi_ignore_headers:1,fastcgi_index:1,fastcgi_intercept_errors:1,fastcgi_max_temp_file_size:1,fastcgi_next_upstream:1,fastcgi_param:1,fastcgi_pass:1,fastcgi_pass_header:1,fastcgi_pass_request_body:1,fastcgi_pass_request_headers:1,fastcgi_read_timeout:1,fastcgi_send_lowat:1,fastcgi_send_timeout:1,fastcgi_split_path_info:1,fastcgi_store:1,fastcgi_store_access:1,fastcgi_temp_file_write_size:1,fastcgi_temp_path:1,fastcgi_upstream_fail_timeout:1,fastcgi_upstream_max_fails:1,flv:1,geo:1,geoip_city:1,geoip_country:1,gzip:1,gzip_buffers:1,gzip_comp_level:1,gzip_disable:1,gzip_hash:1,gzip_http_version:1,gzip_min_length:1,gzip_no_buffer:1,gzip_proxied:1,gzip_static:1,gzip_types:1,gzip_vary:1,gzip_window:1,http:1,\"if\":1,if_modified_since:1,ignore_invalid_headers:1,image_filter:1,image_filter_buffer:1,image_filter_jpeg_quality:1,image_filter_transparency:1,include:1,index:1,internal:1,ip_hash:1,js:1,js_load:1,js_require:1,js_utf8:1,keepalive_requests:1,keepalive_timeout:1,kqueue_changes:1,kqueue_events:1,large_client_header_buffers:1,limit_conn:1,limit_conn_log_level:1,limit_except:1,limit_rate:1,limit_rate_after:1,limit_req:1,limit_req_log_level:1,limit_req_zone:1,limit_zone:1,lingering_time:1,lingering_timeout:1,listen:1,location:1,lock_file:1,log_format:1,log_not_found:1,log_subrequest:1,map:1,map_hash_bucket_size:1,map_hash_max_size:1,master_process:1,memcached_bind:1,memcached_buffer_size:1,memcached_connect_timeout:1,memcached_next_upstream:1,memcached_pass:1,memcached_read_timeout:1,memcached_send_timeout:1,memcached_upstream_fail_timeout:1,memcached_upstream_max_fails:1,merge_slashes:1,min_delete_depth:1,modern_browser:1,modern_browser_value:1,more_clear_headers:1,more_clear_input_headers:1,more_set_headers:1,more_set_input_headers:1,msie_padding:1,msie_refresh:1,multi_accept:1,open_file_cache:1,open_file_cache_errors:1,open_file_cache_events:1,open_file_cache_min_uses:1,open_file_cache_retest:1,open_file_cache_valid:1,open_log_file_cache:1,optimize_server_names:1,output_buffers:1,override_charset:1,perl:1,perl_modules:1,perl_require:1,perl_set:1,pid:1,port_in_redirect:1,post_action:1,postpone_gzipping:1,postpone_output:1,proxy_bind:1,proxy_buffer_size:1,proxy_buffering:1,proxy_buffers:1,proxy_busy_buffers_size:1,proxy_cache:1,proxy_cache_key:1,proxy_cache_methods:1,proxy_cache_min_uses:1,proxy_cache_path:1,proxy_cache_use_stale:1,proxy_cache_valid:1,proxy_connect_timeout:1,proxy_headers_hash_bucket_size:1,proxy_headers_hash_max_size:1,proxy_hide_header:1,proxy_ignore_client_abort:1,proxy_ignore_headers:1,proxy_intercept_errors:1,proxy_max_temp_file_size:1,proxy_method:1,proxy_next_upstream:1,proxy_pass:1,proxy_pass_header:1,proxy_pass_request_body:1,proxy_pass_request_headers:1,proxy_read_timeout:1,proxy_redirect:1,proxy_send_lowat:1,proxy_send_timeout:1,proxy_set_body:1,proxy_set_header:1,proxy_store:1,proxy_store_access:1,proxy_temp_file_write_size:1,proxy_temp_path:1,proxy_upstream_fail_timeout:1,proxy_upstream_max_fails:1,push_authorized_channels_only:1,push_channel_group:1,push_max_channel_id_length:1,push_max_channel_subscribers:1,push_max_message_buffer_length:1,push_max_reserved_memory:1,push_message_buffer_length:1,push_message_timeout:1,push_min_message_buffer_length:1,push_min_message_recipients:1,push_publisher:1,push_store_messages:1,push_subscriber:1,push_subscriber_concurrency:1,random_index:1,read_ahead:1,real_ip_header:1,recursive_error_pages:1,request_pool_size:1,reset_timedout_connection:1,resolver:1,resolver_timeout:1,\"return\":1,rewrite:1,rewrite_log:1,root:1,satisfy:1,satisfy_any:1,send_lowat:1,send_timeout:1,sendfile:1,sendfile_max_chunk:1,server:1,server_name:1,server_name_in_redirect:1,server_names_hash_bucket_size:1,server_names_hash_max_size:1,server_tokens:1,set:1,set_real_ip_from:1,source_charset:1,ssi:1,ssi_ignore_recycled_buffers:1,ssi_min_file_chunk:1,ssi_silent_errors:1,ssi_types:1,ssi_value_length:1,ssl:1,ssl_certificate:1,ssl_certificate_key:1,ssl_ciphers:1,ssl_client_certificate:1,ssl_crl:1,ssl_dhparam:1,ssl_prefer_server_ciphers:1,ssl_protocols:1,ssl_session_cache:1,ssl_session_timeout:1,ssl_verify_client:1,ssl_verify_depth:1,sub_filter:1,sub_filter_once:1,sub_filter_types:1,tcp_nodelay:1,tcp_nopush:1,timer_resolution:1,try_files:1,types:1,types_hash_bucket_size:1,types_hash_max_size:1,underscores_in_headers:1,uninitialized_variable_warn:1,upstream:1,use:1,user:1,userid:1,userid_domain:1,userid_expires:1,userid_mark:1,userid_name:1,userid_p3p:1,userid_path:1,userid_service:1,valid_referers:1,variables_hash_bucket_size:1,variables_hash_max_size:1,worker_connections:1,worker_cpu_affinity:1,worker_priority:1,worker_processes:1,worker_rlimit_core:1,worker_rlimit_nofile:1,worker_rlimit_sigpending:1,working_directory:1,xml_entities:1,xslt_stylesheet:1,xslt_types:1},r:0,c:[hljs.HCM,{b:\"\\\\s\",e:\"[;{]\",rB:true,rE:true,l:\"[a-z/]+\",k:{built_in:{on:1,off:1,yes:1,no:1,\"true\":1,\"false\":1,none:1,blocked:1,debug:1,info:1,notice:1,warn:1,error:1,crit:1,select:1,permanent:1,redirect:1,kqueue:1,rtsig:1,epoll:1,poll:1,\"/dev/poll\":1}},r:0,c:[hljs.HCM,{cN:\"string\",b:'\"',e:'\"',c:[hljs.BE,c,b,a],r:0},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,c,b,a],r:0},{cN:\"string\",b:\"([a-z]+):/\",e:\"[;\\\\s]\",rE:true},{cN:\"regexp\",b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true,c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true,c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"\\\\*(\\\\.[a-z\\\\-]+)+\",c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"([a-z\\\\-]+\\\\.)+\\\\*\",c:[hljs.BE,c,b,a]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\b\"},{cN:\"number\",b:\"\\\\s\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},c,b,a]}]}]}}}();hljs.LANGUAGES.erlang_repl={dM:{k:{special_functions:{spawn:10,spawn_link:10,self:2},reserved:{after:1,and:1,andalso:5,band:1,begin:1,bnot:1,bor:1,bsl:1,bsr:1,bxor:1,\"case\":1,\"catch\":0,cond:1,div:1,end:1,fun:0,\"if\":0,let:1,not:0,of:1,or:1,orelse:5,query:1,receive:0,rem:1,\"try\":0,when:1,xor:1}},c:[{cN:\"input_number\",b:\"^[0-9]+> \",r:10},{cN:\"comment\",b:\"%\",e:\"$\"},{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0},hljs.ASM,hljs.QSM,{cN:\"constant\",b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{cN:\"arrow\",b:\"->\"},{cN:\"ok\",b:\"ok\"},{cN:\"exclamation_mark\",b:\"!\"},{cN:\"function_or_atom\",b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",r:0},{cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_']*\",r:0}]}};hljs.LANGUAGES.django=function(){function c(f,e){return(e==undefined||(!f.cN&&e.cN==\"tag\")||f.cN==\"value\")}function d(j,e){var h={};for(var g in j){if(g!=\"contains\"){h[g]=j[g]}var k=[];for(var f=0;j.c&&f<j.c.length;f++){k.push(d(j.c[f],j))}if(c(j,e)){k=b.concat(k)}if(k.length){h.c=k}}return h}var a={cN:\"filter\",b:\"\\\\|[A-Za-z]+\\\\:?\",eE:true,k:{truncatewords:1,removetags:1,linebreaksbr:1,yesno:1,get_digit:1,timesince:1,random:1,striptags:1,filesizeformat:1,escape:1,linebreaks:1,length_is:1,ljust:1,rjust:1,cut:1,urlize:1,fix_ampersands:1,title:1,floatformat:1,capfirst:1,pprint:1,divisibleby:1,add:1,make_list:1,unordered_list:1,urlencode:1,timeuntil:1,urlizetrunc:1,wordcount:1,stringformat:1,linenumbers:1,slice:1,date:1,dictsort:1,dictsortreversed:1,default_if_none:1,pluralize:1,lower:1,join:1,center:1,\"default\":1,truncatewords_html:1,upper:1,length:1,phone2numeric:1,wordwrap:1,time:1,addslashes:1,slugify:1,first:1},c:[{cN:\"argument\",b:'\"',e:'\"'}]};var b=[{cN:\"template_comment\",b:\"{%\\\\s*comment\\\\s*%}\",e:\"{%\\\\s*endcomment\\\\s*%}\"},{cN:\"template_comment\",b:\"{#\",e:\"#}\"},{cN:\"template_tag\",b:\"{%\",e:\"%}\",k:{comment:1,endcomment:1,load:1,templatetag:1,ifchanged:1,endifchanged:1,\"if\":1,endif:1,firstof:1,\"for\":1,endfor:1,\"in\":1,ifnotequal:1,endifnotequal:1,widthratio:1,\"extends\":1,include:1,spaceless:1,endspaceless:1,regroup:1,by:1,as:1,ifequal:1,endifequal:1,ssi:1,now:1,\"with\":1,cycle:1,url:1,filter:1,endfilter:1,debug:1,block:1,endblock:1,\"else\":1},c:[a]},{cN:\"variable\",b:\"{{\",e:\"}}\",c:[a]}];return{cI:true,dM:d(hljs.LANGUAGES.xml.dM)}}();hljs.LANGUAGES.delphi=function(){var a={and:1,safecall:1,cdecl:1,then:1,string:1,exports:1,library:1,not:1,pascal:1,set:1,virtual:1,file:1,\"in\":1,array:1,label:1,packed:1,\"end.\":1,index:1,\"while\":1,\"const\":1,raise:1,\"for\":1,to:1,implementation:1,\"with\":1,except:1,overload:1,destructor:1,downto:1,\"finally\":1,program:1,exit:1,unit:1,inherited:1,override:1,\"if\":1,type:1,until:1,\"function\":1,\"do\":1,begin:1,repeat:1,\"goto\":1,nil:1,far:1,initialization:1,object:1,\"else\":1,\"var\":1,uses:1,external:1,resourcestring:1,\"interface\":1,end:1,finalization:1,\"class\":1,asm:1,mod:1,\"case\":1,on:1,shr:1,shl:1,of:1,register:1,xorwrite:1,threadvar:1,\"try\":1,record:1,near:1,stored:1,constructor:1,stdcall:1,inline:1,div:1,out:1,or:1,procedure:1};var c={safecall:1,stdcall:1,pascal:1,stored:1,\"const\":1,implementation:1,finalization:1,except:1,to:1,\"finally\":1,program:1,inherited:1,override:1,then:1,exports:1,string:1,read:1,not:1,mod:1,shr:1,\"try\":1,div:1,shl:1,set:1,library:1,message:1,packed:1,index:1,\"for\":1,near:1,overload:1,label:1,downto:1,exit:1,\"public\":1,\"goto\":1,\"interface\":1,asm:1,on:1,of:1,constructor:1,or:1,\"private\":1,array:1,unit:1,raise:1,destructor:1,\"var\":1,type:1,until:1,\"function\":1,\"else\":1,external:1,\"with\":1,\"case\":1,\"default\":1,record:1,\"while\":1,\"protected\":1,property:1,procedure:1,published:1,and:1,cdecl:1,\"do\":1,threadvar:1,file:1,\"in\":1,\"if\":1,end:1,virtual:1,write:1,far:1,out:1,begin:1,repeat:1,nil:1,initialization:1,object:1,uses:1,resourcestring:1,\"class\":1,register:1,xorwrite:1,inline:1,\"static\":1};var f={cN:\"comment\",b:\"{\",e:\"}\",r:0};var e={cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",r:10};var d={cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}],r:0};var b={cN:\"string\",b:\"(#\\\\d+)+\"};var g={cN:\"function\",b:\"(procedure|constructor|destructor|function)\\\\b\",e:\"[:;]\",k:{\"function\":1,constructor:10,destructor:10,procedure:10},c:[{cN:\"title\",b:hljs.IR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:a,c:[d,b]},f,e]};return{cI:true,dM:{k:a,i:'(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',c:[f,e,hljs.CLCM,d,b,hljs.NM,g,{cN:\"class\",b:\"=\\\\bclass\\\\b\",e:\"end;\",k:c,c:[d,b,f,e,hljs.CLCM,g]}]}}}();hljs.LANGUAGES.vbscript={cI:true,dM:{k:{keyword:{call:1,\"class\":1,\"const\":1,dim:1,\"do\":1,loop:1,erase:1,execute:1,executeglobal:1,exit:1,\"for\":1,each:1,next:1,\"function\":1,\"if\":1,then:1,\"else\":1,on:1,error:1,option:1,explicit:1,\"new\":1,\"private\":1,property:1,let:1,get:1,\"public\":1,randomize:1,redim:1,rem:1,select:1,\"case\":1,set:1,stop:1,sub:1,\"while\":1,wend:1,\"with\":1,end:1,to:1,elseif:1,is:1,or:1,xor:1,and:1,not:1,class_initialize:1,class_terminate:1,\"default\":1,preserve:1,\"in\":1,me:1,byval:1,byref:1,step:1,resume:1,\"goto\":1},built_in:{lcase:1,month:1,vartype:1,instrrev:1,ubound:1,setlocale:1,getobject:1,rgb:1,getref:1,string:1,weekdayname:1,rnd:1,dateadd:1,monthname:1,now:1,day:1,minute:1,isarray:1,cbool:1,round:1,formatcurrency:1,conversions:1,csng:1,timevalue:1,second:1,year:1,space:1,abs:1,clng:1,timeserial:1,fixs:1,len:1,asc:1,isempty:1,maths:1,dateserial:1,atn:1,timer:1,isobject:1,filter:1,weekday:1,datevalue:1,ccur:1,isdate:1,instr:1,datediff:1,formatdatetime:1,replace:1,isnull:1,right:1,sgn:1,array:1,snumeric:1,log:1,cdbl:1,hex:1,chr:1,lbound:1,msgbox:1,ucase:1,getlocale:1,cos:1,cdate:1,cbyte:1,rtrim:1,join:1,hour:1,oct:1,typename:1,trim:1,strcomp:1,\"int\":1,createobject:1,loadpicture:1,tan:1,formatnumber:1,mid:1,scriptenginebuildversion:1,scriptengine:1,split:1,scriptengineminorversion:1,cint:1,sin:1,datepart:1,ltrim:1,sqr:1,scriptenginemajorversion:1,time:1,derived:1,\"eval\":1,date:1,formatpercent:1,exp:1,inputbox:1,left:1,ascw:1,chrw:1,regexp:1,server:1,response:1,request:1,cstr:1,err:1},literal:{\"true\":1,\"false\":1,\"null\":1,nothing:1,empty:1}},i:\"//\",c:[{cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[{b:'\"\"'}],r:0},{cN:\"comment\",b:\"'\",e:\"$\"},hljs.CNM]}};hljs.LANGUAGES.mel={dM:{k:{\"int\":1,\"float\":1,string:1,vector:1,matrix:1,\"if\":1,\"else\":1,\"switch\":1,\"case\":1,\"default\":1,\"while\":1,\"do\":1,\"for\":1,\"in\":1,\"break\":1,\"continue\":1,global:1,proc:1,\"return\":1,about:1,abs:1,addAttr:1,addAttributeEditorNodeHelp:1,addDynamic:1,addNewShelfTab:1,addPP:1,addPanelCategory:1,addPrefixToName:1,advanceToNextDrivenKey:1,affectedNet:1,affects:1,aimConstraint:1,air:1,alias:1,aliasAttr:1,align:1,alignCtx:1,alignCurve:1,alignSurface:1,allViewFit:1,ambientLight:1,angle:1,angleBetween:1,animCone:1,animCurveEditor:1,animDisplay:1,animView:1,annotate:1,appendStringArray:1,applicationName:1,applyAttrPreset:1,applyTake:1,arcLenDimContext:1,arcLengthDimension:1,arclen:1,arrayMapper:1,art3dPaintCtx:1,artAttrCtx:1,artAttrPaintVertexCtx:1,artAttrSkinPaintCtx:1,artAttrTool:1,artBuildPaintMenu:1,artFluidAttrCtx:1,artPuttyCtx:1,artSelectCtx:1,artSetPaintCtx:1,artUserPaintCtx:1,assignCommand:1,assignInputDevice:1,assignViewportFactories:1,attachCurve:1,attachDeviceAttr:1,attachSurface:1,attrColorSliderGrp:1,attrCompatibility:1,attrControlGrp:1,attrEnumOptionMenu:1,attrEnumOptionMenuGrp:1,attrFieldGrp:1,attrFieldSliderGrp:1,attrNavigationControlGrp:1,attrPresetEditWin:1,attributeExists:1,attributeInfo:1,attributeMenu:1,attributeQuery:1,autoKeyframe:1,autoPlace:1,bakeClip:1,bakeFluidShading:1,bakePartialHistory:1,bakeResults:1,bakeSimulation:1,basename:1,basenameEx:1,batchRender:1,bessel:1,bevel:1,bevelPlus:1,binMembership:1,bindSkin:1,blend2:1,blendShape:1,blendShapeEditor:1,blendShapePanel:1,blendTwoAttr:1,blindDataType:1,boneLattice:1,boundary:1,boxDollyCtx:1,boxZoomCtx:1,bufferCurve:1,buildBookmarkMenu:1,buildKeyframeMenu:1,button:1,buttonManip:1,CBG:1,cacheFile:1,cacheFileCombine:1,cacheFileMerge:1,cacheFileTrack:1,camera:1,cameraView:1,canCreateManip:1,canvas:1,capitalizeString:1,\"catch\":1,catchQuiet:1,ceil:1,changeSubdivComponentDisplayLevel:1,changeSubdivRegion:1,channelBox:1,character:1,characterMap:1,characterOutlineEditor:1,characterize:1,chdir:1,checkBox:1,checkBoxGrp:1,checkDefaultRenderGlobals:1,choice:1,circle:1,circularFillet:1,clamp:1,clear:1,clearCache:1,clip:1,clipEditor:1,clipEditorCurrentTimeCtx:1,clipSchedule:1,clipSchedulerOutliner:1,clipTrimBefore:1,closeCurve:1,closeSurface:1,cluster:1,cmdFileOutput:1,cmdScrollFieldExecuter:1,cmdScrollFieldReporter:1,cmdShell:1,coarsenSubdivSelectionList:1,collision:1,color:1,colorAtPoint:1,colorEditor:1,colorIndex:1,colorIndexSliderGrp:1,colorSliderButtonGrp:1,colorSliderGrp:1,columnLayout:1,commandEcho:1,commandLine:1,commandPort:1,compactHairSystem:1,componentEditor:1,compositingInterop:1,computePolysetVolume:1,condition:1,cone:1,confirmDialog:1,connectAttr:1,connectControl:1,connectDynamic:1,connectJoint:1,connectionInfo:1,constrain:1,constrainValue:1,constructionHistory:1,container:1,containsMultibyte:1,contextInfo:1,control:1,convertFromOldLayers:1,convertIffToPsd:1,convertLightmap:1,convertSolidTx:1,convertTessellation:1,convertUnit:1,copyArray:1,copyFlexor:1,copyKey:1,copySkinWeights:1,cos:1,cpButton:1,cpCache:1,cpClothSet:1,cpCollision:1,cpConstraint:1,cpConvClothToMesh:1,cpForces:1,cpGetSolverAttr:1,cpPanel:1,cpProperty:1,cpRigidCollisionFilter:1,cpSeam:1,cpSetEdit:1,cpSetSolverAttr:1,cpSolver:1,cpSolverTypes:1,cpTool:1,cpUpdateClothUVs:1,createDisplayLayer:1,createDrawCtx:1,createEditor:1,createLayeredPsdFile:1,createMotionField:1,createNewShelf:1,createNode:1,createRenderLayer:1,createSubdivRegion:1,cross:1,crossProduct:1,ctxAbort:1,ctxCompletion:1,ctxEditMode:1,ctxTraverse:1,currentCtx:1,currentTime:1,currentTimeCtx:1,currentUnit:1,currentUnit:1,curve:1,curveAddPtCtx:1,curveCVCtx:1,curveEPCtx:1,curveEditorCtx:1,curveIntersect:1,curveMoveEPCtx:1,curveOnSurface:1,curveSketchCtx:1,cutKey:1,cycleCheck:1,cylinder:1,dagPose:1,date:1,defaultLightListCheckBox:1,defaultNavigation:1,defineDataServer:1,defineVirtualDevice:1,deformer:1,deg_to_rad:1,\"delete\":1,deleteAttr:1,deleteShadingGroupsAndMaterials:1,deleteShelfTab:1,deleteUI:1,deleteUnusedBrushes:1,delrandstr:1,detachCurve:1,detachDeviceAttr:1,detachSurface:1,deviceEditor:1,devicePanel:1,dgInfo:1,dgdirty:1,dgeval:1,dgtimer:1,dimWhen:1,directKeyCtx:1,directionalLight:1,dirmap:1,dirname:1,disable:1,disconnectAttr:1,disconnectJoint:1,diskCache:1,displacementToPoly:1,displayAffected:1,displayColor:1,displayCull:1,displayLevelOfDetail:1,displayPref:1,displayRGBColor:1,displaySmoothness:1,displayStats:1,displayString:1,displaySurface:1,distanceDimContext:1,distanceDimension:1,doBlur:1,dolly:1,dollyCtx:1,dopeSheetEditor:1,dot:1,dotProduct:1,doubleProfileBirailSurface:1,drag:1,dragAttrContext:1,draggerContext:1,dropoffLocator:1,duplicate:1,duplicateCurve:1,duplicateSurface:1,dynCache:1,dynControl:1,dynExport:1,dynExpression:1,dynGlobals:1,dynPaintEditor:1,dynParticleCtx:1,dynPref:1,dynRelEdPanel:1,dynRelEditor:1,dynamicLoad:1,editAttrLimits:1,editDisplayLayerGlobals:1,editDisplayLayerMembers:1,editRenderLayerAdjustment:1,editRenderLayerGlobals:1,editRenderLayerMembers:1,editor:1,editorTemplate:1,effector:1,emit:1,emitter:1,enableDevice:1,encodeString:1,endString:1,endsWith:1,env:1,equivalent:1,equivalentTol:1,erf:1,error:1,\"eval\":1,\"eval\":1,evalDeferred:1,evalEcho:1,event:1,exactWorldBoundingBox:1,exclusiveLightCheckBox:1,exec:1,executeForEachObject:1,exists:1,exp:1,expression:1,expressionEditorListen:1,extendCurve:1,extendSurface:1,extrude:1,fcheck:1,fclose:1,feof:1,fflush:1,fgetline:1,fgetword:1,file:1,fileBrowserDialog:1,fileDialog:1,fileExtension:1,fileInfo:1,filetest:1,filletCurve:1,filter:1,filterCurve:1,filterExpand:1,filterStudioImport:1,findAllIntersections:1,findAnimCurves:1,findKeyframe:1,findMenuItem:1,findRelatedSkinCluster:1,finder:1,firstParentOf:1,fitBspline:1,flexor:1,floatEq:1,floatField:1,floatFieldGrp:1,floatScrollBar:1,floatSlider:1,floatSlider2:1,floatSliderButtonGrp:1,floatSliderGrp:1,floor:1,flow:1,fluidCacheInfo:1,fluidEmitter:1,fluidVoxelInfo:1,flushUndo:1,fmod:1,fontDialog:1,fopen:1,formLayout:1,format:1,fprint:1,frameLayout:1,fread:1,freeFormFillet:1,frewind:1,fromNativePath:1,fwrite:1,gamma:1,gauss:1,geometryConstraint:1,getApplicationVersionAsFloat:1,getAttr:1,getClassification:1,getDefaultBrush:1,getFileList:1,getFluidAttr:1,getInputDeviceRange:1,getMayaPanelTypes:1,getModifiers:1,getPanel:1,getParticleAttr:1,getPluginResource:1,getenv:1,getpid:1,glRender:1,glRenderEditor:1,globalStitch:1,gmatch:1,goal:1,gotoBindPose:1,grabColor:1,gradientControl:1,gradientControlNoAttr:1,graphDollyCtx:1,graphSelectContext:1,graphTrackCtx:1,gravity:1,grid:1,gridLayout:1,group:1,groupObjectsByName:1,HfAddAttractorToAS:1,HfAssignAS:1,HfBuildEqualMap:1,HfBuildFurFiles:1,HfBuildFurImages:1,HfCancelAFR:1,HfConnectASToHF:1,HfCreateAttractor:1,HfDeleteAS:1,HfEditAS:1,HfPerformCreateAS:1,HfRemoveAttractorFromAS:1,HfSelectAttached:1,HfSelectAttractors:1,HfUnAssignAS:1,hardenPointCurve:1,hardware:1,hardwareRenderPanel:1,headsUpDisplay:1,headsUpMessage:1,help:1,helpLine:1,hermite:1,hide:1,hilite:1,hitTest:1,hotBox:1,hotkey:1,hotkeyCheck:1,hsv_to_rgb:1,hudButton:1,hudSlider:1,hudSliderButton:1,hwReflectionMap:1,hwRender:1,hwRenderLoad:1,hyperGraph:1,hyperPanel:1,hyperShade:1,hypot:1,iconTextButton:1,iconTextCheckBox:1,iconTextRadioButton:1,iconTextRadioCollection:1,iconTextScrollList:1,iconTextStaticLabel:1,ikHandle:1,ikHandleCtx:1,ikHandleDisplayScale:1,ikSolver:1,ikSplineHandleCtx:1,ikSystem:1,ikSystemInfo:1,ikfkDisplayMethod:1,illustratorCurves:1,image:1,imfPlugins:1,inheritTransform:1,insertJoint:1,insertJointCtx:1,insertKeyCtx:1,insertKnotCurve:1,insertKnotSurface:1,instance:1,instanceable:1,instancer:1,intField:1,intFieldGrp:1,intScrollBar:1,intSlider:1,intSliderGrp:1,interToUI:1,internalVar:1,intersect:1,iprEngine:1,isAnimCurve:1,isConnected:1,isDirty:1,isParentOf:1,isSameObject:1,isTrue:1,isValidObjectName:1,isValidString:1,isValidUiName:1,isolateSelect:1,itemFilter:1,itemFilterAttr:1,itemFilterRender:1,itemFilterType:1,joint:1,jointCluster:1,jointCtx:1,jointDisplayScale:1,jointLattice:1,keyTangent:1,keyframe:1,keyframeOutliner:1,keyframeRegionCurrentTimeCtx:1,keyframeRegionDirectKeyCtx:1,keyframeRegionDollyCtx:1,keyframeRegionInsertKeyCtx:1,keyframeRegionMoveKeyCtx:1,keyframeRegionScaleKeyCtx:1,keyframeRegionSelectKeyCtx:1,keyframeRegionSetKeyCtx:1,keyframeRegionTrackCtx:1,keyframeStats:1,lassoContext:1,lattice:1,latticeDeformKeyCtx:1,launch:1,launchImageEditor:1,layerButton:1,layeredShaderPort:1,layeredTexturePort:1,layout:1,layoutDialog:1,lightList:1,lightListEditor:1,lightListPanel:1,lightlink:1,lineIntersection:1,linearPrecision:1,linstep:1,listAnimatable:1,listAttr:1,listCameras:1,listConnections:1,listDeviceAttachments:1,listHistory:1,listInputDeviceAxes:1,listInputDeviceButtons:1,listInputDevices:1,listMenuAnnotation:1,listNodeTypes:1,listPanelCategories:1,listRelatives:1,listSets:1,listTransforms:1,listUnselected:1,listerEditor:1,loadFluid:1,loadNewShelf:1,loadPlugin:1,loadPluginLanguageResources:1,loadPrefObjects:1,localizedPanelLabel:1,lockNode:1,loft:1,log:1,longNameOf:1,lookThru:1,ls:1,lsThroughFilter:1,lsType:1,lsUI:1,Mayatomr:1,mag:1,makeIdentity:1,makeLive:1,makePaintable:1,makeRoll:1,makeSingleSurface:1,makeTubeOn:1,makebot:1,manipMoveContext:1,manipMoveLimitsCtx:1,manipOptions:1,manipRotateContext:1,manipRotateLimitsCtx:1,manipScaleContext:1,manipScaleLimitsCtx:1,marker:1,match:1,max:1,memory:1,menu:1,menuBarLayout:1,menuEditor:1,menuItem:1,menuItemToShelf:1,menuSet:1,menuSetPref:1,messageLine:1,min:1,minimizeApp:1,mirrorJoint:1,modelCurrentTimeCtx:1,modelEditor:1,modelPanel:1,mouse:1,movIn:1,movOut:1,move:1,moveIKtoFK:1,moveKeyCtx:1,moveVertexAlongDirection:1,multiProfileBirailSurface:1,mute:1,nParticle:1,nameCommand:1,nameField:1,namespace:1,namespaceInfo:1,newPanelItems:1,newton:1,nodeCast:1,nodeIconButton:1,nodeOutliner:1,nodePreset:1,nodeType:1,noise:1,nonLinear:1,normalConstraint:1,normalize:1,nurbsBoolean:1,nurbsCopyUVSet:1,nurbsCube:1,nurbsEditUV:1,nurbsPlane:1,nurbsSelect:1,nurbsSquare:1,nurbsToPoly:1,nurbsToPolygonsPref:1,nurbsToSubdiv:1,nurbsToSubdivPref:1,nurbsUVSet:1,nurbsViewDirectionVector:1,objExists:1,objectCenter:1,objectLayer:1,objectType:1,objectTypeUI:1,obsoleteProc:1,oceanNurbsPreviewPlane:1,offsetCurve:1,offsetCurveOnSurface:1,offsetSurface:1,openGLExtension:1,openMayaPref:1,optionMenu:1,optionMenuGrp:1,optionVar:1,orbit:1,orbitCtx:1,orientConstraint:1,outlinerEditor:1,outlinerPanel:1,overrideModifier:1,paintEffectsDisplay:1,pairBlend:1,palettePort:1,paneLayout:1,panel:1,panelConfiguration:1,panelHistory:1,paramDimContext:1,paramDimension:1,paramLocator:1,parent:1,parentConstraint:1,particle:1,particleExists:1,particleInstancer:1,particleRenderInfo:1,partition:1,pasteKey:1,pathAnimation:1,pause:1,pclose:1,percent:1,performanceOptions:1,pfxstrokes:1,pickWalk:1,picture:1,pixelMove:1,planarSrf:1,plane:1,play:1,playbackOptions:1,playblast:1,plugAttr:1,plugNode:1,pluginInfo:1,pluginResourceUtil:1,pointConstraint:1,pointCurveConstraint:1,pointLight:1,pointMatrixMult:1,pointOnCurve:1,pointOnSurface:1,pointPosition:1,poleVectorConstraint:1,polyAppend:1,polyAppendFacetCtx:1,polyAppendVertex:1,polyAutoProjection:1,polyAverageNormal:1,polyAverageVertex:1,polyBevel:1,polyBlendColor:1,polyBlindData:1,polyBoolOp:1,polyBridgeEdge:1,polyCacheMonitor:1,polyCheck:1,polyChipOff:1,polyClipboard:1,polyCloseBorder:1,polyCollapseEdge:1,polyCollapseFacet:1,polyColorBlindData:1,polyColorDel:1,polyColorPerVertex:1,polyColorSet:1,polyCompare:1,polyCone:1,polyCopyUV:1,polyCrease:1,polyCreaseCtx:1,polyCreateFacet:1,polyCreateFacetCtx:1,polyCube:1,polyCut:1,polyCutCtx:1,polyCylinder:1,polyCylindricalProjection:1,polyDelEdge:1,polyDelFacet:1,polyDelVertex:1,polyDuplicateAndConnect:1,polyDuplicateEdge:1,polyEditUV:1,polyEditUVShell:1,polyEvaluate:1,polyExtrudeEdge:1,polyExtrudeFacet:1,polyExtrudeVertex:1,polyFlipEdge:1,polyFlipUV:1,polyForceUV:1,polyGeoSampler:1,polyHelix:1,polyInfo:1,polyInstallAction:1,polyLayoutUV:1,polyListComponentConversion:1,polyMapCut:1,polyMapDel:1,polyMapSew:1,polyMapSewMove:1,polyMergeEdge:1,polyMergeEdgeCtx:1,polyMergeFacet:1,polyMergeFacetCtx:1,polyMergeUV:1,polyMergeVertex:1,polyMirrorFace:1,polyMoveEdge:1,polyMoveFacet:1,polyMoveFacetUV:1,polyMoveUV:1,polyMoveVertex:1,polyNormal:1,polyNormalPerVertex:1,polyNormalizeUV:1,polyOptUvs:1,polyOptions:1,polyOutput:1,polyPipe:1,polyPlanarProjection:1,polyPlane:1,polyPlatonicSolid:1,polyPoke:1,polyPrimitive:1,polyPrism:1,polyProjection:1,polyPyramid:1,polyQuad:1,polyQueryBlindData:1,polyReduce:1,polySelect:1,polySelectConstraint:1,polySelectConstraintMonitor:1,polySelectCtx:1,polySelectEditCtx:1,polySeparate:1,polySetToFaceNormal:1,polySewEdge:1,polyShortestPathCtx:1,polySmooth:1,polySoftEdge:1,polySphere:1,polySphericalProjection:1,polySplit:1,polySplitCtx:1,polySplitEdge:1,polySplitRing:1,polySplitVertex:1,polyStraightenUVBorder:1,polySubdivideEdge:1,polySubdivideFacet:1,polyToSubdiv:1,polyTorus:1,polyTransfer:1,polyTriangulate:1,polyUVSet:1,polyUnite:1,polyWedgeFace:1,popen:1,popupMenu:1,pose:1,pow:1,preloadRefEd:1,print:1,progressBar:1,progressWindow:1,projFileViewer:1,projectCurve:1,projectTangent:1,projectionContext:1,projectionManip:1,promptDialog:1,propModCtx:1,propMove:1,psdChannelOutliner:1,psdEditTextureFile:1,psdExport:1,psdTextureFile:1,putenv:1,pwd:1,python:1,querySubdiv:1,quit:1,rad_to_deg:1,radial:1,radioButton:1,radioButtonGrp:1,radioCollection:1,radioMenuItemCollection:1,rampColorPort:1,rand:1,randomizeFollicles:1,randstate:1,rangeControl:1,readTake:1,rebuildCurve:1,rebuildSurface:1,recordAttr:1,recordDevice:1,redo:1,reference:1,referenceEdit:1,referenceQuery:1,refineSubdivSelectionList:1,refresh:1,refreshAE:1,registerPluginResource:1,rehash:1,reloadImage:1,removeJoint:1,removeMultiInstance:1,removePanelCategory:1,rename:1,renameAttr:1,renameSelectionList:1,renameUI:1,render:1,renderGlobalsNode:1,renderInfo:1,renderLayerButton:1,renderLayerParent:1,renderLayerPostProcess:1,renderLayerUnparent:1,renderManip:1,renderPartition:1,renderQualityNode:1,renderSettings:1,renderThumbnailUpdate:1,renderWindowEditor:1,renderWindowSelectContext:1,renderer:1,reorder:1,reorderDeformers:1,requires:1,reroot:1,resampleFluid:1,resetAE:1,resetPfxToPolyCamera:1,resetTool:1,resolutionNode:1,retarget:1,reverseCurve:1,reverseSurface:1,revolve:1,rgb_to_hsv:1,rigidBody:1,rigidSolver:1,roll:1,rollCtx:1,rootOf:1,rot:1,rotate:1,rotationInterpolation:1,roundConstantRadius:1,rowColumnLayout:1,rowLayout:1,runTimeCommand:1,runup:1,sampleImage:1,saveAllShelves:1,saveAttrPreset:1,saveFluid:1,saveImage:1,saveInitialState:1,saveMenu:1,savePrefObjects:1,savePrefs:1,saveShelf:1,saveToolSettings:1,scale:1,scaleBrushBrightness:1,scaleComponents:1,scaleConstraint:1,scaleKey:1,scaleKeyCtx:1,sceneEditor:1,sceneUIReplacement:1,scmh:1,scriptCtx:1,scriptEditorInfo:1,scriptJob:1,scriptNode:1,scriptTable:1,scriptToShelf:1,scriptedPanel:1,scriptedPanelType:1,scrollField:1,scrollLayout:1,sculpt:1,searchPathArray:1,seed:1,selLoadSettings:1,select:1,selectContext:1,selectCurveCV:1,selectKey:1,selectKeyCtx:1,selectKeyframeRegionCtx:1,selectMode:1,selectPref:1,selectPriority:1,selectType:1,selectedNodes:1,selectionConnection:1,separator:1,setAttr:1,setAttrEnumResource:1,setAttrMapping:1,setAttrNiceNameResource:1,setConstraintRestPosition:1,setDefaultShadingGroup:1,setDrivenKeyframe:1,setDynamic:1,setEditCtx:1,setEditor:1,setFluidAttr:1,setFocus:1,setInfinity:1,setInputDeviceMapping:1,setKeyCtx:1,setKeyPath:1,setKeyframe:1,setKeyframeBlendshapeTargetWts:1,setMenuMode:1,setNodeNiceNameResource:1,setNodeTypeFlag:1,setParent:1,setParticleAttr:1,setPfxToPolyCamera:1,setPluginResource:1,setProject:1,setStampDensity:1,setStartupMessage:1,setState:1,setToolTo:1,setUITemplate:1,setXformManip:1,sets:1,shadingConnection:1,shadingGeometryRelCtx:1,shadingLightRelCtx:1,shadingNetworkCompare:1,shadingNode:1,shapeCompare:1,shelfButton:1,shelfLayout:1,shelfTabLayout:1,shellField:1,shortNameOf:1,showHelp:1,showHidden:1,showManipCtx:1,showSelectionInTitle:1,showShadingGroupAttrEditor:1,showWindow:1,sign:1,simplify:1,sin:1,singleProfileBirailSurface:1,size:1,sizeBytes:1,skinCluster:1,skinPercent:1,smoothCurve:1,smoothTangentSurface:1,smoothstep:1,snap2to2:1,snapKey:1,snapMode:1,snapTogetherCtx:1,snapshot:1,soft:1,softMod:1,softModCtx:1,sort:1,sound:1,soundControl:1,source:1,spaceLocator:1,sphere:1,sphrand:1,spotLight:1,spotLightPreviewPort:1,spreadSheetEditor:1,spring:1,sqrt:1,squareSurface:1,srtContext:1,stackTrace:1,startString:1,startsWith:1,stitchAndExplodeShell:1,stitchSurface:1,stitchSurfacePoints:1,strcmp:1,stringArrayCatenate:1,stringArrayContains:1,stringArrayCount:1,stringArrayInsertAtIndex:1,stringArrayIntersector:1,stringArrayRemove:1,stringArrayRemoveAtIndex:1,stringArrayRemoveDuplicates:1,stringArrayRemoveExact:1,stringArrayToString:1,stringToStringArray:1,strip:1,stripPrefixFromName:1,stroke:1,subdAutoProjection:1,subdCleanTopology:1,subdCollapse:1,subdDuplicateAndConnect:1,subdEditUV:1,subdListComponentConversion:1,subdMapCut:1,subdMapSewMove:1,subdMatchTopology:1,subdMirror:1,subdToBlind:1,subdToPoly:1,subdTransferUVsToCache:1,subdiv:1,subdivCrease:1,subdivDisplaySmoothness:1,substitute:1,substituteAllString:1,substituteGeometry:1,substring:1,surface:1,surfaceSampler:1,surfaceShaderList:1,swatchDisplayPort:1,switchTable:1,symbolButton:1,symbolCheckBox:1,sysFile:1,system:1,tabLayout:1,tan:1,tangentConstraint:1,texLatticeDeformContext:1,texManipContext:1,texMoveContext:1,texMoveUVShellContext:1,texRotateContext:1,texScaleContext:1,texSelectContext:1,texSelectShortestPathCtx:1,texSmudgeUVContext:1,texWinToolCtx:1,text:1,textCurves:1,textField:1,textFieldButtonGrp:1,textFieldGrp:1,textManip:1,textScrollList:1,textToShelf:1,textureDisplacePlane:1,textureHairColor:1,texturePlacementContext:1,textureWindow:1,threadCount:1,threePointArcCtx:1,timeControl:1,timePort:1,timerX:1,toNativePath:1,toggle:1,toggleAxis:1,toggleWindowVisibility:1,tokenize:1,tokenizeList:1,tolerance:1,tolower:1,toolButton:1,toolCollection:1,toolDropped:1,toolHasOptions:1,toolPropertyWindow:1,torus:1,toupper:1,trace:1,track:1,trackCtx:1,transferAttributes:1,transformCompare:1,transformLimits:1,translator:1,trim:1,trunc:1,truncateFluidCache:1,truncateHairCache:1,tumble:1,tumbleCtx:1,turbulence:1,twoPointArcCtx:1,uiRes:1,uiTemplate:1,unassignInputDevice:1,undo:1,undoInfo:1,ungroup:1,uniform:1,unit:1,unloadPlugin:1,untangleUV:1,untitledFileName:1,untrim:1,upAxis:1,updateAE:1,userCtx:1,uvLink:1,uvSnapshot:1,validateShelfName:1,vectorize:1,view2dToolCtx:1,viewCamera:1,viewClipPlane:1,viewFit:1,viewHeadOn:1,viewLookAt:1,viewManip:1,viewPlace:1,viewSet:1,visor:1,volumeAxis:1,vortex:1,waitCursor:1,warning:1,webBrowser:1,webBrowserPrefs:1,whatIs:1,window:1,windowPref:1,wire:1,wireContext:1,workspace:1,wrinkle:1,wrinkleContext:1,writeTake:1,xbmLangPathList:1,xform:1},i:\"</\",c:[hljs.CNM,hljs.ASM,hljs.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},{cN:\"variable\",b:\"\\\\$\\\\d\",r:5},{cN:\"variable\",b:\"[\\\\$\\\\%\\\\@\\\\*](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\"},hljs.CLCM,hljs.CBLCLM]}};hljs.LANGUAGES.dos={cI:true,dM:{k:{flow:{\"if\":1,\"else\":1,\"goto\":1,\"for\":1,\"in\":1,\"do\":1,call:1,exit:1,not:1,exist:1,errorlevel:1,defined:1,equ:1,neq:1,lss:1,leq:1,gtr:1,geq:1},keyword:{shift:1,cd:1,dir:1,echo:1,setlocal:1,endlocal:1,set:1,pause:1,copy:1},stream:{prn:1,nul:1,lpt3:1,lpt2:1,lpt1:1,con:1,com4:1,com3:1,com2:1,com1:1,aux:1},winutils:{ping:1,net:1,ipconfig:1,taskkill:1,xcopy:1,ren:1,del:1}},c:[{cN:\"envvar\",b:\"%%[^ ]\"},{cN:\"envvar\",b:\"%[^ ]+?%\"},{cN:\"envvar\",b:\"![^ ]+?!\"},{cN:\"number\",b:\"\\\\b\\\\d+\",r:0},{cN:\"comment\",b:\"@?rem\",e:\"$\"}]}};hljs.LANGUAGES.apache=function(){var a={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,dM:{k:{keyword:{acceptfilter:1,acceptmutex:1,acceptpathinfo:1,accessfilename:1,action:1,addalt:1,addaltbyencoding:1,addaltbytype:1,addcharset:1,adddefaultcharset:1,adddescription:1,addencoding:1,addhandler:1,addicon:1,addiconbyencoding:1,addiconbytype:1,addinputfilter:1,addlanguage:1,addmoduleinfo:1,addoutputfilter:1,addoutputfilterbytype:1,addtype:1,alias:1,aliasmatch:1,allow:1,allowconnect:1,allowencodedslashes:1,allowoverride:1,anonymous:1,anonymous_logemail:1,anonymous_mustgiveemail:1,anonymous_nouserid:1,anonymous_verifyemail:1,authbasicauthoritative:1,authbasicprovider:1,authdbduserpwquery:1,authdbduserrealmquery:1,authdbmgroupfile:1,authdbmtype:1,authdbmuserfile:1,authdefaultauthoritative:1,authdigestalgorithm:1,authdigestdomain:1,authdigestnccheck:1,authdigestnonceformat:1,authdigestnoncelifetime:1,authdigestprovider:1,authdigestqop:1,authdigestshmemsize:1,authgroupfile:1,authldapbinddn:1,authldapbindpassword:1,authldapcharsetconfig:1,authldapcomparednonserver:1,authldapdereferencealiases:1,authldapgroupattribute:1,authldapgroupattributeisdn:1,authldapremoteuserattribute:1,authldapremoteuserisdn:1,authldapurl:1,authname:1,authnprovideralias:1,authtype:1,authuserfile:1,authzdbmauthoritative:1,authzdbmtype:1,authzdefaultauthoritative:1,authzgroupfileauthoritative:1,authzldapauthoritative:1,authzownerauthoritative:1,authzuserauthoritative:1,balancermember:1,browsermatch:1,browsermatchnocase:1,bufferedlogs:1,cachedefaultexpire:1,cachedirlength:1,cachedirlevels:1,cachedisable:1,cacheenable:1,cachefile:1,cacheignorecachecontrol:1,cacheignoreheaders:1,cacheignorenolastmod:1,cacheignorequerystring:1,cachelastmodifiedfactor:1,cachemaxexpire:1,cachemaxfilesize:1,cacheminfilesize:1,cachenegotiateddocs:1,cacheroot:1,cachestorenostore:1,cachestoreprivate:1,cgimapextension:1,charsetdefault:1,charsetoptions:1,charsetsourceenc:1,checkcaseonly:1,checkspelling:1,chrootdir:1,contentdigest:1,cookiedomain:1,cookieexpires:1,cookielog:1,cookiename:1,cookiestyle:1,cookietracking:1,coredumpdirectory:1,customlog:1,dav:1,davdepthinfinity:1,davgenericlockdb:1,davlockdb:1,davmintimeout:1,dbdexptime:1,dbdkeep:1,dbdmax:1,dbdmin:1,dbdparams:1,dbdpersist:1,dbdpreparesql:1,dbdriver:1,defaulticon:1,defaultlanguage:1,defaulttype:1,deflatebuffersize:1,deflatecompressionlevel:1,deflatefilternote:1,deflatememlevel:1,deflatewindowsize:1,deny:1,directoryindex:1,directorymatch:1,directoryslash:1,documentroot:1,dumpioinput:1,dumpiologlevel:1,dumpiooutput:1,enableexceptionhook:1,enablemmap:1,enablesendfile:1,errordocument:1,errorlog:1,example:1,expiresactive:1,expiresbytype:1,expiresdefault:1,extendedstatus:1,extfilterdefine:1,extfilteroptions:1,fileetag:1,filterchain:1,filterdeclare:1,filterprotocol:1,filterprovider:1,filtertrace:1,forcelanguagepriority:1,forcetype:1,forensiclog:1,gracefulshutdowntimeout:1,group:1,header:1,headername:1,hostnamelookups:1,identitycheck:1,identitychecktimeout:1,imapbase:1,imapdefault:1,imapmenu:1,include:1,indexheadinsert:1,indexignore:1,indexoptions:1,indexorderdefault:1,indexstylesheet:1,isapiappendlogtoerrors:1,isapiappendlogtoquery:1,isapicachefile:1,isapifakeasync:1,isapilognotsupported:1,isapireadaheadbuffer:1,keepalive:1,keepalivetimeout:1,languagepriority:1,ldapcacheentries:1,ldapcachettl:1,ldapconnectiontimeout:1,ldapopcacheentries:1,ldapopcachettl:1,ldapsharedcachefile:1,ldapsharedcachesize:1,ldaptrustedclientcert:1,ldaptrustedglobalcert:1,ldaptrustedmode:1,ldapverifyservercert:1,limitinternalrecursion:1,limitrequestbody:1,limitrequestfields:1,limitrequestfieldsize:1,limitrequestline:1,limitxmlrequestbody:1,listen:1,listenbacklog:1,loadfile:1,loadmodule:1,lockfile:1,logformat:1,loglevel:1,maxclients:1,maxkeepaliverequests:1,maxmemfree:1,maxrequestsperchild:1,maxrequestsperthread:1,maxspareservers:1,maxsparethreads:1,maxthreads:1,mcachemaxobjectcount:1,mcachemaxobjectsize:1,mcachemaxstreamingbuffer:1,mcacheminobjectsize:1,mcacheremovalalgorithm:1,mcachesize:1,metadir:1,metafiles:1,metasuffix:1,mimemagicfile:1,minspareservers:1,minsparethreads:1,mmapfile:1,mod_gzip_on:1,mod_gzip_add_header_count:1,mod_gzip_keep_workfiles:1,mod_gzip_dechunk:1,mod_gzip_min_http:1,mod_gzip_minimum_file_size:1,mod_gzip_maximum_file_size:1,mod_gzip_maximum_inmem_size:1,mod_gzip_temp_dir:1,mod_gzip_item_include:1,mod_gzip_item_exclude:1,mod_gzip_command_version:1,mod_gzip_can_negotiate:1,mod_gzip_handle_methods:1,mod_gzip_static_suffix:1,mod_gzip_send_vary:1,mod_gzip_update_static:1,modmimeusepathinfo:1,multiviewsmatch:1,namevirtualhost:1,noproxy:1,nwssltrustedcerts:1,nwsslupgradeable:1,options:1,order:1,passenv:1,pidfile:1,protocolecho:1,proxybadheader:1,proxyblock:1,proxydomain:1,proxyerroroverride:1,proxyftpdircharset:1,proxyiobuffersize:1,proxymaxforwards:1,proxypass:1,proxypassinterpolateenv:1,proxypassmatch:1,proxypassreverse:1,proxypassreversecookiedomain:1,proxypassreversecookiepath:1,proxypreservehost:1,proxyreceivebuffersize:1,proxyremote:1,proxyremotematch:1,proxyrequests:1,proxyset:1,proxystatus:1,proxytimeout:1,proxyvia:1,readmename:1,receivebuffersize:1,redirect:1,redirectmatch:1,redirectpermanent:1,redirecttemp:1,removecharset:1,removeencoding:1,removehandler:1,removeinputfilter:1,removelanguage:1,removeoutputfilter:1,removetype:1,requestheader:1,require:2,rewritebase:1,rewritecond:10,rewriteengine:1,rewritelock:1,rewritelog:1,rewriteloglevel:1,rewritemap:1,rewriteoptions:1,rewriterule:10,rlimitcpu:1,rlimitmem:1,rlimitnproc:1,satisfy:1,scoreboardfile:1,script:1,scriptalias:1,scriptaliasmatch:1,scriptinterpretersource:1,scriptlog:1,scriptlogbuffer:1,scriptloglength:1,scriptsock:1,securelisten:1,seerequesttail:1,sendbuffersize:1,serveradmin:1,serveralias:1,serverlimit:1,servername:1,serverpath:1,serverroot:1,serversignature:1,servertokens:1,setenv:1,setenvif:1,setenvifnocase:1,sethandler:1,setinputfilter:1,setoutputfilter:1,ssienableaccess:1,ssiendtag:1,ssierrormsg:1,ssistarttag:1,ssitimeformat:1,ssiundefinedecho:1,sslcacertificatefile:1,sslcacertificatepath:1,sslcadnrequestfile:1,sslcadnrequestpath:1,sslcarevocationfile:1,sslcarevocationpath:1,sslcertificatechainfile:1,sslcertificatefile:1,sslcertificatekeyfile:1,sslciphersuite:1,sslcryptodevice:1,sslengine:1,sslhonorciperorder:1,sslmutex:1,ssloptions:1,sslpassphrasedialog:1,sslprotocol:1,sslproxycacertificatefile:1,sslproxycacertificatepath:1,sslproxycarevocationfile:1,sslproxycarevocationpath:1,sslproxyciphersuite:1,sslproxyengine:1,sslproxymachinecertificatefile:1,sslproxymachinecertificatepath:1,sslproxyprotocol:1,sslproxyverify:1,sslproxyverifydepth:1,sslrandomseed:1,sslrequire:1,sslrequiressl:1,sslsessioncache:1,sslsessioncachetimeout:1,sslusername:1,sslverifyclient:1,sslverifydepth:1,startservers:1,startthreads:1,substitute:1,suexecusergroup:1,threadlimit:1,threadsperchild:1,threadstacksize:1,timeout:1,traceenable:1,transferlog:1,typesconfig:1,unsetenv:1,usecanonicalname:1,usecanonicalphysicalport:1,user:1,userdir:1,virtualdocumentroot:1,virtualdocumentrootip:1,virtualscriptalias:1,virtualscriptaliasip:1,win32disableacceptex:1,xbithack:1},literal:{on:1,off:1}},c:[hljs.HCM,{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",a]},a,{cN:\"tag\",b:\"</?\",e:\">\"},hljs.QSM]}}}();hljs.LANGUAGES.cpp=function(){var a={keyword:{\"false\":1,\"int\":1,\"float\":1,\"while\":1,\"private\":1,\"char\":1,\"catch\":1,\"export\":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,\"const\":1,struct:1,\"for\":1,static_cast:2,union:1,namespace:1,unsigned:1,\"long\":1,\"throw\":1,\"volatile\":2,\"static\":1,\"protected\":1,bool:1,template:1,mutable:1,\"if\":1,\"public\":1,friend:2,\"do\":1,\"return\":1,\"goto\":1,auto:1,\"void\":2,\"enum\":1,\"else\":1,\"break\":1,\"new\":1,extern:1,using:1,\"true\":1,\"class\":1,asm:1,\"case\":1,typeid:1,\"short\":1,reinterpret_cast:2,\"default\":1,\"double\":1,register:1,explicit:1,signed:1,typename:1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,wchar_t:1,inline:1,\"delete\":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1,restrict:1,_Bool:1,complex:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:a,r:10,c:[\"self\"]}]}}}();hljs.LANGUAGES.matlab={dM:{k:{keyword:{\"break\":1,\"case\":1,\"catch\":1,classdef:1,\"continue\":1,\"else\":1,elseif:1,end:1,enumerated:1,events:1,\"for\":1,\"function\":1,global:1,\"if\":1,methods:1,otherwise:1,parfor:1,persistent:1,properties:1,\"return\":1,spmd:1,\"switch\":1,\"try\":1,\"while\":1},built_in:{sin:1,sind:1,sinh:1,asin:1,asind:1,asinh:1,cos:1,cosd:1,cosh:1,acos:1,acosd:1,acosh:1,tan:1,tand:1,tanh:1,atan:1,atand:1,atan2:1,atanh:1,sec:1,secd:1,sech:1,asec:1,asecd:1,asech:1,csc:1,cscd:1,csch:1,acsc:1,acscd:1,acsch:1,cot:1,cotd:1,coth:1,acot:1,acotd:1,acoth:1,hypot:1,exp:1,expm1:1,log:1,log1p:1,log10:1,log2:1,pow2:1,realpow:1,reallog:1,realsqrt:1,sqrt:1,nthroot:1,nextpow2:1,abs:1,angle:1,complex:1,conj:1,imag:1,real:1,unwrap:1,isreal:1,cplxpair:1,fix:1,floor:1,ceil:1,round:1,mod:1,rem:1,sign:1,airy:1,besselj:1,bessely:1,besselh:1,besseli:1,besselk:1,beta:1,betainc:1,betaln:1,ellipj:1,ellipke:1,erf:1,erfc:1,erfcx:1,erfinv:1,expint:1,gamma:1,gammainc:1,gammaln:1,psi:1,legendre:1,cross:1,dot:1,factor:1,isprime:1,primes:1,gcd:1,lcm:1,rat:1,rats:1,perms:1,nchoosek:1,factorial:1,cart2sph:1,cart2pol:1,pol2cart:1,sph2cart:1,hsv2rgb:1,rgb2hsv:1,zeros:1,ones:1,eye:1,repmat:1,rand:1,randn:1,linspace:1,logspace:1,freqspace:1,meshgrid:1,accumarray:1,size:1,length:1,ndims:1,numel:1,disp:1,isempty:1,isequal:1,isequalwithequalnans:1,cat:1,reshape:1,diag:1,blkdiag:1,tril:1,triu:1,fliplr:1,flipud:1,flipdim:1,rot90:1,find:1,end:1,sub2ind:1,ind2sub:1,bsxfun:1,ndgrid:1,permute:1,ipermute:1,shiftdim:1,circshift:1,squeeze:1,isscalar:1,isvector:1,ans:1,eps:1,realmax:1,realmin:1,pi:1,i:1,inf:1,nan:1,isnan:1,isinf:1,isfinite:1,j:1,why:1,compan:1,gallery:1,hadamard:1,hankel:1,hilb:1,invhilb:1,magic:1,pascal:1,rosser:1,toeplitz:1,vander:1,wilkinson:1},},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",b:\"function\",e:\"$\",k:{\"function\":1},c:[{cN:\"title\",b:hljs.UIR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},{cN:\"params\",b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,{b:\"''\"}]},{cN:\"comment\",b:\"\\\\%\",e:\"$\"},hljs.CNM]}};hljs.LANGUAGES.parser3={dM:{sL:\"html\",c:[{cN:\"comment\",b:\"^#\",e:\"$\"},{cN:\"comment\",b:\"\\\\^rem{\",e:\"}\",r:10,c:[{b:\"{\",e:\"}\",c:[\"self\"]}]},{cN:\"preprocessor\",b:\"^@(?:BASE|USE|CLASS|OPTIONS)$\",r:10},{cN:\"title\",b:\"@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$\"},{cN:\"variable\",b:\"\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?\"},{cN:\"keyword\",b:\"\\\\^[\\\\w\\\\-\\\\.\\\\:]+\"},{cN:\"number\",b:\"\\\\^#[0-9a-fA-F]+\"},hljs.CNM]}};hljs.LANGUAGES.go=function(){var a={keyword:{\"break\":1,\"default\":1,func:1,\"interface\":1,select:1,\"case\":1,map:1,struct:1,chan:1,\"else\":1,\"goto\":1,\"package\":1,\"switch\":1,\"const\":1,fallthrough:1,\"if\":1,range:1,type:1,\"continue\":1,\"for\":1,\"import\":1,\"return\":1,\"var\":1,go:1,defer:1},constant:{\"true\":1,\"false\":1,iota:1,nil:1},typename:{bool:1,\"byte\":1,complex64:1,complex128:1,float32:1,float64:1,int8:1,int16:1,int32:1,int64:1,string:1,uint8:1,uint16:1,uint32:1,uint64:1,\"int\":1,uint:1,uintptr:1,rune:1},built_in:{append:1,cap:1,close:1,complex:1,copy:1,imag:1,len:1,make:1,\"new\":1,panic:1,print:1,println:1,real:1,recover:1,\"delete\":1}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",r:0},{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"number\",b:\"[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\",r:0},hljs.CNM]}}}();"
  },
  {
    "path": "ppt/js/highlight/hljs-0.8.js",
    "content": "var hljs=new function(){function k(v){return v.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\\n/g,\"\"):w.nodeValue}if(t(w)==\"br\"){return\"\\n\"}return d(w)}).join(\"\")}function r(w){var v=(w.className+\" \"+(w.parentNode?w.parentNode.className:\"\")).split(/\\s+/);v=v.map(function(x){return x.replace(/^language-/,\"\")});return v.filter(function(x){return j(x)||x==\"no-highlight\"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)==\"br\"){z+=1}else{if(A.nodeType==1){v.push({event:\"start\",offset:z,node:A});z=w(A,z);v.push({event:\"stop\",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F=\"\";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset<y[0].offset)?w:y}return y[0].event==\"start\"?w:y}function A(H){function G(I){return\" \"+I.nodeName+'=\"'+k(I.value)+'\"'}F+=\"<\"+t(H)+Array.prototype.map.call(H.attributes,G).join(\"\")+\">\"}function E(G){F+=\"</\"+t(G)+\">\"}function v(G){(G.event==\"start\"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event==\"start\"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),\"m\"+(y.cI?\"i\":\"\")+(z?\"g\":\"\"))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(\" \").forEach(function(H){var I=H.split(\"|\");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k==\"string\"){E(\"keyword\",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\\b[A-Za-z0-9_]+\\b/,true);if(C){if(D.bK){D.b=D.bK.split(\" \").join(\"|\")}if(!D.b){D.b=/\\B|\\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\\B|\\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||\"\";if(D.eW&&C.tE){D.tE+=(D.e?\"|\":\"\")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F==\"self\"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?\"\\\\.?\\\\b(\"+F.b+\")\\\\b\\\\.?\":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join(\"|\"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V.c[T].bR,U)){return V.c[T]}}}function z(U,T){if(i(U.eR,T)){return U}if(U.eW){return z(U.parent,T)}}function A(T,U){return !J&&i(U.iR,T)}function E(V,T){var U=M.cI?T[0].toLowerCase():T[0];return V.k.hasOwnProperty(U)&&V.k[U]}function w(Z,X,W,V){var T=V?\"\":b.classPrefix,U='<span class=\"'+T,Y=W?\"\":\"</span>\";U+=Z+'\">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T=\"\";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode==\"continuous\"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,\"\",true):\"\";if(V.rB){D+=T;C=\"\"}else{if(V.eB){D+=k(U)+T;C=\"\"}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=\"</span>\"}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C=\"\";if(W.starts){P(W.starts,\"\")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme \"'+X+'\" for mode \"'+(I.cN||\"<unnamed>\")+'\"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: \"'+S+'\"')}m(M);var I=R||M;var D=\"\";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C=\"\";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=\"</span>\"}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf(\"Illegal\")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\\t)+)/gm,function(w,z,y,x){return z.replace(/\\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\\n/g,\"<br>\")}return v}function p(z){var y=d(z);var A=r(z);if(A==\"no-highlight\"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"pre\");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=\" hljs \"+(!A&&v.language||\"\");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:\"hljs-\",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(v,p)}function a(){addEventListener(\"DOMContentLoaded\",l,false);addEventListener(\"load\",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE]};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE]};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gim]*/,i:/\\n/,c:[this.BE,{b:/\\[/,e:/\\]/,r:0,c:[this.BE]}]};this.TM={cN:\"title\",b:this.IR,r:0};this.UTM={cN:\"title\",b:this.UIR,r:0}}();hljs.registerLanguage(\"ruleslanguage\",function(a){return{k:{keyword:\"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING\",built_in:\"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME\"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:\"array\",b:\"#[a-zA-Z .]+\"}]}});hljs.registerLanguage(\"ruby\",function(e){var h=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var g=\"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\";var a={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var i={cN:\"comment\",v:[{b:\"#\",e:\"$\",c:[a]},{b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[a],r:10},{b:\"^__END__\",e:\"\\\\n$\"}]};var c={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:g};var d={cN:\"string\",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:\"%[qw]?\\\\(\",e:\"\\\\)\"},{b:\"%[qw]?\\\\[\",e:\"\\\\]\"},{b:\"%[qw]?{\",e:\"}\"},{b:\"%[qw]?<\",e:\">\",r:10},{b:\"%[qw]?/\",e:\"/\",r:10},{b:\"%[qw]?%\",e:\"%\",r:10},{b:\"%[qw]?-\",e:\"-\",r:10},{b:\"%[qw]?\\\\|\",e:\"\\\\|\",r:10},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/}]};var b={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:g};var f=[d,i,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+e.IR+\"::)?\"+e.IR}]},i]},{cN:\"function\",bK:\"def\",e:\" |$|;\",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:\"constant\",b:\"(::)?(\\\\b[A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:[d,{b:h}],r:0},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[i,{cN:\"regexp\",c:[e.BE,c],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage(\"haml\",function(a){return{cI:true,c:[{cN:\"doctype\",b:\"^!!!( (5|1\\\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\\\b.*))?$\",r:10},{cN:\"comment\",b:\"^\\\\s*(!=#|=#|-#|/).*$\",r:0},{b:\"^\\\\s*(-|=|!=)(?!#)\",starts:{e:\"\\\\n\",sL:\"ruby\"}},{cN:\"tag\",b:\"^\\\\s*%\",c:[{cN:\"title\",b:\"\\\\w+\"},{cN:\"value\",b:\"[#\\\\.]\\\\w+\"},{b:\"{\\\\s*\",e:\"\\\\s*}\",eE:true,c:[{b:\":\\\\w+\\\\s*=>\",e:\",\\\\s+\",rB:true,eW:true,c:[{cN:\"symbol\",b:\":\\\\w+\"},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]}]},{b:\"\\\\(\\\\s*\",e:\"\\\\s*\\\\)\",eE:true,c:[{b:\"\\\\w+\\\\s*=\",e:\"\\\\s+\",rB:true,eW:true,c:[{cN:\"attribute\",b:\"\\\\w+\",r:0},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]},]}]},{cN:\"bullet\",b:\"^\\\\s*[=~]\\\\s*\",r:0},{b:\"#{\",starts:{e:\"}\",sL:\"ruby\"}}]}});hljs.registerLanguage(\"haskell\",function(f){var g={cN:\"comment\",v:[{b:\"--\",e:\"$\"},{b:\"{-\",e:\"-}\",c:[\"self\"]}]};var e={cN:\"pragma\",b:\"{-#\",e:\"#-}\"};var b={cN:\"preprocessor\",b:\"^#\",e:\"$\"};var d={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",r:0};var c={cN:\"container\",b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[e,g,b,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},f.inherit(f.TM,{b:\"[_a-z][\\\\w']*\"})]};var a={cN:\"container\",b:\"{\",e:\"}\",c:c.c};return{k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{cN:\"module\",b:\"\\\\bmodule\\\\b\",e:\"where\",k:\"module where\",c:[c,g],i:\"\\\\W\\\\.|;\"},{cN:\"import\",b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import|0 qualified as hiding\",c:[c,g],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[d,c,g]},{cN:\"typedef\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[e,g,d,c,a]},{cN:\"default\",bK:\"default\",e:\"$\",c:[d,c,g]},{cN:\"infix\",bK:\"infix infixl infixr\",e:\"$\",c:[f.CNM,g]},{cN:\"foreign\",b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[d,f.QSM,g]},{cN:\"shebang\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:\"^[_a-z][\\\\w']*\"}),{b:\"->|<-\"}]}});hljs.registerLanguage(\"xml\",function(a){var c=\"[A-Za-z0-9\\\\._:-]+\";var d={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\",subLanguageMode:\"continuous\"};var b={eW:true,i:/</,r:0,c:[d,{cN:\"attribute\",b:c,r:0},{b:\"=\",r:0,c:[{cN:\"value\",v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\"],cI:true,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[b],starts:{e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[b],starts:{e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{b:\"<%\",e:\"%>\",sL:\"vbscript\"},d,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ /><]+\",r:0},b]}]}});hljs.registerLanguage(\"django\",function(a){var b={cN:\"filter\",b:/\\|[A-Za-z]+\\:?/,k:\"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone\",c:[{cN:\"argument\",b:/\"/,e:/\"/},{cN:\"argument\",b:/'/,e:/'/}]};return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"template_comment\",b:/\\{%\\s*comment\\s*%}/,e:/\\{%\\s*endcomment\\s*%}/},{cN:\"template_comment\",b:/\\{#/,e:/#}/},{cN:\"template_tag\",b:/\\{%/,e:/%}/,k:\"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim\",c:[b]},{cN:\"variable\",b:/\\{\\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage(\"bash\",function(b){var a={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)\\}/}]};var d={cN:\"string\",b:/\"/,e:/\"/,c:[b.BE,a,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[b.BE]}]};var c={cN:\"string\",b:/'/,e:/'/};return{l:/-?[a-z\\.]+/,k:{keyword:\"if then else elif fi for break continue while in do done exit return set declare case esac export exec\",literal:\"true false\",built_in:\"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo\",operator:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"shebang\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:true,c:[b.inherit(b.TM,{b:/\\w[\\w\\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage(\"ini\",function(a){return{cI:true,i:/\\S/,c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:\"on off true false yes no\",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage(\"objectivec\",function(a){var d={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b=\"@interface @class @protocol @implementation\";return{k:d,l:c,i:\"</\",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(\"+b.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",k:b,l:c,c:[a.UTM]},{cN:\"variable\",b:\"\\\\.\"+a.UIR,r:0}]}});hljs.registerLanguage(\"scss\",function(a){var c=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var d={cN:\"function\",b:c+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]};var b={cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"};var e={cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:\"important\",b:\"!important\"}]}};return{cI:true,i:\"[=/|']\",c:[a.CLCM,a.CBLCLM,{cN:\"function\",b:c+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]},{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\",r:0},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",r:0},{cN:\"pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},{cN:\"attribute\",b:\"\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{cN:\"value\",b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{cN:\"value\",b:\":\",e:\";\",c:[b,a.NM,a.QSM,a.ASM,{cN:\"important\",b:\"!important\"}]},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",k:\"mixin include extend for if else each while charset import debug media page content font-face namespace warn\",c:[d,a.QSM,a.ASM,b,a.NM,{cN:\"preprocessor\",b:\"\\\\s[A-Za-z0-9_.-]+\",r:0}]}]}});hljs.registerLanguage(\"python\",function(a){var f={cN:\"prompt\",b:/^(>>>|\\.\\.\\.) /};var b={cN:\"string\",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)\"/,e:/\"/,},a.ASM,a.QSM]};var d={cN:\"number\",r:0,v:[{b:a.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:a.CNR+\"[lLjJ]?\"}]};var e={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",f,d,b]};var c={e:/:/,i:/[${=;\\n]/,c:[a.UTM,e]};return{k:{keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:\"function\",bK:\"def\",r:10}),a.inherit(c,{cN:\"class\",bK:\"class\"}),{cN:\"decorator\",b:/@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"mel\",function(a){return{k:\"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform\",i:\"</\",c:[a.CNM,a.ASM,a.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[a.BE]},{cN:\"variable\",v:[{b:\"\\\\$\\\\d\"},{b:\"[\\\\$\\\\%\\\\@](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\"},{b:\"\\\\*(\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\",r:0}]},a.CLCM,a.CBLCLM]}});hljs.registerLanguage(\"dos\",function(a){return{cI:true,k:{flow:\"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq\",keyword:\"shift cd dir echo setlocal endlocal set pause copy\",stream:\"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux\",winutils:\"ping net ipconfig taskkill xcopy ren del\"},c:[{cN:\"envvar\",b:\"%%[^ ]\"},{cN:\"envvar\",b:\"%[^ ]+?%\"},{cN:\"envvar\",b:\"![^ ]+?!\"},{cN:\"number\",b:\"\\\\b\\\\d+\",r:0},{cN:\"comment\",b:\"@?rem\",e:\"$\"}]}});hljs.registerLanguage(\"java\",function(b){var a=\"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws\";return{k:a,i:/<\\//,c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"(^|\\\\s)@[A-Za-z]+\"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:\"protected public private\",e:/[{;=]/,k:a,c:[{cN:\"class\",bK:\"class interface\",eW:true,i:/[:\"<>]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{b:b.UIR+\"\\\\s*\\\\(\",rB:true,c:[b.UTM]}]},b.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"tex\",function(a){var d={cN:\"command\",b:\"\\\\\\\\[a-zA-ZÐ°-ÑÐ-Ñ]+[\\\\*]?\"};var c={cN:\"command\",b:\"\\\\\\\\[^a-zA-ZÐ°-ÑÐ-Ñ0-9]\"};var b={cN:\"special\",b:\"[{}\\\\[\\\\]\\\\&#~]\",r:0};return{c:[{b:\"\\\\\\\\[a-zA-ZÐ°-ÑÐ-Ñ]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",rB:true,c:[d,c,{cN:\"number\",b:\" *=\",e:\"-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",eB:true}],r:10},d,c,b,{cN:\"formula\",b:\"\\\\$\\\\$\",e:\"\\\\$\\\\$\",c:[d,c,b],r:0},{cN:\"formula\",b:\"\\\\$\",e:\"\\\\$\",c:[d,c,b],r:0},{cN:\"comment\",b:\"%\",e:\"$\",r:0}]}});hljs.registerLanguage(\"glsl\",function(a){return{k:{keyword:\"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly\",built_in:\"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse\",literal:\"true false\"},i:'\"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"}]}});hljs.registerLanguage(\"brainfuck\",function(b){var a={cN:\"literal\",b:\"[\\\\+\\\\-]\",r:0};return{c:[{cN:\"comment\",b:\"[^\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",rE:true,e:\"[\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",r:0},{cN:\"title\",b:\"[\\\\[\\\\]]\",r:0},{cN:\"string\",b:\"[\\\\.,]\",r:0},{b:/\\+\\+|\\-\\-/,rB:true,c:[a]},a]}});hljs.registerLanguage(\"mathematica\",function(a){return{aliases:[\"mma\"],l:\"(\\\\$|\\\\b)\"+a.IR+\"\\\\b\",k:\"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber\",c:[{cN:\"comment\",b:/\\(\\*/,e:/\\*\\)/},a.ASM,a.QSM,a.CNM,{cN:\"list\",b:/\\{/,e:/\\}/,i:/:/}]}});hljs.registerLanguage(\"cs\",function(b){var a=\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield\";return{k:a,c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},b.CLCM,b.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line region endregion pragma checksum\"},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},b.ASM,b.QSM,b.CNM,{bK:\"protected public private internal\",e:/[{;=]/,k:a,c:[{bK:\"class namespace interface\",starts:{c:[b.TM]}},{b:b.IR+\"\\\\s*\\\\(\",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage(\"http\",function(a){return{i:\"\\\\S\",c:[{cN:\"status\",b:\"^HTTP/[0-9\\\\.]+\",e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{cN:\"request\",b:\"^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$\",rB:true,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:true,eE:true}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:true,i:\"\\\\n|\\\\s|=\",starts:{cN:\"string\",e:\"$\"}},{b:\"\\\\n\\\\n\",starts:{sL:\"\",eW:true}}]}});hljs.registerLanguage(\"rust\",function(b){var c={cN:\"number\",b:\"\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)\",r:0};var a=\"assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while\";return{k:a,i:\"</\",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",c:[b.UTM]},{cN:\"preprocessor\",b:\"#\\\\[\",e:\"\\\\]\"},{bK:\"type\",e:\"(=|<)\",c:[b.UTM],i:\"\\\\S\"},{bK:\"trait enum\",e:\"({|<)\",c:[b.UTM],i:\"\\\\S\"}]}});hljs.registerLanguage(\"handlebars\",function(b){var a=\"each in with if else unless bindattr action collection debugger log outlet template unbound view yield\";return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"expression\",b:\"{{\",e:\"}}\",c:[{cN:\"begin-block\",b:\"#[a-zA-Z- .]+\",k:a},{cN:\"string\",b:'\"',e:'\"'},{cN:\"end-block\",b:\"\\\\/[a-zA-Z- .]+\",k:a},{cN:\"variable\",b:\"[a-zA-Z-.]+\",k:a}]}]}});hljs.registerLanguage(\"cmake\",function(a){return{cI:true,k:{keyword:\"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or\",operator:\"equal less greater strless strgreater strequal matches\"},c:[{cN:\"envvar\",b:\"\\\\${\",e:\"}\"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage(\"lisp\",function(h){var k=\"[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#!]*\";var l=\"(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\";var j={cN:\"shebang\",b:\"^#!\",e:\"$\"};var b={cN:\"literal\",b:\"\\\\b(t{1}|nil)\\\\b\"};var d={cN:\"number\",v:[{b:l,r:0},{b:\"#b[0-1]+(/[0-1]+)?\"},{b:\"#o[0-7]+(/[0-7]+)?\"},{b:\"#x[0-9a-f]+(/[0-9a-f]+)?\"},{b:\"#c\\\\(\"+l+\" +\"+l,e:\"\\\\)\"}]};var g=h.inherit(h.QSM,{i:null});var m={cN:\"comment\",b:\";\",e:\"$\"};var f={cN:\"variable\",b:\"\\\\*\",e:\"\\\\*\"};var n={cN:\"keyword\",b:\"[:&]\"+k};var c={b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",b,g,d]};var a={cN:\"quoted\",c:[d,g,f,n,c],v:[{b:\"['`]\\\\(\",e:\"\\\\)\",},{b:\"\\\\(quote \",e:\"\\\\)\",k:{title:\"quote\"},}]};var i={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var e={eW:true,r:0};i.c=[{cN:\"title\",b:k},e];e.c=[a,i,b,d,g,m,f,n];return{i:/\\S/,c:[d,j,b,g,m,a,i]}});hljs.registerLanguage(\"rib\",function(a){return{k:\"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd\",i:\"</\",c:[a.HCM,a.CNM,a.ASM,a.QSM]}});hljs.registerLanguage(\"css\",function(a){var b=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var c={cN:\"function\",b:b+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]};return{cI:true,i:\"[=/|']\",c:[a.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:\"tag\",b:b,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[a.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}});hljs.registerLanguage(\"avrasm\",function(a){return{cI:true,k:{keyword:\"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr\",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf\"},c:[a.CBLCLM,{cN:\"comment\",b:\";\",e:\"$\",r:0},a.CNM,a.BNM,{cN:\"number\",b:\"\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)\"},a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"label\",b:\"^[A-Za-z0-9_.$]+:\"},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"preprocessor\",b:\"\\\\.[a-zA-Z]+\"},{cN:\"localvars\",b:\"@[0-9]+\"}]}});hljs.registerLanguage(\"apache\",function(a){var b={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,c:[a.HCM,{cN:\"tag\",b:\"</?\",e:\">\"},{cN:\"keyword\",b:/\\w+/,r:0,k:{common:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",b]},b,a.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"1c\",function(b){var f=\"[a-zA-ZÐ°-ÑÐ-Ð¯][a-zA-Z0-9_Ð°-ÑÐ-Ð¯]*\";var c=\"Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚ Ð´Ð°Ñ‚Ð° Ð´Ð»Ñ ÐµÑÐ»Ð¸ Ð¸ Ð¸Ð»Ð¸ Ð¸Ð½Ð°Ñ‡Ðµ Ð¸Ð½Ð°Ñ‡ÐµÐµÑÐ»Ð¸ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ ÐºÐ¾Ð½ÐµÑ†ÐµÑÐ»Ð¸ ÐºÐ¾Ð½ÐµÑ†Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ¸ ÐºÐ¾Ð½ÐµÑ†Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ ÐºÐ¾Ð½ÐµÑ†Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ ÐºÐ¾Ð½ÐµÑ†Ñ†Ð¸ÐºÐ»Ð° ÐºÐ¾Ð½ÑÑ‚Ð°Ð½Ñ‚Ð° Ð½Ðµ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ Ð¿ÐµÑ€ÐµÐ¼ Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ðµ Ð¿Ð¾ Ð¿Ð¾ÐºÐ° Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð¿Ñ€ÐµÑ€Ð²Ð°Ñ‚ÑŒ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÑŒ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° ÑÑ‚Ñ€Ð¾ÐºÐ° Ñ‚Ð¾Ð³Ð´Ð° Ñ„Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ†Ð¸ÐºÐ» Ñ‡Ð¸ÑÐ»Ð¾ ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\";var e=\"ansitooem oemtoansi Ð²Ð²ÐµÑÑ‚Ð¸Ð²Ð¸Ð´ÑÑƒÐ±ÐºÐ¾Ð½Ñ‚Ð¾ Ð²Ð²ÐµÑÑ‚Ð¸Ð´Ð°Ñ‚Ñƒ Ð²Ð²ÐµÑÑ‚Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ðµ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿ÐµÑ€Ð¸Ð¾Ð´ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð²Ð²ÐµÑÑ‚Ð¸ÑÑ‚Ñ€Ð¾ÐºÑƒ Ð²Ð²ÐµÑÑ‚Ð¸Ñ‡Ð¸ÑÐ»Ð¾ Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð²Ñ€ÐµÐ³ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¹Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð²Ñ‹Ð·Ð²Ð°Ñ‚ÑŒÐ¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ Ð´Ð°Ñ‚Ð°Ð³Ð¾Ð´ Ð´Ð°Ñ‚Ð°Ð¼ÐµÑÑÑ† Ð´Ð°Ñ‚Ð°Ñ‡Ð¸ÑÐ»Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒÐ¼ÐµÑÑÑ† Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑŒÑ€Ð°Ð±Ð¾Ñ‚ÑƒÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ Ð·Ð°Ð¿Ð¸ÑÑŒÐ¶ÑƒÑ€Ð½Ð°Ð»Ð°Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ð¸ Ð·Ð°Ð¿ÑƒÑÑ‚Ð¸Ñ‚ÑŒÐ¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ Ð·Ð°Ñ„Ð¸ÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²ÑÑ‚Ñ€Ð¾ÐºÑƒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²ÑÑ‚Ñ€Ð¾ÐºÑƒÐ²Ð½ÑƒÑ‚Ñ€ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²Ñ„Ð°Ð¹Ð» Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·ÑÑ‚Ñ€Ð¾ÐºÐ¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·ÑÑ‚Ñ€Ð¾ÐºÐ¸Ð²Ð½ÑƒÑ‚Ñ€ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·Ñ„Ð°Ð¹Ð»Ð° Ð¸Ð¼ÑÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° Ð¸Ð¼ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…Ñ„Ð°Ð¹Ð»Ð¾Ð² ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¸Ð± ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ ÐºÐ¾Ð´ÑÐ¸Ð¼Ð² ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°ÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ ÐºÐ¾Ð½Ð³Ð¾Ð´Ð° ÐºÐ¾Ð½ÐµÑ†Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ ÐºÐ¾Ð½ÐµÑ†Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ð½Ð½Ð¾Ð³Ð¾Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ ÐºÐ¾Ð½ÐµÑ†ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¾Ð³Ð¾Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð° ÐºÐ¾Ð½ÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»Ð° ÐºÐ¾Ð½Ð¼ÐµÑÑÑ†Ð° ÐºÐ¾Ð½Ð½ÐµÐ´ÐµÐ»Ð¸ Ð»ÐµÐ² Ð»Ð¾Ð³ Ð»Ð¾Ð³10 Ð¼Ð°ÐºÑ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¾ÐµÐºÐ¾Ð»Ð¸Ñ‡ÐµÑÑ‚Ð²Ð¾ÑÑƒÐ±ÐºÐ¾Ð½Ñ‚Ð¾ Ð¼Ð¸Ð½ Ð¼Ð¾Ð½Ð¾Ð¿Ð¾Ð»ÑŒÐ½Ñ‹Ð¹Ñ€ÐµÐ¶Ð¸Ð¼ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹ÑÐ° Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ½Ð°Ð±Ð¾Ñ€Ð°Ð¿Ñ€Ð°Ð² Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒÐ²Ð¸Ð´ Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒÑÑ‡ÐµÑ‚ Ð½Ð°Ð¹Ñ‚Ð¸ Ð½Ð°Ð¹Ñ‚Ð¸Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹ÐµÐ½Ð°ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ðµ Ð½Ð°Ð¹Ñ‚Ð¸ÑÑÑ‹Ð»ÐºÐ¸ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ Ð½Ð°Ñ‡Ð°Ð»Ð¾ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¾Ð³Ð¾Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð° Ð½Ð°Ñ‡Ð°Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð½Ð°Ñ‡Ð³Ð¾Ð´Ð° Ð½Ð°Ñ‡ÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»Ð° Ð½Ð°Ñ‡Ð¼ÐµÑÑÑ†Ð° Ð½Ð°Ñ‡Ð½ÐµÐ´ÐµÐ»Ð¸ Ð½Ð¾Ð¼ÐµÑ€Ð´Ð½ÑÐ³Ð¾Ð´Ð° Ð½Ð¾Ð¼ÐµÑ€Ð´Ð½ÑÐ½ÐµÐ´ÐµÐ»Ð¸ Ð½Ð¾Ð¼ÐµÑ€Ð½ÐµÐ´ÐµÐ»Ð¸Ð³Ð¾Ð´Ð° Ð½Ñ€ÐµÐ³ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾ÐºÑ€ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸ÐµÐ¾ÑˆÐ¸Ð±ÐºÐ¸ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ€Ð°ÑÑ‡ÐµÑ‚Ð¾Ð² Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹ÑÐ·Ñ‹Ðº Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒÑ„Ð¾Ñ€Ð¼Ñƒ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒÑ„Ð¾Ñ€Ð¼ÑƒÐ¼Ð¾Ð´Ð°Ð»ÑŒÐ½Ð¾ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð¾Ñ‡Ð¸ÑÑ‚Ð¸Ñ‚ÑŒÐ¾ÐºÐ½Ð¾ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ð¹ Ð¿ÐµÑ€Ð¸Ð¾Ð´ÑÑ‚Ñ€ Ð¿Ð¾Ð»Ð½Ð¾ÐµÐ¸Ð¼ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ²Ñ€ÐµÐ¼ÑÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ´Ð°Ñ‚ÑƒÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑÐ¾Ñ‚Ð±Ð¾Ñ€Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÑ‚Ð° Ð¿Ñ€Ð°Ð² Ð¿Ñ€Ð°Ð²Ð¾Ð´Ð¾ÑÑ‚ÑƒÐ¿Ð° Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑÐ°Ð²Ñ‚Ð¾Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ð¸Ð¸ Ð¿ÑƒÑÑ‚Ð°ÑÑÑ‚Ñ€Ð¾ÐºÐ° Ð¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ñ€Ð°Ð±Ð¾Ñ‡Ð°ÑÐ´Ð°Ñ‚Ñ‚ÑŒÐ¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ñ€Ð°Ð±Ð¾Ñ‡Ð°ÑÐ´Ð°Ñ‚Ð° Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÑÑ‚Ñ€Ð°Ð½Ð¸Ñ† Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÑÑ‚Ñ€Ð¾Ðº Ñ€Ð°Ð·Ð¼ Ñ€Ð°Ð·Ð¾Ð±Ñ€Ð°Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð° Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ñ‚ÑŒÑ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ñ‹Ð½Ð° Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ñ‚ÑŒÑ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ñ‹Ð¿Ð¾ ÑÐ¸Ð³Ð½Ð°Ð» ÑÐ¸Ð¼Ð² ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ‚Ð°Ð±ÑƒÐ»ÑÑ†Ð¸Ð¸ ÑÐ¾Ð·Ð´Ð°Ñ‚ÑŒÐ¾Ð±ÑŠÐµÐºÑ‚ ÑÐ¾ÐºÑ€Ð» ÑÐ¾ÐºÑ€Ð»Ð¿ ÑÐ¾ÐºÑ€Ð¿ ÑÐ¾Ð¾Ð±Ñ‰Ð¸Ñ‚ÑŒ ÑÐ¾ÑÑ‚Ð¾ÑÐ½Ð¸Ðµ ÑÐ¾Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÑ€ÐµÐ´ ÑÑ‚Ð°Ñ‚ÑƒÑÐ²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° ÑÑ‚Ñ€Ð´Ð»Ð¸Ð½Ð° ÑÑ‚Ñ€Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑÑ‚Ñ€ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑÑ‚Ð²Ð¾ÑÑ‚Ñ€Ð¾Ðº ÑÑ‚Ñ€Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÑÑ‚Ñ€Ð¾ÐºÑƒ  ÑÑ‚Ñ€Ñ‡Ð¸ÑÐ»Ð¾Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ð¹ ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð° ÑÑ‡ÐµÑ‚Ð¿Ð¾ÐºÐ¾Ð´Ñƒ Ñ‚ÐµÐºÑƒÑ‰Ð°ÑÐ´Ð°Ñ‚Ð° Ñ‚ÐµÐºÑƒÑ‰ÐµÐµÐ²Ñ€ÐµÐ¼Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑÑÑ‚Ñ€ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒÐ¾Ð±ÑŠÐµÐºÑ‚Ñ‹ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÑ‚Ð°Ð½Ð° ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÑ‚Ð°Ð¿Ð¾ Ñ„Ð¸ÐºÑÑˆÐ°Ð±Ð»Ð¾Ð½ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ Ñ†ÐµÐ» ÑˆÐ°Ð±Ð»Ð¾Ð½\";var a={cN:\"dquote\",b:'\"\"'};var d={cN:\"string\",b:'\"',e:'\"|$',c:[a]};var g={cN:\"string\",b:\"\\\\|\",e:'\"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:\"function\",b:\"(Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°|Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)\",e:\"$\",l:f,k:\"Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ\",c:[b.inherit(b.TM,{b:f}),{cN:\"tail\",eW:true,c:[{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:f,k:\"Ð·Ð½Ð°Ñ‡\",c:[d,g]},{cN:\"export\",b:\"ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\",eW:true,l:f,k:\"ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\",c:[b.CLCM]}]},b.CLCM]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"date\",b:\"'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})'\"}]}});hljs.registerLanguage(\"javascript\",function(a){return{aliases:[\"js\"],k:{keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require\"},c:[{cN:\"pi\",b:/^\\s*('|\")use strict('|\")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:\"(\"+a.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,c:[a.CLCM,a.CBLCLM],i:/[\"'\\(]/}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+a.IR,r:0}]}});hljs.registerLanguage(\"vbnet\",function(a){return{cI:true,k:{keyword:\"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor\",built_in:\"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort\",literal:\"true false nothing\"},i:\"//|{|}|endif|gosub|variant|wend\",c:[a.inherit(a.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:\"'\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"'''|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"},]},a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elseif end region externalsource\"},]}});hljs.registerLanguage(\"fsharp\",function(a){return{k:\"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield\",c:[{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\"},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[a.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},{cN:\"attribute\",b:\"\\\\B('[A-Za-z])\\\\b\",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage(\"matlab\",function(a){var b=[a.CNM,{cN:\"string\",b:\"'\",e:\"'\",c:[a.BE,{b:\"''\"}]}];return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson\"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},{cN:\"params\",b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",c:b,r:0},{cN:\"cell\",b:\"\\\\{\",e:\"\\\\}'*[\\\\.']*\",c:b,i:/:/},{cN:\"comment\",b:\"\\\\%\",e:\"$\"}].concat(b)}});hljs.registerLanguage(\"applescript\",function(a){var b=a.inherit(a.QSM,{i:\"\"});var d={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.CNM,b]};var c=[{cN:\"comment\",b:\"--\",e:\"$\",},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\",{b:\"--\",e:\"$\"}]},a.HCM];return{k:{keyword:\"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without\",constant:\"AppleScript false linefeed return pi quote result space tab true\",type:\"alias application boolean class constant date file integer list number real record string text\",command:\"activate beep count delay launch log offset read round run say summarize write\",property:\"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year\"},c:[b,a.CNM,{cN:\"type\",b:\"\\\\bPOSIX file\\\\b\"},{cN:\"command\",b:\"\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\\\b|^\\\\s*return\\\\b\"},{cN:\"constant\",b:\"\\\\b(text item delimiters|current application|missing value)\\\\b\"},{cN:\"keyword\",b:\"\\\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\\\b\"},{cN:\"property\",b:\"\\\\b(POSIX path|(date|time) string|quoted form)\\\\b\"},{cN:\"function_start\",bK:\"on\",i:\"[${=;\\\\n]\",c:[a.UTM,d]}].concat(c),i:\"//\"}});hljs.registerLanguage(\"delphi\",function(b){var a=\"exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure\";var e={cN:\"comment\",v:[{b:/\\{/,e:/\\}/,r:0},{b:/\\(\\*/,e:/\\*\\)/,r:10}]};var c={cN:\"string\",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:\"string\",b:/(#\\d+)+/};var f={b:b.IR+\"\\\\s*=\\\\s*class\\\\s*\\\\(\",rB:true,c:[b.TM]};var g={cN:\"function\",bK:\"function constructor destructor procedure\",e:/[:;]/,k:\"function constructor|10 destructor|10 procedure|10\",c:[b.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/(\"|\\$[G-Zg-z]|\\/\\*|<\\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage(\"cpp\",function(a){var b={keyword:\"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary\",built_in:\"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf\"};return{aliases:[\"c\"],k:b,i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{b:\"include\\\\s*<\",e:\">\",i:\"\\\\n\"},a.CLCM]},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:b,r:10,c:[\"self\"]}]}});hljs.registerLanguage(\"json\",function(a){var e={literal:\"true false null\"};var d=[a.QSM,a.CNM];var c={cN:\"value\",e:\",\",eW:true,eE:true,c:d,k:e};var b={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:true,eE:true,c:[a.BE],i:\"\\\\n\",starts:c}],i:\"\\\\S\"};var f={b:\"\\\\[\",e:\"\\\\]\",c:[a.inherit(c,{cN:null})],i:\"\\\\S\"};d.splice(d.length,0,b,f);return{c:d,k:e,i:\"\\\\S\"}});hljs.registerLanguage(\"perl\",function(c){var d=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\";var f={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:d};var g={b:\"->{\",e:\"}\"};var a={cN:\"variable\",v:[{b:/\\$\\d/},{b:/[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},{b:/[\\$\\%\\@\\*][^\\s\\w{]/,r:0}]};var e={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:\"comment\",b:\"^\\\\=\\\\w\",e:\"\\\\=cut\",eW:true},g,{cN:\"string\",c:h,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[c.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[c.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+c.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[c.HCM,e,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[c.BE],r:0}]},{cN:\"sub\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage(\"markdown\",function(a){return{c:[{cN:\"header\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"`.+?`\"},{b:\"^( {4}|\\t)\",e:\"$\",r:0}]},{cN:\"horizontal_rule\",b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,rE:true,r:0},{cN:\"link_url\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:true,eE:true},{cN:\"link_reference\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:true,eE:true,}],r:10},{b:\"^\\\\[.+\\\\]:\",e:\"$\",rB:true,c:[{cN:\"link_reference\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true},{cN:\"link_url\",b:\"\\\\s\",e:\"$\"}]}]}});hljs.registerLanguage(\"ocaml\",function(a){return{k:{keyword:\"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value\",built_in:\"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string\",},i:/\\/\\//,c:[{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\"]},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[a.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage(\"d\",function(x){var b={keyword:\"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__\",built_in:\"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring\",literal:\"false null true\"};var c=\"(0|[1-9][\\\\d_]*)\",q=\"(0|[1-9][\\\\d_]*|\\\\d[\\\\d_]*|[\\\\d_]+?\\\\d)\",h=\"0[bB][01_]+\",v=\"([\\\\da-fA-F][\\\\da-fA-F_]*|_[\\\\da-fA-F][\\\\da-fA-F_]*)\",y=\"0[xX]\"+v,p=\"([eE][+-]?\"+q+\")\",o=\"(\"+q+\"(\\\\.\\\\d*|\"+p+\")|\\\\d+\\\\.\"+q+q+\"|\\\\.\"+c+p+\"?)\",k=\"(0[xX](\"+v+\"\\\\.\"+v+\"|\\\\.?\"+v+\")[pP][+-]?\"+q+\")\",l=\"(\"+c+\"|\"+h+\"|\"+y+\")\",n=\"(\"+k+\"|\"+o+\")\";var z=\"\\\\\\\\(['\\\"\\\\?\\\\\\\\abfnrtv]|u[\\\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\\\dA-Fa-f]{2}|U[\\\\dA-Fa-f]{8})|&[a-zA-Z\\\\d]{2,};\";var m={cN:\"number\",b:\"\\\\b\"+l+\"(L|u|U|Lu|LU|uL|UL)?\",r:0};var j={cN:\"number\",b:\"\\\\b(\"+n+\"([fF]|L|i|[fF]i|Li)?|\"+l+\"(i|[fF]i|Li))\",r:0};var s={cN:\"string\",b:\"'(\"+z+\"|.)\",e:\"'\",i:\".\"};var r={b:z,r:0};var w={cN:\"string\",b:'\"',c:[r],e:'\"[cwd]?'};var f={cN:\"string\",b:'[rq]\"',e:'\"[cwd]?',r:5};var u={cN:\"string\",b:\"`\",e:\"`[cwd]?\"};var i={cN:\"string\",b:'x\"[\\\\da-fA-F\\\\s\\\\n\\\\r]*\"[cwd]?',r:10};var t={cN:\"string\",b:'q\"\\\\{',e:'\\\\}\"'};var e={cN:\"shebang\",b:\"^#!\",e:\"$\",r:5};var g={cN:\"preprocessor\",b:\"#(line)\",e:\"$\",r:5};var d={cN:\"keyword\",b:\"@[a-zA-Z_][a-zA-Z_\\\\d]*\"};var a={cN:\"comment\",b:\"\\\\/\\\\+\",c:[\"self\"],e:\"\\\\+\\\\/\",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}});hljs.registerLanguage(\"coffeescript\",function(c){var b={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",reserved:\"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf\",built_in:\"npm require console print module exports global window document\"};var a=\"[A-Za-z$_][0-9A-Za-z$_]*\";var f=c.inherit(c.TM,{b:a});var e={cN:\"subst\",b:/#\\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[c.BE,e]},{b:/\"/,e:/\"/,c:[c.BE,e]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[e,c.HCM]},{b:\"//[gim]*\",r:0},{b:\"/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)\"}]},{cN:\"property\",b:\"@\"+a},{b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"}];e.c=d;return{k:b,c:d.concat([{cN:\"comment\",b:\"###\",e:\"###\"},c.HCM,{cN:\"function\",b:\"(\"+a+\"\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",e:\"[-=]>\",rB:true,c:[f,{cN:\"params\",b:\"\\\\(\",rB:true,c:[{b:/\\(/,e:/\\)/,k:b,c:[\"self\"].concat(d)}]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:true,i:/[:=\"\\[\\]]/,c:[f]},f]},{cN:\"attribute\",b:a+\":\",e:\":\",rB:true,eE:true,r:0}])}});hljs.registerLanguage(\"lua\",function(b){var a=\"\\\\[=*\\\\[\";var e=\"\\\\]=*\\\\]\";var c={b:a,e:e,c:[\"self\"]};var d=[{cN:\"comment\",b:\"--(?!\"+a+\")\",e:\"$\"},{cN:\"comment\",b:\"--\"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:\"and break do else elseif end false for if in local nil not or repeat return then true until while\",built_in:\"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table\"},c:d.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[b.inherit(b.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:\"string\",b:a,e:e,c:[c],r:10}])}});hljs.registerLanguage(\"makefile\",function(a){var b={cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\\w+\\s*\\W*=/,rB:true,r:0,starts:{cN:\"constant\",e:/\\s*\\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:\"title\",b:/^[\\w]+:\\s*$/},{cN:\"phony\",b:/^\\.PHONY:/,e:/$/,k:\".PHONY\",l:/[\\.\\w]+/},{b:/^\\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage(\"rsl\",function(a){return{k:{keyword:\"float color point normal vector matrix while for if do return else break extern continue\",built_in:\"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp\"},i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"shader\",bK:\"surface displacement light volume imager\",e:\"\\\\(\"},{cN:\"shading\",bK:\"illuminate illuminance gather\",e:\"\\\\(\"}]}});hljs.registerLanguage(\"vbscript\",function(a){return{cI:true,k:{keyword:\"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto\",built_in:\"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err\",literal:\"true false null nothing empty\"},i:\"//\",c:[a.inherit(a.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage(\"go\",function(a){var b={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer\",constant:\"true false iota nil\",typename:\"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:b,i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\"},{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"number\",b:\"[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\",r:0},a.CNM]}});hljs.registerLanguage(\"axapta\",function(a){return{k:\"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod\",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",bK:\"class interface\",e:\"{\",i:\":\",c:[{cN:\"inheritance\",bK:\"extends implements\",r:10},a.UTM]}]}});hljs.registerLanguage(\"vala\",function(a){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface delegate namespace\",e:\"{\",i:\"[^,:\\\\n\\\\s\\\\.]\",c:[a.UTM]},a.CLCM,a.CBLCLM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',r:5},a.ASM,a.QSM,a.CNM,{cN:\"preprocessor\",b:\"^#\",e:\"$\",r:2},{cN:\"constant\",b:\" [A-Z_]+ \",r:0}]}});hljs.registerLanguage(\"erlang\",function(i){var c=\"[a-z'][a-zA-Z0-9_']*\";var o=\"(\"+c+\":\"+c+\"|\"+c+\")\";var f={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor\",literal:\"false true\"};var l={cN:\"comment\",b:\"%\",e:\"$\",r:0};var e={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0};var g={b:\"fun\\\\s+\"+c+\"/\\\\d+\"};var n={b:o+\"\\\\(\",e:\"\\\\)\",rB:true,r:0,c:[{cN:\"function_name\",b:o,r:0},{b:\"\\\\(\",e:\"\\\\)\",eW:true,rE:true,r:0}]};var h={cN:\"tuple\",b:\"{\",e:\"}\",r:0};var a={cN:\"variable\",b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",r:0};var m={cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_]*\",r:0};var b={b:\"#\"+i.UIR,r:0,rB:true,c:[{cN:\"record_name\",b:\"#\"+i.UIR,r:0},{b:\"{\",e:\"}\",r:0}]};var k={bK:\"fun receive if try case\",e:\"end\",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:\"\"}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:j};return{k:f,i:\"(</|\\\\*=|\\\\+=|-=|/=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+c+\"\\\\s*\\\\(\",e:\"->\",rB:true,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[d,i.inherit(i.TM,{b:c})],starts:{e:\";|\\\\.\",k:f,c:j}},l,{cN:\"pp\",b:\"^-\",e:\"\\\\.\",r:0,eE:true,rB:true,l:\"-\"+i.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior\",c:[d]},e,i.QSM,b,a,m,h]}});hljs.registerLanguage(\"sql\",function(a){return{cI:true,i:/[<>]/,c:[{cN:\"operator\",b:\"\\\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\\\b(?!:)\",e:\";\",eW:true,k:{keyword:\"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database\",aggregate:\"count sum min max avg\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[a.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[a.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}});hljs.registerLanguage(\"mizar\",function(a){return{k:[\"environ vocabularies notations constructors definitions registrations theorems schemes requirements\",\"begin end definition registration cluster existence pred func defpred deffunc theorem proof\",\"let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from\",\"be being by means equals implies iff redefine define now not or attr is mode suppose per cases set\",\"thesis contradiction scheme reserve struct\",\"correctness compatibility coherence symmetry assymetry reflexivity irreflexivity\",\"connectedness uniqueness commutativity idempotence involutiveness projectivity\"].join(\" \"),c:[{cN:\"comment\",b:\"::\",e:\"$\"}]}});hljs.registerLanguage(\"lasso\",function(d){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*\";var i=\"<\\\\?(lasso(script)?|=)\";var c=\"\\\\]|\\\\?>\";var g={literal:\"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft\",built_in:\"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited\",keyword:\"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome\"};var a={cN:\"comment\",b:\"<!--\",e:\"-->\",r:0};var j={cN:\"preprocessor\",b:\"\\\\[noprocess\\\\]\",starts:{cN:\"markup\",e:\"\\\\[/noprocess\\\\]\",rE:true,c:[a]}};var e={cN:\"preprocessor\",b:\"\\\\[/noprocess|\"+i};var h={cN:\"variable\",b:\"'\"+b+\"'\"};var f=[d.CLCM,{cN:\"javadoc\",b:\"/\\\\*\\\\*!\",e:\"\\\\*/\"},d.CBLCLM,d.inherit(d.CNM,{b:d.CNR+\"|-?(infinity|nan)\\\\b\"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"variable\",v:[{b:\"[#$]\"+b},{b:\"#\",e:\"\\\\d+\",i:\"\\\\W\"}]},{cN:\"tag\",b:\"::\\\\s*\",e:b,i:\"\\\\W\"},{cN:\"attribute\",b:\"\\\\.\\\\.\\\\.|-\"+d.UIR},{cN:\"subst\",v:[{b:\"->\\\\s*\",c:[h]},{b:\":=|/(?!\\\\w)=?|[-+*%=<>&|!?\\\\\\\\]+\",r:0}]},{cN:\"built_in\",b:\"\\\\.\\\\.?\",r:0,c:[h]},{cN:\"class\",bK:\"define\",rE:true,e:\"\\\\(|=>\",c:[d.inherit(d.TM,{b:d.UIR+\"(=(?!>))?\"})]}];return{aliases:[\"ls\",\"lassoscript\"],cI:true,l:b+\"|&[lg]t;\",k:g,c:[{cN:\"preprocessor\",b:c,r:0,starts:{cN:\"markup\",e:\"\\\\[|\"+i,rE:true,r:0,c:[a]}},j,e,{cN:\"preprocessor\",b:\"\\\\[no_square_brackets\",starts:{e:\"\\\\[/no_square_brackets\\\\]\",l:b+\"|&[lg]t;\",k:g,c:[{cN:\"preprocessor\",b:c,r:0,starts:{cN:\"markup\",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:\"preprocessor\",b:\"\\\\[\",r:0},{cN:\"shebang\",b:\"^#!.+lasso9\\\\b\",r:10}].concat(f)}});hljs.registerLanguage(\"r\",function(a){var b=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[a.HCM,{b:b,l:b,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},r:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",r:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{b:\"`\",e:\"`\",r:0},{cN:\"string\",c:[a.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"scala\",function(a){var c={cN:\"annotation\",b:\"@[A-Za-z]+\"};var b={cN:\"string\",b:'u?r?\"\"\"',e:'\"\"\"',r:10};return{k:\"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws\",c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},a.CLCM,a.CBLCLM,b,a.ASM,a.QSM,{cN:\"class\",b:\"((case )?class |object |trait )\",e:\"({|$)\",i:\":\",k:\"case class trait object\",c:[{bK:\"extends with\",r:10},a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}});hljs.registerLanguage(\"livecodeserver\",function(a){var e={cN:\"variable\",b:\"\\\\b[gtps][A-Z]+[A-Za-z0-9_\\\\-]*\\\\b|\\\\$_[A-Z]+\",r:0};var b={cN:\"comment\",e:\"$\",v:[a.CBLCLM,a.HCM,{b:\"--\",},{b:\"[^:]//\",}]};var d=a.inherit(a.TM,{v:[{b:\"\\\\b_*rig[A-Z]+[A-Za-z0-9_\\\\-]*\"},{b:\"\\\\b_[a-z0-9\\\\-]+\"}]});var c=a.inherit(a.TM,{b:\"\\\\b([A-Za-z0-9_\\\\-]+)\\\\b\"});return{cI:false,k:{keyword:\"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if\",constant:\"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK\",operator:\"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys\",built_in:\"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write\"},c:[e,{cN:\"keyword\",b:\"\\\\bend\\\\sif\\\\b\"},{cN:\"function\",bK:\"function\",e:\"$\",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:\"function\",bK:\"end\",e:\"$\",c:[c,d]},{cN:\"command\",bK:\"command on\",e:\"$\",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:\"command\",bK:\"end\",e:\"$\",c:[c,d]},{cN:\"preprocessor\",b:\"<\\\\?rev|<\\\\?lc|<\\\\?livecode\",r:10},{cN:\"preprocessor\",b:\"<\\\\?\"},{cN:\"preprocessor\",b:\"\\\\?>\"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:\";$|^\\\\[|^=\"}});hljs.registerLanguage(\"profile\",function(a){return{c:[a.CNM,{cN:\"built_in\",b:\"{\",e:\"}$\",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:\"filename\",b:\"[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}\",e:\":\",eE:true},{cN:\"header\",b:\"(ncalls|tottime|cumtime)\",e:\"$\",k:\"ncalls tottime|10 cumtime|10 filename\",r:10},{cN:\"summary\",b:\"function calls\",e:\"$\",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:\"function\",b:\"\\\\(\",e:\"\\\\)$\",c:[a.UTM],r:0}]}});hljs.registerLanguage(\"php\",function(b){var e={cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"};var a={cN:\"preprocessor\",b:/<\\?(php)?|\\?>/};var c={cN:\"string\",c:[b.BE,a],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[b.CLCM,b.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"},a]},{cN:\"comment\",b:\"__halt_compiler.+?;\",eW:true,k:\"__halt_compiler\",l:b.UIR},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[b.BE]},a,e,{cN:\"function\",bK:\"function\",e:/[;{]/,i:\"\\\\$|\\\\[|%\",c:[b.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",e,b.CBLCLM,c,d]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[b.UTM]},{bK:\"use\",e:\";\",c:[b.UTM]},{b:\"=>\"},c,d]}});hljs.registerLanguage(\"parser3\",function(a){return{sL:\"xml\",r:0,c:[{cN:\"comment\",b:\"^#\",e:\"$\"},{cN:\"comment\",b:\"\\\\^rem{\",e:\"}\",r:10,c:[{b:\"{\",e:\"}\",c:[\"self\"]}]},{cN:\"preprocessor\",b:\"^@(?:BASE|USE|CLASS|OPTIONS)$\",r:10},{cN:\"title\",b:\"@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$\"},{cN:\"variable\",b:\"\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?\"},{cN:\"keyword\",b:\"\\\\^[\\\\w\\\\-\\\\.\\\\:]+\"},{cN:\"number\",b:\"\\\\^#[0-9a-fA-F]+\"},a.CNM]}});hljs.registerLanguage(\"actionscript\",function(a){var c=\"[a-zA-Z_$][a-zA-Z0-9_$]*\";var b=\"([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)\";var d={cN:\"rest_arg\",b:\"[.]{3}\",e:c,r:10};return{k:{keyword:\"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with\",literal:\"true false null undefined\"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:\"package\",bK:\"package\",e:\"{\",c:[a.TM]},{cN:\"class\",bK:\"class interface\",e:\"{\",c:[{bK:\"extends implements\"},a.TM]},{cN:\"preprocessor\",bK:\"import include\",e:\";\"},{cN:\"function\",bK:\"function\",e:\"[{;]\",i:\"\\\\S\",c:[a.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,d]},{cN:\"type\",b:\":\",e:b,r:10}]}]}});hljs.registerLanguage(\"nginx\",function(c){var b={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+c.UIR}]};var a={eW:true,l:\"[a-z/_]+\",k:{built_in:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[c.HCM,{cN:\"string\",c:[c.BE,b],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{cN:\"url\",b:\"([a-z]+):/\",e:\"\\\\s\",eW:true,eE:true},{cN:\"regexp\",c:[c.BE,b],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},b]};return{c:[c.HCM,{b:c.UIR+\"\\\\s\",e:\";|{\",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"vhdl\",function(a){return{cI:true,k:{keyword:\"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor\",typename:\"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector\"},i:\"{\",c:[a.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"},a.QSM,a.CNM,{cN:\"literal\",b:\"'(U|X|0|1|Z|W|L|H|-)'\",c:[a.BE]},{cN:\"attribute\",b:\"'[A-Za-z](_?[A-Za-z0-9])*\",c:[a.BE]}]}});hljs.registerLanguage(\"fix\",function(a){return{c:[{b:/[^\\u2401\\u0001]+/,e:/[\\u2401\\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\\u2401\\u0001=]+)/,e:/=([^\\u2401\\u0001=]+)/,rE:true,rB:false,cN:\"attribute\"},{b:/=/,e:/([\\u2401\\u0001])/,eE:true,eB:true,cN:\"string\"}]}],cI:true}});hljs.registerLanguage(\"diff\",function(a){return{c:[{cN:\"chunk\",r:10,v:[{b:/^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"header\",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\\-\\-\\-/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+\\+\\+/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"smalltalk\",function(a){var b=\"[a-z][a-zA-Z0-9_]*\";var d={cN:\"char\",b:\"\\\\$.{1}\"};var c={cN:\"symbol\",b:\"#\"+a.UIR};return{k:\"self super nil true false thisContext\",c:[{cN:\"comment\",b:'\"',e:'\"'},a.ASM,{cN:\"class\",b:\"\\\\b[A-Z][A-Za-z0-9_]*\",r:0},{cN:\"method\",b:b+\":\",r:0},a.CNM,c,d,{cN:\"localvars\",b:\"\\\\|[ ]*\"+b+\"([ ]+\"+b+\")*[ ]*\\\\|\",rB:true,e:/\\|/,i:/\\S/,c:[{b:\"(\\\\|[ ]*)?\"+b}]},{cN:\"array\",b:\"\\\\#\\\\(\",e:\"\\\\)\",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage(\"clojure\",function(l){var e={built_in:\"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize\"};var f=\"[a-zA-Z_0-9\\\\!\\\\.\\\\?\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#\\\\$';]+\";var a=\"[\\\\s:\\\\(\\\\{]+\\\\d+(\\\\.\\\\d+)?\";var d={cN:\"number\",b:a,r:0};var j=l.inherit(l.QSM,{i:null});var o={cN:\"comment\",b:\";\",e:\"$\",r:0};var n={cN:\"collection\",b:\"[\\\\[\\\\{]\",e:\"[\\\\]\\\\}]\"};var c={cN:\"comment\",b:\"\\\\^\"+f};var b={cN:\"comment\",b:\"\\\\^\\\\{\",e:\"\\\\}\"};var h={cN:\"attribute\",b:\"[:]\"+f};var m={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var g={eW:true,k:{literal:\"true false nil\"},r:0};var i={k:e,l:f,cN:\"title\",b:f,starts:g};m.c=[{cN:\"comment\",b:\"comment\"},i,g];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:/\\S/,c:[o,m,{cN:\"prompt\",b:/^=> /,starts:{e:/\\n\\n|\\Z/}}]}});hljs.registerLanguage(\"oxygene\",function(b){var g=\"abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained\";var a={cN:\"comment\",b:\"{\",e:\"}\",r:0};var e={cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",r:10};var c={cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]};var d={cN:\"string\",b:\"(#\\\\d+)+\"};var f={cN:\"function\",bK:\"function constructor destructor procedure method\",e:\"[:;]\",k:\"function constructor|10 destructor|10 procedure|10 method|10\",c:[b.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',c:[a,e,b.CLCM,c,d,b.NM,f,{cN:\"class\",b:\"=\\\\bclass\\\\b\",e:\"end;\",k:g,c:[c,d,a,e,b.CLCM,f]}]}});hljs.registerLanguage(\"asciidoc\",function(a){return{c:[{cN:\"comment\",b:\"^/{4,}\\\\n\",e:\"\\\\n/{4,}$\",r:10},{cN:\"comment\",b:\"^//\",e:\"$\",r:0},{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",r:10},{cN:\"header\",b:\"^(={1,5}) .+?( \\\\1)?$\",r:10},{cN:\"header\",b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\",r:10},{cN:\"attribute\",b:\"^:.+?:\",e:\"\\\\s\",eE:true,r:10},{cN:\"attribute\",b:\"^\\\\[.+?\\\\]$\",r:0},{cN:\"blockquote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",r:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",r:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",r:0}],r:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"label\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",r:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",r:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",r:0}],r:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",r:0},{cN:\"smartquote\",b:\"``.+?''\",r:10},{cN:\"smartquote\",b:\"`.+?'\",r:10},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",r:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",r:0},{cN:\"horizontal_rule\",b:\"^'{3,}[ \\\\t]*$\",r:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:true,c:[{b:\"(link|image:?):\",r:0},{cN:\"link_url\",b:\"\\\\w\",e:\"[^\\\\[]+\",r:0},{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage(\"erlang-repl\",function(a){return{k:{special_functions:\"spawn spawn_link self\",reserved:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"prompt\",b:\"^[0-9]+> \",r:10},{cN:\"comment\",b:\"%\",e:\"$\"},{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0},a.ASM,a.QSM,{cN:\"constant\",b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{cN:\"arrow\",b:\"->\"},{cN:\"ok\",b:\"ok\"},{cN:\"exclamation_mark\",b:\"!\"},{cN:\"function_or_atom\",b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",r:0},{cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_']*\",r:0}]}});hljs.registerLanguage(\"autohotkey\",function(b){var d={cN:\"escape\",b:\"`[\\\\s\\\\S]\"};var c={cN:\"comment\",b:\";\",e:\"$\",r:0};var a=[{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{cN:\"built_in\",bK:\"ComSpec Clipboard ClipboardAll ErrorLevel\"}];return{cI:true,k:{keyword:\"Break Continue Else Gosub If Loop Return While\",literal:\"A true false NOT AND OR\"},c:a.concat([d,b.inherit(b.QSM,{c:[d]}),c,{cN:\"number\",b:b.NR,r:0},{cN:\"var_expand\",b:\"%\",e:\"%\",i:\"\\\\n\",c:[d]},{cN:\"label\",c:[d],v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',r:0}]},{b:\",\\\\s*,\",r:10}])}});hljs.registerLanguage(\"scilab\",function(a){var b=[a.CNM,{cN:\"string\",b:\"'|\\\"\",e:\"'|\\\"\",c:[a.BE,{b:\"''\"}]}];return{k:{keyword:\"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s\",built_in:\"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix\"},i:'(\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function endfunction\",e:\"$\",k:\"function endfunction|10\",c:[a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},],},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",r:0,c:b},{cN:\"comment\",b:\"//\",e:\"$\"}].concat(b)}});\n"
  },
  {
    "path": "ppt/js/highlight/languages/1c.js",
    "content": "/*\nLanguage: 1C\nAuthor: Yuri Ivanov <ivanov@supersoft.ru>\nContributors: Sergey Baranov <segyrn@yandex.ru>\n*/\n\nfunction(hljs){\n  var IDENT_RE_RU = '[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*';\n  var OneS_KEYWORDS = 'возврат дата для если и или иначе иначеесли исключение конецесли ' +\n    'конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем ' +\n    'перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл ' +\n    'число экспорт';\n  var OneS_BUILT_IN = 'ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ' +\n    'ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос ' +\n    'восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц ' +\n    'датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации ' +\n    'запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр ' +\n    'значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера ' +\n    'имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы ' +\n    'кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби ' +\n    'конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс ' +\n    'максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ ' +\n    'назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби ' +\n    'началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели ' +\n    'номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки ' +\n    'основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально ' +\n    'отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята ' +\n    'получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта ' +\n    'получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации ' +\n    'пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц ' +\n    'разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына ' +\n    'рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп ' +\n    'сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить ' +\n    'стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента ' +\n    'счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты ' +\n    'установитьтана установитьтапо фиксшаблон формат цел шаблон';\n  var DQUOTE =  {className: 'dquote',  begin: '\"\"'};\n  var STR_START = {\n      className: 'string',\n      begin: '\"', end: '\"|$',\n      contains: [DQUOTE]\n    };\n  var STR_CONT = {\n    className: 'string',\n    begin: '\\\\|', end: '\"|$',\n    contains: [DQUOTE]\n  };\n\n  return {\n    case_insensitive: true,\n    lexemes: IDENT_RE_RU,\n    keywords: {keyword: OneS_KEYWORDS, built_in: OneS_BUILT_IN},\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.NUMBER_MODE,\n      STR_START, STR_CONT,\n      {\n        className: 'function',\n        begin: '(процедура|функция)', end: '$',\n        lexemes: IDENT_RE_RU,\n        keywords: 'процедура функция',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE_RU}),\n          {\n            className: 'tail',\n            endsWithParent: true,\n            contains: [\n              {\n                className: 'params',\n                begin: '\\\\(', end: '\\\\)',\n                lexemes: IDENT_RE_RU,\n                keywords: 'знач',\n                contains: [STR_START, STR_CONT]\n              },\n              {\n                className: 'export',\n                begin: 'экспорт', endsWithParent: true,\n                lexemes: IDENT_RE_RU,\n                keywords: 'экспорт',\n                contains: [hljs.C_LINE_COMMENT_MODE]\n              }\n            ]\n          },\n          hljs.C_LINE_COMMENT_MODE\n        ]\n      },\n      {className: 'preprocessor', begin: '#', end: '$'},\n      {className: 'date', begin: '\\'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})\\''}\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/actionscript.js",
    "content": "/*\nLanguage: ActionScript\nAuthor: Alexander Myadzel <myadzel@gmail.com>\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';\n  var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';\n\n  var AS3_REST_ARG_MODE = {\n    className: 'rest_arg',\n    begin: '[.]{3}', end: IDENT_RE,\n    relevance: 10\n  };\n\n  return {\n    aliases: ['as'],\n    keywords: {\n      keyword: 'as break case catch class const continue default delete do dynamic each ' +\n        'else extends final finally for function get if implements import in include ' +\n        'instanceof interface internal is namespace native new override package private ' +\n        'protected public return set static super switch this throw try typeof use var void ' +\n        'while with',\n      literal: 'true false null undefined'\n    },\n    contains: [\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'package',\n        beginKeywords: 'package', end: '{',\n        contains: [hljs.TITLE_MODE]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.TITLE_MODE\n        ]\n      },\n      {\n        className: 'preprocessor',\n        beginKeywords: 'import include', end: ';'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '[{;]', excludeEnd: true,\n        illegal: '\\\\S',\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              AS3_REST_ARG_MODE\n            ]\n          },\n          {\n            className: 'type',\n            begin: ':',\n            end: IDENT_FUNC_RETURN_TYPE_RE,\n            relevance: 10\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/apache.js",
    "content": "/*\nLanguage: Apache\nAuthor: Ruslan Keba <rukeba@gmail.com>\nContributors: Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: http://rukeba.com/\nDescription: language definition for Apache configuration files (httpd.conf & .htaccess)\n*/\n\nfunction(hljs) {\n  var NUMBER = {className: 'number', begin: '[\\\\$%]\\\\d+'};\n  return {\n    aliases: ['apacheconf'],\n    case_insensitive: true,\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {className: 'tag', begin: '</?', end: '>'},\n      {\n        className: 'keyword',\n        begin: /\\w+/,\n        relevance: 0,\n        // keywords aren’t needed for highlighting per se, they only boost relevance\n        // for a very generally defined mode (starts with a word, ends with line-end\n        keywords: {\n          common:\n            'order deny allow setenv rewriterule rewriteengine rewritecond documentroot ' +\n            'sethandler errordocument loadmodule options header listen serverroot ' +\n            'servername'\n        },\n        starts: {\n          end: /$/,\n          relevance: 0,\n          keywords: {\n            literal: 'on off all'\n          },\n          contains: [\n            {\n              className: 'sqbracket',\n              begin: '\\\\s\\\\[', end: '\\\\]$'\n            },\n            {\n              className: 'cbracket',\n              begin: '[\\\\$%]\\\\{', end: '\\\\}',\n              contains: ['self', NUMBER]\n            },\n            NUMBER,\n            hljs.QUOTE_STRING_MODE\n          ]\n        }\n      }\n    ],\n    illegal: /\\S/\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/applescript.js",
    "content": "/*\nLanguage: AppleScript\nAuthors: Nathan Grigg <nathan@nathanamy.org>\n         Dr. Drang <drdrang@gmail.com>\n*/\n\nfunction(hljs) {\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: ''});\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    contains: ['self', hljs.C_NUMBER_MODE, STRING]\n  };\n  var COMMENTS = [\n    {\n      className: 'comment',\n      begin: '--', end: '$'\n    },\n    {\n      className: 'comment',\n      begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n      contains: ['self', {begin: '--', end: '$'}] //allow nesting\n    },\n    hljs.HASH_COMMENT_MODE\n  ];\n\n  return {\n    aliases: ['osascript'],\n    keywords: {\n      keyword:\n        'about above after against and around as at back before beginning ' +\n        'behind below beneath beside between but by considering ' +\n        'contain contains continue copy div does eighth else end equal ' +\n        'equals error every exit fifth first for fourth from front ' +\n        'get given global if ignoring in into is it its last local me ' +\n        'middle mod my ninth not of on onto or over prop property put ref ' +\n        'reference repeat returning script second set seventh since ' +\n        'sixth some tell tenth that the|0 then third through thru ' +\n        'timeout times to transaction try until where while whose with ' +\n        'without',\n      constant:\n        'AppleScript false linefeed return pi quote result space tab true',\n      type:\n        'alias application boolean class constant date file integer list ' +\n        'number real record string text',\n      command:\n        'activate beep count delay launch log offset read round ' +\n        'run say summarize write',\n      property:\n        'character characters contents day frontmost id item length ' +\n        'month name paragraph paragraphs rest reverse running time version ' +\n        'weekday word words year'\n    },\n    contains: [\n      STRING,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'type',\n        begin: '\\\\bPOSIX file\\\\b'\n      },\n      {\n        className: 'command',\n        begin:\n          '\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|' +\n          'mount volume|path to|(close|open for) access|(get|set) eof|' +\n          'current date|do shell script|get volume settings|random number|' +\n          'set volume|system attribute|system info|time to GMT|' +\n          '(load|run|store) script|scripting components|' +\n          'ASCII (character|number)|localized string|' +\n          'choose (application|color|file|file name|' +\n          'folder|from list|remote application|URL)|' +\n          'display (alert|dialog))\\\\b|^\\\\s*return\\\\b'\n      },\n      {\n        className: 'constant',\n        begin:\n          '\\\\b(text item delimiters|current application|missing value)\\\\b'\n      },\n      {\n        className: 'keyword',\n        begin:\n          '\\\\b(apart from|aside from|instead of|out of|greater than|' +\n          \"isn't|(doesn't|does not) (equal|come before|come after|contain)|\" +\n          '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' +\n          'contained by|comes (before|after)|a (ref|reference))\\\\b'\n      },\n      {\n        className: 'property',\n        begin:\n          '\\\\b(POSIX path|(date|time) string|quoted form)\\\\b'\n      },\n      {\n        className: 'function_start',\n        beginKeywords: 'on',\n        illegal: '[${=;\\\\n]',\n        contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]\n      }\n    ].concat(COMMENTS),\n    illegal: '//'\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/asciidoc.js",
    "content": "/*\nLanguage: AsciiDoc\nRequires: xml.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://google.com/profiles/dan.j.allen\nDescription: A semantic, text-based document format that can be exported to HTML, DocBook and other backends.\n*/\nfunction(hljs) {\n  return {\n    contains: [\n      // block comment\n      {\n        className: 'comment',\n        begin: '^/{4,}\\\\n',\n        end: '\\\\n/{4,}$',\n        // can also be done as...\n        //begin: '^/{4,}$',\n        //end: '^/{4,}$',\n        relevance: 10\n      },\n      // line comment\n      {\n        className: 'comment',\n        begin: '^//',\n        end: '$',\n        relevance: 0\n      },\n      // title\n      {\n        className: 'title',\n        begin: '^\\\\.\\\\w.*$'\n      },\n      // example, admonition & sidebar blocks\n      {\n        begin: '^[=\\\\*]{4,}\\\\n',\n        end: '\\\\n^[=\\\\*]{4,}$',\n        relevance: 10\n      },\n      // headings\n      {\n        className: 'header',\n        begin: '^(={1,5}) .+?( \\\\1)?$',\n        relevance: 10\n      },\n      {\n        className: 'header',\n        begin: '^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$',\n        relevance: 10\n      },\n      // document attributes\n      {\n        className: 'attribute',\n        begin: '^:.+?:',\n        end: '\\\\s',\n        excludeEnd: true,\n        relevance: 10\n      },\n      // block attributes\n      {\n        className: 'attribute',\n        begin: '^\\\\[.+?\\\\]$',\n        relevance: 0\n      },\n      // quoteblocks\n      {\n        className: 'blockquote',\n        begin: '^_{4,}\\\\n',\n        end: '\\\\n_{4,}$',\n        relevance: 10\n      },\n      // listing and literal blocks\n      {\n        className: 'code',\n        begin: '^[\\\\-\\\\.]{4,}\\\\n',\n        end: '\\\\n[\\\\-\\\\.]{4,}$',\n        relevance: 10\n      },\n      // passthrough blocks\n      {\n        begin: '^\\\\+{4,}\\\\n',\n        end: '\\\\n\\\\+{4,}$',\n        contains: [\n          {\n            begin: '<', end: '>',\n            subLanguage: 'xml',\n            relevance: 0\n          }\n        ],\n        relevance: 10\n      },\n      // lists (can only capture indicators)\n      {\n        className: 'bullet',\n        begin: '^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+'\n      },\n      // admonition\n      {\n        className: 'label',\n        begin: '^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+',\n        relevance: 10\n      },\n      // inline strong\n      {\n        className: 'strong',\n        // must not follow a word character or be followed by an asterisk or space\n        begin: '\\\\B\\\\*(?![\\\\*\\\\s])',\n        end: '(\\\\n{2}|\\\\*)',\n        // allow escaped asterisk followed by word char\n        contains: [\n          {\n            begin: '\\\\\\\\*\\\\w',\n            relevance: 0\n          }\n        ]\n      },\n      // inline emphasis\n      {\n        className: 'emphasis',\n        // must not follow a word character or be followed by a single quote or space\n        begin: '\\\\B\\'(?![\\'\\\\s])',\n        end: '(\\\\n{2}|\\')',\n        // allow escaped single quote followed by word char\n        contains: [\n          {\n            begin: '\\\\\\\\\\'\\\\w',\n            relevance: 0\n          }\n        ],\n        relevance: 0\n      },\n      // inline emphasis (alt)\n      {\n        className: 'emphasis',\n        // must not follow a word character or be followed by an underline or space\n        begin: '_(?![_\\\\s])',\n        end: '(\\\\n{2}|_)',\n        relevance: 0\n      },\n      // inline double smart quotes\n      {\n        className: 'smartquote',\n        begin: \"``.+?''\",\n        relevance: 10\n      },\n      // inline single smart quotes\n      {\n        className: 'smartquote',\n        begin: \"`.+?'\",\n        relevance: 10\n      },\n      // inline code snippets (TODO should get same treatment as strong and emphasis)\n      {\n        className: 'code',\n        begin: '(`.+?`|\\\\+.+?\\\\+)',\n        relevance: 0\n      },\n      // indented literal block\n      {\n        className: 'code',\n        begin: '^[ \\\\t]',\n        end: '$',\n        relevance: 0\n      },\n      // horizontal rules\n      {\n        className: 'horizontal_rule',\n        begin: '^\\'{3,}[ \\\\t]*$',\n        relevance: 10\n      },\n      // images and links\n      {\n        begin: '(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]',\n        returnBegin: true,\n        contains: [\n          {\n            //className: 'macro',\n            begin: '(link|image:?):',\n            relevance: 0\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\w',\n            end: '[^\\\\[]+',\n            relevance: 0\n          },\n          {\n            className: 'link_label',\n            begin: '\\\\[',\n            end: '\\\\]',\n            excludeBegin: true,\n            excludeEnd: true,\n            relevance: 0\n          }\n        ],\n        relevance: 10\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/autohotkey.js",
    "content": "/*\nLanguage: AutoHotkey\nAuthor: Seongwon Lee <dlimpid@gmail.com>\nDescription: AutoHotkey language definition\n*/\n\nfunction(hljs) {\n  var BACKTICK_ESCAPE = {\n    className: 'escape',\n    begin: '`[\\\\s\\\\S]'\n  };\n  var COMMENTS = {\n    className: 'comment',\n    begin: ';', end: '$',\n    relevance: 0\n  };\n  var BUILT_IN = [\n    {\n      className: 'built_in',\n      begin: 'A_[a-zA-Z0-9]+'\n    },\n    {\n      className: 'built_in',\n      beginKeywords: 'ComSpec Clipboard ClipboardAll ErrorLevel'\n    }\n  ];\n\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword: 'Break Continue Else Gosub If Loop Return While',\n      literal: 'A true false NOT AND OR'\n    },\n    contains: BUILT_IN.concat([\n      BACKTICK_ESCAPE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [BACKTICK_ESCAPE]}),\n      COMMENTS,\n      {\n        className: 'number',\n        begin: hljs.NUMBER_RE,\n        relevance: 0\n      },\n      {\n        className: 'var_expand', // FIXME\n        begin: '%', end: '%',\n        illegal: '\\\\n',\n        contains: [BACKTICK_ESCAPE]\n      },\n      {\n        className: 'label',\n        contains: [BACKTICK_ESCAPE],\n        variants: [\n          {begin: '^[^\\\\n\";]+::(?!=)'},\n          {begin: '^[^\\\\n\";]+:(?!=)', relevance: 0} // zero relevance as it catches a lot of things\n                                                    // followed by a single ':' in many languages\n        ]\n      },\n      {\n        // consecutive commas, not for highlighting but just for relevance\n        begin: ',\\\\s*,',\n        relevance: 10\n      }\n    ])\n  }\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/avrasm.js",
    "content": "/*\nLanguage: AVR Assembler\nAuthor: Vladimir Ermakov <vooon341@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    lexemes: '\\\\.?' + hljs.IDENT_RE,\n    keywords: {\n      keyword:\n        /* mnemonic */\n        'adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs ' +\n        'brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr ' +\n        'clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor ' +\n        'fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul ' +\n        'muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs ' +\n        'sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub ' +\n        'subi swap tst wdr',\n      built_in:\n        /* general purpose registers */\n        'r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 ' +\n        'r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ' +\n        /* IO Registers (ATMega128) */\n        'ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h ' +\n        'tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ' +\n        'ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ' +\n        'ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk ' +\n        'tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ' +\n        'ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr ' +\n        'porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ' +\n        'ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf',\n      preprocessor:\n        '.byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list ' +\n        '.listmac .macro .nolist .org .set'\n    },\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      {className: 'comment', begin: ';',  end: '$', relevance: 0},\n      hljs.C_NUMBER_MODE, // 0x..., decimal, float\n      hljs.BINARY_NUMBER_MODE, // 0b...\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)' // $..., 0o...\n      },\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'', end: '[^\\\\\\\\]\\'',\n        illegal: '[^\\\\\\\\][^\\']'\n      },\n      {className: 'label',  begin: '^[A-Za-z0-9_.$]+:'},\n      {className: 'preprocessor', begin: '#', end: '$'},\n      {  // подстановка в «.macro»\n        className: 'localvars',\n        begin: '@[0-9]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/axapta.js",
    "content": "/*\nLanguage: Axapta\nAuthor: Dmitri Roudakov <dmitri@roudakov.ru>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: 'false int abstract private char boolean static null if for true ' +\n      'while long throw finally protected final return void enum else ' +\n      'break new catch byte super case short default double public try this switch ' +\n      'continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count ' +\n      'order group by asc desc index hint like dispaly edit client server ttsbegin ' +\n      'ttscommit str real date container anytype common div mod',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        illegal: ':',\n        contains: [\n          {\n            className: 'inheritance',\n            beginKeywords: 'extends implements',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/bash.js",
    "content": "/*\nLanguage: Bash\nAuthor: vah <vahtenberg@gmail.com>\nContributrors: Benjamin Pannell <contact@sierrasoftworks.com>\n*/\n\nfunction(hljs) {\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$[\\w\\d#@][\\w\\d_]*/},\n      {begin: /\\$\\{(.*?)\\}/}\n    ]\n  };\n  var QUOTE_STRING = {\n    className: 'string',\n    begin: /\"/, end: /\"/,\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      VAR,\n      {\n        className: 'variable',\n        begin: /\\$\\(/, end: /\\)/,\n        contains: [hljs.BACKSLASH_ESCAPE]\n      }\n    ]\n  };\n  var APOS_STRING = {\n    className: 'string',\n    begin: /'/, end: /'/\n  };\n\n  return {\n    aliases: ['sh', 'zsh'],\n    lexemes: /-?[a-z\\.]+/,\n    keywords: {\n      keyword:\n        'if then else elif fi for break continue while in do done exit return set '+\n        'declare case esac export exec',\n      literal:\n        'true false',\n      built_in:\n        'printf echo read cd pwd pushd popd dirs let eval unset typeset readonly '+\n        'getopts source shopt caller type hash bind help sudo',\n      operator:\n        '-ne -eq -lt -gt -f -d -e -s -l -a' // relevance booster\n    },\n    contains: [\n      {\n        className: 'shebang',\n        begin: /^#![^\\n]+sh\\s*$/,\n        relevance: 10\n      },\n      {\n        className: 'function',\n        begin: /\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,\n        returnBegin: true,\n        contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\\w[\\w\\d_]*/})],\n        relevance: 0\n      },\n      hljs.HASH_COMMENT_MODE,\n      hljs.NUMBER_MODE,\n      QUOTE_STRING,\n      APOS_STRING,\n      VAR\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/brainfuck.js",
    "content": "/*\nLanguage: Brainfuck\nAuthor: Evgeny Stepanischev <imbolk@gmail.com>\n*/\n\nfunction(hljs){\n  var LITERAL = {\n    className: 'literal',\n    begin: '[\\\\+\\\\-]',\n    relevance: 0\n  };\n  return {\n    aliases: ['bf'],\n    contains: [\n      {\n        className: 'comment',\n        begin: '[^\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]',\n        returnEnd: true,\n        end: '[\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]',\n        relevance: 0\n      },\n      {\n        className: 'title',\n        begin: '[\\\\[\\\\]]',\n        relevance: 0\n      },\n      {\n        className: 'string',\n        begin: '[\\\\.,]',\n        relevance: 0\n      },\n      {\n        // this mode works as the only relevance counter\n        begin: /\\+\\+|\\-\\-/, returnBegin: true,\n        contains: [LITERAL]\n      },\n      LITERAL\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/capnproto.js",
    "content": "/*\nLanguage: Cap’n Proto\nAuthor: Oleg Efimov <efimovov@gmail.com>\nDescription: Cap’n Proto message definition format\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['capnp'],\n    keywords: {\n      keyword:\n        'struct enum interface union group import using const annotation extends in of on as with from fixed',\n      built_in:\n        'Void Bool Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 Float32 Float64 ' +\n        'Text Data AnyPointer AnyStruct Capability List',\n      literal:\n        'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'shebang',\n        begin: /@0x[\\w\\d]{16};/,\n        illegal: /\\n/\n      },\n      {\n        className: 'number',\n        begin: /@\\d+\\b/\n      },\n      {\n        className: 'class',\n        beginKeywords: 'struct enum', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'interface', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/clojure.js",
    "content": "/*\nLanguage: Clojure\nDescription: Clojure syntax (based on lisp.js)\nAuthor: mfornos\n*/\n\nfunction(hljs) {\n  var keywords = {\n    built_in:\n      // Clojure keywords\n      'def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem '+\n      'quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? '+\n      'set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? '+\n      'class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? '+\n      'string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . '+\n      'inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last '+\n      'drop-while while intern condp case reduced cycle split-at split-with repeat replicate '+\n      'iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext '+\n      'nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends '+\n      'add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler '+\n      'set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter '+\n      'monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or '+\n      'when when-not when-let comp juxt partial sequence memoize constantly complement identity assert '+\n      'peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast '+\n      'sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import '+\n      'refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! '+\n      'assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger '+\n      'bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline '+\n      'flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking '+\n      'assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! '+\n      'reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! '+\n      'new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty '+\n      'hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list '+\n      'disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer '+\n      'chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate '+\n      'unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta '+\n      'lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize'\n   };\n\n  var CLJ_IDENT_RE = '[a-zA-Z_0-9\\\\!\\\\.\\\\?\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#\\\\$\\';]+';\n  var SIMPLE_NUMBER_RE = '[\\\\s:\\\\(\\\\{]+\\\\d+(\\\\.\\\\d+)?';\n\n  var NUMBER = {\n    className: 'number', begin: SIMPLE_NUMBER_RE,\n    relevance: 0\n  };\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});\n  var COMMENT = {\n    className: 'comment',\n    begin: ';', end: '$',\n    relevance: 0\n  };\n  var COLLECTION = {\n    className: 'collection',\n    begin: '[\\\\[\\\\{]', end: '[\\\\]\\\\}]'\n  };\n  var HINT = {\n    className: 'comment',\n    begin: '\\\\^' + CLJ_IDENT_RE\n  };\n  var HINT_COL = {\n    className: 'comment',\n    begin: '\\\\^\\\\{', end: '\\\\}'\n\n  };\n  var KEY = {\n    className: 'attribute',\n    begin: '[:]' + CLJ_IDENT_RE\n  };\n  var LIST = {\n    className: 'list',\n    begin: '\\\\(', end: '\\\\)'\n  };\n  var BODY = {\n    endsWithParent: true,\n    keywords: {literal: 'true false nil'},\n    relevance: 0\n  };\n  var TITLE = {\n    keywords: keywords,\n    lexemes: CLJ_IDENT_RE,\n    className: 'title', begin: CLJ_IDENT_RE,\n    starts: BODY\n  };\n\n  LIST.contains = [{className: 'comment', begin: 'comment'}, TITLE, BODY];\n  BODY.contains = [LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER];\n  COLLECTION.contains = [LIST, STRING, HINT, COMMENT, KEY, COLLECTION, NUMBER];\n\n  return {\n    aliases: ['clj'],\n    illegal: /\\S/,\n    contains: [\n      COMMENT,\n      LIST,\n      {\n        className: 'prompt',\n        begin: /^=> /,\n        starts: {end: /\\n\\n|\\Z/} // eat up prompt output to not interfere with the illegal\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/cmake.js",
    "content": "/*\nLanguage: CMake\nDescription: CMake is an open-source cross-platform system for build automation.\nAuthor: Igor Kalnitsky <igor@kalnitsky.org>\nWebsite: http://kalnitsky.org/\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['cmake.in'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'add_custom_command add_custom_target add_definitions add_dependencies ' +\n        'add_executable add_library add_subdirectory add_test aux_source_directory ' +\n        'break build_command cmake_minimum_required cmake_policy configure_file ' +\n        'create_test_sourcelist define_property else elseif enable_language enable_testing ' +\n        'endforeach endfunction endif endmacro endwhile execute_process export find_file ' +\n        'find_library find_package find_path find_program fltk_wrap_ui foreach function ' +\n        'get_cmake_property get_directory_property get_filename_component get_property ' +\n        'get_source_file_property get_target_property get_test_property if include ' +\n        'include_directories include_external_msproject include_regular_expression install ' +\n        'link_directories load_cache load_command macro mark_as_advanced message option ' +\n        'output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return ' +\n        'separate_arguments set set_directory_properties set_property ' +\n        'set_source_files_properties set_target_properties set_tests_properties site_name ' +\n        'source_group string target_link_libraries try_compile try_run unset variable_watch ' +\n        'while build_name exec_program export_library_dependencies install_files ' +\n        'install_programs install_targets link_libraries make_directory remove subdir_depends ' +\n        'subdirs use_mangled_mesa utility_source variable_requires write_file ' +\n        'qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or',\n      operator:\n        'equal less greater strless strgreater strequal matches'\n    },\n    contains: [\n      {\n        className: 'envvar',\n        begin: '\\\\${', end: '}'\n      },\n      hljs.HASH_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/coffeescript.js",
    "content": "/*\nLanguage: CoffeeScript\nAuthor: Dmytrii Nagirniak <dnagir@gmail.com>\nContributors: Oleg Efimov <efimovov@gmail.com>, Cédric Néhémie <cedric.nehemie@gmail.com>\nDescription: CoffeeScript is a programming language that transcompiles to JavaScript. For info about language see http://coffeescript.org/\n*/\n\nfunction(hljs) {\n  var KEYWORDS = {\n    keyword:\n      // JS keywords\n      'in if for while finally new do return else break catch instanceof throw try this ' +\n      'switch continue typeof delete debugger super ' +\n      // Coffee keywords\n      'then unless until loop of by when and or is isnt not',\n    literal:\n      // JS literals\n      'true false null undefined ' +\n      // Coffee literals\n      'yes no on off',\n    reserved:\n      'case default function var void with const let enum export import native ' +\n      '__hasProp __extends __slice __bind __indexOf',\n    built_in:\n      'npm require console print module global window document'\n  };\n  var JS_IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\n  var TITLE = hljs.inherit(hljs.TITLE_MODE, {begin: JS_IDENT_RE});\n  var SUBST = {\n    className: 'subst',\n    begin: /#\\{/, end: /}/,\n    keywords: KEYWORDS\n  };\n  var EXPRESSIONS = [\n    hljs.BINARY_NUMBER_MODE,\n    hljs.inherit(hljs.C_NUMBER_MODE, {starts: {end: '(\\\\s*/)?', relevance: 0}}), // a number tries to eat the following slash to prevent treating it as a regexp\n    {\n      className: 'string',\n      variants: [\n        {\n          begin: /'''/, end: /'''/,\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: /'/, end: /'/,\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: /\"\"\"/, end: /\"\"\"/,\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST]\n        },\n        {\n          begin: /\"/, end: /\"/,\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST]\n        }\n      ]\n    },\n    {\n      className: 'regexp',\n      variants: [\n        {\n          begin: '///', end: '///',\n          contains: [SUBST, hljs.HASH_COMMENT_MODE]\n        },\n        {\n          begin: '//[gim]*',\n          relevance: 0\n        },\n        {\n          begin: '/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)' // \\S is required to parse x / 2 / 3 as two divisions\n        }\n      ]\n    },\n    {\n      className: 'property',\n      begin: '@' + JS_IDENT_RE\n    },\n    {\n      begin: '`', end: '`',\n      excludeBegin: true, excludeEnd: true,\n      subLanguage: 'javascript'\n    }\n  ];\n  SUBST.contains = EXPRESSIONS;\n\n  return {\n    aliases: ['coffee', 'cson', 'iced'],\n    keywords: KEYWORDS,\n    contains: EXPRESSIONS.concat([\n      {\n        className: 'comment',\n        begin: '###', end: '###'\n      },\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'function',\n        begin: '(' + JS_IDENT_RE + '\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>', end: '[-=]>',\n        returnBegin: true,\n        contains: [\n          TITLE,\n          {\n            className: 'params',\n            begin: '\\\\(', returnBegin: true,\n            /* We need another contained nameless mode to not have every nested\n            pair of parens to be called \"params\" */\n            contains: [{\n              begin: /\\(/, end: /\\)/,\n              keywords: KEYWORDS,\n              contains: ['self'].concat(EXPRESSIONS)\n            }]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class',\n        end: '$',\n        illegal: /[:=\"\\[\\]]/,\n        contains: [\n          {\n            beginKeywords: 'extends',\n            endsWithParent: true,\n            illegal: /[:=\"\\[\\]]/,\n            contains: [TITLE]\n          },\n          TITLE\n        ]\n      },\n      {\n        className: 'attribute',\n        begin: JS_IDENT_RE + ':', end: ':',\n        returnBegin: true, excludeEnd: true,\n        relevance: 0\n      }\n    ])\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/cpp.js",
    "content": "/*\nLanguage: C++\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Zaven Muradyan <megalivoithos@gmail.com>\n*/\n\nfunction(hljs) {\n  var CPP_KEYWORDS = {\n    keyword: 'false int float while private char catch export virtual operator sizeof ' +\n      'dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace ' +\n      'unsigned long throw volatile static protected bool template mutable if public friend ' +\n      'do return goto auto void enum else break new extern using true class asm case typeid ' +\n      'short reinterpret_cast|10 default double register explicit signed typename try this ' +\n      'switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype ' +\n      'noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary',\n    built_in: 'std string cin cout cerr clog stringstream istringstream ostringstream ' +\n      'auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set ' +\n      'unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos ' +\n      'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp ' +\n      'fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper ' +\n      'isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow ' +\n      'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp ' +\n      'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan ' +\n      'vfprintf vprintf vsprintf'\n  };\n  return {\n    aliases: ['c', 'h', 'c++', 'h++'],\n    keywords: CPP_KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'\\\\\\\\?.', end: '\\'',\n        illegal: '.'\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)'\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elif endif define undef warning error line pragma',\n        contains: [\n          {\n            begin: 'include\\\\s*[<\"]', end: '[>\"]',\n            keywords: 'include',\n            illegal: '\\\\n'\n          },\n          hljs.C_LINE_COMMENT_MODE\n        ]\n      },\n      {\n        className: 'stl_container',\n        begin: '\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<', end: '>',\n        keywords: CPP_KEYWORDS,\n        contains: ['self']\n      },\n      {\n        begin: hljs.IDENT_RE + '::'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/cs.js",
    "content": "/*\nLanguage: C#\nAuthor: Jason Diamond <jason@diamond.name>\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    // Normal keywords.\n    'abstract as base bool break byte case catch char checked const continue decimal ' +\n    'default delegate do double else enum event explicit extern false finally fixed float ' +\n    'for foreach goto if implicit in int interface internal is lock long new null ' +\n    'object operator out override params private protected public readonly ref return sbyte ' +\n    'sealed short sizeof stackalloc static string struct switch this throw true try typeof ' +\n    'uint ulong unchecked unsafe ushort using virtual volatile void while async await ' +\n    // Contextual keywords.\n    'ascending descending from get group into join let orderby partial select set value var ' +\n    'where yield';\n  return {\n    aliases: ['csharp'],\n    keywords: KEYWORDS,\n    illegal: /::/,\n    contains: [\n      {\n        className: 'comment',\n        begin: '///', end: '$', returnBegin: true,\n        contains: [\n          {\n            className: 'xmlDocTag',\n            variants: [\n              {\n                begin: '///', relevance: 0\n              },\n              {\n                begin: '<!--|-->'\n              },\n              {\n                begin: '</?', end: '>'\n              }\n            ]\n          }\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elif endif define undef warning error line region endregion pragma checksum'\n      },\n      {\n        className: 'string',\n        begin: '@\"', end: '\"',\n        contains: [{begin: '\"\"'}]\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        beginKeywords: 'protected public private internal', end: /[{;=]/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            beginKeywords: 'class namespace interface',\n            starts: {\n              contains: [hljs.TITLE_MODE]\n            }\n          },\n          {\n            begin: hljs.IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n            contains: [\n              hljs.TITLE_MODE\n            ]\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/css.js",
    "content": "/*\nLanguage: CSS\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  var FUNCTION = {\n    className: 'function',\n    begin: IDENT_RE + '\\\\(', \n    returnBegin: true,\n    excludeEnd: true,\n    end: '\\\\('\n  };\n  return {\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'id', begin: '\\\\#[A-Za-z0-9_-]+'\n      },\n      {\n        className: 'class', begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'attr_selector',\n        begin: '\\\\[', end: '\\\\]',\n        illegal: '$'\n      },\n      {\n        className: 'pseudo',\n        begin: ':(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\"\\\\\\']+'\n      },\n      {\n        className: 'at_rule',\n        begin: '@(font-face|page)',\n        lexemes: '[a-z-]+',\n        keywords: 'font-face page'\n      },\n      {\n        className: 'at_rule',\n        begin: '@', end: '[{;]', // at_rule eating first \"{\" is a good thing\n                                 // because it doesn’t let it to be parsed as\n                                 // a rule set but instead drops parser into\n                                 // the default mode which is how it should be.\n        contains: [\n          {\n            className: 'keyword',\n            begin: /\\S+/\n          },\n          {\n            begin: /\\s/, endsWithParent: true, excludeEnd: true,\n            relevance: 0,\n            contains: [\n              FUNCTION,\n              hljs.APOS_STRING_MODE, hljs.QUOTE_STRING_MODE,\n              hljs.CSS_NUMBER_MODE\n            ]\n          }\n        ]\n      },\n      {\n        className: 'tag', begin: IDENT_RE,\n        relevance: 0\n      },\n      {\n        className: 'rules',\n        begin: '{', end: '}',\n        illegal: '[^\\\\s]',\n        relevance: 0,\n        contains: [\n          hljs.C_BLOCK_COMMENT_MODE,\n          {\n            className: 'rule',\n            begin: '[^\\\\s]', returnBegin: true, end: ';', endsWithParent: true,\n            contains: [\n              {\n                className: 'attribute',\n                begin: '[A-Z\\\\_\\\\.\\\\-]+', end: ':',\n                excludeEnd: true,\n                illegal: '[^\\\\s]',\n                starts: {\n                  className: 'value',\n                  endsWithParent: true, excludeEnd: true,\n                  contains: [\n                    FUNCTION,\n                    hljs.CSS_NUMBER_MODE,\n                    hljs.QUOTE_STRING_MODE,\n                    hljs.APOS_STRING_MODE,\n                    hljs.C_BLOCK_COMMENT_MODE,\n                    {\n                      className: 'hexcolor', begin: '#[0-9A-Fa-f]+'\n                    },\n                    {\n                      className: 'important', begin: '!important'\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/d.js",
    "content": "/*\nLanguage: D\nAuthor: Aleksandar Ruzicic <aleksandar@ruzicic.info>\nDescription: D is a language with C-like syntax and static typing. It pragmatically combines efficiency, control, and modeling power, with safety and programmer productivity.\nVersion: 1.0a\nDate: 2012-04-08\n*/\n\n/**\n * Known issues:\n *\n * - invalid hex string literals will be recognized as a double quoted strings\n *   but 'x' at the beginning of string will not be matched\n *\n * - delimited string literals are not checked for matching end delimiter\n *   (not possible to do with js regexp)\n *\n * - content of token string is colored as a string (i.e. no keyword coloring inside a token string)\n *   also, content of token string is not validated to contain only valid D tokens\n *\n * - special token sequence rule is not strictly following D grammar (anything following #line\n *   up to the end of line is matched as special token sequence)\n */\n\nfunction(hljs) {\n  /**\n   * Language keywords\n   *\n   * @type {Object}\n   */\n  var D_KEYWORDS = {\n    keyword:\n      'abstract alias align asm assert auto body break byte case cast catch class ' +\n      'const continue debug default delete deprecated do else enum export extern final ' +\n      'finally for foreach foreach_reverse|10 goto if immutable import in inout int ' +\n      'interface invariant is lazy macro mixin module new nothrow out override package ' +\n      'pragma private protected public pure ref return scope shared static struct ' +\n      'super switch synchronized template this throw try typedef typeid typeof union ' +\n      'unittest version void volatile while with __FILE__ __LINE__ __gshared|10 ' +\n      '__thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__',\n    built_in:\n      'bool cdouble cent cfloat char creal dchar delegate double dstring float function ' +\n      'idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar ' +\n      'wstring',\n    literal:\n      'false null true'\n  };\n\n  /**\n   * Number literal regexps\n   *\n   * @type {String}\n   */\n  var decimal_integer_re = '(0|[1-9][\\\\d_]*)',\n    decimal_integer_nosus_re = '(0|[1-9][\\\\d_]*|\\\\d[\\\\d_]*|[\\\\d_]+?\\\\d)',\n    binary_integer_re = '0[bB][01_]+',\n    hexadecimal_digits_re = '([\\\\da-fA-F][\\\\da-fA-F_]*|_[\\\\da-fA-F][\\\\da-fA-F_]*)',\n    hexadecimal_integer_re = '0[xX]' + hexadecimal_digits_re,\n\n    decimal_exponent_re = '([eE][+-]?' + decimal_integer_nosus_re + ')',\n    decimal_float_re = '(' + decimal_integer_nosus_re + '(\\\\.\\\\d*|' + decimal_exponent_re + ')|' +\n                '\\\\d+\\\\.' + decimal_integer_nosus_re + decimal_integer_nosus_re + '|' +\n                '\\\\.' + decimal_integer_re + decimal_exponent_re + '?' +\n              ')',\n    hexadecimal_float_re = '(0[xX](' +\n                  hexadecimal_digits_re + '\\\\.' + hexadecimal_digits_re + '|'+\n                  '\\\\.?' + hexadecimal_digits_re +\n                 ')[pP][+-]?' + decimal_integer_nosus_re + ')',\n\n    integer_re = '(' +\n      decimal_integer_re + '|' +\n      binary_integer_re  + '|' +\n       hexadecimal_integer_re   +\n    ')',\n\n    float_re = '(' +\n      hexadecimal_float_re + '|' +\n      decimal_float_re  +\n    ')';\n\n  /**\n   * Escape sequence supported in D string and character literals\n   *\n   * @type {String}\n   */\n  var escape_sequence_re = '\\\\\\\\(' +\n              '[\\'\"\\\\?\\\\\\\\abfnrtv]|' +  // common escapes\n              'u[\\\\dA-Fa-f]{4}|' +     // four hex digit unicode codepoint\n              '[0-7]{1,3}|' +       // one to three octal digit ascii char code\n              'x[\\\\dA-Fa-f]{2}|' +    // two hex digit ascii char code\n              'U[\\\\dA-Fa-f]{8}' +      // eight hex digit unicode codepoint\n              ')|' +\n              '&[a-zA-Z\\\\d]{2,};';      // named character entity\n\n  /**\n   * D integer number literals\n   *\n   * @type {Object}\n   */\n  var D_INTEGER_MODE = {\n    className: 'number',\n      begin: '\\\\b' + integer_re + '(L|u|U|Lu|LU|uL|UL)?',\n      relevance: 0\n  };\n\n  /**\n   * [D_FLOAT_MODE description]\n   * @type {Object}\n   */\n  var D_FLOAT_MODE = {\n    className: 'number',\n    begin: '\\\\b(' +\n        float_re + '([fF]|L|i|[fF]i|Li)?|' +\n        integer_re + '(i|[fF]i|Li)' +\n      ')',\n    relevance: 0\n  };\n\n  /**\n   * D character literal\n   *\n   * @type {Object}\n   */\n  var D_CHARACTER_MODE = {\n    className: 'string',\n    begin: '\\'(' + escape_sequence_re + '|.)', end: '\\'',\n    illegal: '.'\n  };\n\n  /**\n   * D string escape sequence\n   *\n   * @type {Object}\n   */\n  var D_ESCAPE_SEQUENCE = {\n    begin: escape_sequence_re,\n    relevance: 0\n  };\n\n  /**\n   * D double quoted string literal\n   *\n   * @type {Object}\n   */\n  var D_STRING_MODE = {\n    className: 'string',\n    begin: '\"',\n    contains: [D_ESCAPE_SEQUENCE],\n    end: '\"[cwd]?'\n  };\n\n  /**\n   * D wysiwyg and delimited string literals\n   *\n   * @type {Object}\n   */\n  var D_WYSIWYG_DELIMITED_STRING_MODE = {\n    className: 'string',\n    begin: '[rq]\"',\n    end: '\"[cwd]?',\n    relevance: 5\n  };\n\n  /**\n   * D alternate wysiwyg string literal\n   *\n   * @type {Object}\n   */\n  var D_ALTERNATE_WYSIWYG_STRING_MODE = {\n    className: 'string',\n    begin: '`',\n    end: '`[cwd]?'\n  };\n\n  /**\n   * D hexadecimal string literal\n   *\n   * @type {Object}\n   */\n  var D_HEX_STRING_MODE = {\n    className: 'string',\n    begin: 'x\"[\\\\da-fA-F\\\\s\\\\n\\\\r]*\"[cwd]?',\n    relevance: 10\n  };\n\n  /**\n   * D delimited string literal\n   *\n   * @type {Object}\n   */\n  var D_TOKEN_STRING_MODE = {\n    className: 'string',\n    begin: 'q\"\\\\{',\n    end: '\\\\}\"'\n  };\n\n  /**\n   * Hashbang support\n   *\n   * @type {Object}\n   */\n  var D_HASHBANG_MODE = {\n    className: 'shebang',\n    begin: '^#!',\n    end: '$',\n    relevance: 5\n  };\n\n  /**\n   * D special token sequence\n   *\n   * @type {Object}\n   */\n  var D_SPECIAL_TOKEN_SEQUENCE_MODE = {\n    className: 'preprocessor',\n    begin: '#(line)',\n    end: '$',\n    relevance: 5\n  };\n\n  /**\n   * D attributes\n   *\n   * @type {Object}\n   */\n  var D_ATTRIBUTE_MODE = {\n    className: 'keyword',\n    begin: '@[a-zA-Z_][a-zA-Z_\\\\d]*'\n  };\n\n  /**\n   * D nesting comment\n   *\n   * @type {Object}\n   */\n  var D_NESTING_COMMENT_MODE = {\n    className: 'comment',\n    begin: '\\\\/\\\\+',\n    contains: ['self'],\n    end: '\\\\+\\\\/',\n    relevance: 10\n  };\n\n  return {\n    lexemes: hljs.UNDERSCORE_IDENT_RE,\n    keywords: D_KEYWORDS,\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n        hljs.C_BLOCK_COMMENT_MODE,\n        D_NESTING_COMMENT_MODE,\n        D_HEX_STRING_MODE,\n        D_STRING_MODE,\n        D_WYSIWYG_DELIMITED_STRING_MODE,\n        D_ALTERNATE_WYSIWYG_STRING_MODE,\n        D_TOKEN_STRING_MODE,\n        D_FLOAT_MODE,\n        D_INTEGER_MODE,\n        D_CHARACTER_MODE,\n        D_HASHBANG_MODE,\n        D_SPECIAL_TOKEN_SEQUENCE_MODE,\n        D_ATTRIBUTE_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/delphi.js",
    "content": "/*\nLanguage: Delphi\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    'exports register file shl array record property for mod while set ally label uses raise not ' +\n    'stored class safecall var interface or private static exit index inherited to else stdcall ' +\n    'override shr asm far resourcestring finalization packed virtual out and protected library do ' +\n    'xorwrite goto near function end div overload object unit begin string on inline repeat until ' +\n    'destructor write message program with read initialization except default nil if case cdecl in ' +\n    'downto threadvar of try pascal const external constructor type public then implementation ' +\n    'finally published procedure';\n  var COMMENT =  {\n    className: 'comment',\n    variants: [\n      {begin: /\\{/, end: /\\}/, relevance: 0},\n      {begin: /\\(\\*/, end: /\\*\\)/, relevance: 10}\n    ]\n  };\n  var STRING = {\n    className: 'string',\n    begin: /'/, end: /'/,\n    contains: [{begin: /''/}]\n  };\n  var CHAR_STRING = {\n    className: 'string', begin: /(#\\d+)+/\n  };\n  var CLASS = {\n    begin: hljs.IDENT_RE + '\\\\s*=\\\\s*class\\\\s*\\\\(', returnBegin: true,\n    contains: [\n      hljs.TITLE_MODE\n    ]\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'function constructor destructor procedure', end: /[:;]/,\n    keywords: 'function constructor|10 destructor|10 procedure|10',\n    contains: [\n      hljs.TITLE_MODE,\n      {\n        className: 'params',\n        begin: /\\(/, end: /\\)/,\n        keywords: KEYWORDS,\n        contains: [STRING, CHAR_STRING]\n      },\n      COMMENT\n    ]\n  };\n  return {\n    case_insensitive: true,\n    keywords: KEYWORDS,\n    illegal: /(\"|\\$[G-Zg-z]|\\/\\*|<\\/)/,\n    contains: [\n      COMMENT, hljs.C_LINE_COMMENT_MODE,\n      STRING, CHAR_STRING,\n      hljs.NUMBER_MODE,\n      CLASS,\n      FUNCTION\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/diff.js",
    "content": "/*\nLanguage: Diff\nDescription: Unified and context diff\nAuthor: Vasily Polovnyov <vast@whiteants.net>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['patch'],\n    contains: [\n      {\n        className: 'chunk',\n        relevance: 10,\n        variants: [\n          {begin: /^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},\n          {begin: /^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},\n          {begin: /^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}\n        ]\n      },\n      {\n        className: 'header',\n        variants: [\n          {begin: /Index: /, end: /$/},\n          {begin: /=====/, end: /=====$/},\n          {begin: /^\\-\\-\\-/, end: /$/},\n          {begin: /^\\*{3} /, end: /$/},\n          {begin: /^\\+\\+\\+/, end: /$/},\n          {begin: /\\*{5}/, end: /\\*{5}$/}\n        ]\n      },\n      {\n        className: 'addition',\n        begin: '^\\\\+', end: '$'\n      },\n      {\n        className: 'deletion',\n        begin: '^\\\\-', end: '$'\n      },\n      {\n        className: 'change',\n        begin: '^\\\\!', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/django.js",
    "content": "/*\nLanguage: Django\nRequires: xml.js\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Ilya Baryshev <baryshev@gmail.com>\n*/\n\nfunction(hljs) {\n  var FILTER = {\n    className: 'filter',\n    begin: /\\|[A-Za-z]+\\:?/,\n    keywords:\n      'truncatewords removetags linebreaksbr yesno get_digit timesince random striptags ' +\n      'filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands ' +\n      'title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode ' +\n      'timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort ' +\n      'dictsortreversed default_if_none pluralize lower join center default ' +\n      'truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first ' +\n      'escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize ' +\n      'localtime utc timezone',\n    contains: [\n      {className: 'argument', begin: /\"/, end: /\"/},\n      {className: 'argument', begin: /'/, end: /'/}\n    ]\n  };\n\n  return {\n    aliases: ['jinja'],\n    case_insensitive: true,\n    subLanguage: 'xml', subLanguageMode: 'continuous',\n    contains: [\n      {\n        className: 'template_comment',\n        begin: /\\{%\\s*comment\\s*%}/, end: /\\{%\\s*endcomment\\s*%}/\n      },\n      {\n        className: 'template_comment',\n        begin: /\\{#/, end: /#}/\n      },\n      {\n        className: 'template_tag',\n        begin: /\\{%/, end: /%}/,\n        keywords:\n          'comment endcomment load templatetag ifchanged endifchanged if endif firstof for ' +\n          'endfor in ifnotequal endifnotequal widthratio extends include spaceless ' +\n          'endspaceless regroup by as ifequal endifequal ssi now with cycle url filter ' +\n          'endfilter debug block endblock else autoescape endautoescape csrf_token empty elif ' +\n          'endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix ' +\n          'plural get_current_language language get_available_languages ' +\n          'get_current_language_bidi get_language_info get_language_info_list localize ' +\n          'endlocalize localtime endlocaltime timezone endtimezone get_current_timezone ' +\n          'verbatim',\n        contains: [FILTER]\n      },\n      {\n        className: 'variable',\n        begin: /\\{\\{/, end: /}}/,\n        contains: [FILTER]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/dos.js",
    "content": "/*\nLanguage: DOS .bat\nAuthor: Alexander Makarov (http://rmcreative.ru/)\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['bat', 'cmd'],\n    case_insensitive: true,\n    keywords: {\n      flow: 'if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq',\n      keyword: 'shift cd dir echo setlocal endlocal set pause copy',\n      stream: 'prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux',\n      winutils: 'ping net ipconfig taskkill xcopy ren del'\n    },\n    contains: [\n      {\n        className: 'envvar', begin: '%%[^ ]'\n      },\n      {\n        className: 'envvar', begin: '%[^ ]+?%'\n      },\n      {\n        className: 'envvar', begin: '![^ ]+?!'\n      },\n      {\n        className: 'number', begin: '\\\\b\\\\d+',\n        relevance: 0\n      },\n      {\n        className: 'comment',\n        begin: '@?rem', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/elixir.js",
    "content": "/*\nLanguage: Elixir\nAuthor: Josh Adams <josh@isotope11.com>\nDescription: language definition for Elixir source code files (.ex and .exs).  Based on ruby language support.\n*/\n\nfunction(hljs) {\n  var ELIXIR_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_]*(\\\\!|\\\\?)?';\n  var ELIXIR_METHOD_RE = '[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?';\n  var ELIXIR_KEYWORDS =\n    'and false then defined module in return redo retry end for true self when ' +\n    'next until do begin unless nil break not case cond alias while ensure or ' +\n    'include use alias fn quote';\n  var SUBST = {\n    className: 'subst',\n    begin: '#\\\\{', end: '}',\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n    variants: [\n      {\n        begin: /'/, end: /'/\n      },\n      {\n        begin: /\"/, end: /\"/\n      }\n    ]\n  };\n  var PARAMS = {\n    endsWithParent: true, returnEnd: true,\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS,\n    relevance: 0\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'def defmacro', end: /\\bdo\\b/,\n    contains: [\n      hljs.inherit(hljs.TITLE_MODE, {\n        begin: ELIXIR_METHOD_RE,\n        starts: PARAMS\n      })\n    ]\n  };\n  var CLASS = hljs.inherit(FUNCTION, {\n    className: 'class',\n    beginKeywords: 'defmodule defrecord', end: /\\bdo\\b|$|;/\n  })\n  var ELIXIR_DEFAULT_CONTAINS = [\n    STRING,\n    hljs.HASH_COMMENT_MODE,\n    CLASS,\n    FUNCTION,\n    {\n      className: 'constant',\n      begin: '(\\\\b[A-Z_]\\\\w*(.)?)+',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':',\n      contains: [STRING, {begin: ELIXIR_METHOD_RE}],\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ELIXIR_IDENT_RE + ':',\n      relevance: 0\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    {\n      className: 'variable',\n      begin: '(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))'\n    },\n    {\n      begin: '->'\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + ')\\\\s*',\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        {\n          className: 'regexp',\n          illegal: '\\\\n',\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n          variants: [\n            {\n              begin: '/', end: '/[a-z]*'\n            },\n            {\n              begin: '%r\\\\[', end: '\\\\][a-z]*'\n            }\n          ]\n        }\n      ],\n      relevance: 0\n    }\n  ];\n  SUBST.contains = ELIXIR_DEFAULT_CONTAINS;\n  PARAMS.contains = ELIXIR_DEFAULT_CONTAINS;\n\n  return {\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS,\n    contains: ELIXIR_DEFAULT_CONTAINS\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/erlang-repl.js",
    "content": "/*\n Language: Erlang REPL\n Author: Sergey Ignatov <sergey@ignatov.spb.su>\n */\n\nfunction(hljs) {\n  return {\n    keywords: {\n      special_functions:\n        'spawn spawn_link self',\n      reserved:\n        'after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if ' +\n        'let not of or orelse|10 query receive rem try when xor'\n    },\n    contains: [\n      {\n        className: 'prompt', begin: '^[0-9]+> ',\n        relevance: 10\n      },\n      {\n        className: 'comment',\n        begin: '%', end: '$'\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)',\n        relevance: 0\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'constant', begin: '\\\\?(::)?([A-Z]\\\\w*(::)?)+'\n      },\n      {\n        className: 'arrow', begin: '->'\n      },\n      {\n        className: 'ok', begin: 'ok'\n      },\n      {\n        className: 'exclamation_mark', begin: '!'\n      },\n      {\n        className: 'function_or_atom',\n        begin: '(\\\\b[a-z\\'][a-zA-Z0-9_\\']*:[a-z\\'][a-zA-Z0-9_\\']*)|(\\\\b[a-z\\'][a-zA-Z0-9_\\']*)',\n        relevance: 0\n      },\n      {\n        className: 'variable',\n        begin: '[A-Z][a-zA-Z0-9_\\']*',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/erlang.js",
    "content": "/*\nLanguage: Erlang\nDescription: Erlang is a general-purpose functional language, with strict evaluation, single assignment, and dynamic typing.\nAuthor: Nikolay Zakharov <nikolay.desh@gmail.com>, Dmitry Kovega <arhibot@gmail.com>\n*/\n\nfunction(hljs) {\n  var BASIC_ATOM_RE = '[a-z\\'][a-zA-Z0-9_\\']*';\n  var FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';\n  var ERLANG_RESERVED = {\n    keyword:\n      'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let ' +\n      'not of orelse|10 query receive rem try when xor',\n    literal:\n      'false true'\n  };\n\n  var COMMENT = {\n    className: 'comment',\n    begin: '%', end: '$'\n  };\n  var NUMBER = {\n    className: 'number',\n    begin: '\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)',\n    relevance: 0\n  };\n  var NAMED_FUN = {\n    begin: 'fun\\\\s+' + BASIC_ATOM_RE + '/\\\\d+'\n  };\n  var FUNCTION_CALL = {\n    begin: FUNCTION_NAME_RE + '\\\\(', end: '\\\\)',\n    returnBegin: true,\n    relevance: 0,\n    contains: [\n      {\n        className: 'function_name', begin: FUNCTION_NAME_RE,\n        relevance: 0\n      },\n      {\n        begin: '\\\\(', end: '\\\\)', endsWithParent: true,\n        returnEnd: true,\n        relevance: 0\n        // \"contains\" defined later\n      }\n    ]\n  };\n  var TUPLE = {\n    className: 'tuple',\n    begin: '{', end: '}',\n    relevance: 0\n    // \"contains\" defined later\n  };\n  var VAR1 = {\n    className: 'variable',\n    begin: '\\\\b_([A-Z][A-Za-z0-9_]*)?',\n    relevance: 0\n  };\n  var VAR2 = {\n    className: 'variable',\n    begin: '[A-Z][a-zA-Z0-9_]*',\n    relevance: 0\n  };\n  var RECORD_ACCESS = {\n    begin: '#' + hljs.UNDERSCORE_IDENT_RE,\n    relevance: 0,\n    returnBegin: true,\n    contains: [\n      {\n        className: 'record_name',\n        begin: '#' + hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: '{', end: '}',\n        relevance: 0\n        // \"contains\" defined later\n      }\n    ]\n  };\n\n  var BLOCK_STATEMENTS = {\n    beginKeywords: 'fun receive if try case', end: 'end',\n    keywords: ERLANG_RESERVED\n  };\n  BLOCK_STATEMENTS.contains = [\n    COMMENT,\n    NAMED_FUN,\n    hljs.inherit(hljs.APOS_STRING_MODE, {className: ''}),\n    BLOCK_STATEMENTS,\n    FUNCTION_CALL,\n    hljs.QUOTE_STRING_MODE,\n    NUMBER,\n    TUPLE,\n    VAR1, VAR2,\n    RECORD_ACCESS\n  ];\n\n  var BASIC_MODES = [\n    COMMENT,\n    NAMED_FUN,\n    BLOCK_STATEMENTS,\n    FUNCTION_CALL,\n    hljs.QUOTE_STRING_MODE,\n    NUMBER,\n    TUPLE,\n    VAR1, VAR2,\n    RECORD_ACCESS\n  ];\n  FUNCTION_CALL.contains[1].contains = BASIC_MODES;\n  TUPLE.contains = BASIC_MODES;\n  RECORD_ACCESS.contains[1].contains = BASIC_MODES;\n\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    contains: BASIC_MODES\n  };\n  return {\n    aliases: ['erl'],\n    keywords: ERLANG_RESERVED,\n    illegal: '(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))',\n    contains: [\n      {\n        className: 'function',\n        begin: '^' + BASIC_ATOM_RE + '\\\\s*\\\\(', end: '->',\n        returnBegin: true,\n        illegal: '\\\\(|#|//|/\\\\*|\\\\\\\\|:|;',\n        contains: [\n          PARAMS,\n          hljs.inherit(hljs.TITLE_MODE, {begin: BASIC_ATOM_RE})\n        ],\n        starts: {\n          end: ';|\\\\.',\n          keywords: ERLANG_RESERVED,\n          contains: BASIC_MODES\n        }\n      },\n      COMMENT,\n      {\n        className: 'pp',\n        begin: '^-', end: '\\\\.',\n        relevance: 0,\n        excludeEnd: true,\n        returnBegin: true,\n        lexemes: '-' + hljs.IDENT_RE,\n        keywords:\n          '-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn ' +\n          '-import -include -include_lib -compile -define -else -endif -file -behaviour ' +\n          '-behavior -spec',\n        contains: [PARAMS]\n      },\n      NUMBER,\n      hljs.QUOTE_STRING_MODE,\n      RECORD_ACCESS,\n      VAR1, VAR2,\n      TUPLE,\n      {begin: /\\.$/} // relevance booster\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/fix.js",
    "content": "/*\nLanguage: FIX\nAuthor: Brent Bradbury <brent@brentium.com>\n*/\n\nfunction(hljs) {\n  return {\n    contains: [\n    {\n      begin: /[^\\u2401\\u0001]+/,\n      end: /[\\u2401\\u0001]/,\n      excludeEnd: true,\n      returnBegin: true,\n      returnEnd: false,\n      contains: [\n      {\n        begin: /([^\\u2401\\u0001=]+)/,\n        end: /=([^\\u2401\\u0001=]+)/,\n        returnEnd: true,\n        returnBegin: false,\n        className: 'attribute'\n      },\n      {\n        begin: /=/,\n        end: /([\\u2401\\u0001])/,\n        excludeEnd: true,\n        excludeBegin: true,\n        className: 'string'\n      }]\n    }],\n    case_insensitive: true\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/fsharp.js",
    "content": "/*\nLanguage: F#\nAuthor: Jonas Follesø <jonas@follesoe.no>\nContributors: Troy Kershaw <hello@troykershaw.com>\nDescription: F# language definition.\n*/\nfunction(hljs) {\n  return {\n    aliases: ['fs'],\n    keywords:\n      'abstract and as assert base begin class default delegate do done ' +\n      'downcast downto elif else end exception extern false finally for ' +\n      'fun function global if in inherit inline interface internal lazy let ' +\n      'match member module mutable namespace new null of open or ' +\n      'override private public rec return sig static struct then to ' +\n      'true try type upcast use val void when while with yield',\n    contains: [\n      {\n        className: 'string',\n        begin: '@\"', end: '\"',\n        contains: [{begin: '\"\"'}]\n      },\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\(\\\\*', end: '\\\\*\\\\)'\n      },\n      {\n        className: 'class',\n        beginKeywords: 'type', end: '\\\\(|=|$', excludeEnd: true,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'annotation',\n        begin: '\\\\[<', end: '>\\\\]'\n      },\n      {\n        className: 'attribute',\n        begin: '\\\\B(\\'[A-Za-z])\\\\b',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/gherkin.js",
    "content": "/*\n Language: Gherkin\n Author: Sam Pikesley (@pikesley) <sam.pikesley@theodi.org>\n Description: Gherkin (Cucumber etc)\n */\n\nfunction (hljs) {\n  return {\n    keywords: 'Feature Background Ability Business\\ Need Scenario Scenarios Scenario\\ Outline Scenario\\ Template Examples Given And Then But When',\n    contains: [\n      {\n        className: 'keyword',\n        begin: '\\\\*'\n      },\n      {\n        className: 'comment',\n        begin: '@[^@\\r\\n\\t ]+', end: '$'\n      },\n      {\n        className: 'string',\n        begin: '\\\\|', end: '\\\\$'\n      },\n      {\n        className: 'variable',\n        begin: '<', end: '>',\n      },\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/glsl.js",
    "content": "/*\nLanguage: GLSL\nDescription: OpenGL Shading Language\nAuthor: Sergey Tikhomirov <me@stikhomirov.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        'atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default ' +\n        'discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 ' +\n        'dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray ' +\n        'iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube ' +\n        'iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect ' +\n        'image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray ' +\n        'isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer ' +\n        'isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 ' +\n        'mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict ' +\n        'return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray ' +\n        'sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow ' +\n        'sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth ' +\n        'struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray ' +\n        'uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray ' +\n        'usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer ' +\n        'usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly',\n      built_in:\n        'gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial ' +\n        'gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color ' +\n        'gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord ' +\n        'gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor ' +\n        'gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial ' +\n        'gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel ' +\n        'gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize ' +\n        'gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers ' +\n        'gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs ' +\n        'gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers ' +\n        'gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents ' +\n        'gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers ' +\n        'gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents ' +\n        'gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits ' +\n        'gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents ' +\n        'gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset ' +\n        'gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms ' +\n        'gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits ' +\n        'gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents ' +\n        'gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters ' +\n        'gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents ' +\n        'gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents ' +\n        'gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits ' +\n        'gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors ' +\n        'gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs ' +\n        'gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits ' +\n        'gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffset'+\n        'gl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose ' +\n        'gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse ' +\n        'gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose ' +\n        'gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 ' +\n        'gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix ' +\n        'gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn ' +\n        'gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn ' +\n        'gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose ' +\n        'gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition ' +\n        'gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor ' +\n        'gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID ' +\n        'gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive ' +\n        'abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement ' +\n        'atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ' +\n        'ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward ' +\n        'findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan ' +\n        'greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange ' +\n        'imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended ' +\n        'intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt ' +\n        'isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier ' +\n        'min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 ' +\n        'packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract ' +\n        'round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj ' +\n        'shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture ' +\n        'texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj ' +\n        'texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod ' +\n        'textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod ' +\n        'textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod ' +\n        'textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry ' +\n        'uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 ' +\n        'unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse',\n      literal: 'true false'\n    },\n    illegal: '\"',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/go.js",
    "content": "/*\nLanguage: Go\nAuthor: Stephan Kountso aka StepLg <steplg@gmail.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>\nDescription: Google go language (golang). For info about language see http://golang.org/\n*/\n\nfunction(hljs) {\n  var GO_KEYWORDS = {\n    keyword:\n      'break default func interface select case map struct chan else goto package switch ' +\n      'const fallthrough if range type continue for import return var go defer',\n    constant:\n       'true false iota nil',\n    typename:\n      'bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 ' +\n      'uint16 uint32 uint64 int uint uintptr rune',\n    built_in:\n      'append cap close complex copy imag len make new panic print println real recover delete'\n  };\n  return {\n    aliases: [\"golang\"],\n    keywords: GO_KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'', end: '[^\\\\\\\\]\\''\n      },\n      {\n        className: 'string',\n        begin: '`', end: '`'\n      },\n      {\n        className: 'number',\n        begin: '[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?',\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/gradle.js",
    "content": "/*\nLanguage: Gradle\nAuthor: Damian Mee <mee.damian@gmail.com>\nWebsite: http://meeDamian.com\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'task project allprojects subprojects artifacts buildscript configurations ' +\n        'dependencies repositories sourceSets description delete from into include ' +\n        'exclude source classpath destinationDir includes options sourceCompatibility ' +\n        'targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant ' +\n        'def abstract break case catch continue default do else extends final finally ' +\n        'for if implements instanceof native new private protected public return static ' +\n        'switch synchronized throw throws transient try volatile while strictfp package ' +\n        'import false null super this true antlrtask checkstyle codenarc copy boolean ' +\n        'byte char class double float int interface long short void compile runTime ' +\n        'file fileTree abs any append asList asWritable call collect compareTo count ' +\n        'div dump each eachByte eachFile eachLine every find findAll flatten getAt ' +\n        'getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods ' +\n        'isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter ' +\n        'newReader newWriter next plus pop power previous print println push putAt read ' +\n        'readBytes readLines reverse reverseEach round size sort splitEachLine step subMap ' +\n        'times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader ' +\n        'withStream withWriter withWriterAppend write writeLine'\n    },\n    contains: [    \n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.REGEXP_MODE\n\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/haml.js",
    "content": "/*\nLanguage: Haml\nRequires: ruby.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://google.com/profiles/dan.j.allen\n*/\n\n// TODO support filter tags like :javascript, support inline HTML\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    contains: [\n      {\n        className: 'doctype',\n        begin: '^!!!( (5|1\\\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\\\b.*))?$',\n        relevance: 10\n      },\n      {\n        className: 'comment',\n        // FIXME these comments should be allowed to span indented lines\n        begin: '^\\\\s*(!=#|=#|-#|/).*$',\n        relevance: 0\n      },\n      {\n        begin: '^\\\\s*(-|=|!=)(?!#)',\n        starts: {\n          end: '\\\\n',\n          subLanguage: 'ruby'\n        }\n      },\n      {\n        className: 'tag',\n        begin: '^\\\\s*%',\n        contains: [\n          {\n            className: 'title',\n            begin: '\\\\w+'\n          },\n          {\n            className: 'value',\n            begin: '[#\\\\.]\\\\w+'\n          },\n          {\n            begin: '{\\\\s*',\n            end: '\\\\s*}',\n            excludeEnd: true,\n            contains: [\n              {\n                //className: 'attribute',\n                begin: ':\\\\w+\\\\s*=>',\n                end: ',\\\\s+',\n                returnBegin: true,\n                endsWithParent: true,\n                contains: [\n                  {\n                    className: 'symbol',\n                    begin: ':\\\\w+'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\"',\n                    end: '\"'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\\'',\n                    end: '\\''\n                  },\n                  {\n                    begin: '\\\\w+',\n                    relevance: 0\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            begin: '\\\\(\\\\s*',\n            end: '\\\\s*\\\\)',\n            excludeEnd: true,\n            contains: [\n              {\n                //className: 'attribute',\n                begin: '\\\\w+\\\\s*=',\n                end: '\\\\s+',\n                returnBegin: true,\n                endsWithParent: true,\n                contains: [\n                  {\n                    className: 'attribute',\n                    begin: '\\\\w+',\n                    relevance: 0\n                  },\n                  {\n                    className: 'string',\n                    begin: '\"',\n                    end: '\"'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\\'',\n                    end: '\\''\n                  },\n                  {\n                    begin: '\\\\w+',\n                    relevance: 0\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'bullet',\n        begin: '^\\\\s*[=~]\\\\s*',\n        relevance: 0\n      },\n      {\n        begin: '#{',\n        starts: {\n          end: '}',\n          subLanguage: 'ruby'\n        }\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/handlebars.js",
    "content": "/*\nLanguage: Handlebars\nRequires: xml.js\nAuthor: Robin Ward <robin.ward@gmail.com>\nDescription: Matcher for Handlebars as well as EmberJS additions.\n*/\n\nfunction(hljs) {\n  var EXPRESSION_KEYWORDS = 'each in with if else unless bindattr action collection debugger log outlet template unbound view yield';\n  return {\n    aliases: ['hbs', 'html.hbs', 'html.handlebars'],\n    case_insensitive: true,\n    subLanguage: 'xml', subLanguageMode: 'continuous',\n    contains: [\n      {\n        className: 'expression',\n        begin: '{{', end: '}}',\n        contains: [\n          {\n            className: 'begin-block', begin: '\\#[a-zA-Z\\-\\ \\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          },\n          {\n            className: 'string',\n            begin: '\"', end: '\"'\n          },\n          {\n            className: 'end-block', begin: '\\\\\\/[a-zA-Z\\-\\ \\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          },\n          {\n            className: 'variable', begin: '[a-zA-Z\\-\\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/haskell.js",
    "content": "/*\nLanguage: Haskell\nAuthor: Jeremy Hull <sourdrums@gmail.com>\nContributors: Zena Treep <zena.treep@gmail.com>\n*/\n\nfunction(hljs) {\n\n  var COMMENT = {\n    className: 'comment',\n    variants: [\n      { begin: '--', end: '$' },\n      { begin: '{-', end: '-}'\n      , contains: ['self']\n      }\n    ]\n  };\n\n  var PRAGMA = {\n    className: 'pragma',\n    begin: '{-#', end: '#-}'\n  };\n\n  var PREPROCESSOR = {\n    className: 'preprocessor',\n    begin: '^#', end: '$'\n  };\n\n  var CONSTRUCTOR = {\n    className: 'type',\n    begin: '\\\\b[A-Z][\\\\w\\']*', // TODO: other constructors (build-in, infix).\n    relevance: 0\n  };\n\n  var LIST = {\n    className: 'container',\n    begin: '\\\\(', end: '\\\\)',\n    illegal: '\"',\n    contains: [\n      PRAGMA,\n      COMMENT,\n      PREPROCESSOR,\n      {className: 'type', begin: '\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?'},\n      hljs.inherit(hljs.TITLE_MODE, {begin: '[_a-z][\\\\w\\']*'})\n    ]\n  };\n\n  var RECORD = {\n    className: 'container',\n    begin: '{', end: '}',\n    contains: LIST.contains\n  };\n\n  return {\n    aliases: ['hs'],\n    keywords:\n      'let in if then else case of where do module import hiding ' +\n      'qualified type data newtype deriving class instance as default ' +\n      'infix infixl infixr foreign export ccall stdcall cplusplus ' +\n      'jvm dotnet safe unsafe family forall mdo proc rec',\n    contains: [\n\n      // Top-level constructions.\n\n      {\n        className: 'module',\n        begin: '\\\\bmodule\\\\b', end: 'where',\n        keywords: 'module where',\n        contains: [LIST, COMMENT],\n        illegal: '\\\\W\\\\.|;'\n      },\n      {\n        className: 'import',\n        begin: '\\\\bimport\\\\b', end: '$',\n        keywords: 'import|0 qualified as hiding',\n        contains: [LIST, COMMENT],\n        illegal: '\\\\W\\\\.|;'\n      },\n\n      {\n        className: 'class',\n        begin: '^(\\\\s*)?(class|instance)\\\\b', end: 'where',\n        keywords: 'class family instance where',\n        contains: [CONSTRUCTOR, LIST, COMMENT]\n      },\n      {\n        className: 'typedef',\n        begin: '\\\\b(data|(new)?type)\\\\b', end: '$',\n        keywords: 'data family type newtype deriving',\n        contains: [PRAGMA, COMMENT, CONSTRUCTOR, LIST, RECORD]\n      },\n      {\n        className: 'default',\n        beginKeywords: 'default', end: '$',\n        contains: [CONSTRUCTOR, LIST, COMMENT]\n      },\n      {\n        className: 'infix',\n        beginKeywords: 'infix infixl infixr', end: '$',\n        contains: [hljs.C_NUMBER_MODE, COMMENT]\n      },\n      {\n        className: 'foreign',\n        begin: '\\\\bforeign\\\\b', end: '$',\n        keywords: 'foreign import export ccall stdcall cplusplus jvm ' +\n                  'dotnet safe unsafe',\n        contains: [CONSTRUCTOR, hljs.QUOTE_STRING_MODE, COMMENT]\n      },\n      {\n        className: 'shebang',\n        begin: '#!\\\\/usr\\\\/bin\\\\/env\\ runhaskell', end: '$'\n      },\n\n      // \"Whitespaces\".\n\n      PRAGMA,\n      COMMENT,\n      PREPROCESSOR,\n\n      // Literals and names.\n\n      // TODO: characters.\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      CONSTRUCTOR,\n      hljs.inherit(hljs.TITLE_MODE, {begin: '^[_a-z][\\\\w\\']*'}),\n\n      {begin: '->|<-'} // No markup, relevance booster\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/haxe.js",
    "content": "/*\nLanguage: Haxe\nAuthor: Christopher Kaster <ikasoki@gmail.com> (Based on the actionscript.js language file by Alexander Myadzel)\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';\n  var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';\n\n  return {\n    aliases: ['hx'],\n    keywords: {\n      keyword: 'break callback case cast catch class continue default do dynamic else enum extends extern ' +\n\t\t'for function here if implements import in inline interface never new override package private ' + \n\t\t'public return static super switch this throw trace try typedef untyped using var while',\n      literal: 'true false null'\n    },\n    contains: [\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.TITLE_MODE\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elseif end error'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '[{;]', excludeEnd: true,\n        illegal: '\\\\S',\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ]\n          },\n          {\n            className: 'type',\n            begin: ':',\n            end: IDENT_FUNC_RETURN_TYPE_RE,\n            relevance: 10\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/http.js",
    "content": "/*\n  Language: HTTP\n  Description: HTTP request and response headers with automatic body highlighting\n  Author: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  return {\n    illegal: '\\\\S',\n    contains: [\n      {\n        className: 'status',\n        begin: '^HTTP/[0-9\\\\.]+', end: '$',\n        contains: [{className: 'number', begin: '\\\\b\\\\d{3}\\\\b'}]\n      },\n      {\n        className: 'request',\n        begin: '^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$', returnBegin: true, end: '$',\n        contains: [\n          {\n            className: 'string',\n            begin: ' ', end: ' ',\n            excludeBegin: true, excludeEnd: true\n          }\n        ]\n      },\n      {\n        className: 'attribute',\n        begin: '^\\\\w', end: ': ', excludeEnd: true,\n        illegal: '\\\\n|\\\\s|=',\n        starts: {className: 'string', end: '$'}\n      },\n      {\n        begin: '\\\\n\\\\n',\n        starts: {subLanguage: '', endsWithParent: true}\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/ini.js",
    "content": "/*\nLanguage: Ini\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    illegal: /\\S/,\n    contains: [\n      {\n        className: 'comment',\n        begin: ';', end: '$'\n      },\n      {\n        className: 'title',\n        begin: '^\\\\[', end: '\\\\]'\n      },\n      {\n        className: 'setting',\n        begin: '^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*', end: '$',\n        contains: [\n          {\n            className: 'value',\n            endsWithParent: true,\n            keywords: 'on off true false yes no',\n            contains: [hljs.QUOTE_STRING_MODE, hljs.NUMBER_MODE],\n            relevance: 0\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/java.js",
    "content": "/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    'false synchronized int abstract float private char boolean static null if const ' +\n    'for true while long throw strictfp finally protected import native final return void ' +\n    'enum else break transient new catch instanceof byte super volatile case assert short ' +\n    'package default double public try this switch continue throws';\n  return {\n    aliases: ['jsp'],\n    keywords: KEYWORDS,\n    illegal: /<\\//,\n    contains: [\n      {\n        className: 'javadoc',\n        begin: '/\\\\*\\\\*', end: '\\\\*/',\n        contains: [{\n          className: 'javadoctag', begin: '(^|\\\\s)@[A-Za-z]+'\n        }],\n        relevance: 10\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        beginKeywords: 'protected public private', end: /[{;=]/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            className: 'class',\n            beginKeywords: 'class interface', endsWithParent: true, excludeEnd: true,\n            illegal: /[:\"\\[\\]]/,\n            contains: [\n              {\n                beginKeywords: 'extends implements',\n                relevance: 10\n              },\n              hljs.UNDERSCORE_TITLE_MODE\n            ]\n          },\n          {\n            begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n            contains: [\n              hljs.UNDERSCORE_TITLE_MODE\n            ]\n          }\n        ]\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'annotation', begin: '@[A-Za-z]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/javascript.js",
    "content": "/*\nLanguage: JavaScript\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['js'],\n    keywords: {\n      keyword:\n        'in if for while finally var new function do return void else break catch ' +\n        'instanceof with throw case default try this switch continue typeof delete ' +\n        'let yield const class',\n      literal:\n        'true false null undefined NaN Infinity',\n      built_in:\n        'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +\n        'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +\n        'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +\n        'TypeError URIError Number Math Date String RegExp Array Float32Array ' +\n        'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +\n        'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +\n        'module console window document'\n    },\n    contains: [\n      {\n        className: 'pi',\n        begin: /^\\s*('|\")use strict('|\")/,\n        relevance: 10\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        contains: [\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          hljs.REGEXP_MODE,\n          { // E4X\n            begin: /</, end: />;/,\n            relevance: 0,\n            subLanguage: 'xml'\n          }\n        ],\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /\\{/, excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/}),\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"'\\(]/\n          }\n        ],\n        illegal: /\\[|%/\n      },\n      {\n        begin: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      },\n      {\n        begin: '\\\\.' + hljs.IDENT_RE, relevance: 0 // hack: prevents detection of keywords after dots\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/json.js",
    "content": "/*\nLanguage: JSON\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var LITERALS = {literal: 'true false null'};\n  var TYPES = [\n    hljs.QUOTE_STRING_MODE,\n    hljs.C_NUMBER_MODE\n  ];\n  var VALUE_CONTAINER = {\n    className: 'value',\n    end: ',', endsWithParent: true, excludeEnd: true,\n    contains: TYPES,\n    keywords: LITERALS\n  };\n  var OBJECT = {\n    begin: '{', end: '}',\n    contains: [\n      {\n        className: 'attribute',\n        begin: '\\\\s*\"', end: '\"\\\\s*:\\\\s*', excludeBegin: true, excludeEnd: true,\n        contains: [hljs.BACKSLASH_ESCAPE],\n        illegal: '\\\\n',\n        starts: VALUE_CONTAINER\n      }\n    ],\n    illegal: '\\\\S'\n  };\n  var ARRAY = {\n    begin: '\\\\[', end: '\\\\]',\n    contains: [hljs.inherit(VALUE_CONTAINER, {className: null})], // inherit is also a workaround for a bug that makes shared modes with endsWithParent compile only the ending of one of the parents\n    illegal: '\\\\S'\n  };\n  TYPES.splice(TYPES.length, 0, OBJECT, ARRAY);\n  return {\n    contains: TYPES,\n    keywords: LITERALS,\n    illegal: '\\\\S'\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/lasso.js",
    "content": "/*\nLanguage: Lasso\nAuthor: Eric Knibbe <eric@lassosoft.com>\nDescription: Lasso is a language and server platform for database-driven web applications. This definition handles Lasso 9 syntax and LassoScript for Lasso 8.6 and earlier.\n*/\n\nfunction(hljs) {\n  var LASSO_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_.]*';\n  var LASSO_ANGLE_RE = '<\\\\?(lasso(script)?|=)';\n  var LASSO_CLOSE_RE = '\\\\]|\\\\?>';\n  var LASSO_KEYWORDS = {\n    literal:\n      'true false none minimal full all void and or not ' +\n      'bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft',\n    built_in:\n      'array date decimal duration integer map pair string tag xml null ' +\n      'bytes list queue set stack staticarray tie local var variable ' +\n      'global data self inherited',\n    keyword:\n      'error_code error_msg error_pop error_push error_reset cache ' +\n      'database_names database_schemanames database_tablenames define_tag ' +\n      'define_type email_batch encode_set html_comment handle handle_error ' +\n      'header if inline iterate ljax_target link link_currentaction ' +\n      'link_currentgroup link_currentrecord link_detail link_firstgroup ' +\n      'link_firstrecord link_lastgroup link_lastrecord link_nextgroup ' +\n      'link_nextrecord link_prevgroup link_prevrecord log loop ' +\n      'namespace_using output_none portal private protect records referer ' +\n      'referrer repeating resultset rows search_args search_arguments ' +\n      'select sort_args sort_arguments thread_atomic value_list while ' +\n      'abort case else if_empty if_false if_null if_true loop_abort ' +\n      'loop_continue loop_count params params_up return return_value ' +\n      'run_children soap_definetag soap_lastrequest soap_lastresponse ' +\n      'tag_name ascending average by define descending do equals ' +\n      'frozen group handle_failure import in into join let match max ' +\n      'min on order parent protected provide public require returnhome ' +\n      'skip split_thread sum take thread to trait type where with ' +\n      'yield yieldhome'\n  };\n  var HTML_COMMENT = {\n    className: 'comment',\n    begin: '<!--', end: '-->',\n    relevance: 0\n  };\n  var LASSO_NOPROCESS = {\n    className: 'preprocessor',\n    begin: '\\\\[noprocess\\\\]',\n    starts: {\n      className: 'markup',\n      end: '\\\\[/noprocess\\\\]',\n      returnEnd: true,\n      contains: [HTML_COMMENT]\n    }\n  };\n  var LASSO_START = {\n    className: 'preprocessor',\n    begin: '\\\\[/noprocess|' + LASSO_ANGLE_RE\n  };\n  var LASSO_DATAMEMBER = {\n    className: 'variable',\n    begin: '\\'' + LASSO_IDENT_RE + '\\''\n  };\n  var LASSO_CODE = [\n    hljs.C_LINE_COMMENT_MODE,\n    {\n      className: 'javadoc',\n      begin: '/\\\\*\\\\*!', end: '\\\\*/',\n      contains: [hljs.PHRASAL_WORDS_MODE]\n    },\n    hljs.C_BLOCK_COMMENT_MODE,\n    hljs.inherit(hljs.C_NUMBER_MODE, {begin: hljs.C_NUMBER_RE + '|-?(infinity|nan)\\\\b'}),\n    hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n    hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n    {\n      className: 'string',\n      begin: '`', end: '`'\n    },\n    {\n      className: 'variable',\n      variants: [\n        {\n          begin: '[#$]' + LASSO_IDENT_RE\n        },\n        {\n          begin: '#', end: '\\\\d+',\n          illegal: '\\\\W'\n        }\n      ]\n    },\n    {\n      className: 'tag',\n      begin: '::\\\\s*', end: LASSO_IDENT_RE,\n      illegal: '\\\\W'\n    },\n    {\n      className: 'attribute',\n      variants: [\n        {\n          begin: '-' + hljs.UNDERSCORE_IDENT_RE,\n          relevance: 0\n        },\n        {\n          begin: '(\\\\.\\\\.\\\\.)'\n        }\n      ]\n    },\n    {\n      className: 'subst',\n      variants: [\n        {\n          begin: '->\\\\s*',\n          contains: [LASSO_DATAMEMBER]\n        },\n        {\n          begin: ':=|/(?!\\\\w)=?|[-+*%=<>&|!?\\\\\\\\]+',\n          relevance: 0\n        }\n      ]\n    },\n    {\n      className: 'built_in',\n      begin: '\\\\.\\\\.?',\n      relevance: 0,\n      contains: [LASSO_DATAMEMBER]\n    },\n    {\n      className: 'class',\n      beginKeywords: 'define',\n      returnEnd: true, end: '\\\\(|=>',\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: hljs.UNDERSCORE_IDENT_RE + '(=(?!>))?'})\n      ]\n    }\n  ];\n  return {\n    aliases: ['ls', 'lassoscript'],\n    case_insensitive: true,\n    lexemes: LASSO_IDENT_RE + '|&[lg]t;',\n    keywords: LASSO_KEYWORDS,\n    contains: [\n      {\n        className: 'preprocessor',\n        begin: LASSO_CLOSE_RE,\n        relevance: 0,\n        starts: {\n          className: 'markup',\n          end: '\\\\[|' + LASSO_ANGLE_RE,\n          returnEnd: true,\n          relevance: 0,\n          contains: [HTML_COMMENT]\n        }\n      },\n      LASSO_NOPROCESS,\n      LASSO_START,\n      {\n        className: 'preprocessor',\n        begin: '\\\\[no_square_brackets',\n        starts: {\n          end: '\\\\[/no_square_brackets\\\\]', // not implemented in the language\n          lexemes: LASSO_IDENT_RE + '|&[lg]t;',\n          keywords: LASSO_KEYWORDS,\n          contains: [\n            {\n              className: 'preprocessor',\n              begin: LASSO_CLOSE_RE,\n              relevance: 0,\n              starts: {\n                className: 'markup',\n                end: LASSO_ANGLE_RE,\n                returnEnd: true,\n                contains: [HTML_COMMENT]\n              }\n            },\n            LASSO_NOPROCESS,\n            LASSO_START\n          ].concat(LASSO_CODE)\n        }\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\[',\n        relevance: 0\n      },\n      {\n        className: 'shebang',\n        begin: '^#!.+lasso9\\\\b',\n        relevance: 10\n      }\n    ].concat(LASSO_CODE)\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/lisp.js",
    "content": "/*\nLanguage: Lisp\nDescription: Generic lisp syntax\nAuthor: Vasily Polovnyov <vast@whiteants.net>\n*/\n\nfunction(hljs) {\n  var LISP_IDENT_RE = '[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#!]*';\n  var LISP_SIMPLE_NUMBER_RE = '(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?';\n  var SHEBANG = {\n    className: 'shebang',\n    begin: '^#!', end: '$'\n  };\n  var LITERAL = {\n    className: 'literal',\n    begin: '\\\\b(t{1}|nil)\\\\b'\n  };\n  var NUMBER = {\n    className: 'number',\n    variants: [\n      {begin: LISP_SIMPLE_NUMBER_RE, relevance: 0},\n      {begin: '#b[0-1]+(/[0-1]+)?'},\n      {begin: '#o[0-7]+(/[0-7]+)?'},\n      {begin: '#x[0-9a-f]+(/[0-9a-f]+)?'},\n      {begin: '#c\\\\(' + LISP_SIMPLE_NUMBER_RE + ' +' + LISP_SIMPLE_NUMBER_RE, end: '\\\\)'}\n    ]\n  };\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});\n  var COMMENT = {\n    className: 'comment',\n    begin: ';', end: '$'\n  };\n  var VARIABLE = {\n    className: 'variable',\n    begin: '\\\\*', end: '\\\\*'\n  };\n  var KEYWORD = {\n    className: 'keyword',\n    begin: '[:&]' + LISP_IDENT_RE\n  };\n  var QUOTED_LIST = {\n    begin: '\\\\(', end: '\\\\)',\n    contains: ['self', LITERAL, STRING, NUMBER]\n  };\n  var QUOTED = {\n    className: 'quoted',\n    contains: [NUMBER, STRING, VARIABLE, KEYWORD, QUOTED_LIST],\n    variants: [\n      {\n        begin: '[\\'`]\\\\(', end: '\\\\)'\n      },\n      {\n        begin: '\\\\(quote ', end: '\\\\)',\n        keywords: {title: 'quote'}\n      }\n    ]\n  };\n  var QUOTED_ATOM = {\n    className: 'quoted',\n    begin: '\\'' + LISP_IDENT_RE\n  };\n  var LIST = {\n    className: 'list',\n    begin: '\\\\(', end: '\\\\)'\n  };\n  var BODY = {\n    endsWithParent: true,\n    relevance: 0\n  };\n  LIST.contains = [{className: 'title', begin: LISP_IDENT_RE}, BODY];\n  BODY.contains = [QUOTED, QUOTED_ATOM, LIST, LITERAL, NUMBER, STRING, COMMENT, VARIABLE, KEYWORD];\n\n  return {\n    illegal: /\\S/,\n    contains: [\n      NUMBER,\n      SHEBANG,\n      LITERAL,\n      STRING,\n      COMMENT,\n      QUOTED,\n      QUOTED_ATOM,\n      LIST\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/livecodeserver.js",
    "content": "/*\nLanguage: LiveCode server and revIgniter\nAuthor: Ralf Bitter <rabit@revigniter.com>\nDescription: Language definition for LiveCode server accounting for revIgniter (a web application framework) characteristics.\nVersion: 1.0a\nDate: 2013-06-03\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable', begin: '\\\\b[gtps][A-Z]+[A-Za-z0-9_\\\\-]*\\\\b|\\\\$_[A-Z]+',\n    relevance: 0\n  };\n  var COMMENT = {\n    className: 'comment', end: '$',\n    variants: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: '--'\n      },\n      {\n        begin: '[^:]//'\n      }\n    ]\n  };\n  var TITLE1 = hljs.inherit(hljs.TITLE_MODE, {\n    variants: [\n      {begin: '\\\\b_*rig[A-Z]+[A-Za-z0-9_\\\\-]*'},\n      {begin: '\\\\b_[a-z0-9\\\\-]+'}\n    ]\n  });\n  var TITLE2 = hljs.inherit(hljs.TITLE_MODE, {begin: '\\\\b([A-Za-z0-9_\\\\-]+)\\\\b'});\n  return {\n    case_insensitive: false,\n    keywords: {\n      keyword:\n        'after byte bytes english the until http forever descending using line real8 with seventh ' +\n        'for stdout finally element word fourth before black ninth sixth characters chars stderr ' +\n        'uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid ' +\n        'at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 ' +\n        'int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat ' +\n        'end repeat URL in try into switch to words https token binfile each tenth as ticks tick ' +\n        'system real4 by dateItems without char character ascending eighth whole dateTime numeric short ' +\n        'first ftp integer abbreviated abbr abbrev private case while if',\n      constant:\n        'SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE ' +\n        'QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO ' +\n        'six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five ' +\n        'quote empty one true return cr linefeed right backslash null seven tab three two ' +\n        'RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK ' +\n        'FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK',\n      operator:\n        'div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within ' +\n        'contains ends with begins the keys of keys',\n      built_in:\n        'put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode ' +\n        'base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum ' +\n        'cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories ' +\n        'diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global ' +\n        'globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset ' +\n        'keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders ' +\n        'libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 ' +\n        'longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec ' +\n        'millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles ' +\n        'openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform ' +\n        'processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord ' +\n        'revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull ' +\n        'revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered ' +\n        'revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames ' +\n        'revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull ' +\n        'revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections ' +\n        'revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype ' +\n        'revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext ' +\n        'revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames ' +\n        'revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase ' +\n        'revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath ' +\n        'revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames ' +\n        'revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren ' +\n        'revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents ' +\n        'revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText ' +\n        'revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort ' +\n        'revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree ' +\n        'revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round ' +\n        'sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound ' +\n        'stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc ' +\n        'uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset ' +\n        'add breakpoint cancel clear local variable file word line folder directory URL close socket process ' +\n        'combine constant convert create new alias folder directory decrypt delete variable word line folder ' +\n        'directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile ' +\n        'libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback ' +\n        'libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime ' +\n        'libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename ' +\n        'replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase ' +\n        'revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees ' +\n        'revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord ' +\n        'revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase ' +\n        'revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD ' +\n        'revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost ' +\n        'revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData ' +\n        'revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel ' +\n        'revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback ' +\n        'revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split ' +\n        'subtract union unload wait write'\n    },\n    contains: [\n      VARIABLE,\n      {\n        className: 'keyword',\n        begin: '\\\\bend\\\\sif\\\\b'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '$',\n        contains: [\n          VARIABLE,\n          TITLE2,\n          hljs.APOS_STRING_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.BINARY_NUMBER_MODE,\n          hljs.C_NUMBER_MODE,\n          TITLE1\n        ]\n      },\n      {\n        className: 'function',\n        beginKeywords: 'end', end: '$',\n        contains: [\n          TITLE2,\n          TITLE1\n        ]\n      },\n      {\n        className: 'command',\n        beginKeywords: 'command on', end: '$',\n        contains: [\n          VARIABLE,\n          TITLE2,\n          hljs.APOS_STRING_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.BINARY_NUMBER_MODE,\n          hljs.C_NUMBER_MODE,\n          TITLE1\n        ]\n      },\n      {\n        className: 'command',\n        beginKeywords: 'end', end: '$',\n        contains: [\n          TITLE2,\n          TITLE1\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '<\\\\?rev|<\\\\?lc|<\\\\?livecode',\n        relevance: 10\n      },\n      {\n        className: 'preprocessor',\n        begin: '<\\\\?'\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\?>'\n      },\n      COMMENT,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.BINARY_NUMBER_MODE,\n      hljs.C_NUMBER_MODE,\n      TITLE1\n    ],\n    illegal: ';$|^\\\\[|^='\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/lua.js",
    "content": "/*\nLanguage: Lua\nAuthor: Andrew Fedorov <dmmdrs@mail.ru>\n*/\n\nfunction(hljs) {\n  var OPENING_LONG_BRACKET = '\\\\[=*\\\\[';\n  var CLOSING_LONG_BRACKET = '\\\\]=*\\\\]';\n  var LONG_BRACKETS = {\n    begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n    contains: ['self']\n  };\n  var COMMENTS = [\n    {\n      className: 'comment',\n      begin: '--(?!' + OPENING_LONG_BRACKET + ')', end: '$'\n    },\n    {\n      className: 'comment',\n      begin: '--' + OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n      contains: [LONG_BRACKETS],\n      relevance: 10\n    }\n  ]\n  return {\n    lexemes: hljs.UNDERSCORE_IDENT_RE,\n    keywords: {\n      keyword:\n        'and break do else elseif end false for if in local nil not or repeat return then ' +\n        'true until while',\n      built_in:\n        '_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load ' +\n        'loadfile loadstring module next pairs pcall print rawequal rawget rawset require ' +\n        'select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug ' +\n        'io math os package string table'\n    },\n    contains: COMMENTS.concat([\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '\\\\)',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: '([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*'}),\n          {\n            className: 'params',\n            begin: '\\\\(', endsWithParent: true,\n            contains: COMMENTS\n          }\n        ].concat(COMMENTS)\n      },\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n        contains: [LONG_BRACKETS],\n        relevance: 5\n      }\n    ])\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/makefile.js",
    "content": "/*\nLanguage: Makefile\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable',\n    begin: /\\$\\(/, end: /\\)/,\n    contains: [hljs.BACKSLASH_ESCAPE]\n  };\n  return {\n    aliases: ['mk', 'mak'],\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: /^\\w+\\s*\\W*=/, returnBegin: true,\n        relevance: 0,\n        starts: {\n          className: 'constant',\n          end: /\\s*\\W*=/, excludeEnd: true,\n          starts: {\n            end: /$/,\n            relevance: 0,\n            contains: [\n              VARIABLE\n            ]\n          }\n        }\n      },\n      {\n        className: 'title',\n        begin: /^[\\w]+:\\s*$/\n      },\n      {\n        className: 'phony',\n        begin: /^\\.PHONY:/, end: /$/,\n        keywords: '.PHONY', lexemes: /[\\.\\w]+/\n      },\n      {\n        begin: /^\\t+/, end: /$/,\n        contains: [\n          hljs.QUOTE_STRING_MODE,\n          VARIABLE\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/markdown.js",
    "content": "/*\nLanguage: Markdown\nRequires: xml.js\nAuthor: John Crepezzi <john.crepezzi@gmail.com>\nWebsite: http://seejohncode.com/\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['md', 'mkdown', 'mkd'],\n    contains: [\n      // highlight headers\n      {\n        className: 'header',\n        variants: [\n          { begin: '^#{1,6}', end: '$' },\n          { begin: '^.+?\\\\n[=-]{2,}$' }\n        ]\n      },\n      // inline html\n      {\n        begin: '<', end: '>',\n        subLanguage: 'xml',\n        relevance: 0\n      },\n      // lists (indicators only)\n      {\n        className: 'bullet',\n        begin: '^([*+-]|(\\\\d+\\\\.))\\\\s+'\n      },\n      // strong segments\n      {\n        className: 'strong',\n        begin: '[*_]{2}.+?[*_]{2}'\n      },\n      // emphasis segments\n      {\n        className: 'emphasis',\n        variants: [\n          { begin: '\\\\*.+?\\\\*' },\n          { begin: '_.+?_'\n          , relevance: 0\n          }\n        ]\n      },\n      // blockquotes\n      {\n        className: 'blockquote',\n        begin: '^>\\\\s+', end: '$'\n      },\n      // code snippets\n      {\n        className: 'code',\n        variants: [\n          { begin: '`.+?`' },\n          { begin: '^( {4}|\\t)', end: '$'\n          , relevance: 0\n          }\n        ]\n      },\n      // horizontal rules\n      {\n        className: 'horizontal_rule',\n        begin: '^[-\\\\*]{3,}', end: '$'\n      },\n      // using links - title and link\n      {\n        begin: '\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]',\n        returnBegin: true,\n        contains: [\n          {\n            className: 'link_label',\n            begin: '\\\\[', end: '\\\\]',\n            excludeBegin: true,\n            returnEnd: true,\n            relevance: 0\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\]\\\\(', end: '\\\\)',\n            excludeBegin: true, excludeEnd: true\n          },\n          {\n            className: 'link_reference',\n            begin: '\\\\]\\\\[', end: '\\\\]',\n            excludeBegin: true, excludeEnd: true\n          }\n        ],\n        relevance: 10\n      },\n      {\n        begin: '^\\\\[\\.+\\\\]:', end: '$',\n        returnBegin: true,\n        contains: [\n          {\n            className: 'link_reference',\n            begin: '\\\\[', end: '\\\\]',\n            excludeBegin: true, excludeEnd: true\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\s', end: '$'\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/mathematica.js",
    "content": "/*\nLanguage: Mathematica\nAuthor: Daniel Kvasnicka <dkvasnicka@vendavo.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['mma'],\n    lexemes: '(\\\\$|\\\\b)' + hljs.IDENT_RE + '\\\\b',\n    keywords: 'AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis ' +\n      'BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering ' +\n      'C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ' +\n      'ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition ' +\n      'D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform ' +\n      'DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions ' +\n      'E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution ' +\n      'FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve ' +\n      'FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance ' +\n      'GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion ' +\n      'GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution ' +\n      'HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData ' +\n      'I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction ' +\n      'InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess ' +\n      'JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition ' +\n      'K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter ' +\n      'Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions ' +\n      'LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy ' +\n      'MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution ' +\n      'N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator ' +\n      'NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot ' +\n      'O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues ' +\n      'PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList ' +\n      'PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions ' +\n      'QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder ' +\n      'RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity ' +\n      'SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity ' +\n      'SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders ' +\n      'SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub ' +\n      'Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine ' +\n      'Transparent ' +\n      'UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd ' +\n      'V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution ' +\n      'WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian ' +\n      'XMLElement XMLObject Xnor Xor ' +\n      'Yellow YuleDissimilarity ' +\n      'ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform ' +\n      '$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber',\n    contains: [\n      {\n        className: \"comment\",\n        begin: /\\(\\*/, end: /\\*\\)/\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'list',\n        begin: /\\{/, end: /\\}/,\n        illegal: /:/\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/matlab.js",
    "content": "/*\nLanguage: Matlab\nAuthor: Denis Bardadym <bardadymchik@gmail.com>\nContributors: Eugene Nizhibitsky <nizhibitsky@ya.ru>\n*/\n\nfunction(hljs) {\n  var COMMON_CONTAINS = [\n    hljs.C_NUMBER_MODE,\n    {\n      className: 'string',\n      begin: '\\'', end: '\\'',\n      contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n    }\n  ];\n\n  return {\n    keywords: {\n      keyword:\n        'break case catch classdef continue else elseif end enumerated events for function ' +\n        'global if methods otherwise parfor persistent properties return spmd switch try while',\n      built_in:\n        'sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan ' +\n        'atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot ' +\n        'cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog ' +\n        'realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal ' +\n        'cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli ' +\n        'besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma ' +\n        'gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms ' +\n        'nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones ' +\n        'eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ' +\n        'ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril ' +\n        'triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute ' +\n        'shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan ' +\n        'isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal ' +\n        'rosser toeplitz vander wilkinson'\n    },\n    illegal: '(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',\n    contains: [\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '$',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n              className: 'params',\n              begin: '\\\\(', end: '\\\\)'\n          },\n          {\n              className: 'params',\n              begin: '\\\\[', end: '\\\\]'\n          }\n        ]\n      },\n      {\n        className: 'transposed_variable',\n        begin: '[a-zA-Z_][a-zA-Z_0-9]*(\\'+[\\\\.\\']*|[\\\\.\\']+)', end: '',\n        relevance: 0\n      },\n      {\n        className: 'matrix',\n        begin: '\\\\[', end: '\\\\]\\'*[\\\\.\\']*',\n        contains: COMMON_CONTAINS,\n        relevance: 0\n      },\n      {\n        className: 'cell',\n        begin: '\\\\{',\n        contains: COMMON_CONTAINS,\n        illegal: /:/,\n        variants: [\n          {end: /\\}'[\\.']*/},\n          {end: /\\}/, relevance: 0}\n        ]\n      },\n      {\n        className: 'comment',\n        begin: '\\\\%', end: '$'\n      }\n    ].concat(COMMON_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/mel.js",
    "content": "/*\nLanguage: MEL\nDescription: Maya Embedded Language\nAuthor: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords:\n      'int float string vector matrix if else switch case default while do for in break ' +\n      'continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic ' +\n      'addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey ' +\n      'affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve ' +\n      'alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor ' +\n      'animDisplay animView annotate appendStringArray applicationName applyAttrPreset ' +\n      'applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx ' +\n      'artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu ' +\n      'artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand ' +\n      'assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface ' +\n      'attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu ' +\n      'attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp ' +\n      'attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery ' +\n      'autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults ' +\n      'bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership ' +\n      'bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType ' +\n      'boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu ' +\n      'buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge ' +\n      'cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch ' +\n      'catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox ' +\n      'character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp ' +\n      'checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip ' +\n      'clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore ' +\n      'closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter ' +\n      'cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color ' +\n      'colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp ' +\n      'colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem ' +\n      'componentEditor compositingInterop computePolysetVolume condition cone confirmDialog ' +\n      'connectAttr connectControl connectDynamic connectJoint connectionInfo constrain ' +\n      'constrainValue constructionHistory container containsMultibyte contextInfo control ' +\n      'convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation ' +\n      'convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache ' +\n      'cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel ' +\n      'cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver ' +\n      'cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor ' +\n      'createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer ' +\n      'createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse ' +\n      'currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx ' +\n      'curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface ' +\n      'curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox ' +\n      'defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete ' +\n      'deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes ' +\n      'delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo ' +\n      'dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable ' +\n      'disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected ' +\n      'displayColor displayCull displayLevelOfDetail displayPref displayRGBColor ' +\n      'displaySmoothness displayStats displayString displaySurface distanceDimContext ' +\n      'distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct ' +\n      'doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator ' +\n      'duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression ' +\n      'dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor ' +\n      'dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers ' +\n      'editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor ' +\n      'editorTemplate effector emit emitter enableDevice encodeString endString endsWith env ' +\n      'equivalent equivalentTol erf error eval evalDeferred evalEcho event ' +\n      'exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp ' +\n      'expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof ' +\n      'fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo ' +\n      'filetest filletCurve filter filterCurve filterExpand filterStudioImport ' +\n      'findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster ' +\n      'finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar ' +\n      'floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo ' +\n      'fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint ' +\n      'frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss ' +\n      'geometryConstraint getApplicationVersionAsFloat getAttr getClassification ' +\n      'getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes ' +\n      'getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender ' +\n      'glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl ' +\n      'gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid ' +\n      'gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap ' +\n      'HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor ' +\n      'HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached ' +\n      'HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel ' +\n      'headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey ' +\n      'hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender ' +\n      'hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox ' +\n      'iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ' +\n      'ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ' +\n      'ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform ' +\n      'insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance ' +\n      'instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp ' +\n      'interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf ' +\n      'isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect ' +\n      'itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx ' +\n      'jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner ' +\n      'keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx ' +\n      'keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx ' +\n      'keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx ' +\n      'keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor ' +\n      'layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList ' +\n      'lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep ' +\n      'listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory ' +\n      'listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation ' +\n      'listNodeTypes listPanelCategories listRelatives listSets listTransforms ' +\n      'listUnselected listerEditor loadFluid loadNewShelf loadPlugin ' +\n      'loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log ' +\n      'longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive ' +\n      'makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext ' +\n      'manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx ' +\n      'manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout ' +\n      'menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp ' +\n      'mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move ' +\n      'moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute ' +\n      'nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast ' +\n      'nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint ' +\n      'normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect ' +\n      'nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref ' +\n      'nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType ' +\n      'objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface ' +\n      'offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit ' +\n      'orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier ' +\n      'paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration ' +\n      'panelHistory paramDimContext paramDimension paramLocator parent parentConstraint ' +\n      'particle particleExists particleInstancer particleRenderInfo partition pasteKey ' +\n      'pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture ' +\n      'pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo ' +\n      'pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult ' +\n      'pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend ' +\n      'polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal ' +\n      'polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge ' +\n      'polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge ' +\n      'polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet ' +\n      'polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet ' +\n      'polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection ' +\n      'polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge ' +\n      'polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet ' +\n      'polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix ' +\n      'polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut ' +\n      'polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet ' +\n      'polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge ' +\n      'polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex ' +\n      'polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection ' +\n      'polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection ' +\n      'polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint ' +\n      'polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate ' +\n      'polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge ' +\n      'polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing ' +\n      'polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet ' +\n      'polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace ' +\n      'popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer ' +\n      'projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx ' +\n      'propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd ' +\n      'python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection ' +\n      'radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl ' +\n      'readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference ' +\n      'referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE ' +\n      'registerPluginResource rehash reloadImage removeJoint removeMultiInstance ' +\n      'removePanelCategory rename renameAttr renameSelectionList renameUI render ' +\n      'renderGlobalsNode renderInfo renderLayerButton renderLayerParent ' +\n      'renderLayerPostProcess renderLayerUnparent renderManip renderPartition ' +\n      'renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor ' +\n      'renderWindowSelectContext renderer reorder reorderDeformers requires reroot ' +\n      'resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget ' +\n      'reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx ' +\n      'rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout ' +\n      'runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage ' +\n      'saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale ' +\n      'scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor ' +\n      'sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable ' +\n      'scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt ' +\n      'searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey ' +\n      'selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType ' +\n      'selectedNodes selectionConnection separator setAttr setAttrEnumResource ' +\n      'setAttrMapping setAttrNiceNameResource setConstraintRestPosition ' +\n      'setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr ' +\n      'setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe ' +\n      'setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag ' +\n      'setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject ' +\n      'setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets ' +\n      'shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare ' +\n      'shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField ' +\n      'shortNameOf showHelp showHidden showManipCtx showSelectionInTitle ' +\n      'showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface ' +\n      'size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep ' +\n      'snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound ' +\n      'soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort ' +\n      'spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString ' +\n      'startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp ' +\n      'stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex ' +\n      'stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex ' +\n      'stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString ' +\n      'stringToStringArray strip stripPrefixFromName stroke subdAutoProjection ' +\n      'subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV ' +\n      'subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror ' +\n      'subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease ' +\n      'subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring ' +\n      'surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton ' +\n      'symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext ' +\n      'texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext ' +\n      'texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text ' +\n      'textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList ' +\n      'textToShelf textureDisplacePlane textureHairColor texturePlacementContext ' +\n      'textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath ' +\n      'toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower ' +\n      'toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper ' +\n      'trace track trackCtx transferAttributes transformCompare transformLimits translator ' +\n      'trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence ' +\n      'twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit ' +\n      'unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink ' +\n      'uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane ' +\n      'viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex ' +\n      'waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire ' +\n      'wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform',\n    illegal: '</',\n    contains: [\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '`', end: '`',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      {\n        className: 'variable',\n        variants: [\n          {begin: '\\\\$\\\\d'},\n          {begin: '[\\\\$\\\\%\\\\@](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)'},\n          {begin: '\\\\*(\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)', relevance: 0}\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/mizar.js",
    "content": "/*\n  Language: Mizar\n  Author: Kelley van Evert <kelleyvanevert@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: [\n      \"environ vocabularies notations constructors definitions registrations theorems schemes requirements\",\n      \"begin end definition registration cluster existence pred func defpred deffunc theorem proof\",\n      \"let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from\",\n      \"be being by means equals implies iff redefine define now not or attr is mode suppose per cases set\",\n      \"thesis contradiction scheme reserve struct\",\n      \"correctness compatibility coherence symmetry assymetry reflexivity irreflexivity\",\n      \"connectedness uniqueness commutativity idempotence involutiveness projectivity\"\n    ].join(\" \"),\n    contains: [\n      {\n        className: \"comment\",\n        begin: \"::\", end: \"$\"\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/monkey.js",
    "content": "/*\nLanguage: Monkey\nAuthor: Arthur Bikmullin <devolonter@gmail.com>\n*/\n\nfunction(hljs) {\n  var NUMBER = {\n    variants: [\n      {\n        className: 'number',\n        begin: '[$][a-fA-F0-9]+'\n      },\n      hljs.NUMBER_MODE\n    ]\n  }\n\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword: 'public private property continue exit extern new try catch ' +\n        'eachin not abstract final select case default const local global field ' +\n        'end if then else elseif endif while wend repeat until forever for to step next return module inline throw',\n\n      built_in: 'DebugLog DebugStop Error Print ACos ACosr ASin ASinr ATan ATan2 ATan2r ATanr Abs Abs Ceil ' +\n        'Clamp Clamp Cos Cosr Exp Floor Log Max Max Min Min Pow Sgn Sgn Sin Sinr Sqrt Tan Tanr Seed PI HALFPI TWOPI',\n\n      literal: 'true false null and or shl shr mod'\n    },\n    contains: [\n      {\n        className: 'comment',\n        begin: '#rem', end: '#end'\n      },\n      {\n        className: 'comment',\n        begin: \"'\", end: '$',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function method', end: '[(=:]|$',\n        illegal: /\\n/,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '$',\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'variable',\n        begin: '\\\\b(self|super)\\\\b'\n      },\n      {\n        className: 'preprocessor',\n        beginKeywords: 'import',\n        end: '$'\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\s*#', end: '$',\n        keywords: 'if else elseif endif end then'\n      },\n      {\n        className: 'pi',\n        begin: '^\\\\s*strict\\\\b'\n      },\n      {\n        beginKeywords: 'alias', end: '=',\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      hljs.QUOTE_STRING_MODE,\n      NUMBER\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/nginx.js",
    "content": "/*\nLanguage: Nginx\nAuthor: Peter Leonov <gojpeg@yandex.ru>\nContributors: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$\\d+/},\n      {begin: /\\$\\{/, end: /}/},\n      {begin: '[\\\\$\\\\@]' + hljs.UNDERSCORE_IDENT_RE}\n    ]\n  };\n  var DEFAULT = {\n    endsWithParent: true,\n    lexemes: '[a-z/_]+',\n    keywords: {\n      built_in:\n        'on off yes no true false none blocked debug info notice warn error crit ' +\n        'select break last permanent redirect kqueue rtsig epoll poll /dev/poll'\n    },\n    relevance: 0,\n    illegal: '=>',\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'string',\n        contains: [hljs.BACKSLASH_ESCAPE, VAR],\n        variants: [\n          {begin: /\"/, end: /\"/},\n          {begin: /'/, end: /'/}\n        ]\n      },\n      {\n        className: 'url',\n        begin: '([a-z]+):/', end: '\\\\s', endsWithParent: true, excludeEnd: true\n      },\n      {\n        className: 'regexp',\n        contains: [hljs.BACKSLASH_ESCAPE, VAR],\n        variants: [\n          {begin: \"\\\\s\\\\^\", end: \"\\\\s|{|;\", returnEnd: true},\n          // regexp locations (~, ~*)\n          {begin: \"~\\\\*?\\\\s+\", end: \"\\\\s|{|;\", returnEnd: true},\n          // *.example.com\n          {begin: \"\\\\*(\\\\.[a-z\\\\-]+)+\"},\n          // sub.example.*\n          {begin: \"([a-z\\\\-]+\\\\.)+\\\\*\"}\n        ]\n      },\n      // IP\n      {\n        className: 'number',\n        begin: '\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b'\n      },\n      // units\n      {\n        className: 'number',\n        begin: '\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b',\n        relevance: 0\n      },\n      VAR\n    ]\n  };\n\n  return {\n    aliases: ['nginxconf'],\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s', end: ';|{', returnBegin: true,\n        contains: [\n          {\n            className: 'title',\n            begin: hljs.UNDERSCORE_IDENT_RE,\n            starts: DEFAULT\n          }\n        ],\n        relevance: 0\n      }\n    ],\n    illegal: '[^\\\\s\\\\}]'\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/nimrod.js",
    "content": "/*\nLanguage: Nimrod\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword: 'addr and as asm bind block break|0 case|0 cast const|0 continue|0 converter discard distinct|10 div do elif else|0 end|0 enum|0 except export finally for from generic if|0 import|0 in include|0 interface is isnot|10 iterator|10 let|0 macro method|10 mixin mod nil not notin|10 object|0 of or out proc|10 ptr raise ref|10 return shl shr static template|10 try|0 tuple type|0 using|0 var|0 when while|0 with without xor yield',\n      literal: 'shared guarded stdin stdout stderr result|10 true false'\n    },\n    contains: [ {\n        className: 'decorator', // Actually pragma\n        begin: /{\\./,\n        end: /\\.}/,\n        relevance: 10\n      }, {\n        className: 'string',\n        begin: /[a-zA-Z]\\w*\"/,\n        end: /\"/,\n        contains: [{begin: /\"\"/}]\n      }, {\n        className: 'string',\n        begin: /([a-zA-Z]\\w*)?\"\"\"/,\n        end: /\"\"\"/\n      }, {\n        className: 'string',\n        begin: /\"/,\n        end: /\"/,\n        illegal: /\\n/,\n        contains: [{begin: /\\\\./}]\n      }, {\n        className: 'type',\n        begin: /\\b[A-Z]\\w+\\b/,\n        relevance: 0\n      }, {\n        className: 'type',\n        begin: /\\b(int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|float|float32|float64|bool|char|string|cstring|pointer|expr|stmt|void|auto|any|range|array|openarray|varargs|seq|set|clong|culong|cchar|cschar|cshort|cint|csize|clonglong|cfloat|cdouble|clongdouble|cuchar|cushort|cuint|culonglong|cstringarray|semistatic)\\b/\n      }, {\n        className: 'number',\n        begin: /\\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(\\d[_\\d]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      },\n      hljs.HASH_COMMENT_MODE\n    ]\n  }\n}"
  },
  {
    "path": "ppt/js/highlight/languages/nix.js",
    "content": "/*\nLanguage: Nix\nAuthor: Domen Kožar <domen@dev.si>\nDescription: Nix functional language. See http://nixos.org/nix\n*/\n\n\nfunction(hljs) {\n  var NIX_KEYWORDS = {\n    keyword: 'rec with let in inherit assert if else then',\n    constant: 'true false or and null',\n    built_in:\n      'import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation'\n  };\n  var ANTIQUOTE = {\n    className: 'subst',\n    begin: /\\$\\{/,\n    end: /\\}/,\n    keywords: NIX_KEYWORDS\n  };\n  var ATTRS = {\n    className: 'variable',\n    // TODO: we have to figure out a way how to exclude \\s*=\n    begin: /[a-zA-Z0-9-_]+(\\s*=)/\n  };\n  var SINGLE_QUOTE = {\n    className: 'string',\n    begin: \"''\",\n    end: \"''\",\n    contains: [\n      ANTIQUOTE\n    ]\n  };\n  var DOUBLE_QUOTE = {\n    className: 'string',\n    begin: '\"',\n    end: '\"',\n    contains: [\n      ANTIQUOTE\n    ]\n  };\n  var EXPRESSIONS = [\n    hljs.NUMBER_MODE,\n    hljs.HASH_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    SINGLE_QUOTE,\n    DOUBLE_QUOTE,\n    ATTRS\n  ];  \n  ANTIQUOTE.contains = EXPRESSIONS;\n  return {\n    aliases: [\"nixos\"],\n    keywords: NIX_KEYWORDS,\n    contains: EXPRESSIONS\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/nsis.js",
    "content": "/*\nLanguage: NSIS\nDescription: Nullsoft Scriptable Install System\nAuthor: Jan T. Sott <jan.sott@gmail.com>\nWebsite: http://github.com/idleberg\n*/\n\nfunction(hljs) {\n  var CONSTANTS = {\n    className: 'symbol',\n    begin: '\\\\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)'\n  };\n\n  var DEFINES = {\n    // ${defines}\n    className: 'constant',\n    begin: '\\\\$+{[a-zA-Z0-9_]+}'\n  };\n\n  var VARIABLES = {\n    // $variables\n    className: 'variable',\n    begin: '\\\\$+[a-zA-Z0-9_]+',\n    illegal: '\\\\(\\\\){}'\n  };\n\n  var LANGUAGES = {\n    // $(language_strings)\n    className: 'constant',\n    begin: '\\\\$+\\\\([a-zA-Z0-9_]+\\\\)'\n  };\n\n  var PARAMETERS = {\n    // command parameters\n    className: 'params',\n    begin: '(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)'\n  };\n\n  var COMPILER ={\n    // !compiler_flags\n    className: 'constant',\n    begin: '\\\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)'\n  };\n\n  return {\n    case_insensitive: false,\n    keywords: {\n      keyword:\n      'Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetPluginUnload SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption SubSectionEnd Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle',\n      literal:\n      'admin all auto both colored current false force hide highest lastused leave listonly none normal notset off on open print show silent silentlog smooth textonly true user '\n    },\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"', end: '\"',\n        illegal: '\\\\n',\n        contains: [\n          { // $\\n, $\\r, $\\t, $$\n            className: 'symbol',\n            begin: '\\\\$(\\\\\\\\(n|r|t)|\\\\$)'\n          },\n          CONSTANTS,\n          DEFINES,\n          VARIABLES,\n          LANGUAGES\n        ]\n      },\n      { // line comments\n        className: 'comment',\n        begin: ';', end: '$',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'Function PageEx Section SectionGroup SubSection', end: '$'\n      },\n      COMPILER,\n      DEFINES,\n      VARIABLES,\n      LANGUAGES,\n      PARAMETERS,\n      hljs.NUMBER_MODE,\n      { // plug::ins\n        className: 'literal',\n        begin: hljs.IDENT_RE + '::' + hljs.IDENT_RE\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/objectivec.js",
    "content": "/*\nLanguage: Objective C\nAuthor: Valerii Hiora <valerii.hiora@gmail.com>\nContributors: Angel G. Olloqui <angelgarcia.mail@gmail.com>\n*/\n\nfunction(hljs) {\n  var OBJC_KEYWORDS = {\n    keyword:\n      'int float while char export sizeof typedef const struct for union ' +\n      'unsigned long volatile static bool mutable if do return goto void ' +\n      'enum else break extern asm case short default double register explicit ' +\n      'signed typename this switch continue wchar_t inline readonly assign ' +\n      'readwrite self @synchronized id typeof ' +\n      'nonatomic super unichar IBOutlet IBAction strong weak copy ' +\n      'in out inout bycopy byref oneway __strong __weak __block __autoreleasing ' +\n      '@private @protected @public @try @property @end @throw @catch @finally ' +\n      '@autoreleasepool @synthesize @dynamic @selector @optional @required',\n    literal:\n    \t'false true FALSE TRUE nil YES NO NULL',\n    built_in:\n      'NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView ' +\n      'NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet ' +\n      'UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread ' +\n      'UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool ' +\n      'UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray ' +\n      'NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController ' +\n      'UINavigationBar UINavigationController UITabBarController UIPopoverController ' +\n      'UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController ' +\n      'NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor ' +\n      'UIFont UIApplication NSNotFound NSNotificationCenter NSNotification ' +\n      'UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar ' +\n      'NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection ' +\n      'UIInterfaceOrientation MPMoviePlayerController dispatch_once_t ' +\n      'dispatch_queue_t dispatch_sync dispatch_async dispatch_once'\n  };\n  var LEXEMES = /[a-zA-Z@][a-zA-Z0-9_]*/;\n  var CLASS_KEYWORDS = '@interface @class @protocol @implementation';\n  return {\n    aliases: ['m', 'mm', 'objc', 'obj-c'],\n    keywords: OBJC_KEYWORDS, lexemes: LEXEMES,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        variants: [\n          {\n            begin: '@\"', end: '\"',\n            illegal: '\\\\n',\n            contains: [hljs.BACKSLASH_ESCAPE]\n          },\n          {\n            begin: '\\'', end: '[^\\\\\\\\]\\'',\n            illegal: '[^\\\\\\\\][^\\']'\n          }\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#',\n        end: '$',\n        contains: [\n          {\n            className: 'title',\n            variants: [\n              { begin: '\\\"', end: '\\\"' },\n              { begin: '<', end: '>' }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        begin: '(' + CLASS_KEYWORDS.split(' ').join('|') + ')\\\\b', end: '({|$)', excludeEnd: true,\n        keywords: CLASS_KEYWORDS, lexemes: LEXEMES,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'variable',\n        begin: '\\\\.'+hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/ocaml.js",
    "content": "/*\nLanguage: OCaml\nAuthor: Mehdi Dogguy <mehdi@dogguy.org>\nContributors: Nicolas Braud-Santoni <nicolas.braud-santoni@ens-cachan.fr>\nDescription: OCaml language definition.\n*/\nfunction(hljs) {\n  return {\n    aliases: ['ml'],\n    keywords: {\n      keyword:\n        'and as assert asr begin class constraint do done downto else end ' +\n        'exception external false for fun function functor if in include ' +\n        'inherit initializer land lazy let lor lsl lsr lxor match method ' +\n        'mod module mutable new object of open or private rec ref sig struct ' +\n        'then to true try type val virtual when while with parser value',\n      built_in:\n        'bool char float int list unit array exn option int32 int64 nativeint ' +\n        'format4 format6 lazy_t in_channel out_channel string'\n    },\n    illegal: /\\/\\//,\n    contains: [\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n        contains: ['self']\n      },\n      {\n        className: 'class',\n        beginKeywords: 'type', end: '\\\\(|=|$', excludeEnd: true,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'annotation',\n        begin: '\\\\[<', end: '>\\\\]'\n      },\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      hljs.C_NUMBER_MODE\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/oxygene.js",
    "content": "/*\nLanguage: Oxygene\nAuthor: Carlo Kok <ck@remobjects.com>\nDescription: Language definition for RemObjects Oxygene (http://www.remobjects.com)\n*/\n\nfunction(hljs) {\n  var OXYGENE_KEYWORDS = 'abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue '+\n    'create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false '+\n    'final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited '+\n    'inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of '+\n    'old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly '+\n    'record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple '+\n    'type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal '+\n    'register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained';\n  var CURLY_COMMENT =  {\n    className: 'comment',\n    begin: '{', end: '}',\n    relevance: 0\n  };\n  var PAREN_COMMENT = {\n    className: 'comment',\n    begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n    relevance: 10\n  };\n  var STRING = {\n    className: 'string',\n    begin: '\\'', end: '\\'',\n    contains: [{begin: '\\'\\''}]\n  };\n  var CHAR_STRING = {\n    className: 'string', begin: '(#\\\\d+)+'\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'function constructor destructor procedure method', end: '[:;]',\n    keywords: 'function constructor|10 destructor|10 procedure|10 method|10',\n    contains: [\n      hljs.TITLE_MODE,\n      {\n        className: 'params',\n        begin: '\\\\(', end: '\\\\)',\n        keywords: OXYGENE_KEYWORDS,\n        contains: [STRING, CHAR_STRING]\n      },\n      CURLY_COMMENT, PAREN_COMMENT\n    ]\n  };\n  return {\n    case_insensitive: true,\n    keywords: OXYGENE_KEYWORDS,\n    illegal: '(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',\n    contains: [\n      CURLY_COMMENT, PAREN_COMMENT, hljs.C_LINE_COMMENT_MODE,\n      STRING, CHAR_STRING,\n      hljs.NUMBER_MODE,\n      FUNCTION,\n      {\n        className: 'class',\n        begin: '=\\\\bclass\\\\b', end: 'end;',\n        keywords: OXYGENE_KEYWORDS,\n        contains: [\n          STRING, CHAR_STRING,\n          CURLY_COMMENT, PAREN_COMMENT, hljs.C_LINE_COMMENT_MODE,\n          FUNCTION\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/parser3.js",
    "content": "/*\nLanguage: Parser3\nRequires: xml.js\nAuthor: Oleg Volchkov <oleg@volchkov.net>\n*/\n\nfunction(hljs) {\n  return {\n    subLanguage: 'xml', relevance: 0,\n    contains: [\n      {\n        className: 'comment',\n        begin: '^#', end: '$'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\^rem{', end: '}',\n        relevance: 10,\n        contains: [\n          {\n            begin: '{', end: '}',\n            contains: ['self']\n          }\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '^@(?:BASE|USE|CLASS|OPTIONS)$',\n        relevance: 10\n      },\n      {\n        className: 'title',\n        begin: '@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$'\n      },\n      {\n        className: 'variable',\n        begin: '\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?'\n      },\n      {\n        className: 'keyword',\n        begin: '\\\\^[\\\\w\\\\-\\\\.\\\\:]+'\n      },\n      {\n        className: 'number',\n        begin: '\\\\^#[0-9a-fA-F]+'\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/perl.js",
    "content": "/*\nLanguage: Perl\nAuthor: Peter Leonov <gojpeg@yandex.ru>\n*/\n\nfunction(hljs) {\n  var PERL_KEYWORDS = 'getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ' +\n    'ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime ' +\n    'readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq' +\n    'fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent ' +\n    'shutdown dump chomp connect getsockname die socketpair close flock exists index shmget' +\n    'sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr ' +\n    'unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 ' +\n    'getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline ' +\n    'endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand ' +\n    'mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink ' +\n    'getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr ' +\n    'untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link ' +\n    'getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller ' +\n    'lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and ' +\n    'sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 ' +\n    'chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach ' +\n    'tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir' +\n    'ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe ' +\n    'atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when';\n  var SUBST = {\n    className: 'subst',\n    begin: '[$@]\\\\{', end: '\\\\}',\n    keywords: PERL_KEYWORDS\n  };\n  var METHOD = {\n    begin: '->{', end: '}'\n    // contains defined later\n  };\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$\\d/},\n      {begin: /[\\$\\%\\@](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},\n      {begin: /[\\$\\%\\@][^\\s\\w{]/, relevance: 0}\n    ]\n  };\n  var COMMENT = {\n    className: 'comment',\n    begin: '^(__END__|__DATA__)', end: '\\\\n$',\n    relevance: 5\n  };\n  var STRING_CONTAINS = [hljs.BACKSLASH_ESCAPE, SUBST, VAR];\n  var PERL_DEFAULT_CONTAINS = [\n    VAR,\n    hljs.HASH_COMMENT_MODE,\n    COMMENT,\n    {\n      className: 'comment',\n      begin: '^\\\\=\\\\w', end: '\\\\=cut', endsWithParent: true\n    },\n    METHOD,\n    {\n      className: 'string',\n      contains: STRING_CONTAINS,\n      variants: [\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\(', end: '\\\\)',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\[', end: '\\\\]',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\{', end: '\\\\}',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\|', end: '\\\\|',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\<', end: '\\\\>',\n          relevance: 5\n        },\n        {\n          begin: 'qw\\\\s+q', end: 'q',\n          relevance: 5\n        },\n        {\n          begin: '\\'', end: '\\'',\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: '\"', end: '\"'\n        },\n        {\n          begin: '`', end: '`',\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: '{\\\\w+}',\n          contains: [],\n          relevance: 0\n        },\n        {\n          begin: '\\-?\\\\w+\\\\s*\\\\=\\\\>',\n          contains: [],\n          relevance: 0\n        }\n      ]\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    { // regexp container\n      begin: '(\\\\/\\\\/|' + hljs.RE_STARTERS_RE + '|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*',\n      keywords: 'split return print reverse grep',\n      relevance: 0,\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        COMMENT,\n        {\n          className: 'regexp',\n          begin: '(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*',\n          relevance: 10\n        },\n        {\n          className: 'regexp',\n          begin: '(m|qr)?/', end: '/[a-z]*',\n          contains: [hljs.BACKSLASH_ESCAPE],\n          relevance: 0 // allows empty \"//\" which is a common comment delimiter in other languages\n        }\n      ]\n    },\n    {\n      className: 'sub',\n      beginKeywords: 'sub', end: '(\\\\s*\\\\(.*?\\\\))?[;{]',\n      relevance: 5\n    },\n    {\n      className: 'operator',\n      begin: '-\\\\w\\\\b',\n      relevance: 0\n    }\n  ];\n  SUBST.contains = PERL_DEFAULT_CONTAINS;\n  METHOD.contains = PERL_DEFAULT_CONTAINS;\n\n  return {\n    aliases: ['pl'],\n    keywords: PERL_KEYWORDS,\n    contains: PERL_DEFAULT_CONTAINS\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/php.js",
    "content": "/*\nLanguage: PHP\nAuthor: Victor Karamzin <Victor.Karamzin@enterra-inc.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable', begin: '(\\\\$|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*'\n  };\n  var PREPROCESSOR = {\n    className: 'preprocessor', begin: /<\\?(php)?|\\?>/\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, PREPROCESSOR],\n    variants: [\n      {\n        begin: 'b\"', end: '\"'\n      },\n      {\n        begin: 'b\\'', end: '\\''\n      },\n      hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null})\n    ]\n  };\n  var NUMBER = {variants: [hljs.BINARY_NUMBER_MODE, hljs.C_NUMBER_MODE]};\n  return {\n    aliases: ['php3', 'php4', 'php5', 'php6'],\n    case_insensitive: true,\n    keywords:\n      'and include_once list abstract global private echo interface as static endswitch ' +\n      'array null if endwhile or const for endforeach self var while isset public ' +\n      'protected exit foreach throw elseif include __FILE__ empty require_once do xor ' +\n      'return parent clone use __CLASS__ __LINE__ else break print eval new ' +\n      'catch __METHOD__ case exception default die require __FUNCTION__ ' +\n      'enddeclare final try switch continue endfor endif declare unset true false ' +\n      'trait goto instanceof insteadof __DIR__ __NAMESPACE__ ' +\n      'yield finally',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'comment',\n        begin: '/\\\\*', end: '\\\\*/',\n        contains: [\n          {\n            className: 'phpdoc',\n            begin: '\\\\s@[A-Za-z]+'\n          },\n          PREPROCESSOR\n        ]\n      },\n      {\n          className: 'comment',\n          begin: '__halt_compiler.+?;', endsWithParent: true,\n          keywords: '__halt_compiler', lexemes: hljs.UNDERSCORE_IDENT_RE\n      },\n      {\n        className: 'string',\n        begin: '<<<[\\'\"]?\\\\w+[\\'\"]?$', end: '^\\\\w+;',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      PREPROCESSOR,\n      VARIABLE,\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /[;{]/, excludeEnd: true,\n        illegal: '\\\\$|\\\\[|%',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              'self',\n              VARIABLE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRING,\n              NUMBER\n            ]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        illegal: /[:\\(\\$\"]/,\n        contains: [\n          {\n            beginKeywords: 'extends implements',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        beginKeywords: 'namespace', end: ';',\n        illegal: /[\\.']/,\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        beginKeywords: 'use', end: ';',\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        begin: '=>' // No markup, just a relevance booster\n      },\n      STRING,\n      NUMBER\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/profile.js",
    "content": "/*\nLanguage: Python profile\nDescription: Python profiler results\nAuthor: Brian Beck <exogen@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    contains: [\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'built_in',\n        begin: '{', end: '}$',\n        excludeBegin: true, excludeEnd: true,\n        contains: [hljs.APOS_STRING_MODE, hljs.QUOTE_STRING_MODE],\n        relevance: 0\n      },\n      {\n        className: 'filename',\n        begin: '[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}', end: ':',\n        excludeEnd: true\n      },\n      {\n        className: 'header',\n        begin: '(ncalls|tottime|cumtime)', end: '$',\n        keywords: 'ncalls tottime|10 cumtime|10 filename',\n        relevance: 10\n      },\n      {\n        className: 'summary',\n        begin: 'function calls', end: '$',\n        contains: [hljs.C_NUMBER_MODE],\n        relevance: 10\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'function',\n        begin: '\\\\(', end: '\\\\)$',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ],\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/protobuf.js",
    "content": "/*\nLanguage: Protocol Buffers\nAuthor: Dan Tao <daniel.tao@gmail.com>\nDescription: Protocol buffer message definition format\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword: 'package import option optional required repeated group',\n      built_in: 'double float int32 int64 uint32 uint64 sint32 sint64 ' +\n        'fixed32 fixed64 sfixed32 sfixed64 bool string bytes',\n      literal: 'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'message enum service', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'function',\n        beginKeywords: 'rpc',\n        end: /;/, excludeEnd: true,\n        keywords: 'rpc returns'\n      },\n      {\n        className: 'constant',\n        begin: /^\\s*[A-Z_]+/,\n        end: /\\s*=/, excludeEnd: true\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/python.js",
    "content": "/*\nLanguage: Python\n*/\n\nfunction(hljs) {\n  var PROMPT = {\n    className: 'prompt',  begin: /^(>>>|\\.\\.\\.) /\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE],\n    variants: [\n      {\n        begin: /(u|b)?r?'''/, end: /'''/,\n        contains: [PROMPT],\n        relevance: 10\n      },\n      {\n        begin: /(u|b)?r?\"\"\"/, end: /\"\"\"/,\n        contains: [PROMPT],\n        relevance: 10\n      },\n      {\n        begin: /(u|r|ur)'/, end: /'/,\n        relevance: 10\n      },\n      {\n        begin: /(u|r|ur)\"/, end: /\"/,\n        relevance: 10\n      },\n      {\n        begin: /(b|br)'/, end: /'/\n      },\n      {\n        begin: /(b|br)\"/, end: /\"/\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n  var NUMBER = {\n    className: 'number', relevance: 0,\n    variants: [\n      {begin: hljs.BINARY_NUMBER_RE + '[lLjJ]?'},\n      {begin: '\\\\b(0o[0-7]+)[lLjJ]?'},\n      {begin: hljs.C_NUMBER_RE + '[lLjJ]?'}\n    ]\n  };\n  var PARAMS = {\n    className: 'params',\n    begin: /\\(/, end: /\\)/,\n    contains: ['self', PROMPT, NUMBER, STRING]\n  };\n  var FUNC_CLASS_PROTO = {\n    end: /:/,\n    illegal: /[${=;\\n]/,\n    contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]\n  };\n\n  return {\n    aliases: ['py', 'gyp'],\n    keywords: {\n      keyword:\n        'and elif is global as in if from raise for except finally print import pass return ' +\n        'exec else break not with class assert yield try while continue del or def lambda ' +\n        'nonlocal|10 None True False',\n      built_in:\n        'Ellipsis NotImplemented'\n    },\n    illegal: /(<\\/|->|\\?)/,\n    contains: [\n      PROMPT,\n      NUMBER,\n      STRING,\n      hljs.HASH_COMMENT_MODE,\n      hljs.inherit(FUNC_CLASS_PROTO, {className: 'function', beginKeywords: 'def', relevance: 10}),\n      hljs.inherit(FUNC_CLASS_PROTO, {className: 'class', beginKeywords: 'class'}),\n      {\n        className: 'decorator',\n        begin: /@/, end: /$/\n      },\n      {\n        begin: /\\b(print|exec)\\(/ // don’t highlight keywords-turned-functions in Python 3\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/r.js",
    "content": "/*\nLanguage: R\nAuthor: Joe Cheng <joe@rstudio.org>\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*';\n\n  return {\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: IDENT_RE,\n        lexemes: IDENT_RE,\n        keywords: {\n          keyword:\n            'function if in break next repeat else for return switch while try tryCatch|10 ' +\n            'stop warning require library attach detach source setMethod setGeneric ' +\n            'setGroupGeneric setClass ...|10',\n          literal:\n            'NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 ' +\n            'NA_complex_|10'\n        },\n        relevance: 0\n      },\n      {\n        // hex value\n        className: 'number',\n        begin: \"0[xX][0-9a-fA-F]+[Li]?\\\\b\",\n        relevance: 0\n      },\n      {\n        // explicit integer\n        className: 'number',\n        begin: \"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",\n        relevance: 0\n      },\n      {\n        // number with trailing decimal\n        className: 'number',\n        begin: \"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",\n        relevance: 0\n      },\n      {\n        // number\n        className: 'number',\n        begin: \"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",\n        relevance: 0\n      },\n      {\n        // number with leading decimal\n        className: 'number',\n        begin: \"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",\n        relevance: 0\n      },\n\n      {\n        // escaped identifier\n        begin: '`',\n        end: '`',\n        relevance: 0\n      },\n\n      {\n        className: 'string',\n        contains: [hljs.BACKSLASH_ESCAPE],\n        variants: [\n          {begin: '\"', end: '\"'},\n          {begin: \"'\", end: \"'\"}\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/rib.js",
    "content": "/*\nLanguage: RenderMan RIB\nAuthor: Konstantin Evdokimenko <qewerty@gmail.com>\nContributors: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords:\n      'ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis ' +\n      'Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone ' +\n      'CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail ' +\n      'DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format ' +\n      'FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry ' +\n      'Hider Hyperboloid Identity Illuminate Imager Interior LightSource ' +\n      'MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte ' +\n      'MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option ' +\n      'Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples ' +\n      'PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection ' +\n      'Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ' +\n      'ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere ' +\n      'SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd ' +\n      'TransformPoints Translate TrimCurve WorldBegin WorldEnd',\n    illegal: '</',\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/rsl.js",
    "content": "/*\nLanguage: RenderMan RSL\nAuthor: Konstantin Evdokimenko <qewerty@gmail.com>\nContributors: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        'float color point normal vector matrix while for if do return else break extern continue',\n      built_in:\n        'abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise ' +\n        'clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp ' +\n        'faceforward filterstep floor format fresnel incident length lightsource log match ' +\n        'max min mod noise normalize ntransform opposite option phong pnoise pow printf ' +\n        'ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp ' +\n        'setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan ' +\n        'texture textureinfo trace transform vtransform xcomp ycomp zcomp'\n    },\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      },\n      {\n        className: 'shader',\n        beginKeywords: 'surface displacement light volume imager', end: '\\\\('\n      },\n      {\n        className: 'shading',\n        beginKeywords: 'illuminate illuminance gather', end: '\\\\('\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/ruby.js",
    "content": "/*\nLanguage: Ruby\nAuthor: Anton Kovalyov <anton@kovalyov.net>\nContributors: Peter Leonov <gojpeg@yandex.ru>, Vasily Polovnyov <vast@whiteants.net>, Loren Segal <lsegal@soen.ca>, Pascal Hurni <phi@ruby-reactive.org>\n*/\n\nfunction(hljs) {\n  var RUBY_METHOD_RE = '[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?';\n  var RUBY_KEYWORDS =\n    'and false then defined module in return redo if BEGIN retry end for true self when ' +\n    'next until do begin unless END rescue nil else break undef not super class case ' +\n    'require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor';\n  var YARDOCTAG = {\n    className: 'yardoctag',\n    begin: '@[A-Za-z]+'\n  };\n  var IRB_OBJECT = {\n    className: 'value',\n    begin: '#<', end: '>'\n  };\n  var COMMENT = {\n    className: 'comment',\n    variants: [\n      {\n        begin: '#', end: '$',\n        contains: [YARDOCTAG]\n      },\n      {\n        begin: '^\\\\=begin', end: '^\\\\=end',\n        contains: [YARDOCTAG],\n        relevance: 10\n      },\n      {\n        begin: '^__END__', end: '\\\\n$'\n      }\n    ]\n  };\n  var SUBST = {\n    className: 'subst',\n    begin: '#\\\\{', end: '}',\n    keywords: RUBY_KEYWORDS\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n    variants: [\n      {begin: /'/, end: /'/},\n      {begin: /\"/, end: /\"/},\n      {begin: '%[qw]?\\\\(', end: '\\\\)'},\n      {begin: '%[qw]?\\\\[', end: '\\\\]'},\n      {begin: '%[qw]?{', end: '}'},\n      {begin: '%[qw]?<', end: '>'},\n      {begin: '%[qw]?/', end: '/'},\n      {begin: '%[qw]?%', end: '%'},\n      {begin: '%[qw]?-', end: '-'},\n      {begin: '%[qw]?\\\\|', end: '\\\\|'},\n      {\n        // \\B in the beginning suppresses recognition of ?-sequences where ?\n        // is the last character of a preceding identifier, as in: `func?4`\n        begin: /\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/\n      }\n    ]\n  };\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    keywords: RUBY_KEYWORDS\n  };\n\n  var RUBY_DEFAULT_CONTAINS = [\n    STRING,\n    IRB_OBJECT,\n    COMMENT,\n    {\n      className: 'class',\n      beginKeywords: 'class module', end: '$|;',\n      illegal: /=/,\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: '[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?'}),\n        {\n          className: 'inheritance',\n          begin: '<\\\\s*',\n          contains: [{\n            className: 'parent',\n            begin: '(' + hljs.IDENT_RE + '::)?' + hljs.IDENT_RE\n          }]\n        },\n        COMMENT\n      ]\n    },\n    {\n      className: 'function',\n      beginKeywords: 'def', end: ' |$|;',\n      relevance: 0,\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: RUBY_METHOD_RE}),\n        PARAMS,\n        COMMENT\n      ]\n    },\n    {\n      className: 'constant',\n      begin: '(::)?(\\\\b[A-Z]\\\\w*(::)?)+',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':',\n      contains: [STRING, {begin: RUBY_METHOD_RE}],\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: hljs.UNDERSCORE_IDENT_RE + '(\\\\!|\\\\?)?:',\n      relevance: 0\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    {\n      className: 'variable',\n      begin: '(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))'\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + ')\\\\s*',\n      contains: [\n        IRB_OBJECT,\n        COMMENT,\n        {\n          className: 'regexp',\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n          illegal: /\\n/,\n          variants: [\n            {begin: '/', end: '/[a-z]*'},\n            {begin: '%r{', end: '}[a-z]*'},\n            {begin: '%r\\\\(', end: '\\\\)[a-z]*'},\n            {begin: '%r!', end: '![a-z]*'},\n            {begin: '%r\\\\[', end: '\\\\][a-z]*'}\n          ]\n        }\n      ],\n      relevance: 0\n    }\n  ];\n  SUBST.contains = RUBY_DEFAULT_CONTAINS;\n  PARAMS.contains = RUBY_DEFAULT_CONTAINS;\n  \n  var IRB_DEFAULT = [\n    {\n      relevance: 1,\n      className: 'output',\n      begin: '^\\\\s*=> ', end: \"$\",\n      returnBegin: true,\n      contains: [\n        {\n          className: 'status',\n          begin: '^\\\\s*=>'\n        },\n        {\n          begin: ' ', end: '$',\n          contains: RUBY_DEFAULT_CONTAINS\n        }\n      ]\n    },\n    {\n      relevance: 1,\n      className: 'input',\n      begin: '^[^ ][^=>]*>+ ', end: \"$\",\n      returnBegin: true,\n      contains: [\n        {\n          className: 'prompt',\n          begin: '^[^ ][^=>]*>+'\n        },\n        {\n          begin: ' ', end: '$',\n          contains: RUBY_DEFAULT_CONTAINS\n        }\n      ]\n    }\n  ];\n\n  return {\n    aliases: ['rb', 'gemspec', 'podspec', 'thor', 'irb'],\n    keywords: RUBY_KEYWORDS,\n    contains: IRB_DEFAULT.concat(RUBY_DEFAULT_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/ruleslanguage.js",
    "content": "/*\nLanguage: Oracle Rules Language\nAuthor: Jason Jacobson <jason.a.jacobson@gmail.com>\nDescription: The Oracle Utilities Rules Language is used to program the Oracle Utilities Applications acquired from LODESTAR Corporation.  The products include Billing Component, LPSS, Pricing Component etc. through version 1.6.1.\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n       keyword: 'BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE ' +\n         'INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 ' +\n         'INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 ' +\n         'INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 ' +\n         'INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 ' +\n         'INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 ' +\n         'INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 ' +\n         'INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 ' +\n         'INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 ' +\n         'INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 ' +\n         'INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 ' +\n         'INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 ' +\n         'INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 ' +\n         'INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 ' +\n         'INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 ' +\n         'MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER ' +\n         'OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE ' +\n         'NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH ' +\n         'IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND ' +\n         'UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ' +\n         'ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE ' +\n         'GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE ' +\n         'SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING ' +\n         'DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF ' +\n         'MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY ' +\n         'YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE ' +\n         'COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR ' +\n         'READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ' +\n         'ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE ' +\n         'EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE ' +\n         'SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL ' +\n         'COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN ' +\n         'MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING ' +\n         'FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ' +\n         'NUMDAYS READ_DATE STAGING',\n       built_in: 'IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML ' +\n         'DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT ' +\n         'DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE ' +\n         'DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT ' +\n         'DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME'\n    },\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      { className: 'array',\n        begin: '\\#[a-zA-Z\\ \\.]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/rust.js",
    "content": "/*\nLanguage: Rust\nAuthor: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>\nContributors: Roman Shmatov <romanshmatov@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['rs'],\n    keywords:\n      'alignof as be box break const continue crate do else enum extern ' +\n      'false fn for if impl in let loop match mod mut offsetof once priv ' +\n      'proc pub pure ref return self sizeof static struct super trait true ' +\n      'type typeof unsafe unsized use virtual while yield ' +\n      'int i8 i16 i32 i64 ' +\n      'uint u8 u32 u64 ' +\n      'float f32 f64 ' +\n      'str char bool',\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      {\n        className: 'string',\n        begin: /r(#*)\".*?\"\\1(?!#)/\n      },\n      {\n        className: 'string',\n        begin: /'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/\n      },\n      {\n        begin: /'[a-zA-Z_][a-zA-Z0-9_]*/\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'fn', end: '(\\\\(|<)', excludeEnd: true,\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#\\\\[', end: '\\\\]'\n      },\n      {\n        beginKeywords: 'type', end: '(=|<)',\n        contains: [hljs.UNDERSCORE_TITLE_MODE],\n        illegal: '\\\\S'\n      },\n      {\n        beginKeywords: 'trait enum', end: '({|<)',\n        contains: [hljs.UNDERSCORE_TITLE_MODE],\n        illegal: '\\\\S'\n      },\n      {\n        begin: hljs.IDENT_RE + '::'\n      },\n      {\n        begin: '->'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/scala.js",
    "content": "/*\nLanguage: Scala\nAuthor: Jan Berkel <jan.berkel@gmail.com>\n*/\n\nfunction(hljs) {\n  var ANNOTATION = {\n    className: 'annotation', begin: '@[A-Za-z]+'\n  };\n  var STRING = {\n    className: 'string',\n    begin: 'u?r?\"\"\"', end: '\"\"\"',\n    relevance: 10\n  };\n  var SYMBOL = {\n    className: 'symbol',\n    begin: '\\'\\\\w[\\\\w\\\\d_]*(?!\\')'\n  };\n  return {\n    keywords:\n      'type yield lazy override def with val var false true sealed abstract private trait ' +\n      'object null if for while throw finally protected extends import final return else ' +\n      'break new catch super class case package default try this match continue throws',\n    contains: [\n      {\n        className: 'javadoc',\n        begin: '/\\\\*\\\\*', end: '\\\\*/',\n        contains: [{\n          className: 'javadoctag',\n          begin: '@[A-Za-z]+'\n        }],\n        relevance: 10\n      },\n      hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE,\n      STRING, hljs.QUOTE_STRING_MODE,\n      SYMBOL,\n      {\n        className: 'class',\n        begin: '((case )?class |object |trait )', // beginKeywords won't work because a single \"case\" shouldn't start this mode\n        end: '({|$)', excludeEnd: true,\n        illegal: ':',\n        keywords: 'case class trait object',\n        contains: [\n          {\n            beginKeywords: 'extends with',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.QUOTE_STRING_MODE, STRING,\n              ANNOTATION\n            ]\n          }\n        ]\n      },\n      hljs.C_NUMBER_MODE,\n      ANNOTATION\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/scilab.js",
    "content": "/*\nLanguage: Scilab\nAuthor: Sylvestre Ledru <sylvestre.ledru@scilab-enterprises.com>\nOrigin: matlab.js\nDescription: Scilab is a port from Matlab\n*/\n\nfunction(hljs) {\n\n  var COMMON_CONTAINS = [\n    hljs.C_NUMBER_MODE,\n    {\n      className: 'string',\n      begin: '\\'|\\\"', end: '\\'|\\\"',\n      contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n    }\n  ];\n\n  return {\n    aliases: ['sci'],\n    keywords: {\n      keyword: 'abort break case clear catch continue do elseif else endfunction end for function'+\n        'global if pause return resume select try then while'+\n        '%f %F %t %T %pi %eps %inf %nan %e %i %z %s',\n      built_in: // Scilab has more than 2000 functions. Just list the most commons\n       'abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error'+\n       'exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty'+\n       'isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log'+\n       'max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real'+\n       'round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan'+\n       'type typename warning zeros matrix'\n    },\n    illegal: '(\"|#|/\\\\*|\\\\s+/\\\\w+)',\n    contains: [\n      {\n        className: 'function',\n        beginKeywords: 'function endfunction', end: '$',\n        keywords: 'function endfunction|10',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)'\n          }\n        ]\n      },\n      {\n        className: 'transposed_variable',\n        begin: '[a-zA-Z_][a-zA-Z_0-9]*(\\'+[\\\\.\\']*|[\\\\.\\']+)', end: '',\n        relevance: 0\n      },\n      {\n        className: 'matrix',\n        begin: '\\\\[', end: '\\\\]\\'*[\\\\.\\']*',\n        relevance: 0,\n        contains: COMMON_CONTAINS\n      },\n      {\n        className: 'comment',\n        begin: '//', end: '$'\n      }\n    ].concat(COMMON_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/scss.js",
    "content": "/*\nLanguage: SCSS\nAuthor: Kurt Emch <kurt@kurtemch.com>\n*/\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  var VARIABLE = {\n    className: 'variable',\n    begin: '(\\\\$' + IDENT_RE + ')\\\\b'\n  };\n  var FUNCTION = {\n    className: 'function',\n    begin: IDENT_RE + '\\\\(', \n    returnBegin: true,\n    excludeEnd: true,\n    end: '\\\\('\n  };\n  var HEXCOLOR = {\n    className: 'hexcolor', begin: '#[0-9A-Fa-f]+'\n  };\n  var DEF_INTERNALS = {\n    className: 'attribute',\n    begin: '[A-Z\\\\_\\\\.\\\\-]+', end: ':',\n    excludeEnd: true,\n    illegal: '[^\\\\s]',\n    starts: {\n      className: 'value',\n      endsWithParent: true, excludeEnd: true,\n      contains: [\n        FUNCTION,\n        HEXCOLOR,\n        hljs.CSS_NUMBER_MODE,\n        hljs.QUOTE_STRING_MODE,\n        hljs.APOS_STRING_MODE,\n        hljs.C_BLOCK_COMMENT_MODE,\n        {\n          className: 'important', begin: '!important'\n        }\n      ]\n    }\n  };\n  return {\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      FUNCTION,\n      {\n        className: 'id', begin: '\\\\#[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'class', begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'attr_selector',\n        begin: '\\\\[', end: '\\\\]',\n        illegal: '$'\n      },\n      {\n        className: 'tag', // begin: IDENT_RE, end: '[,|\\\\s]'\n        begin: '\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b',\n        relevance: 0\n      },\n      {\n        className: 'pseudo',\n        begin: ':(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)'\n      },\n      {\n        className: 'pseudo',\n        begin: '::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)'\n      },\n      VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b',\n        illegal: '[^\\\\s]'\n      },\n      {\n        className: 'value',\n        begin: '\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b'\n      },\n      {\n        className: 'value',\n        begin: ':', end: ';',\n        contains: [\n          FUNCTION,\n          VARIABLE,\n          HEXCOLOR,\n          hljs.CSS_NUMBER_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          {\n            className: 'important', begin: '!important'\n          }\n        ]\n      },\n      {\n        className: 'at_rule',\n        begin: '@', end: '[{;]',\n        keywords: 'mixin include extend for if else each while charset import debug media page content font-face namespace warn',\n        contains: [\n          FUNCTION,\n          VARIABLE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          HEXCOLOR,\n          hljs.CSS_NUMBER_MODE,\n          {\n            className: 'preprocessor',\n            begin: '\\\\s[A-Za-z0-9_.-]+',\n            relevance: 0\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/smalltalk.js",
    "content": "/*\nLanguage: Smalltalk\nAuthor: Vladimir Gubarkov <xonixx@gmail.com>\n*/\n\nfunction(hljs) {\n  var VAR_IDENT_RE = '[a-z][a-zA-Z0-9_]*';\n  var CHAR = {\n    className: 'char',\n    begin: '\\\\$.{1}'\n  };\n  var SYMBOL = {\n    className: 'symbol',\n    begin: '#' + hljs.UNDERSCORE_IDENT_RE\n  };\n  return {\n    aliases: ['st'],\n    keywords: 'self super nil true false thisContext', // only 6\n    contains: [\n      {\n        className: 'comment',\n        begin: '\"', end: '\"'\n      },\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'class',\n        begin: '\\\\b[A-Z][A-Za-z0-9_]*',\n        relevance: 0\n      },\n      {\n        className: 'method',\n        begin: VAR_IDENT_RE + ':',\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE,\n      SYMBOL,\n      CHAR,\n      {\n        className: 'localvars',\n        // This looks more complicated than needed to avoid combinatorial\n        // explosion under V8. It effectively means `| var1 var2 ... |` with\n        // whitespace adjacent to `|` being optional.\n        begin: '\\\\|[ ]*' + VAR_IDENT_RE + '([ ]+' + VAR_IDENT_RE + ')*[ ]*\\\\|',\n        returnBegin: true, end: /\\|/,\n        illegal: /\\S/,\n        contains: [{begin: '(\\\\|[ ]*)?' + VAR_IDENT_RE}]\n      },\n      {\n        className: 'array',\n        begin: '\\\\#\\\\(', end: '\\\\)',\n        contains: [\n          hljs.APOS_STRING_MODE,\n          CHAR,\n          hljs.C_NUMBER_MODE,\n          SYMBOL\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/sql.js",
    "content": "/*\n Language: SQL\n Contributors: Nikolay Lisienko <info@neor.ru>, Heiko August <post@auge8472.de>, Travis Odom <travis.a.odom@gmail.com>\n */\n\nfunction(hljs) {\n  var COMMENT_MODE = {\n    className: 'comment',\n    begin: '--', end: '$'\n  };\n  return {\n    case_insensitive: true,\n    illegal: /[<>]/,\n    contains: [\n      {\n        className: 'operator',\n        beginKeywords:\n          'begin end start commit rollback savepoint lock alter create drop rename call '+\n          'delete do handler insert load replace select truncate update set show pragma grant '+\n          'merge describe use explain help declare prepare execute deallocate savepoint release '+\n          'unlock purge reset change stop analyze cache flush optimize repair kill '+\n          'install uninstall checksum restore check backup',\n        end: /;/, endsWithParent: true,\n        keywords: {\n          keyword:\n            'abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter ' +\n            'analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup ' +\n            'before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by ' +\n            'cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length ' +\n            'character_length charindex charset check checksum checksum_agg choose close coalesce ' +\n            'coercibility collate collation collationproperty column columns columns_updated commit compress concat ' +\n            'concat_ws concurrent connect connection connection_id consistent constraint constraints continue ' +\n            'contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist ' +\n            'curdate current current_date current_time current_timestamp current_user cursor curtime data database ' +\n            'databases datalength date_add date_format date_sub dateadd datediff datefromparts datename ' +\n            'datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear ' +\n            'deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt ' +\n            'des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct ' +\n            'distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec ' +\n            'engine engines eomonth errors escape escaped event eventdata events except exception exec execute ' +\n            'exists exp explain export_set extended external extract fast fetch field fields find_in_set ' +\n            'first first_value floor flush for force foreign format found found_rows from from_base64 ' +\n            'from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant ' +\n            'grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help ' +\n            'hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore ' +\n            'iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner ' +\n            'innodb input insert install instr intersect into is is_free_lock is_ipv4 ' +\n            'is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill ' +\n            'language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level ' +\n            'like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile ' +\n            'logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max ' +\n            'md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names ' +\n            'national natural nchar next no no_write_to_binlog not now nullif nvarchar oct ' +\n            'octet_length of old_password on only open optimize option optionally or ord order outer outfile output ' +\n            'pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add ' +\n            'period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges ' +\n            'procedure procedure_analyze processlist profile profiles public publishingservername purge quarter ' +\n            'query quick quote quotename radians rand read references regexp relative relaylog release ' +\n            'release_lock rename repair repeat replace replicate reset restore restrict return returns reverse ' +\n            'revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll ' +\n            'sec_to_time second section select serializable server session session_user set sha sha1 sha2 share ' +\n            'show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex ' +\n            'sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache ' +\n            'sql_small_result sql_variant_property sqlstate sqrt square start starting status std ' +\n            'stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff ' +\n            'subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset ' +\n            'system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time ' +\n            'time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour ' +\n            'timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation ' +\n            'trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress ' +\n            'uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade ' +\n            'upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short ' +\n            'validate_password_strength value values var var_pop var_samp variables variance varp ' +\n            'version view warnings week weekday weekofyear weight_string when whenever where with work write xml ' +\n            'xor year yearweek zon',\n          literal:\n            'true false null',\n          built_in:\n            'array bigint binary bit blob boolean char character date dec decimal float int integer interval number ' +\n            'numeric real serial smallint varchar varying int8 serial8 text'\n        },\n        contains: [\n          {\n            className: 'string',\n            begin: '\\'', end: '\\'',\n            contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n          },\n          {\n            className: 'string',\n            begin: '\"', end: '\"',\n            contains: [hljs.BACKSLASH_ESCAPE, {begin: '\"\"'}]\n          },\n          {\n            className: 'string',\n            begin: '`', end: '`',\n            contains: [hljs.BACKSLASH_ESCAPE]\n          },\n          hljs.C_NUMBER_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          COMMENT_MODE\n        ]\n      },\n      hljs.C_BLOCK_COMMENT_MODE,\n      COMMENT_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/swift.js",
    "content": "/*\nLanguage: Swift\nAuthor: Chris Eidhof <chris@eidhof.nl>\n*/\n\n\nfunction(hljs) {\n  var SWIFT_KEYWORDS = {\n      keyword: 'class deinit enum extension func import init let protocol static ' +\n        'struct subscript typealias var break case continue default do ' +\n        'else fallthrough if in for return switch where while as dynamicType ' +\n        'is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ ' +\n        '__LINE__ associativity didSet get infix inout left mutating none ' +\n        'nonmutating operator override postfix precedence prefix right set '+\n        'unowned unowned safe unsafe weak willSet',\n      literal: 'true false nil',\n      built_in: 'abs advance alignof alignofValue assert bridgeFromObjectiveC ' +\n        'bridgeFromObjectiveCUnconditional bridgeToObjectiveC ' +\n        'bridgeToObjectiveCUnconditional c contains count countElements ' +\n        'countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump ' +\n        'encodeBitsAsWords enumerate equal false filter find getBridgedObjectiveCType ' +\n        'getVaList indices insertionSort isBridgedToObjectiveC ' +\n        'isBridgedVerbatimToObjectiveC isUniquelyReferenced join ' +\n        'lexicographicalCompare map max maxElement min minElement nil numericCast ' +\n        'partition posix print println quickSort reduce reflect reinterpretCast ' +\n        'reverse roundUpToAlignment sizeof sizeofValue sort split startsWith strideof ' +\n        'strideofValue swap swift toString transcode true underestimateCount ' +\n        'unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer ' +\n        'withUnsafePointerToObject withUnsafePointers withVaList'\n    };\n\n  var TYPE = {\n    className: 'type',\n    begin: '\\\\b[A-Z][\\\\w\\']*',\n    relevance: 0\n  };\n  var BLOCK_COMMENT = {\n    className: 'comment',\n    begin: '/\\\\*', end: '\\\\*/',\n    contains: [hljs.PHRASAL_WORDS_MODE, 'self']\n  };\n  var SUBST = {\n    className: 'subst',\n    begin: /\\\\\\(/, end: '\\\\)',\n    keywords: SWIFT_KEYWORDS,\n    contains: [] // assigned later\n  };\n  var NUMBERS = {\n      className: 'number',\n      begin: '\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b',\n      relevance: 0\n  };\n  var QUOTE_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, {\n    contains: [SUBST, hljs.BACKSLASH_ESCAPE]\n  });\n  SUBST.contains = [NUMBERS];\n\n  return {\n    keywords: SWIFT_KEYWORDS,\n    contains: [\n      QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      BLOCK_COMMENT,\n      TYPE,\n      NUMBERS,\n      {\n        className: 'func',\n        beginKeywords: 'func', excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            begin: /[A-Za-z$_][0-9A-Za-z$_]*/,\n            illegal: /\\(/\n          }),\n          {\n            className: 'generics',\n            begin: /\\</, end: /\\>/,\n            illegal: /\\>/\n          },\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"']/\n          }\n        ],\n        illegal: /\\[|%/\n      },\n      {\n        className: 'class',\n        keywords: 'struct protocol class extension enum',\n        begin: '(struct|protocol|class(?! (func|var))|extension|enum)', \n        end: '\\\\{',\n        excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/})\n        ]\n      },\n      {\n        className: 'preprocessor', // @attributes\n        begin: '(@assignment|@class_protocol|@exported|@final|@lazy|@noreturn|' +\n                  '@NSCopying|@NSManaged|@objc|@optional|@required|@auto_closure|' +\n                  '@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|' +\n                  '@infix|@prefix|@postfix)'\n      },\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/tex.js",
    "content": "/*\nLanguage: TeX\nAuthor: Vladimir Moskva <vladmos@gmail.com>\nWebsite: http://fulc.ru/\n*/\n\nfunction(hljs) {\n  var COMMAND1 = {\n    className: 'command',\n    begin: '\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]?'\n  };\n  var COMMAND2 = {\n    className: 'command',\n    begin: '\\\\\\\\[^a-zA-Zа-яА-я0-9]'\n  };\n  var SPECIAL = {\n    className: 'special',\n    begin: '[{}\\\\[\\\\]\\\\&#~]',\n    relevance: 0\n  };\n\n  return {\n    contains: [\n      { // parameter\n        begin: '\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?',\n        returnBegin: true,\n        contains: [\n          COMMAND1, COMMAND2,\n          {\n            className: 'number',\n            begin: ' *=', end: '-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?',\n            excludeBegin: true\n          }\n        ],\n        relevance: 10\n      },\n      COMMAND1, COMMAND2,\n      SPECIAL,\n      {\n        className: 'formula',\n        begin: '\\\\$\\\\$', end: '\\\\$\\\\$',\n        contains: [COMMAND1, COMMAND2, SPECIAL],\n        relevance: 0\n      },\n      {\n        className: 'formula',\n        begin: '\\\\$', end: '\\\\$',\n        contains: [COMMAND1, COMMAND2, SPECIAL],\n        relevance: 0\n      },\n      {\n        className: 'comment',\n        begin: '%', end: '$',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/thrift.js",
    "content": "/*\nLanguage: Thrift\nAuthor: Oleg Efimov <efimovov@gmail.com>\nDescription: Thrift message definition format\n*/\n\nfunction(hljs) {\n  var BUILT_IN_TYPES = 'bool byte i16 i32 i64 double string binary';\n  return {\n    keywords: {\n      keyword:\n        'namespace const typedef struct enum service exception void oneway set list map required optional',\n      built_in:\n        BUILT_IN_TYPES,\n      literal:\n        'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'struct enum service exception', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'stl_container',\n        begin: '\\\\b(set|list|map)\\\\s*<', end: '>',\n        keywords: BUILT_IN_TYPES,\n        contains: ['self']\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/typescript.js",
    "content": "/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nDescription: TypeScript is a strict superset of JavaScript\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['ts'],\n    keywords: {\n      keyword:\n        'in if for while finally var new function|0 do return void else break catch ' +\n        'instanceof with throw case default try this switch continue typeof delete ' +\n        'let yield const class public private get set super interface extends' +\n        'static constructor implements enum export import declare',\n      literal:\n        'true false null undefined NaN Infinity',\n      built_in:\n        'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +\n        'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +\n        'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +\n        'TypeError URIError Number Math Date String RegExp Array Float32Array ' +\n        'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +\n        'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +\n        'module console window document any number boolean string void',\n    },\n    contains: [\n      {\n        className: 'pi',\n        begin: /^\\s*('|\")use strict('|\")/,\n        relevance: 0\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        contains: [\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          hljs.REGEXP_MODE,\n          { // E4X\n            begin: /</, end: />;/,\n            relevance: 0,\n            subLanguage: 'xml'\n          }\n        ],\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /\\{/, excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/}),\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"'\\(]/\n          }\n        ],\n        illegal: /\\[|%/,\n        relevance: 0 // () => {} is more typical in TypeScript\n      },\n      {\n        className: 'constructor',\n        beginKeywords: 'constructor', end: /\\{/, excludeEnd: true,\n        relevance: 10\n      },\n      {\n        className: 'module',\n        beginKeywords: 'module', end: /\\{/, excludeEnd: true,\n      },\n      {\n        className: 'interface',\n        beginKeywords: 'interface', end: /\\{/, excludeEnd: true,\n      },\n      {\n        begin: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      },\n      {\n        begin: '\\\\.' + hljs.IDENT_RE, relevance: 0 // hack: prevents detection of keywords after dots\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/vala.js",
    "content": "/*\nLanguage: Vala\nAuthor: Antono Vasiljev <antono.vasiljev@gmail.com>\nDescription: Vala is a new programming language that aims to bring modern programming language features to GNOME developers without imposing any additional runtime requirements and without using a different ABI compared to applications and libraries written in C.\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        // Value types\n        'char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 ' +\n        'uint16 uint32 uint64 float double bool struct enum string void ' +\n        // Reference types\n        'weak unowned owned ' +\n        // Modifiers\n        'async signal static abstract interface override ' +\n        // Control Structures\n        'while do for foreach else switch case break default return try catch ' +\n        // Visibility\n        'public private protected internal ' +\n        // Other\n        'using new this get set const stdout stdin stderr var',\n      built_in:\n        'DBus GLib CCode Gee Object',\n      literal:\n        'false true null'\n    },\n    contains: [\n      {\n        className: 'class',\n        beginKeywords: 'class interface delegate namespace', end: '{', excludeEnd: true,\n        illegal: '[^,:\\\\n\\\\s\\\\.]',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"',\n        relevance: 5\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '^#', end: '$',\n        relevance: 2\n      },\n      {\n        className: 'constant',\n        begin: ' [A-Z_]+ ',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/vbnet.js",
    "content": "/*\nLanguage: VB.NET\nAuthor: Poren Chiang <ren.chiang@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['vb'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval ' + /* a-b */\n        'call case catch class compare const continue custom declare default delegate dim distinct do ' + /* c-d */\n        'each equals else elseif end enum erase error event exit explicit finally for friend from function ' + /* e-f */\n        'get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue ' + /* g-i */\n        'join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass ' + /* j-m */\n        'namespace narrowing new next not notinheritable notoverridable ' + /* n */\n        'of off on operator option optional or order orelse overloads overridable overrides ' + /* o */\n        'paramarray partial preserve private property protected public ' + /* p */\n        'raiseevent readonly redim rem removehandler resume return ' + /* r */\n        'select set shadows shared skip static step stop structure strict sub synclock ' + /* s */\n        'take text then throw to try unicode until using when where while widening with withevents writeonly xor', /* t-x */\n      built_in:\n        'boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype ' +  /* b-c */\n        'date decimal directcast double gettype getxmlnamespace iif integer long object ' + /* d-o */\n        'sbyte short single string trycast typeof uinteger ulong ushort', /* s-u */\n      literal:\n        'true false nothing'\n    },\n    illegal: '//|{|}|endif|gosub|variant|wend', /* reserved deprecated keywords */\n    contains: [\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [{begin: '\"\"'}]}),\n      {\n        className: 'comment',\n        begin: '\\'', end: '$', returnBegin: true,\n        contains: [\n          {\n            className: 'xmlDocTag',\n            begin: '\\'\\'\\'|<!--|-->'\n          },\n          {\n            className: 'xmlDocTag',\n            begin: '</?', end: '>'\n          }\n          ]\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elseif end region externalsource'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/vbscript.js",
    "content": "/*\nLanguage: VBScript\nAuthor: Nikita Ledyaev <lenikita@yandex.ru>\nContributors: Michal Gabrukiewicz <mgabru@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['vbs'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'call class const dim do loop erase execute executeglobal exit for each next function ' +\n        'if then else on error option explicit new private property let get public randomize ' +\n        'redim rem select case set stop sub while wend with end to elseif is or xor and not ' +\n        'class_initialize class_terminate default preserve in me byval byref step resume goto',\n      built_in:\n        'lcase month vartype instrrev ubound setlocale getobject rgb getref string ' +\n        'weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency ' +\n        'conversions csng timevalue second year space abs clng timeserial fixs len asc ' +\n        'isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate ' +\n        'instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex ' +\n        'chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim ' +\n        'strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion ' +\n        'scriptengine split scriptengineminorversion cint sin datepart ltrim sqr ' +\n        'scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw ' +\n        'chrw regexp server response request cstr err',\n      literal:\n        'true false null nothing empty'\n    },\n    illegal: '//',\n    contains: [\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [{begin: '\"\"'}]}),\n      {\n        className: 'comment',\n        begin: /'/, end: /$/,\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/vhdl.js",
    "content": "/*\nLanguage: VHDL\nAuthor: Igor Kalnitsky <igor@kalnitsky.org>\nContributors: Daniel C.K. Kho <daniel.kho@gmail.com>\nDescription: VHDL is a hardware description language used in electronic design automation to describe digital and mixed-signal systems.\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'abs access after alias all and architecture array assert attribute begin block ' +\n        'body buffer bus case component configuration constant context cover disconnect ' +\n        'downto default else elsif end entity exit fairness file for force function generate ' +\n        'generic group guarded if impure in inertial inout is label library linkage literal ' +\n        'loop map mod nand new next nor not null of on open or others out package port ' +\n        'postponed procedure process property protected pure range record register reject ' +\n        'release rem report restrict restrict_guarantee return rol ror select sequence ' +\n        'severity shared signal sla sll sra srl strong subtype then to transport type ' +\n        'unaffected units until use variable vmode vprop vunit wait when while with xnor xor',\n      typename:\n        'boolean bit character severity_level integer time delay_length natural positive ' +\n        'string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector ' +\n        'std_logic std_logic_vector unsigned signed boolean_vector integer_vector ' +\n        'real_vector time_vector'\n    },\n    illegal: '{',\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,        // VHDL-2008 block commenting.\n      {\n        className: 'comment',\n        begin: '--', end: '$'\n      },\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'literal',\n        begin: '\\'(U|X|0|1|Z|W|L|H|-)\\'',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      {\n        className: 'attribute',\n        begin: '\\'[A-Za-z](_?[A-Za-z0-9])*',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      }\n    ]\n  }; // return\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/vim.js",
    "content": "/*\nLanguage: Vim Script\nAuthor: Jun Yang <yangjvn@126.com>\nDescription: full keyword and built-in from http://vimdoc.sourceforge.net/htmldoc/\n*/\n\nfunction(hljs) {\n  return {\n    lexemes: /[!#@\\w]+/,\n    keywords: {\n      keyword: //ex command\n        // express version except: ! & * < = > !! # @ @@\n        'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope '+\n        'cp cpf cq cr cs cst cu cuna cunme cw d|0 delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu g|0 go gr grepa gu gv ha h|0 helpf helpg helpt hi hid his i|0 ia iabc if ij il im imapc '+\n        'ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs n|0 new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 '+\n        'profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf q|0 quita qa r|0 rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv s|0 sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor '+\n        'so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync t|0 tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew '+\n        'tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up v|0 ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ '+\n        // full version\n        'Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload '+\n        'bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap '+\n        'cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor '+\n        'endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap '+\n        'imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview '+\n        'lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap '+\n        'nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext '+\n        'ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding '+\n        'scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace '+\n        'startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious '+'trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew '+\n        'vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank',\n      built_in: //built in func\n        'abs acos add and append argc argidx argv asin atan atan2 browse browsedir bufexists buflisted bufloaded bufname bufnr bufwinnr byte2line byteidx call ceil changenr char2nr cindent clearmatches col complete complete_add complete_check confirm copy cos cosh count cscope_connection cursor '+\n        'deepcopy delete did_filetype diff_filler diff_hlID empty escape eval eventhandler executable exists exp expand extend feedkeys filereadable filewritable filter finddir findfile float2nr floor fmod fnameescape fnamemodify foldclosed foldclosedend foldlevel foldtext foldtextresult foreground function '+\n        'garbagecollect get getbufline getbufvar getchar getcharmod getcmdline getcmdpos getcmdtype getcwd getfontname getfperm getfsize getftime getftype getline getloclist getmatches getpid getpos getqflist getreg getregtype gettabvar gettabwinvar getwinposx getwinposy getwinvar glob globpath has has_key '+\n        'haslocaldir hasmapto histadd histdel histget histnr hlexists hlID hostname iconv indent index input inputdialog inputlist inputrestore inputsave inputsecret insert invert isdirectory islocked items join keys len libcall libcallnr line line2byte lispindent localtime log log10 luaeval map maparg mapcheck '+\n        'match matchadd matcharg matchdelete matchend matchlist matchstr max min mkdir mode mzeval nextnonblank nr2char or pathshorten pow prevnonblank printf pumvisible py3eval pyeval range readfile reltime reltimestr remote_expr remote_foreground remote_peek remote_read remote_send remove rename repeat '+\n        'resolve reverse round screenattr screenchar screencol screenrow search searchdecl searchpair searchpairpos searchpos server2client serverlist setbufvar setcmdpos setline setloclist setmatches setpos setqflist setreg settabvar settabwinvar setwinvar sha256 shellescape shiftwidth simplify sin '+\n        'sinh sort soundfold spellbadword spellsuggest split sqrt str2float str2nr strchars strdisplaywidth strftime stridx string strlen strpart strridx strtrans strwidth submatch substitute synconcealed synID synIDattr '+\n        'synIDtrans synstack system tabpagebuflist tabpagenr tabpagewinnr tagfiles taglist tan tanh tempname tolower toupper tr trunc type undofile undotree values virtcol visualmode wildmenumode winbufnr wincol winheight winline winnr winrestcmd winrestview winsaveview winwidth writefile xor'\n    },\n    illegal: /[{:]/,\n    contains: [\n      hljs.NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'string',\n        // quote with escape, comment as quote\n        begin: /\"((\\\\\")|[^\"\\n])*(\"|\\n)/\n      },\n      {\n        className: 'variable',\n        begin: /[bwtglsav]:[\\w\\d_]*/\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function function!', end: '$',\n        relevance: 0,\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)'\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/x86asm.js",
    "content": "/*\nLanguage: Intel x86 Assembly\nAuthor: innocenat <innocenat@gmail.com>\nDescription: x86 assembly language using Intel's mnemonic and NASM syntax\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    lexemes: '\\\\.?' + hljs.IDENT_RE,\n    keywords: {\n      keyword:\n        'lock rep repe repz repne repnz xaquire xrelease bnd nobnd ' +\n        'aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63',\n      literal:\n        // Instruction pointer\n        'ip eip rip ' +\n        // 8-bit registers\n        'al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ' +\n        // 16-bit registers\n        'ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w ' +\n        // 32-bit registers\n        'eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d ' +\n        // 64-bit registers\n        'rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 ' +\n        // Segment registers\n        'cs ds es fs gs ss ' +\n        // Floating point stack registers\n        'st st0 st1 st2 st3 st4 st5 st6 st7 ' +\n        // MMX Registers\n        'mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 ' +\n        // SSE registers\n        'xmm0  xmm1  xmm2  xmm3  xmm4  xmm5  xmm6  xmm7  xmm8  xmm9 xmm10  xmm11 xmm12 xmm13 xmm14 xmm15 ' +\n        'xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ' +\n        // AVX registers\n        'ymm0  ymm1  ymm2  ymm3  ymm4  ymm5  ymm6  ymm7  ymm8  ymm9 ymm10  ymm11 ymm12 ymm13 ymm14 ymm15 ' +\n        'ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 ' +\n        // AVX-512F registers\n        'zmm0  zmm1  zmm2  zmm3  zmm4  zmm5  zmm6  zmm7  zmm8  zmm9 zmm10  zmm11 zmm12 zmm13 zmm14 zmm15 ' +\n        'zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 ' +\n        // AVX-512F mask registers\n        'k0 k1 k2 k3 k4 k5 k6 k7 ' +\n        // Bound (MPX) register\n        'bnd0 bnd1 bnd2 bnd3 ' +\n        // Special register\n        'cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 ' +\n        // NASM altreg package\n        'r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b ' +\n        'r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d ' +\n        'r0h r1h r2h r3h ' +\n        'r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l',\n\n      pseudo:\n        'db dw dd dq dt ddq do dy dz ' +\n        'resb resw resd resq rest resdq reso resy resz ' +\n        'incbin equ times',\n\n      preprocessor:\n        '%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif ' +\n        '%ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep ' +\n        '%endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment ' +\n        '.nolist ' +\n        'byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr ' +\n        '__FILE__ __LINE__ __SECT__  __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ ' +\n        '__UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__  __PASS__ struc endstruc istruc at iend ' +\n        'align alignb sectalign daz nodaz up down zero default option assume public ',\n\n      built_in:\n        'bits use16 use32 use64 default section segment absolute extern global common cpu float ' +\n        '__utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ ' +\n        '__float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ ' +\n        '__Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e ' +\n        'float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__'\n    },\n    contains: [\n      {\n        className: 'comment',\n        begin: ';',\n        end: '$',\n        relevance: 0\n      },\n      // Float number and x87 BCD\n      {\n        className: 'number',\n        begin: '\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b',\n        relevance: 0\n      },\n      // Hex number in $\n      {\n        className: 'number',\n        begin: '\\\\$[0-9][0-9A-Fa-f]*',\n        relevance: 0\n      },\n      // Number in H,X,D,T,Q,O,B,Y suffix\n      {\n        className: 'number',\n        begin: '\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[HhXx]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b'\n      },\n      // Number in H,X,D,T,Q,O,B,Y prefix\n      {\n        className: 'number',\n        begin: '\\\\b(?:0[HhXx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b'\n      },\n      // Double quote string\n      hljs.QUOTE_STRING_MODE,\n      // Single-quoted string\n      {\n        className: 'string',\n        begin: '\\'',\n        end: '[^\\\\\\\\]\\'',\n        relevance: 0\n      },\n      // Backquoted string\n      {\n        className: 'string',\n        begin: '`',\n        end: '[^\\\\\\\\]`',\n        relevance: 0\n      },\n      // Section name\n      {\n        className: 'string',\n        begin: '\\\\.[A-Za-z0-9]+',\n        relevance: 0\n      },\n      // Global label and local label\n      {\n        className: 'label',\n        begin: '^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)',\n        relevance: 0\n      },\n      // Macro-local label\n      {\n        className: 'label',\n        begin: '^\\\\s*%%[A-Za-z0-9_$#@~.?]*:',\n        relevance: 0\n      },\n      // Macro parameter\n      {\n        className: 'argument',\n        begin: '%[0-9]+',\n        relevance: 0\n      },\n      // Macro parameter\n      {\n        className: 'built_in',\n        begin: '%!\\S+',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/languages/xml.js",
    "content": "/*\nLanguage: HTML, XML\n*/\n\nfunction(hljs) {\n  var XML_IDENT_RE = '[A-Za-z0-9\\\\._:-]+';\n  var PHP = {\n    begin: /<\\?(php)?(?!\\w)/, end: /\\?>/,\n    subLanguage: 'php', subLanguageMode: 'continuous'\n  };\n  var TAG_INTERNALS = {\n    endsWithParent: true,\n    illegal: /</,\n    relevance: 0,\n    contains: [\n      PHP,\n      {\n        className: 'attribute',\n        begin: XML_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: '=',\n        relevance: 0,\n        contains: [\n          {\n            className: 'value',\n            variants: [\n              {begin: /\"/, end: /\"/},\n              {begin: /'/, end: /'/},\n              {begin: /[^\\s\\/>]+/}\n            ]\n          }\n        ]\n      }\n    ]\n  };\n  return {\n    aliases: ['html', 'xhtml', 'rss', 'atom', 'xsl', 'plist'],\n    case_insensitive: true,\n    contains: [\n      {\n        className: 'doctype',\n        begin: '<!DOCTYPE', end: '>',\n        relevance: 10,\n        contains: [{begin: '\\\\[', end: '\\\\]'}]\n      },\n      {\n        className: 'comment',\n        begin: '<!--', end: '-->',\n        relevance: 10\n      },\n      {\n        className: 'cdata',\n        begin: '<\\\\!\\\\[CDATA\\\\[', end: '\\\\]\\\\]>',\n        relevance: 10\n      },\n      {\n        className: 'tag',\n        /*\n        The lookahead pattern (?=...) ensures that 'begin' only matches\n        '<style' as a single word, followed by a whitespace or an\n        ending braket. The '$' is needed for the lexeme to be recognized\n        by hljs.subMode() that tests lexemes outside the stream.\n        */\n        begin: '<style(?=\\\\s|>|$)', end: '>',\n        keywords: {title: 'style'},\n        contains: [TAG_INTERNALS],\n        starts: {\n          end: '</style>', returnEnd: true,\n          subLanguage: 'css'\n        }\n      },\n      {\n        className: 'tag',\n        // See the comment in the <style tag about the lookahead pattern\n        begin: '<script(?=\\\\s|>|$)', end: '>',\n        keywords: {title: 'script'},\n        contains: [TAG_INTERNALS],\n        starts: {\n          end: '</script>', returnEnd: true,\n          subLanguage: 'javascript'\n        }\n      },\n      {\n        begin: '<%', end: '%>',\n        subLanguage: 'vbscript'\n      },\n      PHP,\n      {\n        className: 'pi',\n        begin: /<\\?\\w+/, end: /\\?>/,\n        relevance: 10\n      },\n      {\n        className: 'tag',\n        begin: '</?', end: '/?>',\n        contains: [\n          {\n            className: 'title', begin: '[^ /><]+', relevance: 0\n          },\n          TAG_INTERNALS\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/arta.css",
    "content": "/*\nDate: 17.V.2011\nAuthor: pumbur <pumbur@pumbur.net>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n}\n\n.profile .hljs-header *,\n.ini .hljs-title,\n.nginx .hljs-title {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-javadoc,\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-title,\n.hljs-pragma,\n.hljs-shebang,\n.profile .hljs-summary,\n.diff,\n.hljs-pi,\n.hljs-doctype,\n.hljs-tag,\n.hljs-template_comment,\n.css .hljs-rules,\n.tex .hljs-special {\n  color: #444;\n}\n\n.hljs-string,\n.hljs-symbol,\n.diff .hljs-change,\n.hljs-regexp,\n.xml .hljs-attribute,\n.smalltalk .hljs-char,\n.xml .hljs-value,\n.ini .hljs-value,\n.clojure .hljs-attribute,\n.coffeescript .hljs-attribute {\n  color: #ffcc33;\n}\n\n.hljs-number,\n.hljs-addition {\n  color: #00cc66;\n}\n\n.hljs-built_in,\n.hljs-literal,\n.vhdl .hljs-typename,\n.go .hljs-constant,\n.go .hljs-typename,\n.ini .hljs-keyword,\n.lua .hljs-title,\n.perl .hljs-variable,\n.php .hljs-variable,\n.mel .hljs-variable,\n.django .hljs-variable,\n.css .funtion,\n.smalltalk .method,\n.hljs-hexcolor,\n.hljs-important,\n.hljs-flow,\n.hljs-inheritance,\n.parser3 .hljs-variable {\n  color: #32aaee;\n}\n\n.hljs-keyword,\n.hljs-tag .hljs-title,\n.css .hljs-tag,\n.css .hljs-class,\n.css .hljs-id,\n.css .hljs-pseudo,\n.css .hljs-attr_selector,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.hljs-winutils,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  color: #6644aa;\n}\n\n.hljs-title,\n.ruby .hljs-constant,\n.vala .hljs-constant,\n.hljs-parent,\n.hljs-deletion,\n.hljs-template_tag,\n.css .hljs-keyword,\n.objectivec .hljs-class .hljs-id,\n.smalltalk .hljs-class,\n.lisp .hljs-keyword,\n.apache .hljs-tag,\n.nginx .hljs-variable,\n.hljs-envvar,\n.bash .hljs-variable,\n.go .hljs-built_in,\n.vbscript .hljs-built_in,\n.lua .hljs-built_in,\n.rsl .hljs-built_in,\n.tail,\n.avrasm .hljs-label,\n.tex .hljs-formula,\n.tex .hljs-formula * {\n  color: #bb1166;\n}\n\n.hljs-yardoctag,\n.hljs-phpdoc,\n.profile .hljs-header,\n.ini .hljs-title,\n.apache .hljs-tag,\n.parser3 .hljs-title {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.6;\n}\n\n.hljs,\n.hljs-subst,\n.diff .hljs-chunk,\n.css .hljs-value,\n.css .hljs-attribute {\n  color: #aaa;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/ascetic.css",
    "content": "﻿/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-filter .hljs-argument,\n.hljs-addition,\n.hljs-change,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula {\n  color: #888;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-shebang,\n.hljs-doctype,\n.hljs-pi,\n.hljs-javadoc,\n.hljs-deletion,\n.apache .hljs-sqbracket {\n  color: #ccc;\n}\n\n.hljs-keyword,\n.hljs-tag .hljs-title,\n.ini .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-title,\n.http .hljs-title,\n.nginx .hljs-title,\n.css .hljs-tag,\n.hljs-winutils,\n.hljs-flow,\n.apache .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-dune.dark.css",
    "content": "/* Base16 Atelier Dune Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Dune Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #999580;\n}\n\n/* Atelier Dune Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d73737;\n}\n\n/* Atelier Dune Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #b65611;\n}\n\n/* Atelier Dune Dark Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #cfb017;\n}\n\n/* Atelier Dune Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #60ac39;\n}\n\n/* Atelier Dune Dark Aqua */\n.css .hljs-hexcolor {\n  color: #1fad83;\n}\n\n/* Atelier Dune Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6684e1;\n}\n\n/* Atelier Dune Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #292824;\n  color: #a6a28c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-dune.light.css",
    "content": "/* Base16 Atelier Dune Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Dune Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7d7a68;\n}\n\n/* Atelier Dune Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d73737;\n}\n\n/* Atelier Dune Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #b65611;\n}\n\n/* Atelier Dune Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #cfb017;\n}\n\n/* Atelier Dune Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #60ac39;\n}\n\n/* Atelier Dune Light Aqua */\n.css .hljs-hexcolor {\n  color: #1fad83;\n}\n\n/* Atelier Dune Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6684e1;\n}\n\n/* Atelier Dune Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fefbec;\n  color: #6e6b5e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-forest.dark.css",
    "content": "/* Base16 Atelier Forest Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Forest Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #9c9491;\n}\n\n/* Atelier Forest Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f22c40;\n}\n\n/* Atelier Forest Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #df5320;\n}\n\n/* Atelier Forest Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #d5911a;\n}\n\n/* Atelier Forest Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #5ab738;\n}\n\n/* Atelier Forest Dark Aqua */\n.css .hljs-hexcolor {\n  color: #00ad9c;\n}\n\n/* Atelier Forest Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #407ee7;\n}\n\n/* Atelier Forest Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2c2421;\n  color: #a8a19f;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-forest.light.css",
    "content": "/* Base16 Atelier Forest Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Forest Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #766e6b;\n}\n\n/* Atelier Forest Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f22c40;\n}\n\n/* Atelier Forest Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #df5320;\n}\n\n/* Atelier Forest Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #d5911a;\n}\n\n/* Atelier Forest Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #5ab738;\n}\n\n/* Atelier Forest Light Aqua */\n.css .hljs-hexcolor {\n  color: #00ad9c;\n}\n\n/* Atelier Forest Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #407ee7;\n}\n\n/* Atelier Forest Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f1efee;\n  color: #68615e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-heath.dark.css",
    "content": "/* Base16 Atelier Heath Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Heath Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #9e8f9e;\n}\n\n/* Atelier Heath Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ca402b;\n}\n\n/* Atelier Heath Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #a65926;\n}\n\n/* Atelier Heath Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #bb8a35;\n}\n\n/* Atelier Heath Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #379a37;\n}\n\n/* Atelier Heath Dark Aqua */\n.css .hljs-hexcolor {\n  color: #159393;\n}\n\n/* Atelier Heath Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #516aec;\n}\n\n/* Atelier Heath Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #292329;\n  color: #ab9bab;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-heath.light.css",
    "content": "/* Base16 Atelier Heath Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Heath Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #776977;\n}\n\n/* Atelier Heath Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ca402b;\n}\n\n/* Atelier Heath Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #a65926;\n}\n\n/* Atelier Heath Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #bb8a35;\n}\n\n/* Atelier Heath Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #379a37;\n}\n\n/* Atelier Heath Light Aqua */\n.css .hljs-hexcolor {\n  color: #159393;\n}\n\n/* Atelier Heath Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #516aec;\n}\n\n/* Atelier Heath Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f7f3f7;\n  color: #695d69;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-lakeside.dark.css",
    "content": "/* Base16 Atelier Lakeside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Lakeside Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7195a8;\n}\n\n/* Atelier Lakeside Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d22d72;\n}\n\n/* Atelier Lakeside Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #935c25;\n}\n\n/* Atelier Lakeside Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #8a8a0f;\n}\n\n/* Atelier Lakeside Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #568c3b;\n}\n\n/* Atelier Lakeside Dark Aqua */\n.css .hljs-hexcolor {\n  color: #2d8f6f;\n}\n\n/* Atelier Lakeside Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #257fad;\n}\n\n/* Atelier Lakeside Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #5d5db1;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1f292e;\n  color: #7ea2b4;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-lakeside.light.css",
    "content": "/* Base16 Atelier Lakeside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Lakeside Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #5a7b8c;\n}\n\n/* Atelier Lakeside Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d22d72;\n}\n\n/* Atelier Lakeside Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #935c25;\n}\n\n/* Atelier Lakeside Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #8a8a0f;\n}\n\n/* Atelier Lakeside Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #568c3b;\n}\n\n/* Atelier Lakeside Light Aqua */\n.css .hljs-hexcolor {\n  color: #2d8f6f;\n}\n\n/* Atelier Lakeside Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #257fad;\n}\n\n/* Atelier Lakeside Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #5d5db1;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #ebf8ff;\n  color: #516d7b;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-seaside.dark.css",
    "content": "/* Base16 Atelier Seaside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Seaside Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #809980;\n}\n\n/* Atelier Seaside Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #e6193c;\n}\n\n/* Atelier Seaside Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #87711d;\n}\n\n/* Atelier Seaside Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #c3c322;\n}\n\n/* Atelier Seaside Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #29a329;\n}\n\n/* Atelier Seaside Dark Aqua */\n.css .hljs-hexcolor {\n  color: #1999b3;\n}\n\n/* Atelier Seaside Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #3d62f5;\n}\n\n/* Atelier Seaside Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #242924;\n  color: #8ca68c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/atelier-seaside.light.css",
    "content": "/* Base16 Atelier Seaside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Seaside Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #687d68;\n}\n\n/* Atelier Seaside Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #e6193c;\n}\n\n/* Atelier Seaside Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #87711d;\n}\n\n/* Atelier Seaside Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #c3c322;\n}\n\n/* Atelier Seaside Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #29a329;\n}\n\n/* Atelier Seaside Light Aqua */\n.css .hljs-hexcolor {\n  color: #1999b3;\n}\n\n/* Atelier Seaside Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #3d62f5;\n}\n\n/* Atelier Seaside Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f0fff0;\n  color: #5e6e5e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/brown_paper.css",
    "content": "/*\n\nBrown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background:#b7a68e url(./brown_papersq.png);\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  color:#005599;\n  font-weight:bold;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-keyword {\n  color: #363c69;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-number {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula {\n  color: #802022;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-command {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.8;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/codepen-embed.css",
    "content": "/*\n  codepen.io Embed Theme\n  Author: Justin Perry <http://github.com/ourmaninamsterdam>\n  Original theme - https://github.com/chriskempson/tomorrow-theme\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n  color: #fff;\n  font-family: Menlo, Monaco, 'Andale Mono', 'Lucida Console', 'Courier New', monospace;\n}\n\n.hljs-comment,\n.hljs-title {\n  color: #777;\n}\n\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .constant,\n.xml .tag .title,\n.xml .pi,\n.xml .doctype,\n.html .doctype {\n  color: #ab875d;\n}\n\n.css .value {\n  color: #cd6a51;\n}\n\n.css .value .function,\n.css .value .string {\n  color: #a67f59;\n}\n\n.css .value .number {\n  color: #9b869c;\n}\n\n.css .id,\n.css .class,\n.css-pseudo,\n.css .selector,\n.css .tag {\n  color: #dfc48c;\n}\n\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #ab875d;\n}\n\n.ruby .class .title,\n.css .rules .attribute {\n  color: #9b869b;\n}\n\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .symbol,\n.xml .cdata {\n  color: #8f9c6c;\n}\n\n.css .hexcolor {\n  color: #cd6a51;\n}\n\n.function,\n.python .decorator,\n.python .title,\n.ruby .function .title,\n.ruby .title .keyword,\n.perl .sub,\n.javascript .title,\n.coffeescript .title {\n  color: #fff;\n}\n\n.hljs-keyword,\n.javascript .function {\n  color: #8f9c6c;\n}\n\n.coffeescript .javascript,\n.javascript,\n.javascript .xml,\n.tex .formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .cdata {\n    background: transparent;\n    opacity: 1;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/color-brewer.css",
    "content": "/*\n\nColorbrewer theme\nOriginal: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock <mike@ocks.org>\nPorted by Fabrício Tavares de Oliveira\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title {\n  color: #000;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute {\n  color: #756bb1;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #636363;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #31a354;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #88f;\n}\n\n\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-javadoctag,\n.hljs-phpdoc,\n.hljs-yardoctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.go .hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status {\n  color: #3182bd;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n.css .hljs-attribute,\n.html .hljs-attribute {\n  color: #e6550d;\n}\n\n.css .hljs-class,\n.html .hljs-tag,\n.html .hljs-title {\n  color: #3182bd;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/dark.css",
    "content": "﻿/*\n\nDark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #444;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color: white;\n}\n\n.hljs,\n.hljs-subst {\n  color: #ddd;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.ini .hljs-title,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt,\n.coffeescript .hljs-attribute {\n  color: #d88;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #777;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-title,\n.css .hljs-id,\n.hljs-phpdoc,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/default.css",
    "content": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #f0f0f0;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute {\n  color: #800;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #080;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #88f;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-javadoctag,\n.hljs-phpdoc,\n.hljs-yardoctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.go .hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/docco.css",
    "content": "/*\nDocco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars)\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #f8f8ff;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n  color: #408080;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.assignment,\n.hljs-literal,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.lisp .hljs-title,\n.hljs-subst {\n  color: #954121;\n}\n\n.hljs-number,\n.hljs-hexcolor {\n  color: #40a070;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula {\n  color: #219161;\n}\n\n.hljs-title,\n.hljs-id {\n  color: #19469d;\n}\n.hljs-params {\n  color: #00f;\n}\n\n.javascript .hljs-title,\n.lisp .hljs-title,\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-label,\n.tex .hljs-command {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.instancevar,\n.lisp .hljs-body {\n  color: #008080;\n}\n\n.hljs-regexp {\n  color: #b68;\n}\n\n.hljs-class {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-symbol .hljs-keyword,\n.ruby .hljs-symbol .keymethods,\n.lisp .hljs-keyword,\n.tex .hljs-special,\n.input_number {\n  color: #990073;\n}\n\n.builtin,\n.constructor,\n.hljs-built_in,\n.lisp .hljs-title {\n  color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.diff .hljs-change {\n  background: #0086b3;\n}\n\n.hljs-chunk {\n  color: #aaa;\n}\n\n.tex .hljs-formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/far.css",
    "content": "/*\n\nFAR Style (c) MajestiC <majestic2k@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000080;\n}\n\n.hljs,\n.hljs-subst {\n  color: #0ff;\n}\n\n.hljs-string,\n.ruby .hljs-string,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-rules .hljs-value .hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.clojure .hljs-title,\n.coffeescript .hljs-attribute {\n  color: #ff0;\n}\n\n.hljs-keyword,\n.css .hljs-id,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.xml .hljs-tag .hljs-title,\n.hljs-winutils,\n.hljs-flow,\n.hljs-change,\n.hljs-envvar,\n.bash .hljs-variable,\n.tex .hljs-special,\n.clojure .hljs-built_in {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-phpdoc,\n.hljs-javadoc,\n.java .hljs-annotation,\n.hljs-template_comment,\n.hljs-deletion,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.clojure .hljs-attribute {\n  color: #0f0;\n}\n\n.python .hljs-decorator,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.xml .hljs-pi,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-shebang,\n.nginx .hljs-built_in,\n.hljs-prompt {\n  color: #008080;\n}\n\n.hljs-keyword,\n.css .hljs-id,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.hljs-flow,\n.apache .hljs-tag,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/foundation.css",
    "content": "/*\nDescription: Foundation 4 docs style for highlight.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://foundation.zurb.com/docs/\nVersion: 1.0\nDate: 2013-04-02\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eee;\n}\n\n.hljs-header,\n.hljs-decorator,\n.hljs-annotation {\n  color: #000077;\n}\n\n.hljs-horizontal_rule,\n.hljs-link_url,\n.hljs-emphasis,\n.hljs-attribute {\n  color: #070;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-link_label,\n.hljs-strong,\n.hljs-value,\n.hljs-string,\n.scss .hljs-value .hljs-string {\n  color: #d14;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-blockquote,\n.hljs-comment {\n  color: #998;\n  font-style: italic;\n}\n\n.asciidoc .hljs-title,\n.hljs-function .hljs-title {\n  color: #900;\n}\n\n.hljs-class {\n  color: #458;\n}\n\n.hljs-id,\n.hljs-pseudo,\n.hljs-constant,\n.hljs-hexcolor {\n  color: teal;\n}\n\n.hljs-variable {\n  color: #336699;\n}\n\n.hljs-bullet,\n.hljs-javadoc {\n  color: #997700;\n}\n\n.hljs-pi,\n.hljs-doctype {\n  color: #3344bb;\n}\n\n.hljs-code,\n.hljs-number {\n  color: #099;\n}\n\n.hljs-important {\n  color: #f00;\n}\n\n.smartquote,\n.hljs-label {\n  color: #970;\n}\n\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #579;\n}\n\n.hljs-reserved,\n.hljs-keyword,\n.scss .hljs-value {\n  color: #000;\n}\n\n.hljs-regexp {\n  background-color: #fff0ff;\n  color: #880088;\n}\n\n.hljs-symbol {\n  color: #990073;\n}\n\n.hljs-symbol .hljs-string {\n  color: #a60;\n}\n\n.hljs-tag {\n  color: #007700;\n}\n\n.hljs-at_rule,\n.hljs-at_rule .hljs-keyword {\n  color: #088;\n}\n\n.hljs-at_rule .hljs-preprocessor {\n  color: #808;\n}\n\n.scss .hljs-tag,\n.scss .hljs-attribute {\n  color: #339;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/github.css",
    "content": "/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #333;\n  background: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n  color: #998;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n  color: #099;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula {\n  color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.coffeescript .hljs-params,\n.scss .hljs-preprocessor {\n  color: #900;\n  font-weight: bold;\n}\n\n.javascript .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-title,\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n  color: #008080;\n}\n\n.hljs-regexp {\n  color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n  color: #990073;\n}\n\n.hljs-built_in,\n.lisp .hljs-title,\n.clojure .hljs-built_in {\n  color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.diff .hljs-change {\n  background: #0086b3;\n}\n\n.hljs-chunk {\n  color: #aaa;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/googlecode.css",
    "content": "/*\n\nGoogle Code style (c) Aahan Krish <geekpanth3r@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #800;\n}\n\n.hljs-keyword,\n.method,\n.hljs-list .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.hljs-tag .hljs-title,\n.setting .hljs-value,\n.hljs-winutils,\n.tex .hljs-command,\n.http .hljs-title,\n.hljs-request,\n.hljs-status {\n  color: #008;\n}\n\n.hljs-envvar,\n.tex .hljs-special {\n  color: #660;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.hljs-regexp,\n.coffeescript .hljs-attribute {\n  color: #080;\n}\n\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.ini .hljs-title,\n.hljs-shebang,\n.hljs-prompt,\n.hljs-hexcolor,\n.hljs-rules .hljs-value,\n.hljs-literal,\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number,\n.css .hljs-function,\n.clojure .hljs-attribute {\n  color: #066;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.hljs-typename,\n.hljs-tag .hljs-attribute,\n.hljs-doctype,\n.hljs-class .hljs-id,\n.hljs-built_in,\n.setting,\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-title {\n  color: #606;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.hljs-subst {\n  color: #000;\n}\n\n.css .hljs-class,\n.css .hljs-id {\n  color: #9b703f;\n}\n\n.hljs-value .hljs-important {\n  color: #ff7700;\n  font-weight: bold;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #444;\n}\n\n.tex .hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  color: #808080;\n  font-weight: bold;\n}\n\n.diff .hljs-change {\n  background-color: #bccff9;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-comment .hljs-yardoctag {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/hybrid.css",
    "content": "/*\n\nvim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)\n\n*/\n\n/*background color*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #1d1f21;\n}\n\n/*selection color*/\n.hljs::selection,\n.hljs span::selection {\n\tbackground: #373b41;\n}\n.hljs::-moz-selection,\n.hljs span::-moz-selection {\n\tbackground: #373b41;\n}\n\n/*foreground color*/\n.hljs,\n.hljs-setting .hljs-value,\n.hljs-expression .hljs-variable,\n.hljs-expression .hljs-begin-block,\n.hljs-expression .hljs-end-block,\n.hljs-class .hljs-params,\n.hljs-function .hljs-params,\n.hljs-at_rule .hljs-preprocessor {\n  color: #c5c8c6;\n}\n\n/*color: fg_yellow*/\n.hljs-title,\n.hljs-function .hljs-title,\n.hljs-keyword .hljs-common,\n.hljs-class .hljs-title,\n.hljs-decorator,\n.hljs-tag .hljs-title,\n.hljs-header,\n.hljs-sub,\n.hljs-function {\n  color: #f0c674;\n}\n\n/*color: fg_comment*/\n.hljs-comment,\n.hljs-javadoc,\n.hljs-output .hljs-value,\n.hljs-pi,\n.hljs-shebang,\n.hljs-template_comment,\n.hljs-doctype {\n  color: #707880;\n}\n\n/*color: fg_red*/\n.hljs-number,\n.hljs-symbol,\n.hljs-literal,\n.hljs-deletion,\n.hljs-link_url,\n.hljs-symbol .hljs-string,\n.hljs-argument,\n.hljs-hexcolor,\n.hljs-input .hljs-prompt,\n.hljs-char {\n color: #cc6666\n}\n\n/*color: fg_green*/\n.hljs-string,\n.hljs-special,\n.hljs-javadoctag,\n.hljs-addition,\n.hljs-important,\n.hljs-tag .hljs-value,\n.hljs-at.rule .hljs-keyword,\n.hljs-regexp,\n.hljs-attr_selector {\n  color: #b5bd68;\n}\n\n/*color: fg_purple*/\n.hljs-variable,\n.hljs-property,\n.hljs-envar,\n.hljs-code,\n.hljs-expression,\n.hljs-localvars,\n.hljs-id,\n.hljs-variable .hljs-filter,\n.hljs-variable .hljs-filter .hljs-keyword,\n.hljs-template_tag .hljs-filter .hljs-keyword {\n color: #b294bb;\n}\n\n/*color: fg_blue*/\n.hljs-statement,\n.hljs-label,\n.hljs-keyword,\n.hljs-xmlDocTag,\n.hljs-function .hljs-keyword,\n.hljs-chunk,\n.hljs-cdata,\n.hljs-link_label,\n.hljs-bullet,\n.hljs-class .hljs-keyword,\n.hljs-smartquote,\n.hljs-method,\n.hljs-list .hljs-title,\n.hljs-tag {\n color: #81a2be;\n}\n\n/*color: fg_aqua*/\n.hljs-pseudo,\n.hljs-exception,\n.hljs-annotation,\n.hljs-subst,\n.hljs-change,\n.hljs-cbracket,\n.hljs-operator,\n.hljs-horizontal_rule,\n.hljs-preprocessor .hljs-keyword,\n.hljs-typedef,\n.hljs-template_tag,\n.hljs-variable,\n.hljs-variable .hljs-filter .hljs-argument,\n.hljs-at_rule,\n.hljs-at_rule .hljs-string,\n.hljs-at_rule .hljs-keyword {\n  color: #8abeb7;\n}\n\n\n/*color: fg_orange*/\n.hljs-typename ,\n.hljs-inheritance .hljs-parent,\n.hljs-constant,\n.hljs-built_in,\n.hljs-setting,\n.hljs-structure,\n.hljs-link_reference,\n.hljs-attribute,\n.hljs-blockquote,\n.hljs-quoted,\n.hljs-class,\n.hljs-header {\n  color: #de935f;\n}\n\n.hljs-emphasis\n{\n  font-style: italic;\n}\n\n.hljs-strong\n{\n  font-weight: bold;\n}\n\n\n\n\n"
  },
  {
    "path": "ppt/js/highlight/styles/idea.css",
    "content": "/*\n\nIntellij Idea-like styling (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #fff;\n}\n\n.hljs-subst,\n.hljs-title,\n.json .hljs-value {\n  font-weight: normal;\n  color: #000;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc,\n.diff .hljs-header {\n  color: #808080;\n  font-style: italic;\n}\n\n.hljs-annotation,\n.hljs-decorator,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-doctype,\n.hljs-pi,\n.hljs-chunk,\n.hljs-shebang,\n.apache .hljs-cbracket,\n.hljs-prompt,\n.http .hljs-title {\n  color: #808000;\n}\n\n.hljs-tag,\n.hljs-pi {\n  background: #efefef;\n}\n\n.hljs-tag .hljs-title,\n.hljs-id,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-literal,\n.hljs-keyword,\n.hljs-hexcolor,\n.css .hljs-function,\n.ini .hljs-title,\n.css .hljs-class,\n.hljs-list .hljs-title,\n.clojure .hljs-title,\n.nginx .hljs-title,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n  color: #000080;\n}\n\n.hljs-attribute,\n.hljs-rules .hljs-keyword,\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.tex .hljs-special {\n  font-weight: bold;\n  color: #0000ff;\n}\n\n.hljs-number,\n.hljs-regexp {\n  font-weight: normal;\n}\n\n.hljs-string,\n.hljs-value,\n.hljs-filter .hljs-argument,\n.css .hljs-function .hljs-params,\n.apache .hljs-tag {\n  color: #008000;\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-char,\n.tex .hljs-formula {\n  color: #000;\n  background: #d0eded;\n  font-style: italic;\n}\n\n.hljs-phpdoc,\n.hljs-yardoctag,\n.hljs-javadoctag {\n  text-decoration: underline;\n}\n\n.hljs-variable,\n.hljs-envvar,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #660e7a;\n}\n\n.hljs-addition {\n  background: #baeeba;\n}\n\n.hljs-deletion {\n  background: #ffc8bd;\n}\n\n.diff .hljs-change {\n  background: #bccff9;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/ir_black.css",
    "content": "/*\n  IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-shebang,\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #7c7c7c;\n}\n\n.hljs-keyword,\n.hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status,\n.clojure .hljs-attribute {\n  color: #96cbfe;\n}\n\n.hljs-sub .hljs-keyword,\n.method,\n.hljs-list .hljs-title,\n.nginx .hljs-title {\n  color: #ffffb6;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.coffeescript .hljs-attribute {\n  color: #a8ff60;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-decorator,\n.tex .hljs-special,\n.haskell .hljs-type,\n.hljs-constant,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.nginx .hljs-built_in {\n  color: #ffffb6;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number,\n.hljs-variable,\n.vbscript,\n.hljs-literal {\n  color: #c6c5fe;\n}\n\n.css .hljs-tag {\n  color: #96cbfe;\n}\n\n.css .hljs-rules .hljs-property,\n.css .hljs-id {\n  color: #ffffb6;\n}\n\n.css .hljs-class {\n  color: #fff;\n}\n\n.hljs-hexcolor {\n  color: #c6c5fe;\n}\n\n.hljs-number {\n  color:#ff73fd;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.7;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/kimbie.dark.css",
    "content": "/*\n    Name:     Kimbie (dark)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-title {\n  color: #d6baad;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #889b4a;\n}\n\n/* Kimbie Aqua */\n.css .hljs-hexcolor {\n  color:: #088649;\n}\n\n/* Kimbie Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #8ab1b0;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #221a0f;\n  color: #d3af86;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/kimbie.light.css",
    "content": "/*\n    Name:     Kimbie (light)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-title {\n  color: #a57a4c;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #889b4a;\n}\n\n/* Kimbie Aqua */\n.css .hljs-hexcolor {\n  color: #088649;\n}\n\n/* Kimbie Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #8ab1b0;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fbebd4;\n  color: #84613d;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/magula.css",
    "content": "﻿/*\nDescription: Magula style for highligh.js\nAuthor: Ruslan Keba <rukeba@gmail.com>\nWebsite: http://rukeba.com/\nVersion: 1.0\nDate: 2009-01-03\nMusic: Aphex Twin / Xtal\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background-color: #f4f4f4;\n}\n\n.hljs,\n.hljs-subst,\n.lisp .hljs-title,\n.clojure .hljs-built_in {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-cbracket,\n.coffeescript .hljs-attribute {\n  color: #050;\n}\n\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk {\n  color: #777;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.hljs-change,\n.tex .hljs-special {\n  color: #800;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.hljs-prompt,\n.clojure .hljs-attribute {\n  color: #00e;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-built_in,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.xml .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n  color: navy;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n/* --- */\n.apache .hljs-tag {\n  font-weight: bold;\n  color: blue;\n}\n\n"
  },
  {
    "path": "ppt/js/highlight/styles/mono-blue.css",
    "content": "/*\n  Five-color theme from a single blue hue.\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eaeef3;\n  color: #00193a;\n}\n\n.hljs-keyword,\n.hljs-title,\n.hljs-important,\n.hljs-request,\n.hljs-header,\n.hljs-javadoctag {\n  font-weight: bold;\n}\n\n.hljs-comment,\n.hljs-chunk,\n.hljs-template_comment {\n  color: #738191;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-built_in,\n.hljs-literal,\n.hljs-filename,\n.hljs-value,\n.hljs-addition,\n.hljs-tag,\n.hljs-argument,\n.hljs-link_label,\n.hljs-blockquote,\n.hljs-header {\n  color: #0048ab;\n}\n\n.hljs-decorator,\n.hljs-prompt,\n.hljs-yardoctag,\n.hljs-subst,\n.hljs-symbol,\n.hljs-doctype,\n.hljs-regexp,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-attribute,\n.hljs-attr_selector,\n.hljs-javadoc,\n.hljs-xmlDocTag,\n.hljs-deletion,\n.hljs-shebang,\n.hljs-string .hljs-variable,\n.hljs-link_url,\n.hljs-bullet,\n.hljs-sqbracket,\n.hljs-phony {\n  color: #4c81c9;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/monokai.css",
    "content": "/*\nMonokai style - ported by Luigi Maselli - http://grigio.org\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #272822;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-keyword,\n.hljs-literal,\n.hljs-strong,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color: #f92672;\n}\n\n.hljs {\n  color: #ddd;\n}\n\n.hljs .hljs-constant,\n.asciidoc .hljs-code {\n\tcolor: #66d9ef;\n}\n\n.hljs-code,\n.hljs-class .hljs-title,\n.hljs-header {\n\tcolor: white;\n}\n\n.hljs-link_label,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-value,\n.hljs-regexp {\n\tcolor: #bf79db;\n}\n\n.hljs-link_url,\n.hljs-tag .hljs-value,\n.hljs-string,\n.hljs-bullet,\n.hljs-subst,\n.hljs-title,\n.hljs-emphasis,\n.haskell .hljs-type,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #a6e22e;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.smartquote,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #75715e;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-header,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/monokai_sublime.css",
    "content": "/*\n\nMonokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #23241f;\n}\n\n.hljs,\n.hljs-tag,\n.css .hljs-rules,\n.css .hljs-value,\n.css .hljs-function\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #f8f8f2;\n}\n\n.hljs-strongemphasis,\n.hljs-strong,\n.hljs-emphasis {\n  color: #a8a8a2;\n}\n\n.hljs-bullet,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.hljs-number,\n.hljs-regexp,\n.alias .hljs-keyword,\n.hljs-literal,\n.hljs-hexcolor {\n  color: #ae81ff;\n}\n\n.hljs-tag .hljs-value,\n.hljs-code,\n.hljs-title,\n.css .hljs-class,\n.hljs-class .hljs-title:last-child {\n  color: #a6e22e;\n}\n\n.hljs-link_url {\n  font-size: 80%;\n}\n\n.hljs-strong,\n.hljs-strongemphasis {\n  font-weight: bold;\n}\n\n.hljs-emphasis,\n.hljs-strongemphasis,\n.hljs-class .hljs-title:last-child {\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-function,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special,\n.hljs-header,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-tag .hljs-title,\n.hljs-value,\n.alias .hljs-keyword:first-child,\n.css .hljs-tag,\n.css .unit,\n.css .hljs-important {\n  color: #f92672;\n}\n\n.hljs-function .hljs-keyword,\n.hljs-class .hljs-keyword:first-child,\n.hljs-constant,\n.css .hljs-attribute {\n  color: #66d9ef;\n}\n\n.hljs-variable,\n.hljs-params,\n.hljs-class .hljs-title {\n  color: #f8f8f2;\n}\n\n.hljs-string,\n.css .hljs-id,\n.hljs-subst,\n.haskell .hljs-type,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt,\n.hljs-link_label,\n.hljs-link_url {\n  color: #e6db74;\n}\n\n.hljs-comment,\n.hljs-javadoc,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #75715e;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata,\n.xml .php,\n.php .xml {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/obsidian.css",
    "content": "/**\n * Obsidian style\n * ported by Alexander Marenin (http://github.com/ioncreature)\n */\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #282b2e;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.css .hljs-id,\n.tex .hljs-special {\n  color: #93c763;\n}\n\n.hljs-number {\n  color: #ffcd22;\n}\n\n.hljs {\n  color: #e0e2e4;\n}\n\n.css .hljs-tag,\n.css .hljs-pseudo {\n  color: #d0d2b5;\n}\n\n.hljs-attribute,\n.hljs .hljs-constant {\n  color: #668bb0;\n}\n\n.xml .hljs-attribute {\n  color: #b3b689;\n}\n\n.xml .hljs-tag .hljs-value {\n  color: #e8e2b7;\n}\n\n.hljs-code,\n.hljs-class .hljs-title,\n.hljs-header {\n  color: white;\n}\n\n.hljs-class,\n.hljs-hexcolor {\n  color: #93c763;\n}\n\n.hljs-regexp {\n  color: #d39745;\n}\n\n.hljs-at_rule,\n.hljs-at_rule .hljs-keyword {\n  color: #a082bd;\n}\n\n.hljs-doctype {\n  color: #557182;\n}\n\n.hljs-link_url,\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-bullet,\n.hljs-subst,\n.hljs-emphasis,\n.haskell .hljs-type,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #8cbbad;\n}\n\n.hljs-string {\n  color: #ec7600;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #818e96;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-header,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-at_rule .hljs-keyword,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/paraiso.dark.css",
    "content": "/*\n    Paraíso (dark)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-title {\n  color: #8d8687;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #48b685;\n}\n\n/* Paraíso Aqua */\n.css .hljs-hexcolor {\n  color: #5bc4bf;\n}\n\n/* Paraíso Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #06b6ef;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2f1e2e;\n  color: #a39e9b;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/paraiso.light.css",
    "content": "/*\n    Paraíso (light)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-title {\n  color: #776e71;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #48b685;\n}\n\n/* Paraíso Aqua */\n.css .hljs-hexcolor {\n  color: #5bc4bf;\n}\n\n/* Paraíso Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #06b6ef;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #e7e9db;\n  color: #4f424c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/pojoaque.css",
    "content": "/*\n\nPojoaque Style by Jason Tate\nhttp://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html\nBased on Solarized Style from http://ethanschoonover.com/solarized\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #dccf8f;\n  background: url(./pojoaque.jpg) repeat scroll left top #181914;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #586e75;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.clojure .hljs-title,\n.nginx .hljs-title {\n  color: #b64926;\n}\n\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor {\n  color: #468966;\n}\n\n.hljs-title,\n.hljs-localvars,\n.hljs-function .hljs-title,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.hljs-identifier,\n.hljs-id {\n  color: #ffb03b;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type {\n  color: #b58900;\n}\n\n.css .hljs-attribute {\n  color: #b89859;\n}\n\n.css .hljs-number,\n.css .hljs-hexcolor {\n  color: #dccf8f;\n}\n\n.css .hljs-class {\n  color: #d3a60c;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-subst,\n.hljs-cdata {\n  color: #cb4b16;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.tex .hljs-formula {\n  background: #073642;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/railscasts.css",
    "content": "/*\n\nRailscasts-like style (c) Visoft, Inc. (Damien White)\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #232323;\n  color: #e6e1dc;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc,\n.hljs-shebang {\n  color: #bc9458;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.ruby .hljs-function .hljs-keyword,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title,\n.method,\n.hljs-list .hljs-title {\n  color: #c26230;\n}\n\n.hljs-string,\n.hljs-number,\n.hljs-regexp,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.tex .hljs-command,\n.markdown .hljs-link_label {\n  color: #a5c261;\n}\n\n.hljs-subst {\n  color: #519f50;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-tag .hljs-title,\n.hljs-doctype,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.input_number {\n  color: #e8bf6a;\n}\n\n.hljs-identifier {\n  color: #d0d0ff;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc {\n  text-decoration: none;\n}\n\n.hljs-constant {\n  color: #da4939;\n}\n\n\n.hljs-symbol,\n.hljs-built_in,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-symbol .hljs-identifier,\n.markdown .hljs-link_url,\n.hljs-attribute {\n  color: #6d9cbe;\n}\n\n.markdown .hljs-link_url {\n  text-decoration: underline;\n}\n\n\n\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-attribute {\n  color: #d0d0ff;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.tex .hljs-special {\n  color: #cda869;\n}\n\n.css .hljs-class {\n  color: #9b703f;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-rules .hljs-value {\n  color: #cf6a4c;\n}\n\n.css .hljs-id {\n  color: #8b98ab;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #8996a8 !important;\n}\n\n.hljs-hexcolor,\n.css .hljs-value .hljs-number {\n  color: #a5c261;\n}\n\n.hljs-title,\n.hljs-decorator,\n.css .hljs-function {\n  color: #ffc66d;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  background-color: #2f33ab;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.diff .hljs-change {\n  background-color: #4a410d;\n  color: #f8f8f8;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-addition {\n  background-color: #144212;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #600;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.7;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/rainbow.css",
    "content": "/*\n\nStyle with support for rainbow parens\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #474949;\n  color: #d1d9e1;\n}\n\n\n.hljs-body,\n.hljs-collection {\n   color: #d1d9e1;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #969896;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.clojure .hljs-attribute,\n.hljs-winutils,\n.javascript .hljs-title,\n.hljs-addition,\n.css .hljs-tag {\n  color: #cc99cc;\n}\n\n.hljs-number { color: #f99157; }\n\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor {\n  color: #8abeb7;\n}\n\n.hljs-title,\n.hljs-localvars,\n.hljs-function .hljs-title,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.lisp .hljs-title,\n.hljs-identifier {\n  color: #b5bd68;\n}\n\n.hljs-class .hljs-keyword {\n  color: #f2777a;\n}\n\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-label,\n.hljs-id,\n.lisp .hljs-title,\n.clojure .hljs-title .hljs-built_in {\n   color: #ffcc66;\n}\n\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword,\n.clojure .hljs-title .hljs-built_in {\n  font-weight: bold;\n}\n\n.hljs-attribute,\n.clojure .hljs-title {\n  color: #81a2be;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-subst,\n.hljs-cdata {\n  color: #f99157;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.tex .hljs-formula {\n  background: #eee8d5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/school_book.css",
    "content": "/*\n\nSchool Book style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 15px 0.5em 0.5em 30px;\n  font-size: 11px !important;\n  line-height:16px !important;\n}\n\npre{\n  background:#f6f6ae url(./school_book.png);\n  border-top: solid 2px #d2e8b9;\n  border-bottom: solid 1px #d2e8b9;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color:#005599;\n  font-weight:bold;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-keyword {\n  color: #3e5915;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.coffeescript .hljs-attribute {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket {\n  color: #e60415;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.xml .hljs-tag .hljs-title,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/solarized_dark.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #002b36;\n  color: #839496;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.hljs-pi,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #586e75;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-winutils,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor,\n.hljs-link_url {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-localvars,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.hljs-identifier,\n.vhdl .hljs-literal,\n.hljs-id,\n.css .hljs-function {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type,\n.hljs-link_reference {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-keyword,\n.hljs-pragma,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-subst,\n.hljs-cdata,\n.clojure .hljs-title,\n.css .hljs-pseudo,\n.hljs-header {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-deletion,\n.hljs-important {\n  color: #dc322f;\n}\n\n/* Solarized Violet */\n.hljs-link_label {\n  color: #6c71c4;\n}\n\n.tex .hljs-formula {\n  background: #073642;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/solarized_light.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fdf6e3;\n  color: #657b83;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.hljs-pi,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-winutils,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor,\n.hljs-link_url {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-localvars,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.hljs-identifier,\n.vhdl .hljs-literal,\n.hljs-id,\n.css .hljs-function {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type,\n.hljs-link_reference {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-keyword,\n.hljs-pragma,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-subst,\n.hljs-cdata,\n.clojure .hljs-title,\n.css .hljs-pseudo,\n.hljs-header {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-deletion,\n.hljs-important {\n  color: #dc322f;\n}\n\n/* Solarized Violet */\n.hljs-link_label {\n  color: #6c71c4;\n}\n\n.tex .hljs-formula {\n  background: #eee8d5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/sunburst.css",
    "content": "/*\n\nSunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #aeaeae;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.ruby .hljs-function .hljs-keyword,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #e28964;\n}\n\n.hljs-function .hljs-keyword,\n.hljs-sub .hljs-keyword,\n.method,\n.hljs-list .hljs-title {\n  color: #99cf50;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.tex .hljs-command,\n.coffeescript .hljs-attribute {\n  color: #65b042;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.hljs-shebang,\n.hljs-prompt {\n  color: #89bdff;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc {\n  text-decoration: underline;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number {\n  color: #3387cc;\n}\n\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-attribute {\n  color: #3e87e3;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.tex .hljs-special {\n  color: #cda869;\n}\n\n.css .hljs-class {\n  color: #9b703f;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-rules .hljs-value {\n  color: #cf6a4c;\n}\n\n.css .hljs-id {\n  color: #8b98ab;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #8996a8;\n}\n\n.hljs-hexcolor,\n.css .hljs-value .hljs-number {\n  color: #dd7b3b;\n}\n\n.css .hljs-function {\n  color: #dad085;\n}\n\n.diff .hljs-header,\n.hljs-chunk,\n.tex .hljs-formula {\n  background-color: #0e2231;\n  color: #f8f8f8;\n  font-style: italic;\n}\n\n.diff .hljs-change {\n  background-color: #4a410d;\n  color: #f8f8f8;\n}\n\n.hljs-addition {\n  background-color: #253b22;\n  color: #f8f8f8;\n}\n\n.hljs-deletion {\n  background-color: #420e09;\n  color: #f8f8f8;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/tomorrow-night-blue.css",
    "content": "/* Tomorrow Night Blue Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7285b7;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ff9da4;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #ffc58f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #ffeead;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #d1f1a9;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #99ffff;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #bbdaff;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ebbbff;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #002451;\n  color: white;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/tomorrow-night-bright.css",
    "content": "/* Tomorrow Night Bright Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d54e53;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #e78c45;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #e7c547;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #b9ca4a;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #70c0b1;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #7aa6da;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #c397d8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: black;\n  color: #eaeaea;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/tomorrow-night-eighties.css",
    "content": "/* Tomorrow Night Eighties Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #999999;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f2777a;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99157;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #ffcc66;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #99cc99;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #66cccc;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6699cc;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #cc99cc;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2d2d2d;\n  color: #cccccc;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/tomorrow-night.css",
    "content": "/* Tomorrow Night Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #cc6666;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #de935f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f0c674;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #b5bd68;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #8abeb7;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #81a2be;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b294bb;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1d1f21;\n  color: #c5c8c6;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/tomorrow.css",
    "content": "/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #8e908c;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #c82829;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f5871f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #eab700;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #718c00;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #3e999f;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #4271ae;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #8959a8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/vs.css",
    "content": "/*\n\nVisual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>\n\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.apache .hljs-cbracket {\n  color: #008000;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-built_in,.css\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title,\n.xml .hljs-tag,\n.xml .hljs-tag .hljs-value {\n  color: #00f;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.apache .hljs-tag,\n.hljs-date,\n.tex .hljs-formula,\n.coffeescript .hljs-attribute {\n  color: #a31515;\n}\n\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.hljs-preprocessor,\n.hljs-pragma,\n.userType,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-special,\n.hljs-prompt {\n  color: #2b91af;\n}\n\n.hljs-phpdoc,\n.hljs-javadoc,\n.hljs-xmlDocTag {\n  color: #808080;\n}\n\n.vhdl .hljs-typename { font-weight: bold; }\n.vhdl .hljs-string { color: #666666; }\n.vhdl .hljs-literal { color: #a31515; }\n.vhdl .hljs-attribute { color: #00b0e8; }\n\n.xml .hljs-attribute { color: #f00; }\n"
  },
  {
    "path": "ppt/js/highlight/styles/xcode.css",
    "content": "/*\n\nXCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #006a00;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.nginx .hljs-title {\n  color: #aa0d91;\n}\n.method,\n.hljs-list .hljs-title,\n.hljs-tag .hljs-title,\n.setting .hljs-value,\n.hljs-winutils,\n.tex .hljs-command,\n.http .hljs-title,\n.hljs-request,\n.hljs-status {\n  color: #008;\n}\n\n.hljs-envvar,\n.tex .hljs-special {\n  color: #660;\n}\n\n.hljs-string {\n  color: #c41a16;\n}\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.hljs-regexp {\n  color: #080;\n}\n\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.ini .hljs-title,\n.hljs-shebang,\n.hljs-prompt,\n.hljs-hexcolor,\n.hljs-rules .hljs-value,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-number,\n.css .hljs-function,\n.clojure .hljs-title,\n.clojure .hljs-built_in,\n.hljs-function .hljs-title,\n.coffeescript .hljs-attribute {\n  color: #1c00cf;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.hljs-typename,\n.hljs-tag .hljs-attribute,\n.hljs-doctype,\n.hljs-class .hljs-id,\n.hljs-built_in,\n.setting,\n.hljs-params,\n.clojure .hljs-attribute {\n  color: #5c2699;\n}\n\n.hljs-variable {\n color: #3f6e74;\n}\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.hljs-subst {\n  color: #000;\n}\n\n.css .hljs-class,\n.css .hljs-id {\n  color: #9b703f;\n}\n\n.hljs-value .hljs-important {\n  color: #ff7700;\n  font-weight: bold;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #643820;\n}\n\n.tex .hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  color: #808080;\n  font-weight: bold;\n}\n\n.diff .hljs-change {\n  background-color: #bccff9;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-comment .hljs-yardoctag {\n  font-weight: bold;\n}\n\n.method .hljs-id {\n  color: #000;\n}\n"
  },
  {
    "path": "ppt/js/highlight/styles/zenburn.css",
    "content": "/*\n\nZenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>\nbased on dark.css by Ivan Sagalaev\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #3f3f3f;\n  color: #dcdcdc;\n}\n\n.hljs-keyword,\n.hljs-tag,\n.css .hljs-class,\n.css .hljs-id,\n.lisp .hljs-title,\n.nginx .hljs-title,\n.hljs-request,\n.hljs-status,\n.clojure .hljs-attribute {\n  color: #e3ceab;\n}\n\n.django .hljs-template_tag,\n.django .hljs-variable,\n.django .hljs-filter .hljs-argument {\n  color: #dcdcdc;\n}\n\n.hljs-number,\n.hljs-date {\n  color: #8cd0d3;\n}\n\n.dos .hljs-envvar,\n.dos .hljs-stream,\n.hljs-variable,\n.apache .hljs-sqbracket {\n  color: #efdcbc;\n}\n\n.dos .hljs-flow,\n.diff .hljs-change,\n.python .exception,\n.python .hljs-built_in,\n.hljs-literal,\n.tex .hljs-special {\n  color: #efefaf;\n}\n\n.diff .hljs-chunk,\n.hljs-subst {\n  color: #8f8f8f;\n}\n\n.dos .hljs-keyword,\n.python .hljs-decorator,\n.hljs-title,\n.haskell .hljs-type,\n.diff .hljs-header,\n.ruby .hljs-class .hljs-parent,\n.apache .hljs-tag,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #efef8f;\n}\n\n.dos .hljs-winutils,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-string {\n  color: #dca3a3;\n}\n\n.diff .hljs-deletion,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-javadoc,\n.smalltalk .hljs-class,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.css .hljs-rules .hljs-value,\n.hljs-attr_selector,\n.hljs-pseudo,\n.apache .hljs-cbracket,\n.tex .hljs-formula,\n.coffeescript .hljs-attribute {\n  color: #cc9393;\n}\n\n.hljs-shebang,\n.diff .hljs-addition,\n.hljs-comment,\n.java .hljs-annotation,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype {\n  color: #7f9f7f;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n"
  },
  {
    "path": "ppt/js/img.screenfull.js",
    "content": "(function(window, document) {\n    var sf = function($imgs) {\n        $imgs.forEach(function($img) {\n            $img.addEventListener('click', function() {\n                show(this);\n            }, false);\n        });\n    };\n\n    function show(t) {\n        var img = document.createElement('img');\n        img.src = t.src;\n        img.className = 'transparent';\n        $layer.innerHTML = '';\n        img.onload = function() {\n            img.style.height = this.height + 'px';\n            var top = this.height > $body.clientHeight ? 0 : ($body.clientHeight - this.height) / 2;\n            img.style.top = top + 'px';\n            img.style.marginLeft = -this.width / 2 + 'px';\n            img.classList.remove('transparent');\n            img.onload = null;\n        }\n        img.style.cssText = 'max-height:' + $body.clientHeight + 'px;max-width:' + $body.clientWidth + 'px;';\n        $layer.appendChild(img);\n        $layer.style.display = 'block';\n        setTimeout(function() {\n            $layer.classList.remove('transparent');\n        }, 0);\n\n    };\n    var $layer = document.createElement('div');\n    $layer.className = 'img-full transparent';\n    // $layer.innerHTML = '<img src=\"http://paulmason.name/media/demos/full-screen-background-image/background.jpg\" />';\n    $layer.addEventListener('click', function() {\n        $layer.style.display = 'none';\n        $layer.classList.add('transparent');\n    }, false);\n    var $body = document.body || document.getElementsByTagName('body')[0];\n    $body.appendChild($layer);\n    window.screenfull = sf;\n}(window, document));\n"
  },
  {
    "path": "ppt/js/mixjs/.npmignore",
    "content": "/node_modules\n/.sass-cache\n/tmp\n"
  },
  {
    "path": "ppt/js/mixjs/Gruntfile.js",
    "content": "var concatArr = [\n\t'src/intro.js',\n\t'src/getCurrentScript.js',\n\t'src/vars.js',\n\t'src/typeof.js',\n\t'src/browser.js',\n\t'src/Module.js',\n\t'src/Promise.js',\n\t'src/getPath.js',\n\t'src/loadjs.js',\n\t'src/loadcss-img.js',\n\t'src/core.js',\n\t'src/outro.js'];\nmodule.exports = function(grunt) {\n\tgrunt.initConfig({\n\t\tpkg: grunt.file.readJSON('package.json'),\n\t\tjshint: {\n\t\t\toptions: {\n\t\t\t\tnoarg: true,\n\t\t\t\tnoempty: true,\n\t\t\t\tcurly: true,\n\t\t\t\tasi: true,\n\t\t\t\texpr: true,\n\t\t\t\tbrowser: true,\n\t\t\t\tstrict: true,\n\t\t\t\tunused: true,\n\t\t\t\tundef: true,\n\t\t\t\tloopfunc: false,\n\t\t\t\tsub: true,\n\t\t\t\tboss: true,\n\t\t\t\teqnull: true\n\t\t\t},\n\t\t\tfiles: ['tmp/<%= pkg.name %>.js']\n\t\t},\n\t\twatch: {\n\t\t\tfiles: ['src/*.js'],\n\t\t\ttasks: 'dev'\n\t\t},\n\t\tconcat: {\n\t\t\tMixJS: {\n\t\t\t\toptions: {\n\t\t\t\t\tseparator: '\\n'\n\t\t\t\t},\n\t\t\t\tsrc: concatArr,\n\t\t\t\tdest: 'lib/<%= pkg.name %>.<%= pkg.version %>.js'\n\t\t\t},\n\t\t\tdev: {\n\t\t\t\toptions: {\n\t\t\t\t\tseparator: '\\n'\n\t\t\t\t},\n\t\t\t\tsrc: concatArr,\n\t\t\t\tdest: 'tmp/<%= pkg.name %>.js'\n\t\t\t}\n\t\t},\n\t\tuglify: {\n\t\t\toptions: {\n\t\t\t\tsourceMap: 'lib/<%= pkg.name %>.<%= pkg.version %>.map',\n\t\t\t\tbanner: '/*! <%= pkg.name %> <%= pkg.version %> <%= grunt.template.today(\"yyyy-mm-dd\") %> by <%= pkg.author %> */\\n'\n\t\t\t},\n\t\t\tdist: {\n\t\t\t\tsrc: '<%= concat.MixJS.dest %>',\n\t\t\t\tdest: 'lib/<%= pkg.name %>.<%= pkg.version %>.min.js'\n\t\t\t}\n\t\t},\n\t\tcompress: {\n\t\t\tmain: {\n\t\t\t\toptions: {\n\t\t\t\t\tarchive: '<%= pkg.name %>.zip'\n\t\t\t\t},\n\t\t\t\tfiles: [{\n\t\t\t\t\texpand: true,\n\t\t\t\t\tcwd: 'lib',\n\t\t\t\t\tsrc: ['**'],\n\t\t\t\t\tfilter: 'isFile'\n\t\t\t\t}]\n\t\t\t}\n\t\t}\n\t});\n\n\t// grunt.loadNpmTasks('grunt-regarde');\n\tgrunt.loadNpmTasks('grunt-contrib-uglify');\n\tgrunt.loadNpmTasks('grunt-contrib-jshint');\n\tgrunt.loadNpmTasks('grunt-contrib-watch');\n\tgrunt.loadNpmTasks('grunt-contrib-concat');\n\tgrunt.loadNpmTasks('grunt-contrib-compress');\n\t\n\tgrunt.registerTask('build', ['concat:MixJS', 'uglify']);\n\tgrunt.registerTask('dev', ['concat:dev', 'jshint']);\n\t\n};"
  },
  {
    "path": "ppt/js/mixjs/MIT-LICENSE.txt",
    "content": "Copyright 2013 Theowang http://js8.in\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "ppt/js/mixjs/README.md",
    "content": "MixJS - Just Another Javascript Module Loader\n=============    \n                                                                                                \n    MMMMMMMM               MMMMMMMM  iiii                             JJJJJJJJJJJ   SSSSSSSSSSSSSSS \n    M:::::::M             M:::::::M i::::i                            J:::::::::J SS:::::::::::::::S\n    M::::::::M           M::::::::M  iiii                             J:::::::::JS:::::SSSSSS::::::S\n    M:::::::::M         M:::::::::M                                   JJ:::::::JJS:::::S     SSSSSSS\n    M::::::::::M       M::::::::::Miiiiiii xxxxxxx      xxxxxxx         J:::::J  S:::::S            \n    M:::::::::::M     M:::::::::::Mi:::::i  x:::::x    x:::::x          J:::::J  S:::::S            \n    M:::::::M::::M   M::::M:::::::M i::::i   x:::::x  x:::::x           J:::::J   S::::SSSS         \n    M::::::M M::::M M::::M M::::::M i::::i    x:::::xx:::::x            J:::::j    SS::::::SSSSS    \n    M::::::M  M::::M::::M  M::::::M i::::i     x::::::::::x             J:::::J      SSS::::::::SS  \n    M::::::M   M:::::::M   M::::::M i::::i      x::::::::x  JJJJJJJ     J:::::J         SSSSSS::::S \n    M::::::M    M:::::M    M::::::M i::::i      x::::::::x  J:::::J     J:::::J              S:::::S\n    M::::::M     MMMMM     M::::::M i::::i     x::::::::::x J::::::J   J::::::J              S:::::S\n    M::::::M               M::::::Mi::::::i   x:::::xx:::::xJ:::::::JJJ:::::::J  SSSSSSS     S:::::S\n    M::::::M               M::::::Mi::::::i  x:::::x  x:::::xJJ:::::::::::::JJ   S::::::SSSSSS:::::S\n    M::::::M               M::::::Mi::::::i x:::::x    x:::::x JJ:::::::::JJ     S:::::::::::::::SS \n    MMMMMMMM               MMMMMMMMiiiiiiiixxxxxxx      xxxxxxx  JJJJJJJJJ        SSSSSSSSSSSSSSS   \n\nversion: 0.3.0 butterfly\n\nCome back soon!!\n"
  },
  {
    "path": "ppt/js/mixjs/lib/event/broadcast.js",
    "content": "/**\n * 广播事件处理\n * 状态：稳定\n * \n * 目标: 为了尽可能的减少模块之间业务逻辑的耦合度, 而开发了这个eventbus, 主要用于业务逻辑的事件传递\n * 使用规范: 每个js模块尽可能通过事件去通信, 减少模块之间的直接调用和依赖(耦合)\n * 使用示例：\n *     //触发\n *     MixJS.event.broadcast.fire('abc',{abc:1}) \n *     //订阅\n *     MixJS.event.broadcast.on('abc',function(a){\n *         console.log(a);\n *     }, scope);\n    \n * @return {[type]} \n * @author  theowang\n * $Id: broadcast.js 65871 2012-11-05 01:51:42Z theowang $\n */\nMixJS.define('event/broadcast',function($){\n    var _cache = {};\n    var broadcast = {\n        \n        /**\n         * 派发         \n         * @param  {[type]} type 事件类型\n         * @param  {[type]} data 回调数据\n         * @return {[type]}      [description]\n         */\n        fire:function(type, data){\n            var listeners = _cache[type],len = 0;\n            if(!$.isUndefined(listeners)){\n                var args = [].slice.call(arguments, 0);\n                args = args.length > 2 ? args.splice(2, args.length-1) : [];\n                args = [data].concat(args);\n\n                len = listeners.length;\n                for(var i = 0; i<len;i++){\n                    var listener = listeners[i];\n                    if(listener && listener.callback) {\n                        args = args.concat(listener.args);\n                        listener.callback.apply(listener.scope, args);\n                    }\n                }\n            }\n            return this;\n        },\n        /**\n         * 订阅广播事件\n         * @param  {[type]}   types     事件类型，支持,分隔符\n         * @param  {Function} callback 回调函数\n         * @param  {[type]}   scope    回调函数上下文\n         * @return {[type]}            this\n         */\n        on:function(types, callback, scope){\n            types = types || [];\n            var args = [].slice.call(arguments);\n\n            if($.isString(types)){\n                types = types.split(',');\n            }\n            var len = types.length;\n            if(len===0){\n                return this;\n            }\n            args = args.length > 3 ? args.splice(3, args.length-1) : [];\n            for(var i = 0;i<len;i++){\n                var type = types[i];\n                _cache[type] = _cache[type] || [];\n                _cache[type].push({callback:callback,scope:scope,args:args});\n            }\n            return this;\n        },\n        /**\n         * 退订\n         * @param  {[type]}   type     [description]\n         * @param  {Function} callback 假如传入则移出传入的监控事件，否则移出全部\n         * @return {[type]}            [description]\n         */\n        un:function(type, callback, scope){\n            var listeners = _cache[type];\n            if (!listeners) {\n                return this;\n            }\n            if(callback){\n                var len = listeners.length,\n                    tmp = [];\n                \n                for(var i=0; i<len; i++) {\n                    var listener = listeners[i];\n                    if(listener.callback == callback && listener.scope == scope) {\n                    } else {\n                        tmp.push(listener);\n                    }\n                }\n                listeners = tmp;\n            }else{\n                listeners.length = 0;\n            }\n            return this;\n        },\n        \n        \n        removeAll:function(){\n            _cache = {};\n            return this;\n        }\n    };\n    return broadcast;\n});"
  },
  {
    "path": "ppt/js/mixjs/lib/event/wait.js",
    "content": "/**\n * 一个简单的事件流处理\n * 状态：稳定\n * 支持多投事件，支持异步回调处理\n * 使用示例：\n * \t\tvar a = MixJS.event.wait();\n *   \ta.on('a,b,c', function(a,b,c){\n *   \t\talert('success');\n *   \t});\n *   \t$.post(url,data, function(res){\n *   \t\ta.fire('a', res);\n *   \t});\n *   \t$.get(url, function(json){\n *   \t\ta.fire('b', json)\n *   \t})\n *   \tsetTimeout(function(){\n *   \t\ta.fire('c')\n *   \t},1000);\n */\nMixJS.define('event/wait', function($) {\n\tvar _emptyFn = function() {};\n\tvar now = +new Date;\n\n\tfunction getUUid() {\n\t\treturn 'Theo' + (now++);\n\t}\n\t// var _emptyArr = [];\n\n\n\tfunction Wait() {\n\t\t// 强制使用new操作符\n\t\tif(!(this instanceof Wait)) {\n\t\t\treturn new Wait();\n\t\t}\n\t\tthis.init();\n\t}\n\n\tWait.prototype = {\n\t\tconstructor: Wait,\n\t\tinit:function(){\n\t\t\tthis.list = {}; //evt=>uuid array\n\t\t\tthis.cbMap = {}; //uuid=>callback\n\t\t\tthis.uuid2Evts = {}; //uuid=>evt array\n\t\t\tthis._cbMap = {}; //callback=>uuid\n\t\t},\n\t\t/**\n\t\t * 绑定事件\n\t\t * @param  {Array}   evts     事件数组\n\t\t * @param  {Function} callback 回调函数\n\t\t * @param  {Object}   scope    函数作用域\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\ton: function(evts, callback, scope) {\n\t\t\tif(!$.isFunction(callback) || !evts) {\n\t\t\t\t//如果不是函数，或者evts为空，则直接返回\n\t\t\t\t//不抛出异常\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tscope = scope || null; //回调作用域\n\t\t\t\n\t\t\tevts = $.isArray(evts) ? evts : evts.split(',');\n\n\t\t\tvar uuid = getUUid();\n\t\t\tthis.cbMap[uuid] = {\n\t\t\t\tfn: callback,\n\t\t\t\tscope: scope\n\t\t\t};\n\t\t\tthis._cbMap[callback] = uuid;\n\n\t\t\t$.each(evts, function(e, i) {\n\t\t\t\tthis.list[e] = this.list[e] || {\n\t\t\t\t\thandlers: [],\n\t\t\t\t\t//待处理的uuid\n\t\t\t\t\tdata: '',\n\t\t\t\t\tstate: 0\n\t\t\t\t};\n\n\t\t\t\t(this.uuid2Evts[uuid] = this.uuid2Evts[uuid] || []).push(e);\n\n\t\t\t\tthis.list[e].handlers.push(uuid); //使用uuid记录\n\t\t\t}, this)\n\n\n\t\t\treturn this;\n\t\t},\n\t\t_findCanCallbacks: function(arr) {\n\t\t\tvar back = [];\n\t\t\tfor(var i = 0, len = arr.length; i < len; i++) {\n\t\t\t\tvar uuid = arr[i];\n\t\t\t\tvar evts = this.uuid2Evts[uuid];\n\t\t\t\tvar doit = true;\n\t\t\t\tvar args = [];\n\t\t\t\tfor(var j = 0, l = evts.length; j < l; j++) {\n\t\t\t\t\tvar tmp = this.list[evts[j]];\n\t\t\t\t\tif(tmp.state === 0) {\n\t\t\t\t\t\tdoit = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\targs.push(tmp.data);\n\t\t\t\t}\n\t\t\t\tif(doit) {\n\t\t\t\t\tthis.cbMap[uuid].args = args;\n\t\t\t\t\tback.push(this.cbMap[uuid]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn back;\n\t\t},\n\t\t/**\n\t\t * 触发事件\n\t\t * @param  {String} evt  事件类型\n\t\t * @param  {[type]} data 事件数据\n\t\t * @return {[type]}      this\n\t\t */\n\t\tfire: function(evt, data) {\n\t\t\tvar list = this.list[evt];\n\t\t\tif(!list) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tlist.state = 1; //标注为可以fire\n\t\t\tlist.data = data || '';\n\t\t\tvar handlers = list.handlers;\n\t\t\thandlers = this._findCanCallbacks(handlers);\n\t\t\twhile(handlers[0]) {\n\t\t\t\tvar cb = handlers.shift();\n\n\t\t\t\tvar scope = cb.scope;\n\t\t\t\tvar args = cb.args;\n\n\t\t\t\tcb.fn.apply(scope, args)\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\t\t/**\n\t\t * 移出绑定事件\n\t\t * @param  {String}   evt      事件名称\n\t\t * @param  {Function} callback 回调函数\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\tun: function(evt, callback) {\n\t\t\tif($.isUndefined(evt) || !$.isFunction(callback)) {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tvar list = this.list[evt];\n\t\t\tif(!list) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tvar uuid = this._cbMap[callback];\n\t\t\tvar handlers = list.handlers;\n\t\t\tvar len = handlers.length;\n\n\t\t\twhile(len--) {\n\t\t\t\tif(uuid === handlers[len]) {\n\t\t\t\t\thandlers.splice(len, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this._cbMap[callback];\n\n\t\t\treturn this;\n\t\t},\n\t\t/**\n\t\t * 移出所有事件，重新初始化\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tremoveAll:function(){\n\t\t\tthis.destroy();\n\n\t\t\tthis.init();\n\t\t},\n\t\t/**\n\t\t * 销毁！\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tdestroy: function() {\n\t\t\tdestroy(this);\n\t\t}\n\t}\n\n\tfunction destroy(obj) {\n\t\tvar selfFn = arguments.callee;\n\t\tfor(var a in obj) {\n\t\t\tif(obj.hasOwnProperty(a)) {\n\t\t\t\tif($.isArray(obj[a])) {\n\t\t\t\t\tobj[a].length = 0;\n\t\t\t\t} else if(typeof obj[a] === 'object') {\n\t\t\t\t\tselfFn(obj[a]);\n\t\t\t\t}\n\t\t\t\tdelete obj[a];\n\t\t\t}\n\t\t}\n\t}\n\treturn function() {\n\t\treturn new Wait;\n\t}\n})"
  },
  {
    "path": "ppt/js/mixjs/lib/mix-0.2.js",
    "content": ";(function(global, DOC, undefined) {\n    var VERSION = '0.2',\n        curScriptNode = (function(scripts, node) {\n            scripts = DOC.getElementsByTagName('script');\n            node = scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n            return node;\n        })(),\n        isDebug = !! curScriptNode.getAttribute('debug'),\n        MixJSName = curScriptNode.getAttribute('name') || 'MixJS',\n        CHARSET = curScriptNode.getAttribute('charset') || 'utf-8',\n\n        //获取当前文件父路径\n        PATH = (function(node) {\n            var url = node.hasAttribute ? // non-IE6/7\n            node.src :\n            // see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx\n            node.getAttribute('src', 4);\n            return url.substr(0, url.lastIndexOf('/')) + '/';\n        })(curScriptNode),\n        HEAD = DOC.head || DOC.getElementsByTagName('head')[0] || DOC.documentElement,\n        BASEELEMENT = HEAD.getElementsByTagName('base')[0] || null,\n        UA = navigator.userAgent,\n        isWebKit = ~UA.indexOf('AppleWebKit'),\n\n        reg = /[^, ]+/g,\n\n        _cleanObj = {},\n        _emptyArr = [],\n        _emptyFn = function() {},\n        _arrSlice = _emptyArr.slice,\n        /**\n         * 数组遍历\n         * @param  {[type]}   arr      [description]\n         * @param  {Function} callback [description] arrvalue index arr\n         * @param  {[type]}   scope    [description]\n         * @return {[type]}            [description]\n         */\n        each = [].forEach ?\n            function(arr, callback, scope) {\n                [].forEach.call(arr, callback, scope);\n            } : function(arr, callback, scope) {\n                for(var i = 0, len = arr.length; i < len; i++) {\n                    if(i in arr) {\n                        callback.call(scope, arr[i], i, arr);\n                    }\n                }\n            };\n\n    var config = {\n            path: PATH,\n            perload: _emptyArr,\n            //预先加载库\n            debug: isDebug,\n            charset: CHARSET\n        },\n        alias = {},\n        regAlias = /^[-\\w\\d_$]{2,}$/i,\n        _moduleDepsMap = {},\n        _filesMap = {},\n        //1:加载之前，2:加载中，3:加载完成\n        _modulesMap = {}; //1：定义之前 2：等待依赖关系中 3：定义完成\n    var $ = {\n        VERSION: VERSION,\n        path:PATH,\n        /**\n         * 别名机制\n         * @param  {String} name 名字\n         * @param  {String} realpath  别名真实url\n         * @return {[type]}      [description]\n         */\n        alias: function(name,arr){\n            if(regAlias.test(name)){\n                if($.isUndefined(arr)){\n                    return alias[name];\n                }else{\n                    arr = String(arr);\n                    alias[name] = arr;\n                    return this;\n                }\n\n            }else{\n                throw new Error('MixJS.alias name 格式错误');\n            }\n            return this;\n        },\n        use: function(names, callback) {\n            names = dealArr(names);\n            if(names.length === 0) {\n                $.isFunction(callback) && callback();\n                return this;\n            }\n            var temp = [], self = this;\n            each(names, function(v) {\n                var arr = getPath(v),\n                    ext = arr[1],\n                    moduleId = arr[2],\n                    url = arr[0];\n                    \n                if(!defined(moduleId) || (ext==='css' && _filesMap[url]===3)) {\n                    temp.push(moduleId);\n                    \n                   \n                    var cb = function() {\n                        //_modulesMap[v] = 3;\n                        _filesMap[url] = 3;\n                        temp.pop();\n\n                        if(temp.length === 0) {\n                            var t = function() {\n                                    \n                                    if(defined(moduleId) || ext==='css') {\n\n                                        $.isFunction(callback) && callback(self);\n\n                                    } else {\n                                        var q = Queue.useCallback[moduleId];\n                                        q = q ? q : (Queue.useCallback[moduleId] = new Queue(moduleId));\n                                        // console.log(q);\n                                        q.push(arguments.callee);\n\n                                    }\n                                }\n                            t();\n                            temp = null;\n                        }\n                    };\n                    // console.log(arr);\n                    ext==='css'?loadCSS(url,cb):loadJS(url, cb);\n                }\n\n            });\n            return this;\n        },\n        define: function(name, deps, factory) {\n            if(!$.isString(name)) {\n                throw new Error('MixJS.define: name 必须为字符串');\n            }\n            if($.isFunction(deps)) {\n                factory = deps;\n                deps = _emptyArr;\n            } else {\n                deps = dealArr(deps, 'define', name);\n            }\n\n            _moduleDepsMap[name] = deps;\n\n            new Module(name, deps, factory)\n            return this;\n        },\n        config: function(cfg) {\n\n            config = mix(config, cfg);\n            return this;\n        },\n        loadJS:loadJS,\n        loadCSS:loadCSS,\n        defined: defined,\n        loaded: function(file) {\n            var url = getPath(file)[0];\n            return loaded(url);\n        },\n        mix: mix,\n        each: each,\n        noConflict:function(){\n            return this;\n        }\n    };\n\n\n\n    //基本类型判断\n    'Function,String,Array,Number'.replace(reg, function(t) {\n        $['is' + t] = function(s) {\n            return isType(s, t)\n        }\n    });\n\n    if(typeof(/./) !== 'function') {\n        $.isFunction = function(obj) {\n            return typeof obj === 'function';\n        };\n    }   \n\n\n    $.isBoolean = function(obj) {\n        return obj === true || obj === false || isType(obj,'Boolean')\n    };\n\n    $.isUndefined = function(obj) {\n        return obj === undefined;\n        //return obj === void 0;\n    };\n\n\n    //释放到window\n    global[MixJSName] = $;\n    MixJSName !== 'MixJS' && (global.MixJS = $);\n\n    /**\n     * 判断模块是否定义\n     * @param  {[type]} module [description]\n     * @return {[type]}        [description]\n     */\n\n    function defined(module) {\n\n        return _modulesMap[module] === 3;\n    }\n    /**\n     * 判断文件是否加载\n     * @param  {[type]} file [description]\n     * @return {[type]}      [description]\n     */\n\n    function loaded(file) {\n\n        return _filesMap[file] === 3;\n    }\n\n\n    /**\n     * 数组去重复项和去除空项\n     * @param  {[type]} arr [description]\n     * @return {[type]}     [description]\n     */\n\n    function dealArr(arr, isFromDefine, mName) {\n        arr = String(arr).split(',');\n        var len = arr.length;\n        if(len === 0) {\n            return arr[0] === '' ? _emptyArr : arr;\n        }\n        var back = [],\n            obj = {},\n            val;\n        for(var i = 0; i < len; i++) {\n            val = arr[i];\n\n            if(val !== '' && !obj[val]) {\n                obj[val] = 1;\n                back.push(val);\n\n                isFromDefine === 'define' && (Module.parentModule[val] = mName); //定义父模块               \n            }\n        }\n        obj = null;\n        return back;\n    }\n\n\n    /**\n     * 检测依赖关系是否都加载完成\n     * _moduleDepsMap = {\n     *     test.a:[a,b,c]\n     *     a:[d,e]\n     * }\n     * @return {[type]} [description]\n     */\n\n    function checkDeps(module) {\n        var arr = _moduleDepsMap[module];\n        \n        if(!arr || arr.length===0) {\n            return true;\n        }\n        var obj = {},\n            back = true;\n\n        for(var i = 0, len = arr.length; i < len; i++) {\n            var m = arr[i];\n            \n            if(m===module){\n                throw new Error(module + '： 发现循环依赖');\n            }\n            if(obj[m] === 1) {\n                //简单去重，不能保证二次依赖去重复\n                continue;\n            }\n            \n            if(regAlias.test(m) && alias[m]){\n                //如果是alias模块\n                if(loaded(alias[m])){\n                    obj[m] = 1;\n                    continue;\n                }\n                back = false;\n                break;\n            }\n            \n            if(regISCSS.test(m)){\n                //如果是css文件\n                if(loaded(getPath(m)[0])){\n                    obj[m] = 1;\n                    continue;\n                }\n                back = false;\n                break;             \n            }\n\n            var temp = _moduleDepsMap[m];\n\n            if(temp && !(back = checkDeps(m))) {\n\n                break;\n\n            } else if(!defined(m)) {\n                back = false;\n                break;\n            } else {\n                obj[m] = 1;\n            }\n        }\n        obj = null;\n        return back;\n    }\n\n    var _waitModule = {}; //等待转正的module实例\n    /**\n     * 模块类\n     * @param {[type]} id    模块名称\n     * @param {Array} deps  依赖模块\n     * @param {[type]} maker 制造函数\n     * @param {[type]} root  父模块，默认是MixJS\n     */\n\n    function Module(id, deps, maker, root) {\n\n        this.id = id;\n        this.deps = deps; //必须是数组\n        this.maker = maker;\n        this.root = root || $;\n        // _modulesMap[id] = 1;//定义之前\n        // this.queue = new Queue();\n        if(checkDeps(id)) {\n\n            this.namespace();\n\n        } else {\n\n            this.init();\n        }\n    }\n    Module.parentModule = {};\n    Module.prototype.init = function() {\n        _waitModule[this.id] = this;\n        var self = this;\n        $.use(this.deps, function() {\n            self.namespace();\n        })\n    }\n    Module.prototype.destroy = function() {\n        for(var a in this) {\n            if(this.hasOwnProperty(a)) {\n                delete this[a];\n            }\n        }\n    }\n    Module.prototype.namespace = function() {\n        if(!this.id) {\n            return;\n        }\n        // _modulesMap[this.id] = 2;//定义等待中，可能因为依赖关系没有加载而处于等待中\n        if(!checkDeps(this.id)) {\n\n            return;\n        }\n\n        var names = this.id.split('/'),\n            root = this.root;\n\n        var name;\n        while(name = names.shift()) {\n            if(names.length) {\n                // console.log(root);            \n                root = (root[name] = root[name] || {});\n            } else {\n                if($.isUndefined(root[name])) {\n\n                    try {\n                        var f = $.isFunction(this.maker) && this.maker(this.root);\n                        if(f) {\n\n                            f['@GOD'] = 'THEO'; //加个尾巴~\n                            root[name] = f;\n                            _modulesMap[this.id] = 3;\n\n                        }\n                    } catch(e) {\n                        // Module._definedModulesMap[this.id] = 2;//模块定义可能出错了\n                        throw new Error('Module.namespace error:id=>' + this.id + ',info=>' + e.message);\n                    }\n                }\n            }\n        }\n        var parent = Module.parentModule[this.id];\n        if(parent && _waitModule[parent]) {\n            _waitModule[parent].namespace();\n        }\n        var q = Queue.useCallback[this.id];\n        if(q) {\n            q.fire();\n        }\n\n        delete _waitModule[this.id];\n        this.destroy();\n    }\n\n    var regProtocol = /^(\\w+)(\\d)?:.*/,\n        //协议\n        regISJS = /\\.js$/i,\n        //是否为js\n        regISCSS = /\\.css$/i,\n        //是否为css\n        regRelative = /\\.\\.\\//g,\n        //相对路径处理\n        regEXT = /\\.(\\w+)$/; //后缀2~4\n    /**\n     * 获取真实url\n     * 来自massframework\n     * @param  {[type]} url [description]\n     * @return {[type]}     [description]\n     */\n\n    function getPath(url, root) {\n        var ret;\n\n        root = root || config.path;\n        root = root.substr(0, root.lastIndexOf('/'));\n        id = url;//模块id\n\n        if(regAlias.test(url) && alias[url]){\n            ret = alias[url];\n\n        }else if(regProtocol.test(url)) { //如果用户路径包含协议\n            ret = url;\n        } else {\n            var tmp = url.charAt(0),\n                _2 = url.slice(0, 2);\n\n            if(tmp !== '.' && tmp !== '/') { //相对于根路径\n                ret = root + '/' + url;\n            } else if(_2 === './') { //相对于兄弟路径\n                id = url.substr(2);\n                ret = root + '/' + id;\n            } else if(_2 === '..') { //相对于父路径\n                // var arr = root.replace(/\\/$/, '').split('/');\n                var arr = root.split('/');\n                regRelative.lastIndex = 0;\n                tmp = url.replace(regRelative, function() {\n                    arr.pop();\n                    return '';\n                });\n                id = tmp;\n                ret = arr.join('/') + '/' + tmp;\n            }\n        }\n\n        var ext = 'js'; //默认是js文件\n        tmp = ret.replace(/[?#].*/, '');\n        if(regEXT.test(tmp)) {\n            ext = RegExp.$1;\n        }\n        if(ext !== 'css' && tmp === ret && !regISJS.test(ret)) { //如果没有后缀名会补上.js\n            ret += '.js';\n        }\n        return [ret, ext, id];\n    }\n\n    /**\n     * 一个简单队列\n     * @param {[type]} id [description]\n     */\n\n    function Queue(id) {\n        this.id = id;\n        this.taskList = [];\n    }\n    Queue.useCallback = {}; //放置use使用的callback\n    /**\n     * 从后部推入\n     * @param  {Function} fn    [description]\n     * @param  {[type]}   args  [description]\n     * @param  {[type]}   scope [description]\n     * @return {[type]}         [description]\n     */\n    Queue.prototype.push = function(fn, args, scope) {\n        return this._add(fn, args, scope, 'push');\n    }\n    Queue.prototype.unshift = function(fn, args, scope) {\n        return this._add(fn, args, scope, 'unshift');\n    }\n    Queue.prototype._add = function(fn, args, scope, type) {\n        if(!type) {\n            return this;\n        }\n        args = _arrSlice.call(arguments, 0, -1);\n        if(args.length === 0) {\n            return this;\n        }\n\n        this.taskList[type](args);\n        return this;\n    }\n    /**\n     * 从后部弹出\n     * @return {[type]} [description]\n     */\n    Queue.prototype.fire = function() {\n        if(this._canIDo()) {\n            var fn = this.taskList.pop();\n\n            var args = $.isArray(fn[1]) ? fn[1] : [],\n                scope = fn[2] || null;\n            fn = fn[0];\n\n            // argsFromCall = $.isArray(argsFromCall)?argsFromCall:[argsFromCall];\n            // args = args.concat(argsFromCall);\n            $.isFunction(fn) && fn.apply(scope, args);\n            this.destroy();\n        }\n        return this;\n    }\n    Queue.prototype.destroy = function() {\n\n\n        this.taskList.length = 0;\n        delete this.taskList;\n        delete Queue.useCallback[this.id]; //记得用完要销毁罪证哦~\n        delete this.id;\n        // delete Queue.modules[this.moduleName];\n    }\n    Queue.prototype._canIDo = function() {\n        return this.taskList.length !== 0;\n    }\n\n\n\n    /**\n     * 加载js\n     * @param  {[type]}   url      [description]\n     * @param  {Function} callback [description]\n     * @param  {[type]}   fail     [description]\n     * @param  {[type]}   charset  [description]\n     * @return {[type]}            [description]\n     */\n\n    function loadJS(url, callback, fail, charset) {\n        var node = DOC.createElement('script');\n        var args = _arrSlice.call(arguments, 0);\n        if($.isString(fail) && args.length === 3) {\n            //如果fail为字符串，认为是charset\n            charset = fail;\n        } else if(args.length === 4 && $.isString(charset)) {\n\n        } else {\n            charset = config.charset;\n        }\n        $.isFunction(callback) && jsCallback(node, callback, fail);\n\n        node.charset = charset;\n        node.async = true;\n        node.src = url;\n        HEAD.insertBefore(node, BASEELEMENT);\n        return $;\n    }\n\n    //jscallback检测\n    var regJSLOAD = /loaded|complete|undefined/;\n\n    function jsCallback(node, callback, fail) {\n\n        if($.isFunction(fail)) {\n            node.onerror = jsGetCallback(node, fail);\n            node.onload = node.onreadystatechange = jsGetCallback(node, callback);\n        } else {\n            node.onload = node.onerror = node.onreadystatechange = jsGetCallback(node, callback);\n        }\n\n    }\n    //js可以检测error，所以加上了这个函数\n\n    function jsGetCallback(node, cb) {\n        return function(e) {\n            e = e || global.event;\n            \n            if(e.type === 'load' || regJSLOAD.test(node.readyState)) {\n                \n                //确保执行一次+内存回收\n                node.onload = node.onerror = node.onreadystatechange = null\n\n                if(node.parentNode && !config.debug) {\n                    HEAD.removeChild(node)\n                }\n            \n                node = undefined\n\n                cb()\n            }\n        }\n\n    }\n    /**\n     * 加载css文件\n     * @param  {[type]}   url      [description]\n     * @param  {Function} callback [description]\n     * @return {[type]}            [description]\n     */\n\n    function loadCSS(url, callback, fail) {\n        var node = DOC.createElement('link');\n        node.rel = 'stylesheet';\n        node.type = \"text/css\";\n\n        cssCallback(node, callback, fail);\n\n        node.href = url;\n        HEAD.insertBefore(node, BASEELEMENT);\n        return $;\n    }\n    ///===============>css load检测来自seajs\n    // `onload` event is supported in WebKit since 535.23\n    // Ref:\n    //  - https://bugs.webkit.org/show_activity.cgi?id=38995\n    var isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n\n    // `onload/onerror` event is supported since Firefox 9.0\n    // Ref:\n    //  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n    //  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\n    var isOldFirefox = UA.indexOf('Firefox') > 0 && !('onload' in DOC.createElement('link'));\n    var cssCallback = (isOldWebKit || isOldFirefox) ?\n    function(node, callback, fail) {\n        $.isFunction(callback) && \n        setTimeout(function() {\n            poll(node, callback)\n        }, 1) // Begin after node insertion\n    } : function(node, callback, fail) {\n        $.isFunction(callback) && (node.onload = function() {\n            node.onload = node.onerror = null\n            node = undefined\n            callback()\n        });\n        $.isFunction(fail) && (node.onerror = function(){\n            node.onload = node.onerror = null\n            node = undefined\n            fail()\n        });\n    }\n\n    function poll(node, callback) {\n        var isLoaded\n\n        // for WebKit < 536\n        if(isOldWebKit) {\n            if(node.sheet) {\n                isLoaded = true\n            }\n        }\n        // for Firefox < 9.0\n        else if(node.sheet) {\n            try {\n                if(node.sheet.cssRules) {\n                    isLoaded = true\n                }\n            } catch(ex) {\n                // The value of `ex.name` is changed from\n                // 'NS_ERROR_DOM_SECURITY_ERR' to 'SecurityError' since Firefox 13.0\n                // But Firefox is less than 9.0 in here, So it is ok to just rely on\n                // 'NS_ERROR_DOM_SECURITY_ERR'\n                if(ex.name === 'NS_ERROR_DOM_SECURITY_ERR') {\n                    isLoaded = true\n                }\n            }\n        }\n\n        setTimeout(function() {\n            if(isLoaded) {\n                // Place callback in here due to giving time for style rendering.\n                callback()\n            } else {\n                poll(node, callback)\n            }\n        }, 1)\n    }\n\n    /**\n     * 获取类型\n     * @param  {[type]} obj 要判断的对象\n     * @return {String}     返回类型\n     */\n\n    function isType(obj, type) {\n        return _cleanObj.toString.call(obj).slice(8, -1) === type;\n    }\n\n    /**\n     * 糅杂\n     * @param {Object} target 原有的默认\n     * @param {Object} source 第三方来源\n     */\n\n    function mix(target, source) {\n        var args = _arrSlice.call(arguments),\n            i = 1,\n            key, self = arguments.callee,\n            //如果最后参数是布尔，判定是否覆写同名属性\n            ride = $.isBoolean(args[args.length - 1]) ? args.pop() : true;\n        if(args.length === 1) {\n            target = !this.window ? this : _cleanObj;\n            i = 0;\n        }\n\n        while((source = args[i++])) {\n            //source = [{a:1},{b:3}];\n            if($.isArray(source)) {\n                for(var n = 0, len = source.length; n < len; n++) {\n                    self(target, source[n], ride);\n                }\n\n                continue;\n            }\n            //杂糅只允许对象\n            for(key in source) {\n                if(ride || !(key in target)) {\n                    target[key] = source[key];\n                }\n            }\n        }\n        return target;\n    }\n}(window, document));"
  },
  {
    "path": "ppt/js/mixjs/lib/mix.0.3.0.js",
    "content": "(function(window, undefined) {\n'use strict';\nvar document = window.document;\nvar setTimeout = window.setTimeout;\n//本js文件不支持defer等属性，否则计算当前路径会错误\n//模块加载的东西，基础js肯定不能defer掉……\nvar curScriptNode = (function() {\n    var scripts = document.getElementsByTagName('script');\n    return scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n})();\nvar VERSION = 'MixJS 0.3 butterfly';\nvar emptyFn = function() {};\nvar cleanObj = {};\nvar emptyArr = [];\nvar head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;\nvar base = head.getElementsByTagName('base')[0] || null;\nvar arrSlice = emptyArr.slice;\n\n//获取当前文件父路径\nvar PATH = (function(node) {\n    var url = node.hasAttribute ? node.src : node.getAttribute('src', 4);\n    return url.substr(0, url.lastIndexOf('/')) + '/';\n})(curScriptNode);\n\n//是否为js\nvar regIsJS = /\\.js$/i;\n//是否为css\nvar regIsCSS = /\\.css$/i;\n//alias\nvar regAlias = /^[-\\w\\d_$]{2,}$/i;\nvar $ = {};\n\nvar defaultConfig = {\n    timeout: 2E4, //超时时间二十秒\n    baseURL: PATH,\n    charset: 'utf-8'\n};\n\n//=============>maps\n//别名列表\nvar mapAlias = {};\n//加载完的文件列表\nvar mapLoaded = {};\n//已经定义模块的状态表：undefined|pending|defined\nvar mapDefined = {};\n//通过依赖找上一级模块的promise\nvar mapDeps2ModulePromise = {};\n//基本类型判断\n'Function,String,Array,Number'.replace(/[^, ]+/g, function(t) {\n    $['is' + t] = function(s) {\n        return isType(s, t);\n    }\n});\nif (typeof(/./) !== 'function') {\n    $.isFunction = function(obj) {\n        return typeof obj === 'function';\n    };\n}\n$.isObject = function(obj) {\n    return typeof obj === 'object';\n}\n\n$.isBoolean = function(obj) {\n    return obj === true || obj === false || isType(obj, 'Boolean');\n};\n\n$.isUndefined = function(obj) {\n    return obj === undefined;\n};\n\n/**\n * 获取类型\n * @param  {Object} obj 要判断的对象\n * @return {String}     返回类型\n */\n\nfunction isType(obj, type) {\n    return cleanObj.toString.call(obj).slice(8, -1) === type;\n}\nvar UA = window.navigator.userAgent;\n\n/**\n * Module类\n * @param {String} id      moduleID\n * @param {Array} deps    依赖模块\n * @param {Function} factory 工厂函数\n * @param {Object} root    相对定义的root\n */\n\nfunction Module(id, deps, factory, root) {\n    if (arguments.length === 0) {\n        throw new Error('Module: I need a agrument');\n    }\n    if ($.isFunction(id)) {\n        factory = id;\n        id = undefined;\n        deps = emptyArr;\n    } else if ($.isArray(id)) {\n        deps = emptyArr;\n        id = undefined;\n    } else if ($.isFunction(deps)) {\n        factory = deps;\n        deps = emptyArr;\n    }\n    this.id = id ? getPath(id)[2] : id;\n    this.status = 'uninitialized';\n    if ($.isString(deps)) {\n        deps = deps.split(',');\n    }\n    this.dependencies = deps;\n    this.factory = factory;\n    this.root = root || _; //默认挂靠在window全局，使用_，默认挂靠到MixJS上\n    this.undef = []; //没有定义的模块\n    this.id && (mapDefined[this.id] = 'uninitialized');\n    this.checkDependencies(deps);\n    this.define();\n}\nModule.prototype = {\n    constructor: Module,\n    //定义\n    define: function() {\n        if (this.canDefine()) {\n            this.namespace();\n        } else if (this.status !== 'pending') {\n            this.status = 'pending';\n            this.id && (mapDefined[this.id] = this.status);\n            this.loadDeps();\n        }\n    },\n    //命名空间\n    namespace: function() {\n        var names = $.isString(this.id) ? this.id.split('/') : emptyArr;\n        var root = this.root;\n        var name, lastName;\n        while (name = names.shift()) {\n            lastName = name;\n            if (names.length) {\n                root = (root[name] = root[name] || {});\n            }\n        }\n        try {\n            var f = $.isFunction(this.factory) && this.factory.apply(window, this.getArgs());\n            if (f) {\n                f.amd = 'THEO'; //加个尾巴~\n                root[lastName] = f;\n                this.id && (mapDefined[this.id] = 'defined');\n            }\n        } catch (e) {\n            if (this.id) {\n                mapDefined[this.id] = 'error';\n            }\n            throw new Error('Module.namespace error:id=>' + this.id + ';undef=>' + this.undef.join(',') + ';info=>' + e.message);\n        }\n        //解决掉触发调用模块的promise\n        if (this.id && $.isArray(mapDeps2ModulePromise[this.id])) {\n            _.each(mapDeps2ModulePromise[this.id], function(v) {\n                if (isPromise(v)) {\n                    v.resolve();\n                }\n            });\n        }\n        this.destroy();\n    },\n    //根据模块名称，获取模块\n    getFn: function(names) {\n        names = names.split('/');\n        var root = this.root;\n        var name;\n        while (name = names.shift()) {\n            root = root[name];\n        }\n        return root;\n    },\n    //获取factory函数参数数组\n    getArgs: function() {\n        var arr = this.dependencies;\n        var v;\n        var fns = [this.root];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            v = arr[i];\n            fns.push(this.getFn(v));\n        }\n        return fns;\n    },\n    //判断是否符合转正标准\n    canDefine: function() {\n        var arr = this.undef;\n        var len = arr.length;\n        var temp;\n        while (len--) {\n            temp = arr[len];\n            if (!defined(temp)) {\n                if ((regIsCSS.test(temp) || regIsJS.test(temp)) && _.loaded(temp)) {\n                    continue;\n                }\n                return false;\n            }\n        }\n        return true;\n    },\n    //加载依赖\n    loadDeps: function() {\n        var self = this;\n        var promise;\n        var modules = self.undef;\n        _.each(modules, function(v) {\n            promise = new Promise();\n            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n            mapDeps2ModulePromise[v].push(promise.done(function() {\n                self.define();\n            }));\n            if (mapDefined[v] !== 'pending') {\n                var alias = _.alias(v);\n\n                if (alias && alias.length) {\n                    //如果存在alias\n                    var p = new Promise();\n\n                    p.done(function() {\n                        self.define()\n                    });\n                    //如果是普通js和css\n                    //不支持有依赖关系的alias模块类型的js\n                    var len = alias.length;\n                    var cb = function() {\n                        len--;\n                        if (len === 0) {\n                            mapDefined[v] = 'defined'; //标注alias被定义过了~\n                            p.resolve();\n                        }\n                    };\n                    _.each(alias, function(v) {\n                        if (regIsCSS.test(v)) {\n                            _.loadCSS(v, cb);\n                        } else if (regIsJS.test(v)) {\n                            _.loadJS(v, cb);\n                        } else {\n                            var tempPromise = new Promise();\n                            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n                            mapDeps2ModulePromise[v].push(tempPromise.done(cb));\n                            _.loadJS(v);\n                        }\n                    });\n                } else if (regIsCSS.test(v)) {\n                    //css文件\n                    _.loadCSS(v, function() {\n                        self.define();\n                    });\n                } else if (regIsJS.test(v)) {\n                    //js文件\n                    _.loadJS(v, function() {\n                        self.define();\n                    });\n                } else {\n                    //模块\n                    _.loadJS(v);\n                }\n            }\n        });\n    },\n    //首次检测依赖关系，对已经定义和未定义的模块进行分组\n    checkDependencies: function(deps) {\n        var self = this;\n        _.each(deps, function(v) {\n            v = getPath(v)[2];\n            if (!defined(v)) {\n                self.undef.push(v);\n            }\n        });\n    },\n    //销毁函数\n    destroy: function() {\n        destroy(this);\n    }\n};\n\n/**\n * 判断是否为amd模块\n * @param  {Object}  obj 要判断的对象\n * @return {Boolean}     判断结果\n */\n\nfunction isAMD(obj) {\n    return obj.amd === 'THEO';\n}\n\n/**\n * 判断一个module是否被定义过\n * @param  {String} moduleID 被检测的module对象id\n * @return {Boolean}        判断结果\n */\n\nfunction defined(moduleID) {\n    return mapDefined[moduleID] === 'defined';\n}\n/**\n * Promise类\n */\n\nfunction Promise() {\n    this.status = 'unfulfilled'; //fulfilled|failed\n    this.fulfilledHandlers = [];\n    this.errorHandlers = [];\n    this.reason = '';\n}\nPromise.prototype = {\n    constructor: Promise,\n    reject: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'failed';\n        return this.fire(this.errorHandlers, arg);\n    },\n    isResolved: function() {\n        return this.status === 'fulfilled';\n    },\n    resolve: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'fulfilled';\n        return this.fire(this.fulfilledHandlers, arg);\n    },\n    fail: function(handler) {\n        return this.then(undefined, handler);\n    },\n    always: function(handler) {\n        return this.then(handler, handler);\n    },\n    then: function(fulfilledHandler, errorHandler) {\n        switch (this.status) {\n        case 'unfulfilled':\n            this.add(fulfilledHandler, 'fulfilled')\n                .add(errorHandler, 'error');\n            break;\n        case 'fulfilled':\n            this.fire(fulfilledHandler, this.reason);\n            break;\n        case 'failed':\n            this.fire(errorHandler, this.reason);\n        }\n        return this;\n    },\n    done: function(handler) {\n        return this.then(handler);\n    },\n    fire: function(fns, arg) {\n        if ($.isArray(fns)) {\n            var fn;\n            while (fn = fns.shift()) {\n                if ($.isFunction(fn)) {\n                    fn(arg);\n                }\n            }\n            this.clear();\n        } else if ($.isFunction(fns)) {\n            fns(arg);\n        }\n        return this;\n    },\n    add: function(handler, which) {\n        which = which + 'Handlers';\n        if ($.isFunction(handler) && this[which]) {\n            this[which].push(handler);\n        }\n        return this;\n    },\n    clear: function() {\n        this.fulfilledHandlers.length = 0;\n        this.errorHandlers.length = 0;\n    }\n};\n\n/**\n * 是否是Promise实例\n * @param  {Object}  o 被检验的对象\n * @return {Boolean}   是否为实例\n */\n\nfunction isPromise(o) {\n    return o instanceof Promise;\n}\n/**\n * 获取真实url\n * 来自massframework\n * @param  {[type]} url [description]\n * @return {[type]}     [description]\n */\n\nfunction getPath(url, root) {\n    var ret = url;\n    var tmp;\n    var _2;\n    var alias = _.alias;\n    var id;\n    root = root || defaultConfig.baseURL;\n    root = root.substr(0, root.lastIndexOf('/'));\n    id = url; //模块id\n\n    if (regAlias.test(url) && alias[url]) {\n        ret = alias[url];\n\n    } else if (/^(\\w+)(\\d)?:.*/.test(url)) { //如果用户路径包含协议\n        ret = url;\n    } else {\n        tmp = url.charAt(0);\n        _2 = url.slice(0, 2);\n\n        if (tmp !== '.' && tmp !== '/') { //相对于根路径\n            ret = root + '/' + url;\n        } else if (_2 === './') { //相对于兄弟路径\n            id = url.substr(2);\n            ret = root + '/' + id;\n        } else if (_2 === '..') { //相对于父路径\n            // var arr = root.replace(/\\/$/, '').split('/');\n            var arr = root.split('/');\n            tmp = url.replace(/\\.\\.\\//g, function() {\n                arr.pop();\n                return '';\n            });\n            id = tmp;\n            ret = arr.join('/') + '/' + tmp;\n        }\n    }\n\n    var ext = 'js'; //默认是js文件\n    tmp = ret.replace(/[?#].*/, '');\n    if (/\\.(\\w+)$/.test(tmp)) {\n        ext = RegExp.$1;\n    }\n    if (ext !== 'css' && tmp === ret && !regIsJS.test(ret)) { //如果没有后缀名会补上.js\n        ret += '.js';\n    }\n    return [ret, ext, id];\n}\n/**\n * 加载js\n * @param  {String}   src      路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\nfunction loadJS(src, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(src)) {\n        callback = src.callback;\n        attrs = src.attrs;\n        timeout = src.timeout;\n        fail = src.fail;\n        complete = src.complete;\n        src = src.src;\n        return loadJS(src, callback, attrs, timeout, fail, complete);\n    }\n    var script = document.createElement('script');\n    var done = false;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            script.setAttribute(i, attrs[i]);\n        }\n    }\n    var urls = getPath(src);\n    src = script.src = urls[0];\n    script.async = true;\n    script.type = 'text/javascript';\n    script.charset = defaultConfig.charset;\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    script.onload = script.onreadystatechange = function(e) {\n        e = e || cleanObj\n        if (!done && (e.type === 'load' || /loaded|complete|undefined/.test(script.readyState))) {\n            done = true;\n            removeNode(script);\n            mapLoaded[src] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    };\n    script.onerror = function() {\n        done = true;\n        mapLoaded[src] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    };\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[src] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[src] = 'pending';\n    head.insertBefore(script, base);\n    return _;\n}\n/**\n * 移出node节点，释放内存\n * @param  {Element} node 节点\n */\nfunction removeNode(node) {\n    //确保执行一次+内存回收\n    node.onload = node.onerror = node.onreadystatechange = null;\n    if (node.parentNode) {\n        setTimeout(function() {\n            node.parentNode.removeChild(node);\n            node = null;\n        }, 0);\n    }\n}\n//放弃轮询方法，改用img的方法，对于不支持的古老级别浏览器自动屏蔽\n/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n    \n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n\n    \n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    //弱化css 错误处理，只有callback的时候才处理\n    if($.isFunction(callback)){\n        complete = $.isFunction(complete) ? complete : emptyFn;\n        var cb,err;\n        cb = function() {\n            if (!done) {\n                done = true;\n                link.onload = link.onerror = link.onreadystatechange = null;\n                mapLoaded[href] = 'loaded';\n                $.isFunction(callback) && callback();\n                complete('load');\n            }\n        }\n        if($.isFunction(fail)){\n            err = function() {\n                if (!done) {\n                    done = true;\n                    link.onload = link.onerror = link.onreadystatechange = null;\n                    mapLoaded[href] = 'error';\n                    fail();\n                    complete('error');\n                }\n            }\n        }\n\n        cssCallback(link, cb, err);\n        if (timeout) {\n            setTimeout(function() {\n                if (!done) {\n                    done = true;\n                    mapLoaded[href] = 'timeout';\n                    complete('timeout');\n                }\n            }, timeout);\n        }\n    }\n    \n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\n\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        if ($.isFunction(callback)) {\n            var img = new Image();\n            img.src = node.href;\n            img.error = callback;            \n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n\nvar _ = {\n    version: VERSION,\n    mix: mix,\n    indexOf: function(array, item, isSorted) {\n        if (array == null) {\n            return -1;\n        }\n        var i = 0;\n        var l = array.length;\n        if (isSorted) {\n            i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n        }\n        if (emptyArr.indexOf && array.indexOf === emptyArr.indexOf) {\n            return array.indexOf(item, isSorted);\n        }\n        for (; i < l; i++) {\n            if (array[i] === item) {\n                return i;\n            }\n        }\n        return -1;\n    },\n    /**\n     * 数组遍历\n     * @param  {Array}   arr      数组\n     * @param  {Function} callback 处理函数\n     * @param  {Object}   scope    处理上下文\n     */\n    each: emptyArr.forEach ? function(arr, callback, scope) {\n        emptyArr.forEach.call(arr, callback, scope);\n    } : function(arr, callback, scope) {\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (i in arr) {\n                callback.call(scope, arr[i], i, arr);\n            }\n        }\n    },\n    defined: defined,\n    define: function(mid, dependencies, factory) {\n        new Module(mid, dependencies, factory);\n        return this;\n    },\n    /**\n     * use方法\n     * @param  {Array}   mid      模块数组\n     * @param  {Function} callback 回调函数\n     * @return {Object}            返回promise对象\n     */\n    use: function(mid, callback) {\n        new Module(undefined, mid, callback);\n        return this;\n    },\n    /**\n     * 基本设置\n     * @param  {Object|undefined} cfg 设置，为空则返回\n     * @return {Object}\n     */\n    config: function(cfg) {\n        if ($.isObject(cfg)) {\n\n            mix(defaultConfig, cfg);\n            return this;\n        }\n        return defaultConfig;\n    },\n    /**\n     * 判断path是否加载\n     * @param  {String} path 路径\n     * @return {Boolean}     是否加载完成\n     */\n    loaded: function(path) {\n        path = getPath(path)[0];\n        return _.status(path) === 'loaded';\n    },\n    /**\n     * 查询路径的加载状态\n     * @param  {String} path 查询的路径\n     * @return {String}      返回状态：pending|error|loaded|timeout\n     */\n    status: function(path) {\n        return mapLoaded[path];\n    },\n    /**\n     * 别名机制\n     * @param  {String} name 名字\n     * @param  {String} realpath  别名真实url\n     * @return {[type]}      [description]\n     */\n    alias: function(name, realpath) {\n        if (regAlias.test(name)) {\n            if ($.isUndefined(realpath)) {\n                return mapAlias[name];\n            }\n            mapAlias[name] = String(realpath).split(',');\n        } else if ($.isObject(name)) {\n            realpath = name.path;\n            name = name;\n            _.alias(name, realpath);\n        }\n    },\n    loadJS: loadJS,\n    loadCSS: loadCSS,\n    Promise: Promise,\n    isAMD: isAMD\n};\n\n/**\n * 销毁函数\n * @param  {[type]} obj [description]\n * @return {[type]}     [description]\n */\n\nfunction destroy(obj) {\n    for (var i in obj) {\n        if (obj.hasOwnProperty(i) && obj[i]) {\n            if ($.isArray(obj[i])) {\n                obj[i].length = 0;\n            }\n            if ($.isFunction(obj[i].destroy)) {\n                obj[i].destroy();\n            }\n            delete obj[i];\n        }\n    }\n}\n\n/**\n * 混合杂糅\n * @param  {Object} target 目标对象，以此为基础的对象\n * @param  {Object} source 来源对象\n * @param  {Boolean} ride  是否覆盖同名属性\n * @return {Object}        处理完的对象\n */\n\nfunction mix(target, source, ride) {\n    var args = arrSlice.call(arguments);\n    var i = 1;\n    var key;\n    //如果最后参数是布尔，判定是否覆写同名属性\n    ride = $.isBoolean(ride) ? ride : true;\n\n    while ((source = args[i++])) {\n        //source = [{a:1},{b:3}];\n        if ($.isArray(source)) {\n            for (var n = 0, len = source.length; n < len; n++) {\n                mix(target, source[n], ride);\n            }\n            continue;\n        }\n        //杂糅只允许对象\n        for (key in source) {\n            if (ride || !(key in target)) {\n                target[key] = source[key];\n            }\n        }\n    }\n    return target;\n}\n\n\n\nif ($.isUndefined(window.define)) {\n    window.define = _.define;\n}\nwindow.MixJS = mix(_, $);\n}(this));"
  },
  {
    "path": "ppt/js/mixjs/package.json",
    "content": "{\n  \"name\": \"mix\",\n  \"title\": \"MixJS\",\n  \"description\": \"Just Another Javascript Module Loader\",\n  \"version\": \"0.3.0\",\n  \"author\": \"Theowang\",\n  \"email\": \"ksky521@gmail.com\",\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"https://github.com/ksky521/MixJS/blob/master/MIT-LICENSE.txt\"\n    }\n  ],\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.1\",\n    \"grunt-contrib-jshint\": \"~0.2.0\",\n    \"grunt-contrib-uglify\": \"~0.1.2\",\n    \"grunt-contrib\": \"~0.5.0\",\n    \"grunt-contrib-concat\": \"~0.1.3\",\n    \"grunt-contrib-watch\": \"~0.3.1\",\n    \"grunt-contrib-compress\": \"~0.5.0\"\n  }\n}\n"
  },
  {
    "path": "ppt/js/mixjs/research/js.php",
    "content": "<?php\n  header('Content-type: text/javascript; charset=utf-8');\n  sleep(2);\n?>\nif(typeof console!=='undefined'){\n    console.log && console.log('i am wake up');\n}\n"
  },
  {
    "path": "ppt/js/mixjs/research/load-test.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Load Test</title>\n    <style>\n    .green{\n        color:green;\n    }\n    .red{\n        color:red;\n    }\n    .bold{\n        font-weight:bold;\n    }\n    </style>\n</head>\n<body>\n    <ul id=\"result\">\n        <li class=\"green\">-------------start--------------</li>\n    </ul>\n<script>\n    var dom = document.getElementById('result');\n    var head = document.getElementsByTagName('head')[0];\n    var jsin = false;\n    var cssin = false;\n    function loadJS(url, str) {\n        var js = document.createElement('script');\n        if(!jsin){\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onreadystatechange in jsdom:【<span class=\"red\">'+('onreadystatechange' in js)+'</span>】</li>';\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onerror in jsdom:【<span class=\"red\">'+('onerror' in js)+'</span>】</li>';\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onload in jsdom:【<span class=\"red\">'+('onload' in js)+'</span>】</li>';\n            jsin = true;\n        }\n        js.onreadystatechange = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> readystatechange:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.onload = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> load:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.onerror = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> error:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.src = url;\n        head.appendChild(js);\n    }\n    function loadCSS(url, str){\n        var link = document.createElement('link');\n        link.rel = 'stylesheet';\n        link.type = 'text/css';\n        if(!cssin){\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onerror in cssdom:【<span class=\"red\">'+('onerror' in link)+'</span>】</li>';\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onload in cssdom:【<span class=\"red\">'+('onload' in link)+'</span>】</li>';\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onreadystatechange in cssdom:【<span class=\"red\">'+('onreadystatechange' in link)+'</span>】</li>';\n            cssin = true;\n        }\n        \n        link.onreadystatechange = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> readystatechange:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '】</span>;' + str + '</li>';\n        }\n        link.onerror = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> error:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【' + e.type + '】;' + str + '</li>';\n        }\n        link.onload = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> load:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【' + e.type + '】;' + str + '</li>';\n        }\n\n        var img = new Image();\n        img.onerror = function(e){\n            e = e || {};\n            dom.innerHTML += '<li>=======img=======<span class=\"bold\"><span class=\"red\">css</span>:</span> new Image-error:【<span class=\"red\">' + e.type + '</span>】; ' + str + '</li>';\n        }\n        img.src = url;\n        var img2  = document.createElement('img');\n        img2.onerror = function(e){\n            e = e || {};\n            dom.innerHTML += '<li>=======img=======<span class=\"bold\"><span class=\"red\">css</span>:</span> createElement img-error:【<span class=\"red\">' + e.type + '</span>】; ' + str + '</li>';\n        }\n        img2.src = url;\n        link.href = url;\n        head.appendChild(link);\n    }\n    dom.innerHTML+='<li>Browser Info:'+window.navigator.userAgent+'</li>';\n    loadJS('http://code.jquery.com/jquery-1.9.1.js','200');\n    loadJS('http://code.jquery.com/121211212.js','404');\n    loadCSS('http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css','200');\n    loadCSS('http://code.jquery.com/121211212.css','404');\n</script>\n</body>\n</html>"
  },
  {
    "path": "ppt/js/mixjs/research/loadjs.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>动态加载js状态测试</title>\n</head>\n<body>\n    <ul id=\"log\">\n        \n    </ul>\n    <button onclick=\"loadJS('js.php')\">加载js</button>\n    <button onclick=\"loadJS('js.php?t='+(+new Date()))\">加载不缓存的js</button>\n    <script>\n    var loadJS = function(url){\n        var js = document.createElement('script');\n        js.src = url;\n        js.onload = js.onreadystatechange = function(e){\n            e = e || {};\n            var li = document.createElement('li');\n            li.innerHTML = 'type:'+e.type+';readyState:'+js.readyState;\n            document.getElementById('log').appendChild(li);\n        }\n        var head = document.getElementsByTagName('head')[0];\n        head.appendChild(js);\n    }\n    \n    </script>\n</body>\n</html>"
  },
  {
    "path": "ppt/js/mixjs/research/userAgent.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>判断UA</title>\n</head>\n<body>\n    <script>\nvar UA = window.navigator.userAgent;\nvar ua = UA.toLowerCase();\nvar browserRegExp = {\n    ie:/msie\\s*(\\d+(?:\\.\\d+)?)+/,\n    chrome:/chrome\\/(\\d+(?:\\.\\d+)?)+/,\n    firefox:/firefox\\/(\\d+(?:\\.\\d+)?)+/,\n    safari:/version\\/(\\d+(?:\\.\\d+)?)\\s*safari/,\n    opera:/opera[ |\\/](\\d+(?:\\.\\d+)?)/\n};\n$ = {};\n$.browser = 'unknow';\n$.browserVersion = 0;\n\nfunction checkUA(ua,browser,version){\n    ua = ua.toLowerCase();\n    for(var i in browserRegExp){\n        var match = browserRegExp[i].exec(ua);\n        if(match){\n            $.browser = i;\n            if(browser===i && version==match[1]){\n            }else{\n                console.log(browser+'|'+version+'|'+match[1]+':'+ua);\n            }\n\n            break;\n        }else{\n            // console.log(ua);\n        }\n    }\n}\nvar arr = [\n    ['chrome',19.0,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3'],\n    ['chrome',24.0,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14'],\n    ['chrome',15.0,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2'],\n    ['chrome',4.0,'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0'],\n    ['chrome',0.2,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13(KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13'],\n\n\n    ['safari',6.0,'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'],\n    ['safari',5.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'],\n    ['safari',5.1,'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3'],\n    ['safari',5.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; th-th) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8'],\n    ['safari',4.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-gb) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2'],\n    ['safari',4.0,'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7'],\n    ['safari',4.0,'Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc'],\n    ['safari',4.0,'Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16'],\n    ['safari',3.2,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3'],\n    ['safari',3.2,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1'],\n    ['safari',3.0,'Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/525+ (KHTML, like Gecko) Version/3.0.4 Safari/523.11'],\n    ['safari',2.0,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2'],\n    ['safari',1.3,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5_Adobe'],\n    ['safari',1.0,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5'],\n    ['firefox',23.0,'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0'],\n    ['firefox',16.0,'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1'],\n    ['firefox',6.0,'Mozilla/5.0 (Windows NT 5.0; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'],\n    ['firefox',6.0,'Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0 FirePHP/0.6'],\n    ['firefox',5.0,'Mozilla/5.0 (X11; Linux i686 on x86_64; rv:5.0a2) Gecko/20110524 Firefox/5.0a2'],\n    ['firefox',4.0,'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)'],\n    ['firefox',4.0,'Mozilla/5.0 (Windows NT 6.1; rv:1.9) Gecko/20100101 Firefox/4.0'],\n    ['firefox',3.5,'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.0 (.NET CLR 3.0.30618)'],\n    ['firefox',2.1,'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.15) Gecko/2009101601 Firefox 2.1 (.NET CLR 3.5.30729)'],\n    ['firefox',2.0,'Mozilla/5.0 (X11; U; SunOS sun4v; en-US; rv:1.8.1.3) Gecko/20070321 Firefox/2.0.0.3'],\n    ['firefox',1.6,'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9a1) Gecko/20060112 Firefox/1.6a1'],\n    ['firefox',1.0,'Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 (ax)'],\n    ['firefox',0.1,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.7.3) Gecko/20040913 Firefox/0.10'],\n    ['ie',10.6,'Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0'],\n    ['ie',10.0,'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'],\n    ['ie',9.0,'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))'],\n    ['ie',9.0,'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)'],\n    ['ie',8.0,'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; InfoPath.3; .NET4.0C; .NET4.0E) chromeframe/8.0.552.224'],\n    ['ie',7.0,'Mozilla/4.0(compatible; MSIE 7.0b; Windows NT 6.0)'],\n    ['ie',7.0,'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)'],\n    ['ie',6.0,'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'],\n    ['ie',6.1,'Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'],\n    ['opera',12.14,'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'],\n    ['opera',12.02,'Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02'],\n    ['opera',12.0,'Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0'],\n    ['opera',12.00,'Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00'],\n    ['opera',11.62,'Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62'],\n    ['opera',11.50,'Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50'],\n    ['opera',11.11,'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11'],\n    ['opera',11.11,'Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11'],\n    ['opera',11.10,'Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01'],\n    ['opera',11.00,'Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00'],\n    ['opera',11.00,'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; en) Opera 11.00'],\n    ['opera',10.70,'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.6.31 Version/10.70'],\n    ['opera',10.70,'Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70'],\n    ['opera',10.63,'Opera/9.80 (Windows NT 5.2; U; zh-cn) Presto/2.6.30 Version/10.63'],\n    ['opera',9.80,'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/886; U; en) Presto/2.4.15'],\n];\n\nfor(var i=0,len = arr.length;i<len;i++){\n    checkUA(arr[i][2],arr[i][0],arr[i][1]);\n}\n</script>\n</body>\n</html>"
  },
  {
    "path": "ppt/js/mixjs/src/Module.js",
    "content": "/**\n * Module类\n * @param {String} id      moduleID\n * @param {Array} deps    依赖模块\n * @param {Function} factory 工厂函数\n * @param {Object} root    相对定义的root\n */\n\nfunction Module(id, deps, factory, root) {\n    if (arguments.length === 0) {\n        throw new Error('Module: I need a agrument');\n    }\n    if ($.isFunction(id)) {\n        factory = id;\n        id = undefined;\n        deps = emptyArr;\n    } else if ($.isArray(id)) {\n        deps = emptyArr;\n        id = undefined;\n    } else if ($.isFunction(deps)) {\n        factory = deps;\n        deps = emptyArr;\n    }\n    this.id = id ? getPath(id)[2] : id;\n    this.status = 'uninitialized';\n    if ($.isString(deps)) {\n        deps = deps.split(',');\n    }\n    this.dependencies = deps;\n    this.factory = factory;\n    this.root = root || _; //默认挂靠在window全局，使用_，默认挂靠到MixJS上\n    this.undef = []; //没有定义的模块\n    this.id && (mapDefined[this.id] = 'uninitialized');\n    this.checkDependencies(deps);\n    this.define();\n}\nModule.prototype = {\n    constructor: Module,\n    //定义\n    define: function() {\n        if (this.canDefine()) {\n            this.namespace();\n        } else if (this.status !== 'pending') {\n            this.status = 'pending';\n            this.id && (mapDefined[this.id] = this.status);\n            this.loadDeps();\n        }\n    },\n    //命名空间\n    namespace: function() {\n        var names = $.isString(this.id) ? this.id.split('/') : emptyArr;\n        var root = this.root;\n        var name, lastName;\n        while (name = names.shift()) {\n            lastName = name;\n            if (names.length) {\n                root = (root[name] = root[name] || {});\n            }\n        }\n        try {\n            var f = $.isFunction(this.factory) && this.factory.apply(window, this.getArgs());\n            if (f) {\n                f.amd = 'THEO'; //加个尾巴~\n                root[lastName] = f;\n                this.id && (mapDefined[this.id] = 'defined');\n            }\n        } catch (e) {\n            if (this.id) {\n                mapDefined[this.id] = 'error';\n            }\n            throw new Error('Module.namespace error:id=>' + this.id + ';undef=>' + this.undef.join(',') + ';info=>' + e.message);\n        }\n        //解决掉触发调用模块的promise\n        if (this.id && $.isArray(mapDeps2ModulePromise[this.id])) {\n            _.each(mapDeps2ModulePromise[this.id], function(v) {\n                if (isPromise(v)) {\n                    v.resolve();\n                }\n            });\n        }\n        this.destroy();\n    },\n    //根据模块名称，获取模块\n    getFn: function(names) {\n        names = names.split('/');\n        var root = this.root;\n        var name;\n        while (name = names.shift()) {\n            root = root[name];\n        }\n        return root;\n    },\n    //获取factory函数参数数组\n    getArgs: function() {\n        var arr = this.dependencies;\n        var v;\n        var fns = [this.root];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            v = arr[i];\n            fns.push(this.getFn(v));\n        }\n        return fns;\n    },\n    //判断是否符合转正标准\n    canDefine: function() {\n        var arr = this.undef;\n        var len = arr.length;\n        var temp;\n        while (len--) {\n            temp = arr[len];\n            if (!defined(temp)) {\n                if ((regIsCSS.test(temp) || regIsJS.test(temp)) && _.loaded(temp)) {\n                    continue;\n                }\n                return false;\n            }\n        }\n        return true;\n    },\n    //加载依赖\n    loadDeps: function() {\n        var self = this;\n        var promise;\n        var modules = self.undef;\n        _.each(modules, function(v) {\n            promise = new Promise();\n            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n            mapDeps2ModulePromise[v].push(promise.done(function() {\n                self.define();\n            }));\n            if (mapDefined[v] !== 'pending') {\n                var alias = _.alias(v);\n\n                if (alias && alias.length) {\n                    //如果存在alias\n                    var p = new Promise();\n\n                    p.done(function() {\n                        self.define()\n                    });\n                    //如果是普通js和css\n                    //不支持有依赖关系的alias模块类型的js\n                    var len = alias.length;\n                    var cb = function() {\n                        len--;\n                        if (len === 0) {\n                            mapDefined[v] = 'defined'; //标注alias被定义过了~\n                            p.resolve();\n                        }\n                    };\n                    _.each(alias, function(v) {\n                        if (regIsCSS.test(v)) {\n                            _.loadCSS(v, cb);\n                        } else if (regIsJS.test(v)) {\n                            _.loadJS(v, cb);\n                        } else {\n                            var tempPromise = new Promise();\n                            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n                            mapDeps2ModulePromise[v].push(tempPromise.done(cb));\n                            _.loadJS(v);\n                        }\n                    });\n                } else if (regIsCSS.test(v)) {\n                    //css文件\n                    _.loadCSS(v, function() {\n                        self.define();\n                    });\n                } else if (regIsJS.test(v)) {\n                    //js文件\n                    _.loadJS(v, function() {\n                        self.define();\n                    });\n                } else {\n                    //模块\n                    _.loadJS(v);\n                }\n            }\n        });\n    },\n    //首次检测依赖关系，对已经定义和未定义的模块进行分组\n    checkDependencies: function(deps) {\n        var self = this;\n        _.each(deps, function(v) {\n            v = getPath(v)[2];\n            if (!defined(v)) {\n                self.undef.push(v);\n            }\n        });\n    },\n    //销毁函数\n    destroy: function() {\n        destroy(this);\n    }\n};\n\n/**\n * 判断是否为amd模块\n * @param  {Object}  obj 要判断的对象\n * @return {Boolean}     判断结果\n */\n\nfunction isAMD(obj) {\n    return obj.amd === 'THEO';\n}\n\n/**\n * 判断一个module是否被定义过\n * @param  {String} moduleID 被检测的module对象id\n * @return {Boolean}        判断结果\n */\n\nfunction defined(moduleID) {\n    return mapDefined[moduleID] === 'defined';\n}"
  },
  {
    "path": "ppt/js/mixjs/src/Promise.js",
    "content": "/**\n * Promise类\n */\n\nfunction Promise() {\n    this.status = 'unfulfilled'; //fulfilled|failed\n    this.fulfilledHandlers = [];\n    this.errorHandlers = [];\n    this.reason = '';\n}\nPromise.prototype = {\n    constructor: Promise,\n    reject: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'failed';\n        return this.fire(this.errorHandlers, arg);\n    },\n    isResolved: function() {\n        return this.status === 'fulfilled';\n    },\n    resolve: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'fulfilled';\n        return this.fire(this.fulfilledHandlers, arg);\n    },\n    fail: function(handler) {\n        return this.then(undefined, handler);\n    },\n    always: function(handler) {\n        return this.then(handler, handler);\n    },\n    then: function(fulfilledHandler, errorHandler) {\n        switch (this.status) {\n        case 'unfulfilled':\n            this.add(fulfilledHandler, 'fulfilled')\n                .add(errorHandler, 'error');\n            break;\n        case 'fulfilled':\n            this.fire(fulfilledHandler, this.reason);\n            break;\n        case 'failed':\n            this.fire(errorHandler, this.reason);\n        }\n        return this;\n    },\n    done: function(handler) {\n        return this.then(handler);\n    },\n    fire: function(fns, arg) {\n        if ($.isArray(fns)) {\n            var fn;\n            while (fn = fns.shift()) {\n                if ($.isFunction(fn)) {\n                    fn(arg);\n                }\n            }\n            this.clear();\n        } else if ($.isFunction(fns)) {\n            fns(arg);\n        }\n        return this;\n    },\n    add: function(handler, which) {\n        which = which + 'Handlers';\n        if ($.isFunction(handler) && this[which]) {\n            this[which].push(handler);\n        }\n        return this;\n    },\n    clear: function() {\n        this.fulfilledHandlers.length = 0;\n        this.errorHandlers.length = 0;\n    }\n};\n\n/**\n * 是否是Promise实例\n * @param  {Object}  o 被检验的对象\n * @return {Boolean}   是否为实例\n */\n\nfunction isPromise(o) {\n    return o instanceof Promise;\n}"
  },
  {
    "path": "ppt/js/mixjs/src/browser.js",
    "content": "var UA = window.navigator.userAgent;\n"
  },
  {
    "path": "ppt/js/mixjs/src/core.js",
    "content": "var _ = {\n    version: VERSION,\n    mix: mix,\n    indexOf: function(array, item, isSorted) {\n        if (array == null) {\n            return -1;\n        }\n        var i = 0;\n        var l = array.length;\n        if (isSorted) {\n            i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n        }\n        if (emptyArr.indexOf && array.indexOf === emptyArr.indexOf) {\n            return array.indexOf(item, isSorted);\n        }\n        for (; i < l; i++) {\n            if (array[i] === item) {\n                return i;\n            }\n        }\n        return -1;\n    },\n    /**\n     * 数组遍历\n     * @param  {Array}   arr      数组\n     * @param  {Function} callback 处理函数\n     * @param  {Object}   scope    处理上下文\n     */\n    each: emptyArr.forEach ? function(arr, callback, scope) {\n        emptyArr.forEach.call(arr, callback, scope);\n    } : function(arr, callback, scope) {\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (i in arr) {\n                callback.call(scope, arr[i], i, arr);\n            }\n        }\n    },\n    defined: defined,\n    define: function(mid, dependencies, factory) {\n        new Module(mid, dependencies, factory);\n        return this;\n    },\n    /**\n     * use方法\n     * @param  {Array}   mid      模块数组\n     * @param  {Function} callback 回调函数\n     * @return {Object}            返回promise对象\n     */\n    use: function(mid, callback) {\n        new Module(undefined, mid, callback);\n        return this;\n    },\n    /**\n     * 基本设置\n     * @param  {Object|undefined} cfg 设置，为空则返回\n     * @return {Object}\n     */\n    config: function(cfg) {\n        if ($.isObject(cfg)) {\n\n            mix(defaultConfig, cfg);\n            return this;\n        }\n        return defaultConfig;\n    },\n    /**\n     * 判断path是否加载\n     * @param  {String} path 路径\n     * @return {Boolean}     是否加载完成\n     */\n    loaded: function(path) {\n        path = getPath(path)[0];\n        return _.status(path) === 'loaded';\n    },\n    /**\n     * 查询路径的加载状态\n     * @param  {String} path 查询的路径\n     * @return {String}      返回状态：pending|error|loaded|timeout\n     */\n    status: function(path) {\n        return mapLoaded[path];\n    },\n    /**\n     * 别名机制\n     * @param  {String} name 名字\n     * @param  {String} realpath  别名真实url\n     * @return {[type]}      [description]\n     */\n    alias: function(name, realpath) {\n        if (regAlias.test(name)) {\n            if ($.isUndefined(realpath)) {\n                return mapAlias[name];\n            }\n            mapAlias[name] = String(realpath).split(',');\n        } else if ($.isObject(name)) {\n            realpath = name.path;\n            name = name;\n            _.alias(name, realpath);\n        }\n    },\n    loadJS: loadJS,\n    loadCSS: loadCSS,\n    Promise: Promise,\n    isAMD: isAMD\n};\n\n/**\n * 销毁函数\n * @param  {[type]} obj [description]\n * @return {[type]}     [description]\n */\n\nfunction destroy(obj) {\n    for (var i in obj) {\n        if (obj.hasOwnProperty(i) && obj[i]) {\n            if ($.isArray(obj[i])) {\n                obj[i].length = 0;\n            }\n            if ($.isFunction(obj[i].destroy)) {\n                obj[i].destroy();\n            }\n            delete obj[i];\n        }\n    }\n}\n\n/**\n * 混合杂糅\n * @param  {Object} target 目标对象，以此为基础的对象\n * @param  {Object} source 来源对象\n * @param  {Boolean} ride  是否覆盖同名属性\n * @return {Object}        处理完的对象\n */\n\nfunction mix(target, source, ride) {\n    var args = arrSlice.call(arguments);\n    var i = 1;\n    var key;\n    //如果最后参数是布尔，判定是否覆写同名属性\n    ride = $.isBoolean(ride) ? ride : true;\n\n    while ((source = args[i++])) {\n        //source = [{a:1},{b:3}];\n        if ($.isArray(source)) {\n            for (var n = 0, len = source.length; n < len; n++) {\n                mix(target, source[n], ride);\n            }\n            continue;\n        }\n        //杂糅只允许对象\n        for (key in source) {\n            if (ride || !(key in target)) {\n                target[key] = source[key];\n            }\n        }\n    }\n    return target;\n}\n\n\n\nif ($.isUndefined(window.define)) {\n    window.define = _.define;\n}\nwindow.MixJS = mix(_, $);"
  },
  {
    "path": "ppt/js/mixjs/src/getCurrentScript.js",
    "content": "//本js文件不支持defer等属性，否则计算当前路径会错误\n//模块加载的东西，基础js肯定不能defer掉……\nvar curScriptNode = (function() {\n    var scripts = document.getElementsByTagName('script');\n    return scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n})();"
  },
  {
    "path": "ppt/js/mixjs/src/getPath.js",
    "content": "/**\n * 获取真实url\n * 来自massframework\n * @param  {[type]} url [description]\n * @return {[type]}     [description]\n */\n\nfunction getPath(url, root) {\n    var ret = url;\n    var tmp;\n    var _2;\n    var alias = _.alias;\n    var id;\n    root = root || defaultConfig.baseURL;\n    root = root.substr(0, root.lastIndexOf('/'));\n    id = url; //模块id\n\n    if (regAlias.test(url) && alias[url]) {\n        ret = alias[url];\n\n    } else if (/^(\\w+)(\\d)?:.*/.test(url)) { //如果用户路径包含协议\n        ret = url;\n    } else {\n        tmp = url.charAt(0);\n        _2 = url.slice(0, 2);\n\n        if (tmp !== '.' && tmp !== '/') { //相对于根路径\n            ret = root + '/' + url;\n        } else if (_2 === './') { //相对于兄弟路径\n            id = url.substr(2);\n            ret = root + '/' + id;\n        } else if (_2 === '..') { //相对于父路径\n            // var arr = root.replace(/\\/$/, '').split('/');\n            var arr = root.split('/');\n            tmp = url.replace(/\\.\\.\\//g, function() {\n                arr.pop();\n                return '';\n            });\n            id = tmp;\n            ret = arr.join('/') + '/' + tmp;\n        }\n    }\n\n    var ext = 'js'; //默认是js文件\n    tmp = ret.replace(/[?#].*/, '');\n    if (/\\.(\\w+)$/.test(tmp)) {\n        ext = RegExp.$1;\n    }\n    if (ext !== 'css' && tmp === ret && !regIsJS.test(ret)) { //如果没有后缀名会补上.js\n        ret += '.js';\n    }\n    return [ret, ext, id];\n}"
  },
  {
    "path": "ppt/js/mixjs/src/intro.js",
    "content": "(function(window, undefined) {\n'use strict';\nvar document = window.document;\nvar setTimeout = window.setTimeout;"
  },
  {
    "path": "ppt/js/mixjs/src/loadcss-img.js",
    "content": "//放弃轮询方法，改用img的方法，对于不支持的古老级别浏览器自动屏蔽\n/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n    \n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n\n    \n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    //弱化css 错误处理，只有callback的时候才处理\n    if($.isFunction(callback)){\n        complete = $.isFunction(complete) ? complete : emptyFn;\n        var cb,err;\n        cb = function() {\n            if (!done) {\n                done = true;\n                link.onload = link.onerror = link.onreadystatechange = null;\n                mapLoaded[href] = 'loaded';\n                $.isFunction(callback) && callback();\n                complete('load');\n            }\n        }\n        if($.isFunction(fail)){\n            err = function() {\n                if (!done) {\n                    done = true;\n                    link.onload = link.onerror = link.onreadystatechange = null;\n                    mapLoaded[href] = 'error';\n                    fail();\n                    complete('error');\n                }\n            }\n        }\n\n        cssCallback(link, cb, err);\n        if (timeout) {\n            setTimeout(function() {\n                if (!done) {\n                    done = true;\n                    mapLoaded[href] = 'timeout';\n                    complete('timeout');\n                }\n            }, timeout);\n        }\n    }\n    \n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\n\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        if ($.isFunction(callback)) {\n            var img = new Image();\n            img.src = node.href;\n            img.error = callback;            \n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n"
  },
  {
    "path": "ppt/js/mixjs/src/loadcss.js",
    "content": "/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    var cb = function() {\n        if (!done) {\n            done = true;\n            link.onload = link.onerror = link.onreadystatechange = null;\n            mapLoaded[href] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    }\n    var err = function() {\n        done = true;\n        link.onload = link.onerror = link.onreadystatechange = null;\n        mapLoaded[href] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    }\n\n    cssCallback(link, cb, err);\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[href] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n//为了保证每个poll的重试次数为300\nvar pollTimers = {};\n///css load检测来自seajs\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        // Begin after node insertion\n        if ($.isFunction(callback)) {\n            //设置timer\n            pollTimers[node.href] = 0;\n            setTimeout(function() {\n                poll(node, callback);\n            }, 50);\n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n\nfunction poll(node, callback) {\n    var done = false;\n    var count = pollTimers[node.href]++;\n    if (count > 300) {\n        callback();\n        done = true;\n        return;\n    }\n    // for WebKit < 536\n    if (isOldWebKit) {\n        if (node.sheet) {\n            done = true;\n        }\n    }\n    // for Firefox < 9.0\n    else if (node.sheet) {\n        try {\n            if (node.sheet.cssRules) {\n                done = true;\n            }\n        } catch (ex) {\n            // The value of `ex.name` is changed from\n            // 'NS_ERROR_DOM_SECURITY_ERR' to 'SecurityError' since Firefox 13.0\n            // But Firefox is less than 9.0 in here, So it is ok to just rely on\n            // 'NS_ERROR_DOM_SECURITY_ERR'\n            if (ex.name === 'NS_ERROR_DOM_SECURITY_ERR') {\n                done = true;\n            }\n        }\n    }\n    setTimeout(function() {\n        if (done) {\n            // Place callback in here due to giving time for style rendering.\n            callback();\n        } else {\n            poll(node, callback);\n        }\n    }, 50)\n}"
  },
  {
    "path": "ppt/js/mixjs/src/loadjs.js",
    "content": "/**\n * 加载js\n * @param  {String}   src      路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\nfunction loadJS(src, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(src)) {\n        callback = src.callback;\n        attrs = src.attrs;\n        timeout = src.timeout;\n        fail = src.fail;\n        complete = src.complete;\n        src = src.src;\n        return loadJS(src, callback, attrs, timeout, fail, complete);\n    }\n    var script = document.createElement('script');\n    var done = false;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            script.setAttribute(i, attrs[i]);\n        }\n    }\n    var urls = getPath(src);\n    src = script.src = urls[0];\n    script.async = true;\n    script.type = 'text/javascript';\n    script.charset = defaultConfig.charset;\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    script.onload = script.onreadystatechange = function(e) {\n        e = e || cleanObj\n        if (!done && (e.type === 'load' || /loaded|complete|undefined/.test(script.readyState))) {\n            done = true;\n            removeNode(script);\n            mapLoaded[src] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    };\n    script.onerror = function() {\n        done = true;\n        mapLoaded[src] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    };\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[src] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[src] = 'pending';\n    head.insertBefore(script, base);\n    return _;\n}\n/**\n * 移出node节点，释放内存\n * @param  {Element} node 节点\n */\nfunction removeNode(node) {\n    //确保执行一次+内存回收\n    node.onload = node.onerror = node.onreadystatechange = null;\n    if (node.parentNode) {\n        setTimeout(function() {\n            node.parentNode.removeChild(node);\n            node = null;\n        }, 0);\n    }\n}"
  },
  {
    "path": "ppt/js/mixjs/src/outro.js",
    "content": "}(this));"
  },
  {
    "path": "ppt/js/mixjs/src/typeof.js",
    "content": "//基本类型判断\n'Function,String,Array,Number'.replace(/[^, ]+/g, function(t) {\n    $['is' + t] = function(s) {\n        return isType(s, t);\n    }\n});\nif (typeof(/./) !== 'function') {\n    $.isFunction = function(obj) {\n        return typeof obj === 'function';\n    };\n}\n$.isObject = function(obj) {\n    return typeof obj === 'object';\n}\n\n$.isBoolean = function(obj) {\n    return obj === true || obj === false || isType(obj, 'Boolean');\n};\n\n$.isUndefined = function(obj) {\n    return obj === undefined;\n};\n\n/**\n * 获取类型\n * @param  {Object} obj 要判断的对象\n * @return {String}     返回类型\n */\n\nfunction isType(obj, type) {\n    return cleanObj.toString.call(obj).slice(8, -1) === type;\n}"
  },
  {
    "path": "ppt/js/mixjs/src/vars.js",
    "content": "var VERSION = 'MixJS 0.3 butterfly';\nvar emptyFn = function() {};\nvar cleanObj = {};\nvar emptyArr = [];\nvar head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;\nvar base = head.getElementsByTagName('base')[0] || null;\nvar arrSlice = emptyArr.slice;\n\n//获取当前文件父路径\nvar PATH = (function(node) {\n    var url = node.hasAttribute ? node.src : node.getAttribute('src', 4);\n    return url.substr(0, url.lastIndexOf('/')) + '/';\n})(curScriptNode);\n\n//是否为js\nvar regIsJS = /\\.js$/i;\n//是否为css\nvar regIsCSS = /\\.css$/i;\n//alias\nvar regAlias = /^[-\\w\\d_$]{2,}$/i;\nvar $ = {};\n\nvar defaultConfig = {\n    timeout: 2E4, //超时时间二十秒\n    baseURL: PATH,\n    charset: 'utf-8'\n};\n\n//=============>maps\n//别名列表\nvar mapAlias = {};\n//加载完的文件列表\nvar mapLoaded = {};\n//已经定义模块的状态表：undefined|pending|defined\nvar mapDefined = {};\n//通过依赖找上一级模块的promise\nvar mapDeps2ModulePromise = {};"
  },
  {
    "path": "ppt/js/nodeppt.control.js",
    "content": "/**\n * 控制端函数\n */\n(function($win, $doc, $B, Slide, loadJS, undefined) {\n    var $slides = Slide.$slides;\n\n    // function doItem(direction) {\n    //     return Slide[direction === 'prev' ? 'buildPrevItem' : 'buildNextItem'](true);\n    // }\n\n    function getType(obj) {\n        return ({}).toString.call(obj).slice(8, -1)\n    }\n\n    var Control = {\n        state: 'unbind',\n        methods: {},\n        init: function() {\n            this.bindListener();\n        },\n        bindListener: function() {\n            var t = this;\n            //监听用户端发出的广播\n            $B.on('slide change ID', function(json) {\n                    var slideID = json.slideID;\n                    //发送请求\n                    t.sendUpdate(slideID, json.direction);\n\n                }).on('slide do build', function(json) {\n                    var slideID = json.slideID;\n                    var buildItem = json.build;\n                    var direction = json.direction;\n                    //发送请求\n                    t.sendUpdateItem(slideID, buildItem, direction);\n                }).on('slide event keyup', function(e) {\n                    t.sendKeyEvent(e.keyCode);\n                }).on('show paint', function(e) {\n                    t.sendKeyEvent(80);\n                }).on('remove paint', function() {\n                    t.sendKeyEvent(67);\n                }).on('paint points', function(points) {\n                    var data = {\n                        points: points,\n                        screen: {\n                            width: $doc.body.offsetWidth,\n                            height: $doc.body.offsetHeight\n                        }\n                    };\n                    t.send_('broadcast', ['paint points', data]);\n                })\n                //监听控制来的广播\n                .on('from control order', function(json) {\n                    var fnName = json.fnName;\n                    var args = json.args;\n                    Slide.proxyFn(fnName, args);\n                }).on('from control update', function(json) {\n                    Slide[json.direction](true);\n                    // doSlide(json.direction, json.id, false);\n                }).on('from control updateItem', function(json) {\n                    Slide[json.direction](true);\n                    //doItem(json.direction) && doSlide(json.id, false);\n                }).on('from control key event', function(json) {\n                    t.createKeyEvent_(json.keyCode);\n                })\n        },\n        createKeyEvent_: function(keyCode) {\n            var evt = document.createEvent('Event');\n            evt.initEvent('keyup', true, true);\n            evt.keyCode = keyCode;\n            evt.isFromControl = true;\n\n            document.dispatchEvent(evt);\n        },\n        send_: function(fnName, args) {\n            var methods = this.methods;\n            var method;\n            args = getType(args) === 'Array' ? args : [args];\n            for (var i in methods) {\n                method = methods[i];\n                method = method[fnName];\n                typeof method === 'function' && method.apply(Slide, args);\n            }\n        },\n        sendUpdate: function(slideID, direction) {\n            this.send_('update', [slideID, direction]);\n        },\n        sendUpdateItem: function(id, buildItem, direction) {\n            this.send_('updateItem', [id, buildItem, direction]);\n        },\n        sendKeyEvent: function(keycode) {\n            this.send_('keyEvent', [keycode]);\n        },\n\n        //添加一个新的监控\n        add: function(name, factory, override) {\n            var methods = this.methods;\n\n            if (override || !methods[name]) {\n                methods[name] = factory(Slide, $B);\n                //必须包括4个函数一个是监控翻页的update\n                //另外一个是updateItem\n                //一个是init\n                //keyEvent;\n            }\n        },\n        load: function(type, args) {\n            var url = Slide.dir + 'nodeppt.control.' + type + '.js';\n            loadJS(url, function() {\n                Slide.Control.methods[type].init(args);\n            });\n        }\n    };\n    Control.init();\n    Slide.Control = Control;\n}(window, document, MixJS.event.broadcast, Slide, MixJS.loadJS));\n"
  },
  {
    "path": "ppt/js/nodeppt.control.postMessage.js",
    "content": "/**\n * postMessage 只能单方面控制\n *\n */\nSlide.Control.add('postMessage', function(S, broadcast) {\n    function parseQuery(url) {\n        var back = {};\n        (url || location.search.substring(1)).split('&').forEach(function(v) {\n            v = v.split('=');\n            back[v[0].toLowerCase()] = v[1];\n        });\n        return back;\n    }\n\n    var postWin, popup, timer;\n    var postMSG = {\n        role: '', //角色\n        broadcast: function(evtName, data) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: evtName,\n                    data: data\n                }, '*');\n            }\n        },\n        update: function(id, direction) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'update',\n                    id: id,\n                    direction: direction\n                }, '*');\n            }\n\n        },\n        updateItem: function(id, item, direction) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'updateItem',\n                    id: id,\n                    item: item,\n                    direction: direction\n                }, '*');\n            }\n\n        },\n        keyEvent: function(keyCode) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'keyEvent',\n                    keyCode: keyCode\n                }, '*');\n            }\n        },\n        // evtControl: function(e) {\n        //     console.log('client 发来贺电', arguments);\n        // },\n        evtClient: function(e) {\n            var data = e.data;\n            switch (data.action) {\n                case 'update':\n                    broadcast.fire('from control update', data);\n                    break;\n                case 'updateItem':\n                    broadcast.fire('from control updateItem', data);\n                    break;\n                case 'keyEvent':\n                    broadcast.fire('from control key event', data);\n                    break;\n                case 'userOrder':\n                    var fnName = data.fn;\n                    var args = data.args;\n                    try {\n                        args = JSON.parse(args);\n                    } catch (e) {}\n                    Slide.proxyFn(fnName, args);\n                    break;\n                default:\n                    broadcast.fire('from control ' + data.action, data.data);\n            }\n\n        },\n        closeClient: function() {\n            if (popup) {\n                popup.close();\n            }\n            timer && clearInterval(timer);\n        },\n        init: function(args) {\n            var t = this;\n            var params = parseQuery();\n\n            if (params._multiscreen === '1') {\n                this.role = 'client';\n                var url = location.href.replace('_multiscreen=1', '_multiscreen=control');\n\n                var sWidth = screen.width,\n                    sHeight = screen.height,\n                    tWidth = sWidth * 0.8,\n                    tHeight = sHeight * 0.8;\n\n                var temp = 'height=' + tHeight + ',width=' + tWidth + ',top=' + 10 + ',left=' + (sWidth - tWidth) / 2 + ',toolbar=no,menubar=no,location=yes,resizable=yes,scrollbars=no,status=no';\n                popup = window.open(url, 'ppt', temp);\n                window.addEventListener('message', this.evtClient, false);\n                window.addEventListener('beforeunload', this.closeClient, false);\n            } else if (params._multiscreen === 'control') {\n                this.role = 'control';\n                //如果是控制端，则重写proxyFn函数\n                Slide.proxyFn = function(fnName, args) {\n                    args = JSON.stringify(args);\n                    window.opener.postMessage({\n                        action: 'userOrder',\n                        fn: fnName,\n                        args: args\n                    }, '*');\n                }\n                var $body = document.body;\n                $body.classList.add('popup');\n                $body.classList.add('with-notes');\n                var $timer = document.createElement('time');\n                $timer.id = '_timer_';\n                $body.appendChild($timer);\n                var hour = 0,\n                    sec = 0,\n                    min = 0;\n                timer = setInterval(function() {\n                    sec++;\n                    if (sec === 60) {\n                        sec = 0;\n                        min++;\n                    }\n                    if (min === 60) {\n                        hour++;\n                    }\n                    $timer.innerHTML = ['时间：' + time2str(hour), time2str(min), time2str(sec) + ' 幻灯片：' + Slide.current + '/' + Slide.count].join(':');\n                }, 1000);\n                postWin = window.opener;\n            }\n        }\n    };\n\n    function time2str(time) {\n        time = '00' + time;\n        return time.substr(-2);\n    }\n    return postMSG;\n});\n"
  },
  {
    "path": "ppt/js/nodeppt.control.socket.js",
    "content": "var socketIOURL = '//' + location.host + '/socket.io/socket.io.js';\n\nSlide.Control.add('socket', function(S, broadcast) {\n    S.clientUID = 0;\n\n    function time2str(time) {\n        time = '00' + time;\n        return time.substr(-2);\n    }\n    var showQrcode;\n    var qrcodeLink = function() {\n        //按 q显示控制区域二维码\n        document.addEventListener('keydown', function(e) {\n            if (e.keyCode === 81) {\n                showQrcode(e);\n            }\n        }, true);\n        var $layer = document.createElement('div');\n        $layer.className = 'qrcode';\n        $layer.id = 'qrcodeBox';\n        $layer.innerHTML = '<div id=\"qrcode\"></div><p><a id=\"ctrlLink\" href=\"#\" target=\"_blank\">打开控制端</a></p>';\n        var $body = document.getElementsByTagName('body')[0];\n        $body.appendChild($layer);\n        var $container = document.getElementById('container');\n\n        showQrcode = function(e) {\n            if (showQrcode.isShow) {\n                // $container.style.display = 'block';\n                $layer.style.display = 'none';\n                showQrcode.isShow = false;\n            } else {\n                // $container.style.display = 'none';\n                $layer.style.display = 'block';\n                showQrcode.isShow = true;\n            }\n        };\n    };\n\n    var webSocket;\n\n    var Socket = {\n        host: '',\n        role: '', //角色\n        clientConnect: function() {\n            //角色是client，即被控制端，则连控制端服务器\n            webSocket.on('data from another client', function(data) {\n                var action = data.action;\n                switch (action) {\n                    case 'from control order':\n                        var fnName = data.fn;\n                        var args = data.args;\n                        try {\n                            args = JSON.parse(args);\n                        } catch (e) {}\n                        Slide.proxyFn(fnName, args);\n                        break;\n                    case 'from control updateItem':\n                    case 'from control update':\n                    case 'from control key event':\n                        broadcast.fire(action, data);\n                        break;\n                    default:\n                        broadcast.fire(action, data.data);\n                }\n            });\n\n        },\n        controlConnect: function() {\n            webSocket.emit('add client', {\n                targetUid: this.clientUID\n            });\n\n            //控制端不在直接运行函数，而是变成发送socket给client\n            //注意参数，进行了json处理哦~\n            Slide.proxyFn = function(fnName, args) {\n                args = JSON.stringify(args);\n                webSocket.emit('repost data', {\n                    action: 'from control order',\n                    fn: fnName,\n                    args: args\n                });\n            };\n            //角色是控制端，则连被控制端（client）服务器\n\n            webSocket.on('data from another client', function(data) {\n                var action = data.action;\n                if (action.indexOf('client') !== -1) {\n                    return;\n                }\n                action = action.replace('client', 'control');\n\n                broadcast.fire(action, data);\n            });\n\n        },\n        connect: function() {\n            webSocket = io.connect(location.host + '/ppt');\n            // console.log(io);\n            webSocket.on('UUID', function(uid) {\n                webSocket.uid = uid;\n                if (Socket.role === 'client') {\n                    MixJS.loadJS('/js/qrcode.js', function() {\n                        qrcodeLink();\n                        var url = location.href.split('#')[0];\n                        url += (!~url.indexOf('?')) ? '?' : '&';\n                        url += 'iscontroller=1&clientid=' + encodeURIComponent(uid);\n                        var qrcode = new QRCode('qrcode', {\n                            text: url,\n                            width: 256,\n                            height: 256\n                        });\n                        document.getElementById('ctrlLink').href = url;\n                    });\n                }\n            });\n            webSocket.on('system', function(data) {\n                // console.log(data);\n                if (showQrcode && showQrcode.isShow) {\n                    showQrcode();\n                }\n            });\n\n            this[this.role + 'Connect']();\n        },\n        broadcast: function(evtName, data) {\n            webSocket.emit('repost data', {\n                action: 'from control ' + evtName,\n                data: data\n            });\n        },\n        update: function(id, direction) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' update',\n                id: id,\n                direction: direction\n            });\n        },\n        updateItem: function(id, item, direction) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' updateItem',\n                id: id,\n                item: item,\n                direction: direction\n            });\n        },\n        keyEvent: function(keyCode) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' key event',\n                keyCode: keyCode\n            });\n        },\n\n        init: function(args) {\n            this.host = args.host || location.href;\n            this.clientUID = args.clientId;\n            // console.log(this.clientUID);\n            //角色，是否为控制端\n            if (args.isControl) {\n                this.role = 'control';\n                var $body = document.body;\n                $body.classList.add('popup');\n                $body.classList.add('with-notes');\n                var $timer = document.createElement('time');\n                $timer.id = '_timer_';\n                $body.appendChild($timer);\n                var hour = 0,\n                    sec = 0,\n                    min = 0;\n                timer = setInterval(function() {\n                    sec++;\n                    if (sec === 60) {\n                        sec = 0;\n                        min++;\n                    }\n                    if (min === 60) {\n                        hour++;\n                    }\n                    $timer.innerHTML = ['时间：' + time2str(hour), time2str(min), time2str(sec) + ' 幻灯片：' + Slide.current + '/' + Slide.count].join(':');\n                }, 1000);\n            } else {\n                this.role = 'client';\n            }\n            if (args.shake) {\n                //添加shake\n                MixJS.loadJS(Slide.dir + 'shake.js', function() {\n                    var lastTime = Date.now();\n                    window.addEventListener('shake', function() {\n                        var now = Date.now();\n                        if (now - lastTime > 3000) {\n                            lastTime = now;\n                            Slide.next();\n                        }\n                    }, true);\n\n                });\n            }\n\n            if (window.io && io.connect) {\n                //已经存在\n                Socket.connect();\n            } else {\n                MixJS.loadJS(socketIOURL, function() {\n                    Socket.connect();\n                });\n            }\n\n        }\n    };\n    return Socket;\n});\n"
  },
  {
    "path": "ppt/js/nodeppt.js",
    "content": "(function($win, $doc, $B, loadJS, loadCSS, undefined) {\n    //用于单页ppt预加载资源\n    var preloadFn = {\n        loadJS: loadJS,\n        loadCSS: loadCSS\n    };\n\n    var $body = $doc.body;\n    var emptyFn = function() {};\n    var emptyArr = [];\n\n    var touchDX = 0; //touch事件x数据\n    var touchDY = 0; //touch事件y数据\n    var touchStartX = 0;\n    var touchStartY = 0;\n    var ISSYNC = false;\n\n    var ctrlType = 'bind';\n    var doHash = true;\n    var lockSlide = false;\n    var slideWidth; //单页宽度\n    var slideHeight;\n    var curIndex = 0; //当前幻灯片索引\n    var pastIndex = 0; //上一个幻灯片索引\n    var $progress; //进度条\n    var $container; //幻灯片容器\n    var $slides; //幻灯片集合\n    var $drawBoard; //画板\n    var $slideTip;\n    var slideCount; //幻灯片总页数-1\n    var QUERY = queryToJson(location.search);\n\n    function queryToJson(url) {\n        url = !!url ? decodeURIComponent(url) : '';\n\n        var locse = url.split('?'),\n            search = locse[1] ? locse[1] : locse[0],\n            pairs = search.split('&'),\n            result = {};\n\n        pairs.forEach(function(pair) {\n            pair = pair.split('=');\n            if (pair[0].length > 0) {\n                result[pair[0]] = pair[1] || '';\n            }\n        });\n\n        return result;\n    }\n\n    //设置底部进度条\n    function setProgress() {\n        //添加dataset\n        Slide.current = curIndex + 1;\n        if ($progress) {\n            $progress.style.width = ((curIndex + 1) / (slideCount + 1)) * 100 + '%';\n        }\n    }\n\n    //泛数组转换为数组\n    function toArray(arrayLike) {\n        return emptyArr.slice.call(arrayLike);\n    }\n\n    //封装选择器\n    function $(selector, context) {\n        context = (context && context.nodeType === 1) ? context : $doc;\n        return context.querySelectorAll(selector);\n    }\n\n    //getID方法\n    function $$(id) {\n        return $doc.getElementById(id);\n    }\n\n\n    //上一页\n    function prevSlide(isControl) {\n        if (buildPrevItem()) {\n            return;\n        }\n        slideOutCallBack($slides[curIndex]);\n        pastIndex = curIndex;\n        --curIndex < 0 && (curIndex = 0);\n        doSlide('prev', isControl ? false : true);\n    }\n\n    //下一页\n    function nextSlide(isControl) {\n        if (buildNextItem()) {\n            // $B.fire('slide change ID',{\n            //    slideID:curIndex\n            // })\n            return;\n        }\n        slideOutCallBack($slides[curIndex]);\n        pastIndex = curIndex;\n        ++curIndex > slideCount && (curIndex = slideCount);\n        doSlide('next', isControl ? false : true);\n        preload($slides[curIndex])($slides[curIndex + 1]);\n    }\n\n\n    //slide切入回调incallback\n    //<slide data-incallback=\"\"\n    var slideInTimer;\n\n    function slideInCallBack() {\n        if (slideInTimer) {\n            clearTimeout(slideInTimer);\n        }\n        slideInTimer = setTimeout(slideInCallBack_, 1500);\n    }\n\n    function slideInCallBack_() {\n        var $cur = $slides[curIndex];\n        if (!$cur || ($cur && $cur.nodeType !== 1)) {\n            return;\n        }\n        var cb = $cur.dataset.incallback;\n        //如果有data-incallback那么就执行callback\n        cb && typeof $win[cb] === 'function' && proxyFn(cb);\n        //检测iframe\n        var $iframe = toArray($('iframe[data-src]', $cur));\n        if ($iframe.length) {\n            $iframe.forEach(function(v) {\n                var src = v.dataset.src;\n                v.src = src;\n            });\n\n        }\n    }\n\n    //slide切出回调outcallback\n    //<slide data-outcallback=\"\"\n    var slideOutTimer;\n\n    function slideOutCallBack(prev) {\n        if (!prev || (prev && prev.nodeType !== 1)) {\n            return;\n        }\n        if (slideOutTimer) {\n            clearTimeout(slideOutTimer);\n        }\n        slideOutTimer = setTimeout(function() {\n            slideOutCallBack_(prev);\n        }, 1500);\n    }\n\n    function slideOutCallBack_(prev) {\n        var cb = prev.dataset.outcallback;\n        //如果有data-outcallback那么就执行callback\n        cb && typeof $win[cb] === 'function' && proxyFn(cb);\n    }\n\n    //预加载资源\n    //<preload data-type=\"js||css\" data-url=\"\">\n    function preload(node) {\n        var self = arguments.callee;\n        if (node && node.nodeType === 1) {\n            var $preload = $('preload', node),\n                len = $preload.length;\n            while (len--) {\n                var tmpNode = $preload[len],\n                    dataset = tmpNode.dataset,\n                    type = dataset.type,\n                    url = dataset.url;\n                var fn = preloadFn['load' + type.toUpperCase()];\n                typeof fn === 'function' && fn(url, function(tmpNode) {\n                    return function() {\n                        //将该标签删除，释放内存\n                        tmpNode.parentNode && tmpNode.parentNode.removeChild(tmpNode);\n                        tmpNode = null;\n                    };\n                }(tmpNode));\n            }\n        }\n        return self;\n    }\n\n\n    //单行前进\n    function buildNextItem(iscontrol) {\n        if ($body.classList.contains('overview')) {\n            return false;\n        }\n        $curSlide = $slides[curIndex];\n        var subBuilded = toArray($('.building'), $curSlide);\n        var list;\n        if (subBuilded.length) {\n\n            while (list = subBuilded.shift()) {\n                list = list.classList\n                list.remove('building');\n                list.add('builded');\n            }\n        }\n        var toBuild = $('.tobuild', $curSlide);\n\n        if (!toBuild.length) {\n            return false;\n        }\n\n        var item = toBuild.item(0);\n        !iscontrol && $B.fire('slide do build', {\n            slideID: curIndex,\n            direction: 'next',\n            build: item.dataset.index\n        })\n        list = item.classList;\n\n        $B.fire('slide.update', curIndex | 0, (item.dataset.index | 0) + 1, 'next');\n        list.remove('tobuild');\n\n        if (list.contains('subSlide')) {\n            toArray($('.subSlide.builded', $curSlide)).forEach(function($item) {\n                $item.classList.add('subBuilded');\n            });\n        }\n\n        list.add('building');\n        return true;\n    }\n\n    //单条往后走\n    function buildPrevItem() {\n        if ($body.classList.contains('overview')) {\n            return false;\n        }\n        $curSlide = $slides[curIndex];\n        var subBuilded = toArray($('.building'), $curSlide);\n        var list;\n        var buildingLen = subBuilded.length;\n        var curList;\n\n        if (buildingLen) {\n            while (list = subBuilded.shift()) {\n                var clist = list.classList\n                clist.remove('building');\n                clist.add('tobuild');\n                curList = list;\n                if (clist.contains('subSlide')) {\n                    var $item = toArray($('.subSlide.builded.subBuilded', $curSlide)).pop();\n                    $item && $item.classList.remove('subBuilded');\n                }\n            }\n        }\n        var builded = toArray($('.builded', $curSlide));\n        if (!builded.length && !buildingLen) {\n            return false;\n        }\n\n        var item = builded.pop();\n        if (item) {\n            if (!curList) {\n                curList = item;\n            }\n            list = item.classList;\n            list.remove('builded');\n            if (buildingLen === 0) {\n                list.add('tobuild');\n                item = builded.pop();\n                item.classList.remove('builded');\n                item.classList.add('building');\n            } else {\n                list.add('building');\n            }\n\n        }\n\n        $B.fire('slide do build', {\n            slideID: curIndex,\n            direction: 'prev',\n            build: curList.dataset.index\n        });\n        $B.fire('slide.update', curIndex | 0, (curList.dataset.index | 0) + 1, 'prev');\n        return true;\n    }\n\n    //设置单行页面添加\n    function makeBuildLists() {\n        var i = slideCount;\n        var slide;\n        var transition = defaultOptions.transition;\n        var buildClass = '.build > *,.fadeIn > *,.rollIn > *,.moveIn > *,.bounceIn > *,.zoomIn > *,.fade > *,.subSlide';\n        while (slide = $slides[i--]) {\n\n            var $items = toArray($(buildClass, slide));\n            var dataset = slide.dataset;\n            $items.forEach(function($v, i) {\n                $v.classList.add('tobuild');\n                if(!('index' in $v.dataset)){\n                    $v.dataset.index = i;\n                }\n            });\n\n\n            if (!dataset.transition) {\n                dataset.transition = transition;\n            }\n        }\n\n    }\n\n    //切换动画\n    function doSlide(direction, isSync) {\n        ISSYNC = typeof isSync === 'boolean' ? isSync : true;\n\n        // $container.style.marginLeft = -(slideID * slideWidth) + 'px';\n        updateSlideClass();\n        setProgress();\n        //发布slide切换状态广播\n        ISSYNC && $B.fire('slide change ID', {\n            slideID: curIndex,\n            direction: direction\n        });\n        if (doHash) {\n            lockSlide = true;\n            $win.location.hash = \"#\" + curIndex;\n        }\n        slideInCallBack();\n        removePaint();\n\n        if ($doc.body.classList.contains('overview')) {\n            focusOverview_();\n            return;\n        } else if (!$doc.body.classList.contains('popup')) {\n            $doc.body.classList.remove('with-notes');\n        }\n\n    }\n\n    function updateSlideClass() {\n        var curSlide = curIndex;\n        var pageClass = 'pagedown';\n        if (pastIndex === curIndex) {\n            $cur = $slides[curIndex];\n            if ($cur.classList.contains('pageup')) {\n                return;\n            }\n        }\n        if (pastIndex > curIndex) {\n            //往前翻页\n            pageClass = 'pageup';\n        } else {\n            //往后翻页\n        }\n        for (var i = 0, len = $slides.length; i < len; ++i) {\n            switch (i) {\n                case curSlide - 2:\n                    updateSlideClass_(i, 'far-past', pageClass);\n                    break;\n                case curSlide - 1:\n                    updateSlideClass_(i, 'past', pageClass);\n                    break;\n                case curSlide:\n                    updateSlideClass_(i, 'current', pageClass);\n                    break;\n                case curSlide + 1:\n                    updateSlideClass_(i, 'next', pageClass);\n                    break;\n                case curSlide + 2:\n                    updateSlideClass_(i, 'far-next', pageClass);\n                    break;\n                default:\n                    updateSlideClass_(i);\n                    break;\n            }\n        }\n        $B.fire('slide.update', curIndex, 0, pageClass);\n\n    }\n\n    function overview(isFromControl) {\n        $body.classList.toggle('overview');\n        focusOverview_();\n        if (!isFromControl) {\n            $B.fire('overview');\n        }\n    }\n\n    function focusOverview_() {\n        var isOV = $doc.body.classList.contains('overview');\n        for (var i = 0, slide; slide = $slides[i]; i++) {\n            slide.style.transform = slide.style.webkitTransform = slide.style.msTransform = slide.style.mozTransform = isOV ?\n                'translateZ(-2500px) translate(' + ((i - curIndex) * 105) +\n                '%, 0%)' : '';\n            slide.style.animation = slide.style.webkitAnimation = slide.style.msAnimation = slide.style.mozAnimation = isOV ?\n                'none' : '';\n            Slide.fire(isOV ? 'overviewshown' : 'overviewhidden');\n        }\n    }\n\n    function updateSlideClass_(slideNo, className, pageClass) {\n        var el = $slides[slideNo];\n\n        if (!el) {\n            return;\n        }\n        if (className) {\n            el.classList.add(className);\n        }\n        if (pageClass && location.href.indexOf('_multiscreen=control') === -1 && location.href.indexOf('iscontroller=1') === -1) {\n            el.classList.add(pageClass);\n        }\n\n        var arr = ['next', 'past', 'far-next', 'far-past', 'current', 'pagedown', 'pageup'];\n        arr.forEach(function(v) {\n            if (className !== v && pageClass !== v) {\n                el.classList.remove(v);\n            }\n        });\n\n    }\n\n    //显示tips\n    function showTips(msg) {\n        if (!$slideTip) {\n            return;\n        }\n        $slideTip.innerHTML = msg;\n        $slideTip.style.display = 'block';\n        setTimeout(function() {\n            $slideTip.style.display = 'none';\n        }, 3E3);\n    }\n\n\n    /*************************events***************/\n\n    //pc键盘翻页事件逻辑\n    function evtDocUp(e) {\n        var key = e.keyCode;\n        var target = e.target;\n        //防止input和textarea，和可以编辑tag\n        if (/^(input|textarea)$/i.test(target.nodeName) || target.isContentEditable) {\n            return;\n        }\n        if (!e.isFromControl) {\n            switch (key) {\n                case 13:\n                case 72:\n                case 87:\n                case 79:\n                case 78:\n                case 80:\n                case 67:\n                    $B.fire('slide event keyup', e);\n                    break;\n            }\n        }\n        switch (key) {\n            case 13:\n                // Enter\n                if ($doc.body.classList.contains('overview')) {\n                    overview(e.isFromControl);\n                }\n\n                break;\n            case 72:\n                // H: Toggle code highlighting\n                $doc.body.classList.toggle('highlight-code');\n                setTimeout(function() {\n                    $doc.body.classList.toggle('highlight-code');\n                }, 2000);\n                break;\n                // 下掉宽屏模式，默认width：100%\n            case 87:\n                // W: Toggle widescreen\n                // Only respect 'w' on body. Don't want to capture keys from an <input>.\n                if (!(e.shiftKey && e.metaKey)) {\n                    if (!$body.classList.contains('popup'))\n                        $container.classList.toggle('layout-widescreen');\n                }\n                break;\n            case 79:\n                // O: Toggle overview\n                overview(e.isFromControl);\n\n                break;\n            case 78:\n                // N\n                if (!$body.classList.contains('popup'))\n                    $doc.body.classList.toggle('with-notes');\n                break;\n            case 80:\n                //P\n                if (!$body.classList.contains('popup')) {\n                    showPaint(e.isFromControl);\n                }\n                break;\n            case 67:\n                //c\n                if (!$body.classList.contains('popup')) {\n                    removePaint(e.isFromControl);\n                }\n                break;\n                //上一页\n            case 33:\n                // pg up\n            case 37:\n                // left\n            case 38:\n                // up\n                prevSlide();\n                break;\n                //下一页\n                // case 9:\n                // tab\n            case 32:\n                // space\n            case 34:\n                // pg down\n            case 39:\n                // right\n            case 40:\n                // down\n                nextSlide()\n                break;\n        }\n\n        //        $container.style.marginLeft = -(curIndex * slideWidth) + 'px';\n        //        setProgress();\n        //        setHistory();\n    }\n\n    /******************************** Touch events *********************/\n    var isStopTouchEvent = false;\n\n    function evtTouchStart(event) {\n        if (!isStopTouchEvent && event.touches.length === 1) {\n            touchDX = 0;\n            touchDY = 0;\n            var touch = event.touches[0];\n            touchStartX = touch.pageX;\n            touchStartY = touch.pageY;\n            //捕获，尽早发现事件\n            $body.addEventListener('touchmove', evtTouchMove, true);\n            $body.addEventListener('touchend', evtTouchEnd, true);\n        }\n    }\n\n    //touch事件\n    function evtTouchMove(event) {\n        if (event.touches.length > 1) {\n            cancelTouch();\n        } else {\n            var touch = event.touches[0];\n\n            touchDX = touch.pageX - touchStartX;\n            touchDY = touch.pageY - touchStartY;\n        }\n        event.preventDefault();\n\n    }\n\n    //touchend事件\n    function evtTouchEnd(event) {\n        var dx = Math.abs(touchDX);\n        var dy = Math.abs(touchDY);\n\n        if ((dx > 15) && (dy < (dx * 2 / 3))) {\n            if (touchDX > 0) {\n                prevSlide();\n            } else {\n                nextSlide();\n            }\n        }\n        cancelTouch();\n    }\n\n    //取消绑定\n    function cancelTouch() {\n        $body.removeEventListener('touchmove', evtTouchMove, true);\n        $body.removeEventListener('touchend', evtTouchEnd, true);\n    }\n\n    //绑定事件\n    function bindEvent() {\n        $doc.addEventListener('keyup', evtDocUp, false);\n        $body.addEventListener('touchstart', evtTouchStart, false);\n        $$('_btn-bar').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n                if (!isOpen) {\n                    this.classList.remove('fa-bars');\n                    this.classList.add('fa-close');\n                    $$('_btn-box').style.display = 'inline-block';\n                } else {\n                    this.classList.remove('fa-close');\n                    this.classList.add('fa-bars');\n                    $$('_btn-box').style.display = 'none';\n\n                }\n                isOpen = !isOpen;\n            };\n        }(), false);\n        $$('_btn-prev').addEventListener('click', prevSlide, false);\n        $$('_btn-next').addEventListener('click', nextSlide, false);\n        $$('_btn-overview').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n\n                if (isOpen) {\n                    this.classList.add('fa-compress');\n                    this.classList.remove('fa-expand');\n                } else {\n                    this.classList.add('fa-expand');\n                    this.classList.remove('fa-compress');\n                }\n\n                overview();\n                isOpen = !isOpen;\n            };\n        }(), false);\n        $$('_btn-brush').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n                if (isOpen) {\n                    this.classList.add('fa-paint-brush');\n                    this.classList.remove('fa-eraser');\n                    removePaint();\n                } else {\n                    showPaint();\n                    this.classList.add('fa-eraser');\n                    this.classList.remove('fa-paint-brush');\n                }\n                isOpen = !isOpen;\n            }\n        }(), false);\n\n        $win.addEventListener('hashchange', function() {\n            if (location.hash && !lockSlide) {\n                doHash = false;\n                slideOutCallBack($slides[curIndex]);\n                pastIndex = curIndex;\n                curIndex = location.hash.substr(1) | 0;\n\n                doSlide();\n                doHash = true;\n            }\n            lockSlide = false;\n        }, true);\n    }\n\n\n    /***********画图部分事件处理函数************/\n    //画图前准备\n\n    function drawCanvasReady() {\n            $drawBoard.context = $drawBoard.getContext('2d');\n            var context = $drawBoard.context;\n            context.lineWidth = 3;\n            context.lineCap = 'round';\n            context.strokeStyle = \"red\";\n        }\n        //显示画板\n    var isControl = 0;\n\n    function showPaint(isFromControl) {\n            if (!$drawBoard) {\n                return;\n            }\n\n            //1、将翻页停止\n            isStopTouchEvent = true;\n            //2、将管理模式去掉\n            if ($body.classList.contains('with-notes')) {\n                isControl = 1;\n                $body.classList.remove('with-notes');\n                $body.classList.remove('popup');\n            }\n            $drawBoard.width = $body.clientWidth;\n            $drawBoard.height = $body.clientHeight;\n            drawCanvasReady();\n\n            $drawBoard.style.display = '';\n            $container.style.overflow = 'hidden';\n\n            $drawBoard.addEventListener('mousedown', pMouseDown, true);\n            $drawBoard.addEventListener('mouseup', pMouseUp, true);\n            $drawBoard.addEventListener('mousemove', pMouseMove, true);\n            //滑动\n            $drawBoard.addEventListener('touchmove', pMouseMove, true);\n            $drawBoard.addEventListener('touchend', pMouseUp, true);\n            $drawBoard.addEventListener('touchcancel', pMouseUp, true);\n            $drawBoard.addEventListener('touchstart', pMouseDown, true);\n\n            $doc.addEventListener('selectstart', stopSelect, true);\n            if (!isFromControl) {\n                $B.fire('show paint');\n            }\n        }\n        //禁止选中\n\n    function stopSelect() {\n            return false;\n        }\n        //清除画板内容\n\n    function clearPaint() {\n            $container.style.overflow = '';\n            $drawBoard.context && $drawBoard.context.clearRect(0, 0, slideWidth, slideHeight);\n            $drawBoard.style.display = 'none';\n        }\n        //删除画板\n    var removePaint = function(isFromControl) {\n        clearPaint();\n        if (isControl) {\n            $body.classList.add('with-notes');\n            $body.classList.add('popup');\n        }\n        isStopTouchEvent = false;\n        $drawBoard.removeEventListener('mousedown', pMouseDown);\n        $drawBoard.removeEventListener('mouseup', pMouseUp);\n        $drawBoard.removeEventListener('mousemove', pMouseMove);\n        //滑动\n        $drawBoard.removeEventListener('touchstart', pMouseDown);\n        $drawBoard.removeEventListener('touchmove', pMouseMove);\n        $drawBoard.removeEventListener('touchend', pMouseUp);\n        $drawBoard.removeEventListener('touchcancel', pMouseUp);\n\n\n        $doc.removeEventListener('selectstart', stopSelect, true);\n        if (!isFromControl) {\n            $B.fire('remove paint');\n        }\n    };\n    var pMouseDown = function(e) {\n        $drawBoard.isMouseDown = true;\n        //        $drawBoard.iLastX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);\n        //        $drawBoard.iLastY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);\n        var x = $drawBoard.iLastX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));\n        var y = $drawBoard.iLastY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));\n        pPoints.push({\n            x: x,\n            y: y\n        });\n    };\n    var pPoints = [];\n    var pMouseUp = function(e) {\n        $drawBoard.isMouseDown = false;\n        $drawBoard.iLastX = -1;\n        $drawBoard.iLastY = -1;\n        if (!e.isFromControl) {\n            $B.fire('paint points', pPoints);\n        }\n        pPoints.length = 0;\n    };\n    $B.on('from control paint points', function(data) {\n        // console.log(data);\n        var points = data.points;\n        //远程来的屏幕\n        var wh = data.screen;\n        var tOX = wh.width / 2,\n            tOY = wh.height / 2;\n\n        var width = $body.offsetWidth;\n        var height = $body.offsetHeight;\n        var cOX = width / 2,\n            cOY = height / 2;\n\n        var iw = width / wh.width;\n        var ih = height / wh.height;\n\n        var context = $drawBoard.context;\n        context.beginPath();\n        var startX = cOX - (tOX - points[0].x) * iw;\n        var startY = cOY - (tOY - points[0].y) * ih;\n        // console.log(startX, points[0].x, startY, iw, wh);\n        context.moveTo(startX, startY);\n        for (var i = 0, len = points.length; i < len; i++) {\n            context.lineTo(cOX - (tOX - points[i].x) * iw, cOY - (tOY - points[i].y) * ih);\n        }\n        context.stroke();\n    });\n    var pMouseMove = function(e) {\n        if ($drawBoard.isMouseDown) {\n            //            var iX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);\n            //            var iY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);\n            var iX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));\n            var iY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));\n            var context = $drawBoard.context;\n            context.beginPath();\n            context.moveTo($drawBoard.iLastX, $drawBoard.iLastY);\n            context.lineTo(iX, iY);\n            context.stroke();\n            $drawBoard.iLastX = iX;\n            $drawBoard.iLastY = iY;\n            pPoints.push({\n                x: iX,\n                y: iY\n            });\n            e.preventDefault();\n        }\n    };\n    //代理函数，用于函数控制\n\n    function proxyFn(fnName, args) {\n        $win[fnName](args);\n    }\n\n    /**\n     * 默认配置\n     * @type {Object}\n     */\n    var defaultOptions = {\n        containerID: 'container',\n        isControlDevice: false,\n        drawBoardID: 'drawBoard',\n        slideClass: '.slide',\n        buildClass: '.build',\n        progressID: 'progress',\n        transition: '',\n        tipID: 'tip',\n        webSocketHost: '',\n        width: 900,\n        dir: './',\n        height: 700,\n        control: false\n    };\n\n    //初始化变量\n    function initVar() {\n\n        $slideTip = $$(defaultOptions.tipID);\n        $container = $$(defaultOptions.containerID);\n        slideWidth = defaultOptions.width;\n        slideHeight = defaultOptions.height;\n        $progress = $$(defaultOptions.progressID);\n        Slide.$slides = $slides = toArray($(defaultOptions.slideClass, $container));\n\n        slideCount = $slides.length; //幻灯片总页数-1\n        Slide.count = slideCount;\n\n        // $container.style.width = slideCount*slideWidth + 'px';//设置容器总宽度\n        slideCount--;\n        $drawBoard = $$(defaultOptions.drawBoardID);\n        if ($drawBoard) {\n            $drawBoard.style.display = 'none';\n        }\n    }\n\n    function fullImg() {\n\n        loadJS(defaultOptions.dir + 'img.screenfull.js', function() {\n            //图片处理\n            var $imgs = toArray($(defaultOptions.slideClass + ' img', $container));\n            screenfull($imgs);\n        });\n    }\n\n    function loadTheme() {\n        if (defaultOptions.theme) {\n            loadCSS('/css/theme.' + defaultOptions.theme + '.css')\n        }\n    }\n\n    //初始化\n    function init(options) {\n        options = options || {};\n\n        for (var key in defaultOptions) {\n            if (!!(key in options)) {\n                defaultOptions[key] = options[key];\n            }\n        }\n        ['theme', 'transition'].forEach(function(v) {\n            if (QUERY && QUERY[v]) {\n                defaultOptions[v] = QUERY[v];\n            }\n        });\n\n        Slide.dir = defaultOptions.dir;\n        if (defaultOptions.control) {\n            var control = defaultOptions.control;\n            loadJS(defaultOptions.dir + 'nodeppt.control.js', function() {\n                Slide.Control.load(control.type, control.args);\n            });\n        }\n\n\n        initVar(); //初始化变量\n        loadTheme();\n        makeBuildLists();\n        fullImg(); //图片全屏\n        bindEvent();\n        pastIndex = curIndex;\n        if (location.hash && (curIndex = (location.hash.substr(1) | 0))) {\n            doSlide();\n        } else {\n            updateSlideClass();\n            setProgress();\n            slideInCallBack();\n        }\n        preload($slides[curIndex])($slides[curIndex + 1]);\n        $body.style.opacity = 1;\n    }\n    var Slide = {\n        init: init,\n        next: nextSlide,\n        prev: prevSlide,\n        doSlide: doSlide,\n        proxyFn: proxyFn,\n        showPaint: showPaint,\n        removePaint: removePaint,\n        buildNextItem: buildNextItem,\n        buildPrevItem: buildPrevItem\n    };\n    ['on', 'un', 'fire'].forEach(function(v) {\n        Slide[v] = function() {\n            var args = toArray(arguments);\n            args[0] = 'slide.' + args[0];\n            $B[v].apply(null, args);\n        }\n    });\n\n    $win.Slide = Slide;\n\n}(window, document, MixJS.event.broadcast, MixJS.loadJS, MixJS.loadCSS));\n"
  },
  {
    "path": "ppt/js/prettify.js",
    "content": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:\"0\"<=b&&b<=\"7\"?parseInt(a.substring(1),8):b===\"u\"||b===\"x\"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?\"\\\\x0\":\"\\\\x\")+a.toString(16);a=String.fromCharCode(a);if(a===\"\\\\\"||a===\"-\"||a===\"[\"||a===\"]\")a=\"\\\\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\S\\s]|[^\\\\]/g),a=\n[],b=[],o=f[0]===\"^\",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&\"-\"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=[\"[\"];o&&b.push(\"^\");b.push.apply(b,a);for(c=0;c<\nf.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push(\"-\"),b.push(e(i[1])));b.push(\"]\");return b.join(\"\")}function y(a){for(var f=a.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j===\"(\"?++i:\"\\\\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j===\"(\"?(++i,d[i]===void 0&&(f[c]=\"(?:\")):\"\\\\\"===j.charAt(0)&&\n(j=+j.substring(1))&&j<=i&&(f[c]=\"\\\\\"+d[i]);for(i=c=0;c<b;++c)\"^\"===f[c]&&\"^\"!==f[c+1]&&(f[c]=\"\");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a===\"[\"?f[c]=h(j):a!==\"\\\\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return f.join(\"\")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\\\u[\\da-f]{4}|\\\\x[\\da-f]{2}|\\\\[^UXux]/gi,\"\"))){s=!0;l=!1;break}}for(var r=\n{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(\"\"+g);n.push(\"(?:\"+y(g)+\")\")}return RegExp(n.join(\"|\"),l?\"gi\":\"g\")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if(\"BR\"===g||\"LI\"===g)h[s]=\"\\n\",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\\r\\n?/g,\"\\n\"):g.replace(/[\\t\\n\\r ]+/g,\" \"),h[s]=g,t[s<<1]=y,y+=g.length,\nt[s++<<1|1]=a)}}var e=/(?:^|\\s)nocode(?:\\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);m(a);return{a:h.join(\"\").replace(/\\n$/,\"\"),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,\"pln\"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===\n\"string\")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b=\"pln\")}if((c=b.length>=5&&\"lang-\"===b.substring(0,5))&&!(o&&typeof o[1]===\"string\"))c=!1,b=\"src\";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),\nl=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=\"\"+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\\S\\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push([\"str\",/^(?:'''(?:[^'\\\\]|\\\\[\\S\\s]|''?(?=[^']))*(?:'''|$)|\"\"\"(?:[^\"\\\\]|\\\\[\\S\\s]|\"\"?(?=[^\"]))*(?:\"\"\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$))/,q,\"'\\\"\"]):a.multiLineStrings?m.push([\"str\",/^(?:'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,\nq,\"'\\\"`\"]):m.push([\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*(?:'|$)|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,q,\"\\\"'\"]);a.verbatimStrings&&e.push([\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,\"#\"]):m.push([\"com\",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,q,\"#\"]),e.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,q])):m.push([\"com\",/^#[^\\n\\r]*/,\nq,\"#\"]));a.cStyleComments&&(e.push([\"com\",/^\\/\\/[^\\n\\r]*/,q]),e.push([\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,q]));a.regexLiterals&&e.push([\"lang-regex\",/^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)/]);(h=a.types)&&e.push([\"typ\",h]);a=(\"\"+a.keywords).replace(/^ | $/g,\n\"\");a.length&&e.push([\"kwd\",RegExp(\"^(?:\"+a.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),q]);m.push([\"pln\",/^\\s+/,q,\" \\r\\n\\t\\xa0\"]);e.push([\"lit\",/^@[$_a-z][\\w$@]*/i,q],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,q],[\"pln\",/^[$_a-z][\\w$@]*/i,q],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,q,\"0123456789\"],[\"pln\",/^\\\\[\\S\\s]?/,q],[\"pun\",/^.[^\\s\\w\"-$'./@\\\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if(\"BR\"===a.nodeName)h(a),\na.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}\nfor(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\\s)nocode(?:\\s|$)/,t=/\\r\\n?|\\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);for(l=s.createElement(\"LI\");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute(\"value\",\nm);var r=s.createElement(\"OL\");r.className=\"linenums\";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className=\"L\"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode(\"\\xa0\")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn(\"cannot override language handler %s\",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\\s*</.test(m)?\"default-markup\":\"default-code\";return A[a]}function E(a){var m=\na.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\\bMSIE\\b/.test(navigator.userAgent),m=/\\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,\"\\r\"));i.nodeValue=\nj;var u=i.ownerDocument,v=u.createElement(\"SPAN\");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){\"console\"in window&&console.log(w&&w.stack?w.stack:w)}}var v=[\"break,continue,do,else,for,if,return,while\"],w=[[v,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\n\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],F=[w,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],G=[w,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"],\nH=[G,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"],w=[w,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"],I=[v,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],\nJ=[v,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],v=[v,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/,N=/\\S/,O=u({keywords:[F,H,w,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\"+\nI,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,[\"default-code\"]);k(x([],[[\"pln\",/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],[\"lang-\",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\S\\s]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),\n[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);k(x([[\"pln\",/^\\s+/,q,\" \\t\\r\\n\"],[\"atv\",/^(?:\"[^\"]*\"?|'[^']*'?)/,q,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^\\s\"'>]*(?:[^\\s\"'/>]|\\/(?=\\s)))/],[\"pun\",/^[/<->]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\"([^\"]+)\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*'([^']+)'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\s\"'>]+)/i],[\"lang-css\",/^style\\s*=\\s*\"([^\"]+)\"/i],[\"lang-css\",/^style\\s*=\\s*'([^']+)'/i],[\"lang-css\",\n/^style\\s*=\\s*([^\\s\"'>]+)/i]]),[\"in.tag\"]);k(x([],[[\"atv\",/^[\\S\\s]+/]]),[\"uq.val\"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);k(u({keywords:\"null,true,false\"}),[\"json\"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),[\"cs\"]);k(u({keywords:G,cStyleComments:!0}),[\"java\"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),[\"bsh\",\"csh\",\"sh\"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),\n[\"cv\",\"py\"]);k(u({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"perl\",\"pl\",\"pm\"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),[\"js\"]);k(u({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\",\nhashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]);k(x([],[[\"str\",/^[\\S\\s]+/]]),[\"regex\"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement(\"PRE\");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf(\"prettyprint\")>=0){var k=k.match(g),f,b;if(b=\n!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&\"CODE\"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName===\"pre\"||o.tagName===\"code\"||o.tagName===\"xmp\")&&o.className&&o.className.indexOf(\"prettyprint\")>=0){b=!0;break}b||((b=(b=n.className.match(/\\blinenums\\b(?::(\\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,\n250):a&&a()}for(var e=[document.getElementsByTagName(\"pre\"),document.getElementsByTagName(\"code\"),document.getElementsByTagName(\"xmp\")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",\nPR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\"}})();\n"
  },
  {
    "path": "ppt/js/qrcode.js",
    "content": "/**\n * @fileoverview\n * - Using the 'QRCode for Javascript library'\n * - Fixed dataset of 'QRCode for Javascript library' for support full-spec.\n * - this library has no dependencies.\n * \n * @author davidshimjs\n * @see <a href=\"http://www.d-project.com/\" target=\"_blank\">http://www.d-project.com/</a>\n * @see <a href=\"http://jeromeetienne.github.com/jquery-qrcode/\" target=\"_blank\">http://jeromeetienne.github.com/jquery-qrcode/</a>\n */\nvar QRCode;\n\n(function () {\n\t//---------------------------------------------------------------------\n\t// QRCode for JavaScript\n\t//\n\t// Copyright (c) 2009 Kazuhiko Arase\n\t//\n\t// URL: http://www.d-project.com/\n\t//\n\t// Licensed under the MIT license:\n\t//   http://www.opensource.org/licenses/mit-license.php\n\t//\n\t// The word \"QR Code\" is registered trademark of \n\t// DENSO WAVE INCORPORATED\n\t//   http://www.denso-wave.com/qrcode/faqpatent-e.html\n\t//\n\t//---------------------------------------------------------------------\n\tfunction QR8bitByte(data){this.mode=QRMode.MODE_8BIT_BYTE;this.data=data;}\n\tQR8bitByte.prototype={getLength:function(buffer){return this.data.length;},write:function(buffer){for(var i=0;i<this.data.length;i++){buffer.put(this.data.charCodeAt(i),8);}}};function QRCodeModel(typeNumber,errorCorrectLevel){this.typeNumber=typeNumber;this.errorCorrectLevel=errorCorrectLevel;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[];}\n\tQRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+\",\"+col);}\n\treturn this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}\n\tthis.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}\n\tif(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}\n\tthis.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}\n\treturn pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}\n\treturn qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}\n\tthis.modules[r][6]=(r%2==0);}\n\tfor(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}\n\tthis.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}\n\tfor(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}\n\tfor(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}\n\tfor(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}\n\tthis.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}\n\tvar mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}\n\tthis.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}\n\trow+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}\n\tvar totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}\n\tif(buffer.getLengthInBits()>totalDataCount*8){throw new Error(\"code length overflow. (\"\n\t+buffer.getLengthInBits()\n\t+\">\"\n\t+totalDataCount*8\n\t+\")\");}\n\tif(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}\n\twhile(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}\n\twhile(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}\n\tbuffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}\n\tbuffer.put(QRCodeModel.PAD1,8);}\n\treturn QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}\n\toffset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}\n\tvar totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}\n\tvar data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}\n\tfor(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}\n\treturn data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}\n\treturn((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}\n\treturn(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}\n\treturn digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error(\"bad maskPattern:\"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}\n\treturn a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error(\"mode:\"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error(\"mode:\"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error(\"mode:\"+mode);}}else{throw new Error(\"type:\"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}\n\tfor(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}\n\tif(r==0&&c==0){continue;}\n\tif(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}\n\tif(sameCount>5){lostPoint+=(3+sameCount-5);}}}\n\tfor(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}\n\tfor(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}\n\tfor(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}\n\tvar darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}\n\tvar ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error(\"glog(\"+n+\")\");}\n\treturn QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}\n\twhile(n>=256){n-=255;}\n\treturn QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}\n\tfor(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}\n\tfor(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}\n\tfunction QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+\"/\"+shift);}\n\tvar offset=0;while(offset<num.length&&num[offset]==0){offset++;}\n\tthis.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}\n\tQRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}\n\treturn new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}\n\tvar ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}\n\tfor(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}\n\treturn new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}\n\tQRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error(\"bad rs block @ typeNumber:\"+typeNumber+\"/errorCorrectLevel:\"+errorCorrectLevel);}\n\tvar length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}\n\treturn list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}\n\tQRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}\n\tif(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}\n\tthis.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];\n\t\n\tfunction _isSupportCanvas() {\n\t\treturn typeof CanvasRenderingContext2D != \"undefined\";\n\t}\n\t\n\t// android 2.x doesn't support Data-URI spec\n\tfunction _getAndroid() {\n\t\tvar android = false;\n\t\tvar sAgent = navigator.userAgent;\n\t\t\n\t\tif (/android/i.test(sAgent)) { // android\n\t\t\tandroid = true;\n\t\t\taMat = sAgent.toString().match(/android ([0-9]\\.[0-9])/i);\n\t\t\t\n\t\t\tif (aMat && aMat[1]) {\n\t\t\t\tandroid = parseFloat(aMat[1]);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn android;\n\t}\n\t\n\t// Drawing in DOM by using Table tag\n\tvar Drawing = !_isSupportCanvas() ? (function () {\n\t\tvar _el = null;\n\t\tvar _htOption = null;\n\t\t\n\t\tvar Drawing = function (el, htOption) {\n\t\t\t_el = el;\n\t\t\t_htOption = htOption;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Draw the QRCode\n\t\t * \n\t\t * @param {QRCode} oQRCode\n\t\t */\n\t\tDrawing.prototype.draw = function (oQRCode) {\n\t\t\tvar nCount = oQRCode.getModuleCount();\n\t\t\tvar nWidth = Math.floor(_htOption.width / nCount);\n\t\t\tvar nHeight = Math.floor(_htOption.height / nCount);\n\t\t\tvar aHTML = ['<table style=\"border:0;border-collapse:collapse;\">'];\n\t\t\t\n\t\t\tfor (var row = 0; row < nCount; row++) {\n\t\t\t\taHTML.push('<tr>');\n\t\t\t\t\n\t\t\t\tfor (var col = 0; col < nCount; col++) {\n\t\t\t\t\taHTML.push('<td style=\"border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';\"></td>');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\taHTML.push('</tr>');\n\t\t\t}\n\t\t\t\n\t\t\taHTML.push('</table>');\n\t\t\t_el.innerHTML = aHTML.join('');\n\t\t\t\n\t\t\t// Fix the margin values as real size.\n\t\t\tvar elTable = _el.childNodes[0];\n\t\t\tvar nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;\n\t\t\tvar nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;\n\t\t\t\n\t\t\tif (nLeftMarginTable > 0 && nTopMarginTable > 0) {\n\t\t\t\telTable.style.margin = nTopMarginTable + \"px \" + nLeftMarginTable + \"px\";\t\n\t\t\t}\n\t\t};\n\t\t\n\t\t/**\n\t\t * Clear the QRCode\n\t\t */\n\t\tDrawing.prototype.clear = function () {\n\t\t\t_el.innerHTML = '';\n\t\t};\n\t\t\n\t\treturn Drawing;\n\t})() : (function () { // Drawing in Canvas\n\t\tvar _el = null;\n\t\tvar _elCanvas = null;\n\t\tvar _elImage = null;\n\t\tvar _fFail = null;\n\t\tvar _fSuccess = null;\n\t\tvar _htOption = null;\n\t\tvar _bSupportDataURI = null;\n\t\tvar _oContext = null;\n\t\tvar _bIsPainted = false;\n\t\tvar _android = _getAndroid();\n\t\t\n\t\tfunction _onMakeImage() {\n\t\t\t_elImage.src = _elCanvas.toDataURL(\"image/png\");\n\t\t\t_elImage.style.display = \"block\";\n\t\t\t_elCanvas.style.display = \"none\";\t\t\t\n\t\t}\n\t\t\n\t\t// Android 2.1 bug workaround\n\t\t// http://code.google.com/p/android/issues/detail?id=5141\n\t\tif (_android && _android <= 2.1) {\n\t    \tvar factor = 1 / window.devicePixelRatio;\n\t        var drawImage = CanvasRenderingContext2D.prototype.drawImage; \n\t    \tCanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {\n\t    \t\tif ((\"nodeName\" in image) && /img/i.test(image.nodeName)) {\n\t\t        \tfor (var i = arguments.length - 1; i >= 1; i--) {\n\t\t            \targuments[i] = arguments[i] * factor;\n\t\t        \t}\n\t    \t\t} else if (typeof dw == \"undefined\") {\n\t    \t\t\targuments[1] *= factor;\n\t    \t\t\targuments[2] *= factor;\n\t    \t\t\targuments[3] *= factor;\n\t    \t\t\targuments[4] *= factor;\n\t    \t\t}\n\t    \t\t\n\t        \tdrawImage.apply(this, arguments); \n\t    \t};\n\t\t}\n\t\t\n\t\t/**\n\t\t * Check whether the user's browser supports Data URI or not\n\t\t * \n\t\t * @private\n\t\t * @param {Function} fSuccess Occurs if it supports Data URI\n\t\t * @param {Function} fFail Occurs if it doesn't support Data URI\n\t\t */\n\t\tfunction _safeSetDataURI(fSuccess, fFail) {\n\t\t\t_fFail = fFail;\n\t\t\t_fSuccess = fSuccess;\n\t\n\t\t\t// Check it just once\n\t\t\tif (_bSupportDataURI === null) {\n\t\t\t\tvar el = document.createElement(\"img\");\n\t\t\t\tvar fOnError = function () {\n\t\t\t\t\t_bSupportDataURI = false;\n\t\t\t\t\t\n\t\t\t\t\tif (_fFail) {\n\t\t\t\t\t\t_fFail();\t\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t};\n\t\t\t\tvar fOnSuccess = function () {\n\t\t\t\t\t_bSupportDataURI = true;\n\t\t\t\t\t\n\t\t\t\t\tif (_fSuccess) {\n\t\t\t\t\t\t_fSuccess();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tel.onabort = fOnError;\n\t\t\t\tel.onerror = fOnError;\n\t\t\t\tel.onload = fOnSuccess;\n\t\t\t\tel.src = \"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\"; // the Image contains 1px data.\n\t\t\t\treturn;\n\t\t\t} else if (_bSupportDataURI === true && _fSuccess) {\n\t\t\t\t_fSuccess();\n\t\t\t} else if (_bSupportDataURI === false && _fFail) {\n\t\t\t\t_fFail();\n\t\t\t}\n\t\t};\n\t\t\n\t\t/**\n\t\t * Drawing QRCode by using canvas\n\t\t * \n\t\t * @constructor\n\t\t * @param {HTMLElement} el\n\t\t * @param {Object} htOption QRCode Options \n\t\t */\n\t\tvar Drawing = function (el, htOption) {\n\t\t\t_htOption = htOption;\n\t\t\t_elCanvas = document.createElement(\"canvas\");\n\t\t\t_elCanvas.width = htOption.width;\n\t\t\t_elCanvas.height = htOption.height;\n\t\t\tel.appendChild(_elCanvas);\n\t\t\t_el = el;\n\t\t\t_oContext = _elCanvas.getContext(\"2d\");\n\t\t\t_bIsPainted = false;\n\t\t\t_elImage = document.createElement(\"img\");\n\t\t\t_elImage.style.display = \"none\";\n\t\t\t_el.appendChild(_elImage);\n\t\t\t_bSupportDataURI = null;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Draw the QRCode\n\t\t * \n\t\t * @param {QRCode} oQRCode \n\t\t */\n\t\tDrawing.prototype.draw = function (oQRCode) {\n\t\t\t_elImage.style.display = \"none\";\n\t\t\tvar nCount = oQRCode.getModuleCount();\n\t\t\tvar nWidth = _htOption.width / nCount;\n\t\t\tvar nHeight = _htOption.height / nCount;\n\t\t\tvar nRoundedWidth = Math.round(nWidth);\n\t\t\tvar nRoundedHeight = Math.round(nHeight);\n\t\t\tthis.clear();\n\t\t\t\n\t\t\tfor (var row = 0; row < nCount; row++) {\n\t\t\t\tfor (var col = 0; col < nCount; col++) {\n\t\t\t\t\tvar bIsDark = oQRCode.isDark(row, col);\n\t\t\t\t\tvar nLeft = col * nWidth;\n\t\t\t\t\tvar nTop = row * nHeight;\n\t\t\t\t\t_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;\n\t\t\t\t\t_oContext.lineWidth = 1;\n\t\t\t\t\t_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;\t\t\t\t\t\n\t\t\t\t\t_oContext.fillRect(nLeft, nTop, nWidth, nHeight);\n\t\t\t\t\t\n\t\t\t\t\t// 안티 앨리어싱 방지 처리\n\t\t\t\t\t_oContext.strokeRect(\n\t\t\t\t\t\tMath.floor(nLeft) + 0.5,\n\t\t\t\t\t\tMath.floor(nTop) + 0.5,\n\t\t\t\t\t\tnRoundedWidth,\n\t\t\t\t\t\tnRoundedHeight\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\t_oContext.strokeRect(\n\t\t\t\t\t\tMath.ceil(nLeft) - 0.5,\n\t\t\t\t\t\tMath.ceil(nTop) - 0.5,\n\t\t\t\t\t\tnRoundedWidth,\n\t\t\t\t\t\tnRoundedHeight\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t_bIsPainted = true;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Make the image from Canvas if the browser supports Data URI.\n\t\t */\n\t\tDrawing.prototype.makeImage = function () {\n\t\t\tif (_bIsPainted) {\n\t\t\t\t_safeSetDataURI(_onMakeImage);\n\t\t\t}\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Return whether the QRCode is painted or not\n\t\t * \n\t\t * @return {Boolean}\n\t\t */\n\t\tDrawing.prototype.isPainted = function () {\n\t\t\treturn _bIsPainted;\n\t\t};\n\t\t\n\t\t/**\n\t\t * Clear the QRCode\n\t\t */\n\t\tDrawing.prototype.clear = function () {\n\t\t\t_oContext.clearRect(0, 0, _elCanvas.width, _elCanvas.height);\n\t\t\t_bIsPainted = false;\n\t\t};\n\t\t\n\t\t/**\n\t\t * @private\n\t\t * @param {Number} nNumber\n\t\t */\n\t\tDrawing.prototype.round = function (nNumber) {\n\t\t\tif (!nNumber) {\n\t\t\t\treturn nNumber;\n\t\t\t}\n\t\t\t\n\t\t\treturn Math.floor(nNumber * 1000) / 1000;\n\t\t};\n\t\t\n\t\treturn Drawing;\n\t})();\n\t\n\t/**\n\t * Get the type by string length\n\t * \n\t * @private\n\t * @param {String} sText\n\t * @param {Number} nCorrectLevel\n\t * @return {Number} type\n\t */\n\tfunction _getTypeNumber(sText, nCorrectLevel) {\t\t\t\n\t\tvar nType = 1;\n\t\t\n\t\tfor (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {\n\t\t\tvar nLimit = 0;\n\t\t\t\n\t\t\tswitch (nCorrectLevel) {\n\t\t\t\tcase QRErrorCorrectLevel.L :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][0];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.M :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.Q :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][2];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.H :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][3];\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tif (sText.length <= nLimit) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tnType++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (nType > QRCodeLimitLength.length) {\n\t\t\tthrow new Error(\"Too long data\");\n\t\t}\n\t\t\n\t\treturn nType;\n\t}\n\t\n\t/**\n\t * @class QRCode\n\t * @constructor\n\t * @example \n\t * new QRCode(document.getElementById(\"test\"), \"http://jindo.dev.naver.com/collie\");\n\t *\n\t * @example\n\t * var oQRCode = new QRCode(\"test\", {\n\t *    text : \"http://naver.com\",\n\t *    width : 128,\n\t *    height : 128\n\t * });\n\t * \n\t * oQRCode.clear(); // Clear the QRCode.\n\t * oQRCode.makeCode(\"http://map.naver.com\"); // Re-create the QRCode.\n\t *\n\t * @param {HTMLElement|String} el target element or 'id' attribute of element.\n\t * @param {Object|String} vOption\n\t * @param {String} vOption.text QRCode link data\n\t * @param {Number} [vOption.width=256]\n\t * @param {Number} [vOption.height=256]\n\t * @param {String} [vOption.colorDark=\"#000000\"]\n\t * @param {String} [vOption.colorLight=\"#ffffff\"]\n\t * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] \n\t */\n\tQRCode = function (el, vOption) {\n\t\tthis._htOption = {\n\t\t\twidth : 256, \n\t\t\theight : 256,\n\t\t\ttypeNumber : 4,\n\t\t\tcolorDark : \"#000000\",\n\t\t\tcolorLight : \"#ffffff\",\n\t\t\tcorrectLevel : QRErrorCorrectLevel.H\n\t\t};\n\t\t\n\t\tif (typeof vOption === 'string') {\n\t\t\tvOption\t= {\n\t\t\t\ttext : vOption\n\t\t\t};\n\t\t}\n\t\t\n\t\t// Overwrites options\n\t\tif (vOption) {\n\t\t\tfor (var i in vOption) {\n\t\t\t\tthis._htOption[i] = vOption[i];\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (typeof el == \"string\") {\n\t\t\tel = document.getElementById(el);\n\t\t}\n\t\t\n\t\tthis._android = _getAndroid();\n\t\tthis._el = el;\n\t\tthis._oQRCode = null;\n\t\tthis._oDrawing = new Drawing(this._el, this._htOption);\n\t\t\n\t\tif (this._htOption.text) {\n\t\t\tthis.makeCode(this._htOption.text);\t\n\t\t}\n\t};\n\t\n\t/**\n\t * Make the QRCode\n\t * \n\t * @param {String} sText link data\n\t */\n\tQRCode.prototype.makeCode = function (sText) {\n\t\tthis._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);\n\t\tthis._oQRCode.addData(sText);\n\t\tthis._oQRCode.make();\n\t\tthis._el.title = sText;\n\t\tthis._oDrawing.draw(this._oQRCode);\t\t\t\n\t\tthis.makeImage();\n\t};\n\t\n\t/**\n\t * Make the Image from Canvas element\n\t * - It occurs automatically\n\t * - Android below 3 doesn't support Data-URI spec.\n\t * \n\t * @private\n\t */\n\tQRCode.prototype.makeImage = function () {\n\t\tif (typeof this._oDrawing.makeImage == \"function\" && (!this._android || this._android >= 3)) {\n\t\t\tthis._oDrawing.makeImage();\n\t\t}\n\t};\n\t\n\t/**\n\t * Clear the QRCode\n\t */\n\tQRCode.prototype.clear = function () {\n\t\tthis._oDrawing.clear();\n\t};\n\t\n\t/**\n\t * @name QRCode.CorrectLevel\n\t */\n\tQRCode.CorrectLevel = QRErrorCorrectLevel;\n})();"
  },
  {
    "path": "ppt/js/shake.js",
    "content": "(function (window, document) {\n\n/**\n * from :https://github.com/alexgibson/shake.js/blob/master/shake.js\n *\n */\n    /**\n     * 摇一摇实现-抽奖游戏\n     * @global\n     * @class Shake\n     *\n     * @example\n     * ```html\n     * <script src=\"../output/template/common/bdbox/game/shake.js\"></script>\n     * <script>\n     * window.addEventListener('shake', shakeEventDidOccur, false);\n     * function shakeEventDidOccur () {\n     *     alert('被摇了');\n     * }\n     * </script>\n     * ```\n     */\n    function Shake() {\n\n        //feature detect\n        this.hasDeviceMotion = 'ondevicemotion' in window;\n\n        //default velocity threshold for shake to register\n        this.threshold = 15;\n\n        //use date to prevent multiple shakes firing\n        this.lastTime = new Date();\n\n        //accelerometer values\n        this.lastX = null;\n        this.lastY = null;\n        this.lastZ = null;\n\n        //create custom event\n        if (typeof document.CustomEvent === \"function\") {\n            this.event = new document.CustomEvent('shake', {\n                bubbles: true,\n                cancelable: true\n            });\n        } else if (typeof document.createEvent === \"function\") {\n            this.event = document.createEvent('Event');\n            this.event.initEvent('shake', true, true);\n        } else {\n          return false;\n        }\n    }\n\n    //reset timer values\n    Shake.prototype.reset = function () {\n        this.lastTime = new Date();\n        this.lastX = null;\n        this.lastY = null;\n        this.lastZ = null;\n    };\n\n    //start listening for devicemotion\n    Shake.prototype.start = function () {\n        this.reset();\n        if (this.hasDeviceMotion) { window.addEventListener('devicemotion', this, false); }\n    };\n\n    //stop listening for devicemotion\n    Shake.prototype.stop = function () {\n\n        if (this.hasDeviceMotion) { window.removeEventListener('devicemotion', this, false); }\n        this.reset();\n    };\n\n    //calculates if shake did occur\n    Shake.prototype.devicemotion = function (e) {\n\n        var current = e.accelerationIncludingGravity,\n            currentTime,\n            timeDifference,\n            deltaX = 0,\n            deltaY = 0,\n            deltaZ = 0;\n\n        if ((this.lastX === null) && (this.lastY === null) && (this.lastZ === null)) {\n            this.lastX = current.x;\n            this.lastY = current.y;\n            this.lastZ = current.z;\n            return;\n        }\n\n        deltaX = Math.abs(this.lastX - current.x);\n        deltaY = Math.abs(this.lastY - current.y);\n        deltaZ = Math.abs(this.lastZ - current.z);\n\n        if (((deltaX > this.threshold) && (deltaY > this.threshold)) || ((deltaX > this.threshold) && (deltaZ > this.threshold)) || ((deltaY > this.threshold) && (deltaZ > this.threshold))) {\n            //calculate time in milliseconds since last shake registered\n            currentTime = new Date();\n            timeDifference = currentTime.getTime() - this.lastTime.getTime();\n\n            if (timeDifference > 1000) {\n                window.dispatchEvent(this.event);\n                this.lastTime = new Date();\n            }\n        }\n\n        this.lastX = current.x;\n        this.lastY = current.y;\n        this.lastZ = current.z;\n\n    };\n\n    //event handler\n    Shake.prototype.handleEvent = function (e) {\n\n        if (typeof (this[e.type]) === 'function') {\n            return this[e.type](e);\n        }\n    };\n\n    //create a new instance of shake.js.\n    var myShakeEvent = new Shake();\n    myShakeEvent.start();\n\n}(window, document));\n"
  },
  {
    "path": "ppt/js/socket.io.js",
    "content": "/*! Socket.IO.js build:0.9.6, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n  /**\n   * IO namespace.\n   *\n   * @namespace\n   */\n\n  var io = exports;\n\n  /**\n   * Socket.IO version\n   *\n   * @api public\n   */\n\n  io.version = '0.9.6';\n\n  /**\n   * Protocol implemented.\n   *\n   * @api public\n   */\n\n  io.protocol = 1;\n\n  /**\n   * Available transports, these will be populated with the available transports\n   *\n   * @api public\n   */\n\n  io.transports = [];\n\n  /**\n   * Keep track of jsonp callbacks.\n   *\n   * @api private\n   */\n\n  io.j = [];\n\n  /**\n   * Keep track of our io.Sockets\n   *\n   * @api private\n   */\n  io.sockets = {};\n\n\n  /**\n   * Manages connections to hosts.\n   *\n   * @param {String} uri\n   * @Param {Boolean} force creation of new socket (defaults to false)\n   * @api public\n   */\n\n  io.connect = function (host, details) {\n    var uri = io.util.parseUri(host)\n      , uuri\n      , socket;\n\n    if (global && global.location) {\n      uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);\n      uri.host = uri.host || (global.document\n        ? global.document.domain : global.location.hostname);\n      uri.port = uri.port || global.location.port;\n    }\n\n    uuri = io.util.uniqueUri(uri);\n\n    var options = {\n        host: uri.host\n      , secure: 'https' == uri.protocol\n      , port: uri.port || ('https' == uri.protocol ? 443 : 80)\n      , query: uri.query || ''\n    };\n\n    io.util.merge(options, details);\n\n    if (options['force new connection'] || !io.sockets[uuri]) {\n      socket = new io.Socket(options);\n    }\n\n    if (!options['force new connection'] && socket) {\n      io.sockets[uuri] = socket;\n    }\n\n    socket = socket || io.sockets[uuri];\n\n    // if path is different from '' or /\n    return socket.of(uri.path.length > 1 ? uri.path : '');\n  };\n\n})('object' === typeof module ? module.exports : (this.io = {}), this);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n  /**\n   * Utilities namespace.\n   *\n   * @namespace\n   */\n\n  var util = exports.util = {};\n\n  /**\n   * Parses an URI\n   *\n   * @author Steven Levithan <stevenlevithan.com> (MIT license)\n   * @api public\n   */\n\n  var re = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\n  var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password',\n               'host', 'port', 'relative', 'path', 'directory', 'file', 'query',\n               'anchor'];\n\n  util.parseUri = function (str) {\n    var m = re.exec(str || '')\n      , uri = {}\n      , i = 14;\n\n    while (i--) {\n      uri[parts[i]] = m[i] || '';\n    }\n\n    return uri;\n  };\n\n  /**\n   * Produces a unique url that identifies a Socket.IO connection.\n   *\n   * @param {Object} uri\n   * @api public\n   */\n\n  util.uniqueUri = function (uri) {\n    var protocol = uri.protocol\n      , host = uri.host\n      , port = uri.port;\n\n    if ('document' in global) {\n      host = host || document.domain;\n      port = port || (protocol == 'https'\n        && document.location.protocol !== 'https:' ? 443 : document.location.port);\n    } else {\n      host = host || 'localhost';\n\n      if (!port && protocol == 'https') {\n        port = 443;\n      }\n    }\n\n    return (protocol || 'http') + '://' + host + ':' + (port || 80);\n  };\n\n  /**\n   * Mergest 2 query strings in to once unique query string\n   *\n   * @param {String} base\n   * @param {String} addition\n   * @api public\n   */\n\n  util.query = function (base, addition) {\n    var query = util.chunkQuery(base || '')\n      , components = [];\n\n    util.merge(query, util.chunkQuery(addition || ''));\n    for (var part in query) {\n      if (query.hasOwnProperty(part)) {\n        components.push(part + '=' + query[part]);\n      }\n    }\n\n    return components.length ? '?' + components.join('&') : '';\n  };\n\n  /**\n   * Transforms a querystring in to an object\n   *\n   * @param {String} qs\n   * @api public\n   */\n\n  util.chunkQuery = function (qs) {\n    var query = {}\n      , params = qs.split('&')\n      , i = 0\n      , l = params.length\n      , kv;\n\n    for (; i < l; ++i) {\n      kv = params[i].split('=');\n      if (kv[0]) {\n        query[kv[0]] = kv[1];\n      }\n    }\n\n    return query;\n  };\n\n  /**\n   * Executes the given function when the page is loaded.\n   *\n   *     io.util.load(function () { console.log('page loaded'); });\n   *\n   * @param {Function} fn\n   * @api public\n   */\n\n  var pageLoaded = false;\n\n  util.load = function (fn) {\n    if ('document' in global && document.readyState === 'complete' || pageLoaded) {\n      return fn();\n    }\n\n    util.on(global, 'load', fn, false);\n  };\n\n  /**\n   * Adds an event.\n   *\n   * @api private\n   */\n\n  util.on = function (element, event, fn, capture) {\n    if (element.attachEvent) {\n      element.attachEvent('on' + event, fn);\n    } else if (element.addEventListener) {\n      element.addEventListener(event, fn, capture);\n    }\n  };\n\n  /**\n   * Generates the correct `XMLHttpRequest` for regular and cross domain requests.\n   *\n   * @param {Boolean} [xdomain] Create a request that can be used cross domain.\n   * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest.\n   * @api private\n   */\n\n  util.request = function (xdomain) {\n\n    if (xdomain && 'undefined' != typeof XDomainRequest) {\n      return new XDomainRequest();\n    }\n\n    if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) {\n      return new XMLHttpRequest();\n    }\n\n    if (!xdomain) {\n      try {\n        return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP');\n      } catch(e) { }\n    }\n\n    return null;\n  };\n\n  /**\n   * XHR based transport constructor.\n   *\n   * @constructor\n   * @api public\n   */\n\n  /**\n   * Change the internal pageLoaded value.\n   */\n\n  if ('undefined' != typeof window) {\n    util.load(function () {\n      pageLoaded = true;\n    });\n  }\n\n  /**\n   * Defers a function to ensure a spinner is not displayed by the browser\n   *\n   * @param {Function} fn\n   * @api public\n   */\n\n  util.defer = function (fn) {\n    if (!util.ua.webkit || 'undefined' != typeof importScripts) {\n      return fn();\n    }\n\n    util.load(function () {\n      setTimeout(fn, 100);\n    });\n  };\n\n  /**\n   * Merges two objects.\n   *\n   * @api public\n   */\n  \n  util.merge = function merge (target, additional, deep, lastseen) {\n    var seen = lastseen || []\n      , depth = typeof deep == 'undefined' ? 2 : deep\n      , prop;\n\n    for (prop in additional) {\n      if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) {\n        if (typeof target[prop] !== 'object' || !depth) {\n          target[prop] = additional[prop];\n          seen.push(additional[prop]);\n        } else {\n          util.merge(target[prop], additional[prop], depth - 1, seen);\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Merges prototypes from objects\n   *\n   * @api public\n   */\n  \n  util.mixin = function (ctor, ctor2) {\n    util.merge(ctor.prototype, ctor2.prototype);\n  };\n\n  /**\n   * Shortcut for prototypical and static inheritance.\n   *\n   * @api private\n   */\n\n  util.inherit = function (ctor, ctor2) {\n    function f() {};\n    f.prototype = ctor2.prototype;\n    ctor.prototype = new f;\n  };\n\n  /**\n   * Checks if the given object is an Array.\n   *\n   *     io.util.isArray([]); // true\n   *     io.util.isArray({}); // false\n   *\n   * @param Object obj\n   * @api public\n   */\n\n  util.isArray = Array.isArray || function (obj) {\n    return Object.prototype.toString.call(obj) === '[object Array]';\n  };\n\n  /**\n   * Intersects values of two arrays into a third\n   *\n   * @api public\n   */\n\n  util.intersect = function (arr, arr2) {\n    var ret = []\n      , longest = arr.length > arr2.length ? arr : arr2\n      , shortest = arr.length > arr2.length ? arr2 : arr;\n\n    for (var i = 0, l = shortest.length; i < l; i++) {\n      if (~util.indexOf(longest, shortest[i]))\n        ret.push(shortest[i]);\n    }\n\n    return ret;\n  }\n\n  /**\n   * Array indexOf compatibility.\n   *\n   * @see bit.ly/a5Dxa2\n   * @api public\n   */\n\n  util.indexOf = function (arr, o, i) {\n    \n    for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; \n         i < j && arr[i] !== o; i++) {}\n\n    return j <= i ? -1 : i;\n  };\n\n  /**\n   * Converts enumerables to array.\n   *\n   * @api public\n   */\n\n  util.toArray = function (enu) {\n    var arr = [];\n\n    for (var i = 0, l = enu.length; i < l; i++)\n      arr.push(enu[i]);\n\n    return arr;\n  };\n\n  /**\n   * UA / engines detection namespace.\n   *\n   * @namespace\n   */\n\n  util.ua = {};\n\n  /**\n   * Whether the UA supports CORS for XHR.\n   *\n   * @api public\n   */\n\n  util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () {\n    try {\n      var a = new XMLHttpRequest();\n    } catch (e) {\n      return false;\n    }\n\n    return a.withCredentials != undefined;\n  })();\n\n  /**\n   * Detect webkit.\n   *\n   * @api public\n   */\n\n  util.ua.webkit = 'undefined' != typeof navigator\n    && /webkit/i.test(navigator.userAgent);\n\n})('undefined' != typeof io ? io : module.exports, this);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.EventEmitter = EventEmitter;\n\n  /**\n   * Event emitter constructor.\n   *\n   * @api public.\n   */\n\n  function EventEmitter () {};\n\n  /**\n   * Adds a listener\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.on = function (name, fn) {\n    if (!this.$events) {\n      this.$events = {};\n    }\n\n    if (!this.$events[name]) {\n      this.$events[name] = fn;\n    } else if (io.util.isArray(this.$events[name])) {\n      this.$events[name].push(fn);\n    } else {\n      this.$events[name] = [this.$events[name], fn];\n    }\n\n    return this;\n  };\n\n  EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n  /**\n   * Adds a volatile listener.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.once = function (name, fn) {\n    var self = this;\n\n    function on () {\n      self.removeListener(name, on);\n      fn.apply(this, arguments);\n    };\n\n    on.listener = fn;\n    this.on(name, on);\n\n    return this;\n  };\n\n  /**\n   * Removes a listener.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.removeListener = function (name, fn) {\n    if (this.$events && this.$events[name]) {\n      var list = this.$events[name];\n\n      if (io.util.isArray(list)) {\n        var pos = -1;\n\n        for (var i = 0, l = list.length; i < l; i++) {\n          if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {\n            pos = i;\n            break;\n          }\n        }\n\n        if (pos < 0) {\n          return this;\n        }\n\n        list.splice(pos, 1);\n\n        if (!list.length) {\n          delete this.$events[name];\n        }\n      } else if (list === fn || (list.listener && list.listener === fn)) {\n        delete this.$events[name];\n      }\n    }\n\n    return this;\n  };\n\n  /**\n   * Removes all listeners for an event.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.removeAllListeners = function (name) {\n    // TODO: enable this when node 0.5 is stable\n    //if (name === undefined) {\n      //this.$events = {};\n      //return this;\n    //}\n\n    if (this.$events && this.$events[name]) {\n      this.$events[name] = null;\n    }\n\n    return this;\n  };\n\n  /**\n   * Gets all listeners for a certain event.\n   *\n   * @api publci\n   */\n\n  EventEmitter.prototype.listeners = function (name) {\n    if (!this.$events) {\n      this.$events = {};\n    }\n\n    if (!this.$events[name]) {\n      this.$events[name] = [];\n    }\n\n    if (!io.util.isArray(this.$events[name])) {\n      this.$events[name] = [this.$events[name]];\n    }\n\n    return this.$events[name];\n  };\n\n  /**\n   * Emits an event.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.emit = function (name) {\n    if (!this.$events) {\n      return false;\n    }\n\n    var handler = this.$events[name];\n\n    if (!handler) {\n      return false;\n    }\n\n    var args = Array.prototype.slice.call(arguments, 1);\n\n    if ('function' == typeof handler) {\n      handler.apply(this, args);\n    } else if (io.util.isArray(handler)) {\n      var listeners = handler.slice();\n\n      for (var i = 0, l = listeners.length; i < l; i++) {\n        listeners[i].apply(this, args);\n      }\n    } else {\n      return false;\n    }\n\n    return true;\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n/**\n * Based on JSON2 (http://www.JSON.org/js.html).\n */\n\n(function (exports, nativeJSON) {\n  \"use strict\";\n\n  // use native JSON if it's available\n  if (nativeJSON && nativeJSON.parse){\n    return exports.JSON = {\n      parse: nativeJSON.parse\n    , stringify: nativeJSON.stringify\n    }\n  }\n\n  var JSON = exports.JSON = {};\n\n  function f(n) {\n      // Format integers to have at least two digits.\n      return n < 10 ? '0' + n : n;\n  }\n\n  function date(d, key) {\n    return isFinite(d.valueOf()) ?\n        d.getUTCFullYear()     + '-' +\n        f(d.getUTCMonth() + 1) + '-' +\n        f(d.getUTCDate())      + 'T' +\n        f(d.getUTCHours())     + ':' +\n        f(d.getUTCMinutes())   + ':' +\n        f(d.getUTCSeconds())   + 'Z' : null;\n  };\n\n  var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n      escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n      gap,\n      indent,\n      meta = {    // table of character substitutions\n          '\\b': '\\\\b',\n          '\\t': '\\\\t',\n          '\\n': '\\\\n',\n          '\\f': '\\\\f',\n          '\\r': '\\\\r',\n          '\"' : '\\\\\"',\n          '\\\\': '\\\\\\\\'\n      },\n      rep;\n\n\n  function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n      escapable.lastIndex = 0;\n      return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n          var c = meta[a];\n          return typeof c === 'string' ? c :\n              '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n      }) + '\"' : '\"' + string + '\"';\n  }\n\n\n  function str(key, holder) {\n\n// Produce a string from holder[key].\n\n      var i,          // The loop counter.\n          k,          // The member key.\n          v,          // The member value.\n          length,\n          mind = gap,\n          partial,\n          value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n      if (value instanceof Date) {\n          value = date(key);\n      }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n      if (typeof rep === 'function') {\n          value = rep.call(holder, key, value);\n      }\n\n// What happens next depends on the value's type.\n\n      switch (typeof value) {\n      case 'string':\n          return quote(value);\n\n      case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n          return isFinite(value) ? String(value) : 'null';\n\n      case 'boolean':\n      case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n          return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n      case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n          if (!value) {\n              return 'null';\n          }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n          gap += indent;\n          partial = [];\n\n// Is the value an array?\n\n          if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n              length = value.length;\n              for (i = 0; i < length; i += 1) {\n                  partial[i] = str(i, value) || 'null';\n              }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n              v = partial.length === 0 ? '[]' : gap ?\n                  '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n                  '[' + partial.join(',') + ']';\n              gap = mind;\n              return v;\n          }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n          if (rep && typeof rep === 'object') {\n              length = rep.length;\n              for (i = 0; i < length; i += 1) {\n                  if (typeof rep[i] === 'string') {\n                      k = rep[i];\n                      v = str(k, value);\n                      if (v) {\n                          partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                      }\n                  }\n              }\n          } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n              for (k in value) {\n                  if (Object.prototype.hasOwnProperty.call(value, k)) {\n                      v = str(k, value);\n                      if (v) {\n                          partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                      }\n                  }\n              }\n          }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n          v = partial.length === 0 ? '{}' : gap ?\n              '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n              '{' + partial.join(',') + '}';\n          gap = mind;\n          return v;\n      }\n  }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n  JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n      var i;\n      gap = '';\n      indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n      if (typeof space === 'number') {\n          for (i = 0; i < space; i += 1) {\n              indent += ' ';\n          }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n      } else if (typeof space === 'string') {\n          indent = space;\n      }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n      rep = replacer;\n      if (replacer && typeof replacer !== 'function' &&\n              (typeof replacer !== 'object' ||\n              typeof replacer.length !== 'number')) {\n          throw new Error('JSON.stringify');\n      }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n      return str('', {'': value});\n  };\n\n// If the JSON object does not yet have a parse method, give it one.\n\n  JSON.parse = function (text, reviver) {\n  // The parse method takes a text and an optional reviver function, and returns\n  // a JavaScript value if the text is a valid JSON text.\n\n      var j;\n\n      function walk(holder, key) {\n\n  // The walk method is used to recursively walk the resulting structure so\n  // that modifications can be made.\n\n          var k, v, value = holder[key];\n          if (value && typeof value === 'object') {\n              for (k in value) {\n                  if (Object.prototype.hasOwnProperty.call(value, k)) {\n                      v = walk(value, k);\n                      if (v !== undefined) {\n                          value[k] = v;\n                      } else {\n                          delete value[k];\n                      }\n                  }\n              }\n          }\n          return reviver.call(holder, key, value);\n      }\n\n\n  // Parsing happens in four stages. In the first stage, we replace certain\n  // Unicode characters with escape sequences. JavaScript handles many characters\n  // incorrectly, either silently deleting them, or treating them as line endings.\n\n      text = String(text);\n      cx.lastIndex = 0;\n      if (cx.test(text)) {\n          text = text.replace(cx, function (a) {\n              return '\\\\u' +\n                  ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n          });\n      }\n\n  // In the second stage, we run the text against regular expressions that look\n  // for non-JSON patterns. We are especially concerned with '()' and 'new'\n  // because they can cause invocation, and '=' because it can cause mutation.\n  // But just to be safe, we want to reject all unexpected forms.\n\n  // We split the second stage into 4 regexp operations in order to work around\n  // crippling inefficiencies in IE's and Safari's regexp engines. First we\n  // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n  // replace all simple value tokens with ']' characters. Third, we delete all\n  // open brackets that follow a colon or comma or that begin the text. Finally,\n  // we look to see that the remaining characters are only whitespace or ']' or\n  // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n      if (/^[\\],:{}\\s]*$/\n              .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n                  .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n                  .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n  // In the third stage we use the eval function to compile the text into a\n  // JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n  // in JavaScript: it can begin a block or an object literal. We wrap the text\n  // in parens to eliminate the ambiguity.\n\n          j = eval('(' + text + ')');\n\n  // In the optional fourth stage, we recursively walk the new structure, passing\n  // each name/value pair to a reviver function for possible transformation.\n\n          return typeof reviver === 'function' ?\n              walk({'': j}, '') : j;\n      }\n\n  // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n      throw new SyntaxError('JSON.parse');\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , typeof JSON !== 'undefined' ? JSON : undefined\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Parser namespace.\n   *\n   * @namespace\n   */\n\n  var parser = exports.parser = {};\n\n  /**\n   * Packet types.\n   */\n\n  var packets = parser.packets = [\n      'disconnect'\n    , 'connect'\n    , 'heartbeat'\n    , 'message'\n    , 'json'\n    , 'event'\n    , 'ack'\n    , 'error'\n    , 'noop'\n  ];\n\n  /**\n   * Errors reasons.\n   */\n\n  var reasons = parser.reasons = [\n      'transport not supported'\n    , 'client not handshaken'\n    , 'unauthorized'\n  ];\n\n  /**\n   * Errors advice.\n   */\n\n  var advice = parser.advice = [\n      'reconnect'\n  ];\n\n  /**\n   * Shortcuts.\n   */\n\n  var JSON = io.JSON\n    , indexOf = io.util.indexOf;\n\n  /**\n   * Encodes a packet.\n   *\n   * @api private\n   */\n\n  parser.encodePacket = function (packet) {\n    var type = indexOf(packets, packet.type)\n      , id = packet.id || ''\n      , endpoint = packet.endpoint || ''\n      , ack = packet.ack\n      , data = null;\n\n    switch (packet.type) {\n      case 'error':\n        var reason = packet.reason ? indexOf(reasons, packet.reason) : ''\n          , adv = packet.advice ? indexOf(advice, packet.advice) : '';\n\n        if (reason !== '' || adv !== '')\n          data = reason + (adv !== '' ? ('+' + adv) : '');\n\n        break;\n\n      case 'message':\n        if (packet.data !== '')\n          data = packet.data;\n        break;\n\n      case 'event':\n        var ev = { name: packet.name };\n\n        if (packet.args && packet.args.length) {\n          ev.args = packet.args;\n        }\n\n        data = JSON.stringify(ev);\n        break;\n\n      case 'json':\n        data = JSON.stringify(packet.data);\n        break;\n\n      case 'connect':\n        if (packet.qs)\n          data = packet.qs;\n        break;\n\n      case 'ack':\n        data = packet.ackId\n          + (packet.args && packet.args.length\n              ? '+' + JSON.stringify(packet.args) : '');\n        break;\n    }\n\n    // construct packet with required fragments\n    var encoded = [\n        type\n      , id + (ack == 'data' ? '+' : '')\n      , endpoint\n    ];\n\n    // data fragment is optional\n    if (data !== null && data !== undefined)\n      encoded.push(data);\n\n    return encoded.join(':');\n  };\n\n  /**\n   * Encodes multiple messages (payload).\n   *\n   * @param {Array} messages\n   * @api private\n   */\n\n  parser.encodePayload = function (packets) {\n    var decoded = '';\n\n    if (packets.length == 1)\n      return packets[0];\n\n    for (var i = 0, l = packets.length; i < l; i++) {\n      var packet = packets[i];\n      decoded += '\\ufffd' + packet.length + '\\ufffd' + packets[i];\n    }\n\n    return decoded;\n  };\n\n  /**\n   * Decodes a packet\n   *\n   * @api private\n   */\n\n  var regexp = /([^:]+):([0-9]+)?(\\+)?:([^:]+)?:?([\\s\\S]*)?/;\n\n  parser.decodePacket = function (data) {\n    var pieces = data.match(regexp);\n\n    if (!pieces) return {};\n\n    var id = pieces[2] || ''\n      , data = pieces[5] || ''\n      , packet = {\n            type: packets[pieces[1]]\n          , endpoint: pieces[4] || ''\n        };\n\n    // whether we need to acknowledge the packet\n    if (id) {\n      packet.id = id;\n      if (pieces[3])\n        packet.ack = 'data';\n      else\n        packet.ack = true;\n    }\n\n    // handle different packet types\n    switch (packet.type) {\n      case 'error':\n        var pieces = data.split('+');\n        packet.reason = reasons[pieces[0]] || '';\n        packet.advice = advice[pieces[1]] || '';\n        break;\n\n      case 'message':\n        packet.data = data || '';\n        break;\n\n      case 'event':\n        try {\n          var opts = JSON.parse(data);\n          packet.name = opts.name;\n          packet.args = opts.args;\n        } catch (e) { }\n\n        packet.args = packet.args || [];\n        break;\n\n      case 'json':\n        try {\n          packet.data = JSON.parse(data);\n        } catch (e) { }\n        break;\n\n      case 'connect':\n        packet.qs = data || '';\n        break;\n\n      case 'ack':\n        var pieces = data.match(/^([0-9]+)(\\+)?(.*)/);\n        if (pieces) {\n          packet.ackId = pieces[1];\n          packet.args = [];\n\n          if (pieces[3]) {\n            try {\n              packet.args = pieces[3] ? JSON.parse(pieces[3]) : [];\n            } catch (e) { }\n          }\n        }\n        break;\n\n      case 'disconnect':\n      case 'heartbeat':\n        break;\n    };\n\n    return packet;\n  };\n\n  /**\n   * Decodes data payload. Detects multiple messages\n   *\n   * @return {Array} messages\n   * @api public\n   */\n\n  parser.decodePayload = function (data) {\n    // IE doesn't like data[i] for unicode chars, charAt works fine\n    if (data.charAt(0) == '\\ufffd') {\n      var ret = [];\n\n      for (var i = 1, length = ''; i < data.length; i++) {\n        if (data.charAt(i) == '\\ufffd') {\n          ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length)));\n          i += Number(length) + 1;\n          length = '';\n        } else {\n          length += data.charAt(i);\n        }\n      }\n\n      return ret;\n    } else {\n      return [parser.decodePacket(data)];\n    }\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.Transport = Transport;\n\n  /**\n   * This is the transport template for all supported transport methods.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function Transport (socket, sessid) {\n    this.socket = socket;\n    this.sessid = sessid;\n  };\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(Transport, io.EventEmitter);\n\n  /**\n   * Handles the response from the server. When a new response is received\n   * it will automatically update the timeout, decode the message and\n   * forwards the response to the onMessage function for further processing.\n   *\n   * @param {String} data Response from the server.\n   * @api private\n   */\n\n  Transport.prototype.onData = function (data) {\n    this.clearCloseTimeout();\n    \n    // If the connection in currently open (or in a reopening state) reset the close \n    // timeout since we have just received data. This check is necessary so\n    // that we don't reset the timeout on an explicitly disconnected connection.\n    if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) {\n      this.setCloseTimeout();\n    }\n\n    if (data !== '') {\n      // todo: we should only do decodePayload for xhr transports\n      var msgs = io.parser.decodePayload(data);\n\n      if (msgs && msgs.length) {\n        for (var i = 0, l = msgs.length; i < l; i++) {\n          this.onPacket(msgs[i]);\n        }\n      }\n    }\n\n    return this;\n  };\n\n  /**\n   * Handles packets.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onPacket = function (packet) {\n    this.socket.setHeartbeatTimeout();\n\n    if (packet.type == 'heartbeat') {\n      return this.onHeartbeat();\n    }\n\n    if (packet.type == 'connect' && packet.endpoint == '') {\n      this.onConnect();\n    }\n\n    if (packet.type == 'error' && packet.advice == 'reconnect') {\n      this.open = false;\n    }\n\n    this.socket.onPacket(packet);\n\n    return this;\n  };\n\n  /**\n   * Sets close timeout\n   *\n   * @api private\n   */\n  \n  Transport.prototype.setCloseTimeout = function () {\n    if (!this.closeTimeout) {\n      var self = this;\n\n      this.closeTimeout = setTimeout(function () {\n        self.onDisconnect();\n      }, this.socket.closeTimeout);\n    }\n  };\n\n  /**\n   * Called when transport disconnects.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onDisconnect = function () {\n    if (this.close && this.open) this.close();\n    this.clearTimeouts();\n    this.socket.onDisconnect();\n    return this;\n  };\n\n  /**\n   * Called when transport connects\n   *\n   * @api private\n   */\n\n  Transport.prototype.onConnect = function () {\n    this.socket.onConnect();\n    return this;\n  }\n\n  /**\n   * Clears close timeout\n   *\n   * @api private\n   */\n\n  Transport.prototype.clearCloseTimeout = function () {\n    if (this.closeTimeout) {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n    }\n  };\n\n  /**\n   * Clear timeouts\n   *\n   * @api private\n   */\n\n  Transport.prototype.clearTimeouts = function () {\n    this.clearCloseTimeout();\n\n    if (this.reopenTimeout) {\n      clearTimeout(this.reopenTimeout);\n    }\n  };\n\n  /**\n   * Sends a packet\n   *\n   * @param {Object} packet object.\n   * @api private\n   */\n\n  Transport.prototype.packet = function (packet) {\n    this.send(io.parser.encodePacket(packet));\n  };\n\n  /**\n   * Send the received heartbeat message back to server. So the server\n   * knows we are still connected.\n   *\n   * @param {String} heartbeat Heartbeat response from the server.\n   * @api private\n   */\n\n  Transport.prototype.onHeartbeat = function (heartbeat) {\n    this.packet({ type: 'heartbeat' });\n  };\n \n  /**\n   * Called when the transport opens.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onOpen = function () {\n    this.open = true;\n    this.clearCloseTimeout();\n    this.socket.onOpen();\n  };\n\n  /**\n   * Notifies the base when the connection with the Socket.IO server\n   * has been disconnected.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onClose = function () {\n    var self = this;\n\n    /* FIXME: reopen delay causing a infinit loop\n    this.reopenTimeout = setTimeout(function () {\n      self.open();\n    }, this.socket.options['reopen delay']);*/\n\n    this.open = false;\n    this.socket.onClose();\n    this.onDisconnect();\n  };\n\n  /**\n   * Generates a connection url based on the Socket.IO URL Protocol.\n   * See <https://github.com/learnboost/socket.io-node/> for more details.\n   *\n   * @returns {String} Connection url\n   * @api private\n   */\n\n  Transport.prototype.prepareUrl = function () {\n    var options = this.socket.options;\n\n    return this.scheme() + '://'\n      + options.host + ':' + options.port + '/'\n      + options.resource + '/' + io.protocol\n      + '/' + this.name + '/' + this.sessid;\n  };\n\n  /**\n   * Checks if the transport is ready to start a connection.\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  Transport.prototype.ready = function (socket, fn) {\n    fn.call(this);\n  };\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.Socket = Socket;\n\n  /**\n   * Create a new `Socket.IO client` which can establish a persistent\n   * connection with a Socket.IO enabled server.\n   *\n   * @api public\n   */\n\n  function Socket (options) {\n    this.options = {\n        port: 80\n      , secure: false\n      , document: 'document' in global ? document : false\n      , resource: 'socket.io'\n      , transports: io.transports\n      , 'connect timeout': 10000\n      , 'try multiple transports': true\n      , 'reconnect': true\n      , 'reconnection delay': 500\n      , 'reconnection limit': Infinity\n      , 'reopen delay': 3000\n      , 'max reconnection attempts': 10\n      , 'sync disconnect on unload': true\n      , 'auto connect': true\n      , 'flash policy port': 10843\n    };\n\n    io.util.merge(this.options, options);\n\n    this.connected = false;\n    this.open = false;\n    this.connecting = false;\n    this.reconnecting = false;\n    this.namespaces = {};\n    this.buffer = [];\n    this.doBuffer = false;\n\n    if (this.options['sync disconnect on unload'] &&\n        (!this.isXDomain() || io.util.ua.hasCORS)) {\n      var self = this;\n\n      io.util.on(global, 'unload', function () {\n        self.disconnectSync();\n      }, false);\n    }\n\n    if (this.options['auto connect']) {\n      this.connect();\n    }\n};\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(Socket, io.EventEmitter);\n\n  /**\n   * Returns a namespace listener/emitter for this socket\n   *\n   * @api public\n   */\n\n  Socket.prototype.of = function (name) {\n    if (!this.namespaces[name]) {\n      this.namespaces[name] = new io.SocketNamespace(this, name);\n\n      if (name !== '') {\n        this.namespaces[name].packet({ type: 'connect' });\n      }\n    }\n\n    return this.namespaces[name];\n  };\n\n  /**\n   * Emits the given event to the Socket and all namespaces\n   *\n   * @api private\n   */\n\n  Socket.prototype.publish = function () {\n    this.emit.apply(this, arguments);\n\n    var nsp;\n\n    for (var i in this.namespaces) {\n      if (this.namespaces.hasOwnProperty(i)) {\n        nsp = this.of(i);\n        nsp.$emit.apply(nsp, arguments);\n      }\n    }\n  };\n\n  /**\n   * Performs the handshake\n   *\n   * @api private\n   */\n\n  function empty () { };\n\n  Socket.prototype.handshake = function (fn) {\n    var self = this\n      , options = this.options;\n\n    function complete (data) {\n      if (data instanceof Error) {\n        self.onError(data.message);\n      } else {\n        fn.apply(null, data.split(':'));\n      }\n    };\n\n    var url = [\n          'http' + (options.secure ? 's' : '') + ':/'\n        , options.host + ':' + options.port\n        , options.resource\n        , io.protocol\n        , io.util.query(this.options.query, 't=' + +new Date)\n      ].join('/');\n\n    if (this.isXDomain() && !io.util.ua.hasCORS) {\n      var insertAt = document.getElementsByTagName('script')[0]\n        , script = document.createElement('script');\n\n      script.src = url + '&jsonp=' + io.j.length;\n      insertAt.parentNode.insertBefore(script, insertAt);\n\n      io.j.push(function (data) {\n        complete(data);\n        script.parentNode.removeChild(script);\n      });\n    } else {\n      var xhr = io.util.request();\n\n      xhr.open('GET', url, true);\n      xhr.withCredentials = true;\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState == 4) {\n          xhr.onreadystatechange = empty;\n\n          if (xhr.status == 200) {\n            complete(xhr.responseText);\n          } else {\n            !self.reconnecting && self.onError(xhr.responseText);\n          }\n        }\n      };\n      xhr.send(null);\n    }\n  };\n\n  /**\n   * Find an available transport based on the options supplied in the constructor.\n   *\n   * @api private\n   */\n\n  Socket.prototype.getTransport = function (override) {\n    var transports = override || this.transports, match;\n\n    for (var i = 0, transport; transport = transports[i]; i++) {\n      if (io.Transport[transport]\n        && io.Transport[transport].check(this)\n        && (!this.isXDomain() || io.Transport[transport].xdomainCheck())) {\n        return new io.Transport[transport](this, this.sessionid);\n      }\n    }\n\n    return null;\n  };\n\n  /**\n   * Connects to the server.\n   *\n   * @param {Function} [fn] Callback.\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.connect = function (fn) {\n    if (this.connecting) {\n      return this;\n    }\n\n    var self = this;\n\n    this.handshake(function (sid, heartbeat, close, transports) {\n      self.sessionid = sid;\n      self.closeTimeout = close * 1000;\n      self.heartbeatTimeout = heartbeat * 1000;\n      self.transports = transports ? io.util.intersect(\n          transports.split(',')\n        , self.options.transports\n      ) : self.options.transports;\n\n      self.setHeartbeatTimeout();\n\n      function connect (transports){\n        if (self.transport) self.transport.clearTimeouts();\n\n        self.transport = self.getTransport(transports);\n        if (!self.transport) return self.publish('connect_failed');\n\n        // once the transport is ready\n        self.transport.ready(self, function () {\n          self.connecting = true;\n          self.publish('connecting', self.transport.name);\n          self.transport.open();\n\n          if (self.options['connect timeout']) {\n            self.connectTimeoutTimer = setTimeout(function () {\n              if (!self.connected) {\n                self.connecting = false;\n\n                if (self.options['try multiple transports']) {\n                  if (!self.remainingTransports) {\n                    self.remainingTransports = self.transports.slice(0);\n                  }\n\n                  var remaining = self.remainingTransports;\n\n                  while (remaining.length > 0 && remaining.splice(0,1)[0] !=\n                         self.transport.name) {}\n\n                    if (remaining.length){\n                      connect(remaining);\n                    } else {\n                      self.publish('connect_failed');\n                    }\n                }\n              }\n            }, self.options['connect timeout']);\n          }\n        });\n      }\n\n      connect(self.transports);\n\n      self.once('connect', function (){\n        clearTimeout(self.connectTimeoutTimer);\n\n        fn && typeof fn == 'function' && fn();\n      });\n    });\n\n    return this;\n  };\n\n  /**\n   * Clears and sets a new heartbeat timeout using the value given by the\n   * server during the handshake.\n   *\n   * @api private\n   */\n\n  Socket.prototype.setHeartbeatTimeout = function () {\n    clearTimeout(this.heartbeatTimeoutTimer);\n\n    var self = this;\n    this.heartbeatTimeoutTimer = setTimeout(function () {\n      self.transport.onClose();\n    }, this.heartbeatTimeout);\n  };\n\n  /**\n   * Sends a message.\n   *\n   * @param {Object} data packet.\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.packet = function (data) {\n    if (this.connected && !this.doBuffer) {\n      this.transport.packet(data);\n    } else {\n      this.buffer.push(data);\n    }\n\n    return this;\n  };\n\n  /**\n   * Sets buffer state\n   *\n   * @api private\n   */\n\n  Socket.prototype.setBuffer = function (v) {\n    this.doBuffer = v;\n\n    if (!v && this.connected && this.buffer.length) {\n      this.transport.payload(this.buffer);\n      this.buffer = [];\n    }\n  };\n\n  /**\n   * Disconnect the established connect.\n   *\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.disconnect = function () {\n    if (this.connected || this.connecting) {\n      if (this.open) {\n        this.of('').packet({ type: 'disconnect' });\n      }\n\n      // handle disconnection immediately\n      this.onDisconnect('booted');\n    }\n\n    return this;\n  };\n\n  /**\n   * Disconnects the socket with a sync XHR.\n   *\n   * @api private\n   */\n\n  Socket.prototype.disconnectSync = function () {\n    // ensure disconnection\n    var xhr = io.util.request()\n      , uri = this.resource + '/' + io.protocol + '/' + this.sessionid;\n\n    xhr.open('GET', uri, true);\n\n    // handle disconnection immediately\n    this.onDisconnect('booted');\n  };\n\n  /**\n   * Check if we need to use cross domain enabled transports. Cross domain would\n   * be a different port or different domain name.\n   *\n   * @returns {Boolean}\n   * @api private\n   */\n\n  Socket.prototype.isXDomain = function () {\n\n    var port = global.location.port ||\n      ('https:' == global.location.protocol ? 443 : 80);\n\n    return this.options.host !== global.location.hostname \n      || this.options.port != port;\n  };\n\n  /**\n   * Called upon handshake.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onConnect = function () {\n    if (!this.connected) {\n      this.connected = true;\n      this.connecting = false;\n      if (!this.doBuffer) {\n        // make sure to flush the buffer\n        this.setBuffer(false);\n      }\n      this.emit('connect');\n    }\n  };\n\n  /**\n   * Called when the transport opens\n   *\n   * @api private\n   */\n\n  Socket.prototype.onOpen = function () {\n    this.open = true;\n  };\n\n  /**\n   * Called when the transport closes.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onClose = function () {\n    this.open = false;\n    clearTimeout(this.heartbeatTimeoutTimer);\n  };\n\n  /**\n   * Called when the transport first opens a connection\n   *\n   * @param text\n   */\n\n  Socket.prototype.onPacket = function (packet) {\n    this.of(packet.endpoint).onPacket(packet);\n  };\n\n  /**\n   * Handles an error.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onError = function (err) {\n    if (err && err.advice) {\n      if (err.advice === 'reconnect' && (this.connected || this.connecting)) {\n        this.disconnect();\n        if (this.options.reconnect) {\n          this.reconnect();\n        }\n      }\n    }\n\n    this.publish('error', err && err.reason ? err.reason : err);\n  };\n\n  /**\n   * Called when the transport disconnects.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onDisconnect = function (reason) {\n    var wasConnected = this.connected\n      , wasConnecting = this.connecting;\n\n    this.connected = false;\n    this.connecting = false;\n    this.open = false;\n\n    if (wasConnected || wasConnecting) {\n      this.transport.close();\n      this.transport.clearTimeouts();\n      if (wasConnected) {\n        this.publish('disconnect', reason);\n\n        if ('booted' != reason && this.options.reconnect && !this.reconnecting) {\n          this.reconnect();\n        }\n      }\n    }\n  };\n\n  /**\n   * Called upon reconnection.\n   *\n   * @api private\n   */\n\n  Socket.prototype.reconnect = function () {\n    this.reconnecting = true;\n    this.reconnectionAttempts = 0;\n    this.reconnectionDelay = this.options['reconnection delay'];\n\n    var self = this\n      , maxAttempts = this.options['max reconnection attempts']\n      , tryMultiple = this.options['try multiple transports']\n      , limit = this.options['reconnection limit'];\n\n    function reset () {\n      if (self.connected) {\n        for (var i in self.namespaces) {\n          if (self.namespaces.hasOwnProperty(i) && '' !== i) {\n              self.namespaces[i].packet({ type: 'connect' });\n          }\n        }\n        self.publish('reconnect', self.transport.name, self.reconnectionAttempts);\n      }\n\n      clearTimeout(self.reconnectionTimer);\n\n      self.removeListener('connect_failed', maybeReconnect);\n      self.removeListener('connect', maybeReconnect);\n\n      self.reconnecting = false;\n\n      delete self.reconnectionAttempts;\n      delete self.reconnectionDelay;\n      delete self.reconnectionTimer;\n      delete self.redoTransports;\n\n      self.options['try multiple transports'] = tryMultiple;\n    };\n\n    function maybeReconnect () {\n      if (!self.reconnecting) {\n        return;\n      }\n\n      if (self.connected) {\n        return reset();\n      };\n\n      if (self.connecting && self.reconnecting) {\n        return self.reconnectionTimer = setTimeout(maybeReconnect, 1000);\n      }\n\n      if (self.reconnectionAttempts++ >= maxAttempts) {\n        if (!self.redoTransports) {\n          self.on('connect_failed', maybeReconnect);\n          self.options['try multiple transports'] = true;\n          self.transport = self.getTransport();\n          self.redoTransports = true;\n          self.connect();\n        } else {\n          self.publish('reconnect_failed');\n          reset();\n        }\n      } else {\n        if (self.reconnectionDelay < limit) {\n          self.reconnectionDelay *= 2; // exponential back off\n        }\n\n        self.connect();\n        self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts);\n        self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay);\n      }\n    };\n\n    this.options['try multiple transports'] = false;\n    this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay);\n\n    this.on('connect', maybeReconnect);\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.SocketNamespace = SocketNamespace;\n\n  /**\n   * Socket namespace constructor.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function SocketNamespace (socket, name) {\n    this.socket = socket;\n    this.name = name || '';\n    this.flags = {};\n    this.json = new Flag(this, 'json');\n    this.ackPackets = 0;\n    this.acks = {};\n  };\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(SocketNamespace, io.EventEmitter);\n\n  /**\n   * Copies emit since we override it\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit;\n\n  /**\n   * Creates a new namespace, by proxying the request to the socket. This\n   * allows us to use the synax as we do on the server.\n   *\n   * @api public\n   */\n\n  SocketNamespace.prototype.of = function () {\n    return this.socket.of.apply(this.socket, arguments);\n  };\n\n  /**\n   * Sends a packet.\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.packet = function (packet) {\n    packet.endpoint = this.name;\n    this.socket.packet(packet);\n    this.flags = {};\n    return this;\n  };\n\n  /**\n   * Sends a message\n   *\n   * @api public\n   */\n\n  SocketNamespace.prototype.send = function (data, fn) {\n    var packet = {\n        type: this.flags.json ? 'json' : 'message'\n      , data: data\n    };\n\n    if ('function' == typeof fn) {\n      packet.id = ++this.ackPackets;\n      packet.ack = true;\n      this.acks[packet.id] = fn;\n    }\n\n    return this.packet(packet);\n  };\n\n  /**\n   * Emits an event\n   *\n   * @api public\n   */\n  \n  SocketNamespace.prototype.emit = function (name) {\n    var args = Array.prototype.slice.call(arguments, 1)\n      , lastArg = args[args.length - 1]\n      , packet = {\n            type: 'event'\n          , name: name\n        };\n\n    if ('function' == typeof lastArg) {\n      packet.id = ++this.ackPackets;\n      packet.ack = 'data';\n      this.acks[packet.id] = lastArg;\n      args = args.slice(0, args.length - 1);\n    }\n\n    packet.args = args;\n\n    return this.packet(packet);\n  };\n\n  /**\n   * Disconnects the namespace\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.disconnect = function () {\n    if (this.name === '') {\n      this.socket.disconnect();\n    } else {\n      this.packet({ type: 'disconnect' });\n      this.$emit('disconnect');\n    }\n\n    return this;\n  };\n\n  /**\n   * Handles a packet\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.onPacket = function (packet) {\n    var self = this;\n\n    function ack () {\n      self.packet({\n          type: 'ack'\n        , args: io.util.toArray(arguments)\n        , ackId: packet.id\n      });\n    };\n\n    switch (packet.type) {\n      case 'connect':\n        this.$emit('connect');\n        break;\n\n      case 'disconnect':\n        if (this.name === '') {\n          this.socket.onDisconnect(packet.reason || 'booted');\n        } else {\n          this.$emit('disconnect', packet.reason);\n        }\n        break;\n\n      case 'message':\n      case 'json':\n        var params = ['message', packet.data];\n\n        if (packet.ack == 'data') {\n          params.push(ack);\n        } else if (packet.ack) {\n          this.packet({ type: 'ack', ackId: packet.id });\n        }\n\n        this.$emit.apply(this, params);\n        break;\n\n      case 'event':\n        var params = [packet.name].concat(packet.args);\n\n        if (packet.ack == 'data')\n          params.push(ack);\n\n        this.$emit.apply(this, params);\n        break;\n\n      case 'ack':\n        if (this.acks[packet.ackId]) {\n          this.acks[packet.ackId].apply(this, packet.args);\n          delete this.acks[packet.ackId];\n        }\n        break;\n\n      case 'error':\n        if (packet.advice){\n          this.socket.onError(packet);\n        } else {\n          if (packet.reason == 'unauthorized') {\n            this.$emit('connect_failed', packet.reason);\n          } else {\n            this.$emit('error', packet.reason);\n          }\n        }\n        break;\n    }\n  };\n\n  /**\n   * Flag interface.\n   *\n   * @api private\n   */\n\n  function Flag (nsp, name) {\n    this.namespace = nsp;\n    this.name = name;\n  };\n\n  /**\n   * Send a message\n   *\n   * @api public\n   */\n\n  Flag.prototype.send = function () {\n    this.namespace.flags[this.name] = true;\n    this.namespace.send.apply(this.namespace, arguments);\n  };\n\n  /**\n   * Emit an event\n   *\n   * @api public\n   */\n\n  Flag.prototype.emit = function () {\n    this.namespace.flags[this.name] = true;\n    this.namespace.emit.apply(this.namespace, arguments);\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.websocket = WS;\n\n  /**\n   * The WebSocket transport uses the HTML5 WebSocket API to establish an\n   * persistent connection with the Socket.IO server. This transport will also\n   * be inherited by the FlashSocket fallback as it provides a API compatible\n   * polyfill for the WebSockets.\n   *\n   * @constructor\n   * @extends {io.Transport}\n   * @api public\n   */\n\n  function WS (socket) {\n    io.Transport.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from Transport.\n   */\n\n  io.util.inherit(WS, io.Transport);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  WS.prototype.name = 'websocket';\n\n  /**\n   * Initializes a new `WebSocket` connection with the Socket.IO server. We attach\n   * all the appropriate listeners to handle the responses from the server.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.open = function () {\n    var query = io.util.query(this.socket.options.query)\n      , self = this\n      , Socket\n\n\n    if (!Socket) {\n      Socket = global.MozWebSocket || global.WebSocket;\n    }\n\n    this.websocket = new Socket(this.prepareUrl() + query);\n\n    this.websocket.onopen = function () {\n      self.onOpen();\n      self.socket.setBuffer(false);\n    };\n    this.websocket.onmessage = function (ev) {\n      self.onData(ev.data);\n    };\n    this.websocket.onclose = function () {\n      self.onClose();\n      self.socket.setBuffer(true);\n    };\n    this.websocket.onerror = function (e) {\n      self.onError(e);\n    };\n\n    return this;\n  };\n\n  /**\n   * Send a message to the Socket.IO server. The message will automatically be\n   * encoded in the correct message format.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.send = function (data) {\n    this.websocket.send(data);\n    return this;\n  };\n\n  /**\n   * Payload\n   *\n   * @api private\n   */\n\n  WS.prototype.payload = function (arr) {\n    for (var i = 0, l = arr.length; i < l; i++) {\n      this.packet(arr[i]);\n    }\n    return this;\n  };\n\n  /**\n   * Disconnect the established `WebSocket` connection.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.close = function () {\n    this.websocket.close();\n    return this;\n  };\n\n  /**\n   * Handle the errors that `WebSocket` might be giving when we\n   * are attempting to connect or send messages.\n   *\n   * @param {Error} e The error.\n   * @api private\n   */\n\n  WS.prototype.onError = function (e) {\n    this.socket.onError(e);\n  };\n\n  /**\n   * Returns the appropriate scheme for the URI generation.\n   *\n   * @api private\n   */\n  WS.prototype.scheme = function () {\n    return this.socket.options.secure ? 'wss' : 'ws';\n  };\n\n  /**\n   * Checks if the browser has support for native `WebSockets` and that\n   * it's not the polyfill created for the FlashSocket transport.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  WS.check = function () {\n    return ('WebSocket' in global && !('__addTask' in WebSocket))\n          || 'MozWebSocket' in global;\n  };\n\n  /**\n   * Check if the `WebSocket` transport support cross domain communications.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  WS.xdomainCheck = function () {\n    return true;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('websocket');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   *\n   * @api public\n   */\n\n  exports.XHR = XHR;\n\n  /**\n   * XHR constructor\n   *\n   * @costructor\n   * @api public\n   */\n\n  function XHR (socket) {\n    if (!socket) return;\n\n    io.Transport.apply(this, arguments);\n    this.sendBuffer = [];\n  };\n\n  /**\n   * Inherits from Transport.\n   */\n\n  io.util.inherit(XHR, io.Transport);\n\n  /**\n   * Establish a connection\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.open = function () {\n    this.socket.setBuffer(false);\n    this.onOpen();\n    this.get();\n\n    // we need to make sure the request succeeds since we have no indication\n    // whether the request opened or not until it succeeded.\n    this.setCloseTimeout();\n\n    return this;\n  };\n\n  /**\n   * Check if we need to send data to the Socket.IO server, if we have data in our\n   * buffer we encode it and forward it to the `post` method.\n   *\n   * @api private\n   */\n\n  XHR.prototype.payload = function (payload) {\n    var msgs = [];\n\n    for (var i = 0, l = payload.length; i < l; i++) {\n      msgs.push(io.parser.encodePacket(payload[i]));\n    }\n\n    this.send(io.parser.encodePayload(msgs));\n  };\n\n  /**\n   * Send data to the Socket.IO server.\n   *\n   * @param data The message\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.send = function (data) {\n    this.post(data);\n    return this;\n  };\n\n  /**\n   * Posts a encoded message to the Socket.IO server.\n   *\n   * @param {String} data A encoded message.\n   * @api private\n   */\n\n  function empty () { };\n\n  XHR.prototype.post = function (data) {\n    var self = this;\n    this.socket.setBuffer(true);\n\n    function stateChange () {\n      if (this.readyState == 4) {\n        this.onreadystatechange = empty;\n        self.posting = false;\n\n        if (this.status == 200){\n          self.socket.setBuffer(false);\n        } else {\n          self.onClose();\n        }\n      }\n    }\n\n    function onload () {\n      this.onload = empty;\n      self.socket.setBuffer(false);\n    };\n\n    this.sendXHR = this.request('POST');\n\n    if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) {\n      this.sendXHR.onload = this.sendXHR.onerror = onload;\n    } else {\n      this.sendXHR.onreadystatechange = stateChange;\n    }\n\n    this.sendXHR.send(data);\n  };\n\n  /**\n   * Disconnects the established `XHR` connection.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.close = function () {\n    this.onClose();\n    return this;\n  };\n\n  /**\n   * Generates a configured XHR request\n   *\n   * @param {String} url The url that needs to be requested.\n   * @param {String} method The method the request should use.\n   * @returns {XMLHttpRequest}\n   * @api private\n   */\n\n  XHR.prototype.request = function (method) {\n    var req = io.util.request(this.socket.isXDomain())\n      , query = io.util.query(this.socket.options.query, 't=' + +new Date);\n\n    req.open(method || 'GET', this.prepareUrl() + query, true);\n\n    if (method == 'POST') {\n      try {\n        if (req.setRequestHeader) {\n          req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        } else {\n          // XDomainRequest\n          req.contentType = 'text/plain';\n        }\n      } catch (e) {}\n    }\n\n    return req;\n  };\n\n  /**\n   * Returns the scheme to use for the transport URLs.\n   *\n   * @api private\n   */\n\n  XHR.prototype.scheme = function () {\n    return this.socket.options.secure ? 'https' : 'http';\n  };\n\n  /**\n   * Check if the XHR transports are supported\n   *\n   * @param {Boolean} xdomain Check if we support cross domain requests.\n   * @returns {Boolean}\n   * @api public\n   */\n\n  XHR.check = function (socket, xdomain) {\n    try {\n      var request = io.util.request(xdomain),\n          usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest),\n          socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'),\n          isXProtocol = (socketProtocol != global.location.protocol);\n      if (request && !(usesXDomReq && isXProtocol)) {\n        return true;\n      }\n    } catch(e) {}\n\n    return false;\n  };\n\n  /**\n   * Check if the XHR transport supports cross domain requests.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  XHR.xdomainCheck = function () {\n    return XHR.check(null, true);\n  };\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.htmlfile = HTMLFile;\n\n  /**\n   * The HTMLFile transport creates a `forever iframe` based transport\n   * for Internet Explorer. Regular forever iframe implementations will \n   * continuously trigger the browsers buzy indicators. If the forever iframe\n   * is created inside a `htmlfile` these indicators will not be trigged.\n   *\n   * @constructor\n   * @extends {io.Transport.XHR}\n   * @api public\n   */\n\n  function HTMLFile (socket) {\n    io.Transport.XHR.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from XHR transport.\n   */\n\n  io.util.inherit(HTMLFile, io.Transport.XHR);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  HTMLFile.prototype.name = 'htmlfile';\n\n  /**\n   * Creates a new Ac...eX `htmlfile` with a forever loading iframe\n   * that can be used to listen to messages. Inside the generated\n   * `htmlfile` a reference will be made to the HTMLFile transport.\n   *\n   * @api private\n   */\n\n  HTMLFile.prototype.get = function () {\n    this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n    this.doc.open();\n    this.doc.write('<html></html>');\n    this.doc.close();\n    this.doc.parentWindow.s = this;\n\n    var iframeC = this.doc.createElement('div');\n    iframeC.className = 'socketio';\n\n    this.doc.body.appendChild(iframeC);\n    this.iframe = this.doc.createElement('iframe');\n\n    iframeC.appendChild(this.iframe);\n\n    var self = this\n      , query = io.util.query(this.socket.options.query, 't='+ +new Date);\n\n    this.iframe.src = this.prepareUrl() + query;\n\n    io.util.on(window, 'unload', function () {\n      self.destroy();\n    });\n  };\n\n  /**\n   * The Socket.IO server will write script tags inside the forever\n   * iframe, this function will be used as callback for the incoming\n   * information.\n   *\n   * @param {String} data The message\n   * @param {document} doc Reference to the context\n   * @api private\n   */\n\n  HTMLFile.prototype._ = function (data, doc) {\n    this.onData(data);\n    try {\n      var script = doc.getElementsByTagName('script')[0];\n      script.parentNode.removeChild(script);\n    } catch (e) { }\n  };\n\n  /**\n   * Destroy the established connection, iframe and `htmlfile`.\n   * And calls the `CollectGarbage` function of Internet Explorer\n   * to release the memory.\n   *\n   * @api private\n   */\n\n  HTMLFile.prototype.destroy = function () {\n    if (this.iframe){\n      try {\n        this.iframe.src = 'about:blank';\n      } catch(e){}\n\n      this.doc = null;\n      this.iframe.parentNode.removeChild(this.iframe);\n      this.iframe = null;\n\n      CollectGarbage();\n    }\n  };\n\n  /**\n   * Disconnects the established connection.\n   *\n   * @returns {Transport} Chaining.\n   * @api public\n   */\n\n  HTMLFile.prototype.close = function () {\n    this.destroy();\n    return io.Transport.XHR.prototype.close.call(this);\n  };\n\n  /**\n   * Checks if the browser supports this transport. The browser\n   * must have an `Ac...eXObject` implementation.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  HTMLFile.check = function () {\n    if (typeof window != \"undefined\" && (['Active'].concat('Object').join('X')) in window){\n      try {\n        var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n        return a && io.Transport.XHR.check();\n      } catch(e){}\n    }\n    return false;\n  };\n\n  /**\n   * Check if cross domain requests are supported.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  HTMLFile.xdomainCheck = function () {\n    // we can probably do handling for sub-domains, we should\n    // test that it's cross domain but a subdomain here\n    return false;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('htmlfile');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports['xhr-polling'] = XHRPolling;\n\n  /**\n   * The XHR-polling transport uses long polling XHR requests to create a\n   * \"persistent\" connection with the server.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function XHRPolling () {\n    io.Transport.XHR.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from XHR transport.\n   */\n\n  io.util.inherit(XHRPolling, io.Transport.XHR);\n\n  /**\n   * Merge the properties from XHR transport\n   */\n\n  io.util.merge(XHRPolling, io.Transport.XHR);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  XHRPolling.prototype.name = 'xhr-polling';\n\n  /** \n   * Establish a connection, for iPhone and Android this will be done once the page\n   * is loaded.\n   *\n   * @returns {Transport} Chaining.\n   * @api public\n   */\n\n  XHRPolling.prototype.open = function () {\n    var self = this;\n\n    io.Transport.XHR.prototype.open.call(self);\n    return false;\n  };\n\n  /**\n   * Starts a XHR request to wait for incoming messages.\n   *\n   * @api private\n   */\n\n  function empty () {};\n\n  XHRPolling.prototype.get = function () {\n    if (!this.open) return;\n\n    var self = this;\n\n    function stateChange () {\n      if (this.readyState == 4) {\n        this.onreadystatechange = empty;\n\n        if (this.status == 200) {\n          self.onData(this.responseText);\n          self.get();\n        } else {\n          self.onClose();\n        }\n      }\n    };\n\n    function onload () {\n      this.onload = empty;\n      this.onerror = empty;\n      self.onData(this.responseText);\n      self.get();\n    };\n\n    function onerror () {\n      self.onClose();\n    };\n\n    this.xhr = this.request();\n\n    if (global.XDomainRequest && this.xhr instanceof XDomainRequest) {\n      this.xhr.onload = onload;\n      this.xhr.onerror = onerror;\n    } else {\n      this.xhr.onreadystatechange = stateChange;\n    }\n\n    this.xhr.send(null);\n  };\n\n  /**\n   * Handle the unclean close behavior.\n   *\n   * @api private\n   */\n\n  XHRPolling.prototype.onClose = function () {\n    io.Transport.XHR.prototype.onClose.call(this);\n\n    if (this.xhr) {\n      this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty;\n      try {\n        this.xhr.abort();\n      } catch(e){}\n      this.xhr = null;\n    }\n  };\n\n  /**\n   * Webkit based browsers show a infinit spinner when you start a XHR request\n   * before the browsers onload event is called so we need to defer opening of\n   * the transport until the onload event is called. Wrapping the cb in our\n   * defer method solve this.\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  XHRPolling.prototype.ready = function (socket, fn) {\n    var self = this;\n\n    io.util.defer(function () {\n      fn.call(self);\n    });\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('xhr-polling');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n  /**\n   * There is a way to hide the loading indicator in Firefox. If you create and\n   * remove a iframe it will stop showing the current loading indicator.\n   * Unfortunately we can't feature detect that and UA sniffing is evil.\n   *\n   * @api private\n   */\n\n  var indicator = global.document && \"MozAppearance\" in\n    global.document.documentElement.style;\n\n  /**\n   * Expose constructor.\n   */\n\n  exports['jsonp-polling'] = JSONPPolling;\n\n  /**\n   * The JSONP transport creates an persistent connection by dynamically\n   * inserting a script tag in the page. This script tag will receive the\n   * information of the Socket.IO server. When new information is received\n   * it creates a new script tag for the new data stream.\n   *\n   * @constructor\n   * @extends {io.Transport.xhr-polling}\n   * @api public\n   */\n\n  function JSONPPolling (socket) {\n    io.Transport['xhr-polling'].apply(this, arguments);\n\n    this.index = io.j.length;\n\n    var self = this;\n\n    io.j.push(function (msg) {\n      self._(msg);\n    });\n  };\n\n  /**\n   * Inherits from XHR polling transport.\n   */\n\n  io.util.inherit(JSONPPolling, io.Transport['xhr-polling']);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  JSONPPolling.prototype.name = 'jsonp-polling';\n\n  /**\n   * Posts a encoded message to the Socket.IO server using an iframe.\n   * The iframe is used because script tags can create POST based requests.\n   * The iframe is positioned outside of the view so the user does not\n   * notice it's existence.\n   *\n   * @param {String} data A encoded message.\n   * @api private\n   */\n\n  JSONPPolling.prototype.post = function (data) {\n    var self = this\n      , query = io.util.query(\n             this.socket.options.query\n          , 't='+ (+new Date) + '&i=' + this.index\n        );\n\n    if (!this.form) {\n      var form = document.createElement('form')\n        , area = document.createElement('textarea')\n        , id = this.iframeId = 'socketio_iframe_' + this.index\n        , iframe;\n\n      form.className = 'socketio';\n      form.style.position = 'absolute';\n      form.style.top = '0px';\n      form.style.left = '0px';\n      form.style.display = 'none';\n      form.target = id;\n      form.method = 'POST';\n      form.setAttribute('accept-charset', 'utf-8');\n      area.name = 'd';\n      form.appendChild(area);\n      document.body.appendChild(form);\n\n      this.form = form;\n      this.area = area;\n    }\n\n    this.form.action = this.prepareUrl() + query;\n\n    function complete () {\n      initIframe();\n      self.socket.setBuffer(false);\n    };\n\n    function initIframe () {\n      if (self.iframe) {\n        self.form.removeChild(self.iframe);\n      }\n\n      try {\n        // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n        iframe = document.createElement('<iframe name=\"'+ self.iframeId +'\">');\n      } catch (e) {\n        iframe = document.createElement('iframe');\n        iframe.name = self.iframeId;\n      }\n\n      iframe.id = self.iframeId;\n\n      self.form.appendChild(iframe);\n      self.iframe = iframe;\n    };\n\n    initIframe();\n\n    // we temporarily stringify until we figure out how to prevent\n    // browsers from turning `\\n` into `\\r\\n` in form inputs\n    this.area.value = io.JSON.stringify(data);\n\n    try {\n      this.form.submit();\n    } catch(e) {}\n\n    if (this.iframe.attachEvent) {\n      iframe.onreadystatechange = function () {\n        if (self.iframe.readyState == 'complete') {\n          complete();\n        }\n      };\n    } else {\n      this.iframe.onload = complete;\n    }\n\n    this.socket.setBuffer(true);\n  };\n  \n  /**\n   * Creates a new JSONP poll that can be used to listen\n   * for messages from the Socket.IO server.\n   *\n   * @api private\n   */\n\n  JSONPPolling.prototype.get = function () {\n    var self = this\n      , script = document.createElement('script')\n      , query = io.util.query(\n             this.socket.options.query\n          , 't='+ (+new Date) + '&i=' + this.index\n        );\n\n    if (this.script) {\n      this.script.parentNode.removeChild(this.script);\n      this.script = null;\n    }\n\n    script.async = true;\n    script.src = this.prepareUrl() + query;\n    script.onerror = function () {\n      self.onClose();\n    };\n\n    var insertAt = document.getElementsByTagName('script')[0]\n    insertAt.parentNode.insertBefore(script, insertAt);\n    this.script = script;\n\n    if (indicator) {\n      setTimeout(function () {\n        var iframe = document.createElement('iframe');\n        document.body.appendChild(iframe);\n        document.body.removeChild(iframe);\n      }, 100);\n    }\n  };\n\n  /**\n   * Callback function for the incoming message stream from the Socket.IO server.\n   *\n   * @param {String} data The message\n   * @api private\n   */\n\n  JSONPPolling.prototype._ = function (msg) {\n    this.onData(msg);\n    if (this.open) {\n      this.get();\n    }\n    return this;\n  };\n\n  /**\n   * The indicator hack only works after onload\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  JSONPPolling.prototype.ready = function (socket, fn) {\n    var self = this;\n    if (!indicator) return fn.call(this);\n\n    io.util.load(function () {\n      fn.call(self);\n    });\n  };\n\n  /**\n   * Checks if browser supports this transport.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  JSONPPolling.check = function () {\n    return 'document' in global;\n  };\n\n  /**\n   * Check if cross domain requests are supported\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  JSONPPolling.xdomainCheck = function () {\n    return true;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('jsonp-polling');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n"
  },
  {
    "path": "ppt/js/zoom.js",
    "content": "// Custom reveal.js integration\n(function() {\n    var isEnabled = true;\n\n    document.querySelector('slides').addEventListener('mousedown', function(event) {\n        var modifier = 'altKey';\n\n        var zoomPadding = 20;\n\n        if (event[modifier] && isEnabled) {\n            event.preventDefault();\n\n            var bounds = event.target.getBoundingClientRect();\n\n            zoom.to({\n                x: bounds.left - zoomPadding,\n                y: bounds.top - zoomPadding,\n                width: bounds.width + (zoomPadding * 2),\n                height: bounds.height + (zoomPadding * 2),\n                pan: false\n            });\n        }\n    });\n\n    Slide.on('overviewshown', function() {\n        isEnabled = false;\n    });\n    Slide.on('overviewhidden', function() {\n        isEnabled = true;\n    });\n})();\n\n/*!\n * zoom.js 0.3 (modified for use with reveal.js)\n * http://lab.hakim.se/zoom-js\n * MIT licensed\n *\n * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se\n */\nvar zoom = (function() {\n\n    // The current zoom level (scale)\n    var level = 1;\n\n    // The current mouse position, used for panning\n    var mouseX = 0,\n        mouseY = 0;\n\n    // Timeout before pan is activated\n    var panEngageTimeout = -1,\n        panUpdateInterval = -1;\n\n    // Check for transform support so that we can fallback otherwise\n    var supportsTransforms = 'WebkitTransform' in document.body.style || 'MozTransform' in document.body.style || 'msTransform' in document.body.style || 'OTransform' in document.body.style || 'transform' in document.body.style;\n\n    if (supportsTransforms) {\n        // The easing that will be applied when we zoom in/out\n        document.body.style.transition = 'transform 0.8s ease';\n        document.body.style.OTransition = '-o-transform 0.8s ease';\n        document.body.style.msTransition = '-ms-transform 0.8s ease';\n        document.body.style.MozTransition = '-moz-transform 0.8s ease';\n        document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';\n    }\n\n    // Zoom out if the user hits escape\n    document.addEventListener('keyup', function(event) {\n        if (level !== 1 && event.keyCode === 27) {\n            zoom.out();\n        }\n    });\n\n    // Monitor mouse movement for panning\n    document.addEventListener('mousemove', function(event) {\n        if (level !== 1) {\n            mouseX = event.clientX;\n            mouseY = event.clientY;\n        }\n    });\n\n    /**\n     * Applies the CSS required to zoom in, prefers the use of CSS3\n     * transforms but falls back on zoom for IE.\n     *\n     * @param {Object} rect\n     * @param {Number} scale\n     */\n    function magnify(rect, scale) {\n\n        var scrollOffset = getScrollOffset();\n\n        // Ensure a width/height is set\n        rect.width = rect.width || 1;\n        rect.height = rect.height || 1;\n\n        // Center the rect within the zoomed viewport\n        rect.x -= (window.innerWidth - (rect.width * scale)) / 2;\n        rect.y -= (window.innerHeight - (rect.height * scale)) / 2;\n\n        if (supportsTransforms) {\n            // Reset\n            if (scale === 1) {\n                document.body.style.transform = '';\n                document.body.style.OTransform = '';\n                document.body.style.msTransform = '';\n                document.body.style.MozTransform = '';\n                document.body.style.WebkitTransform = '';\n            }\n            // Scale\n            else {\n                var origin = scrollOffset.x + 'px ' + scrollOffset.y + 'px',\n                    transform = 'translate(' + -rect.x + 'px,' + -rect.y + 'px) scale(' + scale + ')';\n\n                document.body.style.transformOrigin = origin;\n                document.body.style.OTransformOrigin = origin;\n                document.body.style.msTransformOrigin = origin;\n                document.body.style.MozTransformOrigin = origin;\n                document.body.style.WebkitTransformOrigin = origin;\n\n                document.body.style.transform = transform;\n                document.body.style.OTransform = transform;\n                document.body.style.msTransform = transform;\n                document.body.style.MozTransform = transform;\n                document.body.style.WebkitTransform = transform;\n            }\n        } else {\n            // Reset\n            if (scale === 1) {\n                document.body.style.position = '';\n                document.body.style.left = '';\n                document.body.style.top = '';\n                document.body.style.width = '';\n                document.body.style.height = '';\n                document.body.style.zoom = '';\n            }\n            // Scale\n            else {\n                document.body.style.position = 'relative';\n                document.body.style.left = (-(scrollOffset.x + rect.x) / scale) + 'px';\n                document.body.style.top = (-(scrollOffset.y + rect.y) / scale) + 'px';\n                document.body.style.width = (scale * 100) + '%';\n                document.body.style.height = (scale * 100) + '%';\n                document.body.style.zoom = scale;\n            }\n        }\n\n        level = scale;\n\n        if (document.documentElement.classList) {\n            if (level !== 1) {\n                document.documentElement.classList.add('zoomed');\n            } else {\n                document.documentElement.classList.remove('zoomed');\n            }\n        }\n    }\n\n    /**\n     * Pan the document when the mosue cursor approaches the edges\n     * of the window.\n     */\n    function pan() {\n        var range = 0.12,\n            rangeX = window.innerWidth * range,\n            rangeY = window.innerHeight * range,\n            scrollOffset = getScrollOffset();\n\n        // Up\n        if (mouseY < rangeY) {\n            window.scroll(scrollOffset.x, scrollOffset.y - (1 - (mouseY / rangeY)) * (14 / level));\n        }\n        // Down\n        else if (mouseY > window.innerHeight - rangeY) {\n            window.scroll(scrollOffset.x, scrollOffset.y + (1 - (window.innerHeight - mouseY) / rangeY) * (14 / level));\n        }\n\n        // Left\n        if (mouseX < rangeX) {\n            window.scroll(scrollOffset.x - (1 - (mouseX / rangeX)) * (14 / level), scrollOffset.y);\n        }\n        // Right\n        else if (mouseX > window.innerWidth - rangeX) {\n            window.scroll(scrollOffset.x + (1 - (window.innerWidth - mouseX) / rangeX) * (14 / level), scrollOffset.y);\n        }\n    }\n\n    function getScrollOffset() {\n        return {\n            x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,\n            y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset\n        }\n    }\n\n    return {\n        /**\n         * Zooms in on either a rectangle or HTML element.\n         *\n         * @param {Object} options\n         *   - element: HTML element to zoom in on\n         *   OR\n         *   - x/y: coordinates in non-transformed space to zoom in on\n         *   - width/height: the portion of the screen to zoom in on\n         *   - scale: can be used instead of width/height to explicitly set scale\n         */\n        to: function(options) {\n\n            // Due to an implementation limitation we can't zoom in\n            // to another element without zooming out first\n            if (level !== 1) {\n                zoom.out();\n            } else {\n                options.x = options.x || 0;\n                options.y = options.y || 0;\n\n                // If an element is set, that takes precedence\n                if (!!options.element) {\n                    // Space around the zoomed in element to leave on screen\n                    var padding = 20;\n                    var bounds = options.element.getBoundingClientRect();\n\n                    options.x = bounds.left - padding;\n                    options.y = bounds.top - padding;\n                    options.width = bounds.width + (padding * 2);\n                    options.height = bounds.height + (padding * 2);\n                }\n\n                // If width/height values are set, calculate scale from those values\n                if (options.width !== undefined && options.height !== undefined) {\n                    options.scale = Math.max(Math.min(window.innerWidth / options.width, window.innerHeight / options.height), 1);\n                }\n\n                if (options.scale > 1) {\n                    options.x *= options.scale;\n                    options.y *= options.scale;\n\n                    magnify(options, options.scale);\n\n                    if (options.pan !== false) {\n\n                        // Wait with engaging panning as it may conflict with the\n                        // zoom transition\n                        panEngageTimeout = setTimeout(function() {\n                            panUpdateInterval = setInterval(pan, 1000 / 60);\n                        }, 800);\n\n                    }\n                }\n            }\n        },\n\n        /**\n         * Resets the document zoom state to its default.\n         */\n        out: function() {\n            clearTimeout(panEngageTimeout);\n            clearInterval(panUpdateInterval);\n\n            magnify({\n                x: 0,\n                y: 0\n            }, 1);\n\n            level = 1;\n        },\n\n        // Alias\n        magnify: function(options) {\n            this.to(options)\n        },\n        reset: function() {\n            this.out()\n        },\n\n        zoomLevel: function() {\n            return level;\n        }\n    }\n\n})();\n"
  },
  {
    "path": "ppt/node-generator-koa/css/animation.css",
    "content": "html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:\"\";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}html{height:100%;overflow:hidden}body{margin:0;padding:0;opacity:0;height:100%;width:100%;overflow:hidden;color:#fff;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;-ms-font-smoothing:antialiased;-o-font-smoothing:antialiased;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}body.loaded{opacity:1 !important}input,button{vertical-align:middle}slides>slide[hidden]{display:none !important}slides{width:100%;height:100%;position:absolute;left:0;top:0;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-moz-perspective:1000;-webkit-perspective:1000;perspective:1000;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}slides>slide{display:block;position:absolute;overflow:hidden;left:50%;top:50%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}article.fill iframe{position:absolute;left:0;top:0;width:100%;height:100%;border:0;margin:0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;z-index:-1}slide.fill{background-repeat:no-repeat;-moz-background-size:cover;-o-background-size:cover;-webkit-background-size:cover;background-size:cover}slide.fill img{position:absolute;left:0;top:0;min-width:100%;min-height:100%;z-index:-1}.transparent{opacity:0}.build>*{-moz-transition:all 0.5s ease-in-out 0.2s;-o-transition:all 0.5s ease-in-out 0.2s;-webkit-transition:all 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:all 0.5s ease-in-out 0.2s}.build .to-build{opacity:0;-moz-transform:translate3d(60px, 0, 0);-ms-transform:translate3d(60px, 0, 0);-webkit-transform:translate3d(60px, 0, 0);transform:translate3d(60px, 0, 0)}slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-origin:50% 50% -450px 50%;-ms-transform-origin:50% 50% -450px 50%;-webkit-transform-origin:50% 50% -450px 50%;transform-origin:50% 50% -450px 50%}.layout-widescreen slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-origin:50% 50% -550px 50%;-ms-transform-origin:50% 50% -550px 50%;-webkit-transform-origin:50% 50% -550px 50%;transform-origin:50% 50% -550px 50%}slide[data-transition=\"horizontal3d\"].next{-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}slide[data-transition=\"horizontal3d\"].past{-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-gear:before,.fa-cog:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-rotate-right:before,.fa-repeat:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-gears:before,.fa-cogs:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-save:before,.fa-floppy-o:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-unsorted:before,.fa-sort:before{content:\"\\f0dc\"}.fa-sort-down:before,.fa-sort-desc:before{content:\"\\f0dd\"}.fa-sort-up:before,.fa-sort-asc:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-legal:before,.fa-gavel:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-flash:before,.fa-bolt:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-paste:before,.fa-clipboard:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-unlink:before,.fa-chain-broken:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\"\\f150\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\"\\f151\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\"\\f152\"}.fa-euro:before,.fa-eur:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-rupee:before,.fa-inr:before{content:\"\\f156\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\"\\f157\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\"\\f158\"}.fa-won:before,.fa-krw:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-turkish-lira:before,.fa-try:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\"\\f19c\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\"\\f1c5\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\"\\f1c6\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before{content:\"\\f1d0\"}.fa-ge:before,.fa-empire:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-hacker-news:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-send:before,.fa-paper-plane:before{content:\"\\f1d8\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/nodeppt.css",
    "content": "/*\nError: Mixin flexbox is missing argument $properties.\n        on line 695 of D:/www/github/nodePPT/assets/scss/nodeppt.scss, in `flexbox'\n        from line 695 of D:/www/github/nodePPT/assets/scss/nodeppt.scss\n\n690:     left: 0;\n691:     padding: 1em;\n692:     background: rgba(0, 0, 0, 0.3);\n693:     opacity: 0;\n694:     // pointer-events: none;\n695:     @include flexbox;\n696:     @include flex-center-center;\n697:     @include border-radius($slide-border-radius);\n698: \n699:     @include box-sizing(border-box);\n700:     @include transform(translateY($slide-height / 2));\n\nBacktrace:\nD:/www/github/nodePPT/assets/scss/nodeppt.scss:695:in `flexbox'\nD:/www/github/nodePPT/assets/scss/nodeppt.scss:695\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:73:in `block in perform_arguments'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:65:in `zip'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:65:in `perform_arguments'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:348:in `block in visit_mixin'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:98:in `block in with_mixin'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:115:in `with_frame'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:98:in `with_mixin'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:336:in `visit_mixin'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/base.rb:36:in `visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:158:in `block in visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:79:in `block in with_base'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:115:in `with_frame'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:79:in `with_base'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:158:in `visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:420:in `block (2 levels) in visit_rule'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:420:in `map'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:420:in `block in visit_rule'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:179:in `with_environment'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:418:in `visit_rule'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/base.rb:36:in `visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:158:in `block in visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:79:in `block in with_base'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:115:in `with_frame'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/stack.rb:79:in `with_base'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:158:in `visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/base.rb:52:in `block in visit_children'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/base.rb:52:in `map'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/base.rb:52:in `visit_children'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:167:in `block in visit_children'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:179:in `with_environment'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:166:in `visit_children'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/base.rb:36:in `block in visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:186:in `visit_root'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/base.rb:36:in `visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:157:in `visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/visitors/perform.rb:8:in `visit'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/root_node.rb:36:in `css_tree'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/tree/root_node.rb:20:in `render'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/engine.rb:268:in `render'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/plugin/compiler.rb:492:in `update_stylesheet'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/plugin/compiler.rb:215:in `block in update_stylesheets'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/plugin/compiler.rb:209:in `each'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/plugin/compiler.rb:209:in `update_stylesheets'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/sass-3.4.9/lib/sass/plugin/compiler.rb:293:in `watch'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/lib/compass/sass_compiler.rb:46:in `watch!'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/lib/compass/commands/watch_project.rb:41:in `perform'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/lib/compass/commands/base.rb:18:in `execute'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/lib/compass/commands/project_base.rb:19:in `execute'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/lib/compass/exec/sub_command_ui.rb:43:in `perform!'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/lib/compass/exec/sub_command_ui.rb:15:in `run!'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/bin/compass:30:in `block in <top (required)>'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/bin/compass:44:in `call'\nC:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/compass-1.0.1/bin/compass:44:in `<top (required)>'\nC:/Ruby200-x64/bin/compass:23:in `load'\nC:/Ruby200-x64/bin/compass:23:in `<main>'\n*/\nbody:before {\n  white-space: pre;\n  font-family: monospace;\n  content: \"Error: Mixin flexbox is missing argument $properties.\\A         on line 695 of D:/www/github/nodePPT/assets/scss/nodeppt.scss, in `flexbox'\\A         from line 695 of D:/www/github/nodePPT/assets/scss/nodeppt.scss\\A \\A 690:     left: 0;\\A 691:     padding: 1em;\\A 692:     background: rgba(0, 0, 0, 0.3);\\A 693:     opacity: 0;\\A 694:     // pointer-events: none;\\A 695:     @include flexbox;\\A 696:     @include flex-center-center;\\A 697:     @include border-radius($slide-border-radius);\\A 698: \\A 699:     @include box-sizing(border-box);\\A 700:     @include transform(translateY($slide-height / 2));\"; }\n"
  },
  {
    "path": "ppt/node-generator-koa/css/nodeppt2.0.css",
    "content": "html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:\"\";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}html{height:100%;overflow:hidden}body{margin:0;padding:0;opacity:0;height:100%;width:100%;overflow:hidden;color:#fff;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;-ms-font-smoothing:antialiased;-o-font-smoothing:antialiased;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}body.loaded{opacity:1 !important}input,button{vertical-align:middle}slides>slide[hidden]{display:none !important}slides{width:100%;height:100%;position:absolute;left:0;top:0;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-moz-perspective:1000;-webkit-perspective:1000;perspective:1000;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}slides>slide{display:block;position:absolute;overflow:hidden;left:50%;top:50%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}article.fill iframe{position:absolute;left:0;top:0;width:100%;height:100%;border:0;margin:0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;z-index:-1}slide.fill{background-repeat:no-repeat;-moz-background-size:cover;-o-background-size:cover;-webkit-background-size:cover;background-size:cover}slide.fill img{position:absolute;left:0;top:0;min-width:100%;min-height:100%;z-index:-1}.transparent{opacity:0}@font-face{font-family:'Source Code Pro';font-style:normal;font-weight:300;src:local(\"Source Code Pro Light\"),local(\"SourceCodePro-Light\"),url(http://fontscontent.useso.com/static/fonts/sourcecodepro/v4/leqv3v-yTsJNC7nFznSMqYPZSf8Ud0kNoe3bGnF7K24.woff) format(\"woff\")}@font-face{font-family:'Source Code Pro';font-style:normal;font-weight:400;src:local(\"Source Code Pro\"),local(\"SourceCodePro-Regular\"),url(http://fontscontent.useso.com/static/fonts/sourcecodepro/v4/mrl8jkM18OlOQN8JLgasDxBHWFfxJXS04xYOz0jw624.woff) format(\"woff\")}@font-face{font-family:'Source Code Pro';font-style:normal;font-weight:600;src:local(\"Source Code Pro Semibold\"),local(\"SourceCodePro-Semibold\"),url(http://fontscontent.useso.com/static/fonts/sourcecodepro/v4/leqv3v-yTsJNC7nFznSMqQAD_zxmsR6vL1X3tnvCZYo.woff) format(\"woff\")}::selection{color:white;background-color:#ffd14d;text-shadow:none}::-webkit-scrollbar{height:10px;overflow:visible;width:10px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.1);background-clip:padding-box;border:solid transparent;min-height:28px;padding:100px 0 0;-moz-box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);-webkit-box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);border-width:1px 1px 1px 6px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,0.5)}::-webkit-scrollbar-button{height:0;width:0}::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}::-webkit-scrollbar-corner{background:transparent}body{background:black;font-family:'YaHei Consolas Hybrid','Microsoft Yahei',Arial,Helvetica,sans-serif}.draw-board{position:fixed;cursor:url(pen.cur),default;z-index:9999;top:0;left:0;right:0;bottom:0}.slideTip{display:none;padding:10px 0;width:300px;background:rgba(0,0,0,0.3);border-radius:5px;padding:10px;margin:0 auto;color:#FFF;position:fixed;top:40%;left:50%;margin-left:-150px;text-align:center}.progress{position:fixed;height:3px;width:100%;bottom:0;left:0;background:#000}.progress span{display:block;background:#2187E7;height:100%;width:0;border:none;-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0;border-radius:0 2px 2px 0;-moz-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);-o-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);-webkit-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985)}.with-notes .progress{display:none}.slides{width:100%;height:100%;text-align:center}p{line-height:1.75em}slides>slide .slide-wrapper{max-width:900px;text-align:center;margin:0 auto;position:relative;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;height:100%}slides>slide .slide-wrapper>hgroup+article{margin-top:20px}slides>slide .slide-wrapper>hgroup+article.flexbox.vcenter,slides>slide .slide-wrapper>hgroup+article.flexbox.vleft,slides>slide .slide-wrapper>hgroup+article.flexbox.vright{height:80%}slides>slide .slide-wrapper>hgroup+article p>img:only-child{margin-bottom:1em}slides>slide .slide-wrapper>article:only-child h2{font-weight:normal}slides>slide .slide-wrapper>article:only-child>pre{overflow-y:auto;max-height:98%}slides>slide .slide-wrapper>article:only-child>iframe{height:98%}slides>slide .slide-wrapper img{-webkit-justify-content:space-around;justify-content:space-around;max-width:100%;max-height:520px}slides>slide .slide-wrapper blockquote{font-size:28px;line-height:1.5em;padding:5px 5px 5px 20px;background-color:#F9FF95;border-left:5px solid #3E87CF;color:black;text-align:left;min-width:500px;display:inline-block}slides>slide .slide-wrapper blockquote small{display:block;line-height:20px;color:#999999}slides>slide .slide-wrapper blockquote small::before{content:'\\2014 \\00A0'}slides>slide .slide-wrapper blockquote p{margin-bottom:0 !important;font-size:17.5px;font-weight:300;line-height:1.25}slides>slide .slide-wrapper blockquote.pull-right{padding-left:15px;border-right:5px solid #3E87CF;text-align:right;padding-right:20px;border-left:none}slides>slide .slide-wrapper blockquote.pull-right small::before{content:''}slides>slide .slide-wrapper blockquote.pull-right small::after{content:'\\00A0 \\2014'}slides>slide .slide-wrapper b,slides>slide .slide-wrapper strong{font-weight:bold;margin:0 5px;text-shadow:2px 3px 1px rgba(0,0,0,0.8)}slides>slide .slide-wrapper em{margin:0 5px;font-weight:bold;text-shadow:-1px -2px 1px rgba(0,0,0,0.8)}slides>slide .slide-wrapper pre b,slides>slide .slide-wrapper pre strong{margin:0;text-shadow:none}slides>slide{display:none;font-size:26px;color:white;background-color:#03C8CB;width:100%;height:100%;position:absolute;top:0;left:0;z-index:9;padding:40px 60px;-moz-transition:all 0.6s ease-in-out;-o-transition:all 0.6s ease-in-out;-webkit-transition:all 0.6s ease-in-out;transition:all 0.6s ease-in-out;transform-style:preserve-3d;-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}slides>slide.far-past{display:none}slides>slide.past{display:block;opacity:0}slides>slide.current{display:block;opacity:1;z-index:99}slides>slide.current .auto-fadein{opacity:1}slides>slide.current .gdbar{-moz-background-size:100% 100%;-o-background-size:100% 100%;-webkit-background-size:100% 100%;background-size:100% 100%}slides>slide.next{display:block;opacity:0}slides>slide.far-next{display:none}slides>slide.dark{background:#515151 !important}slides>slide.title-slide:after{content:'';position:absolute;bottom:40px;right:40px;width:100%;height:60px}slides>slide.backdrop{z-index:-10;display:block !important;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iODUlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZTZlNmU2Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(85%, #ffffff),color-stop(100%, #e6e6e6));background:-moz-linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background:-webkit-linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background:linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background-color:white}slides>slide.backdrop:after,slides>slide.backdrop:before{display:none}slides>slide:nth-child(6n+1){background-color:#dc6c5f}slides>slide:nth-child(6n+2){background-color:#04AA55}slides>slide:nth-child(6n+3){background-color:#487BD3}slides>slide:nth-child(6n+4){background-color:#049DBF}slides>slide:nth-child(6n+5){background-color:#DA4A89}slides>slide .note{color:black}slides>slide .note h1,slides>slide .note h2,slides>slide .note h3,slides>slide .note h4{color:black;text-shadow:none}slides.layout-faux-widescreen>slide{padding:40px 160px}slides.layout-widescreen>slide .slide-wrapper,slides.layout-faux-widescreen>slide .slide-wrapper{width:100%;max-width:100%}slides.layout-widescreen>slide .slide-wrapper img,slides.layout-faux-widescreen>slide .slide-wrapper img{max-width:980px}slides.layout-widescreen>slide.far-past,slides.layout-faux-widescreen>slide.far-past{display:block;display:none;-moz-transform:translate(-2260px);-ms-transform:translate(-2260px);-webkit-transform:translate(-2260px);transform:translate(-2260px);-moz-transform:translate3d(-2260px, 0, 0);-ms-transform:translate3d(-2260px, 0, 0);-webkit-transform:translate3d(-2260px, 0, 0);transform:translate3d(-2260px, 0, 0)}slides.layout-widescreen>slide.past,slides.layout-faux-widescreen>slide.past{display:block;opacity:0}slides.layout-widescreen>slide.current,slides.layout-faux-widescreen>slide.current{display:block;opacity:1}slides.layout-widescreen>slide.next,slides.layout-faux-widescreen>slide.next{display:block;opacity:0}slides.layout-widescreen>slide.far-next,slides.layout-faux-widescreen>slide.far-next{display:block;display:none;-moz-transform:translate(2260px);-ms-transform:translate(2260px);-webkit-transform:translate(2260px);transform:translate(2260px);-moz-transform:translate3d(2260px, 0, 0);-ms-transform:translate3d(2260px, 0, 0);-webkit-transform:translate3d(2260px, 0, 0);transform:translate3d(2260px, 0, 0)}slides.layout-widescreen #prev-slide-area,slides.layout-faux-widescreen #prev-slide-area{margin-left:-650px}slides.layout-widescreen #next-slide-area,slides.layout-faux-widescreen #next-slide-area{margin-left:550px}a{color:#FF8C78;background-color:#FFF2B5;padding:0 3px;text-decoration:none;border-bottom:1px dashed #FF8C78;cursor:help;margin:0 5px}a:hover{background-color:#F9FF95}h1,h2,h3{font-weight:600;text-shadow:2px 2px 2px #000}h1{font-size:45px;line-height:1.5;color:white;margin-bottom:0.5em;text-shadow:2px 3px 4px #000}h2{font-weight:bold;font-size:34px;line-height:2;color:white}h3{font-size:28px;line-height:1.5;font-weight:inherit;color:white}ul{margin-left:1.2em;position:relative;list-style:disc inside;text-align:left;display:inline-block}ul li{line-height:1.75em;list-style-position:outside}ul li ul{margin-left:2em;margin-bottom:0;list-style-type:none;display:block}ul li ul li:before{content:'-';position:absolute;margin-left:-1em;font-weight:600}ul ul{margin-top:.5em}.highlight-code slide.current b,.highlight-code slide.current strong,slide.current .hljs b,slide.current .hljs strong{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:shake;animation-name:shake;-webkit-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current em,slide.current .hljs em{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:flash;animation-name:flash;-webkit-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current .hljs b,.highlight-code slide.current .hljs strong{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:flash;animation-name:flash;-webkit-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current .hljs em{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:shake;animation-name:shake;-webkit-animation-duration:1.5s;animation-duration:1.5s}pre{font-family:'Source Code Pro', 'Courier New', monospace;font-size:20px;line-height:1.2em;letter-spacing:-1px;margin-bottom:20px;text-align:left;position:relative;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}pre code{font-size:95%;font-family:'Source Code Pro', 'Courier New', monospace;color:black;border:none 0;padding:0;background-color:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}code{margin:0;font-family:Consolas, \"Liberation Mono\", Menlo, Courier, monospace;border:1px solid #ddd;background-color:#f8f8f8;padding:0 3px;margin:0 5px;vertical-align:middle;color:#dd1144;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}iframe{width:100%;height:480px;background:white;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}dt{font-weight:bold}button{display:inline-block;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNmOWY5ZjkiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2UzZTNlMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9),color-stop(70%, #e3e3e3));background:-moz-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:-webkit-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:linear-gradient(#f9f9f9 40%,#e3e3e3 70%);border:1px solid #a9a9a9;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:5px 8px;outline:none;white-space:nowrap;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-user-select:none;user-select:none;cursor:pointer;text-shadow:1px 1px #fff;font-size:10pt}button:not(:disabled):hover{border-color:#515151}button:not(:disabled):active{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNlM2UzZTMiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3),color-stop(70%, #f9f9f9));background:-moz-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:-webkit-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:linear-gradient(#e3e3e3 40%,#f9f9f9 70%)}:disabled{color:#a9a9a9}.blue{color:#4387fd}.blue2,.blue-2{color:#3c8ef3}.blue3,.blue-3{color:#2a7cdf}.yellow{color:#ffd14d}.yellow2,.yellow-2{color:#f9cc46}.yellow3,.yellow-3{color:#f6c000}.green{color:#0da861}.green2,.green-2{color:#00a86d}.green3,.green-3{color:#009f5d}.red{color:#f44a3f}.red2,.red-2{color:#e0543e}.red3,.red-3{color:#d94d3a}.gray{color:#e6e6e6}.gray2,.gray-2{color:#a9a9a9}.gray3,.gray-3{color:#797979}.gray4,.gray-4{color:#515151}.white{color:white !important}.black{color:black !important}.columns-2,.columns2{-moz-column-count:2;-webkit-column-count:2;column-count:2}.columns-3,.columns3{-moz-column-count:3;-webkit-column-count:3;column-count:3}table{width:100%;color:black;border-collapse:-moz-initial;border-collapse:initial;border-spacing:1px;border-bottom:1px solid #797979}table thead th{background-color:#e6e6e6;font-weight:bold}table tr>td:first-child,table th{font-weight:bolder}table tr{background-color:white}table tr:nth-child(even){background-color:#e6e6e6}table td,table th{font-size:18px;padding:1em 0.5em;line-height:1.5}table td.highlight{font-weight:bold;color:#468847;background-color:#dff0d8 !important}table.rows{border-bottom:none;border-right:1px solid #797979}slide.fill{background-repeat:no-repeat;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-background-size:cover;-o-background-size:cover;-webkit-background-size:cover;background-size:cover}article.smaller p,article.smaller ul{font-size:20px;line-height:24px;letter-spacing:0}article.smaller table td,article.smaller table th{font-size:14px}article.smaller pre{font-size:15px;line-height:20px;letter-spacing:0}article.smaller q{font-size:40px;line-height:48px}article.smaller q:before,article.smaller q:after{font-size:60px}.fade{display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center}.fade>*{opacity:0;-moz-transition:opacity 0.5s ease-in-out 0.2s;-o-transition:opacity 0.5s ease-in-out 0.2s;-webkit-transition:opacity 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:opacity 0.5s ease-in-out 0.2s}.fade>.to-build:first-child{display:-webkit-flex;display:flex;visibility:hidden}.fade>.build-fade{opacity:0;display:none;visibility:hidden}.fade>.build-fade:last-child{opacity:1;display:-webkit-flex;display:flex;visibility:visible}.fade>.building{display:-webkit-flex;display:flex;opacity:1}.fade .to-build{opacity:0;display:none}.fadeIn>*{-moz-transition:opacity 0.5s ease-in-out 0.2s;-o-transition:opacity 0.5s ease-in-out 0.2s;-webkit-transition:opacity 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:opacity 0.5s ease-in-out 0.2s}.fadeIn .to-build{opacity:0}.bounceIn>*,.zoomIn>*{opacity:1}.bounceIn .to-build,.zoomIn .to-build{opacity:0}.bounceIn .building,.zoomIn .building{opacity:1;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.bounceIn .building{-webkit-animation-name:bounceIn;animation-name:bounceIn}.zoomIn .building{-webkit-animation-name:zoomIn;animation-name:zoomIn}.moveIn>*{-moz-transition:all 0.5s ease-in-out 0.2s;-o-transition:all 0.5s ease-in-out 0.2s;-webkit-transition:all 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:all 0.5s ease-in-out 0.2s}.moveIn .to-build{opacity:0;-moz-transform:translate3d(60px, 0, 0);-ms-transform:translate3d(60px, 0, 0);-webkit-transform:translate3d(60px, 0, 0);transform:translate3d(60px, 0, 0)}.popup .next .build .to-build{opacity:1 !important}.popup .next .build .build-fade{opacity:1 !important}.note{position:absolute;width:100%;height:100%;top:0;left:0;padding:1em;background:rgba(0,0,0,0.3);opacity:0;display:-webkit-flex;display:flex;-webkit-flex-flow:row;flex-flow:row;-webkit-justify-content:center;justify-content:center;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-transition:all 0.4s ease-in-out;-o-transition:all 0.4s ease-in-out;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}.note>section{text-align:left;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:inset 0 0 10px #6F6F6F;-webkit-box-shadow:inset 0 0 10px #6F6F6F;box-shadow:inset 0 0 10px #6F6F6F;width:70%;padding:2em}.with-notes.popup slides.layout-widescreen slide.next,.with-notes.popup slides.layout-faux-widescreen slide.next{-moz-transform:translate3d(690px, 80px, 0) scale(0.35);-ms-transform:translate3d(690px, 80px, 0) scale(0.35);-webkit-transform:translate3d(690px, 80px, 0) scale(0.35);transform:translate3d(690px, 80px, 0) scale(0.35)}.with-notes.popup slides.layout-widescreen slide .note,.with-notes.popup slides.layout-faux-widescreen slide .note{z-index:100;-moz-transform:translate3d(300px, 700px, 0) scale(1.5);-ms-transform:translate3d(300px, 700px, 0) scale(1.5);-webkit-transform:translate3d(300px, 700px, 0) scale(1.5);transform:translate3d(300px, 700px, 0) scale(1.5)}.with-notes.popup slide{width:1100px !important;overflow:visible;-moz-transition:none !important;-o-transition:none !important;-webkit-transition:none !important;transition:none !important;-moz-transform-origin:0 0 !important;-ms-transform-origin:0 0 !important;-webkit-transform-origin:0 0 !important;transform-origin:0 0 !important}.with-notes.popup slide[data-transition].current,.with-notes.popup slide[data-transition].next,.with-notes.popup slide[data-transition].past{top:auto !important;left:auto !important;-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-animation-name:none;animation-name:none}.with-notes.popup slide:not(.backdrop){-moz-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);-ms-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);-webkit-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);transform:scale(0.6) translate3d(0.5em, 0.5em, 0)}.with-notes.popup slide.backdrop{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHJhZGlhbEdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNjAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2IxZGZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQzODdmZCIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px);background-image:-webkit-radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px);background-image:radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px)}.with-notes.popup slide.next{-moz-transform:translate3d(690px, 80px, 0) scale(0.35);-ms-transform:translate3d(690px, 80px, 0) scale(0.35);-webkit-transform:translate3d(690px, 80px, 0) scale(0.35);transform:translate3d(690px, 80px, 0) scale(0.35);opacity:1 !important;-webkit-clip-path:none !important}.with-notes.popup slide.next .note{display:none !important}.with-notes.popup .note{width:100%;height:210px;padding:0;-moz-transform:translate3d(350px, 850px, 0) scale(1.5);-ms-transform:translate3d(350px, 850px, 0) scale(1.5);-webkit-transform:translate3d(350px, 850px, 0) scale(1.5);transform:translate3d(350px, 850px, 0) scale(1.5);-moz-transition:opacity 400ms ease-in-out;-o-transition:opacity 400ms ease-in-out;-webkit-transition:opacity 400ms ease-in-out;transition:opacity 400ms ease-in-out}.with-notes.popup .note>section{background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;overflow:auto;padding:1em}.with-notes .note{display:-webkit-flex;display:flex;opacity:1;-moz-transform:translateY(0);-ms-transform:translateY(0);-webkit-transform:translateY(0);transform:translateY(0);pointer-events:auto;z-index:100}@media screen and (min-width: 1200px){.with-notes.popup .note{-moz-transform:translate3d(350px, 1050px, 0) scale(1.5);-ms-transform:translate3d(350px, 1050px, 0) scale(1.5);-webkit-transform:translate3d(350px, 1050px, 0) scale(1.5);transform:translate3d(350px, 1050px, 0) scale(1.5)}.with-notes.popup slide.next{-moz-transform:translate3d(890px, 80px, 0) scale(0.35);-ms-transform:translate3d(890px, 80px, 0) scale(0.35);-webkit-transform:translate3d(890px, 80px, 0) scale(0.35);transform:translate3d(890px, 80px, 0) scale(0.35)}}.source{font-size:14px;color:#a9a9a9;position:absolute;line-height:2em;bottom:70px;left:60px}.centered{text-align:center}.reflect{-webkit-box-reflect:below 3px -webkit-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-moz-box-reflect:below 3px -moz-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-o-box-reflect:below 3px -o-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-ms-box-reflect:below 3px -ms-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);box-reflect:below 3px linear-gradient(rgba(255,255,255,0) 85%,#ffffff 150%)}.flexbox{display:-webkit-flex;display:flex;-webkit-flex-flow:row;flex-flow:row}.flexbox.vcenter{display:-webkit-flex;display:flex;-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;height:100%;width:100%}.flexbox.vleft{-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;height:100%;width:100%;text-align:left}.flexbox.vright{-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:flex-end;align-content:flex-end;text-align:right;height:100%;width:100%}.auto-fadein{-moz-transition:opacity 0.6s ease-in 1s;-o-transition:opacity 0.6s ease-in 1s;-webkit-transition:opacity 0.6s ease-in;-webkit-transition-delay:1s;transition:opacity 0.6s ease-in 1s;opacity:0}.slide-area{z-index:1000;position:absolute;left:0;top:0;width:100px;height:600px;left:50%;top:50%;cursor:pointer;margin-top:-300px}#prev-slide-area{margin-left:-550px}#next-slide-area{margin-left:450px}.logoslide img{width:383px;height:92px}.segue{padding:60px 120px}.segue h2{color:#e6e6e6;font-size:60px}.segue h3{color:#e6e6e6;line-height:2.8}.segue hgroup{position:absolute;bottom:225px}.thank-you-slide{background:#4387fd !important;color:white}.thank-you-slide h2{font-size:60px;color:inherit}.thank-you-slide h3{font-size:52px;color:inherit;text-align:right}.thank-you-slide article>p{margin-top:2em;font-size:20pt}.thank-you-slide>p{position:absolute;bottom:80px;font-size:24pt;line-height:1.3em}aside.gdbar{height:97px;width:215px;position:absolute;left:-1px;top:125px;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0;border-radius:0 10px 10px 0;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U2ZTZlNiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U2ZTZlNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==') no-repeat;background:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e6e6e6),color-stop(100%, #e6e6e6)) no-repeat;background:-moz-linear-gradient(left, #e6e6e6,#e6e6e6) no-repeat;background:-webkit-linear-gradient(left, #e6e6e6,#e6e6e6) no-repeat;background:linear-gradient(to right, #e6e6e6,#e6e6e6) no-repeat;-moz-background-size:0% 100%;-o-background-size:0% 100%;-webkit-background-size:0% 100%;background-size:0% 100%;-moz-transition:all 0.5s ease-out 0.5s;-o-transition:all 0.5s ease-out 0.5s;-webkit-transition:all 0.5s ease-out;-webkit-transition-delay:0.5s;transition:all 0.5s ease-out 0.5s}aside.gdbar.right{right:0;left:-moz-initial;left:initial;top:204px;-moz-transform:rotateZ(180deg);-ms-transform:rotateZ(180deg);-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}aside.gdbar.right img{-moz-transform:rotateZ(180deg);-ms-transform:rotateZ(180deg);-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}aside.gdbar.bottom{top:-moz-initial;top:initial;bottom:60px}aside.gdbar img{width:85px;height:85px;position:absolute;right:0;margin:8px 15px}.title-slide hgroup{bottom:100px}.title-slide hgroup h1{font-size:65px;line-height:1.4;letter-spacing:-3px;color:#515151}.title-slide hgroup h2{font-size:34px;color:#a9a9a9;font-weight:inherit}.title-slide hgroup p{font-size:20px;color:#797979;line-height:1.3;margin-top:2em}.quote{color:#e6e6e6}.quote .author{font-size:24px;position:absolute;bottom:80px;line-height:1.4}.overview.popup .note{display:none !important}.overview slides slide{display:block;cursor:pointer;opacity:0.5;pointer-events:auto !important;width:1100px}.overview slides slide.backdrop{display:none !important}.overview slides slide.far-past,.overview slides slide.past,.overview slides slide.next,.overview slides slide.far-next,.overview slides slide.far-past{opacity:0.5 !important;display:block !important}.overview slides slide.current{opacity:1 !important}.overview .slide-area{display:none}.with-notes.popup.overview slide.next{opacity:0.5 !important}.qrcode{display:none;position:fixed;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,0.5)}.qrcode #qrcode{width:256px;height:300px;vertical-align:middle;margin:0 auto;position:relative;background-color:white;padding:20px 20px 10px;top:100px}.qrcode p{text-align:center;line-height:44px;position:absolute;top:380px;width:100%}#_timer_{display:block;position:fixed;bottom:1em;left:0.5em}.img-full{-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-moz-transition:opacity 800ms;-o-transition:opacity 800ms;-webkit-transition:opacity 800ms;transition:opacity 800ms;background-color:#000;bottom:0;display:-webkit-box;display:-moz-box;display:box;left:0;overflow:auto;position:fixed;right:0;top:0;display:none}.img-full img{background:#000;color:#333;padding:0;position:fixed;min-width:100px;z-index:0;top:20px;left:50%;-webkit-transition:800ms -webkit-transform;-moz-transition:800ms -moz-transform;transition:800ms transform}.img-full img.transparent{-moz-transform:scale(0.99) translateY(-20px);-ms-transform:scale(0.99) translateY(-20px);-webkit-transform:scale(0.99) translateY(-20px);transform:scale(0.99) translateY(-20px)}#_buttons{position:fixed;bottom:0.25em;z-index:9999;right:0.25em}#_buttons ._btn-box{display:inline-block}#_buttons button{font-size:1rem;background:none;border:0 none;color:rgba(0,0,0,0.3);text-shadow:0 0 transparent}#_buttons button:hover{color:black}.popup.with-notes #_buttons ._btn-box,.overview #_buttons ._btn-box{display:inline-block !important}.popup.with-notes #_buttons #_btn-bar,.overview #_buttons #_btn-bar{display:none !important}.popup.with-notes #_buttons button,.overview #_buttons button{color:white}slide[data-transition=\"zoomout\"].past,slide[data-transition=\"zoomin\"].next{-moz-transform:scale(1.2);-ms-transform:scale(1.2);-webkit-transform:scale(1.2);transform:scale(1.2)}slide[data-transition=\"zoomin\"].past,slide[data-transition=\"zoomout\"].next{-moz-transform:scale(0.8);-ms-transform:scale(0.8);-webkit-transform:scale(0.8);transform:scale(0.8)}slide[data-transition=\"horizontal\"].current{-moz-transform-origin:20% 80% 50%;-ms-transform-origin:20% 80% 50%;-webkit-transform-origin:20% 80% 50%;transform-origin:20% 80% 50%}slide[data-transition=\"horizontal\"].next,slide[data-transition=\"horizontal\"].past{-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg);-webkit-transform:rotate(-30deg);transform:rotate(-30deg)}slide[data-transition=\"horizontal\"].next{left:450px}slide[data-transition=\"horizontal\"].past{left:-450px}slides.layout-widescreen>slide[data-transition=\"horizontal\"].next{left:550px}slides.layout-widescreen>slide[data-transition=\"horizontal\"].past{left:-550px}slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform-origin:50% 50% -450px 50%;-ms-transform-origin:50% 50% -450px 50%;-webkit-transform-origin:50% 50% -450px 50%;transform-origin:50% 50% -450px 50%}.layout-widescreen slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-origin:50% 50% -550px 50%;-ms-transform-origin:50% 50% -550px 50%;-webkit-transform-origin:50% 50% -550px 50%;transform-origin:50% 50% -550px 50%}slide[data-transition=\"horizontal3d\"].next{-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}slide[data-transition=\"horizontal3d\"].past{-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}slide[data-transition=\"vertical3d\"].next{top:300px;-moz-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);-ms-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);-webkit-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0)}slide[data-transition=\"vertical3d\"].past{-moz-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);-ms-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);-webkit-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);top:-300px}slide[data-transition=\"cards\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform-origin:0 100% 0 50%;-ms-transform-origin:0 100% 0 50%;-webkit-transform-origin:0 100% 0 50%;transform-origin:0 100% 0 50%}slide[data-transition=\"cards\"].next{-moz-transform:translate3d(50px, 0, -100px);-ms-transform:translate3d(50px, 0, -100px);-webkit-transform:translate3d(50px, 0, -100px);transform:translate3d(50px, 0, -100px);opacity:0}slide[data-transition=\"cards\"].past{-moz-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);-ms-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);-webkit-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);opacity:0}slide.pagedown[data-transition=\"glue\"].current{-webkit-animation:moveFromRight .6s ease both;animation:moveFromRight .6s ease both;-webkit-animation-delay:.3s;animation-delay:.3s;z-index:999}slide.pagedown[data-transition=\"glue\"].next{-webkit-transform-origin:0% 50%;transform-origin:0% 50%;-webkit-animation:rotateRightSideFirst .8s both ease-in;animation:rotateRightSideFirst .8s both ease-in;opacity:1}slide.pagedown[data-transition=\"glue\"].past{-webkit-transform-origin:100% 50%;transform-origin:100% 50%}slide.pageup[data-transition=\"glue\"].current{-webkit-animation:moveFromLeft .6s ease both;animation:moveFromLeft .6s ease both;-webkit-animation-delay:.3s;animation-delay:.3s;z-index:999}slide.pageup[data-transition=\"glue\"].next{-webkit-transform-origin:0% 50%;transform-origin:0% 50%}slide.pageup[data-transition=\"glue\"].past{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-animation:rotateLeftSideFirst .8s both ease-in;animation:rotateLeftSideFirst .8s both ease-in;opacity:1}slide.pagedown[data-transition=\"kontext\"]{-moz-transform:translateZ(-100px);-ms-transform:translateZ(-100px);-webkit-transform:translateZ(-100px);transform:translateZ(-100px)}slide.pagedown[data-transition=\"kontext\"].current{-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:show-right 1s forwards ease;animation:show-right 1s forwards ease;z-index:999}slide.pagedown[data-transition=\"kontext\"].past{-webkit-animation:hide-right 1s forwards ease;animation:hide-right 1s forwards ease;opacity:1;z-index:99}slide.pageup[data-transition=\"kontext\"].current{-webkit-animation:show-left 1s forwards ease;animation:show-left 1s forwards ease;-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}slide.pageup[data-transition=\"kontext\"].next{-webkit-animation:hide-left 1s forwards ease;animation:hide-left 1s forwards ease;opacity:1;z-index:99}slide[data-transition=\"newspaper\"].current{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:rotateInNewspaper .5s both ease-out;animation:rotateInNewspaper .5s both ease-out;-webkit-animation-delay:.5s;animation-delay:.5s;z-index:999}slide[data-transition=\"newspaper\"].past{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:rotateOutNewspaper .5s both ease-in;animation:rotateOutNewspaper .5s both ease-in;opacity:1;z-index:99}slide[data-transition=\"newspaper\"].next{z-index:99}slide.pagedown[data-transition=\"move\"]{z-index:99}slide.pagedown[data-transition=\"move\"].current{-webkit-animation:moveFromRight .6s ease both;animation:moveFromRight .6s ease both;z-index:999}slide.pagedown[data-transition=\"move\"].past{-webkit-animation:moveToLeft .7s ease-in-out both;animation:moveToLeft .7s ease-in-out both;opacity:1;z-index:999}slide.pageup[data-transition=\"move\"].current{-webkit-animation:moveFromLeft .6s ease both;animation:moveFromLeft .6s ease both;z-index:999}slide.pageup[data-transition=\"move\"].next{-webkit-animation:moveToRight .7s ease-in-out both;animation:moveToRight .7s ease-in-out both;opacity:1;z-index:99}slide.pagedown[data-transition=\"stick\"],slide.pageup[data-transition=\"stick\"]{-webkit-perspective:1600px;perspective:1600px;opacity:0;z-index:999}slide.pagedown[data-transition=\"stick\"].current{z-index:1001;opacity:1;-webkit-animation:slideInFromBottomDelayed 0.8s forwards;animation:slideInFromBottomDelayed 0.8s forwards}slide.pagedown[data-transition=\"stick\"].past{opacity:0;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;-webkit-animation:rotateBottomSideOut 0.8s forwards ease-in;animation:rotateBottomSideOut 0.8s forwards ease-in}slide.pageup[data-transition=\"stick\"].current{opacity:1;-webkit-transform-origin:50% 0%;transform-origin:50% 0%;-webkit-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in}slide.pageup[data-transition=\"stick\"].next{opacity:1;-webkit-animation:slideOutToBottom 0.8s forwards;animation:slideOutToBottom 0.8s forwards}slide[data-transition=\"vkontext\"]{-webkit-perspective:1000px;perspective:1000px}slide.pagedown[data-transition=\"vkontext\"].current{-webkit-animation:showRight 1s forwards;animation:showRight 1s forwards}slide.pagedown[data-transition=\"vkontext\"].past{-webkit-animation:hideLeft 1s forwards;animation:hideLeft 1s forwards}slide.pageup[data-transition=\"vkontext\"].current{-webkit-animation:showLeft 1s forwards;animation:showLeft 1s forwards}slide.pageup[data-transition=\"vkontext\"].next{-webkit-animation:hideRight 1s forwards;animation:hideRight 1s forwards}slide.pagedown[data-transition=\"earthquake\"].current{-webkit-animation:pushFromTop 1s 0.1s forwards;animation:pushFromTop 1s 0.1s forwards;opacity:1}slide.pagedown[data-transition=\"earthquake\"].past{opacity:1;-webkit-animation:shakeSlideBottom 1s 0.1s forwards;animation:shakeSlideBottom 1s 0.1s forwards}slide.pageup[data-transition=\"earthquake\"].current{opacity:1;-webkit-animation:pushFromBottom 1s 0.1s forwards;animation:pushFromBottom 1s 0.1s forwards}slide.pageup[data-transition=\"earthquake\"].next{opacity:1;-webkit-animation:shakeSlideTop 1s 0.1s forwards;animation:shakeSlideTop 1s 0.1s forwards}slide[data-transition=\"earthquake\"]::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;pointer-events:none;background-color:rgba(0,0,0,0.3);transition:opacity 0.5s}slide[data-transition=\"earthquake\"].next::after,slide[data-transition=\"earthquake\"].past::after{opacity:1}slide.pagedown[data-transition=\"circle\"],slide.pageup[data-transition=\"circle\"]{-webkit-transform-origin:50% 400%;transform-origin:50% 400%}slide.pagedown[data-transition=\"circle\"]::after,slide.pageup[data-transition=\"circle\"]::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;pointer-events:none;background-color:#000;transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"circle\"].current{opacity:1;-webkit-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"circle\"].past{opacity:1;-webkit-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"circle\"].current{opacity:1;-webkit-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"circle\"].next{opacity:1;-webkit-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide[data-transition=\"circle\"].next::after,slide[data-transition=\"circle\"].past::after{opacity:1}slide.pagedown[data-transition=\"pulse\"],slide.pageup[data-transition=\"pulse\"]{opacity:0}slide.pagedown[data-transition=\"pulse\"].past,slide.pageup[data-transition=\"pulse\"].next{-webkit-animation:scaleUpFadeOut 0.8s forwards ease-in;animation:scaleUpFadeOut 0.8s forwards ease-in}slide.pageup[data-transition=\"pulse\"].current,slide.pagedown[data-transition=\"pulse\"].current{-webkit-animation:scaleDownFadeIn 0.8s forwards ease-out;animation:scaleDownFadeIn 0.8s forwards ease-out}slide.pagedown[data-transition=\"slide\"].past{-webkit-animation:rotateSlideOutToLeft 1s both ease;animation:rotateSlideOutToLeft 1s both ease}slide.pagedown[data-transition=\"slide\"].current{-webkit-animation:rotateSlideInFromRight 1s both ease;animation:rotateSlideInFromRight 1s both ease}slide.pageup[data-transition=\"slide\"].current{-webkit-animation:rotateSlideInFromLeft 1s both ease;animation:rotateSlideInFromLeft 1s both ease}slide.pageup[data-transition=\"slide\"].next{-webkit-animation:rotateSlideOutToRight 1s both ease;animation:rotateSlideOutToRight 1s both ease}slide.pagedown[data-transition=\"slide2\"].past{-webkit-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"slide2\"].current{opacity:1;-webkit-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"slide2\"].next{-webkit-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"slide2\"].current{opacity:1;-webkit-animation:slideInFromLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideInFromLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"slide3\"].past{-webkit-animation:slideOutScaleLeft 1.2s forwards;animation:slideOutScaleLeft 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-webkit-animation-timing-function:cubic-bezier(1, -0.2, 0, 1);animation-timing-function:cubic-bezier(1, -0.2, 0, 1)}slide.pagedown[data-transition=\"slide3\"].current{opacity:1;-webkit-animation:slideInFromRight 1.2s forwards;animation:slideInFromRight 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-webkit-animation-timing-function:cubic-bezier(1, -0.2, 0, 1);animation-timing-function:cubic-bezier(1, -0.2, 0, 1)}slide.pageup[data-transition=\"slide3\"].current{opacity:1;-webkit-animation:slideInFromLeft 1.2s forwards;animation:slideInFromLeft 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-webkit-animation-timing-function:cubic-bezier(1, -0.2, 0, 1);animation-timing-function:cubic-bezier(1, -0.2, 0, 1)}slide.pageup[data-transition=\"slide3\"].next{opacity:1;-webkit-animation:slideOutScaleRight 1.2s forwards;animation:slideOutScaleRight 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-webkit-animation-timing-function:cubic-bezier(1, -0.2, 0, 1);animation-timing-function:cubic-bezier(1, -0.2, 0, 1)}slide[data-transition=\"cover-diamond\"]{-moz-transition:opacity 0s,-webkit-clip-path 1s;-o-transition:opacity 0s,-webkit-clip-path 1s;-webkit-transition:opacity 0s,-webkit-clip-path 1s;transition:opacity 0s,-webkit-clip-path 1s;opacity:0;-webkit-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%)}slide[data-transition=\"cover-diamond\"].current{opacity:1;-webkit-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%)}slide[data-transition=\"cover-diamond\"].past{-moz-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;-o-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;-webkit-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s}slide[data-transition=\"cover-circle\"]{-moz-transition:opacity 0s,-webkit-clip-path 1s;-o-transition:opacity 0s,-webkit-clip-path 1s;-webkit-transition:opacity 0s,-webkit-clip-path 1s;transition:opacity 0s,-webkit-clip-path 1s;opacity:0;-webkit-clip-path:circle(5%, 50%, 50%);-webkit-clip-path:circle(5% at 50% 50%)}slide[data-transition=\"cover-circle\"].current{opacity:1;-webkit-clip-path:circle(80%, 50%, 50%);-webkit-clip-path:circle(80% at 50% 50%)}slide[data-transition=\"cover-circle\"].past{-moz-transition:all 0s cubic-bezier(0.11, 0.75, 0.58, 0.97);-o-transition:all 0s cubic-bezier(0.11, 0.75, 0.58, 0.97);-webkit-transition:all 0s cubic-bezier(0.11, 0.75, 0.58, 0.97);transition:all 0s cubic-bezier(0.11, 0.75, 0.58, 0.97)}@-webkit-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);opacity:0}}@keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-webkit-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%)}to{-webkit-transform:translateX(0)}}@keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);opacity:0}}@keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-webkit-keyframes slideInFromRight{from{-webkit-transform:translateX(100%)}to{-webkit-transform:translateX(0)}}@keyframes slideInFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);opacity:0}}@keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@-webkit-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%)}}@keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-webkit-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0)}}@keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-webkit-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%)}}@keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-webkit-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0)}}@keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-webkit-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%)}}@keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes pushFromTop{0%, 70%{opacity:0;-webkit-transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0)}}@keyframes pushFromTop{0%, 70%{opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%)}}@keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes pushFromBottom{0%, 70%{opacity:0;-webkit-transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0)}}@keyframes pushFromBottom{0%, 70%{opacity:0;-webkit-transform:translateY(100%);transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes hideLeft{0%{-webkit-transform:translateZ(0px)}40%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);z-index:9999}100%{opacity:1;-webkit-transform:translateZ(-400px)}}@keyframes hideLeft{0%{-webkit-transform:translateZ(0px);transform:translateZ(0px)}40%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);z-index:9999}100%{opacity:1;-webkit-transform:translateZ(-400px);transform:translateZ(-400px)}}@-webkit-keyframes showRight{0%{-webkit-transform:translateZ(-400px);opacity:1}40%{-webkit-transform:translate(0, 40%) scale(0.8) rotateX(20deg);opacity:1}41%{-webkit-transform:translate(0, 40%) scale(0.8) rotateX(20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);opacity:1;z-index:9999}}@keyframes showRight{0%{-webkit-transform:translateZ(-400px);transform:translateZ(-400px);opacity:1}40%{-webkit-transform:translate(0, 40%) scale(0.8) rotateX(20deg);transform:translate(0, 40%) scale(0.8) rotateX(20deg);opacity:1}41%{-webkit-transform:translate(0, 40%) scale(0.8) rotateX(20deg);transform:translate(0, 40%) scale(0.8) rotateX(20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-webkit-keyframes hideRight{0%{-webkit-transform:translateZ(0px)}40%{-webkit-transform:translate(0, 40%) scale(0.8) rotateX(20deg);z-index:9999}100%{opacity:1;-webkit-transform:translateZ(-400px)}}@keyframes hideRight{0%{-webkit-transform:translateZ(0px);transform:translateZ(0px)}40%{-webkit-transform:translate(0, 40%) scale(0.8) rotateX(20deg);transform:translate(0, 40%) scale(0.8) rotateX(20deg);z-index:9999}100%{opacity:1;-webkit-transform:translateZ(-400px);transform:translateZ(-400px)}}@-webkit-keyframes showLeft{0%{-webkit-transform:translateZ(-400px);opacity:1}40%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);opacity:1;z-index:9999}}@keyframes showLeft{0%{-webkit-transform:translateZ(-400px);transform:translateZ(-400px);opacity:1}40%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-webkit-keyframes show-right{0%{-webkit-transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px)}}@-webkit-keyframes hide-right{0%{-webkit-transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);visibility:hidden}}@-moz-keyframes show-right{0%{-moz-transform:translateZ(-200px)}40%{-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-moz-transform:translateZ(0px)}}@-moz-keyframes hide-right{0%{-moz-transform:translateZ(0px);visibility:visible}40%{-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-moz-transform:translateZ(-200px);visibility:hidden}}@keyframes show-right{0%{transform:translateZ(-200px)}40%{transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{transform:translateZ(0px)}}@keyframes hide-right{0%{transform:translateZ(0px);visibility:visible}40%{transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{transform:translateZ(-200px);visibility:hidden}}@-webkit-keyframes show-left{0%{-webkit-transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px)}}@-webkit-keyframes hide-left{0%{-webkit-transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);visibility:hidden}}@-moz-keyframes show-left{0%{-moz-transform:translateZ(-200px)}40%{-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-moz-transform:translateZ(0px)}}@-moz-keyframes hide-left{0%{-moz-transform:translateZ(0px);visibility:visible}40%{-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-moz-transform:translateZ(-200px);visibility:hidden}}@keyframes show-left{0%{transform:translateZ(-200px)}40%{transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{transform:translateZ(0px)}}@keyframes hide-left{0%{transform:translateZ(0px);visibility:visible}40%{transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{transform:translateZ(-200px);visibility:hidden}}@-webkit-keyframes moveToLeft{to{-webkit-transform:translateX(-100%)}}@keyframes moveToLeft{to{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%)}}@keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveToRight{to{-webkit-transform:translateX(100%)}}@keyframes moveToRight{to{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveFromRight{from{-webkit-transform:translateX(100%)}}@keyframes moveFromRight{from{-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveToTop{to{-webkit-transform:translateY(-100%)}}@keyframes moveToTop{to{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveFromTop{from{-webkit-transform:translateY(-100%)}}@keyframes moveFromTop{from{-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveToBottom{to{-webkit-transform:translateY(100%)}}@keyframes moveToBottom{to{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes moveFromBottom{from{-webkit-transform:translateY(100%)}}@keyframes moveFromBottom{from{-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes fade{to{opacity:0.3}}@keyframes fade{to{opacity:0.3}}@-webkit-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%)}}@keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%)}}@keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%)}}@keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%)}}@keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%)}}@keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%)}}@keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%)}}@keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%)}}@keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8)}}@keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);transform:scale(0.8)}}@-webkit-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8)}}@keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);transform:scale(0.8)}}@-webkit-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2)}}@keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);transform:scale(1.2)}}@-webkit-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2)}}@keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);transform:scale(1.2)}}@-webkit-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7)}}@keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}}@-webkit-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7)}}@keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);transform:scale(0.7)}}@-webkit-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-webkit-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-webkit-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-webkit-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-webkit-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-webkit-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-webkit-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-webkit-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-webkit-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg)}}@keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-webkit-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-webkit-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-webkit-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg)}}@keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}}@-webkit-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg)}}@keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-webkit-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg)}}@keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-webkit-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg)}}@keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);transform:rotateX(90deg)}}@-webkit-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg)}}@keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-webkit-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg)}}@keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}}@-webkit-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg)}}@keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-webkit-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg)}}@keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);transform:rotateX(90deg)}}@-webkit-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg)}}@keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg)}}@keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg)}}@keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg)}}@keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg)}}@keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-webkit-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg)}}@keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-webkit-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg)}}@keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-webkit-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg)}}@keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-webkit-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg)}}@keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-webkit-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg)}}@keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-webkit-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg)}}@keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-webkit-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg)}}@keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-webkit-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-webkit-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg)}}@keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-webkit-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-webkit-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg)}}@keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-webkit-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transform:translateX(-150%) scale(0.4) rotateY(-65deg)}}@keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transform:translateX(-150%) scale(0.4) rotateY(-65deg);transform:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-webkit-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transform:translateX(200%) scale(0.4) rotateY(65deg)}}@keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transform:translateX(200%) scale(0.4) rotateY(65deg);transform:translateX(200%) scale(0.4) rotateY(65deg)}}@-webkit-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transform:translateX(200%) scale(0.4) rotateY(65deg)}}@keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transform:translateX(200%) scale(0.4) rotateY(65deg);transform:translateX(200%) scale(0.4) rotateY(65deg)}}@-webkit-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transform:translateX(-200%) scale(0.4) rotateY(-65deg)}}@keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transform:translateX(-200%) scale(0.4) rotateY(-65deg);transform:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-webkit-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transform:translateY(-200%) scale(0.4) rotateX(65deg)}}@keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transform:translateY(-200%) scale(0.4) rotateX(65deg);transform:translateY(-200%) scale(0.4) rotateX(65deg)}}@-webkit-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transform:translateY(200%) scale(0.4) rotateX(-65deg)}}@keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transform:translateY(200%) scale(0.4) rotateX(-65deg);transform:translateY(200%) scale(0.4) rotateX(-65deg)}}@-webkit-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transform:translateY(200%) scale(0.4) rotateX(-65deg)}}@keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transform:translateY(200%) scale(0.4) rotateX(-65deg);transform:translateY(200%) scale(0.4) rotateX(-65deg)}}@-webkit-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transform:translateY(-200%) scale(0.4) rotateX(65deg)}}@keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transform:translateY(-200%) scale(0.4) rotateX(65deg);transform:translateY(-200%) scale(0.4) rotateX(65deg)}}@-webkit-keyframes rotateSidesOut{to{opacity:0;-webkit-transform:translateZ(-500px) rotateY(90deg)}}@keyframes rotateSidesOut{to{opacity:0;-webkit-transform:translateZ(-500px) rotateY(90deg);transform:translateZ(-500px) rotateY(90deg)}}@-webkit-keyframes rotateSidesIn{from{opacity:0;-webkit-transform:translateZ(-500px) rotateY(-90deg)}}@keyframes rotateSidesIn{from{opacity:0;-webkit-transform:translateZ(-500px) rotateY(-90deg);transform:translateZ(-500px) rotateY(-90deg)}}@-webkit-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%)}}@keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-webkit-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%)}}@keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-webkit-keyframes rotateSlideInFromRight{0%, 25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0)}}@keyframes rotateSlideInFromRight{0%, 25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-webkit-keyframes rotateSlideInFromLeft{0%, 25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0)}}@keyframes rotateSlideInFromLeft{0%, 25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-webkit-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px)}}@keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-webkit-keyframes slideInFromBottomDelayed{0%, 30%{-webkit-transform:translateY(100%)}100%{-webkit-transform:translateY(0)}}@keyframes slideInFromBottomDelayed{0%, 30%{-webkit-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px)}60%{-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-webkit-animation-timing-function:ease-out}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg)}}@keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-webkit-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%)}}@keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);transform:translateY(100%)}}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/pdf.css",
    "content": "*{-webkit-print-color-adjust:exact}body{margin:0 auto !important;border:0;padding:0;float:none !important;overflow:visible}html{width:100%;height:100%;overflow:visible}slides>slide{display:block !important;position:relative;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important;width:100%;height:100%;page-break-after:always;top:auto !important;left:auto !important;margin-top:0 !important;margin-left:0 !important;opacity:1 !important}slides>slide.far-past,slides>slide.past,slides>slide.next,slides>slide.far-next,slides>slide.far-past,slides>slide.current{opacity:1 !important;display:block !important}slides>slide .build>*{-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none}slides>slide .build .to-build,slides>slide .build .build-fade{opacity:1}slides>slide .auto-fadein{opacity:1 !important}slides>slide.backdrop{display:none !important}slides>slide table.rows{border-right:0}slides>slide[hidden]{display:none !important}.slide-area{display:none}pre,code{font-family:'Source Code Pro',monospace !important}slides>slide{-webkit-clip-path:none !important;opacity:1 !important;visibility:visible !important;padding:0}slides>slide .slide-wrapper,slides>slide.past .slide-wrapper,slides>slide.far-past .slide-wrapper,slides>slide.far-next .slide-wrapper,slides>slide.next .slide-wrapper{opacity:1 !important;visibility:visible !important;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;position:static;width:1100px !important;left:0;top:0;right:0;bottom:0;margin:0 auto 10pt !important;overflow:visible;-moz-perspective:none !important;-webkit-perspective:none !important;perspective:none !important;-moz-perspective-origin:50% 50% !important;-webkit-perspective-origin:50% 50% !important;perspective-origin:50% 50% !important;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}slides>slide .slide-wrapper .build-fade,slides>slide .slide-wrapper .to-buid,slides>slide .slide-wrapper .building,slides>slide.past .slide-wrapper .build-fade,slides>slide.past .slide-wrapper .to-buid,slides>slide.past .slide-wrapper .building,slides>slide.far-past .slide-wrapper .build-fade,slides>slide.far-past .slide-wrapper .to-buid,slides>slide.far-past .slide-wrapper .building,slides>slide.far-next .slide-wrapper .build-fade,slides>slide.far-next .slide-wrapper .to-buid,slides>slide.far-next .slide-wrapper .building,slides>slide.next .slide-wrapper .build-fade,slides>slide.next .slide-wrapper .to-buid,slides>slide.next .slide-wrapper .building{opacity:1 !important;visibility:visible !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}slides>slide .slide-wrapper *,slides>slide.past .slide-wrapper *,slides>slide.far-past .slide-wrapper *,slides>slide.far-next .slide-wrapper *,slides>slide.next .slide-wrapper *{opacity:1 !important;visibility:visible !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}#_buttons,#drawBoard,.progress,#tip{display:none !important}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/phone.css",
    "content": "slides>slide{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;-webkit-transition:none !important;transition:none !important;-moz-transform-origin:0 0 !important;-ms-transform-origin:0 0 !important;-webkit-transform-origin:0 0 !important;transform-origin:0 0 !important}slides>slide[data-transition].current,slides>slide[data-transition].next,slides>slide[data-transition].past{-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-animation-name:none;animation-name:none}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/theme.blue.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#F47F40;background-color:transparent;border-bottom:0}a:hover{color:#FE7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #086fd1,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #086fd1,3px 5px 0px rgba(0,0,0,0.2)}button{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNmOWY5ZjkiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2UzZTNlMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9),color-stop(70%, #e3e3e3));background:-moz-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:-webkit-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:linear-gradient(#f9f9f9 40%,#e3e3e3 70%);border:1px solid #a9a9a9;text-shadow:1px 1px #fff}button:not(:disabled):hover{border-color:#515151}button:not(:disabled):active{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNlM2UzZTMiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3),color-stop(70%, #f9f9f9));background:-moz-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:-webkit-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:linear-gradient(#e3e3e3 40%,#f9f9f9 70%)}table{width:100%;color:#000;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #2e87d3;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px white solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#086fd1}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#086fd1}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#4FFF00}slides>slide .slide-wrapper blockquote{position:relative;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187E7}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/theme.dark.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#FA5B04;background-color:transparent;border-bottom:0}a:hover{color:#FE7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #232323,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #232323,3px 5px 0px rgba(0,0,0,0.2)}button{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNmOWY5ZjkiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2UzZTNlMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9),color-stop(70%, #e3e3e3));background:-moz-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:-webkit-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:linear-gradient(#f9f9f9 40%,#e3e3e3 70%);border:1px solid #a9a9a9;text-shadow:1px 1px #fff}button:not(:disabled):hover{border-color:#515151}button:not(:disabled):active{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNlM2UzZTMiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3),color-stop(70%, #f9f9f9));background:-moz-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:-webkit-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:linear-gradient(#e3e3e3 40%,#f9f9f9 70%)}table{width:100%;color:#f8f7f7;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#232323}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#232323}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00CED1}slides>slide .slide-wrapper blockquote{position:relative;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187E7}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/theme.green.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#FF8C78;background-color:transparent;border-bottom:0}a:hover{color:#FE7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #699B98,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #699B98,3px 5px 0px rgba(0,0,0,0.2)}button{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNmOWY5ZjkiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2UzZTNlMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9),color-stop(70%, #e3e3e3));background:-moz-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:-webkit-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:linear-gradient(#f9f9f9 40%,#e3e3e3 70%);border:1px solid #a9a9a9;text-shadow:1px 1px #fff}button:not(:disabled):hover{border-color:#515151}button:not(:disabled):active{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNlM2UzZTMiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3),color-stop(70%, #f9f9f9));background:-moz-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:-webkit-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:linear-gradient(#e3e3e3 40%,#f9f9f9 70%)}table{width:100%;color:#f8f7f7;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#699B98}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#699B98}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00CED1}slides>slide .slide-wrapper blockquote{position:relative;background-color:#ACE2D2;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187E7}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/theme.light.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#FA5B04;background-color:transparent;border-bottom:0}a:hover{color:#FE7429;background-color:transparent}h1,h2,h3{color:#000;text-shadow:1px 2px 0px #E8EFEE,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #E8EFEE,3px 5px 0px rgba(0,0,0,0.2)}button{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNmOWY5ZjkiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2UzZTNlMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9),color-stop(70%, #e3e3e3));background:-moz-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:-webkit-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:linear-gradient(#f9f9f9 40%,#e3e3e3 70%);border:1px solid #a9a9a9;text-shadow:1px 1px #fff}button:not(:disabled):hover{border-color:#515151}button:not(:disabled):active{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNlM2UzZTMiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3),color-stop(70%, #f9f9f9));background:-moz-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:-webkit-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:linear-gradient(#e3e3e3 40%,#f9f9f9 70%)}table{width:100%;color:#232323;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#232323;letter-spacing:2px;background-color:#E8EFEE}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#E8EFEE}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00CED1}slides>slide .slide-wrapper blockquote{position:relative;background-color:#ACE2D2;border-left:0 none;color:#232323;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#232323;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187E7}\n"
  },
  {
    "path": "ppt/node-generator-koa/css/theme.moon.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#F9D905;background-color:transparent;border-bottom:0}a:hover{color:#F5BE78;background-color:transparent}h1,h2,h3{color:#E8F0F3;text-shadow:1px 2px 0px #152E4F,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #152E4F,3px 5px 0px rgba(0,0,0,0.2)}button{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNmOWY5ZjkiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2UzZTNlMyIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #f9f9f9),color-stop(70%, #e3e3e3));background:-moz-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:-webkit-linear-gradient(#f9f9f9 40%,#e3e3e3 70%);background:linear-gradient(#f9f9f9 40%,#e3e3e3 70%);border:1px solid #a9a9a9;text-shadow:1px 1px #fff}button:not(:disabled):hover{border-color:#515151}button:not(:disabled):active{background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSI0MCUiIHN0b3AtY29sb3I9IiNlM2UzZTMiLz48c3RvcCBvZmZzZXQ9IjcwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(40%, #e3e3e3),color-stop(70%, #f9f9f9));background:-moz-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:-webkit-linear-gradient(#e3e3e3 40%,#f9f9f9 70%);background:linear-gradient(#e3e3e3 40%,#f9f9f9 70%)}table{width:100%;color:black;border-bottom:0 none;-moz-box-shadow:1px 1px 10px #000;-webkit-box-shadow:1px 1px 10px #000;box-shadow:1px 1px 10px #000}table thead th{background-color:#e6e6e6}table tr{background-color:white}table tr:nth-child(even){background-color:#e6e6e6}table td.highlight{color:#468847;background-color:#dff0d8 !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#E8F0F3;letter-spacing:2px;background-color:#152E4F}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#152E4F}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#16D5B5}slides>slide .slide-wrapper blockquote{position:relative;background-color:#0B6C96;border-left:0 none;color:#E5DCDC;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#999;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187E7}\n"
  },
  {
    "path": "ppt/node-generator-koa/index.html",
    "content": "<!--\n    Powered By nodePPT - This is probably the best web presentation tool so far!\n    version: 0.9.8-3\n    site: https://github.com/ksky521/nodePPT\n-->\n<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>node.js+generator+koa.js - By hacke2</title>\n    <link rel=\"stylesheet\" media=\"all\" href=\"./css/nodeppt2.0.css\">\n    <link rel=\"stylesheet\" media=\"only screen and (max-device-width: 480px)\" href=\"./css/phone.css\">\n    <link rel=\"stylesheet\" media=\"print\" href=\"./css/pdf.css\">\n    <link rel=\"stylesheet\" href=\"./js/highlight/styles/monokai_sublime.css\">\n    <link rel=\"stylesheet\" href=\"./css/font-awesome.css\">\n</head>\n<body>\n<div class=\"slides\">\n    <slides id=\"container\">\n        <slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>node.js+generator+koa.js 初级入门</h1>\n<p><small>by 王兴龙</small></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>现存问题</h1>\n\n</hgroup><article>\n\n<ul>\n<li>前后端模板不统一,前端仍然确认后端写的HTML，违背公司<code>快</code> <code>极致</code>原则</li>\n<li>后端php需要套模板，若前后端协商定义JSON协议又会带来沟通的成本</li>\n<li>线上代码与php耦合紧密，调试线上代码需要后端支持,无法正确且快速的响应变化</li>\n<li>某些相同逻辑不能复用，比如输入校验</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<p><img src=\"img/node.jpg\" alt=\"Node.js\"></p>\n<h1>Node.js</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h2>可以让我们</h2>\n\n</hgroup><article>\n\n<ul>\n<li>让前端变为全栈成为可能</li>\n<li>更好的职责分离</li>\n<li>享受高并发带来的快感</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>关键字</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<ul>\n<li>V8虚拟机</li>\n<li>单线程</li>\n<li>异步编程</li>\n<li>事件驱动</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>基于GoogleV8引擎</h1>\n<ul>\n<li>完全支持ES5，部分支持ES6</li>\n<li>极速</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Java &amp; php</h1>\n\n</hgroup><article>\n\n<ul>\n<li>每个请求必须开一个进程</li>\n<li>处理IO时也要开一个进程</li>\n<li>线程切换的开销</li>\n<li>8 GB RAM / 2 MB == 4,000</li>\n<li>并发变成带来的复杂度</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>Node.js是如何做的？</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<ul>\n<li>处理完请求1才能去处理请求2</li>\n<li>类似于排队策略</li>\n<li>高密集CPU运算</li>\n<li>非阻塞IO</li>\n<li>事件轮询</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>模块</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<ul>\n<li>cmd规范</li>\n<li>npm install sm</li>\n<li>国内一般用淘宝的cnpm</li>\n<li>npm.taobao.org</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>安装</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>第一个Node.js服务器</h1>\n<pre><code class=\"javascript\">var http = require(&#39;http&#39;);\nhttp.createServer(function (req, res) {\n    res.writeHead(200, {&#39;Content-Type&#39;: &#39;text/plain&#39;});\n    res.end(&#39;Hello World\\n&#39;);\n}).listen(80);\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>一些常见模块</h1>\n<ul>\n<li>Stream</li>\n<li>fs</li>\n<li>process</li>\n<li>TCP</li>\n<li>Telnet</li>\n<li>net</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>web开发</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<ul>\n<li>http</li>\n<li>connect</li>\n<li>express</li>\n<li><code>koa</code></li>\n<li>webSocket</li>\n<li>mongoDB</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>一个案例</h1>\n<h2>gokk</h2>\n<blockquote>\n<p>github:<a href=\"https://github.com/hacke2/gokk\" target=\"_blank\">https://github.com/hacke2/gokk</a></p>\n</blockquote>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>可怕的软肋--深层回调</h1>\n<pre><code class=\"javascript\">doAsync1(function () {\n    doAsync2(function () {\n        doAsync3(function () {\n              doAsync4(function () {\n                  doAsync5(function () {\n\n                  }\n              }\n        })\n      })\n})\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>解决方案</h1>\n<ul>\n<li>Async</li>\n<li>Promise</li>\n<li><code>Generator</code></li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>Generator</h1>\n<h2>生成器</h2>\n<pre><code class=\"java\">interface Generator {\n  next()\n  throw(e)\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>程序员还是代码最直观</h1>\n\n</hgroup><article>\n\n<pre><code class=\"javascript\">function* helloWorldGenerator() {\n    yield &#39;hello&#39;;\n    yield &#39;world&#39;;\n    return &#39;ending&#39;;\n}\n\nvar hw = helloWorldGenerator();\nhw.next() // { value: &#39;hello&#39;, done: false }\nhw.next() // { value: &#39;world&#39;, done: false }\nhw.next() // { value: &#39;ending&#39;, done: true }\nhw.next() // { value: undefined, done: true }\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>yield返回值</h1>\n<pre><code class=\"javascript\">function* f() {\n  for(var i=0; true; i++) {\n    var reset = yield i;\n    console.log(reset)\n  }\n}\n\nvar g = f();\n\nconsole.log(g.next()); // { value: 0, done: false }\nconsole.log(g.next(2)); // { value: 1, done: false }\nconsole.log(g.next(true)); // { value: 0, done: false }\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>斐波那契数列</h1>\n<pre><code class=\"javascript\">function fibonacci(num) {\n  num = +num;\n  if (num === 1) {\n    return [0];\n  }\n  if (num === 2) {\n    return [0, 1];\n  }\n  if (num &gt; 2) {\n    var arr = fibonacci(num - 1);\n    arr[num - 1] = arr[num - 2] + arr[num - 3];\n    return arr;\n  }\n  return [];\n}\n\nconsole.log(fibonacci(9)); // [0, 1, 1, 2, 3, 5, 8, 13, 21]\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>使用Generator改造</h1>\n<pre><code class=\"javascript\">function* fib(max) {\n    var count = 0, last = 0, current = 1;\n\n    while(count++ &lt; max) {\n        yield current;\n        var tmp = current;\n        current += last;\n        last = tmp;\n    }\n}\n\nfor(var i of fab(9)) {\n  console.log(i) // [0, 1, 1, 2, 3, 5, 8, 13, 21]\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>对异步的控制</h1>\n<pre><code class=\"javascript\">function* main() {\n  var result = yield request(&quot;http://some.url&quot;);\n  var resp = JSON.parse(result);\n    console.log(resp.value);\n}\n\nfunction request(url) {\n  ajax(url, function(response){\n    it.next(response);\n  });\n}\n\nvar it = main();\nit.next();\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>co</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>理解</h1>\n\n</hgroup><article>\n\n<ul>\n<li>官方点就是一个内部状态的遍历器</li>\n<li>通俗点就是一个函数的暂停器</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>koa.js</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>什么是koa.js</h1>\n\n</hgroup><article>\n\n<ul>\n<li>web框架</li>\n<li>和express 共享大部分的底层模块</li>\n<li>通过 generator 提供更优的异步控制和异常处理</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>生产环境</h1>\n\n</hgroup><article>\n\n<ul>\n<li>天猫H5页面首页</li>\n<li>我的支付宝</li>\n<li>天猫首页</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>hello world</h1>\n\n</hgroup><article>\n\n<pre><code class=\"javascript\">var koa = require(&#39;koa&#39;);\n\nvar app = koa();\napp.use(function *() {\n  this.body = &#39;Hello World!&#39;;\n});\n\napp.listen(8888);\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>回形针式的中间件</h1>\n\n</hgroup><article>\n\n<pre><code class=\"javascript\">var koa = require(&#39;koa&#39;);\nvar app = koa();\n\n// x-response-time\n\napp.use(function *(next){\n  var start = new Date;\n  yield next;\n  var ms = new Date - start;\n  this.set(&#39;X-Response-Time&#39;, ms + &#39;ms&#39;);\n});\n\n// logger\n\napp.use(function *(next){\n  var start = new Date;\n  yield next;\n  var ms = new Date - start;\n  console.log(&#39;%s %s - %s&#39;, this.method, this.url, ms);\n});\n\n// response\n\napp.use(function *(){\n  this.body = &#39;Hello World&#39;;\n});\n\napp.listen(3000);\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>我们想做的</h1>\n\n</hgroup><article>\n\n<ul>\n<li>渲染等业务逻辑移交给前端</li>\n<li>php提供restful api，更加注重数据的产出</li>\n</ul>\n<blockquote>\n<p>sm-koa</p>\n</blockquote>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<p><strong>即便可能会失败，但至少是一次探索</strong></p>\n\n</article></section></slide>\n        <slide class=\"slide thank-you-slide segue nobackground\">\n            <article class=\"flexbox vleft auto-fadein\">\n                <h2>Q &amp; A</h2>\n                <h3>&lt;Thank You!&gt;</h3>\n            </article>\n        </slide>\n        <slide class=\"slide logoslide dark nobackground\">\n            <article class=\"flexbox vcenter\">\n              <h2 style=\"color: white;\">Powered By nodePPT v0.9.8-3</h2>\n            </article>\n          </slide>\n        <div class=\"slideTip\" id=\"tip\"></div>\n    </slides>\n</div>\n<canvas id=\"drawBoard\" class=\"draw-board\" width=\"900\" height=\"700\"></canvas>\n<div class=\"progress\"><span id=\"progress\"></span></div>\n<div id=\"_buttons\">\n    <div class=\"_btn-box\" id=\"_btn-box\" style=\"display:none;\">\n        <button class=\"fa fa-arrow-circle-left\" id=\"_btn-prev\"></button>\n        <button class=\"fa fa-arrow-circle-right\" id=\"_btn-next\"></button>\n        <button class=\"fa fa-paint-brush\" id=\"_btn-brush\"></button>\n        <button class=\"fa fa-compress\" id=\"_btn-overview\" data-toggle=\"fa fa-expand\"></button>\n    </div>\n    <button class=\"fa fa-bars\" id=\"_btn-bar\"  data-toggle=\"fa fa-close\"></button>\n</div>\n<script src=\"./js/mixjs/lib/mix.0.3.0.min.js\"></script>\n<script>\nvar base = location.protocol + '//' + location.host;\n\nvar path = location.pathname.split('/').filter(function(v){\n    return !!v;\n});\npath.pop();\npath = path.join('/');\nMixJS.config({\n    baseURL: [ base, path, 'js'].join('/')+'/'\n});\n\n</script>\n<script src=\"./js/mixjs/lib/event/broadcast.js\"></script>\n<script src=\"./js/nodeppt.js\"></script>\n<script>\nSlide.init({\n    containerID: 'container',\n    drawBoardID: 'drawBoard',\n    slideClass: '.slide',\n    buildClass: '.build',\n    progressID: 'progress',\n    transition: 'move',\n    width: 1100,\n    dir: './',\n    \n    //打开下面的注释就开启postMessage方式\n    //访问网址127.0.0.1:8080/ppt/demo#client\n    control:{\n        type: 'postMessage',\n        args:{\n            isControl:  false\n        }\n    },\n    \n    tipID: 'tip'\n});\nMixJS.loadJS('./highlight/hljs-0.8.js',function(){\n    hljs.tabReplace = '  ';\n    hljs.initHighlightingOnLoad();\n});\n</script>\n<script src=\"./js/demo.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/demo.css\">\n</body>\n</html>\n"
  },
  {
    "path": "ppt/node-generator-koa/js/event/broadcast.js",
    "content": "/**\n * 广播事件处理\n * 状态：稳定\n * \n * 目标: 为了尽可能的减少模块之间业务逻辑的耦合度, 而开发了这个eventbus, 主要用于业务逻辑的事件传递\n * 使用规范: 每个js模块尽可能通过事件去通信, 减少模块之间的直接调用和依赖(耦合)\n * 使用示例：\n *     //触发\n *     MixJS.event.broadcast.fire('abc',{abc:1}) \n *     //订阅\n *     MixJS.event.broadcast.on('abc',function(a){\n *         console.log(a);\n *     }, scope);\n    \n * @return {[type]} \n * @author  theowang\n * $Id: broadcast.js 65871 2012-11-05 01:51:42Z theowang $\n */\nMixJS.define('event/broadcast', function($) {\n    var _cache = {};\n    var broadcast = {\n\n        /**\n         * 派发\n         * @param  {[type]} type 事件类型\n         * @param  {[type]} data 回调数据\n         * @return {[type]}      [description]\n         */\n        fire: function(type, data) {\n            var listeners = _cache[type],\n                len = 0;\n            if (!$.isUndefined(listeners)) {\n                var args = [].slice.call(arguments, 0);\n                args = args.length > 2 ? args.splice(2, args.length - 1) : [];\n                args = [data].concat(args);\n\n                len = listeners.length;\n                for (var i = 0; i < len; i++) {\n                    var listener = listeners[i];\n                    if (listener && listener.callback) {\n                        args = args.concat(listener.args);\n                        listener.callback.apply(listener.scope, args);\n                    }\n                }\n            }\n            return this;\n        },\n        /**\n         * 订阅广播事件\n         * @param  {[type]}   types     事件类型，支持,分隔符\n         * @param  {Function} callback 回调函数\n         * @param  {[type]}   scope    回调函数上下文\n         * @return {[type]}            this\n         */\n        on: function(types, callback, scope) {\n            types = types || [];\n            var args = [].slice.call(arguments);\n\n            if ($.isString(types)) {\n                types = types.split(',');\n            }\n            var len = types.length;\n            if (len === 0) {\n                return this;\n            }\n            args = args.length > 3 ? args.splice(3, args.length - 1) : [];\n            for (var i = 0; i < len; i++) {\n                var type = types[i];\n                _cache[type] = _cache[type] || [];\n                _cache[type].push({\n                    callback: callback,\n                    scope: scope,\n                    args: args\n                });\n            }\n            return this;\n        },\n        /**\n         * 退订\n         * @param  {[type]}   type     [description]\n         * @param  {Function} callback 假如传入则移出传入的监控事件，否则移出全部\n         * @return {[type]}            [description]\n         */\n        un: function(type, callback, scope) {\n            var listeners = _cache[type];\n            if (!listeners) {\n                return this;\n            }\n            if (callback) {\n                var len = listeners.length,\n                    tmp = [];\n\n                for (var i = 0; i < len; i++) {\n                    var listener = listeners[i];\n                    if (listener.callback == callback && listener.scope == scope) {} else {\n                        tmp.push(listener);\n                    }\n                }\n                listeners = tmp;\n            } else {\n                listeners.length = 0;\n            }\n            return this;\n        },\n\n\n        removeAll: function() {\n            _cache = {};\n            return this;\n        }\n    };\n    return broadcast;\n});"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/default.css",
    "content": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\npre code {\n  display: block; padding: 0.5em;\n  /*background: #F0F0F0;*/\n}\n\npre code,\npre .ruby .subst,\npre .tag .title,\npre .lisp .title {\n  color: black;\n}\n\npre .string,\npre .title,\npre .constant,\npre .parent,\npre .tag .value,\npre .rules .value,\npre .rules .value .number,\npre .preprocessor,\npre .ruby .symbol,\npre .ruby .symbol .string,\npre .ruby .symbol .keyword,\npre .ruby .symbol .keymethods,\npre .instancevar,\npre .aggregate,\npre .template_tag,\npre .django .variable,\npre .smalltalk .class,\npre .addition,\npre .flow,\npre .stream,\npre .bash .variable,\npre .apache .tag,\npre .apache .cbracket,\npre .tex .command,\npre .tex .special,\npre .erlang_repl .function_or_atom,\npre .markdown .header {\n  color: #800;\n}\n\npre .comment,\npre .annotation,\npre .template_comment,\npre .diff .header,\npre .chunk,\npre .markdown .blockquote {\n  color: #888;\n}\n\npre .number,\npre .date,\npre .regexp,\npre .literal,\npre .smalltalk .symbol,\npre .smalltalk .char,\npre .go .constant,\npre .change,\npre .markdown .bullet,\npre .markdown .link_url {\n  color: #080;\n}\n\npre .label,\npre .javadoc,\npre .ruby .string,\npre .decorator,\npre .filter .argument,\npre .localvars,\npre .array,\npre .attr_selector,\npre .important,\npre .pseudo,\npre .pi,\npre .doctype,\npre .deletion,\npre .envvar,\npre .shebang,\npre .apache .sqbracket,\npre .nginx .built_in,\npre .tex .formula,\npre .erlang_repl .reserved,\npre .input_number,\npre .markdown .link_label {\n  color: #88F\n}\n\npre .keyword,\npre .id,\npre .phpdoc,\npre .title,\npre .built_in,\npre .aggregate,\npre .css .tag,\npre .javadoctag,\npre .phpdoc,\npre .yardoctag,\npre .smalltalk .class,\npre .winutils,\npre .bash .variable,\npre .apache .tag,\npre .go .typename,\npre .tex .command,\npre .markdown .strong {\n  font-weight: bold;\n}\n\npre .markdown .emphasis {\n  font-style: italic;\n}\n\npre .nginx .built_in {\n  font-weight: normal;\n}\n\npre .coffeescript .javascript,\npre .xml .css,\npre .xml .javascript,\npre .xml .vbscript,\npre .tex .formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/highlight.pack.js",
    "content": "var hljs=new function(){function m(p){return p.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\")}function c(r,q,p){return RegExp(q,\"m\"+(r.cI?\"i\":\"\")+(p?\"g\":\"\"))}function j(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName==\"CODE\"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\\s+/))){break}}}function g(t,s){var r=\"\";for(var q=0;q<t.childNodes.length;q++){if(t.childNodes[q].nodeType==3){var p=t.childNodes[q].nodeValue;if(s){p=p.replace(/\\n/g,\"\")}r+=p}else{if(t.childNodes[q].nodeName==\"BR\"){r+=\"\\n\"}else{r+=g(t.childNodes[q])}}}if(/MSIE [678]/.test(navigator.userAgent)){r=r.replace(/\\r/g,\"\\n\")}return r}function a(s){var q=s.className.split(/\\s+/);q=q.concat(s.parentNode.className.split(/\\s+/));for(var p=0;p<q.length;p++){var r=q[p].replace(/^language-/,\"\");if(d[r]||r==\"no-highlight\"){return r}}}function b(p){var q=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName==\"BR\"){t+=1}else{if(s.childNodes[r].nodeType==1){q.push({event:\"start\",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);q.push({event:\"stop\",offset:t,node:s.childNodes[r]})}}}}return t})(p,0);return q}function l(y,z,x){var r=0;var w=\"\";var t=[];function u(){if(y.length&&z.length){if(y[0].offset!=z[0].offset){return(y[0].offset<z[0].offset)?y:z}else{return z[0].event==\"start\"?y:z}}else{return y.length?y:z}}function s(C){var D=\"<\"+C.nodeName.toLowerCase();for(var A=0;A<C.attributes.length;A++){var B=C.attributes[A];D+=\" \"+B.nodeName.toLowerCase();if(B.value!==undefined&&B.value!==false&&B.value!==null){D+='=\"'+m(B.value)+'\"'}}return D+\">\"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event==\"start\"){w+=s(v.node);t.push(v.node)}else{if(v.event==\"stop\"){var p,q=t.length;do{q--;p=t[q];w+=(\"</\"+p.nodeName.toLowerCase()+\">\")}while(p!=v.node);t.splice(q,1);while(q<t.length){w+=s(t[q]);q++}}}}return w+m(x.substr(r))}function i(){function p(w,u,x){if(w.compiled){return}var t;if(!x){w.bR=c(u,w.b?w.b:\"\\\\B|\\\\b\");if(!w.e&&!w.eW){w.e=\"\\\\B|\\\\b\"}if(w.e){w.eR=c(u,w.e)}}if(w.i){w.iR=c(u,w.i)}if(w.r===undefined){w.r=1}if(w.k){w.lR=c(u,w.l||hljs.IR,true);for(var v in w.k){if(!w.k.hasOwnProperty(v)){continue}if(w.k[v] instanceof Object){t=w.k[v]}else{t=w.k;v=\"keyword\"}for(var s in t){if(!t.hasOwnProperty(s)){continue}w.k[s]=[v,t[s]]}}}if(!w.c){w.c=[]}w.compiled=true;for(var r=0;r<w.c.length;r++){if(w.c[r]==\"self\"){w.c[r]=w}p(w.c[r],u,false)}if(w.starts){p(w.starts,u,false)}}for(var q in d){if(!d.hasOwnProperty(q)){continue}p(d[q].dM,d[q],true)}}function e(J,D){if(!i.called){i();i.called=true}function z(r,M){for(var L=0;L<M.c.length;L++){if(M.c[L].bR.test(r)){return M.c[L]}}}function w(L,r){if(C[L].e&&C[L].eR.test(r)){return 1}if(C[L].eW){var M=w(L-1,r);return M?M+1:0}return 0}function x(r,L){return L.i&&L.iR.test(r)}function A(O,N){var M=[];for(var L=0;L<O.c.length;L++){M.push(O.c[L].b)}var r=C.length-1;do{if(C[r].e){M.push(C[r].e)}r--}while(C[r+1].eW);if(O.i){M.push(O.i)}return c(N,\"(\"+M.join(\"|\")+\")\",true)}function s(M,L){var N=C[C.length-1];if(!N.t){N.t=A(N,H)}N.t.lastIndex=L;var r=N.t.exec(M);if(r){return[M.substr(L,r.index-L),r[0],false]}else{return[M.substr(L),\"\",true]}}function p(N,r){var L=H.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(M,O){M=m(M);if(!O.k){return M}var N=\"\";var P=0;O.lR.lastIndex=0;var L=O.lR.exec(M);while(L){N+=M.substr(P,L.index-P);var r=p(O,L);if(r){t+=r[1];N+='<span class=\"'+r[0]+'\">'+L[0]+\"</span>\"}else{N+=L[0]}P=O.lR.lastIndex;L=O.lR.exec(M)}return N+M.substr(P,M.length-P)}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'<span class=\"'+M.cN+'\">':\"\";if(M.rB){q+=L;M.buffer=\"\"}else{if(M.eB){q+=m(r)+L;M.buffer=\"\"}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?\"</span>\":\"\";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?\"</span>\":\"\";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer=\"\";if(P.starts){I(P.starts,\"\")}return R.rE}if(x(L,R)){throw\"Illegal\"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q=\"\";try{var y,v=0;H.dM.buffer=\"\";do{y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw\"Illegal\"}return{r:B,keyword_count:t,value:q}}catch(G){if(G==\"Illegal\"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\\t)+)/gm,function(t,w,v,u){return w.replace(/\\t/g,q)})}if(p){r=r.replace(/\\n/g,\"<br>\")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);var w,r;if(s==\"no-highlight\"){return}if(s){w=e(s,y)}else{w=f(y);s=w.language}var p=b(u);if(p.length){r=document.createElement(\"pre\");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match(\"(\\\\s|^)(language-)?\"+s+\"(\\\\s|$)\")){t=t?(t+\" \"+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName==\"CODE\"&&u.parentNode.tagName==\"PRE\"){r=u.parentNode;var v=document.createElement(\"div\");v.innerHTML=\"<pre><code>\"+w.value+\"</code></pre>\";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName(\"pre\");for(var p=0;p<r.length;p++){var q=j(r[p]);if(q){o(q,hljs.tabReplace)}}}function n(){if(window.addEventListener){window.addEventListener(\"DOMContentLoaded\",k,false);window.addEventListener(\"load\",k,false)}else{if(window.attachEvent){window.attachEvent(\"onload\",k)}else{window.onload=k}}}var d={};this.LANGUAGES=d;this.highlight=e;this.highlightAuto=f;this.fixMarkup=h;this.highlightBlock=o;this.initHighlighting=k;this.initHighlightingOnLoad=n;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|\\\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\.\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE],r:0};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE],r:0};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.bash=function(){var d={\"true\":1,\"false\":1};var c={cN:\"variable\",b:\"\\\\$([a-zA-Z0-9_]+)\\\\b\"};var a={cN:\"variable\",b:\"\\\\$\\\\{(([^}])|(\\\\\\\\}))+\\\\}\",c:[hljs.CNM]};var f={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[hljs.BE,c,a],r:0};var b={cN:\"string\",b:\"'\",e:\"'\",r:0};var e={cN:\"test_condition\",b:\"\",e:\"\",c:[f,b,c,a,hljs.CNM],k:{literal:d},r:0};return{dM:{k:{keyword:{\"if\":1,then:1,\"else\":1,fi:1,\"for\":1,\"break\":1,\"continue\":1,\"while\":1,\"in\":1,\"do\":1,done:1,echo:1,exit:1,\"return\":1,set:1,declare:1},literal:d},c:[{cN:\"shebang\",b:\"(#!\\\\/bin\\\\/bash)|(#!\\\\/bin\\\\/sh)\",r:10},c,a,hljs.HCM,hljs.CNM,f,b,hljs.inherit(e,{b:\"\\\\[ \",e:\" \\\\]\",r:0}),hljs.inherit(e,{b:\"\\\\[\\\\[ \",e:\" \\\\]\\\\]\"})]}}}();hljs.LANGUAGES.erlang=function(){var h=\"[a-z'][a-zA-Z0-9_']*\";var m=\"(\"+h+\":\"+h+\"|\"+h+\")\";var d={keyword:{after:1,and:1,andalso:10,band:1,begin:1,bnot:1,bor:1,bsl:1,bzr:1,bxor:1,\"case\":1,\"catch\":1,cond:1,div:1,end:1,fun:1,let:1,not:1,of:1,orelse:10,query:1,receive:1,rem:1,\"try\":1,when:1,xor:1},literal:{\"false\":1,\"true\":1}};var k={cN:\"comment\",b:\"%\",e:\"$\",r:0};var f={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0};var c={b:\"fun\\\\s+\"+h+\"/\\\\d+\"};var n={b:m+\"\\\\(\",e:\"\\\\)\",rB:true,r:0,c:[{cN:\"function_name\",b:m,r:0},{b:\"\\\\(\",e:\"\\\\)\",eW:true,rE:true,r:0}]};var g={cN:\"tuple\",b:\"{\",e:\"}\",r:0};var a={cN:\"variable\",b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",r:0};var l={cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_]*\",r:0};var i={b:\"#\",e:\"}\",i:\".\",r:0,rB:true,c:[{cN:\"record_name\",b:\"#\"+hljs.UIR,r:0},{b:\"{\",eW:true,r:0}]};var j={k:d,b:\"(fun|receive|if|try|case)\",e:\"end\"};j.c=[k,c,hljs.inherit(hljs.ASM,{cN:\"\"}),j,n,hljs.QSM,f,g,a,l,i];var b=[k,c,j,n,hljs.QSM,f,g,a,l,i];n.c[1].c=b;g.c=b;i.c[1].c=b;var e={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",eW:true,c:b};return{dM:{k:d,i:\"(</|\\\\*=|\\\\+=|-=|/=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+h+\"\\\\(\",e:\";|\\\\.\",rB:true,c:[e,{cN:\"title\",b:h},{k:d,b:\"->\",eW:true,c:b}]},k,{cN:\"pp\",b:\"^-\",e:\"\\\\.\",r:0,eE:true,rB:true,l:\"-\"+hljs.IR,k:{\"-module\":1,\"-record\":1,\"-undef\":1,\"-export\":1,\"-ifdef\":1,\"-ifndef\":1,\"-author\":1,\"-copyright\":1,\"-doc\":1,\"-vsn\":1,\"-import\":1,\"-include\":1,\"-include_lib\":1,\"-compile\":1,\"-define\":1,\"-else\":1,\"-endif\":1,\"-file\":1,\"-behaviour\":1,\"-behavior\":1},c:[e]},f,hljs.QSM,i,a,l,g]}}}();hljs.LANGUAGES.cs={dM:{k:{\"abstract\":1,as:1,base:1,bool:1,\"break\":1,\"byte\":1,\"case\":1,\"catch\":1,\"char\":1,checked:1,\"class\":1,\"const\":1,\"continue\":1,decimal:1,\"default\":1,delegate:1,\"do\":1,\"double\":1,\"else\":1,\"enum\":1,event:1,explicit:1,extern:1,\"false\":1,\"finally\":1,fixed:1,\"float\":1,\"for\":1,foreach:1,\"goto\":1,\"if\":1,implicit:1,\"in\":1,\"int\":1,\"interface\":1,internal:1,is:1,lock:1,\"long\":1,namespace:1,\"new\":1,\"null\":1,object:1,operator:1,out:1,override:1,params:1,\"private\":1,\"protected\":1,\"public\":1,readonly:1,ref:1,\"return\":1,sbyte:1,sealed:1,\"short\":1,sizeof:1,stackalloc:1,\"static\":1,string:1,struct:1,\"switch\":1,\"this\":1,\"throw\":1,\"true\":1,\"try\":1,\"typeof\":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,\"volatile\":1,\"void\":1,\"while\":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,\"var\":1,where:1,yield:1},c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},hljs.CLCM,hljs.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:{\"if\":1,\"else\":1,elif:1,endif:1,define:1,undef:1,warning:1,error:1,line:1,region:1,endregion:1,pragma:1,checksum:1}},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var c=\"[a-zA-Z_][a-zA-Z0-9_]*(\\\\!|\\\\?)?\";var i=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var a={keyword:{and:1,\"false\":1,then:1,defined:1,module:1,\"in\":1,\"return\":1,redo:1,\"if\":1,BEGIN:1,retry:1,end:1,\"for\":1,\"true\":1,self:1,when:1,next:1,until:1,\"do\":1,begin:1,unless:1,END:1,rescue:1,nil:1,\"else\":1,\"break\":1,undef:1,not:1,\"super\":1,\"class\":1,\"case\":1,require:1,yield:1,alias:1,\"while\":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,\"all?\":1,allocate:1,ancestors:1,\"any?\":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,\"autoload?\":1,\"between?\":1,binding:1,binmode:1,\"block_given?\":1,call:1,callcc:1,caller:1,capitalize:1,\"capitalize!\":1,casecmp:1,\"catch\":1,ceil:1,center:1,chomp:1,\"chomp!\":1,chop:1,\"chop!\":1,chr:1,\"class\":1,class_eval:1,\"class_variable_defined?\":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,\"closed?\":1,coerce:1,collect:1,\"collect!\":1,compact:1,\"compact!\":1,concat:1,\"const_defined?\":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,\"default\":1,default_proc:1,\"delete\":1,\"delete!\":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,\"downcase!\":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,\"empty?\":1,entries:1,eof:1,\"eof?\":1,\"eql?\":1,\"equal?\":1,\"eval\":1,exec:1,exit:1,\"exit!\":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,\"flatten!\":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,\"frozen?\":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,\"gsub!\":1,\"has_key?\":1,\"has_value?\":1,hash:1,hex:1,id:1,include:1,\"include?\":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,\"instance_of?\":1,\"instance_variable_defined?\":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,\"integer?\":1,intern:1,invert:1,ioctl:1,\"is_a?\":1,isatty:1,\"iterator?\":1,join:1,\"key?\":1,keys:1,\"kind_of?\":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,\"lstrip!\":1,map:1,\"map!\":1,match:1,max:1,\"member?\":1,merge:1,\"merge!\":1,method:1,\"method_defined?\":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,\"new\":1,next:1,\"next!\":1,\"nil?\":1,nitems:1,\"nonzero?\":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,\"private_method_defined?\":1,private_methods:1,proc:1,protected_instance_methods:1,\"protected_method_defined?\":1,protected_methods:1,public_class_method:1,public_instance_methods:1,\"public_method_defined?\":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,\"reject!\":1,remainder:1,reopen:1,replace:1,require:1,\"respond_to?\":1,reverse:1,\"reverse!\":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,\"rstrip!\":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,\"slice!\":1,sort:1,\"sort!\":1,sort_by:1,split:1,sprintf:1,squeeze:1,\"squeeze!\":1,srand:1,stat:1,step:1,store:1,strip:1,\"strip!\":1,sub:1,\"sub!\":1,succ:1,\"succ!\":1,sum:1,superclass:1,swapcase:1,\"swapcase!\":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,\"tainted?\":1,tell:1,test:1,\"throw\":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,\"tr!\":1,tr_s:1,\"tr_s!\":1,trace_var:1,transpose:1,trap:1,truncate:1,\"tty?\":1,type:1,ungetc:1,uniq:1,\"uniq!\":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,\"upcase!\":1,update:1,upto:1,\"value?\":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,\"zero?\":1,zip:1}};var d={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var k=[{cN:\"comment\",b:\"#\",e:\"$\",c:[d]},{cN:\"comment\",b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[d],r:10},{cN:\"comment\",b:\"^__END__\",e:\"\\\\n$\"}];var e={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:c,k:a};var g=[hljs.BE,e];var f=[{cN:\"string\",b:\"'\",e:\"'\",c:g,r:0},{cN:\"string\",b:'\"',e:'\"',c:g,r:0},{cN:\"string\",b:\"%[qw]?\\\\(\",e:\"\\\\)\",c:g,r:10},{cN:\"string\",b:\"%[qw]?\\\\[\",e:\"\\\\]\",c:g,r:10},{cN:\"string\",b:\"%[qw]?{\",e:\"}\",c:g,r:10},{cN:\"string\",b:\"%[qw]?<\",e:\">\",c:g,r:10},{cN:\"string\",b:\"%[qw]?/\",e:\"/\",c:g,r:10},{cN:\"string\",b:\"%[qw]?%\",e:\"%\",c:g,r:10},{cN:\"string\",b:\"%[qw]?-\",e:\"-\",c:g,r:10},{cN:\"string\",b:\"%[qw]?\\\\|\",e:\"\\\\|\",c:g,r:10}];var h={cN:\"function\",b:\"\\\\bdef\\\\s+\",e:\" |$|;\",l:c,k:a,c:[{cN:\"title\",b:i,l:c,k:a},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:c,k:a}].concat(k)};var j={cN:\"identifier\",b:c,l:c,k:a,r:0};var b=k.concat(f.concat([{cN:\"class\",b:\"\\\\b(class|module)\\\\b\",e:\"$|;\",k:{\"class\":1,module:1},c:[{cN:\"title\",b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\",r:0},{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+hljs.IR+\"::)?\"+hljs.IR}]}].concat(k)},h,{cN:\"constant\",b:\"(::)?([A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:f.concat([j]),r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"number\",b:\"\\\\?\\\\w\"},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},j,{b:\"(\"+hljs.RSR+\")\\\\s*\",c:k.concat([{cN:\"regexp\",b:\"/\",e:\"/[a-z]*\",i:\"\\\\n\",c:[hljs.BE]}]),r:0}]));e.c=b;h.c[1].c=b;return{dM:{l:c,k:a,c:b}}}();hljs.LANGUAGES.rust=function(){var c={cN:\"title\",b:hljs.UIR};var d={cN:\"string\",b:'\"',e:'\"',c:[hljs.BE],r:0};var b={cN:\"number\",b:\"\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)\",r:0};var a={alt:1,any:1,as:1,assert:1,be:1,bind:1,block:1,bool:1,\"break\":1,\"char\":1,check:1,claim:1,\"const\":1,cont:1,dir:1,\"do\":1,\"else\":1,\"enum\":1,\"export\":1,f32:1,f64:1,fail:1,\"false\":1,\"float\":1,fn:10,\"for\":1,i16:1,i32:1,i64:1,i8:1,\"if\":1,iface:10,impl:10,\"import\":1,\"in\":1,\"int\":1,let:1,log:1,mod:1,mutable:1,\"native\":1,note:1,of:1,prove:1,pure:10,resource:1,ret:1,self:1,str:1,syntax:1,\"true\":1,type:1,u16:1,u32:1,u64:1,u8:1,uint:1,unchecked:1,unsafe:1,use:1,vec:1,\"while\":1};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,d,hljs.ASM,b,{cN:\"function\",b:\"fn\",e:\"(\\\\(|<)\",k:{fn:1},c:[c]},{cN:\"preprocessor\",b:\"#\\\\[\",e:\"\\\\]\"},{b:\"type\",e:\"(=|<)\",k:{type:1},c:[c]},{b:\"iface\",e:\"({|<)\",k:{iface:1},c:[c]},{b:\"enum\",e:\"({|<)\",k:{\"enum\":1},c:[c]}]}}}();hljs.LANGUAGES.diff={cI:true,dM:{c:[{cN:\"chunk\",b:\"^\\\\@\\\\@ +\\\\-\\\\d+,\\\\d+ +\\\\+\\\\d+,\\\\d+ +\\\\@\\\\@$\",r:10},{cN:\"chunk\",b:\"^\\\\*\\\\*\\\\* +\\\\d+,\\\\d+ +\\\\*\\\\*\\\\*\\\\*$\",r:10},{cN:\"chunk\",b:\"^\\\\-\\\\-\\\\- +\\\\d+,\\\\d+ +\\\\-\\\\-\\\\-\\\\-$\",r:10},{cN:\"header\",b:\"Index: \",e:\"$\"},{cN:\"header\",b:\"=====\",e:\"=====$\"},{cN:\"header\",b:\"^\\\\-\\\\-\\\\-\",e:\"$\"},{cN:\"header\",b:\"^\\\\*{3} \",e:\"$\"},{cN:\"header\",b:\"^\\\\+\\\\+\\\\+\",e:\"$\"},{cN:\"header\",b:\"\\\\*{5}\",e:\"\\\\*{5}$\"},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}};hljs.LANGUAGES.rib={dM:{k:{keyword:{ArchiveRecord:1,AreaLightSource:1,Atmosphere:1,Attribute:1,AttributeBegin:1,AttributeEnd:1,Basis:1,Begin:1,Blobby:1,Bound:1,Clipping:1,ClippingPlane:1,Color:1,ColorSamples:1,ConcatTransform:1,Cone:1,CoordinateSystem:1,CoordSysTransform:1,CropWindow:1,Curves:1,Cylinder:1,DepthOfField:1,Detail:1,DetailRange:1,Disk:1,Displacement:1,Display:1,End:1,ErrorHandler:1,Exposure:1,Exterior:1,Format:1,FrameAspectRatio:1,FrameBegin:1,FrameEnd:1,GeneralPolygon:1,GeometricApproximation:1,Geometry:1,Hider:1,Hyperboloid:1,Identity:1,Illuminate:1,Imager:1,Interior:1,LightSource:1,MakeCubeFaceEnvironment:1,MakeLatLongEnvironment:1,MakeShadow:1,MakeTexture:1,Matte:1,MotionBegin:1,MotionEnd:1,NuPatch:1,ObjectBegin:1,ObjectEnd:1,ObjectInstance:1,Opacity:1,Option:1,Orientation:1,Paraboloid:1,Patch:1,PatchMesh:1,Perspective:1,PixelFilter:1,PixelSamples:1,PixelVariance:1,Points:1,PointsGeneralPolygons:1,PointsPolygons:1,Polygon:1,Procedural:1,Projection:1,Quantize:1,ReadArchive:1,RelativeDetail:1,ReverseOrientation:1,Rotate:1,Scale:1,ScreenWindow:1,ShadingInterpolation:1,ShadingRate:1,Shutter:1,Sides:1,Skew:1,SolidBegin:1,SolidEnd:1,Sphere:1,SubdivisionMesh:1,Surface:1,TextureCoordinates:1,Torus:1,Transform:1,TransformBegin:1,TransformEnd:1,TransformPoints:1,Translate:1,TrimCurve:1,WorldBegin:1,WorldEnd:1}},i:\"</\",c:[hljs.HCM,hljs.CNM,hljs.ASM,hljs.QSM]}};hljs.LANGUAGES.rsl={dM:{k:{keyword:{\"float\":1,color:1,point:1,normal:1,vector:1,matrix:1,\"while\":1,\"for\":1,\"if\":1,\"do\":1,\"return\":1,\"else\":1,\"break\":1,extern:1,\"continue\":1},built_in:{abs:1,acos:1,ambient:1,area:1,asin:1,atan:1,atmosphere:1,attribute:1,calculatenormal:1,ceil:1,cellnoise:1,clamp:1,comp:1,concat:1,cos:1,degrees:1,depth:1,Deriv:1,diffuse:1,distance:1,Du:1,Dv:1,environment:1,exp:1,faceforward:1,filterstep:1,floor:1,format:1,fresnel:1,incident:1,length:1,lightsource:1,log:1,match:1,max:1,min:1,mod:1,noise:1,normalize:1,ntransform:1,opposite:1,option:1,phong:1,pnoise:1,pow:1,printf:1,ptlined:1,radians:1,random:1,reflect:1,refract:1,renderinfo:1,round:1,setcomp:1,setxcomp:1,setycomp:1,setzcomp:1,shadow:1,sign:1,sin:1,smoothstep:1,specular:1,specularbrdf:1,spline:1,sqrt:1,step:1,tan:1,texture:1,textureinfo:1,trace:1,transform:1,vtransform:1,xcomp:1,ycomp:1,zcomp:1}},i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,hljs.ASM,hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"shader\",b:\"surface |displacement |light |volume |imager \",e:\"\\\\(\",k:{surface:1,displacement:1,light:1,volume:1,imager:1}},{cN:\"shading\",b:\"illuminate|illuminance|gather\",e:\"\\\\(\",k:{illuminate:1,illuminance:1,gather:1}}]}};hljs.LANGUAGES.javascript={dM:{k:{keyword:{\"in\":1,\"if\":1,\"for\":1,\"while\":1,\"finally\":1,\"var\":1,\"new\":1,\"function\":1,\"do\":1,\"return\":1,\"void\":1,\"else\":1,\"break\":1,\"catch\":1,\"instanceof\":1,\"with\":1,\"throw\":1,\"case\":1,\"default\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"typeof\":1,\"delete\":1},literal:{\"true\":1,\"false\":1,\"null\":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:\"(\"+hljs.RSR+\"|case|return|throw)\\\\s*\",k:{\"return\":1,\"throw\":1,\"case\":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:\"regexp\",b:\"/\",e:\"/[gim]*\",c:[{b:\"\\\\\\\\/\"}]}],r:0},{cN:\"function\",b:\"\\\\bfunction\\\\b\",e:\"{\",k:{\"function\":1},c:[{cN:\"title\",b:\"[A-Za-z$_][0-9A-Za-z$_]*\"},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.lua=function(){var b=\"\\\\[=*\\\\[\";var d=\"\\\\]=*\\\\]\";var a={b:b,e:d,c:[\"self\"]};var c=[{cN:\"comment\",b:\"--(?!\"+b+\")\",e:\"$\"},{cN:\"comment\",b:\"--\"+b,e:d,c:[a],r:10}];return{dM:{l:hljs.UIR,k:{keyword:{and:1,\"break\":1,\"do\":1,\"else\":1,elseif:1,end:1,\"false\":1,\"for\":1,\"if\":1,\"in\":1,local:1,nil:1,not:1,or:1,repeat:1,\"return\":1,then:1,\"true\":1,until:1,\"while\":1},built_in:{_G:1,_VERSION:1,assert:1,collectgarbage:1,dofile:1,error:1,getfenv:1,getmetatable:1,ipairs:1,load:1,loadfile:1,loadstring:1,module:1,next:1,pairs:1,pcall:1,print:1,rawequal:1,rawget:1,rawset:1,require:1,select:1,setfenv:1,setmetatable:1,tonumber:1,tostring:1,type:1,unpack:1,xpcall:1,coroutine:1,debug:1,io:1,math:1,os:1,\"package\":1,string:1,table:1}},c:c.concat([{cN:\"function\",b:\"\\\\bfunction\\\\b\",e:\"\\\\)\",k:{\"function\":1},c:[{cN:\"title\",b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"},{cN:\"params\",b:\"\\\\(\",eW:true,c:c}].concat(c)},hljs.CNM,hljs.ASM,hljs.QSM,{cN:\"string\",b:b,e:d,c:[a],r:10}])}}}();hljs.LANGUAGES.xml=function(){var b=\"[A-Za-z0-9\\\\._:-]+\";var a={eW:true,c:[{cN:\"attribute\",b:b,r:0},{b:'=\"',rB:true,e:'\"',c:[{cN:\"value\",b:'\"',eW:true}]},{b:\"='\",rB:true,e:\"'\",c:[{cN:\"value\",b:\"'\",eW:true}]},{b:\"=\",c:[{cN:\"value\",b:\"[^\\\\s/>]+\"}]}]};return{cI:true,dM:{c:[{cN:\"pi\",b:\"<\\\\?\",e:\"\\\\?>\",r:10},{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:{style:1}},c:[a],starts:{cN:\"css\",e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:{script:1}},c:[a],starts:{cN:\"javascript\",e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{cN:\"vbscript\",b:\"<%\",e:\"%>\",sL:\"vbscript\"},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ />]+\"},a]}]}}}();hljs.LANGUAGES.markdown={cI:true,dM:{c:[{cN:\"header\",b:\"^#{1,3}\",e:\"$\"},{cN:\"header\",b:\"^.+?\\\\n[=-]{2,}$\"},{b:\"<\",e:\">\",sL:\"xml\"},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",b:\"[*_].+?[*_]\"},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",b:\"`.+?`\"},{cN:\"code\",b:\"^    \",e:\"$\",r:0},{cN:\"horizontal_rule\",b:\"^-{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\]\\\\(.+?\\\\)\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[.+\\\\]\"},{cN:\"link_url\",b:\"\\\\(\",e:\"\\\\)\",eB:true,eE:true}]}]}};hljs.LANGUAGES.css=function(){var a={cN:\"function\",b:hljs.IR+\"\\\\(\",e:\"\\\\)\",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:\"[=/|']\",c:[hljs.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:{\"font-face\":1,page:1}},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",eE:true,k:{\"import\":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:\"tag\",b:hljs.IR,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[hljs.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:\"hexcolor\",b:\"\\\\#[0-9A-F]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}}}();hljs.LANGUAGES.lisp=function(){var k=\"[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#]*\";var m=\"(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\";var a={cN:\"literal\",b:\"\\\\b(t{1}|nil)\\\\b\"};var f=[{cN:\"number\",b:m},{cN:\"number\",b:\"#b[0-1]+(/[0-1]+)?\"},{cN:\"number\",b:\"#o[0-7]+(/[0-7]+)?\"},{cN:\"number\",b:\"#x[0-9a-f]+(/[0-9a-f]+)?\"},{cN:\"number\",b:\"#c\\\\(\"+m+\" +\"+m,e:\"\\\\)\"}];var b={cN:\"string\",b:'\"',e:'\"',c:[hljs.BE],r:0};var l={cN:\"comment\",b:\";\",e:\"$\"};var c={cN:\"variable\",b:\"\\\\*\",e:\"\\\\*\"};var j={cN:\"keyword\",b:\"[:&]\"+k};var h={b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",a,b].concat(f)};var e={cN:\"quoted\",b:\"['`]\\\\(\",e:\"\\\\)\",c:f.concat([b,c,j,h])};var d={cN:\"quoted\",b:\"\\\\(quote \",e:\"\\\\)\",k:{title:{quote:1}},c:f.concat([b,c,j,h])};var i={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var g={cN:\"body\",eW:true,eE:true};i.c=[{cN:\"title\",b:k},g];g.c=[e,d,i,a].concat(f).concat([b,l,c,j]);return{cI:true,dM:{i:\"[^\\\\s]\",c:f.concat([a,b,l,e,d,i])}}}();hljs.LANGUAGES.profile={dM:{c:[hljs.CNM,{cN:\"builtin\",b:\"{\",e:\"}$\",eB:true,eE:true,c:[hljs.ASM,hljs.QSM],r:0},{cN:\"filename\",b:\"[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}\",e:\":\",eE:true},{cN:\"header\",b:\"(ncalls|tottime|cumtime)\",e:\"$\",k:{ncalls:1,tottime:10,cumtime:10,filename:1},r:10},{cN:\"summary\",b:\"function calls\",e:\"$\",c:[hljs.CNM],r:10},hljs.ASM,hljs.QSM,{cN:\"function\",b:\"\\\\(\",e:\"\\\\)$\",c:[{cN:\"title\",b:hljs.UIR,r:0}],r:0}]}};hljs.LANGUAGES.java={dM:{k:{\"false\":1,\"synchronized\":1,\"int\":1,\"abstract\":1,\"float\":1,\"private\":1,\"char\":1,\"interface\":1,\"boolean\":1,\"static\":1,\"null\":1,\"if\":1,\"const\":1,\"for\":1,\"true\":1,\"while\":1,\"long\":1,\"throw\":1,strictfp:1,\"finally\":1,\"protected\":1,\"extends\":1,\"import\":1,\"native\":1,\"final\":1,\"implements\":1,\"return\":1,\"void\":1,\"enum\":1,\"else\":1,\"break\":1,\"transient\":1,\"new\":1,\"catch\":1,\"instanceof\":1,\"byte\":1,\"super\":1,\"class\":1,\"volatile\":1,\"case\":1,assert:1,\"short\":1,\"package\":1,\"default\":1,\"double\":1,\"public\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"throws\":1},c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:\"class\",b:\"(class |interface )\",e:\"{\",k:{\"class\":1,\"interface\":1},i:\":\",c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:10},{cN:\"title\",b:hljs.UIR}]},hljs.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,\"abstract\":1,global:1,\"private\":1,echo:1,\"interface\":1,as:1,\"static\":1,endswitch:1,array:1,\"null\":1,\"if\":1,endwhile:1,or:1,\"const\":1,\"for\":1,endforeach:1,self:1,\"var\":1,\"while\":1,isset:1,\"public\":1,\"protected\":1,exit:1,foreach:1,\"throw\":1,elseif:1,\"extends\":1,include:1,__FILE__:1,empty:1,require_once:1,\"function\":1,\"do\":1,xor:1,\"return\":1,\"implements\":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,\"else\":1,\"break\":1,print:1,\"eval\":1,\"new\":1,\"catch\":1,__METHOD__:1,\"class\":1,\"case\":1,exception:1,php_user_filter:1,\"default\":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,\"final\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,endfor:1,endif:1,declare:1,unset:1,\"true\":1,\"false\":1,namespace:1,trait:1,\"goto\":1,\"instanceof\":1,__DIR__:1,__NAMESPACE__:1,__halt_compiler:1},c:[hljs.CLCM,hljs.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"}]},{cN:\"comment\",eB:true,b:\"__halt_compiler[^;]+;\",e:\"[\\\\n\\\\r]$\"},hljs.CNM,hljs.BNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:\"string\",b:'b\"',e:'\"',c:[hljs.BE]},{cN:\"string\",b:\"b'\",e:\"'\",c:[hljs.BE]},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[hljs.BE]},{cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"},{cN:\"preprocessor\",b:\"<\\\\?php\",r:10},{cN:\"preprocessor\",b:\"\\\\?>\"}]}};hljs.LANGUAGES.haskell=function(){var a={cN:\"label\",b:\"\\\\b[A-Z][\\\\w']*\",r:0};var b={cN:\"container\",b:\"\\\\(\",e:\"\\\\)\",c:[{cN:\"label\",b:\"\\\\b[A-Z][\\\\w\\\\(\\\\)\\\\.']*\"},{cN:\"title\",b:\"[_a-z][\\\\w']*\"}]};return{dM:{k:{keyword:{let:1,\"in\":1,\"if\":1,then:1,\"else\":1,\"case\":1,of:1,where:1,\"do\":1,module:1,\"import\":1,hiding:1,qualified:1,type:1,data:1,newtype:1,deriving:1,\"class\":1,instance:1,\"null\":1,not:1,as:1}},c:[{cN:\"comment\",b:\"--\",e:\"$\"},{cN:\"comment\",b:\"{-\",e:\"-}\"},{cN:\"string\",b:\"\\\\s+'\",e:\"'\",c:[hljs.BE],r:0},hljs.QSM,{cN:\"import\",b:\"\\\\bimport\",e:\"$\",k:{\"import\":1,qualified:1,as:1,hiding:1},c:[b]},{cN:\"module\",b:\"\\\\bmodule\",e:\"where\",k:{module:1,where:1},c:[b]},{cN:\"class\",b:\"\\\\b(class|instance|data|(new)?type)\",e:\"(where|$)\",k:{\"class\":1,where:1,instance:1,data:1,type:1,newtype:1,deriving:1},c:[a]},hljs.CNM,{cN:\"shebang\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,{cN:\"title\",b:\"^[_a-z][\\\\w']*\"}]}}}();hljs.LANGUAGES[\"1c\"]=function(){var b=\"[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*\";var e={\"возврат\":1,\"дата\":1,\"для\":1,\"если\":1,\"и\":1,\"или\":1,\"иначе\":1,\"иначеесли\":1,\"исключение\":1,\"конецесли\":1,\"конецпопытки\":1,\"конецпроцедуры\":1,\"конецфункции\":1,\"конеццикла\":1,\"константа\":1,\"не\":1,\"перейти\":1,\"перем\":1,\"перечисление\":1,\"по\":1,\"пока\":1,\"попытка\":1,\"прервать\":1,\"продолжить\":1,\"процедура\":1,\"строка\":1,\"тогда\":1,\"фс\":1,\"функция\":1,\"цикл\":1,\"число\":1,\"экспорт\":1};var d={ansitooem:1,oemtoansi:1,\"ввестивидсубконто\":1,\"ввестидату\":1,\"ввестизначение\":1,\"ввестиперечисление\":1,\"ввестипериод\":1,\"ввестиплансчетов\":1,\"ввестистроку\":1,\"ввестичисло\":1,\"вопрос\":1,\"восстановитьзначение\":1,\"врег\":1,\"выбранныйплансчетов\":1,\"вызватьисключение\":1,\"датагод\":1,\"датамесяц\":1,\"датачисло\":1,\"добавитьмесяц\":1,\"завершитьработусистемы\":1,\"заголовоксистемы\":1,\"записьжурналарегистрации\":1,\"запуститьприложение\":1,\"зафиксироватьтранзакцию\":1,\"значениевстроку\":1,\"значениевстрокувнутр\":1,\"значениевфайл\":1,\"значениеизстроки\":1,\"значениеизстрокивнутр\":1,\"значениеизфайла\":1,\"имякомпьютера\":1,\"имяпользователя\":1,\"каталогвременныхфайлов\":1,\"каталогиб\":1,\"каталогпользователя\":1,\"каталогпрограммы\":1,\"кодсимв\":1,\"командасистемы\":1,\"конгода\":1,\"конецпериодаби\":1,\"конецрассчитанногопериодаби\":1,\"конецстандартногоинтервала\":1,\"конквартала\":1,\"конмесяца\":1,\"коннедели\":1,\"лев\":1,\"лог\":1,\"лог10\":1,\"макс\":1,\"максимальноеколичествосубконто\":1,\"мин\":1,\"монопольныйрежим\":1,\"названиеинтерфейса\":1,\"названиенабораправ\":1,\"назначитьвид\":1,\"назначитьсчет\":1,\"найти\":1,\"найтипомеченныенаудаление\":1,\"найтиссылки\":1,\"началопериодаби\":1,\"началостандартногоинтервала\":1,\"начатьтранзакцию\":1,\"начгода\":1,\"начквартала\":1,\"начмесяца\":1,\"начнедели\":1,\"номерднягода\":1,\"номерднянедели\":1,\"номернеделигода\":1,\"нрег\":1,\"обработкаожидания\":1,\"окр\":1,\"описаниеошибки\":1,\"основнойжурналрасчетов\":1,\"основнойплансчетов\":1,\"основнойязык\":1,\"открытьформу\":1,\"открытьформумодально\":1,\"отменитьтранзакцию\":1,\"очиститьокносообщений\":1,\"периодстр\":1,\"полноеимяпользователя\":1,\"получитьвремята\":1,\"получитьдатута\":1,\"получитьдокументта\":1,\"получитьзначенияотбора\":1,\"получитьпозициюта\":1,\"получитьпустоезначение\":1,\"получитьта\":1,\"прав\":1,\"праводоступа\":1,\"предупреждение\":1,\"префиксавтонумерации\":1,\"пустаястрока\":1,\"пустоезначение\":1,\"рабочаядаттьпустоезначение\":1,\"рабочаядата\":1,\"разделительстраниц\":1,\"разделительстрок\":1,\"разм\":1,\"разобратьпозициюдокумента\":1,\"рассчитатьрегистрына\":1,\"рассчитатьрегистрыпо\":1,\"сигнал\":1,\"симв\":1,\"символтабуляции\":1,\"создатьобъект\":1,\"сокрл\":1,\"сокрлп\":1,\"сокрп\":1,\" сообщить\":1,\"состояние\":1,\"сохранитьзначение\":1,\"сред\":1,\"статусвозврата\":1,\"стрдлина\":1,\"стрзаменить\":1,\"стрколичествострок\":1,\"стрполучитьстроку\":1,\" стрчисловхождений\":1,\"сформироватьпозициюдокумента\":1,\"счетпокоду\":1,\"текущаядата\":1,\"текущеевремя\":1,\"типзначения\":1,\"типзначениястр\":1,\"удалитьобъекты\":1,\"установитьтана\":1,\"установитьтапо\":1,\"фиксшаблон\":1,\"формат\":1,\"цел\":1,\"шаблон\":1};var a={cN:\"dquote\",b:'\"\"'};var c={cN:\"string\",b:'\"',e:'\"|$',c:[a],r:0};var f={cN:\"string\",b:\"\\\\|\",e:'\"|$',c:[a]};return{cI:true,dM:{l:b,k:{keyword:e,built_in:d},c:[hljs.CLCM,hljs.NM,c,f,{cN:\"function\",b:\"(процедура|функция)\",e:\"$\",l:b,k:{\"процедура\":1,\"экспорт\":1,\"функция\":1},c:[{cN:\"title\",b:b},{cN:\"tail\",eW:true,c:[{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:b,k:{\"знач\":1},c:[c,f]},{cN:\"export\",b:\"экспорт\",eW:true,l:b,k:{\"экспорт\":1},c:[hljs.CLCM]}]},hljs.CLCM]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"date\",b:\"'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})'\"}]}}}();hljs.LANGUAGES.python=function(){var a=[{cN:\"string\",b:\"(u|b)?r?'''\",e:\"'''\",r:10},{cN:\"string\",b:'(u|b)?r?\"\"\"',e:'\"\"\"',r:10},{cN:\"string\",b:\"(u|r|ur)'\",e:\"'\",c:[hljs.BE],r:10},{cN:\"string\",b:'(u|r|ur)\"',e:'\"',c:[hljs.BE],r:10},{cN:\"string\",b:\"(b|br)'\",e:\"'\",c:[hljs.BE]},{cN:\"string\",b:'(b|br)\"',e:'\"',c:[hljs.BE]}].concat([hljs.ASM,hljs.QSM]);var b={cN:\"title\",b:hljs.UIR};var c={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:a.concat([hljs.CNM])};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,\"in\":1,\"if\":1,from:1,raise:1,\"for\":1,except:1,\"finally\":1,print:1,\"import\":1,pass:1,\"return\":1,exec:1,\"else\":1,\"break\":1,not:1,\"with\":1,\"class\":1,assert:1,yield:1,\"try\":1,\"while\":1,\"continue\":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:\"(</|->|\\\\?)\",c:a.concat([hljs.HCM,{cN:\"function\",b:\"\\\\bdef \",e:\":\",i:\"$\",k:{def:1},c:[b,c],r:10},{cN:\"class\",b:\"\\\\bclass \",e:\":\",i:\"[${]\",k:{\"class\":1},c:[b,c],r:10},hljs.CNM,{cN:\"decorator\",b:\"@\",e:\"$\"}])}}}();hljs.LANGUAGES.smalltalk=function(){var b=\"[a-z][a-zA-Z0-9_]*\";var c={cN:\"char\",b:\"\\\\$.{1}\"};var a={cN:\"symbol\",b:\"#\"+hljs.UIR};return{dM:{k:{self:1,\"super\":1,nil:1,\"true\":1,\"false\":1,thisContext:1},c:[{cN:\"comment\",b:'\"',e:'\"',r:0},hljs.ASM,{cN:\"class\",b:\"\\\\b[A-Z][A-Za-z0-9_]*\",r:0},{cN:\"method\",b:b+\":\"},hljs.CNM,a,c,{cN:\"localvars\",b:\"\\\\|\\\\s*((\"+b+\")\\\\s*)+\\\\|\"},{cN:\"array\",b:\"\\\\#\\\\(\",e:\"\\\\)\",c:[hljs.ASM,c,hljs.CNM,a]}]}}}();hljs.LANGUAGES.tex=function(){var c={cN:\"command\",b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]?\",r:10};var b={cN:\"command\",b:\"\\\\\\\\[^a-zA-Zа-яА-я0-9]\",r:0};var a={cN:\"special\",b:\"[{}\\\\[\\\\]\\\\&#~]\",r:0};return{dM:{c:[{b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",rB:true,c:[c,b,{cN:\"number\",b:\" *=\",e:\"-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",eB:true}],r:10},c,b,a,{cN:\"formula\",b:\"\\\\$\\\\$\",e:\"\\\\$\\\\$\",c:[c,b,a],r:0},{cN:\"formula\",b:\"\\\\$\",e:\"\\\\$\",c:[c,b,a],r:0},{cN:\"comment\",b:\"%\",e:\"$\",r:0}]}}}();hljs.LANGUAGES.actionscript=function(){var c=\"[a-zA-Z_$][a-zA-Z0-9_$]*\";var a=\"([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)\";var d={cN:\"rest_arg\",b:\"[.]{3}\",e:c,r:10};var b={cN:\"title\",b:c};return{dM:{k:{keyword:{as:1,\"break\":1,\"case\":1,\"catch\":1,\"class\":1,\"const\":1,\"continue\":1,\"default\":1,\"delete\":1,\"do\":1,dynamic:5,each:1,\"else\":1,\"extends\":1,\"final\":1,\"finally\":1,\"for\":1,\"function\":1,get:1,\"if\":1,\"implements\":1,\"import\":1,\"in\":1,include:1,\"instanceof\":1,\"interface\":1,internal:1,is:1,namespace:1,\"native\":1,\"new\":1,override:1,\"package\":1,\"private\":1,\"protected\":1,\"public\":1,\"return\":1,set:1,\"static\":1,\"super\":5,\"switch\":1,\"this\":1,\"throw\":1,\"try\":1,\"typeof\":1,use:1,\"var\":1,\"void\":1,\"while\":1,\"with\":1},literal:{\"true\":1,\"false\":1,\"null\":1,\"undefined\":1},reserved:{\"abstract\":0,\"boolean\":0,\"byte\":0,cast:0,\"char\":0,\"debugger\":0,\"double\":0,\"enum\":0,\"export\":0,\"float\":0,\"goto\":0,intrinsic:0,\"long\":0,prototype:0,\"short\":0,\"synchronized\":0,\"throws\":0,to:0,\"transient\":0,type:0,virtual:0,\"volatile\":0}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{cN:\"package\",b:\"package ?\",e:\"{\",k:{\"package\":1},c:[b]},{cN:\"class\",b:\"(class|interface) \",e:\"{\",k:{\"class\":1,\"interface\":1},c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:5},b]},{cN:\"preprocessor\",b:\"(import|include)\\\\b\",e:\";\",k:{\"import\":1,include:1}},{cN:\"function\",b:\"function \",e:\"[{;]\",k:{\"function\":1},c:[b,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,d]},{cN:\"type\",b:\":\",e:a,r:10}]}]}}}();hljs.LANGUAGES.sql={cI:true,dM:{i:\"[^\\\\s]\",c:[{cN:\"operator\",b:\"(begin|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\\\b\",e:\";|$\",k:{keyword:{all:1,partial:1,global:1,month:1,current_timestamp:1,using:1,go:1,revoke:1,smallint:1,indicator:1,\"end-exec\":1,disconnect:1,zone:1,\"with\":1,character:1,assertion:1,to:1,add:1,current_user:1,usage:1,input:1,local:1,alter:1,match:1,collate:1,real:1,then:1,rollback:1,get:1,read:1,timestamp:1,session_user:1,not:1,integer:1,bit:1,unique:1,day:1,minute:1,desc:1,insert:1,execute:1,like:1,ilike:2,level:1,decimal:1,drop:1,\"continue\":1,isolation:1,found:1,where:1,constraints:1,domain:1,right:1,national:1,some:1,module:1,transaction:1,relative:1,second:1,connect:1,escape:1,close:1,system_user:1,\"for\":1,deferred:1,section:1,cast:1,current:1,sqlstate:1,allocate:1,intersect:1,deallocate:1,numeric:1,\"public\":1,preserve:1,full:1,\"goto\":1,initially:1,asc:1,no:1,key:1,output:1,collation:1,group:1,by:1,union:1,session:1,both:1,last:1,language:1,constraint:1,column:1,of:1,space:1,foreign:1,deferrable:1,prior:1,connection:1,unknown:1,action:1,commit:1,view:1,or:1,first:1,into:1,\"float\":1,year:1,primary:1,cascaded:1,except:1,restrict:1,set:1,references:1,names:1,table:1,outer:1,open:1,select:1,size:1,are:1,rows:1,from:1,prepare:1,distinct:1,leading:1,create:1,only:1,next:1,inner:1,authorization:1,schema:1,corresponding:1,option:1,declare:1,precision:1,immediate:1,\"else\":1,timezone_minute:1,external:1,varying:1,translation:1,\"true\":1,\"case\":1,exception:1,join:1,hour:1,\"default\":1,\"double\":1,scroll:1,value:1,cursor:1,descriptor:1,values:1,dec:1,fetch:1,procedure:1,\"delete\":1,and:1,\"false\":1,\"int\":1,is:1,describe:1,\"char\":1,as:1,at:1,\"in\":1,varchar:1,\"null\":1,trailing:1,any:1,absolute:1,current_time:1,end:1,grant:1,privileges:1,when:1,cross:1,check:1,write:1,current_date:1,pad:1,begin:1,temporary:1,exec:1,time:1,update:1,catalog:1,user:1,sql:1,date:1,on:1,identity:1,timezone_hour:1,natural:1,whenever:1,interval:1,work:1,order:1,cascade:1,diagnostics:1,nchar:1,having:1,left:1,call:1,\"do\":1,handler:1,load:1,replace:1,truncate:1,start:1,lock:1,show:1,pragma:1},aggregate:{count:1,sum:1,min:1,max:1,avg:1}},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,{b:\"''\"}],r:0},{cN:\"string\",b:'\"',e:'\"',c:[hljs.BE,{b:'\"\"'}],r:0},{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},hljs.CNM,{b:\"\\\\n\"}]},hljs.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}};hljs.LANGUAGES.vala={dM:{k:{keyword:{\"char\":1,uchar:1,unichar:1,\"int\":1,uint:1,\"long\":1,ulong:1,\"short\":1,ushort:1,int8:1,int16:1,int32:1,int64:1,uint8:1,uint16:1,uint32:1,uint64:1,\"float\":1,\"double\":1,bool:1,struct:1,\"enum\":1,string:1,\"void\":1,weak:5,unowned:5,owned:5,async:5,signal:5,\"static\":1,\"abstract\":1,\"interface\":1,override:1,\"while\":1,\"do\":1,\"for\":1,foreach:1,\"else\":1,\"switch\":1,\"case\":1,\"break\":1,\"default\":1,\"return\":1,\"try\":1,\"catch\":1,\"public\":1,\"private\":1,\"protected\":1,internal:1,using:1,\"new\":1,\"this\":1,get:1,set:1,\"const\":1,stdout:1,stdin:1,stderr:1,\"var\":1,DBus:2,GLib:2,CCode:10,Gee:10,Object:1},literal:{\"false\":1,\"true\":1,\"null\":1}},c:[{cN:\"class\",b:\"(class |interface |delegate |namespace )\",e:\"{\",k:{\"class\":1,\"interface\":1},c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1}},{cN:\"title\",b:hljs.UIR}]},hljs.CLCM,hljs.CBLCLM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',r:5},hljs.ASM,hljs.QSM,hljs.CNM,{cN:\"preprocessor\",b:\"^#\",e:\"$\",r:2},{cN:\"constant\",b:\" [A-Z_]+ \",r:0}]}};hljs.LANGUAGES.ini={cI:true,dM:{i:\"[^\\\\s]\",c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9_\\\\[\\\\]]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:{on:1,off:1,\"true\":1,\"false\":1,yes:1,no:1},c:[hljs.QSM,hljs.NM]}]}]}};hljs.LANGUAGES.axapta={dM:{k:{\"false\":1,\"int\":1,\"abstract\":1,\"private\":1,\"char\":1,\"interface\":1,\"boolean\":1,\"static\":1,\"null\":1,\"if\":1,\"for\":1,\"true\":1,\"while\":1,\"long\":1,\"throw\":1,\"finally\":1,\"protected\":1,\"extends\":1,\"final\":1,\"implements\":1,\"return\":1,\"void\":1,\"enum\":1,\"else\":1,\"break\":1,\"new\":1,\"catch\":1,\"byte\":1,\"super\":1,\"class\":1,\"case\":1,\"short\":1,\"default\":1,\"double\":1,\"public\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,reverse:1,firstfast:1,firstonly:1,forupdate:1,nofetch:1,sum:1,avg:1,minof:1,maxof:1,count:1,order:1,group:1,by:1,asc:1,desc:1,index:1,hint:1,like:1,dispaly:1,edit:1,client:1,server:1,ttsbegin:1,ttscommit:1,str:1,real:1,date:1,container:1,anytype:1,common:1,div:1,mod:1},c:[hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(class |interface )\",e:\"{\",i:\":\",k:{\"class\":1,\"interface\":1},c:[{cN:\"inheritance\",b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:10},{cN:\"title\",b:hljs.UIR}]}]}};hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,\"do\":1,\"return\":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,\"continue\":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,\"for\":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,\"goto\":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,\"int\":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,\"else\":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,\"while\":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,\"delete\":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,\"package\":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,\"if\":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,\"eval\":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var e={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:c,r:10};var b={cN:\"variable\",b:\"\\\\$\\\\d\"};var a={cN:\"variable\",b:\"[\\\\$\\\\%\\\\@\\\\*](\\\\^\\\\w\\\\b|#\\\\w+(\\\\:\\\\:\\\\w+)*|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+(\\\\:\\\\:\\\\w*)*)\"};var h=[hljs.BE,e,b,a];var g={b:\"->\",c:[{b:hljs.IR},{b:\"{\",e:\"}\"}]};var d={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var f=[b,a,hljs.HCM,d,g,{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",c:h,r:5},{cN:\"string\",b:\"qw\\\\s+q\",e:\"q\",c:h,r:5},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE],r:0},{cN:\"string\",b:'\"',e:'\"',c:h,r:0},{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},{cN:\"string\",b:\"{\\\\w+}\",r:0},{cN:\"string\",b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\"+hljs.RSR+\"|split|return|print|reverse|grep)\\\\s*\",k:{split:1,\"return\":1,print:1,reverse:1,grep:1},r:0,c:[hljs.HCM,d,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[hljs.BE],r:0}]},{cN:\"sub\",b:\"\\\\bsub\\\\b\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",k:{sub:1},r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0},{cN:\"pod\",b:\"\\\\=\\\\w\",e:\"\\\\=cut\"}];e.c=f;g.c[1].c=f;return{dM:{k:c,c:f}}}();hljs.LANGUAGES.scala=function(){var a={cN:\"annotation\",b:\"@[A-Za-z]+\"};var b={cN:\"string\",b:'u?r?\"\"\"',e:'\"\"\"',r:10};return{dM:{k:{type:1,yield:1,lazy:1,override:1,def:1,\"with\":1,val:1,\"var\":1,\"false\":1,\"true\":1,sealed:1,\"abstract\":1,\"private\":1,trait:1,object:1,\"null\":1,\"if\":1,\"for\":1,\"while\":1,\"throw\":1,\"finally\":1,\"protected\":1,\"extends\":1,\"import\":1,\"final\":1,\"return\":1,\"else\":1,\"break\":1,\"new\":1,\"catch\":1,\"super\":1,\"class\":1,\"case\":1,\"package\":1,\"default\":1,\"try\":1,\"this\":1,match:1,\"continue\":1,\"throws\":1},c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,b,{cN:\"class\",b:\"((case )?class |object |trait )\",e:\"({|$)\",i:\":\",k:{\"case\":1,\"class\":1,trait:1,object:1},c:[{b:\"(extends|with)\",k:{\"extends\":1,\"with\":1},r:10},{cN:\"title\",b:hljs.UIR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,b,a]}]},hljs.CNM,a]}}}();hljs.LANGUAGES.cmake={cI:true,dM:{k:{add_custom_command:2,add_custom_target:2,add_definitions:2,add_dependencies:2,add_executable:2,add_library:2,add_subdirectory:2,add_test:2,aux_source_directory:2,\"break\":1,build_command:2,cmake_minimum_required:3,cmake_policy:3,configure_file:1,create_test_sourcelist:1,define_property:1,\"else\":1,elseif:1,enable_language:2,enable_testing:2,endforeach:1,endfunction:1,endif:1,endmacro:1,endwhile:1,execute_process:2,\"export\":1,find_file:1,find_library:2,find_package:2,find_path:1,find_program:1,fltk_wrap_ui:2,foreach:1,\"function\":1,get_cmake_property:3,get_directory_property:1,get_filename_component:1,get_property:1,get_source_file_property:1,get_target_property:1,get_test_property:1,\"if\":1,include:1,include_directories:2,include_external_msproject:1,include_regular_expression:2,install:1,link_directories:1,load_cache:1,load_command:1,macro:1,mark_as_advanced:1,message:1,option:1,output_required_files:1,project:1,qt_wrap_cpp:2,qt_wrap_ui:2,remove_definitions:2,\"return\":1,separate_arguments:1,set:1,set_directory_properties:1,set_property:1,set_source_files_properties:1,set_target_properties:1,set_tests_properties:1,site_name:1,source_group:1,string:1,target_link_libraries:2,try_compile:2,try_run:2,unset:1,variable_watch:2,\"while\":1,build_name:1,exec_program:1,export_library_dependencies:1,install_files:1,install_programs:1,install_targets:1,link_libraries:1,make_directory:1,remove:1,subdir_depends:1,subdirs:1,use_mangled_mesa:1,utility_source:1,variable_requires:1,write_file:1},c:[{cN:\"envvar\",b:\"\\\\${\",e:\"}\"},hljs.HCM,hljs.QSM,hljs.NM]}};hljs.LANGUAGES.objectivec=function(){var a={keyword:{\"false\":1,\"int\":1,\"float\":1,\"while\":1,\"private\":1,\"char\":1,\"catch\":1,\"export\":1,sizeof:2,typedef:2,\"const\":1,struct:1,\"for\":1,union:1,unsigned:1,\"long\":1,\"volatile\":2,\"static\":1,\"protected\":1,bool:1,mutable:1,\"if\":1,\"public\":1,\"do\":1,\"return\":1,\"goto\":1,\"void\":2,\"enum\":1,\"else\":1,\"break\":1,extern:1,\"true\":1,\"class\":1,asm:1,\"case\":1,\"short\":1,\"default\":1,\"double\":1,\"throw\":1,register:1,explicit:1,signed:1,typename:1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,wchar_t:1,inline:1,readonly:1,assign:1,property:1,protocol:10,self:1,\"synchronized\":1,end:1,synthesize:50,id:1,optional:1,required:1,implementation:10,nonatomic:1,\"interface\":1,\"super\":1,unichar:1,\"finally\":2,dynamic:2,nil:1},built_in:{YES:5,NO:5,NULL:1,IBOutlet:50,IBAction:50,NSString:50,NSDictionary:50,CGRect:50,CGPoint:50,NSRange:50,release:1,retain:1,autorelease:50,UIButton:50,UILabel:50,UITextView:50,UIWebView:50,MKMapView:50,UISegmentedControl:50,NSObject:50,UITableViewDelegate:50,UITableViewDataSource:50,NSThread:50,UIActivityIndicator:50,UITabbar:50,UIToolBar:50,UIBarButtonItem:50,UIImageView:50,NSAutoreleasePool:50,UITableView:50,BOOL:1,NSInteger:20,CGFloat:20,NSException:50,NSLog:50,NSMutableString:50,NSMutableArray:50,NSMutableDictionary:50,NSURL:50}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.CNM,hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"interface|class|protocol|implementation\",e:\"({|$)\",k:{\"interface\":1,\"class\":1,protocol:5,implementation:5},c:[{cN:\"id\",b:hljs.UIR}]}]}}}();hljs.LANGUAGES.avrasm={cI:true,dM:{k:{keyword:{adc:1,add:1,adiw:1,and:1,andi:1,asr:1,bclr:1,bld:1,brbc:1,brbs:1,brcc:1,brcs:1,\"break\":1,breq:1,brge:1,brhc:1,brhs:1,brid:1,brie:1,brlo:1,brlt:1,brmi:1,brne:1,brpl:1,brsh:1,brtc:1,brts:1,brvc:1,brvs:1,bset:1,bst:1,call:1,cbi:1,cbr:1,clc:1,clh:1,cli:1,cln:1,clr:1,cls:1,clt:1,clv:1,clz:1,com:1,cp:1,cpc:1,cpi:1,cpse:1,dec:1,eicall:1,eijmp:1,elpm:1,eor:1,fmul:1,fmuls:1,fmulsu:1,icall:1,ijmp:1,\"in\":1,inc:1,jmp:1,ld:1,ldd:1,ldi:1,lds:1,lpm:1,lsl:1,lsr:1,mov:1,movw:1,mul:1,muls:1,mulsu:1,neg:1,nop:1,or:1,ori:1,out:1,pop:1,push:1,rcall:1,ret:1,reti:1,rjmp:1,rol:1,ror:1,sbc:1,sbr:1,sbrc:1,sbrs:1,sec:1,seh:1,sbi:1,sbci:1,sbic:1,sbis:1,sbiw:1,sei:1,sen:1,ser:1,ses:1,set:1,sev:1,sez:1,sleep:1,spm:1,st:1,std:1,sts:1,sub:1,subi:1,swap:1,tst:1,wdr:1},built_in:{r0:1,r1:1,r2:1,r3:1,r4:1,r5:1,r6:1,r7:1,r8:1,r9:1,r10:1,r11:1,r12:1,r13:1,r14:1,r15:1,r16:1,r17:1,r18:1,r19:1,r20:1,r21:1,r22:1,r23:1,r24:1,r25:1,r26:1,r27:1,r28:1,r29:1,r30:1,r31:1,x:1,xh:1,xl:1,y:1,yh:1,yl:1,z:1,zh:1,zl:1,ucsr1c:1,udr1:1,ucsr1a:1,ucsr1b:1,ubrr1l:1,ubrr1h:1,ucsr0c:1,ubrr0h:1,tccr3c:1,tccr3a:1,tccr3b:1,tcnt3h:1,tcnt3l:1,ocr3ah:1,ocr3al:1,ocr3bh:1,ocr3bl:1,ocr3ch:1,ocr3cl:1,icr3h:1,icr3l:1,etimsk:1,etifr:1,tccr1c:1,ocr1ch:1,ocr1cl:1,twcr:1,twdr:1,twar:1,twsr:1,twbr:1,osccal:1,xmcra:1,xmcrb:1,eicra:1,spmcsr:1,spmcr:1,portg:1,ddrg:1,ping:1,portf:1,ddrf:1,sreg:1,sph:1,spl:1,xdiv:1,rampz:1,eicrb:1,eimsk:1,gimsk:1,gicr:1,eifr:1,gifr:1,timsk:1,tifr:1,mcucr:1,mcucsr:1,tccr0:1,tcnt0:1,ocr0:1,assr:1,tccr1a:1,tccr1b:1,tcnt1h:1,tcnt1l:1,ocr1ah:1,ocr1al:1,ocr1bh:1,ocr1bl:1,icr1h:1,icr1l:1,tccr2:1,tcnt2:1,ocr2:1,ocdr:1,wdtcr:1,sfior:1,eearh:1,eearl:1,eedr:1,eecr:1,porta:1,ddra:1,pina:1,portb:1,ddrb:1,pinb:1,portc:1,ddrc:1,pinc:1,portd:1,ddrd:1,pind:1,spdr:1,spsr:1,spcr:1,udr0:1,ucsr0a:1,ucsr0b:1,ubrr0l:1,acsr:1,admux:1,adcsr:1,adch:1,adcl:1,porte:1,ddre:1,pine:1,pinf:1}},c:[hljs.CBLCLM,{cN:\"comment\",b:\";\",e:\"$\"},hljs.CNM,hljs.BNM,{cN:\"number\",b:\"\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)\"},hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"label\",b:\"^[A-Za-z0-9_.$]+:\"},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"preprocessor\",b:\"\\\\.[a-zA-Z]+\"},{cN:\"localvars\",b:\"@[0-9]+\"}]}};hljs.LANGUAGES.vhdl={cI:true,dM:{k:{keyword:{abs:1,access:1,after:1,alias:1,all:1,and:1,architecture:2,array:1,assert:1,attribute:1,begin:1,block:1,body:1,buffer:1,bus:1,\"case\":1,component:2,configuration:1,constant:1,disconnect:2,downto:2,\"else\":1,elsif:1,end:1,entity:2,exit:1,file:1,\"for\":1,\"function\":1,generate:2,generic:2,group:1,guarded:2,\"if\":0,impure:2,\"in\":1,inertial:1,inout:1,is:1,label:1,library:1,linkage:1,literal:1,loop:1,map:1,mod:1,nand:1,\"new\":1,next:1,nor:1,not:1,\"null\":1,of:1,on:1,open:1,or:1,others:1,out:1,\"package\":1,port:2,postponed:1,procedure:1,process:1,pure:2,range:1,record:1,register:1,reject:1,\"return\":1,rol:1,ror:1,select:1,severity:1,signal:1,shared:1,sla:1,sli:1,sra:1,srl:1,subtype:2,then:1,to:1,transport:1,type:1,units:1,until:1,use:1,variable:1,wait:1,when:1,\"while\":1,\"with\":1,xnor:1,xor:1},type:{\"boolean\":1,bit:1,character:1,severity_level:2,integer:1,time:1,delay_length:2,natural:1,positive:1,string:1,bit_vector:2,file_open_kind:2,file_open_status:2,std_ulogic:2,std_ulogic_vector:2,std_logic:2,std_logic_vector:2}},i:\"{\",c:[{cN:\"comment\",b:\"--\",e:\"$\"},hljs.QSM,hljs.CNM,{cN:\"literal\",b:\"'(U|X|0|1|Z|W|L|H|-)\",e:\"'\",c:[hljs.BE]}]}};hljs.LANGUAGES.coffeescript=function(){var d={keyword:{\"in\":1,\"if\":1,\"for\":1,\"while\":1,\"finally\":1,\"new\":1,\"do\":1,\"return\":1,\"else\":1,\"break\":1,\"catch\":1,\"instanceof\":1,\"throw\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"typeof\":1,\"delete\":1,\"debugger\":1,\"class\":1,\"extends\":1,\"super\":1,then:1,unless:1,until:1,loop:2,of:2,by:1,when:2,and:1,or:1,is:1,isnt:2,not:1},literal:{\"true\":1,\"false\":1,\"null\":1,\"undefined\":1,yes:1,no:1,on:1,off:1},reserved:{\"case\":1,\"default\":1,\"function\":1,\"var\":1,\"void\":1,\"with\":1,\"const\":1,let:1,\"enum\":1,\"export\":1,\"import\":1,\"native\":1,__hasProp:1,__extends:1,__slice:1,__bind:1,__indexOf:1}};var a=\"[A-Za-z$_][0-9A-Za-z$_]*\";var b={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:d,c:[hljs.CNM,hljs.BNM]};var c={cN:\"string\",b:'\"',e:'\"',r:0,c:[hljs.BE,b]};var h={cN:\"string\",b:'\"\"\"',e:'\"\"\"',c:[hljs.BE,b]};var g={cN:\"comment\",b:\"###\",e:\"###\"};var f={cN:\"regexp\",b:\"///\",e:\"///\",c:[hljs.HCM]};var i={cN:\"function\",b:a+\"\\\\s*=\\\\s*(\\\\(.+\\\\))?\\\\s*[-=]>\",rB:true,c:[{cN:\"title\",b:a},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]};var e={cN:\"javascript\",b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"};return{dM:{k:d,c:[hljs.CNM,hljs.BNM,hljs.ASM,h,c,g,hljs.HCM,f,e,i]}}}();hljs.LANGUAGES.nginx=function(){var c={cN:\"variable\",b:\"\\\\$\\\\d+\"};var b={cN:\"variable\",b:\"\\\\${\",e:\"}\"};var a={cN:\"variable\",b:\"[\\\\$\\\\@]\"+hljs.UIR};return{dM:{c:[hljs.HCM,{b:hljs.UIR,e:\";|{\",rE:true,k:{accept_mutex:1,accept_mutex_delay:1,access_log:1,add_after_body:1,add_before_body:1,add_header:1,addition_types:1,alias:1,allow:1,ancient_browser:1,ancient_browser_value:1,auth_basic:1,auth_basic_user_file:1,autoindex:1,autoindex_exact_size:1,autoindex_localtime:1,\"break\":1,charset:1,charset_map:1,charset_types:1,client_body_buffer_size:1,client_body_in_file_only:1,client_body_in_single_buffer:1,client_body_temp_path:1,client_body_timeout:1,client_header_buffer_size:1,client_header_timeout:1,client_max_body_size:1,connection_pool_size:1,connections:1,create_full_put_path:1,daemon:1,dav_access:1,dav_methods:1,debug_connection:1,debug_points:1,default_type:1,deny:1,directio:1,directio_alignment:1,echo:1,echo_after_body:1,echo_before_body:1,echo_blocking_sleep:1,echo_duplicate:1,echo_end:1,echo_exec:1,echo_flush:1,echo_foreach_split:1,echo_location:1,echo_location_async:1,echo_read_request_body:1,echo_request_body:1,echo_reset_timer:1,echo_sleep:1,echo_subrequest:1,echo_subrequest_async:1,empty_gif:1,env:1,error_log:1,error_page:1,events:1,expires:1,fastcgi_bind:1,fastcgi_buffer_size:1,fastcgi_buffers:1,fastcgi_busy_buffers_size:1,fastcgi_cache:1,fastcgi_cache_key:1,fastcgi_cache_methods:1,fastcgi_cache_min_uses:1,fastcgi_cache_path:1,fastcgi_cache_use_stale:1,fastcgi_cache_valid:1,fastcgi_catch_stderr:1,fastcgi_connect_timeout:1,fastcgi_hide_header:1,fastcgi_ignore_client_abort:1,fastcgi_ignore_headers:1,fastcgi_index:1,fastcgi_intercept_errors:1,fastcgi_max_temp_file_size:1,fastcgi_next_upstream:1,fastcgi_param:1,fastcgi_pass:1,fastcgi_pass_header:1,fastcgi_pass_request_body:1,fastcgi_pass_request_headers:1,fastcgi_read_timeout:1,fastcgi_send_lowat:1,fastcgi_send_timeout:1,fastcgi_split_path_info:1,fastcgi_store:1,fastcgi_store_access:1,fastcgi_temp_file_write_size:1,fastcgi_temp_path:1,fastcgi_upstream_fail_timeout:1,fastcgi_upstream_max_fails:1,flv:1,geo:1,geoip_city:1,geoip_country:1,gzip:1,gzip_buffers:1,gzip_comp_level:1,gzip_disable:1,gzip_hash:1,gzip_http_version:1,gzip_min_length:1,gzip_no_buffer:1,gzip_proxied:1,gzip_static:1,gzip_types:1,gzip_vary:1,gzip_window:1,http:1,\"if\":1,if_modified_since:1,ignore_invalid_headers:1,image_filter:1,image_filter_buffer:1,image_filter_jpeg_quality:1,image_filter_transparency:1,include:1,index:1,internal:1,ip_hash:1,js:1,js_load:1,js_require:1,js_utf8:1,keepalive_requests:1,keepalive_timeout:1,kqueue_changes:1,kqueue_events:1,large_client_header_buffers:1,limit_conn:1,limit_conn_log_level:1,limit_except:1,limit_rate:1,limit_rate_after:1,limit_req:1,limit_req_log_level:1,limit_req_zone:1,limit_zone:1,lingering_time:1,lingering_timeout:1,listen:1,location:1,lock_file:1,log_format:1,log_not_found:1,log_subrequest:1,map:1,map_hash_bucket_size:1,map_hash_max_size:1,master_process:1,memcached_bind:1,memcached_buffer_size:1,memcached_connect_timeout:1,memcached_next_upstream:1,memcached_pass:1,memcached_read_timeout:1,memcached_send_timeout:1,memcached_upstream_fail_timeout:1,memcached_upstream_max_fails:1,merge_slashes:1,min_delete_depth:1,modern_browser:1,modern_browser_value:1,more_clear_headers:1,more_clear_input_headers:1,more_set_headers:1,more_set_input_headers:1,msie_padding:1,msie_refresh:1,multi_accept:1,open_file_cache:1,open_file_cache_errors:1,open_file_cache_events:1,open_file_cache_min_uses:1,open_file_cache_retest:1,open_file_cache_valid:1,open_log_file_cache:1,optimize_server_names:1,output_buffers:1,override_charset:1,perl:1,perl_modules:1,perl_require:1,perl_set:1,pid:1,port_in_redirect:1,post_action:1,postpone_gzipping:1,postpone_output:1,proxy_bind:1,proxy_buffer_size:1,proxy_buffering:1,proxy_buffers:1,proxy_busy_buffers_size:1,proxy_cache:1,proxy_cache_key:1,proxy_cache_methods:1,proxy_cache_min_uses:1,proxy_cache_path:1,proxy_cache_use_stale:1,proxy_cache_valid:1,proxy_connect_timeout:1,proxy_headers_hash_bucket_size:1,proxy_headers_hash_max_size:1,proxy_hide_header:1,proxy_ignore_client_abort:1,proxy_ignore_headers:1,proxy_intercept_errors:1,proxy_max_temp_file_size:1,proxy_method:1,proxy_next_upstream:1,proxy_pass:1,proxy_pass_header:1,proxy_pass_request_body:1,proxy_pass_request_headers:1,proxy_read_timeout:1,proxy_redirect:1,proxy_send_lowat:1,proxy_send_timeout:1,proxy_set_body:1,proxy_set_header:1,proxy_store:1,proxy_store_access:1,proxy_temp_file_write_size:1,proxy_temp_path:1,proxy_upstream_fail_timeout:1,proxy_upstream_max_fails:1,push_authorized_channels_only:1,push_channel_group:1,push_max_channel_id_length:1,push_max_channel_subscribers:1,push_max_message_buffer_length:1,push_max_reserved_memory:1,push_message_buffer_length:1,push_message_timeout:1,push_min_message_buffer_length:1,push_min_message_recipients:1,push_publisher:1,push_store_messages:1,push_subscriber:1,push_subscriber_concurrency:1,random_index:1,read_ahead:1,real_ip_header:1,recursive_error_pages:1,request_pool_size:1,reset_timedout_connection:1,resolver:1,resolver_timeout:1,\"return\":1,rewrite:1,rewrite_log:1,root:1,satisfy:1,satisfy_any:1,send_lowat:1,send_timeout:1,sendfile:1,sendfile_max_chunk:1,server:1,server_name:1,server_name_in_redirect:1,server_names_hash_bucket_size:1,server_names_hash_max_size:1,server_tokens:1,set:1,set_real_ip_from:1,source_charset:1,ssi:1,ssi_ignore_recycled_buffers:1,ssi_min_file_chunk:1,ssi_silent_errors:1,ssi_types:1,ssi_value_length:1,ssl:1,ssl_certificate:1,ssl_certificate_key:1,ssl_ciphers:1,ssl_client_certificate:1,ssl_crl:1,ssl_dhparam:1,ssl_prefer_server_ciphers:1,ssl_protocols:1,ssl_session_cache:1,ssl_session_timeout:1,ssl_verify_client:1,ssl_verify_depth:1,sub_filter:1,sub_filter_once:1,sub_filter_types:1,tcp_nodelay:1,tcp_nopush:1,timer_resolution:1,try_files:1,types:1,types_hash_bucket_size:1,types_hash_max_size:1,underscores_in_headers:1,uninitialized_variable_warn:1,upstream:1,use:1,user:1,userid:1,userid_domain:1,userid_expires:1,userid_mark:1,userid_name:1,userid_p3p:1,userid_path:1,userid_service:1,valid_referers:1,variables_hash_bucket_size:1,variables_hash_max_size:1,worker_connections:1,worker_cpu_affinity:1,worker_priority:1,worker_processes:1,worker_rlimit_core:1,worker_rlimit_nofile:1,worker_rlimit_sigpending:1,working_directory:1,xml_entities:1,xslt_stylesheet:1,xslt_types:1},r:0,c:[hljs.HCM,{b:\"\\\\s\",e:\"[;{]\",rB:true,rE:true,l:\"[a-z/]+\",k:{built_in:{on:1,off:1,yes:1,no:1,\"true\":1,\"false\":1,none:1,blocked:1,debug:1,info:1,notice:1,warn:1,error:1,crit:1,select:1,permanent:1,redirect:1,kqueue:1,rtsig:1,epoll:1,poll:1,\"/dev/poll\":1}},r:0,c:[hljs.HCM,{cN:\"string\",b:'\"',e:'\"',c:[hljs.BE,c,b,a],r:0},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,c,b,a],r:0},{cN:\"string\",b:\"([a-z]+):/\",e:\"[;\\\\s]\",rE:true},{cN:\"regexp\",b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true,c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true,c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"\\\\*(\\\\.[a-z\\\\-]+)+\",c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"([a-z\\\\-]+\\\\.)+\\\\*\",c:[hljs.BE,c,b,a]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\b\"},{cN:\"number\",b:\"\\\\s\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},c,b,a]}]}]}}}();hljs.LANGUAGES.erlang_repl={dM:{k:{special_functions:{spawn:10,spawn_link:10,self:2},reserved:{after:1,and:1,andalso:5,band:1,begin:1,bnot:1,bor:1,bsl:1,bsr:1,bxor:1,\"case\":1,\"catch\":0,cond:1,div:1,end:1,fun:0,\"if\":0,let:1,not:0,of:1,or:1,orelse:5,query:1,receive:0,rem:1,\"try\":0,when:1,xor:1}},c:[{cN:\"input_number\",b:\"^[0-9]+> \",r:10},{cN:\"comment\",b:\"%\",e:\"$\"},{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0},hljs.ASM,hljs.QSM,{cN:\"constant\",b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{cN:\"arrow\",b:\"->\"},{cN:\"ok\",b:\"ok\"},{cN:\"exclamation_mark\",b:\"!\"},{cN:\"function_or_atom\",b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",r:0},{cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_']*\",r:0}]}};hljs.LANGUAGES.django=function(){function c(f,e){return(e==undefined||(!f.cN&&e.cN==\"tag\")||f.cN==\"value\")}function d(j,e){var h={};for(var g in j){if(g!=\"contains\"){h[g]=j[g]}var k=[];for(var f=0;j.c&&f<j.c.length;f++){k.push(d(j.c[f],j))}if(c(j,e)){k=b.concat(k)}if(k.length){h.c=k}}return h}var a={cN:\"filter\",b:\"\\\\|[A-Za-z]+\\\\:?\",eE:true,k:{truncatewords:1,removetags:1,linebreaksbr:1,yesno:1,get_digit:1,timesince:1,random:1,striptags:1,filesizeformat:1,escape:1,linebreaks:1,length_is:1,ljust:1,rjust:1,cut:1,urlize:1,fix_ampersands:1,title:1,floatformat:1,capfirst:1,pprint:1,divisibleby:1,add:1,make_list:1,unordered_list:1,urlencode:1,timeuntil:1,urlizetrunc:1,wordcount:1,stringformat:1,linenumbers:1,slice:1,date:1,dictsort:1,dictsortreversed:1,default_if_none:1,pluralize:1,lower:1,join:1,center:1,\"default\":1,truncatewords_html:1,upper:1,length:1,phone2numeric:1,wordwrap:1,time:1,addslashes:1,slugify:1,first:1},c:[{cN:\"argument\",b:'\"',e:'\"'}]};var b=[{cN:\"template_comment\",b:\"{%\\\\s*comment\\\\s*%}\",e:\"{%\\\\s*endcomment\\\\s*%}\"},{cN:\"template_comment\",b:\"{#\",e:\"#}\"},{cN:\"template_tag\",b:\"{%\",e:\"%}\",k:{comment:1,endcomment:1,load:1,templatetag:1,ifchanged:1,endifchanged:1,\"if\":1,endif:1,firstof:1,\"for\":1,endfor:1,\"in\":1,ifnotequal:1,endifnotequal:1,widthratio:1,\"extends\":1,include:1,spaceless:1,endspaceless:1,regroup:1,by:1,as:1,ifequal:1,endifequal:1,ssi:1,now:1,\"with\":1,cycle:1,url:1,filter:1,endfilter:1,debug:1,block:1,endblock:1,\"else\":1},c:[a]},{cN:\"variable\",b:\"{{\",e:\"}}\",c:[a]}];return{cI:true,dM:d(hljs.LANGUAGES.xml.dM)}}();hljs.LANGUAGES.delphi=function(){var a={and:1,safecall:1,cdecl:1,then:1,string:1,exports:1,library:1,not:1,pascal:1,set:1,virtual:1,file:1,\"in\":1,array:1,label:1,packed:1,\"end.\":1,index:1,\"while\":1,\"const\":1,raise:1,\"for\":1,to:1,implementation:1,\"with\":1,except:1,overload:1,destructor:1,downto:1,\"finally\":1,program:1,exit:1,unit:1,inherited:1,override:1,\"if\":1,type:1,until:1,\"function\":1,\"do\":1,begin:1,repeat:1,\"goto\":1,nil:1,far:1,initialization:1,object:1,\"else\":1,\"var\":1,uses:1,external:1,resourcestring:1,\"interface\":1,end:1,finalization:1,\"class\":1,asm:1,mod:1,\"case\":1,on:1,shr:1,shl:1,of:1,register:1,xorwrite:1,threadvar:1,\"try\":1,record:1,near:1,stored:1,constructor:1,stdcall:1,inline:1,div:1,out:1,or:1,procedure:1};var c={safecall:1,stdcall:1,pascal:1,stored:1,\"const\":1,implementation:1,finalization:1,except:1,to:1,\"finally\":1,program:1,inherited:1,override:1,then:1,exports:1,string:1,read:1,not:1,mod:1,shr:1,\"try\":1,div:1,shl:1,set:1,library:1,message:1,packed:1,index:1,\"for\":1,near:1,overload:1,label:1,downto:1,exit:1,\"public\":1,\"goto\":1,\"interface\":1,asm:1,on:1,of:1,constructor:1,or:1,\"private\":1,array:1,unit:1,raise:1,destructor:1,\"var\":1,type:1,until:1,\"function\":1,\"else\":1,external:1,\"with\":1,\"case\":1,\"default\":1,record:1,\"while\":1,\"protected\":1,property:1,procedure:1,published:1,and:1,cdecl:1,\"do\":1,threadvar:1,file:1,\"in\":1,\"if\":1,end:1,virtual:1,write:1,far:1,out:1,begin:1,repeat:1,nil:1,initialization:1,object:1,uses:1,resourcestring:1,\"class\":1,register:1,xorwrite:1,inline:1,\"static\":1};var f={cN:\"comment\",b:\"{\",e:\"}\",r:0};var e={cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",r:10};var d={cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}],r:0};var b={cN:\"string\",b:\"(#\\\\d+)+\"};var g={cN:\"function\",b:\"(procedure|constructor|destructor|function)\\\\b\",e:\"[:;]\",k:{\"function\":1,constructor:10,destructor:10,procedure:10},c:[{cN:\"title\",b:hljs.IR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:a,c:[d,b]},f,e]};return{cI:true,dM:{k:a,i:'(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',c:[f,e,hljs.CLCM,d,b,hljs.NM,g,{cN:\"class\",b:\"=\\\\bclass\\\\b\",e:\"end;\",k:c,c:[d,b,f,e,hljs.CLCM,g]}]}}}();hljs.LANGUAGES.vbscript={cI:true,dM:{k:{keyword:{call:1,\"class\":1,\"const\":1,dim:1,\"do\":1,loop:1,erase:1,execute:1,executeglobal:1,exit:1,\"for\":1,each:1,next:1,\"function\":1,\"if\":1,then:1,\"else\":1,on:1,error:1,option:1,explicit:1,\"new\":1,\"private\":1,property:1,let:1,get:1,\"public\":1,randomize:1,redim:1,rem:1,select:1,\"case\":1,set:1,stop:1,sub:1,\"while\":1,wend:1,\"with\":1,end:1,to:1,elseif:1,is:1,or:1,xor:1,and:1,not:1,class_initialize:1,class_terminate:1,\"default\":1,preserve:1,\"in\":1,me:1,byval:1,byref:1,step:1,resume:1,\"goto\":1},built_in:{lcase:1,month:1,vartype:1,instrrev:1,ubound:1,setlocale:1,getobject:1,rgb:1,getref:1,string:1,weekdayname:1,rnd:1,dateadd:1,monthname:1,now:1,day:1,minute:1,isarray:1,cbool:1,round:1,formatcurrency:1,conversions:1,csng:1,timevalue:1,second:1,year:1,space:1,abs:1,clng:1,timeserial:1,fixs:1,len:1,asc:1,isempty:1,maths:1,dateserial:1,atn:1,timer:1,isobject:1,filter:1,weekday:1,datevalue:1,ccur:1,isdate:1,instr:1,datediff:1,formatdatetime:1,replace:1,isnull:1,right:1,sgn:1,array:1,snumeric:1,log:1,cdbl:1,hex:1,chr:1,lbound:1,msgbox:1,ucase:1,getlocale:1,cos:1,cdate:1,cbyte:1,rtrim:1,join:1,hour:1,oct:1,typename:1,trim:1,strcomp:1,\"int\":1,createobject:1,loadpicture:1,tan:1,formatnumber:1,mid:1,scriptenginebuildversion:1,scriptengine:1,split:1,scriptengineminorversion:1,cint:1,sin:1,datepart:1,ltrim:1,sqr:1,scriptenginemajorversion:1,time:1,derived:1,\"eval\":1,date:1,formatpercent:1,exp:1,inputbox:1,left:1,ascw:1,chrw:1,regexp:1,server:1,response:1,request:1,cstr:1,err:1},literal:{\"true\":1,\"false\":1,\"null\":1,nothing:1,empty:1}},i:\"//\",c:[{cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[{b:'\"\"'}],r:0},{cN:\"comment\",b:\"'\",e:\"$\"},hljs.CNM]}};hljs.LANGUAGES.mel={dM:{k:{\"int\":1,\"float\":1,string:1,vector:1,matrix:1,\"if\":1,\"else\":1,\"switch\":1,\"case\":1,\"default\":1,\"while\":1,\"do\":1,\"for\":1,\"in\":1,\"break\":1,\"continue\":1,global:1,proc:1,\"return\":1,about:1,abs:1,addAttr:1,addAttributeEditorNodeHelp:1,addDynamic:1,addNewShelfTab:1,addPP:1,addPanelCategory:1,addPrefixToName:1,advanceToNextDrivenKey:1,affectedNet:1,affects:1,aimConstraint:1,air:1,alias:1,aliasAttr:1,align:1,alignCtx:1,alignCurve:1,alignSurface:1,allViewFit:1,ambientLight:1,angle:1,angleBetween:1,animCone:1,animCurveEditor:1,animDisplay:1,animView:1,annotate:1,appendStringArray:1,applicationName:1,applyAttrPreset:1,applyTake:1,arcLenDimContext:1,arcLengthDimension:1,arclen:1,arrayMapper:1,art3dPaintCtx:1,artAttrCtx:1,artAttrPaintVertexCtx:1,artAttrSkinPaintCtx:1,artAttrTool:1,artBuildPaintMenu:1,artFluidAttrCtx:1,artPuttyCtx:1,artSelectCtx:1,artSetPaintCtx:1,artUserPaintCtx:1,assignCommand:1,assignInputDevice:1,assignViewportFactories:1,attachCurve:1,attachDeviceAttr:1,attachSurface:1,attrColorSliderGrp:1,attrCompatibility:1,attrControlGrp:1,attrEnumOptionMenu:1,attrEnumOptionMenuGrp:1,attrFieldGrp:1,attrFieldSliderGrp:1,attrNavigationControlGrp:1,attrPresetEditWin:1,attributeExists:1,attributeInfo:1,attributeMenu:1,attributeQuery:1,autoKeyframe:1,autoPlace:1,bakeClip:1,bakeFluidShading:1,bakePartialHistory:1,bakeResults:1,bakeSimulation:1,basename:1,basenameEx:1,batchRender:1,bessel:1,bevel:1,bevelPlus:1,binMembership:1,bindSkin:1,blend2:1,blendShape:1,blendShapeEditor:1,blendShapePanel:1,blendTwoAttr:1,blindDataType:1,boneLattice:1,boundary:1,boxDollyCtx:1,boxZoomCtx:1,bufferCurve:1,buildBookmarkMenu:1,buildKeyframeMenu:1,button:1,buttonManip:1,CBG:1,cacheFile:1,cacheFileCombine:1,cacheFileMerge:1,cacheFileTrack:1,camera:1,cameraView:1,canCreateManip:1,canvas:1,capitalizeString:1,\"catch\":1,catchQuiet:1,ceil:1,changeSubdivComponentDisplayLevel:1,changeSubdivRegion:1,channelBox:1,character:1,characterMap:1,characterOutlineEditor:1,characterize:1,chdir:1,checkBox:1,checkBoxGrp:1,checkDefaultRenderGlobals:1,choice:1,circle:1,circularFillet:1,clamp:1,clear:1,clearCache:1,clip:1,clipEditor:1,clipEditorCurrentTimeCtx:1,clipSchedule:1,clipSchedulerOutliner:1,clipTrimBefore:1,closeCurve:1,closeSurface:1,cluster:1,cmdFileOutput:1,cmdScrollFieldExecuter:1,cmdScrollFieldReporter:1,cmdShell:1,coarsenSubdivSelectionList:1,collision:1,color:1,colorAtPoint:1,colorEditor:1,colorIndex:1,colorIndexSliderGrp:1,colorSliderButtonGrp:1,colorSliderGrp:1,columnLayout:1,commandEcho:1,commandLine:1,commandPort:1,compactHairSystem:1,componentEditor:1,compositingInterop:1,computePolysetVolume:1,condition:1,cone:1,confirmDialog:1,connectAttr:1,connectControl:1,connectDynamic:1,connectJoint:1,connectionInfo:1,constrain:1,constrainValue:1,constructionHistory:1,container:1,containsMultibyte:1,contextInfo:1,control:1,convertFromOldLayers:1,convertIffToPsd:1,convertLightmap:1,convertSolidTx:1,convertTessellation:1,convertUnit:1,copyArray:1,copyFlexor:1,copyKey:1,copySkinWeights:1,cos:1,cpButton:1,cpCache:1,cpClothSet:1,cpCollision:1,cpConstraint:1,cpConvClothToMesh:1,cpForces:1,cpGetSolverAttr:1,cpPanel:1,cpProperty:1,cpRigidCollisionFilter:1,cpSeam:1,cpSetEdit:1,cpSetSolverAttr:1,cpSolver:1,cpSolverTypes:1,cpTool:1,cpUpdateClothUVs:1,createDisplayLayer:1,createDrawCtx:1,createEditor:1,createLayeredPsdFile:1,createMotionField:1,createNewShelf:1,createNode:1,createRenderLayer:1,createSubdivRegion:1,cross:1,crossProduct:1,ctxAbort:1,ctxCompletion:1,ctxEditMode:1,ctxTraverse:1,currentCtx:1,currentTime:1,currentTimeCtx:1,currentUnit:1,currentUnit:1,curve:1,curveAddPtCtx:1,curveCVCtx:1,curveEPCtx:1,curveEditorCtx:1,curveIntersect:1,curveMoveEPCtx:1,curveOnSurface:1,curveSketchCtx:1,cutKey:1,cycleCheck:1,cylinder:1,dagPose:1,date:1,defaultLightListCheckBox:1,defaultNavigation:1,defineDataServer:1,defineVirtualDevice:1,deformer:1,deg_to_rad:1,\"delete\":1,deleteAttr:1,deleteShadingGroupsAndMaterials:1,deleteShelfTab:1,deleteUI:1,deleteUnusedBrushes:1,delrandstr:1,detachCurve:1,detachDeviceAttr:1,detachSurface:1,deviceEditor:1,devicePanel:1,dgInfo:1,dgdirty:1,dgeval:1,dgtimer:1,dimWhen:1,directKeyCtx:1,directionalLight:1,dirmap:1,dirname:1,disable:1,disconnectAttr:1,disconnectJoint:1,diskCache:1,displacementToPoly:1,displayAffected:1,displayColor:1,displayCull:1,displayLevelOfDetail:1,displayPref:1,displayRGBColor:1,displaySmoothness:1,displayStats:1,displayString:1,displaySurface:1,distanceDimContext:1,distanceDimension:1,doBlur:1,dolly:1,dollyCtx:1,dopeSheetEditor:1,dot:1,dotProduct:1,doubleProfileBirailSurface:1,drag:1,dragAttrContext:1,draggerContext:1,dropoffLocator:1,duplicate:1,duplicateCurve:1,duplicateSurface:1,dynCache:1,dynControl:1,dynExport:1,dynExpression:1,dynGlobals:1,dynPaintEditor:1,dynParticleCtx:1,dynPref:1,dynRelEdPanel:1,dynRelEditor:1,dynamicLoad:1,editAttrLimits:1,editDisplayLayerGlobals:1,editDisplayLayerMembers:1,editRenderLayerAdjustment:1,editRenderLayerGlobals:1,editRenderLayerMembers:1,editor:1,editorTemplate:1,effector:1,emit:1,emitter:1,enableDevice:1,encodeString:1,endString:1,endsWith:1,env:1,equivalent:1,equivalentTol:1,erf:1,error:1,\"eval\":1,\"eval\":1,evalDeferred:1,evalEcho:1,event:1,exactWorldBoundingBox:1,exclusiveLightCheckBox:1,exec:1,executeForEachObject:1,exists:1,exp:1,expression:1,expressionEditorListen:1,extendCurve:1,extendSurface:1,extrude:1,fcheck:1,fclose:1,feof:1,fflush:1,fgetline:1,fgetword:1,file:1,fileBrowserDialog:1,fileDialog:1,fileExtension:1,fileInfo:1,filetest:1,filletCurve:1,filter:1,filterCurve:1,filterExpand:1,filterStudioImport:1,findAllIntersections:1,findAnimCurves:1,findKeyframe:1,findMenuItem:1,findRelatedSkinCluster:1,finder:1,firstParentOf:1,fitBspline:1,flexor:1,floatEq:1,floatField:1,floatFieldGrp:1,floatScrollBar:1,floatSlider:1,floatSlider2:1,floatSliderButtonGrp:1,floatSliderGrp:1,floor:1,flow:1,fluidCacheInfo:1,fluidEmitter:1,fluidVoxelInfo:1,flushUndo:1,fmod:1,fontDialog:1,fopen:1,formLayout:1,format:1,fprint:1,frameLayout:1,fread:1,freeFormFillet:1,frewind:1,fromNativePath:1,fwrite:1,gamma:1,gauss:1,geometryConstraint:1,getApplicationVersionAsFloat:1,getAttr:1,getClassification:1,getDefaultBrush:1,getFileList:1,getFluidAttr:1,getInputDeviceRange:1,getMayaPanelTypes:1,getModifiers:1,getPanel:1,getParticleAttr:1,getPluginResource:1,getenv:1,getpid:1,glRender:1,glRenderEditor:1,globalStitch:1,gmatch:1,goal:1,gotoBindPose:1,grabColor:1,gradientControl:1,gradientControlNoAttr:1,graphDollyCtx:1,graphSelectContext:1,graphTrackCtx:1,gravity:1,grid:1,gridLayout:1,group:1,groupObjectsByName:1,HfAddAttractorToAS:1,HfAssignAS:1,HfBuildEqualMap:1,HfBuildFurFiles:1,HfBuildFurImages:1,HfCancelAFR:1,HfConnectASToHF:1,HfCreateAttractor:1,HfDeleteAS:1,HfEditAS:1,HfPerformCreateAS:1,HfRemoveAttractorFromAS:1,HfSelectAttached:1,HfSelectAttractors:1,HfUnAssignAS:1,hardenPointCurve:1,hardware:1,hardwareRenderPanel:1,headsUpDisplay:1,headsUpMessage:1,help:1,helpLine:1,hermite:1,hide:1,hilite:1,hitTest:1,hotBox:1,hotkey:1,hotkeyCheck:1,hsv_to_rgb:1,hudButton:1,hudSlider:1,hudSliderButton:1,hwReflectionMap:1,hwRender:1,hwRenderLoad:1,hyperGraph:1,hyperPanel:1,hyperShade:1,hypot:1,iconTextButton:1,iconTextCheckBox:1,iconTextRadioButton:1,iconTextRadioCollection:1,iconTextScrollList:1,iconTextStaticLabel:1,ikHandle:1,ikHandleCtx:1,ikHandleDisplayScale:1,ikSolver:1,ikSplineHandleCtx:1,ikSystem:1,ikSystemInfo:1,ikfkDisplayMethod:1,illustratorCurves:1,image:1,imfPlugins:1,inheritTransform:1,insertJoint:1,insertJointCtx:1,insertKeyCtx:1,insertKnotCurve:1,insertKnotSurface:1,instance:1,instanceable:1,instancer:1,intField:1,intFieldGrp:1,intScrollBar:1,intSlider:1,intSliderGrp:1,interToUI:1,internalVar:1,intersect:1,iprEngine:1,isAnimCurve:1,isConnected:1,isDirty:1,isParentOf:1,isSameObject:1,isTrue:1,isValidObjectName:1,isValidString:1,isValidUiName:1,isolateSelect:1,itemFilter:1,itemFilterAttr:1,itemFilterRender:1,itemFilterType:1,joint:1,jointCluster:1,jointCtx:1,jointDisplayScale:1,jointLattice:1,keyTangent:1,keyframe:1,keyframeOutliner:1,keyframeRegionCurrentTimeCtx:1,keyframeRegionDirectKeyCtx:1,keyframeRegionDollyCtx:1,keyframeRegionInsertKeyCtx:1,keyframeRegionMoveKeyCtx:1,keyframeRegionScaleKeyCtx:1,keyframeRegionSelectKeyCtx:1,keyframeRegionSetKeyCtx:1,keyframeRegionTrackCtx:1,keyframeStats:1,lassoContext:1,lattice:1,latticeDeformKeyCtx:1,launch:1,launchImageEditor:1,layerButton:1,layeredShaderPort:1,layeredTexturePort:1,layout:1,layoutDialog:1,lightList:1,lightListEditor:1,lightListPanel:1,lightlink:1,lineIntersection:1,linearPrecision:1,linstep:1,listAnimatable:1,listAttr:1,listCameras:1,listConnections:1,listDeviceAttachments:1,listHistory:1,listInputDeviceAxes:1,listInputDeviceButtons:1,listInputDevices:1,listMenuAnnotation:1,listNodeTypes:1,listPanelCategories:1,listRelatives:1,listSets:1,listTransforms:1,listUnselected:1,listerEditor:1,loadFluid:1,loadNewShelf:1,loadPlugin:1,loadPluginLanguageResources:1,loadPrefObjects:1,localizedPanelLabel:1,lockNode:1,loft:1,log:1,longNameOf:1,lookThru:1,ls:1,lsThroughFilter:1,lsType:1,lsUI:1,Mayatomr:1,mag:1,makeIdentity:1,makeLive:1,makePaintable:1,makeRoll:1,makeSingleSurface:1,makeTubeOn:1,makebot:1,manipMoveContext:1,manipMoveLimitsCtx:1,manipOptions:1,manipRotateContext:1,manipRotateLimitsCtx:1,manipScaleContext:1,manipScaleLimitsCtx:1,marker:1,match:1,max:1,memory:1,menu:1,menuBarLayout:1,menuEditor:1,menuItem:1,menuItemToShelf:1,menuSet:1,menuSetPref:1,messageLine:1,min:1,minimizeApp:1,mirrorJoint:1,modelCurrentTimeCtx:1,modelEditor:1,modelPanel:1,mouse:1,movIn:1,movOut:1,move:1,moveIKtoFK:1,moveKeyCtx:1,moveVertexAlongDirection:1,multiProfileBirailSurface:1,mute:1,nParticle:1,nameCommand:1,nameField:1,namespace:1,namespaceInfo:1,newPanelItems:1,newton:1,nodeCast:1,nodeIconButton:1,nodeOutliner:1,nodePreset:1,nodeType:1,noise:1,nonLinear:1,normalConstraint:1,normalize:1,nurbsBoolean:1,nurbsCopyUVSet:1,nurbsCube:1,nurbsEditUV:1,nurbsPlane:1,nurbsSelect:1,nurbsSquare:1,nurbsToPoly:1,nurbsToPolygonsPref:1,nurbsToSubdiv:1,nurbsToSubdivPref:1,nurbsUVSet:1,nurbsViewDirectionVector:1,objExists:1,objectCenter:1,objectLayer:1,objectType:1,objectTypeUI:1,obsoleteProc:1,oceanNurbsPreviewPlane:1,offsetCurve:1,offsetCurveOnSurface:1,offsetSurface:1,openGLExtension:1,openMayaPref:1,optionMenu:1,optionMenuGrp:1,optionVar:1,orbit:1,orbitCtx:1,orientConstraint:1,outlinerEditor:1,outlinerPanel:1,overrideModifier:1,paintEffectsDisplay:1,pairBlend:1,palettePort:1,paneLayout:1,panel:1,panelConfiguration:1,panelHistory:1,paramDimContext:1,paramDimension:1,paramLocator:1,parent:1,parentConstraint:1,particle:1,particleExists:1,particleInstancer:1,particleRenderInfo:1,partition:1,pasteKey:1,pathAnimation:1,pause:1,pclose:1,percent:1,performanceOptions:1,pfxstrokes:1,pickWalk:1,picture:1,pixelMove:1,planarSrf:1,plane:1,play:1,playbackOptions:1,playblast:1,plugAttr:1,plugNode:1,pluginInfo:1,pluginResourceUtil:1,pointConstraint:1,pointCurveConstraint:1,pointLight:1,pointMatrixMult:1,pointOnCurve:1,pointOnSurface:1,pointPosition:1,poleVectorConstraint:1,polyAppend:1,polyAppendFacetCtx:1,polyAppendVertex:1,polyAutoProjection:1,polyAverageNormal:1,polyAverageVertex:1,polyBevel:1,polyBlendColor:1,polyBlindData:1,polyBoolOp:1,polyBridgeEdge:1,polyCacheMonitor:1,polyCheck:1,polyChipOff:1,polyClipboard:1,polyCloseBorder:1,polyCollapseEdge:1,polyCollapseFacet:1,polyColorBlindData:1,polyColorDel:1,polyColorPerVertex:1,polyColorSet:1,polyCompare:1,polyCone:1,polyCopyUV:1,polyCrease:1,polyCreaseCtx:1,polyCreateFacet:1,polyCreateFacetCtx:1,polyCube:1,polyCut:1,polyCutCtx:1,polyCylinder:1,polyCylindricalProjection:1,polyDelEdge:1,polyDelFacet:1,polyDelVertex:1,polyDuplicateAndConnect:1,polyDuplicateEdge:1,polyEditUV:1,polyEditUVShell:1,polyEvaluate:1,polyExtrudeEdge:1,polyExtrudeFacet:1,polyExtrudeVertex:1,polyFlipEdge:1,polyFlipUV:1,polyForceUV:1,polyGeoSampler:1,polyHelix:1,polyInfo:1,polyInstallAction:1,polyLayoutUV:1,polyListComponentConversion:1,polyMapCut:1,polyMapDel:1,polyMapSew:1,polyMapSewMove:1,polyMergeEdge:1,polyMergeEdgeCtx:1,polyMergeFacet:1,polyMergeFacetCtx:1,polyMergeUV:1,polyMergeVertex:1,polyMirrorFace:1,polyMoveEdge:1,polyMoveFacet:1,polyMoveFacetUV:1,polyMoveUV:1,polyMoveVertex:1,polyNormal:1,polyNormalPerVertex:1,polyNormalizeUV:1,polyOptUvs:1,polyOptions:1,polyOutput:1,polyPipe:1,polyPlanarProjection:1,polyPlane:1,polyPlatonicSolid:1,polyPoke:1,polyPrimitive:1,polyPrism:1,polyProjection:1,polyPyramid:1,polyQuad:1,polyQueryBlindData:1,polyReduce:1,polySelect:1,polySelectConstraint:1,polySelectConstraintMonitor:1,polySelectCtx:1,polySelectEditCtx:1,polySeparate:1,polySetToFaceNormal:1,polySewEdge:1,polyShortestPathCtx:1,polySmooth:1,polySoftEdge:1,polySphere:1,polySphericalProjection:1,polySplit:1,polySplitCtx:1,polySplitEdge:1,polySplitRing:1,polySplitVertex:1,polyStraightenUVBorder:1,polySubdivideEdge:1,polySubdivideFacet:1,polyToSubdiv:1,polyTorus:1,polyTransfer:1,polyTriangulate:1,polyUVSet:1,polyUnite:1,polyWedgeFace:1,popen:1,popupMenu:1,pose:1,pow:1,preloadRefEd:1,print:1,progressBar:1,progressWindow:1,projFileViewer:1,projectCurve:1,projectTangent:1,projectionContext:1,projectionManip:1,promptDialog:1,propModCtx:1,propMove:1,psdChannelOutliner:1,psdEditTextureFile:1,psdExport:1,psdTextureFile:1,putenv:1,pwd:1,python:1,querySubdiv:1,quit:1,rad_to_deg:1,radial:1,radioButton:1,radioButtonGrp:1,radioCollection:1,radioMenuItemCollection:1,rampColorPort:1,rand:1,randomizeFollicles:1,randstate:1,rangeControl:1,readTake:1,rebuildCurve:1,rebuildSurface:1,recordAttr:1,recordDevice:1,redo:1,reference:1,referenceEdit:1,referenceQuery:1,refineSubdivSelectionList:1,refresh:1,refreshAE:1,registerPluginResource:1,rehash:1,reloadImage:1,removeJoint:1,removeMultiInstance:1,removePanelCategory:1,rename:1,renameAttr:1,renameSelectionList:1,renameUI:1,render:1,renderGlobalsNode:1,renderInfo:1,renderLayerButton:1,renderLayerParent:1,renderLayerPostProcess:1,renderLayerUnparent:1,renderManip:1,renderPartition:1,renderQualityNode:1,renderSettings:1,renderThumbnailUpdate:1,renderWindowEditor:1,renderWindowSelectContext:1,renderer:1,reorder:1,reorderDeformers:1,requires:1,reroot:1,resampleFluid:1,resetAE:1,resetPfxToPolyCamera:1,resetTool:1,resolutionNode:1,retarget:1,reverseCurve:1,reverseSurface:1,revolve:1,rgb_to_hsv:1,rigidBody:1,rigidSolver:1,roll:1,rollCtx:1,rootOf:1,rot:1,rotate:1,rotationInterpolation:1,roundConstantRadius:1,rowColumnLayout:1,rowLayout:1,runTimeCommand:1,runup:1,sampleImage:1,saveAllShelves:1,saveAttrPreset:1,saveFluid:1,saveImage:1,saveInitialState:1,saveMenu:1,savePrefObjects:1,savePrefs:1,saveShelf:1,saveToolSettings:1,scale:1,scaleBrushBrightness:1,scaleComponents:1,scaleConstraint:1,scaleKey:1,scaleKeyCtx:1,sceneEditor:1,sceneUIReplacement:1,scmh:1,scriptCtx:1,scriptEditorInfo:1,scriptJob:1,scriptNode:1,scriptTable:1,scriptToShelf:1,scriptedPanel:1,scriptedPanelType:1,scrollField:1,scrollLayout:1,sculpt:1,searchPathArray:1,seed:1,selLoadSettings:1,select:1,selectContext:1,selectCurveCV:1,selectKey:1,selectKeyCtx:1,selectKeyframeRegionCtx:1,selectMode:1,selectPref:1,selectPriority:1,selectType:1,selectedNodes:1,selectionConnection:1,separator:1,setAttr:1,setAttrEnumResource:1,setAttrMapping:1,setAttrNiceNameResource:1,setConstraintRestPosition:1,setDefaultShadingGroup:1,setDrivenKeyframe:1,setDynamic:1,setEditCtx:1,setEditor:1,setFluidAttr:1,setFocus:1,setInfinity:1,setInputDeviceMapping:1,setKeyCtx:1,setKeyPath:1,setKeyframe:1,setKeyframeBlendshapeTargetWts:1,setMenuMode:1,setNodeNiceNameResource:1,setNodeTypeFlag:1,setParent:1,setParticleAttr:1,setPfxToPolyCamera:1,setPluginResource:1,setProject:1,setStampDensity:1,setStartupMessage:1,setState:1,setToolTo:1,setUITemplate:1,setXformManip:1,sets:1,shadingConnection:1,shadingGeometryRelCtx:1,shadingLightRelCtx:1,shadingNetworkCompare:1,shadingNode:1,shapeCompare:1,shelfButton:1,shelfLayout:1,shelfTabLayout:1,shellField:1,shortNameOf:1,showHelp:1,showHidden:1,showManipCtx:1,showSelectionInTitle:1,showShadingGroupAttrEditor:1,showWindow:1,sign:1,simplify:1,sin:1,singleProfileBirailSurface:1,size:1,sizeBytes:1,skinCluster:1,skinPercent:1,smoothCurve:1,smoothTangentSurface:1,smoothstep:1,snap2to2:1,snapKey:1,snapMode:1,snapTogetherCtx:1,snapshot:1,soft:1,softMod:1,softModCtx:1,sort:1,sound:1,soundControl:1,source:1,spaceLocator:1,sphere:1,sphrand:1,spotLight:1,spotLightPreviewPort:1,spreadSheetEditor:1,spring:1,sqrt:1,squareSurface:1,srtContext:1,stackTrace:1,startString:1,startsWith:1,stitchAndExplodeShell:1,stitchSurface:1,stitchSurfacePoints:1,strcmp:1,stringArrayCatenate:1,stringArrayContains:1,stringArrayCount:1,stringArrayInsertAtIndex:1,stringArrayIntersector:1,stringArrayRemove:1,stringArrayRemoveAtIndex:1,stringArrayRemoveDuplicates:1,stringArrayRemoveExact:1,stringArrayToString:1,stringToStringArray:1,strip:1,stripPrefixFromName:1,stroke:1,subdAutoProjection:1,subdCleanTopology:1,subdCollapse:1,subdDuplicateAndConnect:1,subdEditUV:1,subdListComponentConversion:1,subdMapCut:1,subdMapSewMove:1,subdMatchTopology:1,subdMirror:1,subdToBlind:1,subdToPoly:1,subdTransferUVsToCache:1,subdiv:1,subdivCrease:1,subdivDisplaySmoothness:1,substitute:1,substituteAllString:1,substituteGeometry:1,substring:1,surface:1,surfaceSampler:1,surfaceShaderList:1,swatchDisplayPort:1,switchTable:1,symbolButton:1,symbolCheckBox:1,sysFile:1,system:1,tabLayout:1,tan:1,tangentConstraint:1,texLatticeDeformContext:1,texManipContext:1,texMoveContext:1,texMoveUVShellContext:1,texRotateContext:1,texScaleContext:1,texSelectContext:1,texSelectShortestPathCtx:1,texSmudgeUVContext:1,texWinToolCtx:1,text:1,textCurves:1,textField:1,textFieldButtonGrp:1,textFieldGrp:1,textManip:1,textScrollList:1,textToShelf:1,textureDisplacePlane:1,textureHairColor:1,texturePlacementContext:1,textureWindow:1,threadCount:1,threePointArcCtx:1,timeControl:1,timePort:1,timerX:1,toNativePath:1,toggle:1,toggleAxis:1,toggleWindowVisibility:1,tokenize:1,tokenizeList:1,tolerance:1,tolower:1,toolButton:1,toolCollection:1,toolDropped:1,toolHasOptions:1,toolPropertyWindow:1,torus:1,toupper:1,trace:1,track:1,trackCtx:1,transferAttributes:1,transformCompare:1,transformLimits:1,translator:1,trim:1,trunc:1,truncateFluidCache:1,truncateHairCache:1,tumble:1,tumbleCtx:1,turbulence:1,twoPointArcCtx:1,uiRes:1,uiTemplate:1,unassignInputDevice:1,undo:1,undoInfo:1,ungroup:1,uniform:1,unit:1,unloadPlugin:1,untangleUV:1,untitledFileName:1,untrim:1,upAxis:1,updateAE:1,userCtx:1,uvLink:1,uvSnapshot:1,validateShelfName:1,vectorize:1,view2dToolCtx:1,viewCamera:1,viewClipPlane:1,viewFit:1,viewHeadOn:1,viewLookAt:1,viewManip:1,viewPlace:1,viewSet:1,visor:1,volumeAxis:1,vortex:1,waitCursor:1,warning:1,webBrowser:1,webBrowserPrefs:1,whatIs:1,window:1,windowPref:1,wire:1,wireContext:1,workspace:1,wrinkle:1,wrinkleContext:1,writeTake:1,xbmLangPathList:1,xform:1},i:\"</\",c:[hljs.CNM,hljs.ASM,hljs.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},{cN:\"variable\",b:\"\\\\$\\\\d\",r:5},{cN:\"variable\",b:\"[\\\\$\\\\%\\\\@\\\\*](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\"},hljs.CLCM,hljs.CBLCLM]}};hljs.LANGUAGES.dos={cI:true,dM:{k:{flow:{\"if\":1,\"else\":1,\"goto\":1,\"for\":1,\"in\":1,\"do\":1,call:1,exit:1,not:1,exist:1,errorlevel:1,defined:1,equ:1,neq:1,lss:1,leq:1,gtr:1,geq:1},keyword:{shift:1,cd:1,dir:1,echo:1,setlocal:1,endlocal:1,set:1,pause:1,copy:1},stream:{prn:1,nul:1,lpt3:1,lpt2:1,lpt1:1,con:1,com4:1,com3:1,com2:1,com1:1,aux:1},winutils:{ping:1,net:1,ipconfig:1,taskkill:1,xcopy:1,ren:1,del:1}},c:[{cN:\"envvar\",b:\"%%[^ ]\"},{cN:\"envvar\",b:\"%[^ ]+?%\"},{cN:\"envvar\",b:\"![^ ]+?!\"},{cN:\"number\",b:\"\\\\b\\\\d+\",r:0},{cN:\"comment\",b:\"@?rem\",e:\"$\"}]}};hljs.LANGUAGES.apache=function(){var a={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,dM:{k:{keyword:{acceptfilter:1,acceptmutex:1,acceptpathinfo:1,accessfilename:1,action:1,addalt:1,addaltbyencoding:1,addaltbytype:1,addcharset:1,adddefaultcharset:1,adddescription:1,addencoding:1,addhandler:1,addicon:1,addiconbyencoding:1,addiconbytype:1,addinputfilter:1,addlanguage:1,addmoduleinfo:1,addoutputfilter:1,addoutputfilterbytype:1,addtype:1,alias:1,aliasmatch:1,allow:1,allowconnect:1,allowencodedslashes:1,allowoverride:1,anonymous:1,anonymous_logemail:1,anonymous_mustgiveemail:1,anonymous_nouserid:1,anonymous_verifyemail:1,authbasicauthoritative:1,authbasicprovider:1,authdbduserpwquery:1,authdbduserrealmquery:1,authdbmgroupfile:1,authdbmtype:1,authdbmuserfile:1,authdefaultauthoritative:1,authdigestalgorithm:1,authdigestdomain:1,authdigestnccheck:1,authdigestnonceformat:1,authdigestnoncelifetime:1,authdigestprovider:1,authdigestqop:1,authdigestshmemsize:1,authgroupfile:1,authldapbinddn:1,authldapbindpassword:1,authldapcharsetconfig:1,authldapcomparednonserver:1,authldapdereferencealiases:1,authldapgroupattribute:1,authldapgroupattributeisdn:1,authldapremoteuserattribute:1,authldapremoteuserisdn:1,authldapurl:1,authname:1,authnprovideralias:1,authtype:1,authuserfile:1,authzdbmauthoritative:1,authzdbmtype:1,authzdefaultauthoritative:1,authzgroupfileauthoritative:1,authzldapauthoritative:1,authzownerauthoritative:1,authzuserauthoritative:1,balancermember:1,browsermatch:1,browsermatchnocase:1,bufferedlogs:1,cachedefaultexpire:1,cachedirlength:1,cachedirlevels:1,cachedisable:1,cacheenable:1,cachefile:1,cacheignorecachecontrol:1,cacheignoreheaders:1,cacheignorenolastmod:1,cacheignorequerystring:1,cachelastmodifiedfactor:1,cachemaxexpire:1,cachemaxfilesize:1,cacheminfilesize:1,cachenegotiateddocs:1,cacheroot:1,cachestorenostore:1,cachestoreprivate:1,cgimapextension:1,charsetdefault:1,charsetoptions:1,charsetsourceenc:1,checkcaseonly:1,checkspelling:1,chrootdir:1,contentdigest:1,cookiedomain:1,cookieexpires:1,cookielog:1,cookiename:1,cookiestyle:1,cookietracking:1,coredumpdirectory:1,customlog:1,dav:1,davdepthinfinity:1,davgenericlockdb:1,davlockdb:1,davmintimeout:1,dbdexptime:1,dbdkeep:1,dbdmax:1,dbdmin:1,dbdparams:1,dbdpersist:1,dbdpreparesql:1,dbdriver:1,defaulticon:1,defaultlanguage:1,defaulttype:1,deflatebuffersize:1,deflatecompressionlevel:1,deflatefilternote:1,deflatememlevel:1,deflatewindowsize:1,deny:1,directoryindex:1,directorymatch:1,directoryslash:1,documentroot:1,dumpioinput:1,dumpiologlevel:1,dumpiooutput:1,enableexceptionhook:1,enablemmap:1,enablesendfile:1,errordocument:1,errorlog:1,example:1,expiresactive:1,expiresbytype:1,expiresdefault:1,extendedstatus:1,extfilterdefine:1,extfilteroptions:1,fileetag:1,filterchain:1,filterdeclare:1,filterprotocol:1,filterprovider:1,filtertrace:1,forcelanguagepriority:1,forcetype:1,forensiclog:1,gracefulshutdowntimeout:1,group:1,header:1,headername:1,hostnamelookups:1,identitycheck:1,identitychecktimeout:1,imapbase:1,imapdefault:1,imapmenu:1,include:1,indexheadinsert:1,indexignore:1,indexoptions:1,indexorderdefault:1,indexstylesheet:1,isapiappendlogtoerrors:1,isapiappendlogtoquery:1,isapicachefile:1,isapifakeasync:1,isapilognotsupported:1,isapireadaheadbuffer:1,keepalive:1,keepalivetimeout:1,languagepriority:1,ldapcacheentries:1,ldapcachettl:1,ldapconnectiontimeout:1,ldapopcacheentries:1,ldapopcachettl:1,ldapsharedcachefile:1,ldapsharedcachesize:1,ldaptrustedclientcert:1,ldaptrustedglobalcert:1,ldaptrustedmode:1,ldapverifyservercert:1,limitinternalrecursion:1,limitrequestbody:1,limitrequestfields:1,limitrequestfieldsize:1,limitrequestline:1,limitxmlrequestbody:1,listen:1,listenbacklog:1,loadfile:1,loadmodule:1,lockfile:1,logformat:1,loglevel:1,maxclients:1,maxkeepaliverequests:1,maxmemfree:1,maxrequestsperchild:1,maxrequestsperthread:1,maxspareservers:1,maxsparethreads:1,maxthreads:1,mcachemaxobjectcount:1,mcachemaxobjectsize:1,mcachemaxstreamingbuffer:1,mcacheminobjectsize:1,mcacheremovalalgorithm:1,mcachesize:1,metadir:1,metafiles:1,metasuffix:1,mimemagicfile:1,minspareservers:1,minsparethreads:1,mmapfile:1,mod_gzip_on:1,mod_gzip_add_header_count:1,mod_gzip_keep_workfiles:1,mod_gzip_dechunk:1,mod_gzip_min_http:1,mod_gzip_minimum_file_size:1,mod_gzip_maximum_file_size:1,mod_gzip_maximum_inmem_size:1,mod_gzip_temp_dir:1,mod_gzip_item_include:1,mod_gzip_item_exclude:1,mod_gzip_command_version:1,mod_gzip_can_negotiate:1,mod_gzip_handle_methods:1,mod_gzip_static_suffix:1,mod_gzip_send_vary:1,mod_gzip_update_static:1,modmimeusepathinfo:1,multiviewsmatch:1,namevirtualhost:1,noproxy:1,nwssltrustedcerts:1,nwsslupgradeable:1,options:1,order:1,passenv:1,pidfile:1,protocolecho:1,proxybadheader:1,proxyblock:1,proxydomain:1,proxyerroroverride:1,proxyftpdircharset:1,proxyiobuffersize:1,proxymaxforwards:1,proxypass:1,proxypassinterpolateenv:1,proxypassmatch:1,proxypassreverse:1,proxypassreversecookiedomain:1,proxypassreversecookiepath:1,proxypreservehost:1,proxyreceivebuffersize:1,proxyremote:1,proxyremotematch:1,proxyrequests:1,proxyset:1,proxystatus:1,proxytimeout:1,proxyvia:1,readmename:1,receivebuffersize:1,redirect:1,redirectmatch:1,redirectpermanent:1,redirecttemp:1,removecharset:1,removeencoding:1,removehandler:1,removeinputfilter:1,removelanguage:1,removeoutputfilter:1,removetype:1,requestheader:1,require:2,rewritebase:1,rewritecond:10,rewriteengine:1,rewritelock:1,rewritelog:1,rewriteloglevel:1,rewritemap:1,rewriteoptions:1,rewriterule:10,rlimitcpu:1,rlimitmem:1,rlimitnproc:1,satisfy:1,scoreboardfile:1,script:1,scriptalias:1,scriptaliasmatch:1,scriptinterpretersource:1,scriptlog:1,scriptlogbuffer:1,scriptloglength:1,scriptsock:1,securelisten:1,seerequesttail:1,sendbuffersize:1,serveradmin:1,serveralias:1,serverlimit:1,servername:1,serverpath:1,serverroot:1,serversignature:1,servertokens:1,setenv:1,setenvif:1,setenvifnocase:1,sethandler:1,setinputfilter:1,setoutputfilter:1,ssienableaccess:1,ssiendtag:1,ssierrormsg:1,ssistarttag:1,ssitimeformat:1,ssiundefinedecho:1,sslcacertificatefile:1,sslcacertificatepath:1,sslcadnrequestfile:1,sslcadnrequestpath:1,sslcarevocationfile:1,sslcarevocationpath:1,sslcertificatechainfile:1,sslcertificatefile:1,sslcertificatekeyfile:1,sslciphersuite:1,sslcryptodevice:1,sslengine:1,sslhonorciperorder:1,sslmutex:1,ssloptions:1,sslpassphrasedialog:1,sslprotocol:1,sslproxycacertificatefile:1,sslproxycacertificatepath:1,sslproxycarevocationfile:1,sslproxycarevocationpath:1,sslproxyciphersuite:1,sslproxyengine:1,sslproxymachinecertificatefile:1,sslproxymachinecertificatepath:1,sslproxyprotocol:1,sslproxyverify:1,sslproxyverifydepth:1,sslrandomseed:1,sslrequire:1,sslrequiressl:1,sslsessioncache:1,sslsessioncachetimeout:1,sslusername:1,sslverifyclient:1,sslverifydepth:1,startservers:1,startthreads:1,substitute:1,suexecusergroup:1,threadlimit:1,threadsperchild:1,threadstacksize:1,timeout:1,traceenable:1,transferlog:1,typesconfig:1,unsetenv:1,usecanonicalname:1,usecanonicalphysicalport:1,user:1,userdir:1,virtualdocumentroot:1,virtualdocumentrootip:1,virtualscriptalias:1,virtualscriptaliasip:1,win32disableacceptex:1,xbithack:1},literal:{on:1,off:1}},c:[hljs.HCM,{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",a]},a,{cN:\"tag\",b:\"</?\",e:\">\"},hljs.QSM]}}}();hljs.LANGUAGES.cpp=function(){var a={keyword:{\"false\":1,\"int\":1,\"float\":1,\"while\":1,\"private\":1,\"char\":1,\"catch\":1,\"export\":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,\"const\":1,struct:1,\"for\":1,static_cast:2,union:1,namespace:1,unsigned:1,\"long\":1,\"throw\":1,\"volatile\":2,\"static\":1,\"protected\":1,bool:1,template:1,mutable:1,\"if\":1,\"public\":1,friend:2,\"do\":1,\"return\":1,\"goto\":1,auto:1,\"void\":2,\"enum\":1,\"else\":1,\"break\":1,\"new\":1,extern:1,using:1,\"true\":1,\"class\":1,asm:1,\"case\":1,typeid:1,\"short\":1,reinterpret_cast:2,\"default\":1,\"double\":1,register:1,explicit:1,signed:1,typename:1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,wchar_t:1,inline:1,\"delete\":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1,restrict:1,_Bool:1,complex:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:a,r:10,c:[\"self\"]}]}}}();hljs.LANGUAGES.matlab={dM:{k:{keyword:{\"break\":1,\"case\":1,\"catch\":1,classdef:1,\"continue\":1,\"else\":1,elseif:1,end:1,enumerated:1,events:1,\"for\":1,\"function\":1,global:1,\"if\":1,methods:1,otherwise:1,parfor:1,persistent:1,properties:1,\"return\":1,spmd:1,\"switch\":1,\"try\":1,\"while\":1},built_in:{sin:1,sind:1,sinh:1,asin:1,asind:1,asinh:1,cos:1,cosd:1,cosh:1,acos:1,acosd:1,acosh:1,tan:1,tand:1,tanh:1,atan:1,atand:1,atan2:1,atanh:1,sec:1,secd:1,sech:1,asec:1,asecd:1,asech:1,csc:1,cscd:1,csch:1,acsc:1,acscd:1,acsch:1,cot:1,cotd:1,coth:1,acot:1,acotd:1,acoth:1,hypot:1,exp:1,expm1:1,log:1,log1p:1,log10:1,log2:1,pow2:1,realpow:1,reallog:1,realsqrt:1,sqrt:1,nthroot:1,nextpow2:1,abs:1,angle:1,complex:1,conj:1,imag:1,real:1,unwrap:1,isreal:1,cplxpair:1,fix:1,floor:1,ceil:1,round:1,mod:1,rem:1,sign:1,airy:1,besselj:1,bessely:1,besselh:1,besseli:1,besselk:1,beta:1,betainc:1,betaln:1,ellipj:1,ellipke:1,erf:1,erfc:1,erfcx:1,erfinv:1,expint:1,gamma:1,gammainc:1,gammaln:1,psi:1,legendre:1,cross:1,dot:1,factor:1,isprime:1,primes:1,gcd:1,lcm:1,rat:1,rats:1,perms:1,nchoosek:1,factorial:1,cart2sph:1,cart2pol:1,pol2cart:1,sph2cart:1,hsv2rgb:1,rgb2hsv:1,zeros:1,ones:1,eye:1,repmat:1,rand:1,randn:1,linspace:1,logspace:1,freqspace:1,meshgrid:1,accumarray:1,size:1,length:1,ndims:1,numel:1,disp:1,isempty:1,isequal:1,isequalwithequalnans:1,cat:1,reshape:1,diag:1,blkdiag:1,tril:1,triu:1,fliplr:1,flipud:1,flipdim:1,rot90:1,find:1,end:1,sub2ind:1,ind2sub:1,bsxfun:1,ndgrid:1,permute:1,ipermute:1,shiftdim:1,circshift:1,squeeze:1,isscalar:1,isvector:1,ans:1,eps:1,realmax:1,realmin:1,pi:1,i:1,inf:1,nan:1,isnan:1,isinf:1,isfinite:1,j:1,why:1,compan:1,gallery:1,hadamard:1,hankel:1,hilb:1,invhilb:1,magic:1,pascal:1,rosser:1,toeplitz:1,vander:1,wilkinson:1},},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",b:\"function\",e:\"$\",k:{\"function\":1},c:[{cN:\"title\",b:hljs.UIR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},{cN:\"params\",b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,{b:\"''\"}]},{cN:\"comment\",b:\"\\\\%\",e:\"$\"},hljs.CNM]}};hljs.LANGUAGES.parser3={dM:{sL:\"html\",c:[{cN:\"comment\",b:\"^#\",e:\"$\"},{cN:\"comment\",b:\"\\\\^rem{\",e:\"}\",r:10,c:[{b:\"{\",e:\"}\",c:[\"self\"]}]},{cN:\"preprocessor\",b:\"^@(?:BASE|USE|CLASS|OPTIONS)$\",r:10},{cN:\"title\",b:\"@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$\"},{cN:\"variable\",b:\"\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?\"},{cN:\"keyword\",b:\"\\\\^[\\\\w\\\\-\\\\.\\\\:]+\"},{cN:\"number\",b:\"\\\\^#[0-9a-fA-F]+\"},hljs.CNM]}};hljs.LANGUAGES.go=function(){var a={keyword:{\"break\":1,\"default\":1,func:1,\"interface\":1,select:1,\"case\":1,map:1,struct:1,chan:1,\"else\":1,\"goto\":1,\"package\":1,\"switch\":1,\"const\":1,fallthrough:1,\"if\":1,range:1,type:1,\"continue\":1,\"for\":1,\"import\":1,\"return\":1,\"var\":1,go:1,defer:1},constant:{\"true\":1,\"false\":1,iota:1,nil:1},typename:{bool:1,\"byte\":1,complex64:1,complex128:1,float32:1,float64:1,int8:1,int16:1,int32:1,int64:1,string:1,uint8:1,uint16:1,uint32:1,uint64:1,\"int\":1,uint:1,uintptr:1,rune:1},built_in:{append:1,cap:1,close:1,complex:1,copy:1,imag:1,len:1,make:1,\"new\":1,panic:1,print:1,println:1,real:1,recover:1,\"delete\":1}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",r:0},{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"number\",b:\"[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\",r:0},hljs.CNM]}}}();"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/hljs-0.8.js",
    "content": "var hljs=new function(){function k(v){return v.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\\n/g,\"\"):w.nodeValue}if(t(w)==\"br\"){return\"\\n\"}return d(w)}).join(\"\")}function r(w){var v=(w.className+\" \"+(w.parentNode?w.parentNode.className:\"\")).split(/\\s+/);v=v.map(function(x){return x.replace(/^language-/,\"\")});return v.filter(function(x){return j(x)||x==\"no-highlight\"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)==\"br\"){z+=1}else{if(A.nodeType==1){v.push({event:\"start\",offset:z,node:A});z=w(A,z);v.push({event:\"stop\",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F=\"\";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset<y[0].offset)?w:y}return y[0].event==\"start\"?w:y}function A(H){function G(I){return\" \"+I.nodeName+'=\"'+k(I.value)+'\"'}F+=\"<\"+t(H)+Array.prototype.map.call(H.attributes,G).join(\"\")+\">\"}function E(G){F+=\"</\"+t(G)+\">\"}function v(G){(G.event==\"start\"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event==\"start\"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),\"m\"+(y.cI?\"i\":\"\")+(z?\"g\":\"\"))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(\" \").forEach(function(H){var I=H.split(\"|\");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k==\"string\"){E(\"keyword\",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\\b[A-Za-z0-9_]+\\b/,true);if(C){if(D.bK){D.b=D.bK.split(\" \").join(\"|\")}if(!D.b){D.b=/\\B|\\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\\B|\\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||\"\";if(D.eW&&C.tE){D.tE+=(D.e?\"|\":\"\")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F==\"self\"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?\"\\\\.?\\\\b(\"+F.b+\")\\\\b\\\\.?\":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join(\"|\"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V.c[T].bR,U)){return V.c[T]}}}function z(U,T){if(i(U.eR,T)){return U}if(U.eW){return z(U.parent,T)}}function A(T,U){return !J&&i(U.iR,T)}function E(V,T){var U=M.cI?T[0].toLowerCase():T[0];return V.k.hasOwnProperty(U)&&V.k[U]}function w(Z,X,W,V){var T=V?\"\":b.classPrefix,U='<span class=\"'+T,Y=W?\"\":\"</span>\";U+=Z+'\">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T=\"\";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode==\"continuous\"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,\"\",true):\"\";if(V.rB){D+=T;C=\"\"}else{if(V.eB){D+=k(U)+T;C=\"\"}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=\"</span>\"}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C=\"\";if(W.starts){P(W.starts,\"\")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme \"'+X+'\" for mode \"'+(I.cN||\"<unnamed>\")+'\"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: \"'+S+'\"')}m(M);var I=R||M;var D=\"\";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C=\"\";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=\"</span>\"}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf(\"Illegal\")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\\t)+)/gm,function(w,z,y,x){return z.replace(/\\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\\n/g,\"<br>\")}return v}function p(z){var y=d(z);var A=r(z);if(A==\"no-highlight\"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"pre\");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=\" hljs \"+(!A&&v.language||\"\");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:\"hljs-\",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(v,p)}function a(){addEventListener(\"DOMContentLoaded\",l,false);addEventListener(\"load\",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE]};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE]};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gim]*/,i:/\\n/,c:[this.BE,{b:/\\[/,e:/\\]/,r:0,c:[this.BE]}]};this.TM={cN:\"title\",b:this.IR,r:0};this.UTM={cN:\"title\",b:this.UIR,r:0}}();hljs.registerLanguage(\"ruleslanguage\",function(a){return{k:{keyword:\"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING\",built_in:\"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME\"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:\"array\",b:\"#[a-zA-Z .]+\"}]}});hljs.registerLanguage(\"ruby\",function(e){var h=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var g=\"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\";var a={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var i={cN:\"comment\",v:[{b:\"#\",e:\"$\",c:[a]},{b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[a],r:10},{b:\"^__END__\",e:\"\\\\n$\"}]};var c={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:g};var d={cN:\"string\",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:\"%[qw]?\\\\(\",e:\"\\\\)\"},{b:\"%[qw]?\\\\[\",e:\"\\\\]\"},{b:\"%[qw]?{\",e:\"}\"},{b:\"%[qw]?<\",e:\">\",r:10},{b:\"%[qw]?/\",e:\"/\",r:10},{b:\"%[qw]?%\",e:\"%\",r:10},{b:\"%[qw]?-\",e:\"-\",r:10},{b:\"%[qw]?\\\\|\",e:\"\\\\|\",r:10},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/}]};var b={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:g};var f=[d,i,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+e.IR+\"::)?\"+e.IR}]},i]},{cN:\"function\",bK:\"def\",e:\" |$|;\",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:\"constant\",b:\"(::)?(\\\\b[A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:[d,{b:h}],r:0},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[i,{cN:\"regexp\",c:[e.BE,c],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage(\"haml\",function(a){return{cI:true,c:[{cN:\"doctype\",b:\"^!!!( (5|1\\\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\\\b.*))?$\",r:10},{cN:\"comment\",b:\"^\\\\s*(!=#|=#|-#|/).*$\",r:0},{b:\"^\\\\s*(-|=|!=)(?!#)\",starts:{e:\"\\\\n\",sL:\"ruby\"}},{cN:\"tag\",b:\"^\\\\s*%\",c:[{cN:\"title\",b:\"\\\\w+\"},{cN:\"value\",b:\"[#\\\\.]\\\\w+\"},{b:\"{\\\\s*\",e:\"\\\\s*}\",eE:true,c:[{b:\":\\\\w+\\\\s*=>\",e:\",\\\\s+\",rB:true,eW:true,c:[{cN:\"symbol\",b:\":\\\\w+\"},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]}]},{b:\"\\\\(\\\\s*\",e:\"\\\\s*\\\\)\",eE:true,c:[{b:\"\\\\w+\\\\s*=\",e:\"\\\\s+\",rB:true,eW:true,c:[{cN:\"attribute\",b:\"\\\\w+\",r:0},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]},]}]},{cN:\"bullet\",b:\"^\\\\s*[=~]\\\\s*\",r:0},{b:\"#{\",starts:{e:\"}\",sL:\"ruby\"}}]}});hljs.registerLanguage(\"haskell\",function(f){var g={cN:\"comment\",v:[{b:\"--\",e:\"$\"},{b:\"{-\",e:\"-}\",c:[\"self\"]}]};var e={cN:\"pragma\",b:\"{-#\",e:\"#-}\"};var b={cN:\"preprocessor\",b:\"^#\",e:\"$\"};var d={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",r:0};var c={cN:\"container\",b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[e,g,b,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},f.inherit(f.TM,{b:\"[_a-z][\\\\w']*\"})]};var a={cN:\"container\",b:\"{\",e:\"}\",c:c.c};return{k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{cN:\"module\",b:\"\\\\bmodule\\\\b\",e:\"where\",k:\"module where\",c:[c,g],i:\"\\\\W\\\\.|;\"},{cN:\"import\",b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import|0 qualified as hiding\",c:[c,g],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[d,c,g]},{cN:\"typedef\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[e,g,d,c,a]},{cN:\"default\",bK:\"default\",e:\"$\",c:[d,c,g]},{cN:\"infix\",bK:\"infix infixl infixr\",e:\"$\",c:[f.CNM,g]},{cN:\"foreign\",b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[d,f.QSM,g]},{cN:\"shebang\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:\"^[_a-z][\\\\w']*\"}),{b:\"->|<-\"}]}});hljs.registerLanguage(\"xml\",function(a){var c=\"[A-Za-z0-9\\\\._:-]+\";var d={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\",subLanguageMode:\"continuous\"};var b={eW:true,i:/</,r:0,c:[d,{cN:\"attribute\",b:c,r:0},{b:\"=\",r:0,c:[{cN:\"value\",v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\"],cI:true,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[b],starts:{e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[b],starts:{e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{b:\"<%\",e:\"%>\",sL:\"vbscript\"},d,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ /><]+\",r:0},b]}]}});hljs.registerLanguage(\"django\",function(a){var b={cN:\"filter\",b:/\\|[A-Za-z]+\\:?/,k:\"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone\",c:[{cN:\"argument\",b:/\"/,e:/\"/},{cN:\"argument\",b:/'/,e:/'/}]};return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"template_comment\",b:/\\{%\\s*comment\\s*%}/,e:/\\{%\\s*endcomment\\s*%}/},{cN:\"template_comment\",b:/\\{#/,e:/#}/},{cN:\"template_tag\",b:/\\{%/,e:/%}/,k:\"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim\",c:[b]},{cN:\"variable\",b:/\\{\\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage(\"bash\",function(b){var a={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)\\}/}]};var d={cN:\"string\",b:/\"/,e:/\"/,c:[b.BE,a,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[b.BE]}]};var c={cN:\"string\",b:/'/,e:/'/};return{l:/-?[a-z\\.]+/,k:{keyword:\"if then else elif fi for break continue while in do done exit return set declare case esac export exec\",literal:\"true false\",built_in:\"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo\",operator:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"shebang\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:true,c:[b.inherit(b.TM,{b:/\\w[\\w\\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage(\"ini\",function(a){return{cI:true,i:/\\S/,c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:\"on off true false yes no\",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage(\"objectivec\",function(a){var d={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b=\"@interface @class @protocol @implementation\";return{k:d,l:c,i:\"</\",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(\"+b.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",k:b,l:c,c:[a.UTM]},{cN:\"variable\",b:\"\\\\.\"+a.UIR,r:0}]}});hljs.registerLanguage(\"scss\",function(a){var c=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var d={cN:\"function\",b:c+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]};var b={cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"};var e={cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:\"important\",b:\"!important\"}]}};return{cI:true,i:\"[=/|']\",c:[a.CLCM,a.CBLCLM,{cN:\"function\",b:c+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]},{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\",r:0},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",r:0},{cN:\"pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},{cN:\"attribute\",b:\"\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{cN:\"value\",b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{cN:\"value\",b:\":\",e:\";\",c:[b,a.NM,a.QSM,a.ASM,{cN:\"important\",b:\"!important\"}]},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",k:\"mixin include extend for if else each while charset import debug media page content font-face namespace warn\",c:[d,a.QSM,a.ASM,b,a.NM,{cN:\"preprocessor\",b:\"\\\\s[A-Za-z0-9_.-]+\",r:0}]}]}});hljs.registerLanguage(\"python\",function(a){var f={cN:\"prompt\",b:/^(>>>|\\.\\.\\.) /};var b={cN:\"string\",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)\"/,e:/\"/,},a.ASM,a.QSM]};var d={cN:\"number\",r:0,v:[{b:a.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:a.CNR+\"[lLjJ]?\"}]};var e={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",f,d,b]};var c={e:/:/,i:/[${=;\\n]/,c:[a.UTM,e]};return{k:{keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:\"function\",bK:\"def\",r:10}),a.inherit(c,{cN:\"class\",bK:\"class\"}),{cN:\"decorator\",b:/@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"mel\",function(a){return{k:\"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform\",i:\"</\",c:[a.CNM,a.ASM,a.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[a.BE]},{cN:\"variable\",v:[{b:\"\\\\$\\\\d\"},{b:\"[\\\\$\\\\%\\\\@](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\"},{b:\"\\\\*(\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\",r:0}]},a.CLCM,a.CBLCLM]}});hljs.registerLanguage(\"dos\",function(a){return{cI:true,k:{flow:\"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq\",keyword:\"shift cd dir echo setlocal endlocal set pause copy\",stream:\"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux\",winutils:\"ping net ipconfig taskkill xcopy ren del\"},c:[{cN:\"envvar\",b:\"%%[^ ]\"},{cN:\"envvar\",b:\"%[^ ]+?%\"},{cN:\"envvar\",b:\"![^ ]+?!\"},{cN:\"number\",b:\"\\\\b\\\\d+\",r:0},{cN:\"comment\",b:\"@?rem\",e:\"$\"}]}});hljs.registerLanguage(\"java\",function(b){var a=\"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws\";return{k:a,i:/<\\//,c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"(^|\\\\s)@[A-Za-z]+\"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:\"protected public private\",e:/[{;=]/,k:a,c:[{cN:\"class\",bK:\"class interface\",eW:true,i:/[:\"<>]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{b:b.UIR+\"\\\\s*\\\\(\",rB:true,c:[b.UTM]}]},b.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"tex\",function(a){var d={cN:\"command\",b:\"\\\\\\\\[a-zA-ZÐ°-ÑÐ-Ñ]+[\\\\*]?\"};var c={cN:\"command\",b:\"\\\\\\\\[^a-zA-ZÐ°-ÑÐ-Ñ0-9]\"};var b={cN:\"special\",b:\"[{}\\\\[\\\\]\\\\&#~]\",r:0};return{c:[{b:\"\\\\\\\\[a-zA-ZÐ°-ÑÐ-Ñ]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",rB:true,c:[d,c,{cN:\"number\",b:\" *=\",e:\"-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",eB:true}],r:10},d,c,b,{cN:\"formula\",b:\"\\\\$\\\\$\",e:\"\\\\$\\\\$\",c:[d,c,b],r:0},{cN:\"formula\",b:\"\\\\$\",e:\"\\\\$\",c:[d,c,b],r:0},{cN:\"comment\",b:\"%\",e:\"$\",r:0}]}});hljs.registerLanguage(\"glsl\",function(a){return{k:{keyword:\"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly\",built_in:\"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse\",literal:\"true false\"},i:'\"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"}]}});hljs.registerLanguage(\"brainfuck\",function(b){var a={cN:\"literal\",b:\"[\\\\+\\\\-]\",r:0};return{c:[{cN:\"comment\",b:\"[^\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",rE:true,e:\"[\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",r:0},{cN:\"title\",b:\"[\\\\[\\\\]]\",r:0},{cN:\"string\",b:\"[\\\\.,]\",r:0},{b:/\\+\\+|\\-\\-/,rB:true,c:[a]},a]}});hljs.registerLanguage(\"mathematica\",function(a){return{aliases:[\"mma\"],l:\"(\\\\$|\\\\b)\"+a.IR+\"\\\\b\",k:\"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber\",c:[{cN:\"comment\",b:/\\(\\*/,e:/\\*\\)/},a.ASM,a.QSM,a.CNM,{cN:\"list\",b:/\\{/,e:/\\}/,i:/:/}]}});hljs.registerLanguage(\"cs\",function(b){var a=\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield\";return{k:a,c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},b.CLCM,b.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line region endregion pragma checksum\"},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},b.ASM,b.QSM,b.CNM,{bK:\"protected public private internal\",e:/[{;=]/,k:a,c:[{bK:\"class namespace interface\",starts:{c:[b.TM]}},{b:b.IR+\"\\\\s*\\\\(\",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage(\"http\",function(a){return{i:\"\\\\S\",c:[{cN:\"status\",b:\"^HTTP/[0-9\\\\.]+\",e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{cN:\"request\",b:\"^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$\",rB:true,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:true,eE:true}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:true,i:\"\\\\n|\\\\s|=\",starts:{cN:\"string\",e:\"$\"}},{b:\"\\\\n\\\\n\",starts:{sL:\"\",eW:true}}]}});hljs.registerLanguage(\"rust\",function(b){var c={cN:\"number\",b:\"\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)\",r:0};var a=\"assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while\";return{k:a,i:\"</\",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",c:[b.UTM]},{cN:\"preprocessor\",b:\"#\\\\[\",e:\"\\\\]\"},{bK:\"type\",e:\"(=|<)\",c:[b.UTM],i:\"\\\\S\"},{bK:\"trait enum\",e:\"({|<)\",c:[b.UTM],i:\"\\\\S\"}]}});hljs.registerLanguage(\"handlebars\",function(b){var a=\"each in with if else unless bindattr action collection debugger log outlet template unbound view yield\";return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"expression\",b:\"{{\",e:\"}}\",c:[{cN:\"begin-block\",b:\"#[a-zA-Z- .]+\",k:a},{cN:\"string\",b:'\"',e:'\"'},{cN:\"end-block\",b:\"\\\\/[a-zA-Z- .]+\",k:a},{cN:\"variable\",b:\"[a-zA-Z-.]+\",k:a}]}]}});hljs.registerLanguage(\"cmake\",function(a){return{cI:true,k:{keyword:\"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or\",operator:\"equal less greater strless strgreater strequal matches\"},c:[{cN:\"envvar\",b:\"\\\\${\",e:\"}\"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage(\"lisp\",function(h){var k=\"[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#!]*\";var l=\"(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\";var j={cN:\"shebang\",b:\"^#!\",e:\"$\"};var b={cN:\"literal\",b:\"\\\\b(t{1}|nil)\\\\b\"};var d={cN:\"number\",v:[{b:l,r:0},{b:\"#b[0-1]+(/[0-1]+)?\"},{b:\"#o[0-7]+(/[0-7]+)?\"},{b:\"#x[0-9a-f]+(/[0-9a-f]+)?\"},{b:\"#c\\\\(\"+l+\" +\"+l,e:\"\\\\)\"}]};var g=h.inherit(h.QSM,{i:null});var m={cN:\"comment\",b:\";\",e:\"$\"};var f={cN:\"variable\",b:\"\\\\*\",e:\"\\\\*\"};var n={cN:\"keyword\",b:\"[:&]\"+k};var c={b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",b,g,d]};var a={cN:\"quoted\",c:[d,g,f,n,c],v:[{b:\"['`]\\\\(\",e:\"\\\\)\",},{b:\"\\\\(quote \",e:\"\\\\)\",k:{title:\"quote\"},}]};var i={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var e={eW:true,r:0};i.c=[{cN:\"title\",b:k},e];e.c=[a,i,b,d,g,m,f,n];return{i:/\\S/,c:[d,j,b,g,m,a,i]}});hljs.registerLanguage(\"rib\",function(a){return{k:\"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd\",i:\"</\",c:[a.HCM,a.CNM,a.ASM,a.QSM]}});hljs.registerLanguage(\"css\",function(a){var b=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var c={cN:\"function\",b:b+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]};return{cI:true,i:\"[=/|']\",c:[a.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:\"tag\",b:b,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[a.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}});hljs.registerLanguage(\"avrasm\",function(a){return{cI:true,k:{keyword:\"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr\",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf\"},c:[a.CBLCLM,{cN:\"comment\",b:\";\",e:\"$\",r:0},a.CNM,a.BNM,{cN:\"number\",b:\"\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)\"},a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"label\",b:\"^[A-Za-z0-9_.$]+:\"},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"preprocessor\",b:\"\\\\.[a-zA-Z]+\"},{cN:\"localvars\",b:\"@[0-9]+\"}]}});hljs.registerLanguage(\"apache\",function(a){var b={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,c:[a.HCM,{cN:\"tag\",b:\"</?\",e:\">\"},{cN:\"keyword\",b:/\\w+/,r:0,k:{common:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",b]},b,a.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"1c\",function(b){var f=\"[a-zA-ZÐ°-ÑÐ-Ð¯][a-zA-Z0-9_Ð°-ÑÐ-Ð¯]*\";var c=\"Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚ Ð´Ð°Ñ‚Ð° Ð´Ð»Ñ ÐµÑÐ»Ð¸ Ð¸ Ð¸Ð»Ð¸ Ð¸Ð½Ð°Ñ‡Ðµ Ð¸Ð½Ð°Ñ‡ÐµÐµÑÐ»Ð¸ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ ÐºÐ¾Ð½ÐµÑ†ÐµÑÐ»Ð¸ ÐºÐ¾Ð½ÐµÑ†Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ¸ ÐºÐ¾Ð½ÐµÑ†Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ ÐºÐ¾Ð½ÐµÑ†Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ ÐºÐ¾Ð½ÐµÑ†Ñ†Ð¸ÐºÐ»Ð° ÐºÐ¾Ð½ÑÑ‚Ð°Ð½Ñ‚Ð° Ð½Ðµ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ Ð¿ÐµÑ€ÐµÐ¼ Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ðµ Ð¿Ð¾ Ð¿Ð¾ÐºÐ° Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð¿Ñ€ÐµÑ€Ð²Ð°Ñ‚ÑŒ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÑŒ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° ÑÑ‚Ñ€Ð¾ÐºÐ° Ñ‚Ð¾Ð³Ð´Ð° Ñ„Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ†Ð¸ÐºÐ» Ñ‡Ð¸ÑÐ»Ð¾ ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\";var e=\"ansitooem oemtoansi Ð²Ð²ÐµÑÑ‚Ð¸Ð²Ð¸Ð´ÑÑƒÐ±ÐºÐ¾Ð½Ñ‚Ð¾ Ð²Ð²ÐµÑÑ‚Ð¸Ð´Ð°Ñ‚Ñƒ Ð²Ð²ÐµÑÑ‚Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ðµ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿ÐµÑ€Ð¸Ð¾Ð´ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð²Ð²ÐµÑÑ‚Ð¸ÑÑ‚Ñ€Ð¾ÐºÑƒ Ð²Ð²ÐµÑÑ‚Ð¸Ñ‡Ð¸ÑÐ»Ð¾ Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð²Ñ€ÐµÐ³ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¹Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð²Ñ‹Ð·Ð²Ð°Ñ‚ÑŒÐ¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ Ð´Ð°Ñ‚Ð°Ð³Ð¾Ð´ Ð´Ð°Ñ‚Ð°Ð¼ÐµÑÑÑ† Ð´Ð°Ñ‚Ð°Ñ‡Ð¸ÑÐ»Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒÐ¼ÐµÑÑÑ† Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑŒÑ€Ð°Ð±Ð¾Ñ‚ÑƒÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ Ð·Ð°Ð¿Ð¸ÑÑŒÐ¶ÑƒÑ€Ð½Ð°Ð»Ð°Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ð¸ Ð·Ð°Ð¿ÑƒÑÑ‚Ð¸Ñ‚ÑŒÐ¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ Ð·Ð°Ñ„Ð¸ÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²ÑÑ‚Ñ€Ð¾ÐºÑƒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²ÑÑ‚Ñ€Ð¾ÐºÑƒÐ²Ð½ÑƒÑ‚Ñ€ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²Ñ„Ð°Ð¹Ð» Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·ÑÑ‚Ñ€Ð¾ÐºÐ¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·ÑÑ‚Ñ€Ð¾ÐºÐ¸Ð²Ð½ÑƒÑ‚Ñ€ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·Ñ„Ð°Ð¹Ð»Ð° Ð¸Ð¼ÑÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° Ð¸Ð¼ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…Ñ„Ð°Ð¹Ð»Ð¾Ð² ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¸Ð± ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ ÐºÐ¾Ð´ÑÐ¸Ð¼Ð² ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°ÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ ÐºÐ¾Ð½Ð³Ð¾Ð´Ð° ÐºÐ¾Ð½ÐµÑ†Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ ÐºÐ¾Ð½ÐµÑ†Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ð½Ð½Ð¾Ð³Ð¾Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ ÐºÐ¾Ð½ÐµÑ†ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¾Ð³Ð¾Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð° ÐºÐ¾Ð½ÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»Ð° ÐºÐ¾Ð½Ð¼ÐµÑÑÑ†Ð° ÐºÐ¾Ð½Ð½ÐµÐ´ÐµÐ»Ð¸ Ð»ÐµÐ² Ð»Ð¾Ð³ Ð»Ð¾Ð³10 Ð¼Ð°ÐºÑ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¾ÐµÐºÐ¾Ð»Ð¸Ñ‡ÐµÑÑ‚Ð²Ð¾ÑÑƒÐ±ÐºÐ¾Ð½Ñ‚Ð¾ Ð¼Ð¸Ð½ Ð¼Ð¾Ð½Ð¾Ð¿Ð¾Ð»ÑŒÐ½Ñ‹Ð¹Ñ€ÐµÐ¶Ð¸Ð¼ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹ÑÐ° Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ½Ð°Ð±Ð¾Ñ€Ð°Ð¿Ñ€Ð°Ð² Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒÐ²Ð¸Ð´ Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒÑÑ‡ÐµÑ‚ Ð½Ð°Ð¹Ñ‚Ð¸ Ð½Ð°Ð¹Ñ‚Ð¸Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹ÐµÐ½Ð°ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ðµ Ð½Ð°Ð¹Ñ‚Ð¸ÑÑÑ‹Ð»ÐºÐ¸ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ Ð½Ð°Ñ‡Ð°Ð»Ð¾ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¾Ð³Ð¾Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð° Ð½Ð°Ñ‡Ð°Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð½Ð°Ñ‡Ð³Ð¾Ð´Ð° Ð½Ð°Ñ‡ÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»Ð° Ð½Ð°Ñ‡Ð¼ÐµÑÑÑ†Ð° Ð½Ð°Ñ‡Ð½ÐµÐ´ÐµÐ»Ð¸ Ð½Ð¾Ð¼ÐµÑ€Ð´Ð½ÑÐ³Ð¾Ð´Ð° Ð½Ð¾Ð¼ÐµÑ€Ð´Ð½ÑÐ½ÐµÐ´ÐµÐ»Ð¸ Ð½Ð¾Ð¼ÐµÑ€Ð½ÐµÐ´ÐµÐ»Ð¸Ð³Ð¾Ð´Ð° Ð½Ñ€ÐµÐ³ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾ÐºÑ€ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸ÐµÐ¾ÑˆÐ¸Ð±ÐºÐ¸ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ€Ð°ÑÑ‡ÐµÑ‚Ð¾Ð² Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹ÑÐ·Ñ‹Ðº Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒÑ„Ð¾Ñ€Ð¼Ñƒ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒÑ„Ð¾Ñ€Ð¼ÑƒÐ¼Ð¾Ð´Ð°Ð»ÑŒÐ½Ð¾ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð¾Ñ‡Ð¸ÑÑ‚Ð¸Ñ‚ÑŒÐ¾ÐºÐ½Ð¾ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ð¹ Ð¿ÐµÑ€Ð¸Ð¾Ð´ÑÑ‚Ñ€ Ð¿Ð¾Ð»Ð½Ð¾ÐµÐ¸Ð¼ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ²Ñ€ÐµÐ¼ÑÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ´Ð°Ñ‚ÑƒÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑÐ¾Ñ‚Ð±Ð¾Ñ€Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÑ‚Ð° Ð¿Ñ€Ð°Ð² Ð¿Ñ€Ð°Ð²Ð¾Ð´Ð¾ÑÑ‚ÑƒÐ¿Ð° Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑÐ°Ð²Ñ‚Ð¾Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ð¸Ð¸ Ð¿ÑƒÑÑ‚Ð°ÑÑÑ‚Ñ€Ð¾ÐºÐ° Ð¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ñ€Ð°Ð±Ð¾Ñ‡Ð°ÑÐ´Ð°Ñ‚Ñ‚ÑŒÐ¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ñ€Ð°Ð±Ð¾Ñ‡Ð°ÑÐ´Ð°Ñ‚Ð° Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÑÑ‚Ñ€Ð°Ð½Ð¸Ñ† Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÑÑ‚Ñ€Ð¾Ðº Ñ€Ð°Ð·Ð¼ Ñ€Ð°Ð·Ð¾Ð±Ñ€Ð°Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð° Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ñ‚ÑŒÑ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ñ‹Ð½Ð° Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ñ‚ÑŒÑ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ñ‹Ð¿Ð¾ ÑÐ¸Ð³Ð½Ð°Ð» ÑÐ¸Ð¼Ð² ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ‚Ð°Ð±ÑƒÐ»ÑÑ†Ð¸Ð¸ ÑÐ¾Ð·Ð´Ð°Ñ‚ÑŒÐ¾Ð±ÑŠÐµÐºÑ‚ ÑÐ¾ÐºÑ€Ð» ÑÐ¾ÐºÑ€Ð»Ð¿ ÑÐ¾ÐºÑ€Ð¿ ÑÐ¾Ð¾Ð±Ñ‰Ð¸Ñ‚ÑŒ ÑÐ¾ÑÑ‚Ð¾ÑÐ½Ð¸Ðµ ÑÐ¾Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÑ€ÐµÐ´ ÑÑ‚Ð°Ñ‚ÑƒÑÐ²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° ÑÑ‚Ñ€Ð´Ð»Ð¸Ð½Ð° ÑÑ‚Ñ€Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑÑ‚Ñ€ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑÑ‚Ð²Ð¾ÑÑ‚Ñ€Ð¾Ðº ÑÑ‚Ñ€Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÑÑ‚Ñ€Ð¾ÐºÑƒ  ÑÑ‚Ñ€Ñ‡Ð¸ÑÐ»Ð¾Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ð¹ ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð° ÑÑ‡ÐµÑ‚Ð¿Ð¾ÐºÐ¾Ð´Ñƒ Ñ‚ÐµÐºÑƒÑ‰Ð°ÑÐ´Ð°Ñ‚Ð° Ñ‚ÐµÐºÑƒÑ‰ÐµÐµÐ²Ñ€ÐµÐ¼Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑÑÑ‚Ñ€ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒÐ¾Ð±ÑŠÐµÐºÑ‚Ñ‹ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÑ‚Ð°Ð½Ð° ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÑ‚Ð°Ð¿Ð¾ Ñ„Ð¸ÐºÑÑˆÐ°Ð±Ð»Ð¾Ð½ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ Ñ†ÐµÐ» ÑˆÐ°Ð±Ð»Ð¾Ð½\";var a={cN:\"dquote\",b:'\"\"'};var d={cN:\"string\",b:'\"',e:'\"|$',c:[a]};var g={cN:\"string\",b:\"\\\\|\",e:'\"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:\"function\",b:\"(Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°|Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)\",e:\"$\",l:f,k:\"Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ\",c:[b.inherit(b.TM,{b:f}),{cN:\"tail\",eW:true,c:[{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:f,k:\"Ð·Ð½Ð°Ñ‡\",c:[d,g]},{cN:\"export\",b:\"ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\",eW:true,l:f,k:\"ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\",c:[b.CLCM]}]},b.CLCM]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"date\",b:\"'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})'\"}]}});hljs.registerLanguage(\"javascript\",function(a){return{aliases:[\"js\"],k:{keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require\"},c:[{cN:\"pi\",b:/^\\s*('|\")use strict('|\")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:\"(\"+a.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,c:[a.CLCM,a.CBLCLM],i:/[\"'\\(]/}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+a.IR,r:0}]}});hljs.registerLanguage(\"vbnet\",function(a){return{cI:true,k:{keyword:\"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor\",built_in:\"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort\",literal:\"true false nothing\"},i:\"//|{|}|endif|gosub|variant|wend\",c:[a.inherit(a.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:\"'\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"'''|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"},]},a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elseif end region externalsource\"},]}});hljs.registerLanguage(\"fsharp\",function(a){return{k:\"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield\",c:[{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\"},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[a.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},{cN:\"attribute\",b:\"\\\\B('[A-Za-z])\\\\b\",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage(\"matlab\",function(a){var b=[a.CNM,{cN:\"string\",b:\"'\",e:\"'\",c:[a.BE,{b:\"''\"}]}];return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson\"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},{cN:\"params\",b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",c:b,r:0},{cN:\"cell\",b:\"\\\\{\",e:\"\\\\}'*[\\\\.']*\",c:b,i:/:/},{cN:\"comment\",b:\"\\\\%\",e:\"$\"}].concat(b)}});hljs.registerLanguage(\"applescript\",function(a){var b=a.inherit(a.QSM,{i:\"\"});var d={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.CNM,b]};var c=[{cN:\"comment\",b:\"--\",e:\"$\",},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\",{b:\"--\",e:\"$\"}]},a.HCM];return{k:{keyword:\"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without\",constant:\"AppleScript false linefeed return pi quote result space tab true\",type:\"alias application boolean class constant date file integer list number real record string text\",command:\"activate beep count delay launch log offset read round run say summarize write\",property:\"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year\"},c:[b,a.CNM,{cN:\"type\",b:\"\\\\bPOSIX file\\\\b\"},{cN:\"command\",b:\"\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\\\b|^\\\\s*return\\\\b\"},{cN:\"constant\",b:\"\\\\b(text item delimiters|current application|missing value)\\\\b\"},{cN:\"keyword\",b:\"\\\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\\\b\"},{cN:\"property\",b:\"\\\\b(POSIX path|(date|time) string|quoted form)\\\\b\"},{cN:\"function_start\",bK:\"on\",i:\"[${=;\\\\n]\",c:[a.UTM,d]}].concat(c),i:\"//\"}});hljs.registerLanguage(\"delphi\",function(b){var a=\"exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure\";var e={cN:\"comment\",v:[{b:/\\{/,e:/\\}/,r:0},{b:/\\(\\*/,e:/\\*\\)/,r:10}]};var c={cN:\"string\",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:\"string\",b:/(#\\d+)+/};var f={b:b.IR+\"\\\\s*=\\\\s*class\\\\s*\\\\(\",rB:true,c:[b.TM]};var g={cN:\"function\",bK:\"function constructor destructor procedure\",e:/[:;]/,k:\"function constructor|10 destructor|10 procedure|10\",c:[b.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/(\"|\\$[G-Zg-z]|\\/\\*|<\\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage(\"cpp\",function(a){var b={keyword:\"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary\",built_in:\"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf\"};return{aliases:[\"c\"],k:b,i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{b:\"include\\\\s*<\",e:\">\",i:\"\\\\n\"},a.CLCM]},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:b,r:10,c:[\"self\"]}]}});hljs.registerLanguage(\"json\",function(a){var e={literal:\"true false null\"};var d=[a.QSM,a.CNM];var c={cN:\"value\",e:\",\",eW:true,eE:true,c:d,k:e};var b={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:true,eE:true,c:[a.BE],i:\"\\\\n\",starts:c}],i:\"\\\\S\"};var f={b:\"\\\\[\",e:\"\\\\]\",c:[a.inherit(c,{cN:null})],i:\"\\\\S\"};d.splice(d.length,0,b,f);return{c:d,k:e,i:\"\\\\S\"}});hljs.registerLanguage(\"perl\",function(c){var d=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\";var f={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:d};var g={b:\"->{\",e:\"}\"};var a={cN:\"variable\",v:[{b:/\\$\\d/},{b:/[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},{b:/[\\$\\%\\@\\*][^\\s\\w{]/,r:0}]};var e={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:\"comment\",b:\"^\\\\=\\\\w\",e:\"\\\\=cut\",eW:true},g,{cN:\"string\",c:h,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[c.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[c.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+c.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[c.HCM,e,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[c.BE],r:0}]},{cN:\"sub\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage(\"markdown\",function(a){return{c:[{cN:\"header\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"`.+?`\"},{b:\"^( {4}|\\t)\",e:\"$\",r:0}]},{cN:\"horizontal_rule\",b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,rE:true,r:0},{cN:\"link_url\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:true,eE:true},{cN:\"link_reference\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:true,eE:true,}],r:10},{b:\"^\\\\[.+\\\\]:\",e:\"$\",rB:true,c:[{cN:\"link_reference\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true},{cN:\"link_url\",b:\"\\\\s\",e:\"$\"}]}]}});hljs.registerLanguage(\"ocaml\",function(a){return{k:{keyword:\"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value\",built_in:\"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string\",},i:/\\/\\//,c:[{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\"]},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[a.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage(\"d\",function(x){var b={keyword:\"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__\",built_in:\"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring\",literal:\"false null true\"};var c=\"(0|[1-9][\\\\d_]*)\",q=\"(0|[1-9][\\\\d_]*|\\\\d[\\\\d_]*|[\\\\d_]+?\\\\d)\",h=\"0[bB][01_]+\",v=\"([\\\\da-fA-F][\\\\da-fA-F_]*|_[\\\\da-fA-F][\\\\da-fA-F_]*)\",y=\"0[xX]\"+v,p=\"([eE][+-]?\"+q+\")\",o=\"(\"+q+\"(\\\\.\\\\d*|\"+p+\")|\\\\d+\\\\.\"+q+q+\"|\\\\.\"+c+p+\"?)\",k=\"(0[xX](\"+v+\"\\\\.\"+v+\"|\\\\.?\"+v+\")[pP][+-]?\"+q+\")\",l=\"(\"+c+\"|\"+h+\"|\"+y+\")\",n=\"(\"+k+\"|\"+o+\")\";var z=\"\\\\\\\\(['\\\"\\\\?\\\\\\\\abfnrtv]|u[\\\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\\\dA-Fa-f]{2}|U[\\\\dA-Fa-f]{8})|&[a-zA-Z\\\\d]{2,};\";var m={cN:\"number\",b:\"\\\\b\"+l+\"(L|u|U|Lu|LU|uL|UL)?\",r:0};var j={cN:\"number\",b:\"\\\\b(\"+n+\"([fF]|L|i|[fF]i|Li)?|\"+l+\"(i|[fF]i|Li))\",r:0};var s={cN:\"string\",b:\"'(\"+z+\"|.)\",e:\"'\",i:\".\"};var r={b:z,r:0};var w={cN:\"string\",b:'\"',c:[r],e:'\"[cwd]?'};var f={cN:\"string\",b:'[rq]\"',e:'\"[cwd]?',r:5};var u={cN:\"string\",b:\"`\",e:\"`[cwd]?\"};var i={cN:\"string\",b:'x\"[\\\\da-fA-F\\\\s\\\\n\\\\r]*\"[cwd]?',r:10};var t={cN:\"string\",b:'q\"\\\\{',e:'\\\\}\"'};var e={cN:\"shebang\",b:\"^#!\",e:\"$\",r:5};var g={cN:\"preprocessor\",b:\"#(line)\",e:\"$\",r:5};var d={cN:\"keyword\",b:\"@[a-zA-Z_][a-zA-Z_\\\\d]*\"};var a={cN:\"comment\",b:\"\\\\/\\\\+\",c:[\"self\"],e:\"\\\\+\\\\/\",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}});hljs.registerLanguage(\"coffeescript\",function(c){var b={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",reserved:\"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf\",built_in:\"npm require console print module exports global window document\"};var a=\"[A-Za-z$_][0-9A-Za-z$_]*\";var f=c.inherit(c.TM,{b:a});var e={cN:\"subst\",b:/#\\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[c.BE,e]},{b:/\"/,e:/\"/,c:[c.BE,e]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[e,c.HCM]},{b:\"//[gim]*\",r:0},{b:\"/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)\"}]},{cN:\"property\",b:\"@\"+a},{b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"}];e.c=d;return{k:b,c:d.concat([{cN:\"comment\",b:\"###\",e:\"###\"},c.HCM,{cN:\"function\",b:\"(\"+a+\"\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",e:\"[-=]>\",rB:true,c:[f,{cN:\"params\",b:\"\\\\(\",rB:true,c:[{b:/\\(/,e:/\\)/,k:b,c:[\"self\"].concat(d)}]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:true,i:/[:=\"\\[\\]]/,c:[f]},f]},{cN:\"attribute\",b:a+\":\",e:\":\",rB:true,eE:true,r:0}])}});hljs.registerLanguage(\"lua\",function(b){var a=\"\\\\[=*\\\\[\";var e=\"\\\\]=*\\\\]\";var c={b:a,e:e,c:[\"self\"]};var d=[{cN:\"comment\",b:\"--(?!\"+a+\")\",e:\"$\"},{cN:\"comment\",b:\"--\"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:\"and break do else elseif end false for if in local nil not or repeat return then true until while\",built_in:\"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table\"},c:d.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[b.inherit(b.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:\"string\",b:a,e:e,c:[c],r:10}])}});hljs.registerLanguage(\"makefile\",function(a){var b={cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\\w+\\s*\\W*=/,rB:true,r:0,starts:{cN:\"constant\",e:/\\s*\\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:\"title\",b:/^[\\w]+:\\s*$/},{cN:\"phony\",b:/^\\.PHONY:/,e:/$/,k:\".PHONY\",l:/[\\.\\w]+/},{b:/^\\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage(\"rsl\",function(a){return{k:{keyword:\"float color point normal vector matrix while for if do return else break extern continue\",built_in:\"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp\"},i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"shader\",bK:\"surface displacement light volume imager\",e:\"\\\\(\"},{cN:\"shading\",bK:\"illuminate illuminance gather\",e:\"\\\\(\"}]}});hljs.registerLanguage(\"vbscript\",function(a){return{cI:true,k:{keyword:\"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto\",built_in:\"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err\",literal:\"true false null nothing empty\"},i:\"//\",c:[a.inherit(a.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage(\"go\",function(a){var b={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer\",constant:\"true false iota nil\",typename:\"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:b,i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\"},{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"number\",b:\"[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\",r:0},a.CNM]}});hljs.registerLanguage(\"axapta\",function(a){return{k:\"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod\",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",bK:\"class interface\",e:\"{\",i:\":\",c:[{cN:\"inheritance\",bK:\"extends implements\",r:10},a.UTM]}]}});hljs.registerLanguage(\"vala\",function(a){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface delegate namespace\",e:\"{\",i:\"[^,:\\\\n\\\\s\\\\.]\",c:[a.UTM]},a.CLCM,a.CBLCLM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',r:5},a.ASM,a.QSM,a.CNM,{cN:\"preprocessor\",b:\"^#\",e:\"$\",r:2},{cN:\"constant\",b:\" [A-Z_]+ \",r:0}]}});hljs.registerLanguage(\"erlang\",function(i){var c=\"[a-z'][a-zA-Z0-9_']*\";var o=\"(\"+c+\":\"+c+\"|\"+c+\")\";var f={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor\",literal:\"false true\"};var l={cN:\"comment\",b:\"%\",e:\"$\",r:0};var e={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0};var g={b:\"fun\\\\s+\"+c+\"/\\\\d+\"};var n={b:o+\"\\\\(\",e:\"\\\\)\",rB:true,r:0,c:[{cN:\"function_name\",b:o,r:0},{b:\"\\\\(\",e:\"\\\\)\",eW:true,rE:true,r:0}]};var h={cN:\"tuple\",b:\"{\",e:\"}\",r:0};var a={cN:\"variable\",b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",r:0};var m={cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_]*\",r:0};var b={b:\"#\"+i.UIR,r:0,rB:true,c:[{cN:\"record_name\",b:\"#\"+i.UIR,r:0},{b:\"{\",e:\"}\",r:0}]};var k={bK:\"fun receive if try case\",e:\"end\",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:\"\"}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:j};return{k:f,i:\"(</|\\\\*=|\\\\+=|-=|/=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+c+\"\\\\s*\\\\(\",e:\"->\",rB:true,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[d,i.inherit(i.TM,{b:c})],starts:{e:\";|\\\\.\",k:f,c:j}},l,{cN:\"pp\",b:\"^-\",e:\"\\\\.\",r:0,eE:true,rB:true,l:\"-\"+i.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior\",c:[d]},e,i.QSM,b,a,m,h]}});hljs.registerLanguage(\"sql\",function(a){return{cI:true,i:/[<>]/,c:[{cN:\"operator\",b:\"\\\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\\\b(?!:)\",e:\";\",eW:true,k:{keyword:\"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database\",aggregate:\"count sum min max avg\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[a.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[a.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}});hljs.registerLanguage(\"mizar\",function(a){return{k:[\"environ vocabularies notations constructors definitions registrations theorems schemes requirements\",\"begin end definition registration cluster existence pred func defpred deffunc theorem proof\",\"let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from\",\"be being by means equals implies iff redefine define now not or attr is mode suppose per cases set\",\"thesis contradiction scheme reserve struct\",\"correctness compatibility coherence symmetry assymetry reflexivity irreflexivity\",\"connectedness uniqueness commutativity idempotence involutiveness projectivity\"].join(\" \"),c:[{cN:\"comment\",b:\"::\",e:\"$\"}]}});hljs.registerLanguage(\"lasso\",function(d){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*\";var i=\"<\\\\?(lasso(script)?|=)\";var c=\"\\\\]|\\\\?>\";var g={literal:\"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft\",built_in:\"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited\",keyword:\"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome\"};var a={cN:\"comment\",b:\"<!--\",e:\"-->\",r:0};var j={cN:\"preprocessor\",b:\"\\\\[noprocess\\\\]\",starts:{cN:\"markup\",e:\"\\\\[/noprocess\\\\]\",rE:true,c:[a]}};var e={cN:\"preprocessor\",b:\"\\\\[/noprocess|\"+i};var h={cN:\"variable\",b:\"'\"+b+\"'\"};var f=[d.CLCM,{cN:\"javadoc\",b:\"/\\\\*\\\\*!\",e:\"\\\\*/\"},d.CBLCLM,d.inherit(d.CNM,{b:d.CNR+\"|-?(infinity|nan)\\\\b\"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"variable\",v:[{b:\"[#$]\"+b},{b:\"#\",e:\"\\\\d+\",i:\"\\\\W\"}]},{cN:\"tag\",b:\"::\\\\s*\",e:b,i:\"\\\\W\"},{cN:\"attribute\",b:\"\\\\.\\\\.\\\\.|-\"+d.UIR},{cN:\"subst\",v:[{b:\"->\\\\s*\",c:[h]},{b:\":=|/(?!\\\\w)=?|[-+*%=<>&|!?\\\\\\\\]+\",r:0}]},{cN:\"built_in\",b:\"\\\\.\\\\.?\",r:0,c:[h]},{cN:\"class\",bK:\"define\",rE:true,e:\"\\\\(|=>\",c:[d.inherit(d.TM,{b:d.UIR+\"(=(?!>))?\"})]}];return{aliases:[\"ls\",\"lassoscript\"],cI:true,l:b+\"|&[lg]t;\",k:g,c:[{cN:\"preprocessor\",b:c,r:0,starts:{cN:\"markup\",e:\"\\\\[|\"+i,rE:true,r:0,c:[a]}},j,e,{cN:\"preprocessor\",b:\"\\\\[no_square_brackets\",starts:{e:\"\\\\[/no_square_brackets\\\\]\",l:b+\"|&[lg]t;\",k:g,c:[{cN:\"preprocessor\",b:c,r:0,starts:{cN:\"markup\",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:\"preprocessor\",b:\"\\\\[\",r:0},{cN:\"shebang\",b:\"^#!.+lasso9\\\\b\",r:10}].concat(f)}});hljs.registerLanguage(\"r\",function(a){var b=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[a.HCM,{b:b,l:b,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},r:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",r:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{b:\"`\",e:\"`\",r:0},{cN:\"string\",c:[a.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"scala\",function(a){var c={cN:\"annotation\",b:\"@[A-Za-z]+\"};var b={cN:\"string\",b:'u?r?\"\"\"',e:'\"\"\"',r:10};return{k:\"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws\",c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},a.CLCM,a.CBLCLM,b,a.ASM,a.QSM,{cN:\"class\",b:\"((case )?class |object |trait )\",e:\"({|$)\",i:\":\",k:\"case class trait object\",c:[{bK:\"extends with\",r:10},a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}});hljs.registerLanguage(\"livecodeserver\",function(a){var e={cN:\"variable\",b:\"\\\\b[gtps][A-Z]+[A-Za-z0-9_\\\\-]*\\\\b|\\\\$_[A-Z]+\",r:0};var b={cN:\"comment\",e:\"$\",v:[a.CBLCLM,a.HCM,{b:\"--\",},{b:\"[^:]//\",}]};var d=a.inherit(a.TM,{v:[{b:\"\\\\b_*rig[A-Z]+[A-Za-z0-9_\\\\-]*\"},{b:\"\\\\b_[a-z0-9\\\\-]+\"}]});var c=a.inherit(a.TM,{b:\"\\\\b([A-Za-z0-9_\\\\-]+)\\\\b\"});return{cI:false,k:{keyword:\"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if\",constant:\"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK\",operator:\"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys\",built_in:\"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write\"},c:[e,{cN:\"keyword\",b:\"\\\\bend\\\\sif\\\\b\"},{cN:\"function\",bK:\"function\",e:\"$\",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:\"function\",bK:\"end\",e:\"$\",c:[c,d]},{cN:\"command\",bK:\"command on\",e:\"$\",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:\"command\",bK:\"end\",e:\"$\",c:[c,d]},{cN:\"preprocessor\",b:\"<\\\\?rev|<\\\\?lc|<\\\\?livecode\",r:10},{cN:\"preprocessor\",b:\"<\\\\?\"},{cN:\"preprocessor\",b:\"\\\\?>\"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:\";$|^\\\\[|^=\"}});hljs.registerLanguage(\"profile\",function(a){return{c:[a.CNM,{cN:\"built_in\",b:\"{\",e:\"}$\",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:\"filename\",b:\"[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}\",e:\":\",eE:true},{cN:\"header\",b:\"(ncalls|tottime|cumtime)\",e:\"$\",k:\"ncalls tottime|10 cumtime|10 filename\",r:10},{cN:\"summary\",b:\"function calls\",e:\"$\",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:\"function\",b:\"\\\\(\",e:\"\\\\)$\",c:[a.UTM],r:0}]}});hljs.registerLanguage(\"php\",function(b){var e={cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"};var a={cN:\"preprocessor\",b:/<\\?(php)?|\\?>/};var c={cN:\"string\",c:[b.BE,a],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[b.CLCM,b.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"},a]},{cN:\"comment\",b:\"__halt_compiler.+?;\",eW:true,k:\"__halt_compiler\",l:b.UIR},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[b.BE]},a,e,{cN:\"function\",bK:\"function\",e:/[;{]/,i:\"\\\\$|\\\\[|%\",c:[b.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",e,b.CBLCLM,c,d]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[b.UTM]},{bK:\"use\",e:\";\",c:[b.UTM]},{b:\"=>\"},c,d]}});hljs.registerLanguage(\"parser3\",function(a){return{sL:\"xml\",r:0,c:[{cN:\"comment\",b:\"^#\",e:\"$\"},{cN:\"comment\",b:\"\\\\^rem{\",e:\"}\",r:10,c:[{b:\"{\",e:\"}\",c:[\"self\"]}]},{cN:\"preprocessor\",b:\"^@(?:BASE|USE|CLASS|OPTIONS)$\",r:10},{cN:\"title\",b:\"@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$\"},{cN:\"variable\",b:\"\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?\"},{cN:\"keyword\",b:\"\\\\^[\\\\w\\\\-\\\\.\\\\:]+\"},{cN:\"number\",b:\"\\\\^#[0-9a-fA-F]+\"},a.CNM]}});hljs.registerLanguage(\"actionscript\",function(a){var c=\"[a-zA-Z_$][a-zA-Z0-9_$]*\";var b=\"([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)\";var d={cN:\"rest_arg\",b:\"[.]{3}\",e:c,r:10};return{k:{keyword:\"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with\",literal:\"true false null undefined\"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:\"package\",bK:\"package\",e:\"{\",c:[a.TM]},{cN:\"class\",bK:\"class interface\",e:\"{\",c:[{bK:\"extends implements\"},a.TM]},{cN:\"preprocessor\",bK:\"import include\",e:\";\"},{cN:\"function\",bK:\"function\",e:\"[{;]\",i:\"\\\\S\",c:[a.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,d]},{cN:\"type\",b:\":\",e:b,r:10}]}]}});hljs.registerLanguage(\"nginx\",function(c){var b={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+c.UIR}]};var a={eW:true,l:\"[a-z/_]+\",k:{built_in:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[c.HCM,{cN:\"string\",c:[c.BE,b],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{cN:\"url\",b:\"([a-z]+):/\",e:\"\\\\s\",eW:true,eE:true},{cN:\"regexp\",c:[c.BE,b],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},b]};return{c:[c.HCM,{b:c.UIR+\"\\\\s\",e:\";|{\",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"vhdl\",function(a){return{cI:true,k:{keyword:\"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor\",typename:\"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector\"},i:\"{\",c:[a.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"},a.QSM,a.CNM,{cN:\"literal\",b:\"'(U|X|0|1|Z|W|L|H|-)'\",c:[a.BE]},{cN:\"attribute\",b:\"'[A-Za-z](_?[A-Za-z0-9])*\",c:[a.BE]}]}});hljs.registerLanguage(\"fix\",function(a){return{c:[{b:/[^\\u2401\\u0001]+/,e:/[\\u2401\\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\\u2401\\u0001=]+)/,e:/=([^\\u2401\\u0001=]+)/,rE:true,rB:false,cN:\"attribute\"},{b:/=/,e:/([\\u2401\\u0001])/,eE:true,eB:true,cN:\"string\"}]}],cI:true}});hljs.registerLanguage(\"diff\",function(a){return{c:[{cN:\"chunk\",r:10,v:[{b:/^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"header\",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\\-\\-\\-/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+\\+\\+/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"smalltalk\",function(a){var b=\"[a-z][a-zA-Z0-9_]*\";var d={cN:\"char\",b:\"\\\\$.{1}\"};var c={cN:\"symbol\",b:\"#\"+a.UIR};return{k:\"self super nil true false thisContext\",c:[{cN:\"comment\",b:'\"',e:'\"'},a.ASM,{cN:\"class\",b:\"\\\\b[A-Z][A-Za-z0-9_]*\",r:0},{cN:\"method\",b:b+\":\",r:0},a.CNM,c,d,{cN:\"localvars\",b:\"\\\\|[ ]*\"+b+\"([ ]+\"+b+\")*[ ]*\\\\|\",rB:true,e:/\\|/,i:/\\S/,c:[{b:\"(\\\\|[ ]*)?\"+b}]},{cN:\"array\",b:\"\\\\#\\\\(\",e:\"\\\\)\",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage(\"clojure\",function(l){var e={built_in:\"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize\"};var f=\"[a-zA-Z_0-9\\\\!\\\\.\\\\?\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#\\\\$';]+\";var a=\"[\\\\s:\\\\(\\\\{]+\\\\d+(\\\\.\\\\d+)?\";var d={cN:\"number\",b:a,r:0};var j=l.inherit(l.QSM,{i:null});var o={cN:\"comment\",b:\";\",e:\"$\",r:0};var n={cN:\"collection\",b:\"[\\\\[\\\\{]\",e:\"[\\\\]\\\\}]\"};var c={cN:\"comment\",b:\"\\\\^\"+f};var b={cN:\"comment\",b:\"\\\\^\\\\{\",e:\"\\\\}\"};var h={cN:\"attribute\",b:\"[:]\"+f};var m={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var g={eW:true,k:{literal:\"true false nil\"},r:0};var i={k:e,l:f,cN:\"title\",b:f,starts:g};m.c=[{cN:\"comment\",b:\"comment\"},i,g];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:/\\S/,c:[o,m,{cN:\"prompt\",b:/^=> /,starts:{e:/\\n\\n|\\Z/}}]}});hljs.registerLanguage(\"oxygene\",function(b){var g=\"abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained\";var a={cN:\"comment\",b:\"{\",e:\"}\",r:0};var e={cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",r:10};var c={cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]};var d={cN:\"string\",b:\"(#\\\\d+)+\"};var f={cN:\"function\",bK:\"function constructor destructor procedure method\",e:\"[:;]\",k:\"function constructor|10 destructor|10 procedure|10 method|10\",c:[b.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',c:[a,e,b.CLCM,c,d,b.NM,f,{cN:\"class\",b:\"=\\\\bclass\\\\b\",e:\"end;\",k:g,c:[c,d,a,e,b.CLCM,f]}]}});hljs.registerLanguage(\"asciidoc\",function(a){return{c:[{cN:\"comment\",b:\"^/{4,}\\\\n\",e:\"\\\\n/{4,}$\",r:10},{cN:\"comment\",b:\"^//\",e:\"$\",r:0},{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",r:10},{cN:\"header\",b:\"^(={1,5}) .+?( \\\\1)?$\",r:10},{cN:\"header\",b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\",r:10},{cN:\"attribute\",b:\"^:.+?:\",e:\"\\\\s\",eE:true,r:10},{cN:\"attribute\",b:\"^\\\\[.+?\\\\]$\",r:0},{cN:\"blockquote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",r:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",r:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",r:0}],r:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"label\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",r:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",r:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",r:0}],r:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",r:0},{cN:\"smartquote\",b:\"``.+?''\",r:10},{cN:\"smartquote\",b:\"`.+?'\",r:10},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",r:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",r:0},{cN:\"horizontal_rule\",b:\"^'{3,}[ \\\\t]*$\",r:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:true,c:[{b:\"(link|image:?):\",r:0},{cN:\"link_url\",b:\"\\\\w\",e:\"[^\\\\[]+\",r:0},{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage(\"erlang-repl\",function(a){return{k:{special_functions:\"spawn spawn_link self\",reserved:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"prompt\",b:\"^[0-9]+> \",r:10},{cN:\"comment\",b:\"%\",e:\"$\"},{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0},a.ASM,a.QSM,{cN:\"constant\",b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{cN:\"arrow\",b:\"->\"},{cN:\"ok\",b:\"ok\"},{cN:\"exclamation_mark\",b:\"!\"},{cN:\"function_or_atom\",b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",r:0},{cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_']*\",r:0}]}});hljs.registerLanguage(\"autohotkey\",function(b){var d={cN:\"escape\",b:\"`[\\\\s\\\\S]\"};var c={cN:\"comment\",b:\";\",e:\"$\",r:0};var a=[{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{cN:\"built_in\",bK:\"ComSpec Clipboard ClipboardAll ErrorLevel\"}];return{cI:true,k:{keyword:\"Break Continue Else Gosub If Loop Return While\",literal:\"A true false NOT AND OR\"},c:a.concat([d,b.inherit(b.QSM,{c:[d]}),c,{cN:\"number\",b:b.NR,r:0},{cN:\"var_expand\",b:\"%\",e:\"%\",i:\"\\\\n\",c:[d]},{cN:\"label\",c:[d],v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',r:0}]},{b:\",\\\\s*,\",r:10}])}});hljs.registerLanguage(\"scilab\",function(a){var b=[a.CNM,{cN:\"string\",b:\"'|\\\"\",e:\"'|\\\"\",c:[a.BE,{b:\"''\"}]}];return{k:{keyword:\"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s\",built_in:\"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix\"},i:'(\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function endfunction\",e:\"$\",k:\"function endfunction|10\",c:[a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},],},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",r:0,c:b},{cN:\"comment\",b:\"//\",e:\"$\"}].concat(b)}});\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/1c.js",
    "content": "/*\nLanguage: 1C\nAuthor: Yuri Ivanov <ivanov@supersoft.ru>\nContributors: Sergey Baranov <segyrn@yandex.ru>\n*/\n\nfunction(hljs){\n  var IDENT_RE_RU = '[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*';\n  var OneS_KEYWORDS = 'возврат дата для если и или иначе иначеесли исключение конецесли ' +\n    'конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем ' +\n    'перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл ' +\n    'число экспорт';\n  var OneS_BUILT_IN = 'ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ' +\n    'ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос ' +\n    'восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц ' +\n    'датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации ' +\n    'запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр ' +\n    'значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера ' +\n    'имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы ' +\n    'кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби ' +\n    'конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс ' +\n    'максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ ' +\n    'назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби ' +\n    'началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели ' +\n    'номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки ' +\n    'основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально ' +\n    'отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята ' +\n    'получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта ' +\n    'получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации ' +\n    'пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц ' +\n    'разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына ' +\n    'рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп ' +\n    'сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить ' +\n    'стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента ' +\n    'счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты ' +\n    'установитьтана установитьтапо фиксшаблон формат цел шаблон';\n  var DQUOTE =  {className: 'dquote',  begin: '\"\"'};\n  var STR_START = {\n      className: 'string',\n      begin: '\"', end: '\"|$',\n      contains: [DQUOTE]\n    };\n  var STR_CONT = {\n    className: 'string',\n    begin: '\\\\|', end: '\"|$',\n    contains: [DQUOTE]\n  };\n\n  return {\n    case_insensitive: true,\n    lexemes: IDENT_RE_RU,\n    keywords: {keyword: OneS_KEYWORDS, built_in: OneS_BUILT_IN},\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.NUMBER_MODE,\n      STR_START, STR_CONT,\n      {\n        className: 'function',\n        begin: '(процедура|функция)', end: '$',\n        lexemes: IDENT_RE_RU,\n        keywords: 'процедура функция',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE_RU}),\n          {\n            className: 'tail',\n            endsWithParent: true,\n            contains: [\n              {\n                className: 'params',\n                begin: '\\\\(', end: '\\\\)',\n                lexemes: IDENT_RE_RU,\n                keywords: 'знач',\n                contains: [STR_START, STR_CONT]\n              },\n              {\n                className: 'export',\n                begin: 'экспорт', endsWithParent: true,\n                lexemes: IDENT_RE_RU,\n                keywords: 'экспорт',\n                contains: [hljs.C_LINE_COMMENT_MODE]\n              }\n            ]\n          },\n          hljs.C_LINE_COMMENT_MODE\n        ]\n      },\n      {className: 'preprocessor', begin: '#', end: '$'},\n      {className: 'date', begin: '\\'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})\\''}\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/actionscript.js",
    "content": "/*\nLanguage: ActionScript\nAuthor: Alexander Myadzel <myadzel@gmail.com>\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';\n  var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';\n\n  var AS3_REST_ARG_MODE = {\n    className: 'rest_arg',\n    begin: '[.]{3}', end: IDENT_RE,\n    relevance: 10\n  };\n\n  return {\n    aliases: ['as'],\n    keywords: {\n      keyword: 'as break case catch class const continue default delete do dynamic each ' +\n        'else extends final finally for function get if implements import in include ' +\n        'instanceof interface internal is namespace native new override package private ' +\n        'protected public return set static super switch this throw try typeof use var void ' +\n        'while with',\n      literal: 'true false null undefined'\n    },\n    contains: [\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'package',\n        beginKeywords: 'package', end: '{',\n        contains: [hljs.TITLE_MODE]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.TITLE_MODE\n        ]\n      },\n      {\n        className: 'preprocessor',\n        beginKeywords: 'import include', end: ';'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '[{;]', excludeEnd: true,\n        illegal: '\\\\S',\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              AS3_REST_ARG_MODE\n            ]\n          },\n          {\n            className: 'type',\n            begin: ':',\n            end: IDENT_FUNC_RETURN_TYPE_RE,\n            relevance: 10\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/apache.js",
    "content": "/*\nLanguage: Apache\nAuthor: Ruslan Keba <rukeba@gmail.com>\nContributors: Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: http://rukeba.com/\nDescription: language definition for Apache configuration files (httpd.conf & .htaccess)\n*/\n\nfunction(hljs) {\n  var NUMBER = {className: 'number', begin: '[\\\\$%]\\\\d+'};\n  return {\n    aliases: ['apacheconf'],\n    case_insensitive: true,\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {className: 'tag', begin: '</?', end: '>'},\n      {\n        className: 'keyword',\n        begin: /\\w+/,\n        relevance: 0,\n        // keywords aren’t needed for highlighting per se, they only boost relevance\n        // for a very generally defined mode (starts with a word, ends with line-end\n        keywords: {\n          common:\n            'order deny allow setenv rewriterule rewriteengine rewritecond documentroot ' +\n            'sethandler errordocument loadmodule options header listen serverroot ' +\n            'servername'\n        },\n        starts: {\n          end: /$/,\n          relevance: 0,\n          keywords: {\n            literal: 'on off all'\n          },\n          contains: [\n            {\n              className: 'sqbracket',\n              begin: '\\\\s\\\\[', end: '\\\\]$'\n            },\n            {\n              className: 'cbracket',\n              begin: '[\\\\$%]\\\\{', end: '\\\\}',\n              contains: ['self', NUMBER]\n            },\n            NUMBER,\n            hljs.QUOTE_STRING_MODE\n          ]\n        }\n      }\n    ],\n    illegal: /\\S/\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/applescript.js",
    "content": "/*\nLanguage: AppleScript\nAuthors: Nathan Grigg <nathan@nathanamy.org>\n         Dr. Drang <drdrang@gmail.com>\n*/\n\nfunction(hljs) {\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: ''});\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    contains: ['self', hljs.C_NUMBER_MODE, STRING]\n  };\n  var COMMENTS = [\n    {\n      className: 'comment',\n      begin: '--', end: '$'\n    },\n    {\n      className: 'comment',\n      begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n      contains: ['self', {begin: '--', end: '$'}] //allow nesting\n    },\n    hljs.HASH_COMMENT_MODE\n  ];\n\n  return {\n    aliases: ['osascript'],\n    keywords: {\n      keyword:\n        'about above after against and around as at back before beginning ' +\n        'behind below beneath beside between but by considering ' +\n        'contain contains continue copy div does eighth else end equal ' +\n        'equals error every exit fifth first for fourth from front ' +\n        'get given global if ignoring in into is it its last local me ' +\n        'middle mod my ninth not of on onto or over prop property put ref ' +\n        'reference repeat returning script second set seventh since ' +\n        'sixth some tell tenth that the|0 then third through thru ' +\n        'timeout times to transaction try until where while whose with ' +\n        'without',\n      constant:\n        'AppleScript false linefeed return pi quote result space tab true',\n      type:\n        'alias application boolean class constant date file integer list ' +\n        'number real record string text',\n      command:\n        'activate beep count delay launch log offset read round ' +\n        'run say summarize write',\n      property:\n        'character characters contents day frontmost id item length ' +\n        'month name paragraph paragraphs rest reverse running time version ' +\n        'weekday word words year'\n    },\n    contains: [\n      STRING,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'type',\n        begin: '\\\\bPOSIX file\\\\b'\n      },\n      {\n        className: 'command',\n        begin:\n          '\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|' +\n          'mount volume|path to|(close|open for) access|(get|set) eof|' +\n          'current date|do shell script|get volume settings|random number|' +\n          'set volume|system attribute|system info|time to GMT|' +\n          '(load|run|store) script|scripting components|' +\n          'ASCII (character|number)|localized string|' +\n          'choose (application|color|file|file name|' +\n          'folder|from list|remote application|URL)|' +\n          'display (alert|dialog))\\\\b|^\\\\s*return\\\\b'\n      },\n      {\n        className: 'constant',\n        begin:\n          '\\\\b(text item delimiters|current application|missing value)\\\\b'\n      },\n      {\n        className: 'keyword',\n        begin:\n          '\\\\b(apart from|aside from|instead of|out of|greater than|' +\n          \"isn't|(doesn't|does not) (equal|come before|come after|contain)|\" +\n          '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' +\n          'contained by|comes (before|after)|a (ref|reference))\\\\b'\n      },\n      {\n        className: 'property',\n        begin:\n          '\\\\b(POSIX path|(date|time) string|quoted form)\\\\b'\n      },\n      {\n        className: 'function_start',\n        beginKeywords: 'on',\n        illegal: '[${=;\\\\n]',\n        contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]\n      }\n    ].concat(COMMENTS),\n    illegal: '//'\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/asciidoc.js",
    "content": "/*\nLanguage: AsciiDoc\nRequires: xml.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://google.com/profiles/dan.j.allen\nDescription: A semantic, text-based document format that can be exported to HTML, DocBook and other backends.\n*/\nfunction(hljs) {\n  return {\n    contains: [\n      // block comment\n      {\n        className: 'comment',\n        begin: '^/{4,}\\\\n',\n        end: '\\\\n/{4,}$',\n        // can also be done as...\n        //begin: '^/{4,}$',\n        //end: '^/{4,}$',\n        relevance: 10\n      },\n      // line comment\n      {\n        className: 'comment',\n        begin: '^//',\n        end: '$',\n        relevance: 0\n      },\n      // title\n      {\n        className: 'title',\n        begin: '^\\\\.\\\\w.*$'\n      },\n      // example, admonition & sidebar blocks\n      {\n        begin: '^[=\\\\*]{4,}\\\\n',\n        end: '\\\\n^[=\\\\*]{4,}$',\n        relevance: 10\n      },\n      // headings\n      {\n        className: 'header',\n        begin: '^(={1,5}) .+?( \\\\1)?$',\n        relevance: 10\n      },\n      {\n        className: 'header',\n        begin: '^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$',\n        relevance: 10\n      },\n      // document attributes\n      {\n        className: 'attribute',\n        begin: '^:.+?:',\n        end: '\\\\s',\n        excludeEnd: true,\n        relevance: 10\n      },\n      // block attributes\n      {\n        className: 'attribute',\n        begin: '^\\\\[.+?\\\\]$',\n        relevance: 0\n      },\n      // quoteblocks\n      {\n        className: 'blockquote',\n        begin: '^_{4,}\\\\n',\n        end: '\\\\n_{4,}$',\n        relevance: 10\n      },\n      // listing and literal blocks\n      {\n        className: 'code',\n        begin: '^[\\\\-\\\\.]{4,}\\\\n',\n        end: '\\\\n[\\\\-\\\\.]{4,}$',\n        relevance: 10\n      },\n      // passthrough blocks\n      {\n        begin: '^\\\\+{4,}\\\\n',\n        end: '\\\\n\\\\+{4,}$',\n        contains: [\n          {\n            begin: '<', end: '>',\n            subLanguage: 'xml',\n            relevance: 0\n          }\n        ],\n        relevance: 10\n      },\n      // lists (can only capture indicators)\n      {\n        className: 'bullet',\n        begin: '^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+'\n      },\n      // admonition\n      {\n        className: 'label',\n        begin: '^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+',\n        relevance: 10\n      },\n      // inline strong\n      {\n        className: 'strong',\n        // must not follow a word character or be followed by an asterisk or space\n        begin: '\\\\B\\\\*(?![\\\\*\\\\s])',\n        end: '(\\\\n{2}|\\\\*)',\n        // allow escaped asterisk followed by word char\n        contains: [\n          {\n            begin: '\\\\\\\\*\\\\w',\n            relevance: 0\n          }\n        ]\n      },\n      // inline emphasis\n      {\n        className: 'emphasis',\n        // must not follow a word character or be followed by a single quote or space\n        begin: '\\\\B\\'(?![\\'\\\\s])',\n        end: '(\\\\n{2}|\\')',\n        // allow escaped single quote followed by word char\n        contains: [\n          {\n            begin: '\\\\\\\\\\'\\\\w',\n            relevance: 0\n          }\n        ],\n        relevance: 0\n      },\n      // inline emphasis (alt)\n      {\n        className: 'emphasis',\n        // must not follow a word character or be followed by an underline or space\n        begin: '_(?![_\\\\s])',\n        end: '(\\\\n{2}|_)',\n        relevance: 0\n      },\n      // inline double smart quotes\n      {\n        className: 'smartquote',\n        begin: \"``.+?''\",\n        relevance: 10\n      },\n      // inline single smart quotes\n      {\n        className: 'smartquote',\n        begin: \"`.+?'\",\n        relevance: 10\n      },\n      // inline code snippets (TODO should get same treatment as strong and emphasis)\n      {\n        className: 'code',\n        begin: '(`.+?`|\\\\+.+?\\\\+)',\n        relevance: 0\n      },\n      // indented literal block\n      {\n        className: 'code',\n        begin: '^[ \\\\t]',\n        end: '$',\n        relevance: 0\n      },\n      // horizontal rules\n      {\n        className: 'horizontal_rule',\n        begin: '^\\'{3,}[ \\\\t]*$',\n        relevance: 10\n      },\n      // images and links\n      {\n        begin: '(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]',\n        returnBegin: true,\n        contains: [\n          {\n            //className: 'macro',\n            begin: '(link|image:?):',\n            relevance: 0\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\w',\n            end: '[^\\\\[]+',\n            relevance: 0\n          },\n          {\n            className: 'link_label',\n            begin: '\\\\[',\n            end: '\\\\]',\n            excludeBegin: true,\n            excludeEnd: true,\n            relevance: 0\n          }\n        ],\n        relevance: 10\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/autohotkey.js",
    "content": "/*\nLanguage: AutoHotkey\nAuthor: Seongwon Lee <dlimpid@gmail.com>\nDescription: AutoHotkey language definition\n*/\n\nfunction(hljs) {\n  var BACKTICK_ESCAPE = {\n    className: 'escape',\n    begin: '`[\\\\s\\\\S]'\n  };\n  var COMMENTS = {\n    className: 'comment',\n    begin: ';', end: '$',\n    relevance: 0\n  };\n  var BUILT_IN = [\n    {\n      className: 'built_in',\n      begin: 'A_[a-zA-Z0-9]+'\n    },\n    {\n      className: 'built_in',\n      beginKeywords: 'ComSpec Clipboard ClipboardAll ErrorLevel'\n    }\n  ];\n\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword: 'Break Continue Else Gosub If Loop Return While',\n      literal: 'A true false NOT AND OR'\n    },\n    contains: BUILT_IN.concat([\n      BACKTICK_ESCAPE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [BACKTICK_ESCAPE]}),\n      COMMENTS,\n      {\n        className: 'number',\n        begin: hljs.NUMBER_RE,\n        relevance: 0\n      },\n      {\n        className: 'var_expand', // FIXME\n        begin: '%', end: '%',\n        illegal: '\\\\n',\n        contains: [BACKTICK_ESCAPE]\n      },\n      {\n        className: 'label',\n        contains: [BACKTICK_ESCAPE],\n        variants: [\n          {begin: '^[^\\\\n\";]+::(?!=)'},\n          {begin: '^[^\\\\n\";]+:(?!=)', relevance: 0} // zero relevance as it catches a lot of things\n                                                    // followed by a single ':' in many languages\n        ]\n      },\n      {\n        // consecutive commas, not for highlighting but just for relevance\n        begin: ',\\\\s*,',\n        relevance: 10\n      }\n    ])\n  }\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/avrasm.js",
    "content": "/*\nLanguage: AVR Assembler\nAuthor: Vladimir Ermakov <vooon341@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    lexemes: '\\\\.?' + hljs.IDENT_RE,\n    keywords: {\n      keyword:\n        /* mnemonic */\n        'adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs ' +\n        'brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr ' +\n        'clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor ' +\n        'fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul ' +\n        'muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs ' +\n        'sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub ' +\n        'subi swap tst wdr',\n      built_in:\n        /* general purpose registers */\n        'r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 ' +\n        'r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ' +\n        /* IO Registers (ATMega128) */\n        'ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h ' +\n        'tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ' +\n        'ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ' +\n        'ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk ' +\n        'tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ' +\n        'ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr ' +\n        'porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ' +\n        'ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf',\n      preprocessor:\n        '.byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list ' +\n        '.listmac .macro .nolist .org .set'\n    },\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      {className: 'comment', begin: ';',  end: '$', relevance: 0},\n      hljs.C_NUMBER_MODE, // 0x..., decimal, float\n      hljs.BINARY_NUMBER_MODE, // 0b...\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)' // $..., 0o...\n      },\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'', end: '[^\\\\\\\\]\\'',\n        illegal: '[^\\\\\\\\][^\\']'\n      },\n      {className: 'label',  begin: '^[A-Za-z0-9_.$]+:'},\n      {className: 'preprocessor', begin: '#', end: '$'},\n      {  // подстановка в «.macro»\n        className: 'localvars',\n        begin: '@[0-9]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/axapta.js",
    "content": "/*\nLanguage: Axapta\nAuthor: Dmitri Roudakov <dmitri@roudakov.ru>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: 'false int abstract private char boolean static null if for true ' +\n      'while long throw finally protected final return void enum else ' +\n      'break new catch byte super case short default double public try this switch ' +\n      'continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count ' +\n      'order group by asc desc index hint like dispaly edit client server ttsbegin ' +\n      'ttscommit str real date container anytype common div mod',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        illegal: ':',\n        contains: [\n          {\n            className: 'inheritance',\n            beginKeywords: 'extends implements',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/bash.js",
    "content": "/*\nLanguage: Bash\nAuthor: vah <vahtenberg@gmail.com>\nContributrors: Benjamin Pannell <contact@sierrasoftworks.com>\n*/\n\nfunction(hljs) {\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$[\\w\\d#@][\\w\\d_]*/},\n      {begin: /\\$\\{(.*?)\\}/}\n    ]\n  };\n  var QUOTE_STRING = {\n    className: 'string',\n    begin: /\"/, end: /\"/,\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      VAR,\n      {\n        className: 'variable',\n        begin: /\\$\\(/, end: /\\)/,\n        contains: [hljs.BACKSLASH_ESCAPE]\n      }\n    ]\n  };\n  var APOS_STRING = {\n    className: 'string',\n    begin: /'/, end: /'/\n  };\n\n  return {\n    aliases: ['sh', 'zsh'],\n    lexemes: /-?[a-z\\.]+/,\n    keywords: {\n      keyword:\n        'if then else elif fi for break continue while in do done exit return set '+\n        'declare case esac export exec',\n      literal:\n        'true false',\n      built_in:\n        'printf echo read cd pwd pushd popd dirs let eval unset typeset readonly '+\n        'getopts source shopt caller type hash bind help sudo',\n      operator:\n        '-ne -eq -lt -gt -f -d -e -s -l -a' // relevance booster\n    },\n    contains: [\n      {\n        className: 'shebang',\n        begin: /^#![^\\n]+sh\\s*$/,\n        relevance: 10\n      },\n      {\n        className: 'function',\n        begin: /\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,\n        returnBegin: true,\n        contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\\w[\\w\\d_]*/})],\n        relevance: 0\n      },\n      hljs.HASH_COMMENT_MODE,\n      hljs.NUMBER_MODE,\n      QUOTE_STRING,\n      APOS_STRING,\n      VAR\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/brainfuck.js",
    "content": "/*\nLanguage: Brainfuck\nAuthor: Evgeny Stepanischev <imbolk@gmail.com>\n*/\n\nfunction(hljs){\n  var LITERAL = {\n    className: 'literal',\n    begin: '[\\\\+\\\\-]',\n    relevance: 0\n  };\n  return {\n    aliases: ['bf'],\n    contains: [\n      {\n        className: 'comment',\n        begin: '[^\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]',\n        returnEnd: true,\n        end: '[\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]',\n        relevance: 0\n      },\n      {\n        className: 'title',\n        begin: '[\\\\[\\\\]]',\n        relevance: 0\n      },\n      {\n        className: 'string',\n        begin: '[\\\\.,]',\n        relevance: 0\n      },\n      {\n        // this mode works as the only relevance counter\n        begin: /\\+\\+|\\-\\-/, returnBegin: true,\n        contains: [LITERAL]\n      },\n      LITERAL\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/capnproto.js",
    "content": "/*\nLanguage: Cap’n Proto\nAuthor: Oleg Efimov <efimovov@gmail.com>\nDescription: Cap’n Proto message definition format\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['capnp'],\n    keywords: {\n      keyword:\n        'struct enum interface union group import using const annotation extends in of on as with from fixed',\n      built_in:\n        'Void Bool Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 Float32 Float64 ' +\n        'Text Data AnyPointer AnyStruct Capability List',\n      literal:\n        'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'shebang',\n        begin: /@0x[\\w\\d]{16};/,\n        illegal: /\\n/\n      },\n      {\n        className: 'number',\n        begin: /@\\d+\\b/\n      },\n      {\n        className: 'class',\n        beginKeywords: 'struct enum', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'interface', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/clojure.js",
    "content": "/*\nLanguage: Clojure\nDescription: Clojure syntax (based on lisp.js)\nAuthor: mfornos\n*/\n\nfunction(hljs) {\n  var keywords = {\n    built_in:\n      // Clojure keywords\n      'def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem '+\n      'quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? '+\n      'set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? '+\n      'class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? '+\n      'string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . '+\n      'inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last '+\n      'drop-while while intern condp case reduced cycle split-at split-with repeat replicate '+\n      'iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext '+\n      'nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends '+\n      'add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler '+\n      'set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter '+\n      'monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or '+\n      'when when-not when-let comp juxt partial sequence memoize constantly complement identity assert '+\n      'peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast '+\n      'sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import '+\n      'refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! '+\n      'assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger '+\n      'bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline '+\n      'flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking '+\n      'assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! '+\n      'reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! '+\n      'new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty '+\n      'hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list '+\n      'disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer '+\n      'chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate '+\n      'unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta '+\n      'lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize'\n   };\n\n  var CLJ_IDENT_RE = '[a-zA-Z_0-9\\\\!\\\\.\\\\?\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#\\\\$\\';]+';\n  var SIMPLE_NUMBER_RE = '[\\\\s:\\\\(\\\\{]+\\\\d+(\\\\.\\\\d+)?';\n\n  var NUMBER = {\n    className: 'number', begin: SIMPLE_NUMBER_RE,\n    relevance: 0\n  };\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});\n  var COMMENT = {\n    className: 'comment',\n    begin: ';', end: '$',\n    relevance: 0\n  };\n  var COLLECTION = {\n    className: 'collection',\n    begin: '[\\\\[\\\\{]', end: '[\\\\]\\\\}]'\n  };\n  var HINT = {\n    className: 'comment',\n    begin: '\\\\^' + CLJ_IDENT_RE\n  };\n  var HINT_COL = {\n    className: 'comment',\n    begin: '\\\\^\\\\{', end: '\\\\}'\n\n  };\n  var KEY = {\n    className: 'attribute',\n    begin: '[:]' + CLJ_IDENT_RE\n  };\n  var LIST = {\n    className: 'list',\n    begin: '\\\\(', end: '\\\\)'\n  };\n  var BODY = {\n    endsWithParent: true,\n    keywords: {literal: 'true false nil'},\n    relevance: 0\n  };\n  var TITLE = {\n    keywords: keywords,\n    lexemes: CLJ_IDENT_RE,\n    className: 'title', begin: CLJ_IDENT_RE,\n    starts: BODY\n  };\n\n  LIST.contains = [{className: 'comment', begin: 'comment'}, TITLE, BODY];\n  BODY.contains = [LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER];\n  COLLECTION.contains = [LIST, STRING, HINT, COMMENT, KEY, COLLECTION, NUMBER];\n\n  return {\n    aliases: ['clj'],\n    illegal: /\\S/,\n    contains: [\n      COMMENT,\n      LIST,\n      {\n        className: 'prompt',\n        begin: /^=> /,\n        starts: {end: /\\n\\n|\\Z/} // eat up prompt output to not interfere with the illegal\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/cmake.js",
    "content": "/*\nLanguage: CMake\nDescription: CMake is an open-source cross-platform system for build automation.\nAuthor: Igor Kalnitsky <igor@kalnitsky.org>\nWebsite: http://kalnitsky.org/\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['cmake.in'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'add_custom_command add_custom_target add_definitions add_dependencies ' +\n        'add_executable add_library add_subdirectory add_test aux_source_directory ' +\n        'break build_command cmake_minimum_required cmake_policy configure_file ' +\n        'create_test_sourcelist define_property else elseif enable_language enable_testing ' +\n        'endforeach endfunction endif endmacro endwhile execute_process export find_file ' +\n        'find_library find_package find_path find_program fltk_wrap_ui foreach function ' +\n        'get_cmake_property get_directory_property get_filename_component get_property ' +\n        'get_source_file_property get_target_property get_test_property if include ' +\n        'include_directories include_external_msproject include_regular_expression install ' +\n        'link_directories load_cache load_command macro mark_as_advanced message option ' +\n        'output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return ' +\n        'separate_arguments set set_directory_properties set_property ' +\n        'set_source_files_properties set_target_properties set_tests_properties site_name ' +\n        'source_group string target_link_libraries try_compile try_run unset variable_watch ' +\n        'while build_name exec_program export_library_dependencies install_files ' +\n        'install_programs install_targets link_libraries make_directory remove subdir_depends ' +\n        'subdirs use_mangled_mesa utility_source variable_requires write_file ' +\n        'qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or',\n      operator:\n        'equal less greater strless strgreater strequal matches'\n    },\n    contains: [\n      {\n        className: 'envvar',\n        begin: '\\\\${', end: '}'\n      },\n      hljs.HASH_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/coffeescript.js",
    "content": "/*\nLanguage: CoffeeScript\nAuthor: Dmytrii Nagirniak <dnagir@gmail.com>\nContributors: Oleg Efimov <efimovov@gmail.com>, Cédric Néhémie <cedric.nehemie@gmail.com>\nDescription: CoffeeScript is a programming language that transcompiles to JavaScript. For info about language see http://coffeescript.org/\n*/\n\nfunction(hljs) {\n  var KEYWORDS = {\n    keyword:\n      // JS keywords\n      'in if for while finally new do return else break catch instanceof throw try this ' +\n      'switch continue typeof delete debugger super ' +\n      // Coffee keywords\n      'then unless until loop of by when and or is isnt not',\n    literal:\n      // JS literals\n      'true false null undefined ' +\n      // Coffee literals\n      'yes no on off',\n    reserved:\n      'case default function var void with const let enum export import native ' +\n      '__hasProp __extends __slice __bind __indexOf',\n    built_in:\n      'npm require console print module global window document'\n  };\n  var JS_IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\n  var TITLE = hljs.inherit(hljs.TITLE_MODE, {begin: JS_IDENT_RE});\n  var SUBST = {\n    className: 'subst',\n    begin: /#\\{/, end: /}/,\n    keywords: KEYWORDS\n  };\n  var EXPRESSIONS = [\n    hljs.BINARY_NUMBER_MODE,\n    hljs.inherit(hljs.C_NUMBER_MODE, {starts: {end: '(\\\\s*/)?', relevance: 0}}), // a number tries to eat the following slash to prevent treating it as a regexp\n    {\n      className: 'string',\n      variants: [\n        {\n          begin: /'''/, end: /'''/,\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: /'/, end: /'/,\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: /\"\"\"/, end: /\"\"\"/,\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST]\n        },\n        {\n          begin: /\"/, end: /\"/,\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST]\n        }\n      ]\n    },\n    {\n      className: 'regexp',\n      variants: [\n        {\n          begin: '///', end: '///',\n          contains: [SUBST, hljs.HASH_COMMENT_MODE]\n        },\n        {\n          begin: '//[gim]*',\n          relevance: 0\n        },\n        {\n          begin: '/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)' // \\S is required to parse x / 2 / 3 as two divisions\n        }\n      ]\n    },\n    {\n      className: 'property',\n      begin: '@' + JS_IDENT_RE\n    },\n    {\n      begin: '`', end: '`',\n      excludeBegin: true, excludeEnd: true,\n      subLanguage: 'javascript'\n    }\n  ];\n  SUBST.contains = EXPRESSIONS;\n\n  return {\n    aliases: ['coffee', 'cson', 'iced'],\n    keywords: KEYWORDS,\n    contains: EXPRESSIONS.concat([\n      {\n        className: 'comment',\n        begin: '###', end: '###'\n      },\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'function',\n        begin: '(' + JS_IDENT_RE + '\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>', end: '[-=]>',\n        returnBegin: true,\n        contains: [\n          TITLE,\n          {\n            className: 'params',\n            begin: '\\\\(', returnBegin: true,\n            /* We need another contained nameless mode to not have every nested\n            pair of parens to be called \"params\" */\n            contains: [{\n              begin: /\\(/, end: /\\)/,\n              keywords: KEYWORDS,\n              contains: ['self'].concat(EXPRESSIONS)\n            }]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class',\n        end: '$',\n        illegal: /[:=\"\\[\\]]/,\n        contains: [\n          {\n            beginKeywords: 'extends',\n            endsWithParent: true,\n            illegal: /[:=\"\\[\\]]/,\n            contains: [TITLE]\n          },\n          TITLE\n        ]\n      },\n      {\n        className: 'attribute',\n        begin: JS_IDENT_RE + ':', end: ':',\n        returnBegin: true, excludeEnd: true,\n        relevance: 0\n      }\n    ])\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/cpp.js",
    "content": "/*\nLanguage: C++\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Zaven Muradyan <megalivoithos@gmail.com>\n*/\n\nfunction(hljs) {\n  var CPP_KEYWORDS = {\n    keyword: 'false int float while private char catch export virtual operator sizeof ' +\n      'dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace ' +\n      'unsigned long throw volatile static protected bool template mutable if public friend ' +\n      'do return goto auto void enum else break new extern using true class asm case typeid ' +\n      'short reinterpret_cast|10 default double register explicit signed typename try this ' +\n      'switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype ' +\n      'noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary',\n    built_in: 'std string cin cout cerr clog stringstream istringstream ostringstream ' +\n      'auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set ' +\n      'unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos ' +\n      'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp ' +\n      'fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper ' +\n      'isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow ' +\n      'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp ' +\n      'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan ' +\n      'vfprintf vprintf vsprintf'\n  };\n  return {\n    aliases: ['c', 'h', 'c++', 'h++'],\n    keywords: CPP_KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'\\\\\\\\?.', end: '\\'',\n        illegal: '.'\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)'\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elif endif define undef warning error line pragma',\n        contains: [\n          {\n            begin: 'include\\\\s*[<\"]', end: '[>\"]',\n            keywords: 'include',\n            illegal: '\\\\n'\n          },\n          hljs.C_LINE_COMMENT_MODE\n        ]\n      },\n      {\n        className: 'stl_container',\n        begin: '\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<', end: '>',\n        keywords: CPP_KEYWORDS,\n        contains: ['self']\n      },\n      {\n        begin: hljs.IDENT_RE + '::'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/cs.js",
    "content": "/*\nLanguage: C#\nAuthor: Jason Diamond <jason@diamond.name>\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    // Normal keywords.\n    'abstract as base bool break byte case catch char checked const continue decimal ' +\n    'default delegate do double else enum event explicit extern false finally fixed float ' +\n    'for foreach goto if implicit in int interface internal is lock long new null ' +\n    'object operator out override params private protected public readonly ref return sbyte ' +\n    'sealed short sizeof stackalloc static string struct switch this throw true try typeof ' +\n    'uint ulong unchecked unsafe ushort using virtual volatile void while async await ' +\n    // Contextual keywords.\n    'ascending descending from get group into join let orderby partial select set value var ' +\n    'where yield';\n  return {\n    aliases: ['csharp'],\n    keywords: KEYWORDS,\n    illegal: /::/,\n    contains: [\n      {\n        className: 'comment',\n        begin: '///', end: '$', returnBegin: true,\n        contains: [\n          {\n            className: 'xmlDocTag',\n            variants: [\n              {\n                begin: '///', relevance: 0\n              },\n              {\n                begin: '<!--|-->'\n              },\n              {\n                begin: '</?', end: '>'\n              }\n            ]\n          }\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elif endif define undef warning error line region endregion pragma checksum'\n      },\n      {\n        className: 'string',\n        begin: '@\"', end: '\"',\n        contains: [{begin: '\"\"'}]\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        beginKeywords: 'protected public private internal', end: /[{;=]/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            beginKeywords: 'class namespace interface',\n            starts: {\n              contains: [hljs.TITLE_MODE]\n            }\n          },\n          {\n            begin: hljs.IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n            contains: [\n              hljs.TITLE_MODE\n            ]\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/css.js",
    "content": "/*\nLanguage: CSS\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  var FUNCTION = {\n    className: 'function',\n    begin: IDENT_RE + '\\\\(', \n    returnBegin: true,\n    excludeEnd: true,\n    end: '\\\\('\n  };\n  return {\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'id', begin: '\\\\#[A-Za-z0-9_-]+'\n      },\n      {\n        className: 'class', begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'attr_selector',\n        begin: '\\\\[', end: '\\\\]',\n        illegal: '$'\n      },\n      {\n        className: 'pseudo',\n        begin: ':(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\"\\\\\\']+'\n      },\n      {\n        className: 'at_rule',\n        begin: '@(font-face|page)',\n        lexemes: '[a-z-]+',\n        keywords: 'font-face page'\n      },\n      {\n        className: 'at_rule',\n        begin: '@', end: '[{;]', // at_rule eating first \"{\" is a good thing\n                                 // because it doesn’t let it to be parsed as\n                                 // a rule set but instead drops parser into\n                                 // the default mode which is how it should be.\n        contains: [\n          {\n            className: 'keyword',\n            begin: /\\S+/\n          },\n          {\n            begin: /\\s/, endsWithParent: true, excludeEnd: true,\n            relevance: 0,\n            contains: [\n              FUNCTION,\n              hljs.APOS_STRING_MODE, hljs.QUOTE_STRING_MODE,\n              hljs.CSS_NUMBER_MODE\n            ]\n          }\n        ]\n      },\n      {\n        className: 'tag', begin: IDENT_RE,\n        relevance: 0\n      },\n      {\n        className: 'rules',\n        begin: '{', end: '}',\n        illegal: '[^\\\\s]',\n        relevance: 0,\n        contains: [\n          hljs.C_BLOCK_COMMENT_MODE,\n          {\n            className: 'rule',\n            begin: '[^\\\\s]', returnBegin: true, end: ';', endsWithParent: true,\n            contains: [\n              {\n                className: 'attribute',\n                begin: '[A-Z\\\\_\\\\.\\\\-]+', end: ':',\n                excludeEnd: true,\n                illegal: '[^\\\\s]',\n                starts: {\n                  className: 'value',\n                  endsWithParent: true, excludeEnd: true,\n                  contains: [\n                    FUNCTION,\n                    hljs.CSS_NUMBER_MODE,\n                    hljs.QUOTE_STRING_MODE,\n                    hljs.APOS_STRING_MODE,\n                    hljs.C_BLOCK_COMMENT_MODE,\n                    {\n                      className: 'hexcolor', begin: '#[0-9A-Fa-f]+'\n                    },\n                    {\n                      className: 'important', begin: '!important'\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/d.js",
    "content": "/*\nLanguage: D\nAuthor: Aleksandar Ruzicic <aleksandar@ruzicic.info>\nDescription: D is a language with C-like syntax and static typing. It pragmatically combines efficiency, control, and modeling power, with safety and programmer productivity.\nVersion: 1.0a\nDate: 2012-04-08\n*/\n\n/**\n * Known issues:\n *\n * - invalid hex string literals will be recognized as a double quoted strings\n *   but 'x' at the beginning of string will not be matched\n *\n * - delimited string literals are not checked for matching end delimiter\n *   (not possible to do with js regexp)\n *\n * - content of token string is colored as a string (i.e. no keyword coloring inside a token string)\n *   also, content of token string is not validated to contain only valid D tokens\n *\n * - special token sequence rule is not strictly following D grammar (anything following #line\n *   up to the end of line is matched as special token sequence)\n */\n\nfunction(hljs) {\n  /**\n   * Language keywords\n   *\n   * @type {Object}\n   */\n  var D_KEYWORDS = {\n    keyword:\n      'abstract alias align asm assert auto body break byte case cast catch class ' +\n      'const continue debug default delete deprecated do else enum export extern final ' +\n      'finally for foreach foreach_reverse|10 goto if immutable import in inout int ' +\n      'interface invariant is lazy macro mixin module new nothrow out override package ' +\n      'pragma private protected public pure ref return scope shared static struct ' +\n      'super switch synchronized template this throw try typedef typeid typeof union ' +\n      'unittest version void volatile while with __FILE__ __LINE__ __gshared|10 ' +\n      '__thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__',\n    built_in:\n      'bool cdouble cent cfloat char creal dchar delegate double dstring float function ' +\n      'idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar ' +\n      'wstring',\n    literal:\n      'false null true'\n  };\n\n  /**\n   * Number literal regexps\n   *\n   * @type {String}\n   */\n  var decimal_integer_re = '(0|[1-9][\\\\d_]*)',\n    decimal_integer_nosus_re = '(0|[1-9][\\\\d_]*|\\\\d[\\\\d_]*|[\\\\d_]+?\\\\d)',\n    binary_integer_re = '0[bB][01_]+',\n    hexadecimal_digits_re = '([\\\\da-fA-F][\\\\da-fA-F_]*|_[\\\\da-fA-F][\\\\da-fA-F_]*)',\n    hexadecimal_integer_re = '0[xX]' + hexadecimal_digits_re,\n\n    decimal_exponent_re = '([eE][+-]?' + decimal_integer_nosus_re + ')',\n    decimal_float_re = '(' + decimal_integer_nosus_re + '(\\\\.\\\\d*|' + decimal_exponent_re + ')|' +\n                '\\\\d+\\\\.' + decimal_integer_nosus_re + decimal_integer_nosus_re + '|' +\n                '\\\\.' + decimal_integer_re + decimal_exponent_re + '?' +\n              ')',\n    hexadecimal_float_re = '(0[xX](' +\n                  hexadecimal_digits_re + '\\\\.' + hexadecimal_digits_re + '|'+\n                  '\\\\.?' + hexadecimal_digits_re +\n                 ')[pP][+-]?' + decimal_integer_nosus_re + ')',\n\n    integer_re = '(' +\n      decimal_integer_re + '|' +\n      binary_integer_re  + '|' +\n       hexadecimal_integer_re   +\n    ')',\n\n    float_re = '(' +\n      hexadecimal_float_re + '|' +\n      decimal_float_re  +\n    ')';\n\n  /**\n   * Escape sequence supported in D string and character literals\n   *\n   * @type {String}\n   */\n  var escape_sequence_re = '\\\\\\\\(' +\n              '[\\'\"\\\\?\\\\\\\\abfnrtv]|' +  // common escapes\n              'u[\\\\dA-Fa-f]{4}|' +     // four hex digit unicode codepoint\n              '[0-7]{1,3}|' +       // one to three octal digit ascii char code\n              'x[\\\\dA-Fa-f]{2}|' +    // two hex digit ascii char code\n              'U[\\\\dA-Fa-f]{8}' +      // eight hex digit unicode codepoint\n              ')|' +\n              '&[a-zA-Z\\\\d]{2,};';      // named character entity\n\n  /**\n   * D integer number literals\n   *\n   * @type {Object}\n   */\n  var D_INTEGER_MODE = {\n    className: 'number',\n      begin: '\\\\b' + integer_re + '(L|u|U|Lu|LU|uL|UL)?',\n      relevance: 0\n  };\n\n  /**\n   * [D_FLOAT_MODE description]\n   * @type {Object}\n   */\n  var D_FLOAT_MODE = {\n    className: 'number',\n    begin: '\\\\b(' +\n        float_re + '([fF]|L|i|[fF]i|Li)?|' +\n        integer_re + '(i|[fF]i|Li)' +\n      ')',\n    relevance: 0\n  };\n\n  /**\n   * D character literal\n   *\n   * @type {Object}\n   */\n  var D_CHARACTER_MODE = {\n    className: 'string',\n    begin: '\\'(' + escape_sequence_re + '|.)', end: '\\'',\n    illegal: '.'\n  };\n\n  /**\n   * D string escape sequence\n   *\n   * @type {Object}\n   */\n  var D_ESCAPE_SEQUENCE = {\n    begin: escape_sequence_re,\n    relevance: 0\n  };\n\n  /**\n   * D double quoted string literal\n   *\n   * @type {Object}\n   */\n  var D_STRING_MODE = {\n    className: 'string',\n    begin: '\"',\n    contains: [D_ESCAPE_SEQUENCE],\n    end: '\"[cwd]?'\n  };\n\n  /**\n   * D wysiwyg and delimited string literals\n   *\n   * @type {Object}\n   */\n  var D_WYSIWYG_DELIMITED_STRING_MODE = {\n    className: 'string',\n    begin: '[rq]\"',\n    end: '\"[cwd]?',\n    relevance: 5\n  };\n\n  /**\n   * D alternate wysiwyg string literal\n   *\n   * @type {Object}\n   */\n  var D_ALTERNATE_WYSIWYG_STRING_MODE = {\n    className: 'string',\n    begin: '`',\n    end: '`[cwd]?'\n  };\n\n  /**\n   * D hexadecimal string literal\n   *\n   * @type {Object}\n   */\n  var D_HEX_STRING_MODE = {\n    className: 'string',\n    begin: 'x\"[\\\\da-fA-F\\\\s\\\\n\\\\r]*\"[cwd]?',\n    relevance: 10\n  };\n\n  /**\n   * D delimited string literal\n   *\n   * @type {Object}\n   */\n  var D_TOKEN_STRING_MODE = {\n    className: 'string',\n    begin: 'q\"\\\\{',\n    end: '\\\\}\"'\n  };\n\n  /**\n   * Hashbang support\n   *\n   * @type {Object}\n   */\n  var D_HASHBANG_MODE = {\n    className: 'shebang',\n    begin: '^#!',\n    end: '$',\n    relevance: 5\n  };\n\n  /**\n   * D special token sequence\n   *\n   * @type {Object}\n   */\n  var D_SPECIAL_TOKEN_SEQUENCE_MODE = {\n    className: 'preprocessor',\n    begin: '#(line)',\n    end: '$',\n    relevance: 5\n  };\n\n  /**\n   * D attributes\n   *\n   * @type {Object}\n   */\n  var D_ATTRIBUTE_MODE = {\n    className: 'keyword',\n    begin: '@[a-zA-Z_][a-zA-Z_\\\\d]*'\n  };\n\n  /**\n   * D nesting comment\n   *\n   * @type {Object}\n   */\n  var D_NESTING_COMMENT_MODE = {\n    className: 'comment',\n    begin: '\\\\/\\\\+',\n    contains: ['self'],\n    end: '\\\\+\\\\/',\n    relevance: 10\n  };\n\n  return {\n    lexemes: hljs.UNDERSCORE_IDENT_RE,\n    keywords: D_KEYWORDS,\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n        hljs.C_BLOCK_COMMENT_MODE,\n        D_NESTING_COMMENT_MODE,\n        D_HEX_STRING_MODE,\n        D_STRING_MODE,\n        D_WYSIWYG_DELIMITED_STRING_MODE,\n        D_ALTERNATE_WYSIWYG_STRING_MODE,\n        D_TOKEN_STRING_MODE,\n        D_FLOAT_MODE,\n        D_INTEGER_MODE,\n        D_CHARACTER_MODE,\n        D_HASHBANG_MODE,\n        D_SPECIAL_TOKEN_SEQUENCE_MODE,\n        D_ATTRIBUTE_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/delphi.js",
    "content": "/*\nLanguage: Delphi\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    'exports register file shl array record property for mod while set ally label uses raise not ' +\n    'stored class safecall var interface or private static exit index inherited to else stdcall ' +\n    'override shr asm far resourcestring finalization packed virtual out and protected library do ' +\n    'xorwrite goto near function end div overload object unit begin string on inline repeat until ' +\n    'destructor write message program with read initialization except default nil if case cdecl in ' +\n    'downto threadvar of try pascal const external constructor type public then implementation ' +\n    'finally published procedure';\n  var COMMENT =  {\n    className: 'comment',\n    variants: [\n      {begin: /\\{/, end: /\\}/, relevance: 0},\n      {begin: /\\(\\*/, end: /\\*\\)/, relevance: 10}\n    ]\n  };\n  var STRING = {\n    className: 'string',\n    begin: /'/, end: /'/,\n    contains: [{begin: /''/}]\n  };\n  var CHAR_STRING = {\n    className: 'string', begin: /(#\\d+)+/\n  };\n  var CLASS = {\n    begin: hljs.IDENT_RE + '\\\\s*=\\\\s*class\\\\s*\\\\(', returnBegin: true,\n    contains: [\n      hljs.TITLE_MODE\n    ]\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'function constructor destructor procedure', end: /[:;]/,\n    keywords: 'function constructor|10 destructor|10 procedure|10',\n    contains: [\n      hljs.TITLE_MODE,\n      {\n        className: 'params',\n        begin: /\\(/, end: /\\)/,\n        keywords: KEYWORDS,\n        contains: [STRING, CHAR_STRING]\n      },\n      COMMENT\n    ]\n  };\n  return {\n    case_insensitive: true,\n    keywords: KEYWORDS,\n    illegal: /(\"|\\$[G-Zg-z]|\\/\\*|<\\/)/,\n    contains: [\n      COMMENT, hljs.C_LINE_COMMENT_MODE,\n      STRING, CHAR_STRING,\n      hljs.NUMBER_MODE,\n      CLASS,\n      FUNCTION\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/diff.js",
    "content": "/*\nLanguage: Diff\nDescription: Unified and context diff\nAuthor: Vasily Polovnyov <vast@whiteants.net>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['patch'],\n    contains: [\n      {\n        className: 'chunk',\n        relevance: 10,\n        variants: [\n          {begin: /^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},\n          {begin: /^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},\n          {begin: /^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}\n        ]\n      },\n      {\n        className: 'header',\n        variants: [\n          {begin: /Index: /, end: /$/},\n          {begin: /=====/, end: /=====$/},\n          {begin: /^\\-\\-\\-/, end: /$/},\n          {begin: /^\\*{3} /, end: /$/},\n          {begin: /^\\+\\+\\+/, end: /$/},\n          {begin: /\\*{5}/, end: /\\*{5}$/}\n        ]\n      },\n      {\n        className: 'addition',\n        begin: '^\\\\+', end: '$'\n      },\n      {\n        className: 'deletion',\n        begin: '^\\\\-', end: '$'\n      },\n      {\n        className: 'change',\n        begin: '^\\\\!', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/django.js",
    "content": "/*\nLanguage: Django\nRequires: xml.js\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Ilya Baryshev <baryshev@gmail.com>\n*/\n\nfunction(hljs) {\n  var FILTER = {\n    className: 'filter',\n    begin: /\\|[A-Za-z]+\\:?/,\n    keywords:\n      'truncatewords removetags linebreaksbr yesno get_digit timesince random striptags ' +\n      'filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands ' +\n      'title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode ' +\n      'timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort ' +\n      'dictsortreversed default_if_none pluralize lower join center default ' +\n      'truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first ' +\n      'escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize ' +\n      'localtime utc timezone',\n    contains: [\n      {className: 'argument', begin: /\"/, end: /\"/},\n      {className: 'argument', begin: /'/, end: /'/}\n    ]\n  };\n\n  return {\n    aliases: ['jinja'],\n    case_insensitive: true,\n    subLanguage: 'xml', subLanguageMode: 'continuous',\n    contains: [\n      {\n        className: 'template_comment',\n        begin: /\\{%\\s*comment\\s*%}/, end: /\\{%\\s*endcomment\\s*%}/\n      },\n      {\n        className: 'template_comment',\n        begin: /\\{#/, end: /#}/\n      },\n      {\n        className: 'template_tag',\n        begin: /\\{%/, end: /%}/,\n        keywords:\n          'comment endcomment load templatetag ifchanged endifchanged if endif firstof for ' +\n          'endfor in ifnotequal endifnotequal widthratio extends include spaceless ' +\n          'endspaceless regroup by as ifequal endifequal ssi now with cycle url filter ' +\n          'endfilter debug block endblock else autoescape endautoescape csrf_token empty elif ' +\n          'endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix ' +\n          'plural get_current_language language get_available_languages ' +\n          'get_current_language_bidi get_language_info get_language_info_list localize ' +\n          'endlocalize localtime endlocaltime timezone endtimezone get_current_timezone ' +\n          'verbatim',\n        contains: [FILTER]\n      },\n      {\n        className: 'variable',\n        begin: /\\{\\{/, end: /}}/,\n        contains: [FILTER]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/dos.js",
    "content": "/*\nLanguage: DOS .bat\nAuthor: Alexander Makarov (http://rmcreative.ru/)\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['bat', 'cmd'],\n    case_insensitive: true,\n    keywords: {\n      flow: 'if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq',\n      keyword: 'shift cd dir echo setlocal endlocal set pause copy',\n      stream: 'prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux',\n      winutils: 'ping net ipconfig taskkill xcopy ren del'\n    },\n    contains: [\n      {\n        className: 'envvar', begin: '%%[^ ]'\n      },\n      {\n        className: 'envvar', begin: '%[^ ]+?%'\n      },\n      {\n        className: 'envvar', begin: '![^ ]+?!'\n      },\n      {\n        className: 'number', begin: '\\\\b\\\\d+',\n        relevance: 0\n      },\n      {\n        className: 'comment',\n        begin: '@?rem', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/elixir.js",
    "content": "/*\nLanguage: Elixir\nAuthor: Josh Adams <josh@isotope11.com>\nDescription: language definition for Elixir source code files (.ex and .exs).  Based on ruby language support.\n*/\n\nfunction(hljs) {\n  var ELIXIR_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_]*(\\\\!|\\\\?)?';\n  var ELIXIR_METHOD_RE = '[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?';\n  var ELIXIR_KEYWORDS =\n    'and false then defined module in return redo retry end for true self when ' +\n    'next until do begin unless nil break not case cond alias while ensure or ' +\n    'include use alias fn quote';\n  var SUBST = {\n    className: 'subst',\n    begin: '#\\\\{', end: '}',\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n    variants: [\n      {\n        begin: /'/, end: /'/\n      },\n      {\n        begin: /\"/, end: /\"/\n      }\n    ]\n  };\n  var PARAMS = {\n    endsWithParent: true, returnEnd: true,\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS,\n    relevance: 0\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'def defmacro', end: /\\bdo\\b/,\n    contains: [\n      hljs.inherit(hljs.TITLE_MODE, {\n        begin: ELIXIR_METHOD_RE,\n        starts: PARAMS\n      })\n    ]\n  };\n  var CLASS = hljs.inherit(FUNCTION, {\n    className: 'class',\n    beginKeywords: 'defmodule defrecord', end: /\\bdo\\b|$|;/\n  })\n  var ELIXIR_DEFAULT_CONTAINS = [\n    STRING,\n    hljs.HASH_COMMENT_MODE,\n    CLASS,\n    FUNCTION,\n    {\n      className: 'constant',\n      begin: '(\\\\b[A-Z_]\\\\w*(.)?)+',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':',\n      contains: [STRING, {begin: ELIXIR_METHOD_RE}],\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ELIXIR_IDENT_RE + ':',\n      relevance: 0\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    {\n      className: 'variable',\n      begin: '(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))'\n    },\n    {\n      begin: '->'\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + ')\\\\s*',\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        {\n          className: 'regexp',\n          illegal: '\\\\n',\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n          variants: [\n            {\n              begin: '/', end: '/[a-z]*'\n            },\n            {\n              begin: '%r\\\\[', end: '\\\\][a-z]*'\n            }\n          ]\n        }\n      ],\n      relevance: 0\n    }\n  ];\n  SUBST.contains = ELIXIR_DEFAULT_CONTAINS;\n  PARAMS.contains = ELIXIR_DEFAULT_CONTAINS;\n\n  return {\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS,\n    contains: ELIXIR_DEFAULT_CONTAINS\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/erlang-repl.js",
    "content": "/*\n Language: Erlang REPL\n Author: Sergey Ignatov <sergey@ignatov.spb.su>\n */\n\nfunction(hljs) {\n  return {\n    keywords: {\n      special_functions:\n        'spawn spawn_link self',\n      reserved:\n        'after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if ' +\n        'let not of or orelse|10 query receive rem try when xor'\n    },\n    contains: [\n      {\n        className: 'prompt', begin: '^[0-9]+> ',\n        relevance: 10\n      },\n      {\n        className: 'comment',\n        begin: '%', end: '$'\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)',\n        relevance: 0\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'constant', begin: '\\\\?(::)?([A-Z]\\\\w*(::)?)+'\n      },\n      {\n        className: 'arrow', begin: '->'\n      },\n      {\n        className: 'ok', begin: 'ok'\n      },\n      {\n        className: 'exclamation_mark', begin: '!'\n      },\n      {\n        className: 'function_or_atom',\n        begin: '(\\\\b[a-z\\'][a-zA-Z0-9_\\']*:[a-z\\'][a-zA-Z0-9_\\']*)|(\\\\b[a-z\\'][a-zA-Z0-9_\\']*)',\n        relevance: 0\n      },\n      {\n        className: 'variable',\n        begin: '[A-Z][a-zA-Z0-9_\\']*',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/erlang.js",
    "content": "/*\nLanguage: Erlang\nDescription: Erlang is a general-purpose functional language, with strict evaluation, single assignment, and dynamic typing.\nAuthor: Nikolay Zakharov <nikolay.desh@gmail.com>, Dmitry Kovega <arhibot@gmail.com>\n*/\n\nfunction(hljs) {\n  var BASIC_ATOM_RE = '[a-z\\'][a-zA-Z0-9_\\']*';\n  var FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';\n  var ERLANG_RESERVED = {\n    keyword:\n      'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let ' +\n      'not of orelse|10 query receive rem try when xor',\n    literal:\n      'false true'\n  };\n\n  var COMMENT = {\n    className: 'comment',\n    begin: '%', end: '$'\n  };\n  var NUMBER = {\n    className: 'number',\n    begin: '\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)',\n    relevance: 0\n  };\n  var NAMED_FUN = {\n    begin: 'fun\\\\s+' + BASIC_ATOM_RE + '/\\\\d+'\n  };\n  var FUNCTION_CALL = {\n    begin: FUNCTION_NAME_RE + '\\\\(', end: '\\\\)',\n    returnBegin: true,\n    relevance: 0,\n    contains: [\n      {\n        className: 'function_name', begin: FUNCTION_NAME_RE,\n        relevance: 0\n      },\n      {\n        begin: '\\\\(', end: '\\\\)', endsWithParent: true,\n        returnEnd: true,\n        relevance: 0\n        // \"contains\" defined later\n      }\n    ]\n  };\n  var TUPLE = {\n    className: 'tuple',\n    begin: '{', end: '}',\n    relevance: 0\n    // \"contains\" defined later\n  };\n  var VAR1 = {\n    className: 'variable',\n    begin: '\\\\b_([A-Z][A-Za-z0-9_]*)?',\n    relevance: 0\n  };\n  var VAR2 = {\n    className: 'variable',\n    begin: '[A-Z][a-zA-Z0-9_]*',\n    relevance: 0\n  };\n  var RECORD_ACCESS = {\n    begin: '#' + hljs.UNDERSCORE_IDENT_RE,\n    relevance: 0,\n    returnBegin: true,\n    contains: [\n      {\n        className: 'record_name',\n        begin: '#' + hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: '{', end: '}',\n        relevance: 0\n        // \"contains\" defined later\n      }\n    ]\n  };\n\n  var BLOCK_STATEMENTS = {\n    beginKeywords: 'fun receive if try case', end: 'end',\n    keywords: ERLANG_RESERVED\n  };\n  BLOCK_STATEMENTS.contains = [\n    COMMENT,\n    NAMED_FUN,\n    hljs.inherit(hljs.APOS_STRING_MODE, {className: ''}),\n    BLOCK_STATEMENTS,\n    FUNCTION_CALL,\n    hljs.QUOTE_STRING_MODE,\n    NUMBER,\n    TUPLE,\n    VAR1, VAR2,\n    RECORD_ACCESS\n  ];\n\n  var BASIC_MODES = [\n    COMMENT,\n    NAMED_FUN,\n    BLOCK_STATEMENTS,\n    FUNCTION_CALL,\n    hljs.QUOTE_STRING_MODE,\n    NUMBER,\n    TUPLE,\n    VAR1, VAR2,\n    RECORD_ACCESS\n  ];\n  FUNCTION_CALL.contains[1].contains = BASIC_MODES;\n  TUPLE.contains = BASIC_MODES;\n  RECORD_ACCESS.contains[1].contains = BASIC_MODES;\n\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    contains: BASIC_MODES\n  };\n  return {\n    aliases: ['erl'],\n    keywords: ERLANG_RESERVED,\n    illegal: '(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))',\n    contains: [\n      {\n        className: 'function',\n        begin: '^' + BASIC_ATOM_RE + '\\\\s*\\\\(', end: '->',\n        returnBegin: true,\n        illegal: '\\\\(|#|//|/\\\\*|\\\\\\\\|:|;',\n        contains: [\n          PARAMS,\n          hljs.inherit(hljs.TITLE_MODE, {begin: BASIC_ATOM_RE})\n        ],\n        starts: {\n          end: ';|\\\\.',\n          keywords: ERLANG_RESERVED,\n          contains: BASIC_MODES\n        }\n      },\n      COMMENT,\n      {\n        className: 'pp',\n        begin: '^-', end: '\\\\.',\n        relevance: 0,\n        excludeEnd: true,\n        returnBegin: true,\n        lexemes: '-' + hljs.IDENT_RE,\n        keywords:\n          '-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn ' +\n          '-import -include -include_lib -compile -define -else -endif -file -behaviour ' +\n          '-behavior -spec',\n        contains: [PARAMS]\n      },\n      NUMBER,\n      hljs.QUOTE_STRING_MODE,\n      RECORD_ACCESS,\n      VAR1, VAR2,\n      TUPLE,\n      {begin: /\\.$/} // relevance booster\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/fix.js",
    "content": "/*\nLanguage: FIX\nAuthor: Brent Bradbury <brent@brentium.com>\n*/\n\nfunction(hljs) {\n  return {\n    contains: [\n    {\n      begin: /[^\\u2401\\u0001]+/,\n      end: /[\\u2401\\u0001]/,\n      excludeEnd: true,\n      returnBegin: true,\n      returnEnd: false,\n      contains: [\n      {\n        begin: /([^\\u2401\\u0001=]+)/,\n        end: /=([^\\u2401\\u0001=]+)/,\n        returnEnd: true,\n        returnBegin: false,\n        className: 'attribute'\n      },\n      {\n        begin: /=/,\n        end: /([\\u2401\\u0001])/,\n        excludeEnd: true,\n        excludeBegin: true,\n        className: 'string'\n      }]\n    }],\n    case_insensitive: true\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/fsharp.js",
    "content": "/*\nLanguage: F#\nAuthor: Jonas Follesø <jonas@follesoe.no>\nContributors: Troy Kershaw <hello@troykershaw.com>\nDescription: F# language definition.\n*/\nfunction(hljs) {\n  return {\n    aliases: ['fs'],\n    keywords:\n      'abstract and as assert base begin class default delegate do done ' +\n      'downcast downto elif else end exception extern false finally for ' +\n      'fun function global if in inherit inline interface internal lazy let ' +\n      'match member module mutable namespace new null of open or ' +\n      'override private public rec return sig static struct then to ' +\n      'true try type upcast use val void when while with yield',\n    contains: [\n      {\n        className: 'string',\n        begin: '@\"', end: '\"',\n        contains: [{begin: '\"\"'}]\n      },\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\(\\\\*', end: '\\\\*\\\\)'\n      },\n      {\n        className: 'class',\n        beginKeywords: 'type', end: '\\\\(|=|$', excludeEnd: true,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'annotation',\n        begin: '\\\\[<', end: '>\\\\]'\n      },\n      {\n        className: 'attribute',\n        begin: '\\\\B(\\'[A-Za-z])\\\\b',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/gherkin.js",
    "content": "/*\n Language: Gherkin\n Author: Sam Pikesley (@pikesley) <sam.pikesley@theodi.org>\n Description: Gherkin (Cucumber etc)\n */\n\nfunction (hljs) {\n  return {\n    keywords: 'Feature Background Ability Business\\ Need Scenario Scenarios Scenario\\ Outline Scenario\\ Template Examples Given And Then But When',\n    contains: [\n      {\n        className: 'keyword',\n        begin: '\\\\*'\n      },\n      {\n        className: 'comment',\n        begin: '@[^@\\r\\n\\t ]+', end: '$'\n      },\n      {\n        className: 'string',\n        begin: '\\\\|', end: '\\\\$'\n      },\n      {\n        className: 'variable',\n        begin: '<', end: '>',\n      },\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/glsl.js",
    "content": "/*\nLanguage: GLSL\nDescription: OpenGL Shading Language\nAuthor: Sergey Tikhomirov <me@stikhomirov.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        'atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default ' +\n        'discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 ' +\n        'dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray ' +\n        'iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube ' +\n        'iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect ' +\n        'image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray ' +\n        'isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer ' +\n        'isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 ' +\n        'mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict ' +\n        'return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray ' +\n        'sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow ' +\n        'sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth ' +\n        'struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray ' +\n        'uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray ' +\n        'usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer ' +\n        'usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly',\n      built_in:\n        'gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial ' +\n        'gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color ' +\n        'gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord ' +\n        'gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor ' +\n        'gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial ' +\n        'gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel ' +\n        'gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize ' +\n        'gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers ' +\n        'gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs ' +\n        'gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers ' +\n        'gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents ' +\n        'gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers ' +\n        'gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents ' +\n        'gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits ' +\n        'gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents ' +\n        'gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset ' +\n        'gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms ' +\n        'gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits ' +\n        'gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents ' +\n        'gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters ' +\n        'gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents ' +\n        'gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents ' +\n        'gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits ' +\n        'gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors ' +\n        'gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs ' +\n        'gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits ' +\n        'gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffset'+\n        'gl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose ' +\n        'gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse ' +\n        'gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose ' +\n        'gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 ' +\n        'gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix ' +\n        'gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn ' +\n        'gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn ' +\n        'gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose ' +\n        'gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition ' +\n        'gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor ' +\n        'gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID ' +\n        'gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive ' +\n        'abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement ' +\n        'atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ' +\n        'ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward ' +\n        'findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan ' +\n        'greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange ' +\n        'imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended ' +\n        'intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt ' +\n        'isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier ' +\n        'min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 ' +\n        'packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract ' +\n        'round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj ' +\n        'shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture ' +\n        'texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj ' +\n        'texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod ' +\n        'textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod ' +\n        'textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod ' +\n        'textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry ' +\n        'uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 ' +\n        'unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse',\n      literal: 'true false'\n    },\n    illegal: '\"',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/go.js",
    "content": "/*\nLanguage: Go\nAuthor: Stephan Kountso aka StepLg <steplg@gmail.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>\nDescription: Google go language (golang). For info about language see http://golang.org/\n*/\n\nfunction(hljs) {\n  var GO_KEYWORDS = {\n    keyword:\n      'break default func interface select case map struct chan else goto package switch ' +\n      'const fallthrough if range type continue for import return var go defer',\n    constant:\n       'true false iota nil',\n    typename:\n      'bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 ' +\n      'uint16 uint32 uint64 int uint uintptr rune',\n    built_in:\n      'append cap close complex copy imag len make new panic print println real recover delete'\n  };\n  return {\n    aliases: [\"golang\"],\n    keywords: GO_KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'', end: '[^\\\\\\\\]\\''\n      },\n      {\n        className: 'string',\n        begin: '`', end: '`'\n      },\n      {\n        className: 'number',\n        begin: '[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?',\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/gradle.js",
    "content": "/*\nLanguage: Gradle\nAuthor: Damian Mee <mee.damian@gmail.com>\nWebsite: http://meeDamian.com\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'task project allprojects subprojects artifacts buildscript configurations ' +\n        'dependencies repositories sourceSets description delete from into include ' +\n        'exclude source classpath destinationDir includes options sourceCompatibility ' +\n        'targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant ' +\n        'def abstract break case catch continue default do else extends final finally ' +\n        'for if implements instanceof native new private protected public return static ' +\n        'switch synchronized throw throws transient try volatile while strictfp package ' +\n        'import false null super this true antlrtask checkstyle codenarc copy boolean ' +\n        'byte char class double float int interface long short void compile runTime ' +\n        'file fileTree abs any append asList asWritable call collect compareTo count ' +\n        'div dump each eachByte eachFile eachLine every find findAll flatten getAt ' +\n        'getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods ' +\n        'isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter ' +\n        'newReader newWriter next plus pop power previous print println push putAt read ' +\n        'readBytes readLines reverse reverseEach round size sort splitEachLine step subMap ' +\n        'times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader ' +\n        'withStream withWriter withWriterAppend write writeLine'\n    },\n    contains: [    \n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.REGEXP_MODE\n\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/haml.js",
    "content": "/*\nLanguage: Haml\nRequires: ruby.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://google.com/profiles/dan.j.allen\n*/\n\n// TODO support filter tags like :javascript, support inline HTML\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    contains: [\n      {\n        className: 'doctype',\n        begin: '^!!!( (5|1\\\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\\\b.*))?$',\n        relevance: 10\n      },\n      {\n        className: 'comment',\n        // FIXME these comments should be allowed to span indented lines\n        begin: '^\\\\s*(!=#|=#|-#|/).*$',\n        relevance: 0\n      },\n      {\n        begin: '^\\\\s*(-|=|!=)(?!#)',\n        starts: {\n          end: '\\\\n',\n          subLanguage: 'ruby'\n        }\n      },\n      {\n        className: 'tag',\n        begin: '^\\\\s*%',\n        contains: [\n          {\n            className: 'title',\n            begin: '\\\\w+'\n          },\n          {\n            className: 'value',\n            begin: '[#\\\\.]\\\\w+'\n          },\n          {\n            begin: '{\\\\s*',\n            end: '\\\\s*}',\n            excludeEnd: true,\n            contains: [\n              {\n                //className: 'attribute',\n                begin: ':\\\\w+\\\\s*=>',\n                end: ',\\\\s+',\n                returnBegin: true,\n                endsWithParent: true,\n                contains: [\n                  {\n                    className: 'symbol',\n                    begin: ':\\\\w+'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\"',\n                    end: '\"'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\\'',\n                    end: '\\''\n                  },\n                  {\n                    begin: '\\\\w+',\n                    relevance: 0\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            begin: '\\\\(\\\\s*',\n            end: '\\\\s*\\\\)',\n            excludeEnd: true,\n            contains: [\n              {\n                //className: 'attribute',\n                begin: '\\\\w+\\\\s*=',\n                end: '\\\\s+',\n                returnBegin: true,\n                endsWithParent: true,\n                contains: [\n                  {\n                    className: 'attribute',\n                    begin: '\\\\w+',\n                    relevance: 0\n                  },\n                  {\n                    className: 'string',\n                    begin: '\"',\n                    end: '\"'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\\'',\n                    end: '\\''\n                  },\n                  {\n                    begin: '\\\\w+',\n                    relevance: 0\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'bullet',\n        begin: '^\\\\s*[=~]\\\\s*',\n        relevance: 0\n      },\n      {\n        begin: '#{',\n        starts: {\n          end: '}',\n          subLanguage: 'ruby'\n        }\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/handlebars.js",
    "content": "/*\nLanguage: Handlebars\nRequires: xml.js\nAuthor: Robin Ward <robin.ward@gmail.com>\nDescription: Matcher for Handlebars as well as EmberJS additions.\n*/\n\nfunction(hljs) {\n  var EXPRESSION_KEYWORDS = 'each in with if else unless bindattr action collection debugger log outlet template unbound view yield';\n  return {\n    aliases: ['hbs', 'html.hbs', 'html.handlebars'],\n    case_insensitive: true,\n    subLanguage: 'xml', subLanguageMode: 'continuous',\n    contains: [\n      {\n        className: 'expression',\n        begin: '{{', end: '}}',\n        contains: [\n          {\n            className: 'begin-block', begin: '\\#[a-zA-Z\\-\\ \\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          },\n          {\n            className: 'string',\n            begin: '\"', end: '\"'\n          },\n          {\n            className: 'end-block', begin: '\\\\\\/[a-zA-Z\\-\\ \\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          },\n          {\n            className: 'variable', begin: '[a-zA-Z\\-\\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/haskell.js",
    "content": "/*\nLanguage: Haskell\nAuthor: Jeremy Hull <sourdrums@gmail.com>\nContributors: Zena Treep <zena.treep@gmail.com>\n*/\n\nfunction(hljs) {\n\n  var COMMENT = {\n    className: 'comment',\n    variants: [\n      { begin: '--', end: '$' },\n      { begin: '{-', end: '-}'\n      , contains: ['self']\n      }\n    ]\n  };\n\n  var PRAGMA = {\n    className: 'pragma',\n    begin: '{-#', end: '#-}'\n  };\n\n  var PREPROCESSOR = {\n    className: 'preprocessor',\n    begin: '^#', end: '$'\n  };\n\n  var CONSTRUCTOR = {\n    className: 'type',\n    begin: '\\\\b[A-Z][\\\\w\\']*', // TODO: other constructors (build-in, infix).\n    relevance: 0\n  };\n\n  var LIST = {\n    className: 'container',\n    begin: '\\\\(', end: '\\\\)',\n    illegal: '\"',\n    contains: [\n      PRAGMA,\n      COMMENT,\n      PREPROCESSOR,\n      {className: 'type', begin: '\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?'},\n      hljs.inherit(hljs.TITLE_MODE, {begin: '[_a-z][\\\\w\\']*'})\n    ]\n  };\n\n  var RECORD = {\n    className: 'container',\n    begin: '{', end: '}',\n    contains: LIST.contains\n  };\n\n  return {\n    aliases: ['hs'],\n    keywords:\n      'let in if then else case of where do module import hiding ' +\n      'qualified type data newtype deriving class instance as default ' +\n      'infix infixl infixr foreign export ccall stdcall cplusplus ' +\n      'jvm dotnet safe unsafe family forall mdo proc rec',\n    contains: [\n\n      // Top-level constructions.\n\n      {\n        className: 'module',\n        begin: '\\\\bmodule\\\\b', end: 'where',\n        keywords: 'module where',\n        contains: [LIST, COMMENT],\n        illegal: '\\\\W\\\\.|;'\n      },\n      {\n        className: 'import',\n        begin: '\\\\bimport\\\\b', end: '$',\n        keywords: 'import|0 qualified as hiding',\n        contains: [LIST, COMMENT],\n        illegal: '\\\\W\\\\.|;'\n      },\n\n      {\n        className: 'class',\n        begin: '^(\\\\s*)?(class|instance)\\\\b', end: 'where',\n        keywords: 'class family instance where',\n        contains: [CONSTRUCTOR, LIST, COMMENT]\n      },\n      {\n        className: 'typedef',\n        begin: '\\\\b(data|(new)?type)\\\\b', end: '$',\n        keywords: 'data family type newtype deriving',\n        contains: [PRAGMA, COMMENT, CONSTRUCTOR, LIST, RECORD]\n      },\n      {\n        className: 'default',\n        beginKeywords: 'default', end: '$',\n        contains: [CONSTRUCTOR, LIST, COMMENT]\n      },\n      {\n        className: 'infix',\n        beginKeywords: 'infix infixl infixr', end: '$',\n        contains: [hljs.C_NUMBER_MODE, COMMENT]\n      },\n      {\n        className: 'foreign',\n        begin: '\\\\bforeign\\\\b', end: '$',\n        keywords: 'foreign import export ccall stdcall cplusplus jvm ' +\n                  'dotnet safe unsafe',\n        contains: [CONSTRUCTOR, hljs.QUOTE_STRING_MODE, COMMENT]\n      },\n      {\n        className: 'shebang',\n        begin: '#!\\\\/usr\\\\/bin\\\\/env\\ runhaskell', end: '$'\n      },\n\n      // \"Whitespaces\".\n\n      PRAGMA,\n      COMMENT,\n      PREPROCESSOR,\n\n      // Literals and names.\n\n      // TODO: characters.\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      CONSTRUCTOR,\n      hljs.inherit(hljs.TITLE_MODE, {begin: '^[_a-z][\\\\w\\']*'}),\n\n      {begin: '->|<-'} // No markup, relevance booster\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/haxe.js",
    "content": "/*\nLanguage: Haxe\nAuthor: Christopher Kaster <ikasoki@gmail.com> (Based on the actionscript.js language file by Alexander Myadzel)\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';\n  var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';\n\n  return {\n    aliases: ['hx'],\n    keywords: {\n      keyword: 'break callback case cast catch class continue default do dynamic else enum extends extern ' +\n\t\t'for function here if implements import in inline interface never new override package private ' + \n\t\t'public return static super switch this throw trace try typedef untyped using var while',\n      literal: 'true false null'\n    },\n    contains: [\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.TITLE_MODE\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elseif end error'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '[{;]', excludeEnd: true,\n        illegal: '\\\\S',\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ]\n          },\n          {\n            className: 'type',\n            begin: ':',\n            end: IDENT_FUNC_RETURN_TYPE_RE,\n            relevance: 10\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/http.js",
    "content": "/*\n  Language: HTTP\n  Description: HTTP request and response headers with automatic body highlighting\n  Author: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  return {\n    illegal: '\\\\S',\n    contains: [\n      {\n        className: 'status',\n        begin: '^HTTP/[0-9\\\\.]+', end: '$',\n        contains: [{className: 'number', begin: '\\\\b\\\\d{3}\\\\b'}]\n      },\n      {\n        className: 'request',\n        begin: '^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$', returnBegin: true, end: '$',\n        contains: [\n          {\n            className: 'string',\n            begin: ' ', end: ' ',\n            excludeBegin: true, excludeEnd: true\n          }\n        ]\n      },\n      {\n        className: 'attribute',\n        begin: '^\\\\w', end: ': ', excludeEnd: true,\n        illegal: '\\\\n|\\\\s|=',\n        starts: {className: 'string', end: '$'}\n      },\n      {\n        begin: '\\\\n\\\\n',\n        starts: {subLanguage: '', endsWithParent: true}\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/ini.js",
    "content": "/*\nLanguage: Ini\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    illegal: /\\S/,\n    contains: [\n      {\n        className: 'comment',\n        begin: ';', end: '$'\n      },\n      {\n        className: 'title',\n        begin: '^\\\\[', end: '\\\\]'\n      },\n      {\n        className: 'setting',\n        begin: '^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*', end: '$',\n        contains: [\n          {\n            className: 'value',\n            endsWithParent: true,\n            keywords: 'on off true false yes no',\n            contains: [hljs.QUOTE_STRING_MODE, hljs.NUMBER_MODE],\n            relevance: 0\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/java.js",
    "content": "/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    'false synchronized int abstract float private char boolean static null if const ' +\n    'for true while long throw strictfp finally protected import native final return void ' +\n    'enum else break transient new catch instanceof byte super volatile case assert short ' +\n    'package default double public try this switch continue throws';\n  return {\n    aliases: ['jsp'],\n    keywords: KEYWORDS,\n    illegal: /<\\//,\n    contains: [\n      {\n        className: 'javadoc',\n        begin: '/\\\\*\\\\*', end: '\\\\*/',\n        contains: [{\n          className: 'javadoctag', begin: '(^|\\\\s)@[A-Za-z]+'\n        }],\n        relevance: 10\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        beginKeywords: 'protected public private', end: /[{;=]/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            className: 'class',\n            beginKeywords: 'class interface', endsWithParent: true, excludeEnd: true,\n            illegal: /[:\"\\[\\]]/,\n            contains: [\n              {\n                beginKeywords: 'extends implements',\n                relevance: 10\n              },\n              hljs.UNDERSCORE_TITLE_MODE\n            ]\n          },\n          {\n            begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n            contains: [\n              hljs.UNDERSCORE_TITLE_MODE\n            ]\n          }\n        ]\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'annotation', begin: '@[A-Za-z]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/javascript.js",
    "content": "/*\nLanguage: JavaScript\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['js'],\n    keywords: {\n      keyword:\n        'in if for while finally var new function do return void else break catch ' +\n        'instanceof with throw case default try this switch continue typeof delete ' +\n        'let yield const class',\n      literal:\n        'true false null undefined NaN Infinity',\n      built_in:\n        'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +\n        'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +\n        'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +\n        'TypeError URIError Number Math Date String RegExp Array Float32Array ' +\n        'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +\n        'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +\n        'module console window document'\n    },\n    contains: [\n      {\n        className: 'pi',\n        begin: /^\\s*('|\")use strict('|\")/,\n        relevance: 10\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        contains: [\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          hljs.REGEXP_MODE,\n          { // E4X\n            begin: /</, end: />;/,\n            relevance: 0,\n            subLanguage: 'xml'\n          }\n        ],\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /\\{/, excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/}),\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"'\\(]/\n          }\n        ],\n        illegal: /\\[|%/\n      },\n      {\n        begin: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      },\n      {\n        begin: '\\\\.' + hljs.IDENT_RE, relevance: 0 // hack: prevents detection of keywords after dots\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/json.js",
    "content": "/*\nLanguage: JSON\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var LITERALS = {literal: 'true false null'};\n  var TYPES = [\n    hljs.QUOTE_STRING_MODE,\n    hljs.C_NUMBER_MODE\n  ];\n  var VALUE_CONTAINER = {\n    className: 'value',\n    end: ',', endsWithParent: true, excludeEnd: true,\n    contains: TYPES,\n    keywords: LITERALS\n  };\n  var OBJECT = {\n    begin: '{', end: '}',\n    contains: [\n      {\n        className: 'attribute',\n        begin: '\\\\s*\"', end: '\"\\\\s*:\\\\s*', excludeBegin: true, excludeEnd: true,\n        contains: [hljs.BACKSLASH_ESCAPE],\n        illegal: '\\\\n',\n        starts: VALUE_CONTAINER\n      }\n    ],\n    illegal: '\\\\S'\n  };\n  var ARRAY = {\n    begin: '\\\\[', end: '\\\\]',\n    contains: [hljs.inherit(VALUE_CONTAINER, {className: null})], // inherit is also a workaround for a bug that makes shared modes with endsWithParent compile only the ending of one of the parents\n    illegal: '\\\\S'\n  };\n  TYPES.splice(TYPES.length, 0, OBJECT, ARRAY);\n  return {\n    contains: TYPES,\n    keywords: LITERALS,\n    illegal: '\\\\S'\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/lasso.js",
    "content": "/*\nLanguage: Lasso\nAuthor: Eric Knibbe <eric@lassosoft.com>\nDescription: Lasso is a language and server platform for database-driven web applications. This definition handles Lasso 9 syntax and LassoScript for Lasso 8.6 and earlier.\n*/\n\nfunction(hljs) {\n  var LASSO_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_.]*';\n  var LASSO_ANGLE_RE = '<\\\\?(lasso(script)?|=)';\n  var LASSO_CLOSE_RE = '\\\\]|\\\\?>';\n  var LASSO_KEYWORDS = {\n    literal:\n      'true false none minimal full all void and or not ' +\n      'bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft',\n    built_in:\n      'array date decimal duration integer map pair string tag xml null ' +\n      'bytes list queue set stack staticarray tie local var variable ' +\n      'global data self inherited',\n    keyword:\n      'error_code error_msg error_pop error_push error_reset cache ' +\n      'database_names database_schemanames database_tablenames define_tag ' +\n      'define_type email_batch encode_set html_comment handle handle_error ' +\n      'header if inline iterate ljax_target link link_currentaction ' +\n      'link_currentgroup link_currentrecord link_detail link_firstgroup ' +\n      'link_firstrecord link_lastgroup link_lastrecord link_nextgroup ' +\n      'link_nextrecord link_prevgroup link_prevrecord log loop ' +\n      'namespace_using output_none portal private protect records referer ' +\n      'referrer repeating resultset rows search_args search_arguments ' +\n      'select sort_args sort_arguments thread_atomic value_list while ' +\n      'abort case else if_empty if_false if_null if_true loop_abort ' +\n      'loop_continue loop_count params params_up return return_value ' +\n      'run_children soap_definetag soap_lastrequest soap_lastresponse ' +\n      'tag_name ascending average by define descending do equals ' +\n      'frozen group handle_failure import in into join let match max ' +\n      'min on order parent protected provide public require returnhome ' +\n      'skip split_thread sum take thread to trait type where with ' +\n      'yield yieldhome'\n  };\n  var HTML_COMMENT = {\n    className: 'comment',\n    begin: '<!--', end: '-->',\n    relevance: 0\n  };\n  var LASSO_NOPROCESS = {\n    className: 'preprocessor',\n    begin: '\\\\[noprocess\\\\]',\n    starts: {\n      className: 'markup',\n      end: '\\\\[/noprocess\\\\]',\n      returnEnd: true,\n      contains: [HTML_COMMENT]\n    }\n  };\n  var LASSO_START = {\n    className: 'preprocessor',\n    begin: '\\\\[/noprocess|' + LASSO_ANGLE_RE\n  };\n  var LASSO_DATAMEMBER = {\n    className: 'variable',\n    begin: '\\'' + LASSO_IDENT_RE + '\\''\n  };\n  var LASSO_CODE = [\n    hljs.C_LINE_COMMENT_MODE,\n    {\n      className: 'javadoc',\n      begin: '/\\\\*\\\\*!', end: '\\\\*/',\n      contains: [hljs.PHRASAL_WORDS_MODE]\n    },\n    hljs.C_BLOCK_COMMENT_MODE,\n    hljs.inherit(hljs.C_NUMBER_MODE, {begin: hljs.C_NUMBER_RE + '|-?(infinity|nan)\\\\b'}),\n    hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n    hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n    {\n      className: 'string',\n      begin: '`', end: '`'\n    },\n    {\n      className: 'variable',\n      variants: [\n        {\n          begin: '[#$]' + LASSO_IDENT_RE\n        },\n        {\n          begin: '#', end: '\\\\d+',\n          illegal: '\\\\W'\n        }\n      ]\n    },\n    {\n      className: 'tag',\n      begin: '::\\\\s*', end: LASSO_IDENT_RE,\n      illegal: '\\\\W'\n    },\n    {\n      className: 'attribute',\n      variants: [\n        {\n          begin: '-' + hljs.UNDERSCORE_IDENT_RE,\n          relevance: 0\n        },\n        {\n          begin: '(\\\\.\\\\.\\\\.)'\n        }\n      ]\n    },\n    {\n      className: 'subst',\n      variants: [\n        {\n          begin: '->\\\\s*',\n          contains: [LASSO_DATAMEMBER]\n        },\n        {\n          begin: ':=|/(?!\\\\w)=?|[-+*%=<>&|!?\\\\\\\\]+',\n          relevance: 0\n        }\n      ]\n    },\n    {\n      className: 'built_in',\n      begin: '\\\\.\\\\.?',\n      relevance: 0,\n      contains: [LASSO_DATAMEMBER]\n    },\n    {\n      className: 'class',\n      beginKeywords: 'define',\n      returnEnd: true, end: '\\\\(|=>',\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: hljs.UNDERSCORE_IDENT_RE + '(=(?!>))?'})\n      ]\n    }\n  ];\n  return {\n    aliases: ['ls', 'lassoscript'],\n    case_insensitive: true,\n    lexemes: LASSO_IDENT_RE + '|&[lg]t;',\n    keywords: LASSO_KEYWORDS,\n    contains: [\n      {\n        className: 'preprocessor',\n        begin: LASSO_CLOSE_RE,\n        relevance: 0,\n        starts: {\n          className: 'markup',\n          end: '\\\\[|' + LASSO_ANGLE_RE,\n          returnEnd: true,\n          relevance: 0,\n          contains: [HTML_COMMENT]\n        }\n      },\n      LASSO_NOPROCESS,\n      LASSO_START,\n      {\n        className: 'preprocessor',\n        begin: '\\\\[no_square_brackets',\n        starts: {\n          end: '\\\\[/no_square_brackets\\\\]', // not implemented in the language\n          lexemes: LASSO_IDENT_RE + '|&[lg]t;',\n          keywords: LASSO_KEYWORDS,\n          contains: [\n            {\n              className: 'preprocessor',\n              begin: LASSO_CLOSE_RE,\n              relevance: 0,\n              starts: {\n                className: 'markup',\n                end: LASSO_ANGLE_RE,\n                returnEnd: true,\n                contains: [HTML_COMMENT]\n              }\n            },\n            LASSO_NOPROCESS,\n            LASSO_START\n          ].concat(LASSO_CODE)\n        }\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\[',\n        relevance: 0\n      },\n      {\n        className: 'shebang',\n        begin: '^#!.+lasso9\\\\b',\n        relevance: 10\n      }\n    ].concat(LASSO_CODE)\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/lisp.js",
    "content": "/*\nLanguage: Lisp\nDescription: Generic lisp syntax\nAuthor: Vasily Polovnyov <vast@whiteants.net>\n*/\n\nfunction(hljs) {\n  var LISP_IDENT_RE = '[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#!]*';\n  var LISP_SIMPLE_NUMBER_RE = '(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?';\n  var SHEBANG = {\n    className: 'shebang',\n    begin: '^#!', end: '$'\n  };\n  var LITERAL = {\n    className: 'literal',\n    begin: '\\\\b(t{1}|nil)\\\\b'\n  };\n  var NUMBER = {\n    className: 'number',\n    variants: [\n      {begin: LISP_SIMPLE_NUMBER_RE, relevance: 0},\n      {begin: '#b[0-1]+(/[0-1]+)?'},\n      {begin: '#o[0-7]+(/[0-7]+)?'},\n      {begin: '#x[0-9a-f]+(/[0-9a-f]+)?'},\n      {begin: '#c\\\\(' + LISP_SIMPLE_NUMBER_RE + ' +' + LISP_SIMPLE_NUMBER_RE, end: '\\\\)'}\n    ]\n  };\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});\n  var COMMENT = {\n    className: 'comment',\n    begin: ';', end: '$'\n  };\n  var VARIABLE = {\n    className: 'variable',\n    begin: '\\\\*', end: '\\\\*'\n  };\n  var KEYWORD = {\n    className: 'keyword',\n    begin: '[:&]' + LISP_IDENT_RE\n  };\n  var QUOTED_LIST = {\n    begin: '\\\\(', end: '\\\\)',\n    contains: ['self', LITERAL, STRING, NUMBER]\n  };\n  var QUOTED = {\n    className: 'quoted',\n    contains: [NUMBER, STRING, VARIABLE, KEYWORD, QUOTED_LIST],\n    variants: [\n      {\n        begin: '[\\'`]\\\\(', end: '\\\\)'\n      },\n      {\n        begin: '\\\\(quote ', end: '\\\\)',\n        keywords: {title: 'quote'}\n      }\n    ]\n  };\n  var QUOTED_ATOM = {\n    className: 'quoted',\n    begin: '\\'' + LISP_IDENT_RE\n  };\n  var LIST = {\n    className: 'list',\n    begin: '\\\\(', end: '\\\\)'\n  };\n  var BODY = {\n    endsWithParent: true,\n    relevance: 0\n  };\n  LIST.contains = [{className: 'title', begin: LISP_IDENT_RE}, BODY];\n  BODY.contains = [QUOTED, QUOTED_ATOM, LIST, LITERAL, NUMBER, STRING, COMMENT, VARIABLE, KEYWORD];\n\n  return {\n    illegal: /\\S/,\n    contains: [\n      NUMBER,\n      SHEBANG,\n      LITERAL,\n      STRING,\n      COMMENT,\n      QUOTED,\n      QUOTED_ATOM,\n      LIST\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/livecodeserver.js",
    "content": "/*\nLanguage: LiveCode server and revIgniter\nAuthor: Ralf Bitter <rabit@revigniter.com>\nDescription: Language definition for LiveCode server accounting for revIgniter (a web application framework) characteristics.\nVersion: 1.0a\nDate: 2013-06-03\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable', begin: '\\\\b[gtps][A-Z]+[A-Za-z0-9_\\\\-]*\\\\b|\\\\$_[A-Z]+',\n    relevance: 0\n  };\n  var COMMENT = {\n    className: 'comment', end: '$',\n    variants: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: '--'\n      },\n      {\n        begin: '[^:]//'\n      }\n    ]\n  };\n  var TITLE1 = hljs.inherit(hljs.TITLE_MODE, {\n    variants: [\n      {begin: '\\\\b_*rig[A-Z]+[A-Za-z0-9_\\\\-]*'},\n      {begin: '\\\\b_[a-z0-9\\\\-]+'}\n    ]\n  });\n  var TITLE2 = hljs.inherit(hljs.TITLE_MODE, {begin: '\\\\b([A-Za-z0-9_\\\\-]+)\\\\b'});\n  return {\n    case_insensitive: false,\n    keywords: {\n      keyword:\n        'after byte bytes english the until http forever descending using line real8 with seventh ' +\n        'for stdout finally element word fourth before black ninth sixth characters chars stderr ' +\n        'uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid ' +\n        'at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 ' +\n        'int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat ' +\n        'end repeat URL in try into switch to words https token binfile each tenth as ticks tick ' +\n        'system real4 by dateItems without char character ascending eighth whole dateTime numeric short ' +\n        'first ftp integer abbreviated abbr abbrev private case while if',\n      constant:\n        'SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE ' +\n        'QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO ' +\n        'six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five ' +\n        'quote empty one true return cr linefeed right backslash null seven tab three two ' +\n        'RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK ' +\n        'FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK',\n      operator:\n        'div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within ' +\n        'contains ends with begins the keys of keys',\n      built_in:\n        'put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode ' +\n        'base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum ' +\n        'cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories ' +\n        'diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global ' +\n        'globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset ' +\n        'keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders ' +\n        'libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 ' +\n        'longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec ' +\n        'millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles ' +\n        'openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform ' +\n        'processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord ' +\n        'revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull ' +\n        'revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered ' +\n        'revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames ' +\n        'revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull ' +\n        'revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections ' +\n        'revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype ' +\n        'revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext ' +\n        'revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames ' +\n        'revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase ' +\n        'revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath ' +\n        'revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames ' +\n        'revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren ' +\n        'revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents ' +\n        'revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText ' +\n        'revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort ' +\n        'revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree ' +\n        'revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round ' +\n        'sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound ' +\n        'stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc ' +\n        'uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset ' +\n        'add breakpoint cancel clear local variable file word line folder directory URL close socket process ' +\n        'combine constant convert create new alias folder directory decrypt delete variable word line folder ' +\n        'directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile ' +\n        'libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback ' +\n        'libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime ' +\n        'libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename ' +\n        'replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase ' +\n        'revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees ' +\n        'revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord ' +\n        'revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase ' +\n        'revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD ' +\n        'revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost ' +\n        'revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData ' +\n        'revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel ' +\n        'revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback ' +\n        'revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split ' +\n        'subtract union unload wait write'\n    },\n    contains: [\n      VARIABLE,\n      {\n        className: 'keyword',\n        begin: '\\\\bend\\\\sif\\\\b'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '$',\n        contains: [\n          VARIABLE,\n          TITLE2,\n          hljs.APOS_STRING_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.BINARY_NUMBER_MODE,\n          hljs.C_NUMBER_MODE,\n          TITLE1\n        ]\n      },\n      {\n        className: 'function',\n        beginKeywords: 'end', end: '$',\n        contains: [\n          TITLE2,\n          TITLE1\n        ]\n      },\n      {\n        className: 'command',\n        beginKeywords: 'command on', end: '$',\n        contains: [\n          VARIABLE,\n          TITLE2,\n          hljs.APOS_STRING_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.BINARY_NUMBER_MODE,\n          hljs.C_NUMBER_MODE,\n          TITLE1\n        ]\n      },\n      {\n        className: 'command',\n        beginKeywords: 'end', end: '$',\n        contains: [\n          TITLE2,\n          TITLE1\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '<\\\\?rev|<\\\\?lc|<\\\\?livecode',\n        relevance: 10\n      },\n      {\n        className: 'preprocessor',\n        begin: '<\\\\?'\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\?>'\n      },\n      COMMENT,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.BINARY_NUMBER_MODE,\n      hljs.C_NUMBER_MODE,\n      TITLE1\n    ],\n    illegal: ';$|^\\\\[|^='\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/lua.js",
    "content": "/*\nLanguage: Lua\nAuthor: Andrew Fedorov <dmmdrs@mail.ru>\n*/\n\nfunction(hljs) {\n  var OPENING_LONG_BRACKET = '\\\\[=*\\\\[';\n  var CLOSING_LONG_BRACKET = '\\\\]=*\\\\]';\n  var LONG_BRACKETS = {\n    begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n    contains: ['self']\n  };\n  var COMMENTS = [\n    {\n      className: 'comment',\n      begin: '--(?!' + OPENING_LONG_BRACKET + ')', end: '$'\n    },\n    {\n      className: 'comment',\n      begin: '--' + OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n      contains: [LONG_BRACKETS],\n      relevance: 10\n    }\n  ]\n  return {\n    lexemes: hljs.UNDERSCORE_IDENT_RE,\n    keywords: {\n      keyword:\n        'and break do else elseif end false for if in local nil not or repeat return then ' +\n        'true until while',\n      built_in:\n        '_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load ' +\n        'loadfile loadstring module next pairs pcall print rawequal rawget rawset require ' +\n        'select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug ' +\n        'io math os package string table'\n    },\n    contains: COMMENTS.concat([\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '\\\\)',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: '([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*'}),\n          {\n            className: 'params',\n            begin: '\\\\(', endsWithParent: true,\n            contains: COMMENTS\n          }\n        ].concat(COMMENTS)\n      },\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n        contains: [LONG_BRACKETS],\n        relevance: 5\n      }\n    ])\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/makefile.js",
    "content": "/*\nLanguage: Makefile\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable',\n    begin: /\\$\\(/, end: /\\)/,\n    contains: [hljs.BACKSLASH_ESCAPE]\n  };\n  return {\n    aliases: ['mk', 'mak'],\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: /^\\w+\\s*\\W*=/, returnBegin: true,\n        relevance: 0,\n        starts: {\n          className: 'constant',\n          end: /\\s*\\W*=/, excludeEnd: true,\n          starts: {\n            end: /$/,\n            relevance: 0,\n            contains: [\n              VARIABLE\n            ]\n          }\n        }\n      },\n      {\n        className: 'title',\n        begin: /^[\\w]+:\\s*$/\n      },\n      {\n        className: 'phony',\n        begin: /^\\.PHONY:/, end: /$/,\n        keywords: '.PHONY', lexemes: /[\\.\\w]+/\n      },\n      {\n        begin: /^\\t+/, end: /$/,\n        contains: [\n          hljs.QUOTE_STRING_MODE,\n          VARIABLE\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/markdown.js",
    "content": "/*\nLanguage: Markdown\nRequires: xml.js\nAuthor: John Crepezzi <john.crepezzi@gmail.com>\nWebsite: http://seejohncode.com/\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['md', 'mkdown', 'mkd'],\n    contains: [\n      // highlight headers\n      {\n        className: 'header',\n        variants: [\n          { begin: '^#{1,6}', end: '$' },\n          { begin: '^.+?\\\\n[=-]{2,}$' }\n        ]\n      },\n      // inline html\n      {\n        begin: '<', end: '>',\n        subLanguage: 'xml',\n        relevance: 0\n      },\n      // lists (indicators only)\n      {\n        className: 'bullet',\n        begin: '^([*+-]|(\\\\d+\\\\.))\\\\s+'\n      },\n      // strong segments\n      {\n        className: 'strong',\n        begin: '[*_]{2}.+?[*_]{2}'\n      },\n      // emphasis segments\n      {\n        className: 'emphasis',\n        variants: [\n          { begin: '\\\\*.+?\\\\*' },\n          { begin: '_.+?_'\n          , relevance: 0\n          }\n        ]\n      },\n      // blockquotes\n      {\n        className: 'blockquote',\n        begin: '^>\\\\s+', end: '$'\n      },\n      // code snippets\n      {\n        className: 'code',\n        variants: [\n          { begin: '`.+?`' },\n          { begin: '^( {4}|\\t)', end: '$'\n          , relevance: 0\n          }\n        ]\n      },\n      // horizontal rules\n      {\n        className: 'horizontal_rule',\n        begin: '^[-\\\\*]{3,}', end: '$'\n      },\n      // using links - title and link\n      {\n        begin: '\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]',\n        returnBegin: true,\n        contains: [\n          {\n            className: 'link_label',\n            begin: '\\\\[', end: '\\\\]',\n            excludeBegin: true,\n            returnEnd: true,\n            relevance: 0\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\]\\\\(', end: '\\\\)',\n            excludeBegin: true, excludeEnd: true\n          },\n          {\n            className: 'link_reference',\n            begin: '\\\\]\\\\[', end: '\\\\]',\n            excludeBegin: true, excludeEnd: true\n          }\n        ],\n        relevance: 10\n      },\n      {\n        begin: '^\\\\[\\.+\\\\]:', end: '$',\n        returnBegin: true,\n        contains: [\n          {\n            className: 'link_reference',\n            begin: '\\\\[', end: '\\\\]',\n            excludeBegin: true, excludeEnd: true\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\s', end: '$'\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/mathematica.js",
    "content": "/*\nLanguage: Mathematica\nAuthor: Daniel Kvasnicka <dkvasnicka@vendavo.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['mma'],\n    lexemes: '(\\\\$|\\\\b)' + hljs.IDENT_RE + '\\\\b',\n    keywords: 'AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis ' +\n      'BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering ' +\n      'C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ' +\n      'ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition ' +\n      'D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform ' +\n      'DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions ' +\n      'E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution ' +\n      'FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve ' +\n      'FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance ' +\n      'GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion ' +\n      'GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution ' +\n      'HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData ' +\n      'I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction ' +\n      'InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess ' +\n      'JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition ' +\n      'K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter ' +\n      'Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions ' +\n      'LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy ' +\n      'MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution ' +\n      'N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator ' +\n      'NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot ' +\n      'O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues ' +\n      'PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList ' +\n      'PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions ' +\n      'QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder ' +\n      'RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity ' +\n      'SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity ' +\n      'SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders ' +\n      'SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub ' +\n      'Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine ' +\n      'Transparent ' +\n      'UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd ' +\n      'V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution ' +\n      'WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian ' +\n      'XMLElement XMLObject Xnor Xor ' +\n      'Yellow YuleDissimilarity ' +\n      'ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform ' +\n      '$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber',\n    contains: [\n      {\n        className: \"comment\",\n        begin: /\\(\\*/, end: /\\*\\)/\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'list',\n        begin: /\\{/, end: /\\}/,\n        illegal: /:/\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/matlab.js",
    "content": "/*\nLanguage: Matlab\nAuthor: Denis Bardadym <bardadymchik@gmail.com>\nContributors: Eugene Nizhibitsky <nizhibitsky@ya.ru>\n*/\n\nfunction(hljs) {\n  var COMMON_CONTAINS = [\n    hljs.C_NUMBER_MODE,\n    {\n      className: 'string',\n      begin: '\\'', end: '\\'',\n      contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n    }\n  ];\n\n  return {\n    keywords: {\n      keyword:\n        'break case catch classdef continue else elseif end enumerated events for function ' +\n        'global if methods otherwise parfor persistent properties return spmd switch try while',\n      built_in:\n        'sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan ' +\n        'atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot ' +\n        'cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog ' +\n        'realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal ' +\n        'cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli ' +\n        'besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma ' +\n        'gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms ' +\n        'nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones ' +\n        'eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ' +\n        'ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril ' +\n        'triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute ' +\n        'shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan ' +\n        'isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal ' +\n        'rosser toeplitz vander wilkinson'\n    },\n    illegal: '(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',\n    contains: [\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '$',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n              className: 'params',\n              begin: '\\\\(', end: '\\\\)'\n          },\n          {\n              className: 'params',\n              begin: '\\\\[', end: '\\\\]'\n          }\n        ]\n      },\n      {\n        className: 'transposed_variable',\n        begin: '[a-zA-Z_][a-zA-Z_0-9]*(\\'+[\\\\.\\']*|[\\\\.\\']+)', end: '',\n        relevance: 0\n      },\n      {\n        className: 'matrix',\n        begin: '\\\\[', end: '\\\\]\\'*[\\\\.\\']*',\n        contains: COMMON_CONTAINS,\n        relevance: 0\n      },\n      {\n        className: 'cell',\n        begin: '\\\\{',\n        contains: COMMON_CONTAINS,\n        illegal: /:/,\n        variants: [\n          {end: /\\}'[\\.']*/},\n          {end: /\\}/, relevance: 0}\n        ]\n      },\n      {\n        className: 'comment',\n        begin: '\\\\%', end: '$'\n      }\n    ].concat(COMMON_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/mel.js",
    "content": "/*\nLanguage: MEL\nDescription: Maya Embedded Language\nAuthor: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords:\n      'int float string vector matrix if else switch case default while do for in break ' +\n      'continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic ' +\n      'addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey ' +\n      'affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve ' +\n      'alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor ' +\n      'animDisplay animView annotate appendStringArray applicationName applyAttrPreset ' +\n      'applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx ' +\n      'artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu ' +\n      'artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand ' +\n      'assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface ' +\n      'attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu ' +\n      'attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp ' +\n      'attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery ' +\n      'autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults ' +\n      'bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership ' +\n      'bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType ' +\n      'boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu ' +\n      'buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge ' +\n      'cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch ' +\n      'catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox ' +\n      'character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp ' +\n      'checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip ' +\n      'clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore ' +\n      'closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter ' +\n      'cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color ' +\n      'colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp ' +\n      'colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem ' +\n      'componentEditor compositingInterop computePolysetVolume condition cone confirmDialog ' +\n      'connectAttr connectControl connectDynamic connectJoint connectionInfo constrain ' +\n      'constrainValue constructionHistory container containsMultibyte contextInfo control ' +\n      'convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation ' +\n      'convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache ' +\n      'cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel ' +\n      'cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver ' +\n      'cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor ' +\n      'createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer ' +\n      'createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse ' +\n      'currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx ' +\n      'curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface ' +\n      'curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox ' +\n      'defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete ' +\n      'deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes ' +\n      'delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo ' +\n      'dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable ' +\n      'disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected ' +\n      'displayColor displayCull displayLevelOfDetail displayPref displayRGBColor ' +\n      'displaySmoothness displayStats displayString displaySurface distanceDimContext ' +\n      'distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct ' +\n      'doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator ' +\n      'duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression ' +\n      'dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor ' +\n      'dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers ' +\n      'editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor ' +\n      'editorTemplate effector emit emitter enableDevice encodeString endString endsWith env ' +\n      'equivalent equivalentTol erf error eval evalDeferred evalEcho event ' +\n      'exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp ' +\n      'expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof ' +\n      'fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo ' +\n      'filetest filletCurve filter filterCurve filterExpand filterStudioImport ' +\n      'findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster ' +\n      'finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar ' +\n      'floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo ' +\n      'fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint ' +\n      'frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss ' +\n      'geometryConstraint getApplicationVersionAsFloat getAttr getClassification ' +\n      'getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes ' +\n      'getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender ' +\n      'glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl ' +\n      'gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid ' +\n      'gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap ' +\n      'HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor ' +\n      'HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached ' +\n      'HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel ' +\n      'headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey ' +\n      'hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender ' +\n      'hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox ' +\n      'iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ' +\n      'ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ' +\n      'ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform ' +\n      'insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance ' +\n      'instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp ' +\n      'interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf ' +\n      'isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect ' +\n      'itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx ' +\n      'jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner ' +\n      'keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx ' +\n      'keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx ' +\n      'keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx ' +\n      'keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor ' +\n      'layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList ' +\n      'lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep ' +\n      'listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory ' +\n      'listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation ' +\n      'listNodeTypes listPanelCategories listRelatives listSets listTransforms ' +\n      'listUnselected listerEditor loadFluid loadNewShelf loadPlugin ' +\n      'loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log ' +\n      'longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive ' +\n      'makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext ' +\n      'manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx ' +\n      'manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout ' +\n      'menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp ' +\n      'mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move ' +\n      'moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute ' +\n      'nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast ' +\n      'nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint ' +\n      'normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect ' +\n      'nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref ' +\n      'nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType ' +\n      'objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface ' +\n      'offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit ' +\n      'orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier ' +\n      'paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration ' +\n      'panelHistory paramDimContext paramDimension paramLocator parent parentConstraint ' +\n      'particle particleExists particleInstancer particleRenderInfo partition pasteKey ' +\n      'pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture ' +\n      'pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo ' +\n      'pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult ' +\n      'pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend ' +\n      'polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal ' +\n      'polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge ' +\n      'polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge ' +\n      'polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet ' +\n      'polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet ' +\n      'polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection ' +\n      'polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge ' +\n      'polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet ' +\n      'polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix ' +\n      'polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut ' +\n      'polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet ' +\n      'polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge ' +\n      'polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex ' +\n      'polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection ' +\n      'polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection ' +\n      'polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint ' +\n      'polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate ' +\n      'polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge ' +\n      'polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing ' +\n      'polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet ' +\n      'polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace ' +\n      'popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer ' +\n      'projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx ' +\n      'propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd ' +\n      'python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection ' +\n      'radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl ' +\n      'readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference ' +\n      'referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE ' +\n      'registerPluginResource rehash reloadImage removeJoint removeMultiInstance ' +\n      'removePanelCategory rename renameAttr renameSelectionList renameUI render ' +\n      'renderGlobalsNode renderInfo renderLayerButton renderLayerParent ' +\n      'renderLayerPostProcess renderLayerUnparent renderManip renderPartition ' +\n      'renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor ' +\n      'renderWindowSelectContext renderer reorder reorderDeformers requires reroot ' +\n      'resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget ' +\n      'reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx ' +\n      'rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout ' +\n      'runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage ' +\n      'saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale ' +\n      'scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor ' +\n      'sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable ' +\n      'scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt ' +\n      'searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey ' +\n      'selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType ' +\n      'selectedNodes selectionConnection separator setAttr setAttrEnumResource ' +\n      'setAttrMapping setAttrNiceNameResource setConstraintRestPosition ' +\n      'setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr ' +\n      'setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe ' +\n      'setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag ' +\n      'setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject ' +\n      'setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets ' +\n      'shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare ' +\n      'shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField ' +\n      'shortNameOf showHelp showHidden showManipCtx showSelectionInTitle ' +\n      'showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface ' +\n      'size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep ' +\n      'snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound ' +\n      'soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort ' +\n      'spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString ' +\n      'startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp ' +\n      'stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex ' +\n      'stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex ' +\n      'stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString ' +\n      'stringToStringArray strip stripPrefixFromName stroke subdAutoProjection ' +\n      'subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV ' +\n      'subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror ' +\n      'subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease ' +\n      'subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring ' +\n      'surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton ' +\n      'symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext ' +\n      'texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext ' +\n      'texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text ' +\n      'textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList ' +\n      'textToShelf textureDisplacePlane textureHairColor texturePlacementContext ' +\n      'textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath ' +\n      'toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower ' +\n      'toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper ' +\n      'trace track trackCtx transferAttributes transformCompare transformLimits translator ' +\n      'trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence ' +\n      'twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit ' +\n      'unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink ' +\n      'uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane ' +\n      'viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex ' +\n      'waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire ' +\n      'wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform',\n    illegal: '</',\n    contains: [\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '`', end: '`',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      {\n        className: 'variable',\n        variants: [\n          {begin: '\\\\$\\\\d'},\n          {begin: '[\\\\$\\\\%\\\\@](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)'},\n          {begin: '\\\\*(\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)', relevance: 0}\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/mizar.js",
    "content": "/*\n  Language: Mizar\n  Author: Kelley van Evert <kelleyvanevert@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: [\n      \"environ vocabularies notations constructors definitions registrations theorems schemes requirements\",\n      \"begin end definition registration cluster existence pred func defpred deffunc theorem proof\",\n      \"let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from\",\n      \"be being by means equals implies iff redefine define now not or attr is mode suppose per cases set\",\n      \"thesis contradiction scheme reserve struct\",\n      \"correctness compatibility coherence symmetry assymetry reflexivity irreflexivity\",\n      \"connectedness uniqueness commutativity idempotence involutiveness projectivity\"\n    ].join(\" \"),\n    contains: [\n      {\n        className: \"comment\",\n        begin: \"::\", end: \"$\"\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/monkey.js",
    "content": "/*\nLanguage: Monkey\nAuthor: Arthur Bikmullin <devolonter@gmail.com>\n*/\n\nfunction(hljs) {\n  var NUMBER = {\n    variants: [\n      {\n        className: 'number',\n        begin: '[$][a-fA-F0-9]+'\n      },\n      hljs.NUMBER_MODE\n    ]\n  }\n\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword: 'public private property continue exit extern new try catch ' +\n        'eachin not abstract final select case default const local global field ' +\n        'end if then else elseif endif while wend repeat until forever for to step next return module inline throw',\n\n      built_in: 'DebugLog DebugStop Error Print ACos ACosr ASin ASinr ATan ATan2 ATan2r ATanr Abs Abs Ceil ' +\n        'Clamp Clamp Cos Cosr Exp Floor Log Max Max Min Min Pow Sgn Sgn Sin Sinr Sqrt Tan Tanr Seed PI HALFPI TWOPI',\n\n      literal: 'true false null and or shl shr mod'\n    },\n    contains: [\n      {\n        className: 'comment',\n        begin: '#rem', end: '#end'\n      },\n      {\n        className: 'comment',\n        begin: \"'\", end: '$',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function method', end: '[(=:]|$',\n        illegal: /\\n/,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '$',\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'variable',\n        begin: '\\\\b(self|super)\\\\b'\n      },\n      {\n        className: 'preprocessor',\n        beginKeywords: 'import',\n        end: '$'\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\s*#', end: '$',\n        keywords: 'if else elseif endif end then'\n      },\n      {\n        className: 'pi',\n        begin: '^\\\\s*strict\\\\b'\n      },\n      {\n        beginKeywords: 'alias', end: '=',\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      hljs.QUOTE_STRING_MODE,\n      NUMBER\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/nginx.js",
    "content": "/*\nLanguage: Nginx\nAuthor: Peter Leonov <gojpeg@yandex.ru>\nContributors: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$\\d+/},\n      {begin: /\\$\\{/, end: /}/},\n      {begin: '[\\\\$\\\\@]' + hljs.UNDERSCORE_IDENT_RE}\n    ]\n  };\n  var DEFAULT = {\n    endsWithParent: true,\n    lexemes: '[a-z/_]+',\n    keywords: {\n      built_in:\n        'on off yes no true false none blocked debug info notice warn error crit ' +\n        'select break last permanent redirect kqueue rtsig epoll poll /dev/poll'\n    },\n    relevance: 0,\n    illegal: '=>',\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'string',\n        contains: [hljs.BACKSLASH_ESCAPE, VAR],\n        variants: [\n          {begin: /\"/, end: /\"/},\n          {begin: /'/, end: /'/}\n        ]\n      },\n      {\n        className: 'url',\n        begin: '([a-z]+):/', end: '\\\\s', endsWithParent: true, excludeEnd: true\n      },\n      {\n        className: 'regexp',\n        contains: [hljs.BACKSLASH_ESCAPE, VAR],\n        variants: [\n          {begin: \"\\\\s\\\\^\", end: \"\\\\s|{|;\", returnEnd: true},\n          // regexp locations (~, ~*)\n          {begin: \"~\\\\*?\\\\s+\", end: \"\\\\s|{|;\", returnEnd: true},\n          // *.example.com\n          {begin: \"\\\\*(\\\\.[a-z\\\\-]+)+\"},\n          // sub.example.*\n          {begin: \"([a-z\\\\-]+\\\\.)+\\\\*\"}\n        ]\n      },\n      // IP\n      {\n        className: 'number',\n        begin: '\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b'\n      },\n      // units\n      {\n        className: 'number',\n        begin: '\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b',\n        relevance: 0\n      },\n      VAR\n    ]\n  };\n\n  return {\n    aliases: ['nginxconf'],\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s', end: ';|{', returnBegin: true,\n        contains: [\n          {\n            className: 'title',\n            begin: hljs.UNDERSCORE_IDENT_RE,\n            starts: DEFAULT\n          }\n        ],\n        relevance: 0\n      }\n    ],\n    illegal: '[^\\\\s\\\\}]'\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/nimrod.js",
    "content": "/*\nLanguage: Nimrod\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword: 'addr and as asm bind block break|0 case|0 cast const|0 continue|0 converter discard distinct|10 div do elif else|0 end|0 enum|0 except export finally for from generic if|0 import|0 in include|0 interface is isnot|10 iterator|10 let|0 macro method|10 mixin mod nil not notin|10 object|0 of or out proc|10 ptr raise ref|10 return shl shr static template|10 try|0 tuple type|0 using|0 var|0 when while|0 with without xor yield',\n      literal: 'shared guarded stdin stdout stderr result|10 true false'\n    },\n    contains: [ {\n        className: 'decorator', // Actually pragma\n        begin: /{\\./,\n        end: /\\.}/,\n        relevance: 10\n      }, {\n        className: 'string',\n        begin: /[a-zA-Z]\\w*\"/,\n        end: /\"/,\n        contains: [{begin: /\"\"/}]\n      }, {\n        className: 'string',\n        begin: /([a-zA-Z]\\w*)?\"\"\"/,\n        end: /\"\"\"/\n      }, {\n        className: 'string',\n        begin: /\"/,\n        end: /\"/,\n        illegal: /\\n/,\n        contains: [{begin: /\\\\./}]\n      }, {\n        className: 'type',\n        begin: /\\b[A-Z]\\w+\\b/,\n        relevance: 0\n      }, {\n        className: 'type',\n        begin: /\\b(int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|float|float32|float64|bool|char|string|cstring|pointer|expr|stmt|void|auto|any|range|array|openarray|varargs|seq|set|clong|culong|cchar|cschar|cshort|cint|csize|clonglong|cfloat|cdouble|clongdouble|cuchar|cushort|cuint|culonglong|cstringarray|semistatic)\\b/\n      }, {\n        className: 'number',\n        begin: /\\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(\\d[_\\d]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      },\n      hljs.HASH_COMMENT_MODE\n    ]\n  }\n}"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/nix.js",
    "content": "/*\nLanguage: Nix\nAuthor: Domen Kožar <domen@dev.si>\nDescription: Nix functional language. See http://nixos.org/nix\n*/\n\n\nfunction(hljs) {\n  var NIX_KEYWORDS = {\n    keyword: 'rec with let in inherit assert if else then',\n    constant: 'true false or and null',\n    built_in:\n      'import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation'\n  };\n  var ANTIQUOTE = {\n    className: 'subst',\n    begin: /\\$\\{/,\n    end: /\\}/,\n    keywords: NIX_KEYWORDS\n  };\n  var ATTRS = {\n    className: 'variable',\n    // TODO: we have to figure out a way how to exclude \\s*=\n    begin: /[a-zA-Z0-9-_]+(\\s*=)/\n  };\n  var SINGLE_QUOTE = {\n    className: 'string',\n    begin: \"''\",\n    end: \"''\",\n    contains: [\n      ANTIQUOTE\n    ]\n  };\n  var DOUBLE_QUOTE = {\n    className: 'string',\n    begin: '\"',\n    end: '\"',\n    contains: [\n      ANTIQUOTE\n    ]\n  };\n  var EXPRESSIONS = [\n    hljs.NUMBER_MODE,\n    hljs.HASH_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    SINGLE_QUOTE,\n    DOUBLE_QUOTE,\n    ATTRS\n  ];  \n  ANTIQUOTE.contains = EXPRESSIONS;\n  return {\n    aliases: [\"nixos\"],\n    keywords: NIX_KEYWORDS,\n    contains: EXPRESSIONS\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/nsis.js",
    "content": "/*\nLanguage: NSIS\nDescription: Nullsoft Scriptable Install System\nAuthor: Jan T. Sott <jan.sott@gmail.com>\nWebsite: http://github.com/idleberg\n*/\n\nfunction(hljs) {\n  var CONSTANTS = {\n    className: 'symbol',\n    begin: '\\\\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)'\n  };\n\n  var DEFINES = {\n    // ${defines}\n    className: 'constant',\n    begin: '\\\\$+{[a-zA-Z0-9_]+}'\n  };\n\n  var VARIABLES = {\n    // $variables\n    className: 'variable',\n    begin: '\\\\$+[a-zA-Z0-9_]+',\n    illegal: '\\\\(\\\\){}'\n  };\n\n  var LANGUAGES = {\n    // $(language_strings)\n    className: 'constant',\n    begin: '\\\\$+\\\\([a-zA-Z0-9_]+\\\\)'\n  };\n\n  var PARAMETERS = {\n    // command parameters\n    className: 'params',\n    begin: '(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)'\n  };\n\n  var COMPILER ={\n    // !compiler_flags\n    className: 'constant',\n    begin: '\\\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)'\n  };\n\n  return {\n    case_insensitive: false,\n    keywords: {\n      keyword:\n      'Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetPluginUnload SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption SubSectionEnd Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle',\n      literal:\n      'admin all auto both colored current false force hide highest lastused leave listonly none normal notset off on open print show silent silentlog smooth textonly true user '\n    },\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"', end: '\"',\n        illegal: '\\\\n',\n        contains: [\n          { // $\\n, $\\r, $\\t, $$\n            className: 'symbol',\n            begin: '\\\\$(\\\\\\\\(n|r|t)|\\\\$)'\n          },\n          CONSTANTS,\n          DEFINES,\n          VARIABLES,\n          LANGUAGES\n        ]\n      },\n      { // line comments\n        className: 'comment',\n        begin: ';', end: '$',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'Function PageEx Section SectionGroup SubSection', end: '$'\n      },\n      COMPILER,\n      DEFINES,\n      VARIABLES,\n      LANGUAGES,\n      PARAMETERS,\n      hljs.NUMBER_MODE,\n      { // plug::ins\n        className: 'literal',\n        begin: hljs.IDENT_RE + '::' + hljs.IDENT_RE\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/objectivec.js",
    "content": "/*\nLanguage: Objective C\nAuthor: Valerii Hiora <valerii.hiora@gmail.com>\nContributors: Angel G. Olloqui <angelgarcia.mail@gmail.com>\n*/\n\nfunction(hljs) {\n  var OBJC_KEYWORDS = {\n    keyword:\n      'int float while char export sizeof typedef const struct for union ' +\n      'unsigned long volatile static bool mutable if do return goto void ' +\n      'enum else break extern asm case short default double register explicit ' +\n      'signed typename this switch continue wchar_t inline readonly assign ' +\n      'readwrite self @synchronized id typeof ' +\n      'nonatomic super unichar IBOutlet IBAction strong weak copy ' +\n      'in out inout bycopy byref oneway __strong __weak __block __autoreleasing ' +\n      '@private @protected @public @try @property @end @throw @catch @finally ' +\n      '@autoreleasepool @synthesize @dynamic @selector @optional @required',\n    literal:\n    \t'false true FALSE TRUE nil YES NO NULL',\n    built_in:\n      'NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView ' +\n      'NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet ' +\n      'UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread ' +\n      'UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool ' +\n      'UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray ' +\n      'NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController ' +\n      'UINavigationBar UINavigationController UITabBarController UIPopoverController ' +\n      'UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController ' +\n      'NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor ' +\n      'UIFont UIApplication NSNotFound NSNotificationCenter NSNotification ' +\n      'UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar ' +\n      'NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection ' +\n      'UIInterfaceOrientation MPMoviePlayerController dispatch_once_t ' +\n      'dispatch_queue_t dispatch_sync dispatch_async dispatch_once'\n  };\n  var LEXEMES = /[a-zA-Z@][a-zA-Z0-9_]*/;\n  var CLASS_KEYWORDS = '@interface @class @protocol @implementation';\n  return {\n    aliases: ['m', 'mm', 'objc', 'obj-c'],\n    keywords: OBJC_KEYWORDS, lexemes: LEXEMES,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        variants: [\n          {\n            begin: '@\"', end: '\"',\n            illegal: '\\\\n',\n            contains: [hljs.BACKSLASH_ESCAPE]\n          },\n          {\n            begin: '\\'', end: '[^\\\\\\\\]\\'',\n            illegal: '[^\\\\\\\\][^\\']'\n          }\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#',\n        end: '$',\n        contains: [\n          {\n            className: 'title',\n            variants: [\n              { begin: '\\\"', end: '\\\"' },\n              { begin: '<', end: '>' }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        begin: '(' + CLASS_KEYWORDS.split(' ').join('|') + ')\\\\b', end: '({|$)', excludeEnd: true,\n        keywords: CLASS_KEYWORDS, lexemes: LEXEMES,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'variable',\n        begin: '\\\\.'+hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/ocaml.js",
    "content": "/*\nLanguage: OCaml\nAuthor: Mehdi Dogguy <mehdi@dogguy.org>\nContributors: Nicolas Braud-Santoni <nicolas.braud-santoni@ens-cachan.fr>\nDescription: OCaml language definition.\n*/\nfunction(hljs) {\n  return {\n    aliases: ['ml'],\n    keywords: {\n      keyword:\n        'and as assert asr begin class constraint do done downto else end ' +\n        'exception external false for fun function functor if in include ' +\n        'inherit initializer land lazy let lor lsl lsr lxor match method ' +\n        'mod module mutable new object of open or private rec ref sig struct ' +\n        'then to true try type val virtual when while with parser value',\n      built_in:\n        'bool char float int list unit array exn option int32 int64 nativeint ' +\n        'format4 format6 lazy_t in_channel out_channel string'\n    },\n    illegal: /\\/\\//,\n    contains: [\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n        contains: ['self']\n      },\n      {\n        className: 'class',\n        beginKeywords: 'type', end: '\\\\(|=|$', excludeEnd: true,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'annotation',\n        begin: '\\\\[<', end: '>\\\\]'\n      },\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      hljs.C_NUMBER_MODE\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/oxygene.js",
    "content": "/*\nLanguage: Oxygene\nAuthor: Carlo Kok <ck@remobjects.com>\nDescription: Language definition for RemObjects Oxygene (http://www.remobjects.com)\n*/\n\nfunction(hljs) {\n  var OXYGENE_KEYWORDS = 'abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue '+\n    'create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false '+\n    'final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited '+\n    'inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of '+\n    'old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly '+\n    'record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple '+\n    'type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal '+\n    'register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained';\n  var CURLY_COMMENT =  {\n    className: 'comment',\n    begin: '{', end: '}',\n    relevance: 0\n  };\n  var PAREN_COMMENT = {\n    className: 'comment',\n    begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n    relevance: 10\n  };\n  var STRING = {\n    className: 'string',\n    begin: '\\'', end: '\\'',\n    contains: [{begin: '\\'\\''}]\n  };\n  var CHAR_STRING = {\n    className: 'string', begin: '(#\\\\d+)+'\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'function constructor destructor procedure method', end: '[:;]',\n    keywords: 'function constructor|10 destructor|10 procedure|10 method|10',\n    contains: [\n      hljs.TITLE_MODE,\n      {\n        className: 'params',\n        begin: '\\\\(', end: '\\\\)',\n        keywords: OXYGENE_KEYWORDS,\n        contains: [STRING, CHAR_STRING]\n      },\n      CURLY_COMMENT, PAREN_COMMENT\n    ]\n  };\n  return {\n    case_insensitive: true,\n    keywords: OXYGENE_KEYWORDS,\n    illegal: '(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',\n    contains: [\n      CURLY_COMMENT, PAREN_COMMENT, hljs.C_LINE_COMMENT_MODE,\n      STRING, CHAR_STRING,\n      hljs.NUMBER_MODE,\n      FUNCTION,\n      {\n        className: 'class',\n        begin: '=\\\\bclass\\\\b', end: 'end;',\n        keywords: OXYGENE_KEYWORDS,\n        contains: [\n          STRING, CHAR_STRING,\n          CURLY_COMMENT, PAREN_COMMENT, hljs.C_LINE_COMMENT_MODE,\n          FUNCTION\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/parser3.js",
    "content": "/*\nLanguage: Parser3\nRequires: xml.js\nAuthor: Oleg Volchkov <oleg@volchkov.net>\n*/\n\nfunction(hljs) {\n  return {\n    subLanguage: 'xml', relevance: 0,\n    contains: [\n      {\n        className: 'comment',\n        begin: '^#', end: '$'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\^rem{', end: '}',\n        relevance: 10,\n        contains: [\n          {\n            begin: '{', end: '}',\n            contains: ['self']\n          }\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '^@(?:BASE|USE|CLASS|OPTIONS)$',\n        relevance: 10\n      },\n      {\n        className: 'title',\n        begin: '@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$'\n      },\n      {\n        className: 'variable',\n        begin: '\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?'\n      },\n      {\n        className: 'keyword',\n        begin: '\\\\^[\\\\w\\\\-\\\\.\\\\:]+'\n      },\n      {\n        className: 'number',\n        begin: '\\\\^#[0-9a-fA-F]+'\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/perl.js",
    "content": "/*\nLanguage: Perl\nAuthor: Peter Leonov <gojpeg@yandex.ru>\n*/\n\nfunction(hljs) {\n  var PERL_KEYWORDS = 'getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ' +\n    'ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime ' +\n    'readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq' +\n    'fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent ' +\n    'shutdown dump chomp connect getsockname die socketpair close flock exists index shmget' +\n    'sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr ' +\n    'unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 ' +\n    'getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline ' +\n    'endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand ' +\n    'mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink ' +\n    'getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr ' +\n    'untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link ' +\n    'getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller ' +\n    'lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and ' +\n    'sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 ' +\n    'chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach ' +\n    'tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir' +\n    'ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe ' +\n    'atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when';\n  var SUBST = {\n    className: 'subst',\n    begin: '[$@]\\\\{', end: '\\\\}',\n    keywords: PERL_KEYWORDS\n  };\n  var METHOD = {\n    begin: '->{', end: '}'\n    // contains defined later\n  };\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$\\d/},\n      {begin: /[\\$\\%\\@](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},\n      {begin: /[\\$\\%\\@][^\\s\\w{]/, relevance: 0}\n    ]\n  };\n  var COMMENT = {\n    className: 'comment',\n    begin: '^(__END__|__DATA__)', end: '\\\\n$',\n    relevance: 5\n  };\n  var STRING_CONTAINS = [hljs.BACKSLASH_ESCAPE, SUBST, VAR];\n  var PERL_DEFAULT_CONTAINS = [\n    VAR,\n    hljs.HASH_COMMENT_MODE,\n    COMMENT,\n    {\n      className: 'comment',\n      begin: '^\\\\=\\\\w', end: '\\\\=cut', endsWithParent: true\n    },\n    METHOD,\n    {\n      className: 'string',\n      contains: STRING_CONTAINS,\n      variants: [\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\(', end: '\\\\)',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\[', end: '\\\\]',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\{', end: '\\\\}',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\|', end: '\\\\|',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\<', end: '\\\\>',\n          relevance: 5\n        },\n        {\n          begin: 'qw\\\\s+q', end: 'q',\n          relevance: 5\n        },\n        {\n          begin: '\\'', end: '\\'',\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: '\"', end: '\"'\n        },\n        {\n          begin: '`', end: '`',\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: '{\\\\w+}',\n          contains: [],\n          relevance: 0\n        },\n        {\n          begin: '\\-?\\\\w+\\\\s*\\\\=\\\\>',\n          contains: [],\n          relevance: 0\n        }\n      ]\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    { // regexp container\n      begin: '(\\\\/\\\\/|' + hljs.RE_STARTERS_RE + '|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*',\n      keywords: 'split return print reverse grep',\n      relevance: 0,\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        COMMENT,\n        {\n          className: 'regexp',\n          begin: '(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*',\n          relevance: 10\n        },\n        {\n          className: 'regexp',\n          begin: '(m|qr)?/', end: '/[a-z]*',\n          contains: [hljs.BACKSLASH_ESCAPE],\n          relevance: 0 // allows empty \"//\" which is a common comment delimiter in other languages\n        }\n      ]\n    },\n    {\n      className: 'sub',\n      beginKeywords: 'sub', end: '(\\\\s*\\\\(.*?\\\\))?[;{]',\n      relevance: 5\n    },\n    {\n      className: 'operator',\n      begin: '-\\\\w\\\\b',\n      relevance: 0\n    }\n  ];\n  SUBST.contains = PERL_DEFAULT_CONTAINS;\n  METHOD.contains = PERL_DEFAULT_CONTAINS;\n\n  return {\n    aliases: ['pl'],\n    keywords: PERL_KEYWORDS,\n    contains: PERL_DEFAULT_CONTAINS\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/php.js",
    "content": "/*\nLanguage: PHP\nAuthor: Victor Karamzin <Victor.Karamzin@enterra-inc.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable', begin: '(\\\\$|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*'\n  };\n  var PREPROCESSOR = {\n    className: 'preprocessor', begin: /<\\?(php)?|\\?>/\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, PREPROCESSOR],\n    variants: [\n      {\n        begin: 'b\"', end: '\"'\n      },\n      {\n        begin: 'b\\'', end: '\\''\n      },\n      hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null})\n    ]\n  };\n  var NUMBER = {variants: [hljs.BINARY_NUMBER_MODE, hljs.C_NUMBER_MODE]};\n  return {\n    aliases: ['php3', 'php4', 'php5', 'php6'],\n    case_insensitive: true,\n    keywords:\n      'and include_once list abstract global private echo interface as static endswitch ' +\n      'array null if endwhile or const for endforeach self var while isset public ' +\n      'protected exit foreach throw elseif include __FILE__ empty require_once do xor ' +\n      'return parent clone use __CLASS__ __LINE__ else break print eval new ' +\n      'catch __METHOD__ case exception default die require __FUNCTION__ ' +\n      'enddeclare final try switch continue endfor endif declare unset true false ' +\n      'trait goto instanceof insteadof __DIR__ __NAMESPACE__ ' +\n      'yield finally',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'comment',\n        begin: '/\\\\*', end: '\\\\*/',\n        contains: [\n          {\n            className: 'phpdoc',\n            begin: '\\\\s@[A-Za-z]+'\n          },\n          PREPROCESSOR\n        ]\n      },\n      {\n          className: 'comment',\n          begin: '__halt_compiler.+?;', endsWithParent: true,\n          keywords: '__halt_compiler', lexemes: hljs.UNDERSCORE_IDENT_RE\n      },\n      {\n        className: 'string',\n        begin: '<<<[\\'\"]?\\\\w+[\\'\"]?$', end: '^\\\\w+;',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      PREPROCESSOR,\n      VARIABLE,\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /[;{]/, excludeEnd: true,\n        illegal: '\\\\$|\\\\[|%',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              'self',\n              VARIABLE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRING,\n              NUMBER\n            ]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        illegal: /[:\\(\\$\"]/,\n        contains: [\n          {\n            beginKeywords: 'extends implements',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        beginKeywords: 'namespace', end: ';',\n        illegal: /[\\.']/,\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        beginKeywords: 'use', end: ';',\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        begin: '=>' // No markup, just a relevance booster\n      },\n      STRING,\n      NUMBER\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/profile.js",
    "content": "/*\nLanguage: Python profile\nDescription: Python profiler results\nAuthor: Brian Beck <exogen@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    contains: [\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'built_in',\n        begin: '{', end: '}$',\n        excludeBegin: true, excludeEnd: true,\n        contains: [hljs.APOS_STRING_MODE, hljs.QUOTE_STRING_MODE],\n        relevance: 0\n      },\n      {\n        className: 'filename',\n        begin: '[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}', end: ':',\n        excludeEnd: true\n      },\n      {\n        className: 'header',\n        begin: '(ncalls|tottime|cumtime)', end: '$',\n        keywords: 'ncalls tottime|10 cumtime|10 filename',\n        relevance: 10\n      },\n      {\n        className: 'summary',\n        begin: 'function calls', end: '$',\n        contains: [hljs.C_NUMBER_MODE],\n        relevance: 10\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'function',\n        begin: '\\\\(', end: '\\\\)$',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ],\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/protobuf.js",
    "content": "/*\nLanguage: Protocol Buffers\nAuthor: Dan Tao <daniel.tao@gmail.com>\nDescription: Protocol buffer message definition format\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword: 'package import option optional required repeated group',\n      built_in: 'double float int32 int64 uint32 uint64 sint32 sint64 ' +\n        'fixed32 fixed64 sfixed32 sfixed64 bool string bytes',\n      literal: 'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'message enum service', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'function',\n        beginKeywords: 'rpc',\n        end: /;/, excludeEnd: true,\n        keywords: 'rpc returns'\n      },\n      {\n        className: 'constant',\n        begin: /^\\s*[A-Z_]+/,\n        end: /\\s*=/, excludeEnd: true\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/python.js",
    "content": "/*\nLanguage: Python\n*/\n\nfunction(hljs) {\n  var PROMPT = {\n    className: 'prompt',  begin: /^(>>>|\\.\\.\\.) /\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE],\n    variants: [\n      {\n        begin: /(u|b)?r?'''/, end: /'''/,\n        contains: [PROMPT],\n        relevance: 10\n      },\n      {\n        begin: /(u|b)?r?\"\"\"/, end: /\"\"\"/,\n        contains: [PROMPT],\n        relevance: 10\n      },\n      {\n        begin: /(u|r|ur)'/, end: /'/,\n        relevance: 10\n      },\n      {\n        begin: /(u|r|ur)\"/, end: /\"/,\n        relevance: 10\n      },\n      {\n        begin: /(b|br)'/, end: /'/\n      },\n      {\n        begin: /(b|br)\"/, end: /\"/\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n  var NUMBER = {\n    className: 'number', relevance: 0,\n    variants: [\n      {begin: hljs.BINARY_NUMBER_RE + '[lLjJ]?'},\n      {begin: '\\\\b(0o[0-7]+)[lLjJ]?'},\n      {begin: hljs.C_NUMBER_RE + '[lLjJ]?'}\n    ]\n  };\n  var PARAMS = {\n    className: 'params',\n    begin: /\\(/, end: /\\)/,\n    contains: ['self', PROMPT, NUMBER, STRING]\n  };\n  var FUNC_CLASS_PROTO = {\n    end: /:/,\n    illegal: /[${=;\\n]/,\n    contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]\n  };\n\n  return {\n    aliases: ['py', 'gyp'],\n    keywords: {\n      keyword:\n        'and elif is global as in if from raise for except finally print import pass return ' +\n        'exec else break not with class assert yield try while continue del or def lambda ' +\n        'nonlocal|10 None True False',\n      built_in:\n        'Ellipsis NotImplemented'\n    },\n    illegal: /(<\\/|->|\\?)/,\n    contains: [\n      PROMPT,\n      NUMBER,\n      STRING,\n      hljs.HASH_COMMENT_MODE,\n      hljs.inherit(FUNC_CLASS_PROTO, {className: 'function', beginKeywords: 'def', relevance: 10}),\n      hljs.inherit(FUNC_CLASS_PROTO, {className: 'class', beginKeywords: 'class'}),\n      {\n        className: 'decorator',\n        begin: /@/, end: /$/\n      },\n      {\n        begin: /\\b(print|exec)\\(/ // don’t highlight keywords-turned-functions in Python 3\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/r.js",
    "content": "/*\nLanguage: R\nAuthor: Joe Cheng <joe@rstudio.org>\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*';\n\n  return {\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: IDENT_RE,\n        lexemes: IDENT_RE,\n        keywords: {\n          keyword:\n            'function if in break next repeat else for return switch while try tryCatch|10 ' +\n            'stop warning require library attach detach source setMethod setGeneric ' +\n            'setGroupGeneric setClass ...|10',\n          literal:\n            'NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 ' +\n            'NA_complex_|10'\n        },\n        relevance: 0\n      },\n      {\n        // hex value\n        className: 'number',\n        begin: \"0[xX][0-9a-fA-F]+[Li]?\\\\b\",\n        relevance: 0\n      },\n      {\n        // explicit integer\n        className: 'number',\n        begin: \"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",\n        relevance: 0\n      },\n      {\n        // number with trailing decimal\n        className: 'number',\n        begin: \"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",\n        relevance: 0\n      },\n      {\n        // number\n        className: 'number',\n        begin: \"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",\n        relevance: 0\n      },\n      {\n        // number with leading decimal\n        className: 'number',\n        begin: \"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",\n        relevance: 0\n      },\n\n      {\n        // escaped identifier\n        begin: '`',\n        end: '`',\n        relevance: 0\n      },\n\n      {\n        className: 'string',\n        contains: [hljs.BACKSLASH_ESCAPE],\n        variants: [\n          {begin: '\"', end: '\"'},\n          {begin: \"'\", end: \"'\"}\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/rib.js",
    "content": "/*\nLanguage: RenderMan RIB\nAuthor: Konstantin Evdokimenko <qewerty@gmail.com>\nContributors: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords:\n      'ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis ' +\n      'Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone ' +\n      'CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail ' +\n      'DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format ' +\n      'FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry ' +\n      'Hider Hyperboloid Identity Illuminate Imager Interior LightSource ' +\n      'MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte ' +\n      'MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option ' +\n      'Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples ' +\n      'PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection ' +\n      'Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ' +\n      'ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere ' +\n      'SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd ' +\n      'TransformPoints Translate TrimCurve WorldBegin WorldEnd',\n    illegal: '</',\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/rsl.js",
    "content": "/*\nLanguage: RenderMan RSL\nAuthor: Konstantin Evdokimenko <qewerty@gmail.com>\nContributors: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        'float color point normal vector matrix while for if do return else break extern continue',\n      built_in:\n        'abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise ' +\n        'clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp ' +\n        'faceforward filterstep floor format fresnel incident length lightsource log match ' +\n        'max min mod noise normalize ntransform opposite option phong pnoise pow printf ' +\n        'ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp ' +\n        'setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan ' +\n        'texture textureinfo trace transform vtransform xcomp ycomp zcomp'\n    },\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      },\n      {\n        className: 'shader',\n        beginKeywords: 'surface displacement light volume imager', end: '\\\\('\n      },\n      {\n        className: 'shading',\n        beginKeywords: 'illuminate illuminance gather', end: '\\\\('\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/ruby.js",
    "content": "/*\nLanguage: Ruby\nAuthor: Anton Kovalyov <anton@kovalyov.net>\nContributors: Peter Leonov <gojpeg@yandex.ru>, Vasily Polovnyov <vast@whiteants.net>, Loren Segal <lsegal@soen.ca>, Pascal Hurni <phi@ruby-reactive.org>\n*/\n\nfunction(hljs) {\n  var RUBY_METHOD_RE = '[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?';\n  var RUBY_KEYWORDS =\n    'and false then defined module in return redo if BEGIN retry end for true self when ' +\n    'next until do begin unless END rescue nil else break undef not super class case ' +\n    'require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor';\n  var YARDOCTAG = {\n    className: 'yardoctag',\n    begin: '@[A-Za-z]+'\n  };\n  var IRB_OBJECT = {\n    className: 'value',\n    begin: '#<', end: '>'\n  };\n  var COMMENT = {\n    className: 'comment',\n    variants: [\n      {\n        begin: '#', end: '$',\n        contains: [YARDOCTAG]\n      },\n      {\n        begin: '^\\\\=begin', end: '^\\\\=end',\n        contains: [YARDOCTAG],\n        relevance: 10\n      },\n      {\n        begin: '^__END__', end: '\\\\n$'\n      }\n    ]\n  };\n  var SUBST = {\n    className: 'subst',\n    begin: '#\\\\{', end: '}',\n    keywords: RUBY_KEYWORDS\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n    variants: [\n      {begin: /'/, end: /'/},\n      {begin: /\"/, end: /\"/},\n      {begin: '%[qw]?\\\\(', end: '\\\\)'},\n      {begin: '%[qw]?\\\\[', end: '\\\\]'},\n      {begin: '%[qw]?{', end: '}'},\n      {begin: '%[qw]?<', end: '>'},\n      {begin: '%[qw]?/', end: '/'},\n      {begin: '%[qw]?%', end: '%'},\n      {begin: '%[qw]?-', end: '-'},\n      {begin: '%[qw]?\\\\|', end: '\\\\|'},\n      {\n        // \\B in the beginning suppresses recognition of ?-sequences where ?\n        // is the last character of a preceding identifier, as in: `func?4`\n        begin: /\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/\n      }\n    ]\n  };\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    keywords: RUBY_KEYWORDS\n  };\n\n  var RUBY_DEFAULT_CONTAINS = [\n    STRING,\n    IRB_OBJECT,\n    COMMENT,\n    {\n      className: 'class',\n      beginKeywords: 'class module', end: '$|;',\n      illegal: /=/,\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: '[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?'}),\n        {\n          className: 'inheritance',\n          begin: '<\\\\s*',\n          contains: [{\n            className: 'parent',\n            begin: '(' + hljs.IDENT_RE + '::)?' + hljs.IDENT_RE\n          }]\n        },\n        COMMENT\n      ]\n    },\n    {\n      className: 'function',\n      beginKeywords: 'def', end: ' |$|;',\n      relevance: 0,\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: RUBY_METHOD_RE}),\n        PARAMS,\n        COMMENT\n      ]\n    },\n    {\n      className: 'constant',\n      begin: '(::)?(\\\\b[A-Z]\\\\w*(::)?)+',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':',\n      contains: [STRING, {begin: RUBY_METHOD_RE}],\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: hljs.UNDERSCORE_IDENT_RE + '(\\\\!|\\\\?)?:',\n      relevance: 0\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    {\n      className: 'variable',\n      begin: '(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))'\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + ')\\\\s*',\n      contains: [\n        IRB_OBJECT,\n        COMMENT,\n        {\n          className: 'regexp',\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n          illegal: /\\n/,\n          variants: [\n            {begin: '/', end: '/[a-z]*'},\n            {begin: '%r{', end: '}[a-z]*'},\n            {begin: '%r\\\\(', end: '\\\\)[a-z]*'},\n            {begin: '%r!', end: '![a-z]*'},\n            {begin: '%r\\\\[', end: '\\\\][a-z]*'}\n          ]\n        }\n      ],\n      relevance: 0\n    }\n  ];\n  SUBST.contains = RUBY_DEFAULT_CONTAINS;\n  PARAMS.contains = RUBY_DEFAULT_CONTAINS;\n  \n  var IRB_DEFAULT = [\n    {\n      relevance: 1,\n      className: 'output',\n      begin: '^\\\\s*=> ', end: \"$\",\n      returnBegin: true,\n      contains: [\n        {\n          className: 'status',\n          begin: '^\\\\s*=>'\n        },\n        {\n          begin: ' ', end: '$',\n          contains: RUBY_DEFAULT_CONTAINS\n        }\n      ]\n    },\n    {\n      relevance: 1,\n      className: 'input',\n      begin: '^[^ ][^=>]*>+ ', end: \"$\",\n      returnBegin: true,\n      contains: [\n        {\n          className: 'prompt',\n          begin: '^[^ ][^=>]*>+'\n        },\n        {\n          begin: ' ', end: '$',\n          contains: RUBY_DEFAULT_CONTAINS\n        }\n      ]\n    }\n  ];\n\n  return {\n    aliases: ['rb', 'gemspec', 'podspec', 'thor', 'irb'],\n    keywords: RUBY_KEYWORDS,\n    contains: IRB_DEFAULT.concat(RUBY_DEFAULT_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/ruleslanguage.js",
    "content": "/*\nLanguage: Oracle Rules Language\nAuthor: Jason Jacobson <jason.a.jacobson@gmail.com>\nDescription: The Oracle Utilities Rules Language is used to program the Oracle Utilities Applications acquired from LODESTAR Corporation.  The products include Billing Component, LPSS, Pricing Component etc. through version 1.6.1.\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n       keyword: 'BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE ' +\n         'INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 ' +\n         'INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 ' +\n         'INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 ' +\n         'INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 ' +\n         'INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 ' +\n         'INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 ' +\n         'INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 ' +\n         'INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 ' +\n         'INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 ' +\n         'INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 ' +\n         'INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 ' +\n         'INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 ' +\n         'INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 ' +\n         'INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 ' +\n         'MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER ' +\n         'OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE ' +\n         'NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH ' +\n         'IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND ' +\n         'UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ' +\n         'ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE ' +\n         'GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE ' +\n         'SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING ' +\n         'DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF ' +\n         'MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY ' +\n         'YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE ' +\n         'COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR ' +\n         'READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ' +\n         'ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE ' +\n         'EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE ' +\n         'SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL ' +\n         'COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN ' +\n         'MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING ' +\n         'FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ' +\n         'NUMDAYS READ_DATE STAGING',\n       built_in: 'IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML ' +\n         'DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT ' +\n         'DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE ' +\n         'DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT ' +\n         'DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME'\n    },\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      { className: 'array',\n        begin: '\\#[a-zA-Z\\ \\.]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/rust.js",
    "content": "/*\nLanguage: Rust\nAuthor: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>\nContributors: Roman Shmatov <romanshmatov@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['rs'],\n    keywords:\n      'alignof as be box break const continue crate do else enum extern ' +\n      'false fn for if impl in let loop match mod mut offsetof once priv ' +\n      'proc pub pure ref return self sizeof static struct super trait true ' +\n      'type typeof unsafe unsized use virtual while yield ' +\n      'int i8 i16 i32 i64 ' +\n      'uint u8 u32 u64 ' +\n      'float f32 f64 ' +\n      'str char bool',\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      {\n        className: 'string',\n        begin: /r(#*)\".*?\"\\1(?!#)/\n      },\n      {\n        className: 'string',\n        begin: /'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/\n      },\n      {\n        begin: /'[a-zA-Z_][a-zA-Z0-9_]*/\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'fn', end: '(\\\\(|<)', excludeEnd: true,\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#\\\\[', end: '\\\\]'\n      },\n      {\n        beginKeywords: 'type', end: '(=|<)',\n        contains: [hljs.UNDERSCORE_TITLE_MODE],\n        illegal: '\\\\S'\n      },\n      {\n        beginKeywords: 'trait enum', end: '({|<)',\n        contains: [hljs.UNDERSCORE_TITLE_MODE],\n        illegal: '\\\\S'\n      },\n      {\n        begin: hljs.IDENT_RE + '::'\n      },\n      {\n        begin: '->'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/scala.js",
    "content": "/*\nLanguage: Scala\nAuthor: Jan Berkel <jan.berkel@gmail.com>\n*/\n\nfunction(hljs) {\n  var ANNOTATION = {\n    className: 'annotation', begin: '@[A-Za-z]+'\n  };\n  var STRING = {\n    className: 'string',\n    begin: 'u?r?\"\"\"', end: '\"\"\"',\n    relevance: 10\n  };\n  var SYMBOL = {\n    className: 'symbol',\n    begin: '\\'\\\\w[\\\\w\\\\d_]*(?!\\')'\n  };\n  return {\n    keywords:\n      'type yield lazy override def with val var false true sealed abstract private trait ' +\n      'object null if for while throw finally protected extends import final return else ' +\n      'break new catch super class case package default try this match continue throws',\n    contains: [\n      {\n        className: 'javadoc',\n        begin: '/\\\\*\\\\*', end: '\\\\*/',\n        contains: [{\n          className: 'javadoctag',\n          begin: '@[A-Za-z]+'\n        }],\n        relevance: 10\n      },\n      hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE,\n      STRING, hljs.QUOTE_STRING_MODE,\n      SYMBOL,\n      {\n        className: 'class',\n        begin: '((case )?class |object |trait )', // beginKeywords won't work because a single \"case\" shouldn't start this mode\n        end: '({|$)', excludeEnd: true,\n        illegal: ':',\n        keywords: 'case class trait object',\n        contains: [\n          {\n            beginKeywords: 'extends with',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.QUOTE_STRING_MODE, STRING,\n              ANNOTATION\n            ]\n          }\n        ]\n      },\n      hljs.C_NUMBER_MODE,\n      ANNOTATION\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/scilab.js",
    "content": "/*\nLanguage: Scilab\nAuthor: Sylvestre Ledru <sylvestre.ledru@scilab-enterprises.com>\nOrigin: matlab.js\nDescription: Scilab is a port from Matlab\n*/\n\nfunction(hljs) {\n\n  var COMMON_CONTAINS = [\n    hljs.C_NUMBER_MODE,\n    {\n      className: 'string',\n      begin: '\\'|\\\"', end: '\\'|\\\"',\n      contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n    }\n  ];\n\n  return {\n    aliases: ['sci'],\n    keywords: {\n      keyword: 'abort break case clear catch continue do elseif else endfunction end for function'+\n        'global if pause return resume select try then while'+\n        '%f %F %t %T %pi %eps %inf %nan %e %i %z %s',\n      built_in: // Scilab has more than 2000 functions. Just list the most commons\n       'abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error'+\n       'exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty'+\n       'isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log'+\n       'max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real'+\n       'round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan'+\n       'type typename warning zeros matrix'\n    },\n    illegal: '(\"|#|/\\\\*|\\\\s+/\\\\w+)',\n    contains: [\n      {\n        className: 'function',\n        beginKeywords: 'function endfunction', end: '$',\n        keywords: 'function endfunction|10',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)'\n          }\n        ]\n      },\n      {\n        className: 'transposed_variable',\n        begin: '[a-zA-Z_][a-zA-Z_0-9]*(\\'+[\\\\.\\']*|[\\\\.\\']+)', end: '',\n        relevance: 0\n      },\n      {\n        className: 'matrix',\n        begin: '\\\\[', end: '\\\\]\\'*[\\\\.\\']*',\n        relevance: 0,\n        contains: COMMON_CONTAINS\n      },\n      {\n        className: 'comment',\n        begin: '//', end: '$'\n      }\n    ].concat(COMMON_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/scss.js",
    "content": "/*\nLanguage: SCSS\nAuthor: Kurt Emch <kurt@kurtemch.com>\n*/\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  var VARIABLE = {\n    className: 'variable',\n    begin: '(\\\\$' + IDENT_RE + ')\\\\b'\n  };\n  var FUNCTION = {\n    className: 'function',\n    begin: IDENT_RE + '\\\\(', \n    returnBegin: true,\n    excludeEnd: true,\n    end: '\\\\('\n  };\n  var HEXCOLOR = {\n    className: 'hexcolor', begin: '#[0-9A-Fa-f]+'\n  };\n  var DEF_INTERNALS = {\n    className: 'attribute',\n    begin: '[A-Z\\\\_\\\\.\\\\-]+', end: ':',\n    excludeEnd: true,\n    illegal: '[^\\\\s]',\n    starts: {\n      className: 'value',\n      endsWithParent: true, excludeEnd: true,\n      contains: [\n        FUNCTION,\n        HEXCOLOR,\n        hljs.CSS_NUMBER_MODE,\n        hljs.QUOTE_STRING_MODE,\n        hljs.APOS_STRING_MODE,\n        hljs.C_BLOCK_COMMENT_MODE,\n        {\n          className: 'important', begin: '!important'\n        }\n      ]\n    }\n  };\n  return {\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      FUNCTION,\n      {\n        className: 'id', begin: '\\\\#[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'class', begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'attr_selector',\n        begin: '\\\\[', end: '\\\\]',\n        illegal: '$'\n      },\n      {\n        className: 'tag', // begin: IDENT_RE, end: '[,|\\\\s]'\n        begin: '\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b',\n        relevance: 0\n      },\n      {\n        className: 'pseudo',\n        begin: ':(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)'\n      },\n      {\n        className: 'pseudo',\n        begin: '::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)'\n      },\n      VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b',\n        illegal: '[^\\\\s]'\n      },\n      {\n        className: 'value',\n        begin: '\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b'\n      },\n      {\n        className: 'value',\n        begin: ':', end: ';',\n        contains: [\n          FUNCTION,\n          VARIABLE,\n          HEXCOLOR,\n          hljs.CSS_NUMBER_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          {\n            className: 'important', begin: '!important'\n          }\n        ]\n      },\n      {\n        className: 'at_rule',\n        begin: '@', end: '[{;]',\n        keywords: 'mixin include extend for if else each while charset import debug media page content font-face namespace warn',\n        contains: [\n          FUNCTION,\n          VARIABLE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          HEXCOLOR,\n          hljs.CSS_NUMBER_MODE,\n          {\n            className: 'preprocessor',\n            begin: '\\\\s[A-Za-z0-9_.-]+',\n            relevance: 0\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/smalltalk.js",
    "content": "/*\nLanguage: Smalltalk\nAuthor: Vladimir Gubarkov <xonixx@gmail.com>\n*/\n\nfunction(hljs) {\n  var VAR_IDENT_RE = '[a-z][a-zA-Z0-9_]*';\n  var CHAR = {\n    className: 'char',\n    begin: '\\\\$.{1}'\n  };\n  var SYMBOL = {\n    className: 'symbol',\n    begin: '#' + hljs.UNDERSCORE_IDENT_RE\n  };\n  return {\n    aliases: ['st'],\n    keywords: 'self super nil true false thisContext', // only 6\n    contains: [\n      {\n        className: 'comment',\n        begin: '\"', end: '\"'\n      },\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'class',\n        begin: '\\\\b[A-Z][A-Za-z0-9_]*',\n        relevance: 0\n      },\n      {\n        className: 'method',\n        begin: VAR_IDENT_RE + ':',\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE,\n      SYMBOL,\n      CHAR,\n      {\n        className: 'localvars',\n        // This looks more complicated than needed to avoid combinatorial\n        // explosion under V8. It effectively means `| var1 var2 ... |` with\n        // whitespace adjacent to `|` being optional.\n        begin: '\\\\|[ ]*' + VAR_IDENT_RE + '([ ]+' + VAR_IDENT_RE + ')*[ ]*\\\\|',\n        returnBegin: true, end: /\\|/,\n        illegal: /\\S/,\n        contains: [{begin: '(\\\\|[ ]*)?' + VAR_IDENT_RE}]\n      },\n      {\n        className: 'array',\n        begin: '\\\\#\\\\(', end: '\\\\)',\n        contains: [\n          hljs.APOS_STRING_MODE,\n          CHAR,\n          hljs.C_NUMBER_MODE,\n          SYMBOL\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/sql.js",
    "content": "/*\n Language: SQL\n Contributors: Nikolay Lisienko <info@neor.ru>, Heiko August <post@auge8472.de>, Travis Odom <travis.a.odom@gmail.com>\n */\n\nfunction(hljs) {\n  var COMMENT_MODE = {\n    className: 'comment',\n    begin: '--', end: '$'\n  };\n  return {\n    case_insensitive: true,\n    illegal: /[<>]/,\n    contains: [\n      {\n        className: 'operator',\n        beginKeywords:\n          'begin end start commit rollback savepoint lock alter create drop rename call '+\n          'delete do handler insert load replace select truncate update set show pragma grant '+\n          'merge describe use explain help declare prepare execute deallocate savepoint release '+\n          'unlock purge reset change stop analyze cache flush optimize repair kill '+\n          'install uninstall checksum restore check backup',\n        end: /;/, endsWithParent: true,\n        keywords: {\n          keyword:\n            'abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter ' +\n            'analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup ' +\n            'before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by ' +\n            'cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length ' +\n            'character_length charindex charset check checksum checksum_agg choose close coalesce ' +\n            'coercibility collate collation collationproperty column columns columns_updated commit compress concat ' +\n            'concat_ws concurrent connect connection connection_id consistent constraint constraints continue ' +\n            'contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist ' +\n            'curdate current current_date current_time current_timestamp current_user cursor curtime data database ' +\n            'databases datalength date_add date_format date_sub dateadd datediff datefromparts datename ' +\n            'datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear ' +\n            'deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt ' +\n            'des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct ' +\n            'distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec ' +\n            'engine engines eomonth errors escape escaped event eventdata events except exception exec execute ' +\n            'exists exp explain export_set extended external extract fast fetch field fields find_in_set ' +\n            'first first_value floor flush for force foreign format found found_rows from from_base64 ' +\n            'from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant ' +\n            'grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help ' +\n            'hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore ' +\n            'iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner ' +\n            'innodb input insert install instr intersect into is is_free_lock is_ipv4 ' +\n            'is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill ' +\n            'language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level ' +\n            'like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile ' +\n            'logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max ' +\n            'md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names ' +\n            'national natural nchar next no no_write_to_binlog not now nullif nvarchar oct ' +\n            'octet_length of old_password on only open optimize option optionally or ord order outer outfile output ' +\n            'pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add ' +\n            'period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges ' +\n            'procedure procedure_analyze processlist profile profiles public publishingservername purge quarter ' +\n            'query quick quote quotename radians rand read references regexp relative relaylog release ' +\n            'release_lock rename repair repeat replace replicate reset restore restrict return returns reverse ' +\n            'revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll ' +\n            'sec_to_time second section select serializable server session session_user set sha sha1 sha2 share ' +\n            'show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex ' +\n            'sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache ' +\n            'sql_small_result sql_variant_property sqlstate sqrt square start starting status std ' +\n            'stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff ' +\n            'subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset ' +\n            'system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time ' +\n            'time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour ' +\n            'timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation ' +\n            'trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress ' +\n            'uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade ' +\n            'upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short ' +\n            'validate_password_strength value values var var_pop var_samp variables variance varp ' +\n            'version view warnings week weekday weekofyear weight_string when whenever where with work write xml ' +\n            'xor year yearweek zon',\n          literal:\n            'true false null',\n          built_in:\n            'array bigint binary bit blob boolean char character date dec decimal float int integer interval number ' +\n            'numeric real serial smallint varchar varying int8 serial8 text'\n        },\n        contains: [\n          {\n            className: 'string',\n            begin: '\\'', end: '\\'',\n            contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n          },\n          {\n            className: 'string',\n            begin: '\"', end: '\"',\n            contains: [hljs.BACKSLASH_ESCAPE, {begin: '\"\"'}]\n          },\n          {\n            className: 'string',\n            begin: '`', end: '`',\n            contains: [hljs.BACKSLASH_ESCAPE]\n          },\n          hljs.C_NUMBER_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          COMMENT_MODE\n        ]\n      },\n      hljs.C_BLOCK_COMMENT_MODE,\n      COMMENT_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/swift.js",
    "content": "/*\nLanguage: Swift\nAuthor: Chris Eidhof <chris@eidhof.nl>\n*/\n\n\nfunction(hljs) {\n  var SWIFT_KEYWORDS = {\n      keyword: 'class deinit enum extension func import init let protocol static ' +\n        'struct subscript typealias var break case continue default do ' +\n        'else fallthrough if in for return switch where while as dynamicType ' +\n        'is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ ' +\n        '__LINE__ associativity didSet get infix inout left mutating none ' +\n        'nonmutating operator override postfix precedence prefix right set '+\n        'unowned unowned safe unsafe weak willSet',\n      literal: 'true false nil',\n      built_in: 'abs advance alignof alignofValue assert bridgeFromObjectiveC ' +\n        'bridgeFromObjectiveCUnconditional bridgeToObjectiveC ' +\n        'bridgeToObjectiveCUnconditional c contains count countElements ' +\n        'countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump ' +\n        'encodeBitsAsWords enumerate equal false filter find getBridgedObjectiveCType ' +\n        'getVaList indices insertionSort isBridgedToObjectiveC ' +\n        'isBridgedVerbatimToObjectiveC isUniquelyReferenced join ' +\n        'lexicographicalCompare map max maxElement min minElement nil numericCast ' +\n        'partition posix print println quickSort reduce reflect reinterpretCast ' +\n        'reverse roundUpToAlignment sizeof sizeofValue sort split startsWith strideof ' +\n        'strideofValue swap swift toString transcode true underestimateCount ' +\n        'unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer ' +\n        'withUnsafePointerToObject withUnsafePointers withVaList'\n    };\n\n  var TYPE = {\n    className: 'type',\n    begin: '\\\\b[A-Z][\\\\w\\']*',\n    relevance: 0\n  };\n  var BLOCK_COMMENT = {\n    className: 'comment',\n    begin: '/\\\\*', end: '\\\\*/',\n    contains: [hljs.PHRASAL_WORDS_MODE, 'self']\n  };\n  var SUBST = {\n    className: 'subst',\n    begin: /\\\\\\(/, end: '\\\\)',\n    keywords: SWIFT_KEYWORDS,\n    contains: [] // assigned later\n  };\n  var NUMBERS = {\n      className: 'number',\n      begin: '\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b',\n      relevance: 0\n  };\n  var QUOTE_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, {\n    contains: [SUBST, hljs.BACKSLASH_ESCAPE]\n  });\n  SUBST.contains = [NUMBERS];\n\n  return {\n    keywords: SWIFT_KEYWORDS,\n    contains: [\n      QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      BLOCK_COMMENT,\n      TYPE,\n      NUMBERS,\n      {\n        className: 'func',\n        beginKeywords: 'func', excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            begin: /[A-Za-z$_][0-9A-Za-z$_]*/,\n            illegal: /\\(/\n          }),\n          {\n            className: 'generics',\n            begin: /\\</, end: /\\>/,\n            illegal: /\\>/\n          },\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"']/\n          }\n        ],\n        illegal: /\\[|%/\n      },\n      {\n        className: 'class',\n        keywords: 'struct protocol class extension enum',\n        begin: '(struct|protocol|class(?! (func|var))|extension|enum)', \n        end: '\\\\{',\n        excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/})\n        ]\n      },\n      {\n        className: 'preprocessor', // @attributes\n        begin: '(@assignment|@class_protocol|@exported|@final|@lazy|@noreturn|' +\n                  '@NSCopying|@NSManaged|@objc|@optional|@required|@auto_closure|' +\n                  '@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|' +\n                  '@infix|@prefix|@postfix)'\n      },\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/tex.js",
    "content": "/*\nLanguage: TeX\nAuthor: Vladimir Moskva <vladmos@gmail.com>\nWebsite: http://fulc.ru/\n*/\n\nfunction(hljs) {\n  var COMMAND1 = {\n    className: 'command',\n    begin: '\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]?'\n  };\n  var COMMAND2 = {\n    className: 'command',\n    begin: '\\\\\\\\[^a-zA-Zа-яА-я0-9]'\n  };\n  var SPECIAL = {\n    className: 'special',\n    begin: '[{}\\\\[\\\\]\\\\&#~]',\n    relevance: 0\n  };\n\n  return {\n    contains: [\n      { // parameter\n        begin: '\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?',\n        returnBegin: true,\n        contains: [\n          COMMAND1, COMMAND2,\n          {\n            className: 'number',\n            begin: ' *=', end: '-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?',\n            excludeBegin: true\n          }\n        ],\n        relevance: 10\n      },\n      COMMAND1, COMMAND2,\n      SPECIAL,\n      {\n        className: 'formula',\n        begin: '\\\\$\\\\$', end: '\\\\$\\\\$',\n        contains: [COMMAND1, COMMAND2, SPECIAL],\n        relevance: 0\n      },\n      {\n        className: 'formula',\n        begin: '\\\\$', end: '\\\\$',\n        contains: [COMMAND1, COMMAND2, SPECIAL],\n        relevance: 0\n      },\n      {\n        className: 'comment',\n        begin: '%', end: '$',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/thrift.js",
    "content": "/*\nLanguage: Thrift\nAuthor: Oleg Efimov <efimovov@gmail.com>\nDescription: Thrift message definition format\n*/\n\nfunction(hljs) {\n  var BUILT_IN_TYPES = 'bool byte i16 i32 i64 double string binary';\n  return {\n    keywords: {\n      keyword:\n        'namespace const typedef struct enum service exception void oneway set list map required optional',\n      built_in:\n        BUILT_IN_TYPES,\n      literal:\n        'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'struct enum service exception', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'stl_container',\n        begin: '\\\\b(set|list|map)\\\\s*<', end: '>',\n        keywords: BUILT_IN_TYPES,\n        contains: ['self']\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/typescript.js",
    "content": "/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nDescription: TypeScript is a strict superset of JavaScript\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['ts'],\n    keywords: {\n      keyword:\n        'in if for while finally var new function|0 do return void else break catch ' +\n        'instanceof with throw case default try this switch continue typeof delete ' +\n        'let yield const class public private get set super interface extends' +\n        'static constructor implements enum export import declare',\n      literal:\n        'true false null undefined NaN Infinity',\n      built_in:\n        'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +\n        'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +\n        'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +\n        'TypeError URIError Number Math Date String RegExp Array Float32Array ' +\n        'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +\n        'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +\n        'module console window document any number boolean string void',\n    },\n    contains: [\n      {\n        className: 'pi',\n        begin: /^\\s*('|\")use strict('|\")/,\n        relevance: 0\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        contains: [\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          hljs.REGEXP_MODE,\n          { // E4X\n            begin: /</, end: />;/,\n            relevance: 0,\n            subLanguage: 'xml'\n          }\n        ],\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /\\{/, excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/}),\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"'\\(]/\n          }\n        ],\n        illegal: /\\[|%/,\n        relevance: 0 // () => {} is more typical in TypeScript\n      },\n      {\n        className: 'constructor',\n        beginKeywords: 'constructor', end: /\\{/, excludeEnd: true,\n        relevance: 10\n      },\n      {\n        className: 'module',\n        beginKeywords: 'module', end: /\\{/, excludeEnd: true,\n      },\n      {\n        className: 'interface',\n        beginKeywords: 'interface', end: /\\{/, excludeEnd: true,\n      },\n      {\n        begin: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      },\n      {\n        begin: '\\\\.' + hljs.IDENT_RE, relevance: 0 // hack: prevents detection of keywords after dots\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/vala.js",
    "content": "/*\nLanguage: Vala\nAuthor: Antono Vasiljev <antono.vasiljev@gmail.com>\nDescription: Vala is a new programming language that aims to bring modern programming language features to GNOME developers without imposing any additional runtime requirements and without using a different ABI compared to applications and libraries written in C.\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        // Value types\n        'char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 ' +\n        'uint16 uint32 uint64 float double bool struct enum string void ' +\n        // Reference types\n        'weak unowned owned ' +\n        // Modifiers\n        'async signal static abstract interface override ' +\n        // Control Structures\n        'while do for foreach else switch case break default return try catch ' +\n        // Visibility\n        'public private protected internal ' +\n        // Other\n        'using new this get set const stdout stdin stderr var',\n      built_in:\n        'DBus GLib CCode Gee Object',\n      literal:\n        'false true null'\n    },\n    contains: [\n      {\n        className: 'class',\n        beginKeywords: 'class interface delegate namespace', end: '{', excludeEnd: true,\n        illegal: '[^,:\\\\n\\\\s\\\\.]',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"',\n        relevance: 5\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '^#', end: '$',\n        relevance: 2\n      },\n      {\n        className: 'constant',\n        begin: ' [A-Z_]+ ',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/vbnet.js",
    "content": "/*\nLanguage: VB.NET\nAuthor: Poren Chiang <ren.chiang@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['vb'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval ' + /* a-b */\n        'call case catch class compare const continue custom declare default delegate dim distinct do ' + /* c-d */\n        'each equals else elseif end enum erase error event exit explicit finally for friend from function ' + /* e-f */\n        'get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue ' + /* g-i */\n        'join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass ' + /* j-m */\n        'namespace narrowing new next not notinheritable notoverridable ' + /* n */\n        'of off on operator option optional or order orelse overloads overridable overrides ' + /* o */\n        'paramarray partial preserve private property protected public ' + /* p */\n        'raiseevent readonly redim rem removehandler resume return ' + /* r */\n        'select set shadows shared skip static step stop structure strict sub synclock ' + /* s */\n        'take text then throw to try unicode until using when where while widening with withevents writeonly xor', /* t-x */\n      built_in:\n        'boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype ' +  /* b-c */\n        'date decimal directcast double gettype getxmlnamespace iif integer long object ' + /* d-o */\n        'sbyte short single string trycast typeof uinteger ulong ushort', /* s-u */\n      literal:\n        'true false nothing'\n    },\n    illegal: '//|{|}|endif|gosub|variant|wend', /* reserved deprecated keywords */\n    contains: [\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [{begin: '\"\"'}]}),\n      {\n        className: 'comment',\n        begin: '\\'', end: '$', returnBegin: true,\n        contains: [\n          {\n            className: 'xmlDocTag',\n            begin: '\\'\\'\\'|<!--|-->'\n          },\n          {\n            className: 'xmlDocTag',\n            begin: '</?', end: '>'\n          }\n          ]\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elseif end region externalsource'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/vbscript.js",
    "content": "/*\nLanguage: VBScript\nAuthor: Nikita Ledyaev <lenikita@yandex.ru>\nContributors: Michal Gabrukiewicz <mgabru@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['vbs'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'call class const dim do loop erase execute executeglobal exit for each next function ' +\n        'if then else on error option explicit new private property let get public randomize ' +\n        'redim rem select case set stop sub while wend with end to elseif is or xor and not ' +\n        'class_initialize class_terminate default preserve in me byval byref step resume goto',\n      built_in:\n        'lcase month vartype instrrev ubound setlocale getobject rgb getref string ' +\n        'weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency ' +\n        'conversions csng timevalue second year space abs clng timeserial fixs len asc ' +\n        'isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate ' +\n        'instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex ' +\n        'chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim ' +\n        'strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion ' +\n        'scriptengine split scriptengineminorversion cint sin datepart ltrim sqr ' +\n        'scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw ' +\n        'chrw regexp server response request cstr err',\n      literal:\n        'true false null nothing empty'\n    },\n    illegal: '//',\n    contains: [\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [{begin: '\"\"'}]}),\n      {\n        className: 'comment',\n        begin: /'/, end: /$/,\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/vhdl.js",
    "content": "/*\nLanguage: VHDL\nAuthor: Igor Kalnitsky <igor@kalnitsky.org>\nContributors: Daniel C.K. Kho <daniel.kho@gmail.com>\nDescription: VHDL is a hardware description language used in electronic design automation to describe digital and mixed-signal systems.\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'abs access after alias all and architecture array assert attribute begin block ' +\n        'body buffer bus case component configuration constant context cover disconnect ' +\n        'downto default else elsif end entity exit fairness file for force function generate ' +\n        'generic group guarded if impure in inertial inout is label library linkage literal ' +\n        'loop map mod nand new next nor not null of on open or others out package port ' +\n        'postponed procedure process property protected pure range record register reject ' +\n        'release rem report restrict restrict_guarantee return rol ror select sequence ' +\n        'severity shared signal sla sll sra srl strong subtype then to transport type ' +\n        'unaffected units until use variable vmode vprop vunit wait when while with xnor xor',\n      typename:\n        'boolean bit character severity_level integer time delay_length natural positive ' +\n        'string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector ' +\n        'std_logic std_logic_vector unsigned signed boolean_vector integer_vector ' +\n        'real_vector time_vector'\n    },\n    illegal: '{',\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,        // VHDL-2008 block commenting.\n      {\n        className: 'comment',\n        begin: '--', end: '$'\n      },\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'literal',\n        begin: '\\'(U|X|0|1|Z|W|L|H|-)\\'',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      {\n        className: 'attribute',\n        begin: '\\'[A-Za-z](_?[A-Za-z0-9])*',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      }\n    ]\n  }; // return\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/vim.js",
    "content": "/*\nLanguage: Vim Script\nAuthor: Jun Yang <yangjvn@126.com>\nDescription: full keyword and built-in from http://vimdoc.sourceforge.net/htmldoc/\n*/\n\nfunction(hljs) {\n  return {\n    lexemes: /[!#@\\w]+/,\n    keywords: {\n      keyword: //ex command\n        // express version except: ! & * < = > !! # @ @@\n        'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope '+\n        'cp cpf cq cr cs cst cu cuna cunme cw d|0 delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu g|0 go gr grepa gu gv ha h|0 helpf helpg helpt hi hid his i|0 ia iabc if ij il im imapc '+\n        'ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs n|0 new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 '+\n        'profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf q|0 quita qa r|0 rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv s|0 sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor '+\n        'so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync t|0 tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew '+\n        'tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up v|0 ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ '+\n        // full version\n        'Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload '+\n        'bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap '+\n        'cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor '+\n        'endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap '+\n        'imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview '+\n        'lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap '+\n        'nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext '+\n        'ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding '+\n        'scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace '+\n        'startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious '+'trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew '+\n        'vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank',\n      built_in: //built in func\n        'abs acos add and append argc argidx argv asin atan atan2 browse browsedir bufexists buflisted bufloaded bufname bufnr bufwinnr byte2line byteidx call ceil changenr char2nr cindent clearmatches col complete complete_add complete_check confirm copy cos cosh count cscope_connection cursor '+\n        'deepcopy delete did_filetype diff_filler diff_hlID empty escape eval eventhandler executable exists exp expand extend feedkeys filereadable filewritable filter finddir findfile float2nr floor fmod fnameescape fnamemodify foldclosed foldclosedend foldlevel foldtext foldtextresult foreground function '+\n        'garbagecollect get getbufline getbufvar getchar getcharmod getcmdline getcmdpos getcmdtype getcwd getfontname getfperm getfsize getftime getftype getline getloclist getmatches getpid getpos getqflist getreg getregtype gettabvar gettabwinvar getwinposx getwinposy getwinvar glob globpath has has_key '+\n        'haslocaldir hasmapto histadd histdel histget histnr hlexists hlID hostname iconv indent index input inputdialog inputlist inputrestore inputsave inputsecret insert invert isdirectory islocked items join keys len libcall libcallnr line line2byte lispindent localtime log log10 luaeval map maparg mapcheck '+\n        'match matchadd matcharg matchdelete matchend matchlist matchstr max min mkdir mode mzeval nextnonblank nr2char or pathshorten pow prevnonblank printf pumvisible py3eval pyeval range readfile reltime reltimestr remote_expr remote_foreground remote_peek remote_read remote_send remove rename repeat '+\n        'resolve reverse round screenattr screenchar screencol screenrow search searchdecl searchpair searchpairpos searchpos server2client serverlist setbufvar setcmdpos setline setloclist setmatches setpos setqflist setreg settabvar settabwinvar setwinvar sha256 shellescape shiftwidth simplify sin '+\n        'sinh sort soundfold spellbadword spellsuggest split sqrt str2float str2nr strchars strdisplaywidth strftime stridx string strlen strpart strridx strtrans strwidth submatch substitute synconcealed synID synIDattr '+\n        'synIDtrans synstack system tabpagebuflist tabpagenr tabpagewinnr tagfiles taglist tan tanh tempname tolower toupper tr trunc type undofile undotree values virtcol visualmode wildmenumode winbufnr wincol winheight winline winnr winrestcmd winrestview winsaveview winwidth writefile xor'\n    },\n    illegal: /[{:]/,\n    contains: [\n      hljs.NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'string',\n        // quote with escape, comment as quote\n        begin: /\"((\\\\\")|[^\"\\n])*(\"|\\n)/\n      },\n      {\n        className: 'variable',\n        begin: /[bwtglsav]:[\\w\\d_]*/\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function function!', end: '$',\n        relevance: 0,\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)'\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/x86asm.js",
    "content": "/*\nLanguage: Intel x86 Assembly\nAuthor: innocenat <innocenat@gmail.com>\nDescription: x86 assembly language using Intel's mnemonic and NASM syntax\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    lexemes: '\\\\.?' + hljs.IDENT_RE,\n    keywords: {\n      keyword:\n        'lock rep repe repz repne repnz xaquire xrelease bnd nobnd ' +\n        'aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63',\n      literal:\n        // Instruction pointer\n        'ip eip rip ' +\n        // 8-bit registers\n        'al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ' +\n        // 16-bit registers\n        'ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w ' +\n        // 32-bit registers\n        'eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d ' +\n        // 64-bit registers\n        'rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 ' +\n        // Segment registers\n        'cs ds es fs gs ss ' +\n        // Floating point stack registers\n        'st st0 st1 st2 st3 st4 st5 st6 st7 ' +\n        // MMX Registers\n        'mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 ' +\n        // SSE registers\n        'xmm0  xmm1  xmm2  xmm3  xmm4  xmm5  xmm6  xmm7  xmm8  xmm9 xmm10  xmm11 xmm12 xmm13 xmm14 xmm15 ' +\n        'xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ' +\n        // AVX registers\n        'ymm0  ymm1  ymm2  ymm3  ymm4  ymm5  ymm6  ymm7  ymm8  ymm9 ymm10  ymm11 ymm12 ymm13 ymm14 ymm15 ' +\n        'ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 ' +\n        // AVX-512F registers\n        'zmm0  zmm1  zmm2  zmm3  zmm4  zmm5  zmm6  zmm7  zmm8  zmm9 zmm10  zmm11 zmm12 zmm13 zmm14 zmm15 ' +\n        'zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 ' +\n        // AVX-512F mask registers\n        'k0 k1 k2 k3 k4 k5 k6 k7 ' +\n        // Bound (MPX) register\n        'bnd0 bnd1 bnd2 bnd3 ' +\n        // Special register\n        'cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 ' +\n        // NASM altreg package\n        'r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b ' +\n        'r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d ' +\n        'r0h r1h r2h r3h ' +\n        'r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l',\n\n      pseudo:\n        'db dw dd dq dt ddq do dy dz ' +\n        'resb resw resd resq rest resdq reso resy resz ' +\n        'incbin equ times',\n\n      preprocessor:\n        '%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif ' +\n        '%ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep ' +\n        '%endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment ' +\n        '.nolist ' +\n        'byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr ' +\n        '__FILE__ __LINE__ __SECT__  __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ ' +\n        '__UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__  __PASS__ struc endstruc istruc at iend ' +\n        'align alignb sectalign daz nodaz up down zero default option assume public ',\n\n      built_in:\n        'bits use16 use32 use64 default section segment absolute extern global common cpu float ' +\n        '__utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ ' +\n        '__float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ ' +\n        '__Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e ' +\n        'float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__'\n    },\n    contains: [\n      {\n        className: 'comment',\n        begin: ';',\n        end: '$',\n        relevance: 0\n      },\n      // Float number and x87 BCD\n      {\n        className: 'number',\n        begin: '\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b',\n        relevance: 0\n      },\n      // Hex number in $\n      {\n        className: 'number',\n        begin: '\\\\$[0-9][0-9A-Fa-f]*',\n        relevance: 0\n      },\n      // Number in H,X,D,T,Q,O,B,Y suffix\n      {\n        className: 'number',\n        begin: '\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[HhXx]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b'\n      },\n      // Number in H,X,D,T,Q,O,B,Y prefix\n      {\n        className: 'number',\n        begin: '\\\\b(?:0[HhXx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b'\n      },\n      // Double quote string\n      hljs.QUOTE_STRING_MODE,\n      // Single-quoted string\n      {\n        className: 'string',\n        begin: '\\'',\n        end: '[^\\\\\\\\]\\'',\n        relevance: 0\n      },\n      // Backquoted string\n      {\n        className: 'string',\n        begin: '`',\n        end: '[^\\\\\\\\]`',\n        relevance: 0\n      },\n      // Section name\n      {\n        className: 'string',\n        begin: '\\\\.[A-Za-z0-9]+',\n        relevance: 0\n      },\n      // Global label and local label\n      {\n        className: 'label',\n        begin: '^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)',\n        relevance: 0\n      },\n      // Macro-local label\n      {\n        className: 'label',\n        begin: '^\\\\s*%%[A-Za-z0-9_$#@~.?]*:',\n        relevance: 0\n      },\n      // Macro parameter\n      {\n        className: 'argument',\n        begin: '%[0-9]+',\n        relevance: 0\n      },\n      // Macro parameter\n      {\n        className: 'built_in',\n        begin: '%!\\S+',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/languages/xml.js",
    "content": "/*\nLanguage: HTML, XML\n*/\n\nfunction(hljs) {\n  var XML_IDENT_RE = '[A-Za-z0-9\\\\._:-]+';\n  var PHP = {\n    begin: /<\\?(php)?(?!\\w)/, end: /\\?>/,\n    subLanguage: 'php', subLanguageMode: 'continuous'\n  };\n  var TAG_INTERNALS = {\n    endsWithParent: true,\n    illegal: /</,\n    relevance: 0,\n    contains: [\n      PHP,\n      {\n        className: 'attribute',\n        begin: XML_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: '=',\n        relevance: 0,\n        contains: [\n          {\n            className: 'value',\n            variants: [\n              {begin: /\"/, end: /\"/},\n              {begin: /'/, end: /'/},\n              {begin: /[^\\s\\/>]+/}\n            ]\n          }\n        ]\n      }\n    ]\n  };\n  return {\n    aliases: ['html', 'xhtml', 'rss', 'atom', 'xsl', 'plist'],\n    case_insensitive: true,\n    contains: [\n      {\n        className: 'doctype',\n        begin: '<!DOCTYPE', end: '>',\n        relevance: 10,\n        contains: [{begin: '\\\\[', end: '\\\\]'}]\n      },\n      {\n        className: 'comment',\n        begin: '<!--', end: '-->',\n        relevance: 10\n      },\n      {\n        className: 'cdata',\n        begin: '<\\\\!\\\\[CDATA\\\\[', end: '\\\\]\\\\]>',\n        relevance: 10\n      },\n      {\n        className: 'tag',\n        /*\n        The lookahead pattern (?=...) ensures that 'begin' only matches\n        '<style' as a single word, followed by a whitespace or an\n        ending braket. The '$' is needed for the lexeme to be recognized\n        by hljs.subMode() that tests lexemes outside the stream.\n        */\n        begin: '<style(?=\\\\s|>|$)', end: '>',\n        keywords: {title: 'style'},\n        contains: [TAG_INTERNALS],\n        starts: {\n          end: '</style>', returnEnd: true,\n          subLanguage: 'css'\n        }\n      },\n      {\n        className: 'tag',\n        // See the comment in the <style tag about the lookahead pattern\n        begin: '<script(?=\\\\s|>|$)', end: '>',\n        keywords: {title: 'script'},\n        contains: [TAG_INTERNALS],\n        starts: {\n          end: '</script>', returnEnd: true,\n          subLanguage: 'javascript'\n        }\n      },\n      {\n        begin: '<%', end: '%>',\n        subLanguage: 'vbscript'\n      },\n      PHP,\n      {\n        className: 'pi',\n        begin: /<\\?\\w+/, end: /\\?>/,\n        relevance: 10\n      },\n      {\n        className: 'tag',\n        begin: '</?', end: '/?>',\n        contains: [\n          {\n            className: 'title', begin: '[^ /><]+', relevance: 0\n          },\n          TAG_INTERNALS\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/arta.css",
    "content": "/*\nDate: 17.V.2011\nAuthor: pumbur <pumbur@pumbur.net>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n}\n\n.profile .hljs-header *,\n.ini .hljs-title,\n.nginx .hljs-title {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-javadoc,\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-title,\n.hljs-pragma,\n.hljs-shebang,\n.profile .hljs-summary,\n.diff,\n.hljs-pi,\n.hljs-doctype,\n.hljs-tag,\n.hljs-template_comment,\n.css .hljs-rules,\n.tex .hljs-special {\n  color: #444;\n}\n\n.hljs-string,\n.hljs-symbol,\n.diff .hljs-change,\n.hljs-regexp,\n.xml .hljs-attribute,\n.smalltalk .hljs-char,\n.xml .hljs-value,\n.ini .hljs-value,\n.clojure .hljs-attribute,\n.coffeescript .hljs-attribute {\n  color: #ffcc33;\n}\n\n.hljs-number,\n.hljs-addition {\n  color: #00cc66;\n}\n\n.hljs-built_in,\n.hljs-literal,\n.vhdl .hljs-typename,\n.go .hljs-constant,\n.go .hljs-typename,\n.ini .hljs-keyword,\n.lua .hljs-title,\n.perl .hljs-variable,\n.php .hljs-variable,\n.mel .hljs-variable,\n.django .hljs-variable,\n.css .funtion,\n.smalltalk .method,\n.hljs-hexcolor,\n.hljs-important,\n.hljs-flow,\n.hljs-inheritance,\n.parser3 .hljs-variable {\n  color: #32aaee;\n}\n\n.hljs-keyword,\n.hljs-tag .hljs-title,\n.css .hljs-tag,\n.css .hljs-class,\n.css .hljs-id,\n.css .hljs-pseudo,\n.css .hljs-attr_selector,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.hljs-winutils,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  color: #6644aa;\n}\n\n.hljs-title,\n.ruby .hljs-constant,\n.vala .hljs-constant,\n.hljs-parent,\n.hljs-deletion,\n.hljs-template_tag,\n.css .hljs-keyword,\n.objectivec .hljs-class .hljs-id,\n.smalltalk .hljs-class,\n.lisp .hljs-keyword,\n.apache .hljs-tag,\n.nginx .hljs-variable,\n.hljs-envvar,\n.bash .hljs-variable,\n.go .hljs-built_in,\n.vbscript .hljs-built_in,\n.lua .hljs-built_in,\n.rsl .hljs-built_in,\n.tail,\n.avrasm .hljs-label,\n.tex .hljs-formula,\n.tex .hljs-formula * {\n  color: #bb1166;\n}\n\n.hljs-yardoctag,\n.hljs-phpdoc,\n.profile .hljs-header,\n.ini .hljs-title,\n.apache .hljs-tag,\n.parser3 .hljs-title {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.6;\n}\n\n.hljs,\n.hljs-subst,\n.diff .hljs-chunk,\n.css .hljs-value,\n.css .hljs-attribute {\n  color: #aaa;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/ascetic.css",
    "content": "﻿/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-filter .hljs-argument,\n.hljs-addition,\n.hljs-change,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula {\n  color: #888;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-shebang,\n.hljs-doctype,\n.hljs-pi,\n.hljs-javadoc,\n.hljs-deletion,\n.apache .hljs-sqbracket {\n  color: #ccc;\n}\n\n.hljs-keyword,\n.hljs-tag .hljs-title,\n.ini .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-title,\n.http .hljs-title,\n.nginx .hljs-title,\n.css .hljs-tag,\n.hljs-winutils,\n.hljs-flow,\n.apache .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-dune.dark.css",
    "content": "/* Base16 Atelier Dune Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Dune Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #999580;\n}\n\n/* Atelier Dune Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d73737;\n}\n\n/* Atelier Dune Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #b65611;\n}\n\n/* Atelier Dune Dark Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #cfb017;\n}\n\n/* Atelier Dune Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #60ac39;\n}\n\n/* Atelier Dune Dark Aqua */\n.css .hljs-hexcolor {\n  color: #1fad83;\n}\n\n/* Atelier Dune Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6684e1;\n}\n\n/* Atelier Dune Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #292824;\n  color: #a6a28c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-dune.light.css",
    "content": "/* Base16 Atelier Dune Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Dune Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7d7a68;\n}\n\n/* Atelier Dune Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d73737;\n}\n\n/* Atelier Dune Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #b65611;\n}\n\n/* Atelier Dune Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #cfb017;\n}\n\n/* Atelier Dune Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #60ac39;\n}\n\n/* Atelier Dune Light Aqua */\n.css .hljs-hexcolor {\n  color: #1fad83;\n}\n\n/* Atelier Dune Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6684e1;\n}\n\n/* Atelier Dune Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fefbec;\n  color: #6e6b5e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-forest.dark.css",
    "content": "/* Base16 Atelier Forest Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Forest Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #9c9491;\n}\n\n/* Atelier Forest Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f22c40;\n}\n\n/* Atelier Forest Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #df5320;\n}\n\n/* Atelier Forest Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #d5911a;\n}\n\n/* Atelier Forest Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #5ab738;\n}\n\n/* Atelier Forest Dark Aqua */\n.css .hljs-hexcolor {\n  color: #00ad9c;\n}\n\n/* Atelier Forest Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #407ee7;\n}\n\n/* Atelier Forest Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2c2421;\n  color: #a8a19f;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-forest.light.css",
    "content": "/* Base16 Atelier Forest Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Forest Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #766e6b;\n}\n\n/* Atelier Forest Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f22c40;\n}\n\n/* Atelier Forest Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #df5320;\n}\n\n/* Atelier Forest Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #d5911a;\n}\n\n/* Atelier Forest Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #5ab738;\n}\n\n/* Atelier Forest Light Aqua */\n.css .hljs-hexcolor {\n  color: #00ad9c;\n}\n\n/* Atelier Forest Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #407ee7;\n}\n\n/* Atelier Forest Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f1efee;\n  color: #68615e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-heath.dark.css",
    "content": "/* Base16 Atelier Heath Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Heath Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #9e8f9e;\n}\n\n/* Atelier Heath Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ca402b;\n}\n\n/* Atelier Heath Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #a65926;\n}\n\n/* Atelier Heath Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #bb8a35;\n}\n\n/* Atelier Heath Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #379a37;\n}\n\n/* Atelier Heath Dark Aqua */\n.css .hljs-hexcolor {\n  color: #159393;\n}\n\n/* Atelier Heath Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #516aec;\n}\n\n/* Atelier Heath Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #292329;\n  color: #ab9bab;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-heath.light.css",
    "content": "/* Base16 Atelier Heath Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Heath Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #776977;\n}\n\n/* Atelier Heath Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ca402b;\n}\n\n/* Atelier Heath Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #a65926;\n}\n\n/* Atelier Heath Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #bb8a35;\n}\n\n/* Atelier Heath Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #379a37;\n}\n\n/* Atelier Heath Light Aqua */\n.css .hljs-hexcolor {\n  color: #159393;\n}\n\n/* Atelier Heath Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #516aec;\n}\n\n/* Atelier Heath Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f7f3f7;\n  color: #695d69;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-lakeside.dark.css",
    "content": "/* Base16 Atelier Lakeside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Lakeside Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7195a8;\n}\n\n/* Atelier Lakeside Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d22d72;\n}\n\n/* Atelier Lakeside Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #935c25;\n}\n\n/* Atelier Lakeside Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #8a8a0f;\n}\n\n/* Atelier Lakeside Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #568c3b;\n}\n\n/* Atelier Lakeside Dark Aqua */\n.css .hljs-hexcolor {\n  color: #2d8f6f;\n}\n\n/* Atelier Lakeside Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #257fad;\n}\n\n/* Atelier Lakeside Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #5d5db1;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1f292e;\n  color: #7ea2b4;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-lakeside.light.css",
    "content": "/* Base16 Atelier Lakeside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Lakeside Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #5a7b8c;\n}\n\n/* Atelier Lakeside Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d22d72;\n}\n\n/* Atelier Lakeside Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #935c25;\n}\n\n/* Atelier Lakeside Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #8a8a0f;\n}\n\n/* Atelier Lakeside Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #568c3b;\n}\n\n/* Atelier Lakeside Light Aqua */\n.css .hljs-hexcolor {\n  color: #2d8f6f;\n}\n\n/* Atelier Lakeside Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #257fad;\n}\n\n/* Atelier Lakeside Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #5d5db1;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #ebf8ff;\n  color: #516d7b;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-seaside.dark.css",
    "content": "/* Base16 Atelier Seaside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Seaside Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #809980;\n}\n\n/* Atelier Seaside Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #e6193c;\n}\n\n/* Atelier Seaside Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #87711d;\n}\n\n/* Atelier Seaside Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #c3c322;\n}\n\n/* Atelier Seaside Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #29a329;\n}\n\n/* Atelier Seaside Dark Aqua */\n.css .hljs-hexcolor {\n  color: #1999b3;\n}\n\n/* Atelier Seaside Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #3d62f5;\n}\n\n/* Atelier Seaside Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #242924;\n  color: #8ca68c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/atelier-seaside.light.css",
    "content": "/* Base16 Atelier Seaside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Seaside Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #687d68;\n}\n\n/* Atelier Seaside Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #e6193c;\n}\n\n/* Atelier Seaside Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #87711d;\n}\n\n/* Atelier Seaside Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #c3c322;\n}\n\n/* Atelier Seaside Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #29a329;\n}\n\n/* Atelier Seaside Light Aqua */\n.css .hljs-hexcolor {\n  color: #1999b3;\n}\n\n/* Atelier Seaside Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #3d62f5;\n}\n\n/* Atelier Seaside Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f0fff0;\n  color: #5e6e5e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/brown_paper.css",
    "content": "/*\n\nBrown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background:#b7a68e url(./brown_papersq.png);\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  color:#005599;\n  font-weight:bold;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-keyword {\n  color: #363c69;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-number {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula {\n  color: #802022;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-command {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.8;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/codepen-embed.css",
    "content": "/*\n  codepen.io Embed Theme\n  Author: Justin Perry <http://github.com/ourmaninamsterdam>\n  Original theme - https://github.com/chriskempson/tomorrow-theme\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n  color: #fff;\n  font-family: Menlo, Monaco, 'Andale Mono', 'Lucida Console', 'Courier New', monospace;\n}\n\n.hljs-comment,\n.hljs-title {\n  color: #777;\n}\n\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .constant,\n.xml .tag .title,\n.xml .pi,\n.xml .doctype,\n.html .doctype {\n  color: #ab875d;\n}\n\n.css .value {\n  color: #cd6a51;\n}\n\n.css .value .function,\n.css .value .string {\n  color: #a67f59;\n}\n\n.css .value .number {\n  color: #9b869c;\n}\n\n.css .id,\n.css .class,\n.css-pseudo,\n.css .selector,\n.css .tag {\n  color: #dfc48c;\n}\n\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #ab875d;\n}\n\n.ruby .class .title,\n.css .rules .attribute {\n  color: #9b869b;\n}\n\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .symbol,\n.xml .cdata {\n  color: #8f9c6c;\n}\n\n.css .hexcolor {\n  color: #cd6a51;\n}\n\n.function,\n.python .decorator,\n.python .title,\n.ruby .function .title,\n.ruby .title .keyword,\n.perl .sub,\n.javascript .title,\n.coffeescript .title {\n  color: #fff;\n}\n\n.hljs-keyword,\n.javascript .function {\n  color: #8f9c6c;\n}\n\n.coffeescript .javascript,\n.javascript,\n.javascript .xml,\n.tex .formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .cdata {\n    background: transparent;\n    opacity: 1;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/color-brewer.css",
    "content": "/*\n\nColorbrewer theme\nOriginal: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock <mike@ocks.org>\nPorted by Fabrício Tavares de Oliveira\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title {\n  color: #000;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute {\n  color: #756bb1;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #636363;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #31a354;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #88f;\n}\n\n\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-javadoctag,\n.hljs-phpdoc,\n.hljs-yardoctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.go .hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status {\n  color: #3182bd;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n.css .hljs-attribute,\n.html .hljs-attribute {\n  color: #e6550d;\n}\n\n.css .hljs-class,\n.html .hljs-tag,\n.html .hljs-title {\n  color: #3182bd;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/dark.css",
    "content": "﻿/*\n\nDark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #444;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color: white;\n}\n\n.hljs,\n.hljs-subst {\n  color: #ddd;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.ini .hljs-title,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt,\n.coffeescript .hljs-attribute {\n  color: #d88;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #777;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-title,\n.css .hljs-id,\n.hljs-phpdoc,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/default.css",
    "content": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #f0f0f0;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute {\n  color: #800;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #080;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #88f;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-javadoctag,\n.hljs-phpdoc,\n.hljs-yardoctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.go .hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/docco.css",
    "content": "/*\nDocco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars)\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #f8f8ff;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n  color: #408080;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.assignment,\n.hljs-literal,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.lisp .hljs-title,\n.hljs-subst {\n  color: #954121;\n}\n\n.hljs-number,\n.hljs-hexcolor {\n  color: #40a070;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula {\n  color: #219161;\n}\n\n.hljs-title,\n.hljs-id {\n  color: #19469d;\n}\n.hljs-params {\n  color: #00f;\n}\n\n.javascript .hljs-title,\n.lisp .hljs-title,\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-label,\n.tex .hljs-command {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.instancevar,\n.lisp .hljs-body {\n  color: #008080;\n}\n\n.hljs-regexp {\n  color: #b68;\n}\n\n.hljs-class {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-symbol .hljs-keyword,\n.ruby .hljs-symbol .keymethods,\n.lisp .hljs-keyword,\n.tex .hljs-special,\n.input_number {\n  color: #990073;\n}\n\n.builtin,\n.constructor,\n.hljs-built_in,\n.lisp .hljs-title {\n  color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.diff .hljs-change {\n  background: #0086b3;\n}\n\n.hljs-chunk {\n  color: #aaa;\n}\n\n.tex .hljs-formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/far.css",
    "content": "/*\n\nFAR Style (c) MajestiC <majestic2k@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000080;\n}\n\n.hljs,\n.hljs-subst {\n  color: #0ff;\n}\n\n.hljs-string,\n.ruby .hljs-string,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-rules .hljs-value .hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.clojure .hljs-title,\n.coffeescript .hljs-attribute {\n  color: #ff0;\n}\n\n.hljs-keyword,\n.css .hljs-id,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.xml .hljs-tag .hljs-title,\n.hljs-winutils,\n.hljs-flow,\n.hljs-change,\n.hljs-envvar,\n.bash .hljs-variable,\n.tex .hljs-special,\n.clojure .hljs-built_in {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-phpdoc,\n.hljs-javadoc,\n.java .hljs-annotation,\n.hljs-template_comment,\n.hljs-deletion,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.clojure .hljs-attribute {\n  color: #0f0;\n}\n\n.python .hljs-decorator,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.xml .hljs-pi,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-shebang,\n.nginx .hljs-built_in,\n.hljs-prompt {\n  color: #008080;\n}\n\n.hljs-keyword,\n.css .hljs-id,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.hljs-flow,\n.apache .hljs-tag,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/foundation.css",
    "content": "/*\nDescription: Foundation 4 docs style for highlight.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://foundation.zurb.com/docs/\nVersion: 1.0\nDate: 2013-04-02\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eee;\n}\n\n.hljs-header,\n.hljs-decorator,\n.hljs-annotation {\n  color: #000077;\n}\n\n.hljs-horizontal_rule,\n.hljs-link_url,\n.hljs-emphasis,\n.hljs-attribute {\n  color: #070;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-link_label,\n.hljs-strong,\n.hljs-value,\n.hljs-string,\n.scss .hljs-value .hljs-string {\n  color: #d14;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-blockquote,\n.hljs-comment {\n  color: #998;\n  font-style: italic;\n}\n\n.asciidoc .hljs-title,\n.hljs-function .hljs-title {\n  color: #900;\n}\n\n.hljs-class {\n  color: #458;\n}\n\n.hljs-id,\n.hljs-pseudo,\n.hljs-constant,\n.hljs-hexcolor {\n  color: teal;\n}\n\n.hljs-variable {\n  color: #336699;\n}\n\n.hljs-bullet,\n.hljs-javadoc {\n  color: #997700;\n}\n\n.hljs-pi,\n.hljs-doctype {\n  color: #3344bb;\n}\n\n.hljs-code,\n.hljs-number {\n  color: #099;\n}\n\n.hljs-important {\n  color: #f00;\n}\n\n.smartquote,\n.hljs-label {\n  color: #970;\n}\n\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #579;\n}\n\n.hljs-reserved,\n.hljs-keyword,\n.scss .hljs-value {\n  color: #000;\n}\n\n.hljs-regexp {\n  background-color: #fff0ff;\n  color: #880088;\n}\n\n.hljs-symbol {\n  color: #990073;\n}\n\n.hljs-symbol .hljs-string {\n  color: #a60;\n}\n\n.hljs-tag {\n  color: #007700;\n}\n\n.hljs-at_rule,\n.hljs-at_rule .hljs-keyword {\n  color: #088;\n}\n\n.hljs-at_rule .hljs-preprocessor {\n  color: #808;\n}\n\n.scss .hljs-tag,\n.scss .hljs-attribute {\n  color: #339;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/github.css",
    "content": "/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #333;\n  background: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n  color: #998;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n  color: #099;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula {\n  color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.coffeescript .hljs-params,\n.scss .hljs-preprocessor {\n  color: #900;\n  font-weight: bold;\n}\n\n.javascript .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-title,\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n  color: #008080;\n}\n\n.hljs-regexp {\n  color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n  color: #990073;\n}\n\n.hljs-built_in,\n.lisp .hljs-title,\n.clojure .hljs-built_in {\n  color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.diff .hljs-change {\n  background: #0086b3;\n}\n\n.hljs-chunk {\n  color: #aaa;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/googlecode.css",
    "content": "/*\n\nGoogle Code style (c) Aahan Krish <geekpanth3r@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #800;\n}\n\n.hljs-keyword,\n.method,\n.hljs-list .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.hljs-tag .hljs-title,\n.setting .hljs-value,\n.hljs-winutils,\n.tex .hljs-command,\n.http .hljs-title,\n.hljs-request,\n.hljs-status {\n  color: #008;\n}\n\n.hljs-envvar,\n.tex .hljs-special {\n  color: #660;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.hljs-regexp,\n.coffeescript .hljs-attribute {\n  color: #080;\n}\n\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.ini .hljs-title,\n.hljs-shebang,\n.hljs-prompt,\n.hljs-hexcolor,\n.hljs-rules .hljs-value,\n.hljs-literal,\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number,\n.css .hljs-function,\n.clojure .hljs-attribute {\n  color: #066;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.hljs-typename,\n.hljs-tag .hljs-attribute,\n.hljs-doctype,\n.hljs-class .hljs-id,\n.hljs-built_in,\n.setting,\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-title {\n  color: #606;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.hljs-subst {\n  color: #000;\n}\n\n.css .hljs-class,\n.css .hljs-id {\n  color: #9b703f;\n}\n\n.hljs-value .hljs-important {\n  color: #ff7700;\n  font-weight: bold;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #444;\n}\n\n.tex .hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  color: #808080;\n  font-weight: bold;\n}\n\n.diff .hljs-change {\n  background-color: #bccff9;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-comment .hljs-yardoctag {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/hybrid.css",
    "content": "/*\n\nvim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)\n\n*/\n\n/*background color*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #1d1f21;\n}\n\n/*selection color*/\n.hljs::selection,\n.hljs span::selection {\n\tbackground: #373b41;\n}\n.hljs::-moz-selection,\n.hljs span::-moz-selection {\n\tbackground: #373b41;\n}\n\n/*foreground color*/\n.hljs,\n.hljs-setting .hljs-value,\n.hljs-expression .hljs-variable,\n.hljs-expression .hljs-begin-block,\n.hljs-expression .hljs-end-block,\n.hljs-class .hljs-params,\n.hljs-function .hljs-params,\n.hljs-at_rule .hljs-preprocessor {\n  color: #c5c8c6;\n}\n\n/*color: fg_yellow*/\n.hljs-title,\n.hljs-function .hljs-title,\n.hljs-keyword .hljs-common,\n.hljs-class .hljs-title,\n.hljs-decorator,\n.hljs-tag .hljs-title,\n.hljs-header,\n.hljs-sub,\n.hljs-function {\n  color: #f0c674;\n}\n\n/*color: fg_comment*/\n.hljs-comment,\n.hljs-javadoc,\n.hljs-output .hljs-value,\n.hljs-pi,\n.hljs-shebang,\n.hljs-template_comment,\n.hljs-doctype {\n  color: #707880;\n}\n\n/*color: fg_red*/\n.hljs-number,\n.hljs-symbol,\n.hljs-literal,\n.hljs-deletion,\n.hljs-link_url,\n.hljs-symbol .hljs-string,\n.hljs-argument,\n.hljs-hexcolor,\n.hljs-input .hljs-prompt,\n.hljs-char {\n color: #cc6666\n}\n\n/*color: fg_green*/\n.hljs-string,\n.hljs-special,\n.hljs-javadoctag,\n.hljs-addition,\n.hljs-important,\n.hljs-tag .hljs-value,\n.hljs-at.rule .hljs-keyword,\n.hljs-regexp,\n.hljs-attr_selector {\n  color: #b5bd68;\n}\n\n/*color: fg_purple*/\n.hljs-variable,\n.hljs-property,\n.hljs-envar,\n.hljs-code,\n.hljs-expression,\n.hljs-localvars,\n.hljs-id,\n.hljs-variable .hljs-filter,\n.hljs-variable .hljs-filter .hljs-keyword,\n.hljs-template_tag .hljs-filter .hljs-keyword {\n color: #b294bb;\n}\n\n/*color: fg_blue*/\n.hljs-statement,\n.hljs-label,\n.hljs-keyword,\n.hljs-xmlDocTag,\n.hljs-function .hljs-keyword,\n.hljs-chunk,\n.hljs-cdata,\n.hljs-link_label,\n.hljs-bullet,\n.hljs-class .hljs-keyword,\n.hljs-smartquote,\n.hljs-method,\n.hljs-list .hljs-title,\n.hljs-tag {\n color: #81a2be;\n}\n\n/*color: fg_aqua*/\n.hljs-pseudo,\n.hljs-exception,\n.hljs-annotation,\n.hljs-subst,\n.hljs-change,\n.hljs-cbracket,\n.hljs-operator,\n.hljs-horizontal_rule,\n.hljs-preprocessor .hljs-keyword,\n.hljs-typedef,\n.hljs-template_tag,\n.hljs-variable,\n.hljs-variable .hljs-filter .hljs-argument,\n.hljs-at_rule,\n.hljs-at_rule .hljs-string,\n.hljs-at_rule .hljs-keyword {\n  color: #8abeb7;\n}\n\n\n/*color: fg_orange*/\n.hljs-typename ,\n.hljs-inheritance .hljs-parent,\n.hljs-constant,\n.hljs-built_in,\n.hljs-setting,\n.hljs-structure,\n.hljs-link_reference,\n.hljs-attribute,\n.hljs-blockquote,\n.hljs-quoted,\n.hljs-class,\n.hljs-header {\n  color: #de935f;\n}\n\n.hljs-emphasis\n{\n  font-style: italic;\n}\n\n.hljs-strong\n{\n  font-weight: bold;\n}\n\n\n\n\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/idea.css",
    "content": "/*\n\nIntellij Idea-like styling (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #fff;\n}\n\n.hljs-subst,\n.hljs-title,\n.json .hljs-value {\n  font-weight: normal;\n  color: #000;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc,\n.diff .hljs-header {\n  color: #808080;\n  font-style: italic;\n}\n\n.hljs-annotation,\n.hljs-decorator,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-doctype,\n.hljs-pi,\n.hljs-chunk,\n.hljs-shebang,\n.apache .hljs-cbracket,\n.hljs-prompt,\n.http .hljs-title {\n  color: #808000;\n}\n\n.hljs-tag,\n.hljs-pi {\n  background: #efefef;\n}\n\n.hljs-tag .hljs-title,\n.hljs-id,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-literal,\n.hljs-keyword,\n.hljs-hexcolor,\n.css .hljs-function,\n.ini .hljs-title,\n.css .hljs-class,\n.hljs-list .hljs-title,\n.clojure .hljs-title,\n.nginx .hljs-title,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n  color: #000080;\n}\n\n.hljs-attribute,\n.hljs-rules .hljs-keyword,\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.tex .hljs-special {\n  font-weight: bold;\n  color: #0000ff;\n}\n\n.hljs-number,\n.hljs-regexp {\n  font-weight: normal;\n}\n\n.hljs-string,\n.hljs-value,\n.hljs-filter .hljs-argument,\n.css .hljs-function .hljs-params,\n.apache .hljs-tag {\n  color: #008000;\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-char,\n.tex .hljs-formula {\n  color: #000;\n  background: #d0eded;\n  font-style: italic;\n}\n\n.hljs-phpdoc,\n.hljs-yardoctag,\n.hljs-javadoctag {\n  text-decoration: underline;\n}\n\n.hljs-variable,\n.hljs-envvar,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #660e7a;\n}\n\n.hljs-addition {\n  background: #baeeba;\n}\n\n.hljs-deletion {\n  background: #ffc8bd;\n}\n\n.diff .hljs-change {\n  background: #bccff9;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/ir_black.css",
    "content": "/*\n  IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-shebang,\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #7c7c7c;\n}\n\n.hljs-keyword,\n.hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status,\n.clojure .hljs-attribute {\n  color: #96cbfe;\n}\n\n.hljs-sub .hljs-keyword,\n.method,\n.hljs-list .hljs-title,\n.nginx .hljs-title {\n  color: #ffffb6;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.coffeescript .hljs-attribute {\n  color: #a8ff60;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-decorator,\n.tex .hljs-special,\n.haskell .hljs-type,\n.hljs-constant,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.nginx .hljs-built_in {\n  color: #ffffb6;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number,\n.hljs-variable,\n.vbscript,\n.hljs-literal {\n  color: #c6c5fe;\n}\n\n.css .hljs-tag {\n  color: #96cbfe;\n}\n\n.css .hljs-rules .hljs-property,\n.css .hljs-id {\n  color: #ffffb6;\n}\n\n.css .hljs-class {\n  color: #fff;\n}\n\n.hljs-hexcolor {\n  color: #c6c5fe;\n}\n\n.hljs-number {\n  color:#ff73fd;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.7;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/kimbie.dark.css",
    "content": "/*\n    Name:     Kimbie (dark)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-title {\n  color: #d6baad;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #889b4a;\n}\n\n/* Kimbie Aqua */\n.css .hljs-hexcolor {\n  color:: #088649;\n}\n\n/* Kimbie Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #8ab1b0;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #221a0f;\n  color: #d3af86;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/kimbie.light.css",
    "content": "/*\n    Name:     Kimbie (light)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-title {\n  color: #a57a4c;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #889b4a;\n}\n\n/* Kimbie Aqua */\n.css .hljs-hexcolor {\n  color: #088649;\n}\n\n/* Kimbie Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #8ab1b0;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fbebd4;\n  color: #84613d;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/magula.css",
    "content": "﻿/*\nDescription: Magula style for highligh.js\nAuthor: Ruslan Keba <rukeba@gmail.com>\nWebsite: http://rukeba.com/\nVersion: 1.0\nDate: 2009-01-03\nMusic: Aphex Twin / Xtal\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background-color: #f4f4f4;\n}\n\n.hljs,\n.hljs-subst,\n.lisp .hljs-title,\n.clojure .hljs-built_in {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-cbracket,\n.coffeescript .hljs-attribute {\n  color: #050;\n}\n\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk {\n  color: #777;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.hljs-change,\n.tex .hljs-special {\n  color: #800;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.hljs-prompt,\n.clojure .hljs-attribute {\n  color: #00e;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-built_in,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.xml .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n  color: navy;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n/* --- */\n.apache .hljs-tag {\n  font-weight: bold;\n  color: blue;\n}\n\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/mono-blue.css",
    "content": "/*\n  Five-color theme from a single blue hue.\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eaeef3;\n  color: #00193a;\n}\n\n.hljs-keyword,\n.hljs-title,\n.hljs-important,\n.hljs-request,\n.hljs-header,\n.hljs-javadoctag {\n  font-weight: bold;\n}\n\n.hljs-comment,\n.hljs-chunk,\n.hljs-template_comment {\n  color: #738191;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-built_in,\n.hljs-literal,\n.hljs-filename,\n.hljs-value,\n.hljs-addition,\n.hljs-tag,\n.hljs-argument,\n.hljs-link_label,\n.hljs-blockquote,\n.hljs-header {\n  color: #0048ab;\n}\n\n.hljs-decorator,\n.hljs-prompt,\n.hljs-yardoctag,\n.hljs-subst,\n.hljs-symbol,\n.hljs-doctype,\n.hljs-regexp,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-attribute,\n.hljs-attr_selector,\n.hljs-javadoc,\n.hljs-xmlDocTag,\n.hljs-deletion,\n.hljs-shebang,\n.hljs-string .hljs-variable,\n.hljs-link_url,\n.hljs-bullet,\n.hljs-sqbracket,\n.hljs-phony {\n  color: #4c81c9;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/monokai.css",
    "content": "/*\nMonokai style - ported by Luigi Maselli - http://grigio.org\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #272822;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-keyword,\n.hljs-literal,\n.hljs-strong,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color: #f92672;\n}\n\n.hljs {\n  color: #ddd;\n}\n\n.hljs .hljs-constant,\n.asciidoc .hljs-code {\n\tcolor: #66d9ef;\n}\n\n.hljs-code,\n.hljs-class .hljs-title,\n.hljs-header {\n\tcolor: white;\n}\n\n.hljs-link_label,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-value,\n.hljs-regexp {\n\tcolor: #bf79db;\n}\n\n.hljs-link_url,\n.hljs-tag .hljs-value,\n.hljs-string,\n.hljs-bullet,\n.hljs-subst,\n.hljs-title,\n.hljs-emphasis,\n.haskell .hljs-type,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #a6e22e;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.smartquote,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #75715e;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-header,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/monokai_sublime.css",
    "content": "/*\n\nMonokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #23241f;\n}\n\n.hljs,\n.hljs-tag,\n.css .hljs-rules,\n.css .hljs-value,\n.css .hljs-function\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #f8f8f2;\n}\n\n.hljs-strongemphasis,\n.hljs-strong,\n.hljs-emphasis {\n  color: #a8a8a2;\n}\n\n.hljs-bullet,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.hljs-number,\n.hljs-regexp,\n.alias .hljs-keyword,\n.hljs-literal,\n.hljs-hexcolor {\n  color: #ae81ff;\n}\n\n.hljs-tag .hljs-value,\n.hljs-code,\n.hljs-title,\n.css .hljs-class,\n.hljs-class .hljs-title:last-child {\n  color: #a6e22e;\n}\n\n.hljs-link_url {\n  font-size: 80%;\n}\n\n.hljs-strong,\n.hljs-strongemphasis {\n  font-weight: bold;\n}\n\n.hljs-emphasis,\n.hljs-strongemphasis,\n.hljs-class .hljs-title:last-child {\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-function,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special,\n.hljs-header,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-tag .hljs-title,\n.hljs-value,\n.alias .hljs-keyword:first-child,\n.css .hljs-tag,\n.css .unit,\n.css .hljs-important {\n  color: #f92672;\n}\n\n.hljs-function .hljs-keyword,\n.hljs-class .hljs-keyword:first-child,\n.hljs-constant,\n.css .hljs-attribute {\n  color: #66d9ef;\n}\n\n.hljs-variable,\n.hljs-params,\n.hljs-class .hljs-title {\n  color: #f8f8f2;\n}\n\n.hljs-string,\n.css .hljs-id,\n.hljs-subst,\n.haskell .hljs-type,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt,\n.hljs-link_label,\n.hljs-link_url {\n  color: #e6db74;\n}\n\n.hljs-comment,\n.hljs-javadoc,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #75715e;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata,\n.xml .php,\n.php .xml {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/obsidian.css",
    "content": "/**\n * Obsidian style\n * ported by Alexander Marenin (http://github.com/ioncreature)\n */\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #282b2e;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.css .hljs-id,\n.tex .hljs-special {\n  color: #93c763;\n}\n\n.hljs-number {\n  color: #ffcd22;\n}\n\n.hljs {\n  color: #e0e2e4;\n}\n\n.css .hljs-tag,\n.css .hljs-pseudo {\n  color: #d0d2b5;\n}\n\n.hljs-attribute,\n.hljs .hljs-constant {\n  color: #668bb0;\n}\n\n.xml .hljs-attribute {\n  color: #b3b689;\n}\n\n.xml .hljs-tag .hljs-value {\n  color: #e8e2b7;\n}\n\n.hljs-code,\n.hljs-class .hljs-title,\n.hljs-header {\n  color: white;\n}\n\n.hljs-class,\n.hljs-hexcolor {\n  color: #93c763;\n}\n\n.hljs-regexp {\n  color: #d39745;\n}\n\n.hljs-at_rule,\n.hljs-at_rule .hljs-keyword {\n  color: #a082bd;\n}\n\n.hljs-doctype {\n  color: #557182;\n}\n\n.hljs-link_url,\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-bullet,\n.hljs-subst,\n.hljs-emphasis,\n.haskell .hljs-type,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #8cbbad;\n}\n\n.hljs-string {\n  color: #ec7600;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #818e96;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-header,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-at_rule .hljs-keyword,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/paraiso.dark.css",
    "content": "/*\n    Paraíso (dark)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-title {\n  color: #8d8687;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #48b685;\n}\n\n/* Paraíso Aqua */\n.css .hljs-hexcolor {\n  color: #5bc4bf;\n}\n\n/* Paraíso Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #06b6ef;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2f1e2e;\n  color: #a39e9b;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/paraiso.light.css",
    "content": "/*\n    Paraíso (light)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-title {\n  color: #776e71;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #48b685;\n}\n\n/* Paraíso Aqua */\n.css .hljs-hexcolor {\n  color: #5bc4bf;\n}\n\n/* Paraíso Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #06b6ef;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #e7e9db;\n  color: #4f424c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/pojoaque.css",
    "content": "/*\n\nPojoaque Style by Jason Tate\nhttp://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html\nBased on Solarized Style from http://ethanschoonover.com/solarized\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #dccf8f;\n  background: url(./pojoaque.jpg) repeat scroll left top #181914;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #586e75;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.clojure .hljs-title,\n.nginx .hljs-title {\n  color: #b64926;\n}\n\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor {\n  color: #468966;\n}\n\n.hljs-title,\n.hljs-localvars,\n.hljs-function .hljs-title,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.hljs-identifier,\n.hljs-id {\n  color: #ffb03b;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type {\n  color: #b58900;\n}\n\n.css .hljs-attribute {\n  color: #b89859;\n}\n\n.css .hljs-number,\n.css .hljs-hexcolor {\n  color: #dccf8f;\n}\n\n.css .hljs-class {\n  color: #d3a60c;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-subst,\n.hljs-cdata {\n  color: #cb4b16;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.tex .hljs-formula {\n  background: #073642;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/railscasts.css",
    "content": "/*\n\nRailscasts-like style (c) Visoft, Inc. (Damien White)\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #232323;\n  color: #e6e1dc;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc,\n.hljs-shebang {\n  color: #bc9458;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.ruby .hljs-function .hljs-keyword,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title,\n.method,\n.hljs-list .hljs-title {\n  color: #c26230;\n}\n\n.hljs-string,\n.hljs-number,\n.hljs-regexp,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.tex .hljs-command,\n.markdown .hljs-link_label {\n  color: #a5c261;\n}\n\n.hljs-subst {\n  color: #519f50;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-tag .hljs-title,\n.hljs-doctype,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.input_number {\n  color: #e8bf6a;\n}\n\n.hljs-identifier {\n  color: #d0d0ff;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc {\n  text-decoration: none;\n}\n\n.hljs-constant {\n  color: #da4939;\n}\n\n\n.hljs-symbol,\n.hljs-built_in,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-symbol .hljs-identifier,\n.markdown .hljs-link_url,\n.hljs-attribute {\n  color: #6d9cbe;\n}\n\n.markdown .hljs-link_url {\n  text-decoration: underline;\n}\n\n\n\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-attribute {\n  color: #d0d0ff;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.tex .hljs-special {\n  color: #cda869;\n}\n\n.css .hljs-class {\n  color: #9b703f;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-rules .hljs-value {\n  color: #cf6a4c;\n}\n\n.css .hljs-id {\n  color: #8b98ab;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #8996a8 !important;\n}\n\n.hljs-hexcolor,\n.css .hljs-value .hljs-number {\n  color: #a5c261;\n}\n\n.hljs-title,\n.hljs-decorator,\n.css .hljs-function {\n  color: #ffc66d;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  background-color: #2f33ab;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.diff .hljs-change {\n  background-color: #4a410d;\n  color: #f8f8f8;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-addition {\n  background-color: #144212;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #600;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.7;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/rainbow.css",
    "content": "/*\n\nStyle with support for rainbow parens\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #474949;\n  color: #d1d9e1;\n}\n\n\n.hljs-body,\n.hljs-collection {\n   color: #d1d9e1;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #969896;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.clojure .hljs-attribute,\n.hljs-winutils,\n.javascript .hljs-title,\n.hljs-addition,\n.css .hljs-tag {\n  color: #cc99cc;\n}\n\n.hljs-number { color: #f99157; }\n\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor {\n  color: #8abeb7;\n}\n\n.hljs-title,\n.hljs-localvars,\n.hljs-function .hljs-title,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.lisp .hljs-title,\n.hljs-identifier {\n  color: #b5bd68;\n}\n\n.hljs-class .hljs-keyword {\n  color: #f2777a;\n}\n\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-label,\n.hljs-id,\n.lisp .hljs-title,\n.clojure .hljs-title .hljs-built_in {\n   color: #ffcc66;\n}\n\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword,\n.clojure .hljs-title .hljs-built_in {\n  font-weight: bold;\n}\n\n.hljs-attribute,\n.clojure .hljs-title {\n  color: #81a2be;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-subst,\n.hljs-cdata {\n  color: #f99157;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.tex .hljs-formula {\n  background: #eee8d5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/school_book.css",
    "content": "/*\n\nSchool Book style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 15px 0.5em 0.5em 30px;\n  font-size: 11px !important;\n  line-height:16px !important;\n}\n\npre{\n  background:#f6f6ae url(./school_book.png);\n  border-top: solid 2px #d2e8b9;\n  border-bottom: solid 1px #d2e8b9;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color:#005599;\n  font-weight:bold;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-keyword {\n  color: #3e5915;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.coffeescript .hljs-attribute {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket {\n  color: #e60415;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.xml .hljs-tag .hljs-title,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/solarized_dark.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #002b36;\n  color: #839496;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.hljs-pi,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #586e75;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-winutils,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor,\n.hljs-link_url {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-localvars,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.hljs-identifier,\n.vhdl .hljs-literal,\n.hljs-id,\n.css .hljs-function {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type,\n.hljs-link_reference {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-keyword,\n.hljs-pragma,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-subst,\n.hljs-cdata,\n.clojure .hljs-title,\n.css .hljs-pseudo,\n.hljs-header {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-deletion,\n.hljs-important {\n  color: #dc322f;\n}\n\n/* Solarized Violet */\n.hljs-link_label {\n  color: #6c71c4;\n}\n\n.tex .hljs-formula {\n  background: #073642;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/solarized_light.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fdf6e3;\n  color: #657b83;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.hljs-pi,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-winutils,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor,\n.hljs-link_url {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-localvars,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.hljs-identifier,\n.vhdl .hljs-literal,\n.hljs-id,\n.css .hljs-function {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type,\n.hljs-link_reference {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-keyword,\n.hljs-pragma,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-subst,\n.hljs-cdata,\n.clojure .hljs-title,\n.css .hljs-pseudo,\n.hljs-header {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-deletion,\n.hljs-important {\n  color: #dc322f;\n}\n\n/* Solarized Violet */\n.hljs-link_label {\n  color: #6c71c4;\n}\n\n.tex .hljs-formula {\n  background: #eee8d5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/sunburst.css",
    "content": "/*\n\nSunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #aeaeae;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.ruby .hljs-function .hljs-keyword,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #e28964;\n}\n\n.hljs-function .hljs-keyword,\n.hljs-sub .hljs-keyword,\n.method,\n.hljs-list .hljs-title {\n  color: #99cf50;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.tex .hljs-command,\n.coffeescript .hljs-attribute {\n  color: #65b042;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.hljs-shebang,\n.hljs-prompt {\n  color: #89bdff;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc {\n  text-decoration: underline;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number {\n  color: #3387cc;\n}\n\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-attribute {\n  color: #3e87e3;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.tex .hljs-special {\n  color: #cda869;\n}\n\n.css .hljs-class {\n  color: #9b703f;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-rules .hljs-value {\n  color: #cf6a4c;\n}\n\n.css .hljs-id {\n  color: #8b98ab;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #8996a8;\n}\n\n.hljs-hexcolor,\n.css .hljs-value .hljs-number {\n  color: #dd7b3b;\n}\n\n.css .hljs-function {\n  color: #dad085;\n}\n\n.diff .hljs-header,\n.hljs-chunk,\n.tex .hljs-formula {\n  background-color: #0e2231;\n  color: #f8f8f8;\n  font-style: italic;\n}\n\n.diff .hljs-change {\n  background-color: #4a410d;\n  color: #f8f8f8;\n}\n\n.hljs-addition {\n  background-color: #253b22;\n  color: #f8f8f8;\n}\n\n.hljs-deletion {\n  background-color: #420e09;\n  color: #f8f8f8;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/tomorrow-night-blue.css",
    "content": "/* Tomorrow Night Blue Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7285b7;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ff9da4;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #ffc58f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #ffeead;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #d1f1a9;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #99ffff;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #bbdaff;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ebbbff;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #002451;\n  color: white;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/tomorrow-night-bright.css",
    "content": "/* Tomorrow Night Bright Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d54e53;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #e78c45;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #e7c547;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #b9ca4a;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #70c0b1;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #7aa6da;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #c397d8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: black;\n  color: #eaeaea;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/tomorrow-night-eighties.css",
    "content": "/* Tomorrow Night Eighties Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #999999;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f2777a;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99157;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #ffcc66;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #99cc99;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #66cccc;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6699cc;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #cc99cc;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2d2d2d;\n  color: #cccccc;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/tomorrow-night.css",
    "content": "/* Tomorrow Night Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #cc6666;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #de935f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f0c674;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #b5bd68;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #8abeb7;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #81a2be;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b294bb;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1d1f21;\n  color: #c5c8c6;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/tomorrow.css",
    "content": "/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #8e908c;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #c82829;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f5871f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #eab700;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #718c00;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #3e999f;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #4271ae;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #8959a8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/vs.css",
    "content": "/*\n\nVisual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>\n\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.apache .hljs-cbracket {\n  color: #008000;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-built_in,.css\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title,\n.xml .hljs-tag,\n.xml .hljs-tag .hljs-value {\n  color: #00f;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.apache .hljs-tag,\n.hljs-date,\n.tex .hljs-formula,\n.coffeescript .hljs-attribute {\n  color: #a31515;\n}\n\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.hljs-preprocessor,\n.hljs-pragma,\n.userType,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-special,\n.hljs-prompt {\n  color: #2b91af;\n}\n\n.hljs-phpdoc,\n.hljs-javadoc,\n.hljs-xmlDocTag {\n  color: #808080;\n}\n\n.vhdl .hljs-typename { font-weight: bold; }\n.vhdl .hljs-string { color: #666666; }\n.vhdl .hljs-literal { color: #a31515; }\n.vhdl .hljs-attribute { color: #00b0e8; }\n\n.xml .hljs-attribute { color: #f00; }\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/xcode.css",
    "content": "/*\n\nXCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #006a00;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.nginx .hljs-title {\n  color: #aa0d91;\n}\n.method,\n.hljs-list .hljs-title,\n.hljs-tag .hljs-title,\n.setting .hljs-value,\n.hljs-winutils,\n.tex .hljs-command,\n.http .hljs-title,\n.hljs-request,\n.hljs-status {\n  color: #008;\n}\n\n.hljs-envvar,\n.tex .hljs-special {\n  color: #660;\n}\n\n.hljs-string {\n  color: #c41a16;\n}\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.hljs-regexp {\n  color: #080;\n}\n\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.ini .hljs-title,\n.hljs-shebang,\n.hljs-prompt,\n.hljs-hexcolor,\n.hljs-rules .hljs-value,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-number,\n.css .hljs-function,\n.clojure .hljs-title,\n.clojure .hljs-built_in,\n.hljs-function .hljs-title,\n.coffeescript .hljs-attribute {\n  color: #1c00cf;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.hljs-typename,\n.hljs-tag .hljs-attribute,\n.hljs-doctype,\n.hljs-class .hljs-id,\n.hljs-built_in,\n.setting,\n.hljs-params,\n.clojure .hljs-attribute {\n  color: #5c2699;\n}\n\n.hljs-variable {\n color: #3f6e74;\n}\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.hljs-subst {\n  color: #000;\n}\n\n.css .hljs-class,\n.css .hljs-id {\n  color: #9b703f;\n}\n\n.hljs-value .hljs-important {\n  color: #ff7700;\n  font-weight: bold;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #643820;\n}\n\n.tex .hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  color: #808080;\n  font-weight: bold;\n}\n\n.diff .hljs-change {\n  background-color: #bccff9;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-comment .hljs-yardoctag {\n  font-weight: bold;\n}\n\n.method .hljs-id {\n  color: #000;\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/highlight/styles/zenburn.css",
    "content": "/*\n\nZenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>\nbased on dark.css by Ivan Sagalaev\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #3f3f3f;\n  color: #dcdcdc;\n}\n\n.hljs-keyword,\n.hljs-tag,\n.css .hljs-class,\n.css .hljs-id,\n.lisp .hljs-title,\n.nginx .hljs-title,\n.hljs-request,\n.hljs-status,\n.clojure .hljs-attribute {\n  color: #e3ceab;\n}\n\n.django .hljs-template_tag,\n.django .hljs-variable,\n.django .hljs-filter .hljs-argument {\n  color: #dcdcdc;\n}\n\n.hljs-number,\n.hljs-date {\n  color: #8cd0d3;\n}\n\n.dos .hljs-envvar,\n.dos .hljs-stream,\n.hljs-variable,\n.apache .hljs-sqbracket {\n  color: #efdcbc;\n}\n\n.dos .hljs-flow,\n.diff .hljs-change,\n.python .exception,\n.python .hljs-built_in,\n.hljs-literal,\n.tex .hljs-special {\n  color: #efefaf;\n}\n\n.diff .hljs-chunk,\n.hljs-subst {\n  color: #8f8f8f;\n}\n\n.dos .hljs-keyword,\n.python .hljs-decorator,\n.hljs-title,\n.haskell .hljs-type,\n.diff .hljs-header,\n.ruby .hljs-class .hljs-parent,\n.apache .hljs-tag,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #efef8f;\n}\n\n.dos .hljs-winutils,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-string {\n  color: #dca3a3;\n}\n\n.diff .hljs-deletion,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-javadoc,\n.smalltalk .hljs-class,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.css .hljs-rules .hljs-value,\n.hljs-attr_selector,\n.hljs-pseudo,\n.apache .hljs-cbracket,\n.tex .hljs-formula,\n.coffeescript .hljs-attribute {\n  color: #cc9393;\n}\n\n.hljs-shebang,\n.diff .hljs-addition,\n.hljs-comment,\n.java .hljs-annotation,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype {\n  color: #7f9f7f;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n"
  },
  {
    "path": "ppt/node-generator-koa/js/img.screenfull.js",
    "content": "(function(window, document) {\n    var sf = function($imgs) {\n        $imgs.forEach(function($img) {\n            $img.addEventListener('click', function() {\n                show(this);\n            }, false);\n        });\n    };\n\n    function show(t) {\n        var img = document.createElement('img');\n        img.src = t.src;\n        img.className = 'transparent';\n        $layer.innerHTML = '';\n        img.onload = function() {\n            img.style.height = this.height + 'px';\n            var top = this.height > $body.clientHeight ? 0 : ($body.clientHeight - this.height) / 2;\n            img.style.top = top + 'px';\n            img.style.marginLeft = -this.width / 2 + 'px';\n            img.classList.remove('transparent');\n            img.onload = null;\n        }\n        img.style.cssText = 'max-height:' + $body.clientHeight + 'px;max-width:' + $body.clientWidth + 'px;';\n        $layer.appendChild(img);\n        $layer.style.display = 'block';\n        setTimeout(function() {\n            $layer.classList.remove('transparent');\n        }, 0);\n\n    };\n    var $layer = document.createElement('div');\n    $layer.className = 'img-full transparent';\n    // $layer.innerHTML = '<img src=\"http://paulmason.name/media/demos/full-screen-background-image/background.jpg\" />';\n    $layer.addEventListener('click', function() {\n        $layer.style.display = 'none';\n        $layer.classList.add('transparent');\n    }, false);\n    var $body = document.body || document.getElementsByTagName('body')[0];\n    $body.appendChild($layer);\n    window.screenfull = sf;\n}(window, document));\n"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/.npmignore",
    "content": "/node_modules\n/.sass-cache\n/tmp\n"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/Gruntfile.js",
    "content": "var concatArr = [\n\t'src/intro.js',\n\t'src/getCurrentScript.js',\n\t'src/vars.js',\n\t'src/typeof.js',\n\t'src/browser.js',\n\t'src/Module.js',\n\t'src/Promise.js',\n\t'src/getPath.js',\n\t'src/loadjs.js',\n\t'src/loadcss-img.js',\n\t'src/core.js',\n\t'src/outro.js'];\nmodule.exports = function(grunt) {\n\tgrunt.initConfig({\n\t\tpkg: grunt.file.readJSON('package.json'),\n\t\tjshint: {\n\t\t\toptions: {\n\t\t\t\tnoarg: true,\n\t\t\t\tnoempty: true,\n\t\t\t\tcurly: true,\n\t\t\t\tasi: true,\n\t\t\t\texpr: true,\n\t\t\t\tbrowser: true,\n\t\t\t\tstrict: true,\n\t\t\t\tunused: true,\n\t\t\t\tundef: true,\n\t\t\t\tloopfunc: false,\n\t\t\t\tsub: true,\n\t\t\t\tboss: true,\n\t\t\t\teqnull: true\n\t\t\t},\n\t\t\tfiles: ['tmp/<%= pkg.name %>.js']\n\t\t},\n\t\twatch: {\n\t\t\tfiles: ['src/*.js'],\n\t\t\ttasks: 'dev'\n\t\t},\n\t\tconcat: {\n\t\t\tMixJS: {\n\t\t\t\toptions: {\n\t\t\t\t\tseparator: '\\n'\n\t\t\t\t},\n\t\t\t\tsrc: concatArr,\n\t\t\t\tdest: 'lib/<%= pkg.name %>.<%= pkg.version %>.js'\n\t\t\t},\n\t\t\tdev: {\n\t\t\t\toptions: {\n\t\t\t\t\tseparator: '\\n'\n\t\t\t\t},\n\t\t\t\tsrc: concatArr,\n\t\t\t\tdest: 'tmp/<%= pkg.name %>.js'\n\t\t\t}\n\t\t},\n\t\tuglify: {\n\t\t\toptions: {\n\t\t\t\tsourceMap: 'lib/<%= pkg.name %>.<%= pkg.version %>.map',\n\t\t\t\tbanner: '/*! <%= pkg.name %> <%= pkg.version %> <%= grunt.template.today(\"yyyy-mm-dd\") %> by <%= pkg.author %> */\\n'\n\t\t\t},\n\t\t\tdist: {\n\t\t\t\tsrc: '<%= concat.MixJS.dest %>',\n\t\t\t\tdest: 'lib/<%= pkg.name %>.<%= pkg.version %>.min.js'\n\t\t\t}\n\t\t},\n\t\tcompress: {\n\t\t\tmain: {\n\t\t\t\toptions: {\n\t\t\t\t\tarchive: '<%= pkg.name %>.zip'\n\t\t\t\t},\n\t\t\t\tfiles: [{\n\t\t\t\t\texpand: true,\n\t\t\t\t\tcwd: 'lib',\n\t\t\t\t\tsrc: ['**'],\n\t\t\t\t\tfilter: 'isFile'\n\t\t\t\t}]\n\t\t\t}\n\t\t}\n\t});\n\n\t// grunt.loadNpmTasks('grunt-regarde');\n\tgrunt.loadNpmTasks('grunt-contrib-uglify');\n\tgrunt.loadNpmTasks('grunt-contrib-jshint');\n\tgrunt.loadNpmTasks('grunt-contrib-watch');\n\tgrunt.loadNpmTasks('grunt-contrib-concat');\n\tgrunt.loadNpmTasks('grunt-contrib-compress');\n\t\n\tgrunt.registerTask('build', ['concat:MixJS', 'uglify']);\n\tgrunt.registerTask('dev', ['concat:dev', 'jshint']);\n\t\n};"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/MIT-LICENSE.txt",
    "content": "Copyright 2013 Theowang http://js8.in\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/README.md",
    "content": "MixJS - Just Another Javascript Module Loader\n=============    \n                                                                                                \n    MMMMMMMM               MMMMMMMM  iiii                             JJJJJJJJJJJ   SSSSSSSSSSSSSSS \n    M:::::::M             M:::::::M i::::i                            J:::::::::J SS:::::::::::::::S\n    M::::::::M           M::::::::M  iiii                             J:::::::::JS:::::SSSSSS::::::S\n    M:::::::::M         M:::::::::M                                   JJ:::::::JJS:::::S     SSSSSSS\n    M::::::::::M       M::::::::::Miiiiiii xxxxxxx      xxxxxxx         J:::::J  S:::::S            \n    M:::::::::::M     M:::::::::::Mi:::::i  x:::::x    x:::::x          J:::::J  S:::::S            \n    M:::::::M::::M   M::::M:::::::M i::::i   x:::::x  x:::::x           J:::::J   S::::SSSS         \n    M::::::M M::::M M::::M M::::::M i::::i    x:::::xx:::::x            J:::::j    SS::::::SSSSS    \n    M::::::M  M::::M::::M  M::::::M i::::i     x::::::::::x             J:::::J      SSS::::::::SS  \n    M::::::M   M:::::::M   M::::::M i::::i      x::::::::x  JJJJJJJ     J:::::J         SSSSSS::::S \n    M::::::M    M:::::M    M::::::M i::::i      x::::::::x  J:::::J     J:::::J              S:::::S\n    M::::::M     MMMMM     M::::::M i::::i     x::::::::::x J::::::J   J::::::J              S:::::S\n    M::::::M               M::::::Mi::::::i   x:::::xx:::::xJ:::::::JJJ:::::::J  SSSSSSS     S:::::S\n    M::::::M               M::::::Mi::::::i  x:::::x  x:::::xJJ:::::::::::::JJ   S::::::SSSSSS:::::S\n    M::::::M               M::::::Mi::::::i x:::::x    x:::::x JJ:::::::::JJ     S:::::::::::::::SS \n    MMMMMMMM               MMMMMMMMiiiiiiiixxxxxxx      xxxxxxx  JJJJJJJJJ        SSSSSSSSSSSSSSS   \n\nversion: 0.3.0 butterfly\n\nCome back soon!!\n"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/lib/event/broadcast.js",
    "content": "/**\n * 广播事件处理\n * 状态：稳定\n * \n * 目标: 为了尽可能的减少模块之间业务逻辑的耦合度, 而开发了这个eventbus, 主要用于业务逻辑的事件传递\n * 使用规范: 每个js模块尽可能通过事件去通信, 减少模块之间的直接调用和依赖(耦合)\n * 使用示例：\n *     //触发\n *     MixJS.event.broadcast.fire('abc',{abc:1}) \n *     //订阅\n *     MixJS.event.broadcast.on('abc',function(a){\n *         console.log(a);\n *     }, scope);\n    \n * @return {[type]} \n * @author  theowang\n * $Id: broadcast.js 65871 2012-11-05 01:51:42Z theowang $\n */\nMixJS.define('event/broadcast',function($){\n    var _cache = {};\n    var broadcast = {\n        \n        /**\n         * 派发         \n         * @param  {[type]} type 事件类型\n         * @param  {[type]} data 回调数据\n         * @return {[type]}      [description]\n         */\n        fire:function(type, data){\n            var listeners = _cache[type],len = 0;\n            if(!$.isUndefined(listeners)){\n                var args = [].slice.call(arguments, 0);\n                args = args.length > 2 ? args.splice(2, args.length-1) : [];\n                args = [data].concat(args);\n\n                len = listeners.length;\n                for(var i = 0; i<len;i++){\n                    var listener = listeners[i];\n                    if(listener && listener.callback) {\n                        args = args.concat(listener.args);\n                        listener.callback.apply(listener.scope, args);\n                    }\n                }\n            }\n            return this;\n        },\n        /**\n         * 订阅广播事件\n         * @param  {[type]}   types     事件类型，支持,分隔符\n         * @param  {Function} callback 回调函数\n         * @param  {[type]}   scope    回调函数上下文\n         * @return {[type]}            this\n         */\n        on:function(types, callback, scope){\n            types = types || [];\n            var args = [].slice.call(arguments);\n\n            if($.isString(types)){\n                types = types.split(',');\n            }\n            var len = types.length;\n            if(len===0){\n                return this;\n            }\n            args = args.length > 3 ? args.splice(3, args.length-1) : [];\n            for(var i = 0;i<len;i++){\n                var type = types[i];\n                _cache[type] = _cache[type] || [];\n                _cache[type].push({callback:callback,scope:scope,args:args});\n            }\n            return this;\n        },\n        /**\n         * 退订\n         * @param  {[type]}   type     [description]\n         * @param  {Function} callback 假如传入则移出传入的监控事件，否则移出全部\n         * @return {[type]}            [description]\n         */\n        un:function(type, callback, scope){\n            var listeners = _cache[type];\n            if (!listeners) {\n                return this;\n            }\n            if(callback){\n                var len = listeners.length,\n                    tmp = [];\n                \n                for(var i=0; i<len; i++) {\n                    var listener = listeners[i];\n                    if(listener.callback == callback && listener.scope == scope) {\n                    } else {\n                        tmp.push(listener);\n                    }\n                }\n                listeners = tmp;\n            }else{\n                listeners.length = 0;\n            }\n            return this;\n        },\n        \n        \n        removeAll:function(){\n            _cache = {};\n            return this;\n        }\n    };\n    return broadcast;\n});"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/lib/event/wait.js",
    "content": "/**\n * 一个简单的事件流处理\n * 状态：稳定\n * 支持多投事件，支持异步回调处理\n * 使用示例：\n * \t\tvar a = MixJS.event.wait();\n *   \ta.on('a,b,c', function(a,b,c){\n *   \t\talert('success');\n *   \t});\n *   \t$.post(url,data, function(res){\n *   \t\ta.fire('a', res);\n *   \t});\n *   \t$.get(url, function(json){\n *   \t\ta.fire('b', json)\n *   \t})\n *   \tsetTimeout(function(){\n *   \t\ta.fire('c')\n *   \t},1000);\n */\nMixJS.define('event/wait', function($) {\n\tvar _emptyFn = function() {};\n\tvar now = +new Date;\n\n\tfunction getUUid() {\n\t\treturn 'Theo' + (now++);\n\t}\n\t// var _emptyArr = [];\n\n\n\tfunction Wait() {\n\t\t// 强制使用new操作符\n\t\tif(!(this instanceof Wait)) {\n\t\t\treturn new Wait();\n\t\t}\n\t\tthis.init();\n\t}\n\n\tWait.prototype = {\n\t\tconstructor: Wait,\n\t\tinit:function(){\n\t\t\tthis.list = {}; //evt=>uuid array\n\t\t\tthis.cbMap = {}; //uuid=>callback\n\t\t\tthis.uuid2Evts = {}; //uuid=>evt array\n\t\t\tthis._cbMap = {}; //callback=>uuid\n\t\t},\n\t\t/**\n\t\t * 绑定事件\n\t\t * @param  {Array}   evts     事件数组\n\t\t * @param  {Function} callback 回调函数\n\t\t * @param  {Object}   scope    函数作用域\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\ton: function(evts, callback, scope) {\n\t\t\tif(!$.isFunction(callback) || !evts) {\n\t\t\t\t//如果不是函数，或者evts为空，则直接返回\n\t\t\t\t//不抛出异常\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tscope = scope || null; //回调作用域\n\t\t\t\n\t\t\tevts = $.isArray(evts) ? evts : evts.split(',');\n\n\t\t\tvar uuid = getUUid();\n\t\t\tthis.cbMap[uuid] = {\n\t\t\t\tfn: callback,\n\t\t\t\tscope: scope\n\t\t\t};\n\t\t\tthis._cbMap[callback] = uuid;\n\n\t\t\t$.each(evts, function(e, i) {\n\t\t\t\tthis.list[e] = this.list[e] || {\n\t\t\t\t\thandlers: [],\n\t\t\t\t\t//待处理的uuid\n\t\t\t\t\tdata: '',\n\t\t\t\t\tstate: 0\n\t\t\t\t};\n\n\t\t\t\t(this.uuid2Evts[uuid] = this.uuid2Evts[uuid] || []).push(e);\n\n\t\t\t\tthis.list[e].handlers.push(uuid); //使用uuid记录\n\t\t\t}, this)\n\n\n\t\t\treturn this;\n\t\t},\n\t\t_findCanCallbacks: function(arr) {\n\t\t\tvar back = [];\n\t\t\tfor(var i = 0, len = arr.length; i < len; i++) {\n\t\t\t\tvar uuid = arr[i];\n\t\t\t\tvar evts = this.uuid2Evts[uuid];\n\t\t\t\tvar doit = true;\n\t\t\t\tvar args = [];\n\t\t\t\tfor(var j = 0, l = evts.length; j < l; j++) {\n\t\t\t\t\tvar tmp = this.list[evts[j]];\n\t\t\t\t\tif(tmp.state === 0) {\n\t\t\t\t\t\tdoit = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\targs.push(tmp.data);\n\t\t\t\t}\n\t\t\t\tif(doit) {\n\t\t\t\t\tthis.cbMap[uuid].args = args;\n\t\t\t\t\tback.push(this.cbMap[uuid]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn back;\n\t\t},\n\t\t/**\n\t\t * 触发事件\n\t\t * @param  {String} evt  事件类型\n\t\t * @param  {[type]} data 事件数据\n\t\t * @return {[type]}      this\n\t\t */\n\t\tfire: function(evt, data) {\n\t\t\tvar list = this.list[evt];\n\t\t\tif(!list) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tlist.state = 1; //标注为可以fire\n\t\t\tlist.data = data || '';\n\t\t\tvar handlers = list.handlers;\n\t\t\thandlers = this._findCanCallbacks(handlers);\n\t\t\twhile(handlers[0]) {\n\t\t\t\tvar cb = handlers.shift();\n\n\t\t\t\tvar scope = cb.scope;\n\t\t\t\tvar args = cb.args;\n\n\t\t\t\tcb.fn.apply(scope, args)\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\t\t/**\n\t\t * 移出绑定事件\n\t\t * @param  {String}   evt      事件名称\n\t\t * @param  {Function} callback 回调函数\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\tun: function(evt, callback) {\n\t\t\tif($.isUndefined(evt) || !$.isFunction(callback)) {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tvar list = this.list[evt];\n\t\t\tif(!list) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tvar uuid = this._cbMap[callback];\n\t\t\tvar handlers = list.handlers;\n\t\t\tvar len = handlers.length;\n\n\t\t\twhile(len--) {\n\t\t\t\tif(uuid === handlers[len]) {\n\t\t\t\t\thandlers.splice(len, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this._cbMap[callback];\n\n\t\t\treturn this;\n\t\t},\n\t\t/**\n\t\t * 移出所有事件，重新初始化\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tremoveAll:function(){\n\t\t\tthis.destroy();\n\n\t\t\tthis.init();\n\t\t},\n\t\t/**\n\t\t * 销毁！\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tdestroy: function() {\n\t\t\tdestroy(this);\n\t\t}\n\t}\n\n\tfunction destroy(obj) {\n\t\tvar selfFn = arguments.callee;\n\t\tfor(var a in obj) {\n\t\t\tif(obj.hasOwnProperty(a)) {\n\t\t\t\tif($.isArray(obj[a])) {\n\t\t\t\t\tobj[a].length = 0;\n\t\t\t\t} else if(typeof obj[a] === 'object') {\n\t\t\t\t\tselfFn(obj[a]);\n\t\t\t\t}\n\t\t\t\tdelete obj[a];\n\t\t\t}\n\t\t}\n\t}\n\treturn function() {\n\t\treturn new Wait;\n\t}\n})"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/lib/mix-0.2.js",
    "content": ";(function(global, DOC, undefined) {\n    var VERSION = '0.2',\n        curScriptNode = (function(scripts, node) {\n            scripts = DOC.getElementsByTagName('script');\n            node = scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n            return node;\n        })(),\n        isDebug = !! curScriptNode.getAttribute('debug'),\n        MixJSName = curScriptNode.getAttribute('name') || 'MixJS',\n        CHARSET = curScriptNode.getAttribute('charset') || 'utf-8',\n\n        //获取当前文件父路径\n        PATH = (function(node) {\n            var url = node.hasAttribute ? // non-IE6/7\n            node.src :\n            // see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx\n            node.getAttribute('src', 4);\n            return url.substr(0, url.lastIndexOf('/')) + '/';\n        })(curScriptNode),\n        HEAD = DOC.head || DOC.getElementsByTagName('head')[0] || DOC.documentElement,\n        BASEELEMENT = HEAD.getElementsByTagName('base')[0] || null,\n        UA = navigator.userAgent,\n        isWebKit = ~UA.indexOf('AppleWebKit'),\n\n        reg = /[^, ]+/g,\n\n        _cleanObj = {},\n        _emptyArr = [],\n        _emptyFn = function() {},\n        _arrSlice = _emptyArr.slice,\n        /**\n         * 数组遍历\n         * @param  {[type]}   arr      [description]\n         * @param  {Function} callback [description] arrvalue index arr\n         * @param  {[type]}   scope    [description]\n         * @return {[type]}            [description]\n         */\n        each = [].forEach ?\n            function(arr, callback, scope) {\n                [].forEach.call(arr, callback, scope);\n            } : function(arr, callback, scope) {\n                for(var i = 0, len = arr.length; i < len; i++) {\n                    if(i in arr) {\n                        callback.call(scope, arr[i], i, arr);\n                    }\n                }\n            };\n\n    var config = {\n            path: PATH,\n            perload: _emptyArr,\n            //预先加载库\n            debug: isDebug,\n            charset: CHARSET\n        },\n        alias = {},\n        regAlias = /^[-\\w\\d_$]{2,}$/i,\n        _moduleDepsMap = {},\n        _filesMap = {},\n        //1:加载之前，2:加载中，3:加载完成\n        _modulesMap = {}; //1：定义之前 2：等待依赖关系中 3：定义完成\n    var $ = {\n        VERSION: VERSION,\n        path:PATH,\n        /**\n         * 别名机制\n         * @param  {String} name 名字\n         * @param  {String} realpath  别名真实url\n         * @return {[type]}      [description]\n         */\n        alias: function(name,arr){\n            if(regAlias.test(name)){\n                if($.isUndefined(arr)){\n                    return alias[name];\n                }else{\n                    arr = String(arr);\n                    alias[name] = arr;\n                    return this;\n                }\n\n            }else{\n                throw new Error('MixJS.alias name 格式错误');\n            }\n            return this;\n        },\n        use: function(names, callback) {\n            names = dealArr(names);\n            if(names.length === 0) {\n                $.isFunction(callback) && callback();\n                return this;\n            }\n            var temp = [], self = this;\n            each(names, function(v) {\n                var arr = getPath(v),\n                    ext = arr[1],\n                    moduleId = arr[2],\n                    url = arr[0];\n                    \n                if(!defined(moduleId) || (ext==='css' && _filesMap[url]===3)) {\n                    temp.push(moduleId);\n                    \n                   \n                    var cb = function() {\n                        //_modulesMap[v] = 3;\n                        _filesMap[url] = 3;\n                        temp.pop();\n\n                        if(temp.length === 0) {\n                            var t = function() {\n                                    \n                                    if(defined(moduleId) || ext==='css') {\n\n                                        $.isFunction(callback) && callback(self);\n\n                                    } else {\n                                        var q = Queue.useCallback[moduleId];\n                                        q = q ? q : (Queue.useCallback[moduleId] = new Queue(moduleId));\n                                        // console.log(q);\n                                        q.push(arguments.callee);\n\n                                    }\n                                }\n                            t();\n                            temp = null;\n                        }\n                    };\n                    // console.log(arr);\n                    ext==='css'?loadCSS(url,cb):loadJS(url, cb);\n                }\n\n            });\n            return this;\n        },\n        define: function(name, deps, factory) {\n            if(!$.isString(name)) {\n                throw new Error('MixJS.define: name 必须为字符串');\n            }\n            if($.isFunction(deps)) {\n                factory = deps;\n                deps = _emptyArr;\n            } else {\n                deps = dealArr(deps, 'define', name);\n            }\n\n            _moduleDepsMap[name] = deps;\n\n            new Module(name, deps, factory)\n            return this;\n        },\n        config: function(cfg) {\n\n            config = mix(config, cfg);\n            return this;\n        },\n        loadJS:loadJS,\n        loadCSS:loadCSS,\n        defined: defined,\n        loaded: function(file) {\n            var url = getPath(file)[0];\n            return loaded(url);\n        },\n        mix: mix,\n        each: each,\n        noConflict:function(){\n            return this;\n        }\n    };\n\n\n\n    //基本类型判断\n    'Function,String,Array,Number'.replace(reg, function(t) {\n        $['is' + t] = function(s) {\n            return isType(s, t)\n        }\n    });\n\n    if(typeof(/./) !== 'function') {\n        $.isFunction = function(obj) {\n            return typeof obj === 'function';\n        };\n    }   \n\n\n    $.isBoolean = function(obj) {\n        return obj === true || obj === false || isType(obj,'Boolean')\n    };\n\n    $.isUndefined = function(obj) {\n        return obj === undefined;\n        //return obj === void 0;\n    };\n\n\n    //释放到window\n    global[MixJSName] = $;\n    MixJSName !== 'MixJS' && (global.MixJS = $);\n\n    /**\n     * 判断模块是否定义\n     * @param  {[type]} module [description]\n     * @return {[type]}        [description]\n     */\n\n    function defined(module) {\n\n        return _modulesMap[module] === 3;\n    }\n    /**\n     * 判断文件是否加载\n     * @param  {[type]} file [description]\n     * @return {[type]}      [description]\n     */\n\n    function loaded(file) {\n\n        return _filesMap[file] === 3;\n    }\n\n\n    /**\n     * 数组去重复项和去除空项\n     * @param  {[type]} arr [description]\n     * @return {[type]}     [description]\n     */\n\n    function dealArr(arr, isFromDefine, mName) {\n        arr = String(arr).split(',');\n        var len = arr.length;\n        if(len === 0) {\n            return arr[0] === '' ? _emptyArr : arr;\n        }\n        var back = [],\n            obj = {},\n            val;\n        for(var i = 0; i < len; i++) {\n            val = arr[i];\n\n            if(val !== '' && !obj[val]) {\n                obj[val] = 1;\n                back.push(val);\n\n                isFromDefine === 'define' && (Module.parentModule[val] = mName); //定义父模块               \n            }\n        }\n        obj = null;\n        return back;\n    }\n\n\n    /**\n     * 检测依赖关系是否都加载完成\n     * _moduleDepsMap = {\n     *     test.a:[a,b,c]\n     *     a:[d,e]\n     * }\n     * @return {[type]} [description]\n     */\n\n    function checkDeps(module) {\n        var arr = _moduleDepsMap[module];\n        \n        if(!arr || arr.length===0) {\n            return true;\n        }\n        var obj = {},\n            back = true;\n\n        for(var i = 0, len = arr.length; i < len; i++) {\n            var m = arr[i];\n            \n            if(m===module){\n                throw new Error(module + '： 发现循环依赖');\n            }\n            if(obj[m] === 1) {\n                //简单去重，不能保证二次依赖去重复\n                continue;\n            }\n            \n            if(regAlias.test(m) && alias[m]){\n                //如果是alias模块\n                if(loaded(alias[m])){\n                    obj[m] = 1;\n                    continue;\n                }\n                back = false;\n                break;\n            }\n            \n            if(regISCSS.test(m)){\n                //如果是css文件\n                if(loaded(getPath(m)[0])){\n                    obj[m] = 1;\n                    continue;\n                }\n                back = false;\n                break;             \n            }\n\n            var temp = _moduleDepsMap[m];\n\n            if(temp && !(back = checkDeps(m))) {\n\n                break;\n\n            } else if(!defined(m)) {\n                back = false;\n                break;\n            } else {\n                obj[m] = 1;\n            }\n        }\n        obj = null;\n        return back;\n    }\n\n    var _waitModule = {}; //等待转正的module实例\n    /**\n     * 模块类\n     * @param {[type]} id    模块名称\n     * @param {Array} deps  依赖模块\n     * @param {[type]} maker 制造函数\n     * @param {[type]} root  父模块，默认是MixJS\n     */\n\n    function Module(id, deps, maker, root) {\n\n        this.id = id;\n        this.deps = deps; //必须是数组\n        this.maker = maker;\n        this.root = root || $;\n        // _modulesMap[id] = 1;//定义之前\n        // this.queue = new Queue();\n        if(checkDeps(id)) {\n\n            this.namespace();\n\n        } else {\n\n            this.init();\n        }\n    }\n    Module.parentModule = {};\n    Module.prototype.init = function() {\n        _waitModule[this.id] = this;\n        var self = this;\n        $.use(this.deps, function() {\n            self.namespace();\n        })\n    }\n    Module.prototype.destroy = function() {\n        for(var a in this) {\n            if(this.hasOwnProperty(a)) {\n                delete this[a];\n            }\n        }\n    }\n    Module.prototype.namespace = function() {\n        if(!this.id) {\n            return;\n        }\n        // _modulesMap[this.id] = 2;//定义等待中，可能因为依赖关系没有加载而处于等待中\n        if(!checkDeps(this.id)) {\n\n            return;\n        }\n\n        var names = this.id.split('/'),\n            root = this.root;\n\n        var name;\n        while(name = names.shift()) {\n            if(names.length) {\n                // console.log(root);            \n                root = (root[name] = root[name] || {});\n            } else {\n                if($.isUndefined(root[name])) {\n\n                    try {\n                        var f = $.isFunction(this.maker) && this.maker(this.root);\n                        if(f) {\n\n                            f['@GOD'] = 'THEO'; //加个尾巴~\n                            root[name] = f;\n                            _modulesMap[this.id] = 3;\n\n                        }\n                    } catch(e) {\n                        // Module._definedModulesMap[this.id] = 2;//模块定义可能出错了\n                        throw new Error('Module.namespace error:id=>' + this.id + ',info=>' + e.message);\n                    }\n                }\n            }\n        }\n        var parent = Module.parentModule[this.id];\n        if(parent && _waitModule[parent]) {\n            _waitModule[parent].namespace();\n        }\n        var q = Queue.useCallback[this.id];\n        if(q) {\n            q.fire();\n        }\n\n        delete _waitModule[this.id];\n        this.destroy();\n    }\n\n    var regProtocol = /^(\\w+)(\\d)?:.*/,\n        //协议\n        regISJS = /\\.js$/i,\n        //是否为js\n        regISCSS = /\\.css$/i,\n        //是否为css\n        regRelative = /\\.\\.\\//g,\n        //相对路径处理\n        regEXT = /\\.(\\w+)$/; //后缀2~4\n    /**\n     * 获取真实url\n     * 来自massframework\n     * @param  {[type]} url [description]\n     * @return {[type]}     [description]\n     */\n\n    function getPath(url, root) {\n        var ret;\n\n        root = root || config.path;\n        root = root.substr(0, root.lastIndexOf('/'));\n        id = url;//模块id\n\n        if(regAlias.test(url) && alias[url]){\n            ret = alias[url];\n\n        }else if(regProtocol.test(url)) { //如果用户路径包含协议\n            ret = url;\n        } else {\n            var tmp = url.charAt(0),\n                _2 = url.slice(0, 2);\n\n            if(tmp !== '.' && tmp !== '/') { //相对于根路径\n                ret = root + '/' + url;\n            } else if(_2 === './') { //相对于兄弟路径\n                id = url.substr(2);\n                ret = root + '/' + id;\n            } else if(_2 === '..') { //相对于父路径\n                // var arr = root.replace(/\\/$/, '').split('/');\n                var arr = root.split('/');\n                regRelative.lastIndex = 0;\n                tmp = url.replace(regRelative, function() {\n                    arr.pop();\n                    return '';\n                });\n                id = tmp;\n                ret = arr.join('/') + '/' + tmp;\n            }\n        }\n\n        var ext = 'js'; //默认是js文件\n        tmp = ret.replace(/[?#].*/, '');\n        if(regEXT.test(tmp)) {\n            ext = RegExp.$1;\n        }\n        if(ext !== 'css' && tmp === ret && !regISJS.test(ret)) { //如果没有后缀名会补上.js\n            ret += '.js';\n        }\n        return [ret, ext, id];\n    }\n\n    /**\n     * 一个简单队列\n     * @param {[type]} id [description]\n     */\n\n    function Queue(id) {\n        this.id = id;\n        this.taskList = [];\n    }\n    Queue.useCallback = {}; //放置use使用的callback\n    /**\n     * 从后部推入\n     * @param  {Function} fn    [description]\n     * @param  {[type]}   args  [description]\n     * @param  {[type]}   scope [description]\n     * @return {[type]}         [description]\n     */\n    Queue.prototype.push = function(fn, args, scope) {\n        return this._add(fn, args, scope, 'push');\n    }\n    Queue.prototype.unshift = function(fn, args, scope) {\n        return this._add(fn, args, scope, 'unshift');\n    }\n    Queue.prototype._add = function(fn, args, scope, type) {\n        if(!type) {\n            return this;\n        }\n        args = _arrSlice.call(arguments, 0, -1);\n        if(args.length === 0) {\n            return this;\n        }\n\n        this.taskList[type](args);\n        return this;\n    }\n    /**\n     * 从后部弹出\n     * @return {[type]} [description]\n     */\n    Queue.prototype.fire = function() {\n        if(this._canIDo()) {\n            var fn = this.taskList.pop();\n\n            var args = $.isArray(fn[1]) ? fn[1] : [],\n                scope = fn[2] || null;\n            fn = fn[0];\n\n            // argsFromCall = $.isArray(argsFromCall)?argsFromCall:[argsFromCall];\n            // args = args.concat(argsFromCall);\n            $.isFunction(fn) && fn.apply(scope, args);\n            this.destroy();\n        }\n        return this;\n    }\n    Queue.prototype.destroy = function() {\n\n\n        this.taskList.length = 0;\n        delete this.taskList;\n        delete Queue.useCallback[this.id]; //记得用完要销毁罪证哦~\n        delete this.id;\n        // delete Queue.modules[this.moduleName];\n    }\n    Queue.prototype._canIDo = function() {\n        return this.taskList.length !== 0;\n    }\n\n\n\n    /**\n     * 加载js\n     * @param  {[type]}   url      [description]\n     * @param  {Function} callback [description]\n     * @param  {[type]}   fail     [description]\n     * @param  {[type]}   charset  [description]\n     * @return {[type]}            [description]\n     */\n\n    function loadJS(url, callback, fail, charset) {\n        var node = DOC.createElement('script');\n        var args = _arrSlice.call(arguments, 0);\n        if($.isString(fail) && args.length === 3) {\n            //如果fail为字符串，认为是charset\n            charset = fail;\n        } else if(args.length === 4 && $.isString(charset)) {\n\n        } else {\n            charset = config.charset;\n        }\n        $.isFunction(callback) && jsCallback(node, callback, fail);\n\n        node.charset = charset;\n        node.async = true;\n        node.src = url;\n        HEAD.insertBefore(node, BASEELEMENT);\n        return $;\n    }\n\n    //jscallback检测\n    var regJSLOAD = /loaded|complete|undefined/;\n\n    function jsCallback(node, callback, fail) {\n\n        if($.isFunction(fail)) {\n            node.onerror = jsGetCallback(node, fail);\n            node.onload = node.onreadystatechange = jsGetCallback(node, callback);\n        } else {\n            node.onload = node.onerror = node.onreadystatechange = jsGetCallback(node, callback);\n        }\n\n    }\n    //js可以检测error，所以加上了这个函数\n\n    function jsGetCallback(node, cb) {\n        return function(e) {\n            e = e || global.event;\n            \n            if(e.type === 'load' || regJSLOAD.test(node.readyState)) {\n                \n                //确保执行一次+内存回收\n                node.onload = node.onerror = node.onreadystatechange = null\n\n                if(node.parentNode && !config.debug) {\n                    HEAD.removeChild(node)\n                }\n            \n                node = undefined\n\n                cb()\n            }\n        }\n\n    }\n    /**\n     * 加载css文件\n     * @param  {[type]}   url      [description]\n     * @param  {Function} callback [description]\n     * @return {[type]}            [description]\n     */\n\n    function loadCSS(url, callback, fail) {\n        var node = DOC.createElement('link');\n        node.rel = 'stylesheet';\n        node.type = \"text/css\";\n\n        cssCallback(node, callback, fail);\n\n        node.href = url;\n        HEAD.insertBefore(node, BASEELEMENT);\n        return $;\n    }\n    ///===============>css load检测来自seajs\n    // `onload` event is supported in WebKit since 535.23\n    // Ref:\n    //  - https://bugs.webkit.org/show_activity.cgi?id=38995\n    var isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n\n    // `onload/onerror` event is supported since Firefox 9.0\n    // Ref:\n    //  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n    //  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\n    var isOldFirefox = UA.indexOf('Firefox') > 0 && !('onload' in DOC.createElement('link'));\n    var cssCallback = (isOldWebKit || isOldFirefox) ?\n    function(node, callback, fail) {\n        $.isFunction(callback) && \n        setTimeout(function() {\n            poll(node, callback)\n        }, 1) // Begin after node insertion\n    } : function(node, callback, fail) {\n        $.isFunction(callback) && (node.onload = function() {\n            node.onload = node.onerror = null\n            node = undefined\n            callback()\n        });\n        $.isFunction(fail) && (node.onerror = function(){\n            node.onload = node.onerror = null\n            node = undefined\n            fail()\n        });\n    }\n\n    function poll(node, callback) {\n        var isLoaded\n\n        // for WebKit < 536\n        if(isOldWebKit) {\n            if(node.sheet) {\n                isLoaded = true\n            }\n        }\n        // for Firefox < 9.0\n        else if(node.sheet) {\n            try {\n                if(node.sheet.cssRules) {\n                    isLoaded = true\n                }\n            } catch(ex) {\n                // The value of `ex.name` is changed from\n                // 'NS_ERROR_DOM_SECURITY_ERR' to 'SecurityError' since Firefox 13.0\n                // But Firefox is less than 9.0 in here, So it is ok to just rely on\n                // 'NS_ERROR_DOM_SECURITY_ERR'\n                if(ex.name === 'NS_ERROR_DOM_SECURITY_ERR') {\n                    isLoaded = true\n                }\n            }\n        }\n\n        setTimeout(function() {\n            if(isLoaded) {\n                // Place callback in here due to giving time for style rendering.\n                callback()\n            } else {\n                poll(node, callback)\n            }\n        }, 1)\n    }\n\n    /**\n     * 获取类型\n     * @param  {[type]} obj 要判断的对象\n     * @return {String}     返回类型\n     */\n\n    function isType(obj, type) {\n        return _cleanObj.toString.call(obj).slice(8, -1) === type;\n    }\n\n    /**\n     * 糅杂\n     * @param {Object} target 原有的默认\n     * @param {Object} source 第三方来源\n     */\n\n    function mix(target, source) {\n        var args = _arrSlice.call(arguments),\n            i = 1,\n            key, self = arguments.callee,\n            //如果最后参数是布尔，判定是否覆写同名属性\n            ride = $.isBoolean(args[args.length - 1]) ? args.pop() : true;\n        if(args.length === 1) {\n            target = !this.window ? this : _cleanObj;\n            i = 0;\n        }\n\n        while((source = args[i++])) {\n            //source = [{a:1},{b:3}];\n            if($.isArray(source)) {\n                for(var n = 0, len = source.length; n < len; n++) {\n                    self(target, source[n], ride);\n                }\n\n                continue;\n            }\n            //杂糅只允许对象\n            for(key in source) {\n                if(ride || !(key in target)) {\n                    target[key] = source[key];\n                }\n            }\n        }\n        return target;\n    }\n}(window, document));"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/lib/mix.0.3.0.js",
    "content": "(function(window, undefined) {\n'use strict';\nvar document = window.document;\nvar setTimeout = window.setTimeout;\n//本js文件不支持defer等属性，否则计算当前路径会错误\n//模块加载的东西，基础js肯定不能defer掉……\nvar curScriptNode = (function() {\n    var scripts = document.getElementsByTagName('script');\n    return scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n})();\nvar VERSION = 'MixJS 0.3 butterfly';\nvar emptyFn = function() {};\nvar cleanObj = {};\nvar emptyArr = [];\nvar head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;\nvar base = head.getElementsByTagName('base')[0] || null;\nvar arrSlice = emptyArr.slice;\n\n//获取当前文件父路径\nvar PATH = (function(node) {\n    var url = node.hasAttribute ? node.src : node.getAttribute('src', 4);\n    return url.substr(0, url.lastIndexOf('/')) + '/';\n})(curScriptNode);\n\n//是否为js\nvar regIsJS = /\\.js$/i;\n//是否为css\nvar regIsCSS = /\\.css$/i;\n//alias\nvar regAlias = /^[-\\w\\d_$]{2,}$/i;\nvar $ = {};\n\nvar defaultConfig = {\n    timeout: 2E4, //超时时间二十秒\n    baseURL: PATH,\n    charset: 'utf-8'\n};\n\n//=============>maps\n//别名列表\nvar mapAlias = {};\n//加载完的文件列表\nvar mapLoaded = {};\n//已经定义模块的状态表：undefined|pending|defined\nvar mapDefined = {};\n//通过依赖找上一级模块的promise\nvar mapDeps2ModulePromise = {};\n//基本类型判断\n'Function,String,Array,Number'.replace(/[^, ]+/g, function(t) {\n    $['is' + t] = function(s) {\n        return isType(s, t);\n    }\n});\nif (typeof(/./) !== 'function') {\n    $.isFunction = function(obj) {\n        return typeof obj === 'function';\n    };\n}\n$.isObject = function(obj) {\n    return typeof obj === 'object';\n}\n\n$.isBoolean = function(obj) {\n    return obj === true || obj === false || isType(obj, 'Boolean');\n};\n\n$.isUndefined = function(obj) {\n    return obj === undefined;\n};\n\n/**\n * 获取类型\n * @param  {Object} obj 要判断的对象\n * @return {String}     返回类型\n */\n\nfunction isType(obj, type) {\n    return cleanObj.toString.call(obj).slice(8, -1) === type;\n}\nvar UA = window.navigator.userAgent;\n\n/**\n * Module类\n * @param {String} id      moduleID\n * @param {Array} deps    依赖模块\n * @param {Function} factory 工厂函数\n * @param {Object} root    相对定义的root\n */\n\nfunction Module(id, deps, factory, root) {\n    if (arguments.length === 0) {\n        throw new Error('Module: I need a agrument');\n    }\n    if ($.isFunction(id)) {\n        factory = id;\n        id = undefined;\n        deps = emptyArr;\n    } else if ($.isArray(id)) {\n        deps = emptyArr;\n        id = undefined;\n    } else if ($.isFunction(deps)) {\n        factory = deps;\n        deps = emptyArr;\n    }\n    this.id = id ? getPath(id)[2] : id;\n    this.status = 'uninitialized';\n    if ($.isString(deps)) {\n        deps = deps.split(',');\n    }\n    this.dependencies = deps;\n    this.factory = factory;\n    this.root = root || _; //默认挂靠在window全局，使用_，默认挂靠到MixJS上\n    this.undef = []; //没有定义的模块\n    this.id && (mapDefined[this.id] = 'uninitialized');\n    this.checkDependencies(deps);\n    this.define();\n}\nModule.prototype = {\n    constructor: Module,\n    //定义\n    define: function() {\n        if (this.canDefine()) {\n            this.namespace();\n        } else if (this.status !== 'pending') {\n            this.status = 'pending';\n            this.id && (mapDefined[this.id] = this.status);\n            this.loadDeps();\n        }\n    },\n    //命名空间\n    namespace: function() {\n        var names = $.isString(this.id) ? this.id.split('/') : emptyArr;\n        var root = this.root;\n        var name, lastName;\n        while (name = names.shift()) {\n            lastName = name;\n            if (names.length) {\n                root = (root[name] = root[name] || {});\n            }\n        }\n        try {\n            var f = $.isFunction(this.factory) && this.factory.apply(window, this.getArgs());\n            if (f) {\n                f.amd = 'THEO'; //加个尾巴~\n                root[lastName] = f;\n                this.id && (mapDefined[this.id] = 'defined');\n            }\n        } catch (e) {\n            if (this.id) {\n                mapDefined[this.id] = 'error';\n            }\n            throw new Error('Module.namespace error:id=>' + this.id + ';undef=>' + this.undef.join(',') + ';info=>' + e.message);\n        }\n        //解决掉触发调用模块的promise\n        if (this.id && $.isArray(mapDeps2ModulePromise[this.id])) {\n            _.each(mapDeps2ModulePromise[this.id], function(v) {\n                if (isPromise(v)) {\n                    v.resolve();\n                }\n            });\n        }\n        this.destroy();\n    },\n    //根据模块名称，获取模块\n    getFn: function(names) {\n        names = names.split('/');\n        var root = this.root;\n        var name;\n        while (name = names.shift()) {\n            root = root[name];\n        }\n        return root;\n    },\n    //获取factory函数参数数组\n    getArgs: function() {\n        var arr = this.dependencies;\n        var v;\n        var fns = [this.root];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            v = arr[i];\n            fns.push(this.getFn(v));\n        }\n        return fns;\n    },\n    //判断是否符合转正标准\n    canDefine: function() {\n        var arr = this.undef;\n        var len = arr.length;\n        var temp;\n        while (len--) {\n            temp = arr[len];\n            if (!defined(temp)) {\n                if ((regIsCSS.test(temp) || regIsJS.test(temp)) && _.loaded(temp)) {\n                    continue;\n                }\n                return false;\n            }\n        }\n        return true;\n    },\n    //加载依赖\n    loadDeps: function() {\n        var self = this;\n        var promise;\n        var modules = self.undef;\n        _.each(modules, function(v) {\n            promise = new Promise();\n            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n            mapDeps2ModulePromise[v].push(promise.done(function() {\n                self.define();\n            }));\n            if (mapDefined[v] !== 'pending') {\n                var alias = _.alias(v);\n\n                if (alias && alias.length) {\n                    //如果存在alias\n                    var p = new Promise();\n\n                    p.done(function() {\n                        self.define()\n                    });\n                    //如果是普通js和css\n                    //不支持有依赖关系的alias模块类型的js\n                    var len = alias.length;\n                    var cb = function() {\n                        len--;\n                        if (len === 0) {\n                            mapDefined[v] = 'defined'; //标注alias被定义过了~\n                            p.resolve();\n                        }\n                    };\n                    _.each(alias, function(v) {\n                        if (regIsCSS.test(v)) {\n                            _.loadCSS(v, cb);\n                        } else if (regIsJS.test(v)) {\n                            _.loadJS(v, cb);\n                        } else {\n                            var tempPromise = new Promise();\n                            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n                            mapDeps2ModulePromise[v].push(tempPromise.done(cb));\n                            _.loadJS(v);\n                        }\n                    });\n                } else if (regIsCSS.test(v)) {\n                    //css文件\n                    _.loadCSS(v, function() {\n                        self.define();\n                    });\n                } else if (regIsJS.test(v)) {\n                    //js文件\n                    _.loadJS(v, function() {\n                        self.define();\n                    });\n                } else {\n                    //模块\n                    _.loadJS(v);\n                }\n            }\n        });\n    },\n    //首次检测依赖关系，对已经定义和未定义的模块进行分组\n    checkDependencies: function(deps) {\n        var self = this;\n        _.each(deps, function(v) {\n            v = getPath(v)[2];\n            if (!defined(v)) {\n                self.undef.push(v);\n            }\n        });\n    },\n    //销毁函数\n    destroy: function() {\n        destroy(this);\n    }\n};\n\n/**\n * 判断是否为amd模块\n * @param  {Object}  obj 要判断的对象\n * @return {Boolean}     判断结果\n */\n\nfunction isAMD(obj) {\n    return obj.amd === 'THEO';\n}\n\n/**\n * 判断一个module是否被定义过\n * @param  {String} moduleID 被检测的module对象id\n * @return {Boolean}        判断结果\n */\n\nfunction defined(moduleID) {\n    return mapDefined[moduleID] === 'defined';\n}\n/**\n * Promise类\n */\n\nfunction Promise() {\n    this.status = 'unfulfilled'; //fulfilled|failed\n    this.fulfilledHandlers = [];\n    this.errorHandlers = [];\n    this.reason = '';\n}\nPromise.prototype = {\n    constructor: Promise,\n    reject: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'failed';\n        return this.fire(this.errorHandlers, arg);\n    },\n    isResolved: function() {\n        return this.status === 'fulfilled';\n    },\n    resolve: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'fulfilled';\n        return this.fire(this.fulfilledHandlers, arg);\n    },\n    fail: function(handler) {\n        return this.then(undefined, handler);\n    },\n    always: function(handler) {\n        return this.then(handler, handler);\n    },\n    then: function(fulfilledHandler, errorHandler) {\n        switch (this.status) {\n        case 'unfulfilled':\n            this.add(fulfilledHandler, 'fulfilled')\n                .add(errorHandler, 'error');\n            break;\n        case 'fulfilled':\n            this.fire(fulfilledHandler, this.reason);\n            break;\n        case 'failed':\n            this.fire(errorHandler, this.reason);\n        }\n        return this;\n    },\n    done: function(handler) {\n        return this.then(handler);\n    },\n    fire: function(fns, arg) {\n        if ($.isArray(fns)) {\n            var fn;\n            while (fn = fns.shift()) {\n                if ($.isFunction(fn)) {\n                    fn(arg);\n                }\n            }\n            this.clear();\n        } else if ($.isFunction(fns)) {\n            fns(arg);\n        }\n        return this;\n    },\n    add: function(handler, which) {\n        which = which + 'Handlers';\n        if ($.isFunction(handler) && this[which]) {\n            this[which].push(handler);\n        }\n        return this;\n    },\n    clear: function() {\n        this.fulfilledHandlers.length = 0;\n        this.errorHandlers.length = 0;\n    }\n};\n\n/**\n * 是否是Promise实例\n * @param  {Object}  o 被检验的对象\n * @return {Boolean}   是否为实例\n */\n\nfunction isPromise(o) {\n    return o instanceof Promise;\n}\n/**\n * 获取真实url\n * 来自massframework\n * @param  {[type]} url [description]\n * @return {[type]}     [description]\n */\n\nfunction getPath(url, root) {\n    var ret = url;\n    var tmp;\n    var _2;\n    var alias = _.alias;\n    var id;\n    root = root || defaultConfig.baseURL;\n    root = root.substr(0, root.lastIndexOf('/'));\n    id = url; //模块id\n\n    if (regAlias.test(url) && alias[url]) {\n        ret = alias[url];\n\n    } else if (/^(\\w+)(\\d)?:.*/.test(url)) { //如果用户路径包含协议\n        ret = url;\n    } else {\n        tmp = url.charAt(0);\n        _2 = url.slice(0, 2);\n\n        if (tmp !== '.' && tmp !== '/') { //相对于根路径\n            ret = root + '/' + url;\n        } else if (_2 === './') { //相对于兄弟路径\n            id = url.substr(2);\n            ret = root + '/' + id;\n        } else if (_2 === '..') { //相对于父路径\n            // var arr = root.replace(/\\/$/, '').split('/');\n            var arr = root.split('/');\n            tmp = url.replace(/\\.\\.\\//g, function() {\n                arr.pop();\n                return '';\n            });\n            id = tmp;\n            ret = arr.join('/') + '/' + tmp;\n        }\n    }\n\n    var ext = 'js'; //默认是js文件\n    tmp = ret.replace(/[?#].*/, '');\n    if (/\\.(\\w+)$/.test(tmp)) {\n        ext = RegExp.$1;\n    }\n    if (ext !== 'css' && tmp === ret && !regIsJS.test(ret)) { //如果没有后缀名会补上.js\n        ret += '.js';\n    }\n    return [ret, ext, id];\n}\n/**\n * 加载js\n * @param  {String}   src      路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\nfunction loadJS(src, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(src)) {\n        callback = src.callback;\n        attrs = src.attrs;\n        timeout = src.timeout;\n        fail = src.fail;\n        complete = src.complete;\n        src = src.src;\n        return loadJS(src, callback, attrs, timeout, fail, complete);\n    }\n    var script = document.createElement('script');\n    var done = false;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            script.setAttribute(i, attrs[i]);\n        }\n    }\n    var urls = getPath(src);\n    src = script.src = urls[0];\n    script.async = true;\n    script.type = 'text/javascript';\n    script.charset = defaultConfig.charset;\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    script.onload = script.onreadystatechange = function(e) {\n        e = e || cleanObj\n        if (!done && (e.type === 'load' || /loaded|complete|undefined/.test(script.readyState))) {\n            done = true;\n            removeNode(script);\n            mapLoaded[src] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    };\n    script.onerror = function() {\n        done = true;\n        mapLoaded[src] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    };\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[src] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[src] = 'pending';\n    head.insertBefore(script, base);\n    return _;\n}\n/**\n * 移出node节点，释放内存\n * @param  {Element} node 节点\n */\nfunction removeNode(node) {\n    //确保执行一次+内存回收\n    node.onload = node.onerror = node.onreadystatechange = null;\n    if (node.parentNode) {\n        setTimeout(function() {\n            node.parentNode.removeChild(node);\n            node = null;\n        }, 0);\n    }\n}\n//放弃轮询方法，改用img的方法，对于不支持的古老级别浏览器自动屏蔽\n/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n    \n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n\n    \n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    //弱化css 错误处理，只有callback的时候才处理\n    if($.isFunction(callback)){\n        complete = $.isFunction(complete) ? complete : emptyFn;\n        var cb,err;\n        cb = function() {\n            if (!done) {\n                done = true;\n                link.onload = link.onerror = link.onreadystatechange = null;\n                mapLoaded[href] = 'loaded';\n                $.isFunction(callback) && callback();\n                complete('load');\n            }\n        }\n        if($.isFunction(fail)){\n            err = function() {\n                if (!done) {\n                    done = true;\n                    link.onload = link.onerror = link.onreadystatechange = null;\n                    mapLoaded[href] = 'error';\n                    fail();\n                    complete('error');\n                }\n            }\n        }\n\n        cssCallback(link, cb, err);\n        if (timeout) {\n            setTimeout(function() {\n                if (!done) {\n                    done = true;\n                    mapLoaded[href] = 'timeout';\n                    complete('timeout');\n                }\n            }, timeout);\n        }\n    }\n    \n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\n\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        if ($.isFunction(callback)) {\n            var img = new Image();\n            img.src = node.href;\n            img.error = callback;            \n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n\nvar _ = {\n    version: VERSION,\n    mix: mix,\n    indexOf: function(array, item, isSorted) {\n        if (array == null) {\n            return -1;\n        }\n        var i = 0;\n        var l = array.length;\n        if (isSorted) {\n            i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n        }\n        if (emptyArr.indexOf && array.indexOf === emptyArr.indexOf) {\n            return array.indexOf(item, isSorted);\n        }\n        for (; i < l; i++) {\n            if (array[i] === item) {\n                return i;\n            }\n        }\n        return -1;\n    },\n    /**\n     * 数组遍历\n     * @param  {Array}   arr      数组\n     * @param  {Function} callback 处理函数\n     * @param  {Object}   scope    处理上下文\n     */\n    each: emptyArr.forEach ? function(arr, callback, scope) {\n        emptyArr.forEach.call(arr, callback, scope);\n    } : function(arr, callback, scope) {\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (i in arr) {\n                callback.call(scope, arr[i], i, arr);\n            }\n        }\n    },\n    defined: defined,\n    define: function(mid, dependencies, factory) {\n        new Module(mid, dependencies, factory);\n        return this;\n    },\n    /**\n     * use方法\n     * @param  {Array}   mid      模块数组\n     * @param  {Function} callback 回调函数\n     * @return {Object}            返回promise对象\n     */\n    use: function(mid, callback) {\n        new Module(undefined, mid, callback);\n        return this;\n    },\n    /**\n     * 基本设置\n     * @param  {Object|undefined} cfg 设置，为空则返回\n     * @return {Object}\n     */\n    config: function(cfg) {\n        if ($.isObject(cfg)) {\n\n            mix(defaultConfig, cfg);\n            return this;\n        }\n        return defaultConfig;\n    },\n    /**\n     * 判断path是否加载\n     * @param  {String} path 路径\n     * @return {Boolean}     是否加载完成\n     */\n    loaded: function(path) {\n        path = getPath(path)[0];\n        return _.status(path) === 'loaded';\n    },\n    /**\n     * 查询路径的加载状态\n     * @param  {String} path 查询的路径\n     * @return {String}      返回状态：pending|error|loaded|timeout\n     */\n    status: function(path) {\n        return mapLoaded[path];\n    },\n    /**\n     * 别名机制\n     * @param  {String} name 名字\n     * @param  {String} realpath  别名真实url\n     * @return {[type]}      [description]\n     */\n    alias: function(name, realpath) {\n        if (regAlias.test(name)) {\n            if ($.isUndefined(realpath)) {\n                return mapAlias[name];\n            }\n            mapAlias[name] = String(realpath).split(',');\n        } else if ($.isObject(name)) {\n            realpath = name.path;\n            name = name;\n            _.alias(name, realpath);\n        }\n    },\n    loadJS: loadJS,\n    loadCSS: loadCSS,\n    Promise: Promise,\n    isAMD: isAMD\n};\n\n/**\n * 销毁函数\n * @param  {[type]} obj [description]\n * @return {[type]}     [description]\n */\n\nfunction destroy(obj) {\n    for (var i in obj) {\n        if (obj.hasOwnProperty(i) && obj[i]) {\n            if ($.isArray(obj[i])) {\n                obj[i].length = 0;\n            }\n            if ($.isFunction(obj[i].destroy)) {\n                obj[i].destroy();\n            }\n            delete obj[i];\n        }\n    }\n}\n\n/**\n * 混合杂糅\n * @param  {Object} target 目标对象，以此为基础的对象\n * @param  {Object} source 来源对象\n * @param  {Boolean} ride  是否覆盖同名属性\n * @return {Object}        处理完的对象\n */\n\nfunction mix(target, source, ride) {\n    var args = arrSlice.call(arguments);\n    var i = 1;\n    var key;\n    //如果最后参数是布尔，判定是否覆写同名属性\n    ride = $.isBoolean(ride) ? ride : true;\n\n    while ((source = args[i++])) {\n        //source = [{a:1},{b:3}];\n        if ($.isArray(source)) {\n            for (var n = 0, len = source.length; n < len; n++) {\n                mix(target, source[n], ride);\n            }\n            continue;\n        }\n        //杂糅只允许对象\n        for (key in source) {\n            if (ride || !(key in target)) {\n                target[key] = source[key];\n            }\n        }\n    }\n    return target;\n}\n\n\n\nif ($.isUndefined(window.define)) {\n    window.define = _.define;\n}\nwindow.MixJS = mix(_, $);\n}(this));"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/package.json",
    "content": "{\n  \"name\": \"mix\",\n  \"title\": \"MixJS\",\n  \"description\": \"Just Another Javascript Module Loader\",\n  \"version\": \"0.3.0\",\n  \"author\": \"Theowang\",\n  \"email\": \"ksky521@gmail.com\",\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"https://github.com/ksky521/MixJS/blob/master/MIT-LICENSE.txt\"\n    }\n  ],\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.1\",\n    \"grunt-contrib-jshint\": \"~0.2.0\",\n    \"grunt-contrib-uglify\": \"~0.1.2\",\n    \"grunt-contrib\": \"~0.5.0\",\n    \"grunt-contrib-concat\": \"~0.1.3\",\n    \"grunt-contrib-watch\": \"~0.3.1\",\n    \"grunt-contrib-compress\": \"~0.5.0\"\n  }\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/research/js.php",
    "content": "<?php\n  header('Content-type: text/javascript; charset=utf-8');\n  sleep(2);\n?>\nif(typeof console!=='undefined'){\n    console.log && console.log('i am wake up');\n}\n"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/research/load-test.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Load Test</title>\n    <style>\n    .green{\n        color:green;\n    }\n    .red{\n        color:red;\n    }\n    .bold{\n        font-weight:bold;\n    }\n    </style>\n</head>\n<body>\n    <ul id=\"result\">\n        <li class=\"green\">-------------start--------------</li>\n    </ul>\n<script>\n    var dom = document.getElementById('result');\n    var head = document.getElementsByTagName('head')[0];\n    var jsin = false;\n    var cssin = false;\n    function loadJS(url, str) {\n        var js = document.createElement('script');\n        if(!jsin){\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onreadystatechange in jsdom:【<span class=\"red\">'+('onreadystatechange' in js)+'</span>】</li>';\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onerror in jsdom:【<span class=\"red\">'+('onerror' in js)+'</span>】</li>';\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onload in jsdom:【<span class=\"red\">'+('onload' in js)+'</span>】</li>';\n            jsin = true;\n        }\n        js.onreadystatechange = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> readystatechange:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.onload = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> load:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.onerror = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> error:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.src = url;\n        head.appendChild(js);\n    }\n    function loadCSS(url, str){\n        var link = document.createElement('link');\n        link.rel = 'stylesheet';\n        link.type = 'text/css';\n        if(!cssin){\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onerror in cssdom:【<span class=\"red\">'+('onerror' in link)+'</span>】</li>';\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onload in cssdom:【<span class=\"red\">'+('onload' in link)+'</span>】</li>';\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onreadystatechange in cssdom:【<span class=\"red\">'+('onreadystatechange' in link)+'</span>】</li>';\n            cssin = true;\n        }\n        \n        link.onreadystatechange = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> readystatechange:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '】</span>;' + str + '</li>';\n        }\n        link.onerror = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> error:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【' + e.type + '】;' + str + '</li>';\n        }\n        link.onload = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> load:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【' + e.type + '】;' + str + '</li>';\n        }\n\n        var img = new Image();\n        img.onerror = function(e){\n            e = e || {};\n            dom.innerHTML += '<li>=======img=======<span class=\"bold\"><span class=\"red\">css</span>:</span> new Image-error:【<span class=\"red\">' + e.type + '</span>】; ' + str + '</li>';\n        }\n        img.src = url;\n        var img2  = document.createElement('img');\n        img2.onerror = function(e){\n            e = e || {};\n            dom.innerHTML += '<li>=======img=======<span class=\"bold\"><span class=\"red\">css</span>:</span> createElement img-error:【<span class=\"red\">' + e.type + '</span>】; ' + str + '</li>';\n        }\n        img2.src = url;\n        link.href = url;\n        head.appendChild(link);\n    }\n    dom.innerHTML+='<li>Browser Info:'+window.navigator.userAgent+'</li>';\n    loadJS('http://code.jquery.com/jquery-1.9.1.js','200');\n    loadJS('http://code.jquery.com/121211212.js','404');\n    loadCSS('http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css','200');\n    loadCSS('http://code.jquery.com/121211212.css','404');\n</script>\n</body>\n</html>"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/research/loadjs.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>动态加载js状态测试</title>\n</head>\n<body>\n    <ul id=\"log\">\n        \n    </ul>\n    <button onclick=\"loadJS('js.php')\">加载js</button>\n    <button onclick=\"loadJS('js.php?t='+(+new Date()))\">加载不缓存的js</button>\n    <script>\n    var loadJS = function(url){\n        var js = document.createElement('script');\n        js.src = url;\n        js.onload = js.onreadystatechange = function(e){\n            e = e || {};\n            var li = document.createElement('li');\n            li.innerHTML = 'type:'+e.type+';readyState:'+js.readyState;\n            document.getElementById('log').appendChild(li);\n        }\n        var head = document.getElementsByTagName('head')[0];\n        head.appendChild(js);\n    }\n    \n    </script>\n</body>\n</html>"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/research/userAgent.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>判断UA</title>\n</head>\n<body>\n    <script>\nvar UA = window.navigator.userAgent;\nvar ua = UA.toLowerCase();\nvar browserRegExp = {\n    ie:/msie\\s*(\\d+(?:\\.\\d+)?)+/,\n    chrome:/chrome\\/(\\d+(?:\\.\\d+)?)+/,\n    firefox:/firefox\\/(\\d+(?:\\.\\d+)?)+/,\n    safari:/version\\/(\\d+(?:\\.\\d+)?)\\s*safari/,\n    opera:/opera[ |\\/](\\d+(?:\\.\\d+)?)/\n};\n$ = {};\n$.browser = 'unknow';\n$.browserVersion = 0;\n\nfunction checkUA(ua,browser,version){\n    ua = ua.toLowerCase();\n    for(var i in browserRegExp){\n        var match = browserRegExp[i].exec(ua);\n        if(match){\n            $.browser = i;\n            if(browser===i && version==match[1]){\n            }else{\n                console.log(browser+'|'+version+'|'+match[1]+':'+ua);\n            }\n\n            break;\n        }else{\n            // console.log(ua);\n        }\n    }\n}\nvar arr = [\n    ['chrome',19.0,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3'],\n    ['chrome',24.0,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14'],\n    ['chrome',15.0,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2'],\n    ['chrome',4.0,'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0'],\n    ['chrome',0.2,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13(KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13'],\n\n\n    ['safari',6.0,'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'],\n    ['safari',5.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'],\n    ['safari',5.1,'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3'],\n    ['safari',5.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; th-th) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8'],\n    ['safari',4.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-gb) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2'],\n    ['safari',4.0,'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7'],\n    ['safari',4.0,'Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc'],\n    ['safari',4.0,'Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16'],\n    ['safari',3.2,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3'],\n    ['safari',3.2,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1'],\n    ['safari',3.0,'Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/525+ (KHTML, like Gecko) Version/3.0.4 Safari/523.11'],\n    ['safari',2.0,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2'],\n    ['safari',1.3,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5_Adobe'],\n    ['safari',1.0,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5'],\n    ['firefox',23.0,'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0'],\n    ['firefox',16.0,'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1'],\n    ['firefox',6.0,'Mozilla/5.0 (Windows NT 5.0; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'],\n    ['firefox',6.0,'Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0 FirePHP/0.6'],\n    ['firefox',5.0,'Mozilla/5.0 (X11; Linux i686 on x86_64; rv:5.0a2) Gecko/20110524 Firefox/5.0a2'],\n    ['firefox',4.0,'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)'],\n    ['firefox',4.0,'Mozilla/5.0 (Windows NT 6.1; rv:1.9) Gecko/20100101 Firefox/4.0'],\n    ['firefox',3.5,'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.0 (.NET CLR 3.0.30618)'],\n    ['firefox',2.1,'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.15) Gecko/2009101601 Firefox 2.1 (.NET CLR 3.5.30729)'],\n    ['firefox',2.0,'Mozilla/5.0 (X11; U; SunOS sun4v; en-US; rv:1.8.1.3) Gecko/20070321 Firefox/2.0.0.3'],\n    ['firefox',1.6,'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9a1) Gecko/20060112 Firefox/1.6a1'],\n    ['firefox',1.0,'Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 (ax)'],\n    ['firefox',0.1,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.7.3) Gecko/20040913 Firefox/0.10'],\n    ['ie',10.6,'Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0'],\n    ['ie',10.0,'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'],\n    ['ie',9.0,'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))'],\n    ['ie',9.0,'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)'],\n    ['ie',8.0,'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; InfoPath.3; .NET4.0C; .NET4.0E) chromeframe/8.0.552.224'],\n    ['ie',7.0,'Mozilla/4.0(compatible; MSIE 7.0b; Windows NT 6.0)'],\n    ['ie',7.0,'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)'],\n    ['ie',6.0,'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'],\n    ['ie',6.1,'Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'],\n    ['opera',12.14,'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'],\n    ['opera',12.02,'Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02'],\n    ['opera',12.0,'Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0'],\n    ['opera',12.00,'Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00'],\n    ['opera',11.62,'Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62'],\n    ['opera',11.50,'Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50'],\n    ['opera',11.11,'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11'],\n    ['opera',11.11,'Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11'],\n    ['opera',11.10,'Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01'],\n    ['opera',11.00,'Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00'],\n    ['opera',11.00,'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; en) Opera 11.00'],\n    ['opera',10.70,'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.6.31 Version/10.70'],\n    ['opera',10.70,'Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70'],\n    ['opera',10.63,'Opera/9.80 (Windows NT 5.2; U; zh-cn) Presto/2.6.30 Version/10.63'],\n    ['opera',9.80,'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/886; U; en) Presto/2.4.15'],\n];\n\nfor(var i=0,len = arr.length;i<len;i++){\n    checkUA(arr[i][2],arr[i][0],arr[i][1]);\n}\n</script>\n</body>\n</html>"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/Module.js",
    "content": "/**\n * Module类\n * @param {String} id      moduleID\n * @param {Array} deps    依赖模块\n * @param {Function} factory 工厂函数\n * @param {Object} root    相对定义的root\n */\n\nfunction Module(id, deps, factory, root) {\n    if (arguments.length === 0) {\n        throw new Error('Module: I need a agrument');\n    }\n    if ($.isFunction(id)) {\n        factory = id;\n        id = undefined;\n        deps = emptyArr;\n    } else if ($.isArray(id)) {\n        deps = emptyArr;\n        id = undefined;\n    } else if ($.isFunction(deps)) {\n        factory = deps;\n        deps = emptyArr;\n    }\n    this.id = id ? getPath(id)[2] : id;\n    this.status = 'uninitialized';\n    if ($.isString(deps)) {\n        deps = deps.split(',');\n    }\n    this.dependencies = deps;\n    this.factory = factory;\n    this.root = root || _; //默认挂靠在window全局，使用_，默认挂靠到MixJS上\n    this.undef = []; //没有定义的模块\n    this.id && (mapDefined[this.id] = 'uninitialized');\n    this.checkDependencies(deps);\n    this.define();\n}\nModule.prototype = {\n    constructor: Module,\n    //定义\n    define: function() {\n        if (this.canDefine()) {\n            this.namespace();\n        } else if (this.status !== 'pending') {\n            this.status = 'pending';\n            this.id && (mapDefined[this.id] = this.status);\n            this.loadDeps();\n        }\n    },\n    //命名空间\n    namespace: function() {\n        var names = $.isString(this.id) ? this.id.split('/') : emptyArr;\n        var root = this.root;\n        var name, lastName;\n        while (name = names.shift()) {\n            lastName = name;\n            if (names.length) {\n                root = (root[name] = root[name] || {});\n            }\n        }\n        try {\n            var f = $.isFunction(this.factory) && this.factory.apply(window, this.getArgs());\n            if (f) {\n                f.amd = 'THEO'; //加个尾巴~\n                root[lastName] = f;\n                this.id && (mapDefined[this.id] = 'defined');\n            }\n        } catch (e) {\n            if (this.id) {\n                mapDefined[this.id] = 'error';\n            }\n            throw new Error('Module.namespace error:id=>' + this.id + ';undef=>' + this.undef.join(',') + ';info=>' + e.message);\n        }\n        //解决掉触发调用模块的promise\n        if (this.id && $.isArray(mapDeps2ModulePromise[this.id])) {\n            _.each(mapDeps2ModulePromise[this.id], function(v) {\n                if (isPromise(v)) {\n                    v.resolve();\n                }\n            });\n        }\n        this.destroy();\n    },\n    //根据模块名称，获取模块\n    getFn: function(names) {\n        names = names.split('/');\n        var root = this.root;\n        var name;\n        while (name = names.shift()) {\n            root = root[name];\n        }\n        return root;\n    },\n    //获取factory函数参数数组\n    getArgs: function() {\n        var arr = this.dependencies;\n        var v;\n        var fns = [this.root];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            v = arr[i];\n            fns.push(this.getFn(v));\n        }\n        return fns;\n    },\n    //判断是否符合转正标准\n    canDefine: function() {\n        var arr = this.undef;\n        var len = arr.length;\n        var temp;\n        while (len--) {\n            temp = arr[len];\n            if (!defined(temp)) {\n                if ((regIsCSS.test(temp) || regIsJS.test(temp)) && _.loaded(temp)) {\n                    continue;\n                }\n                return false;\n            }\n        }\n        return true;\n    },\n    //加载依赖\n    loadDeps: function() {\n        var self = this;\n        var promise;\n        var modules = self.undef;\n        _.each(modules, function(v) {\n            promise = new Promise();\n            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n            mapDeps2ModulePromise[v].push(promise.done(function() {\n                self.define();\n            }));\n            if (mapDefined[v] !== 'pending') {\n                var alias = _.alias(v);\n\n                if (alias && alias.length) {\n                    //如果存在alias\n                    var p = new Promise();\n\n                    p.done(function() {\n                        self.define()\n                    });\n                    //如果是普通js和css\n                    //不支持有依赖关系的alias模块类型的js\n                    var len = alias.length;\n                    var cb = function() {\n                        len--;\n                        if (len === 0) {\n                            mapDefined[v] = 'defined'; //标注alias被定义过了~\n                            p.resolve();\n                        }\n                    };\n                    _.each(alias, function(v) {\n                        if (regIsCSS.test(v)) {\n                            _.loadCSS(v, cb);\n                        } else if (regIsJS.test(v)) {\n                            _.loadJS(v, cb);\n                        } else {\n                            var tempPromise = new Promise();\n                            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n                            mapDeps2ModulePromise[v].push(tempPromise.done(cb));\n                            _.loadJS(v);\n                        }\n                    });\n                } else if (regIsCSS.test(v)) {\n                    //css文件\n                    _.loadCSS(v, function() {\n                        self.define();\n                    });\n                } else if (regIsJS.test(v)) {\n                    //js文件\n                    _.loadJS(v, function() {\n                        self.define();\n                    });\n                } else {\n                    //模块\n                    _.loadJS(v);\n                }\n            }\n        });\n    },\n    //首次检测依赖关系，对已经定义和未定义的模块进行分组\n    checkDependencies: function(deps) {\n        var self = this;\n        _.each(deps, function(v) {\n            v = getPath(v)[2];\n            if (!defined(v)) {\n                self.undef.push(v);\n            }\n        });\n    },\n    //销毁函数\n    destroy: function() {\n        destroy(this);\n    }\n};\n\n/**\n * 判断是否为amd模块\n * @param  {Object}  obj 要判断的对象\n * @return {Boolean}     判断结果\n */\n\nfunction isAMD(obj) {\n    return obj.amd === 'THEO';\n}\n\n/**\n * 判断一个module是否被定义过\n * @param  {String} moduleID 被检测的module对象id\n * @return {Boolean}        判断结果\n */\n\nfunction defined(moduleID) {\n    return mapDefined[moduleID] === 'defined';\n}"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/Promise.js",
    "content": "/**\n * Promise类\n */\n\nfunction Promise() {\n    this.status = 'unfulfilled'; //fulfilled|failed\n    this.fulfilledHandlers = [];\n    this.errorHandlers = [];\n    this.reason = '';\n}\nPromise.prototype = {\n    constructor: Promise,\n    reject: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'failed';\n        return this.fire(this.errorHandlers, arg);\n    },\n    isResolved: function() {\n        return this.status === 'fulfilled';\n    },\n    resolve: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'fulfilled';\n        return this.fire(this.fulfilledHandlers, arg);\n    },\n    fail: function(handler) {\n        return this.then(undefined, handler);\n    },\n    always: function(handler) {\n        return this.then(handler, handler);\n    },\n    then: function(fulfilledHandler, errorHandler) {\n        switch (this.status) {\n        case 'unfulfilled':\n            this.add(fulfilledHandler, 'fulfilled')\n                .add(errorHandler, 'error');\n            break;\n        case 'fulfilled':\n            this.fire(fulfilledHandler, this.reason);\n            break;\n        case 'failed':\n            this.fire(errorHandler, this.reason);\n        }\n        return this;\n    },\n    done: function(handler) {\n        return this.then(handler);\n    },\n    fire: function(fns, arg) {\n        if ($.isArray(fns)) {\n            var fn;\n            while (fn = fns.shift()) {\n                if ($.isFunction(fn)) {\n                    fn(arg);\n                }\n            }\n            this.clear();\n        } else if ($.isFunction(fns)) {\n            fns(arg);\n        }\n        return this;\n    },\n    add: function(handler, which) {\n        which = which + 'Handlers';\n        if ($.isFunction(handler) && this[which]) {\n            this[which].push(handler);\n        }\n        return this;\n    },\n    clear: function() {\n        this.fulfilledHandlers.length = 0;\n        this.errorHandlers.length = 0;\n    }\n};\n\n/**\n * 是否是Promise实例\n * @param  {Object}  o 被检验的对象\n * @return {Boolean}   是否为实例\n */\n\nfunction isPromise(o) {\n    return o instanceof Promise;\n}"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/browser.js",
    "content": "var UA = window.navigator.userAgent;\n"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/core.js",
    "content": "var _ = {\n    version: VERSION,\n    mix: mix,\n    indexOf: function(array, item, isSorted) {\n        if (array == null) {\n            return -1;\n        }\n        var i = 0;\n        var l = array.length;\n        if (isSorted) {\n            i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n        }\n        if (emptyArr.indexOf && array.indexOf === emptyArr.indexOf) {\n            return array.indexOf(item, isSorted);\n        }\n        for (; i < l; i++) {\n            if (array[i] === item) {\n                return i;\n            }\n        }\n        return -1;\n    },\n    /**\n     * 数组遍历\n     * @param  {Array}   arr      数组\n     * @param  {Function} callback 处理函数\n     * @param  {Object}   scope    处理上下文\n     */\n    each: emptyArr.forEach ? function(arr, callback, scope) {\n        emptyArr.forEach.call(arr, callback, scope);\n    } : function(arr, callback, scope) {\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (i in arr) {\n                callback.call(scope, arr[i], i, arr);\n            }\n        }\n    },\n    defined: defined,\n    define: function(mid, dependencies, factory) {\n        new Module(mid, dependencies, factory);\n        return this;\n    },\n    /**\n     * use方法\n     * @param  {Array}   mid      模块数组\n     * @param  {Function} callback 回调函数\n     * @return {Object}            返回promise对象\n     */\n    use: function(mid, callback) {\n        new Module(undefined, mid, callback);\n        return this;\n    },\n    /**\n     * 基本设置\n     * @param  {Object|undefined} cfg 设置，为空则返回\n     * @return {Object}\n     */\n    config: function(cfg) {\n        if ($.isObject(cfg)) {\n\n            mix(defaultConfig, cfg);\n            return this;\n        }\n        return defaultConfig;\n    },\n    /**\n     * 判断path是否加载\n     * @param  {String} path 路径\n     * @return {Boolean}     是否加载完成\n     */\n    loaded: function(path) {\n        path = getPath(path)[0];\n        return _.status(path) === 'loaded';\n    },\n    /**\n     * 查询路径的加载状态\n     * @param  {String} path 查询的路径\n     * @return {String}      返回状态：pending|error|loaded|timeout\n     */\n    status: function(path) {\n        return mapLoaded[path];\n    },\n    /**\n     * 别名机制\n     * @param  {String} name 名字\n     * @param  {String} realpath  别名真实url\n     * @return {[type]}      [description]\n     */\n    alias: function(name, realpath) {\n        if (regAlias.test(name)) {\n            if ($.isUndefined(realpath)) {\n                return mapAlias[name];\n            }\n            mapAlias[name] = String(realpath).split(',');\n        } else if ($.isObject(name)) {\n            realpath = name.path;\n            name = name;\n            _.alias(name, realpath);\n        }\n    },\n    loadJS: loadJS,\n    loadCSS: loadCSS,\n    Promise: Promise,\n    isAMD: isAMD\n};\n\n/**\n * 销毁函数\n * @param  {[type]} obj [description]\n * @return {[type]}     [description]\n */\n\nfunction destroy(obj) {\n    for (var i in obj) {\n        if (obj.hasOwnProperty(i) && obj[i]) {\n            if ($.isArray(obj[i])) {\n                obj[i].length = 0;\n            }\n            if ($.isFunction(obj[i].destroy)) {\n                obj[i].destroy();\n            }\n            delete obj[i];\n        }\n    }\n}\n\n/**\n * 混合杂糅\n * @param  {Object} target 目标对象，以此为基础的对象\n * @param  {Object} source 来源对象\n * @param  {Boolean} ride  是否覆盖同名属性\n * @return {Object}        处理完的对象\n */\n\nfunction mix(target, source, ride) {\n    var args = arrSlice.call(arguments);\n    var i = 1;\n    var key;\n    //如果最后参数是布尔，判定是否覆写同名属性\n    ride = $.isBoolean(ride) ? ride : true;\n\n    while ((source = args[i++])) {\n        //source = [{a:1},{b:3}];\n        if ($.isArray(source)) {\n            for (var n = 0, len = source.length; n < len; n++) {\n                mix(target, source[n], ride);\n            }\n            continue;\n        }\n        //杂糅只允许对象\n        for (key in source) {\n            if (ride || !(key in target)) {\n                target[key] = source[key];\n            }\n        }\n    }\n    return target;\n}\n\n\n\nif ($.isUndefined(window.define)) {\n    window.define = _.define;\n}\nwindow.MixJS = mix(_, $);"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/getCurrentScript.js",
    "content": "//本js文件不支持defer等属性，否则计算当前路径会错误\n//模块加载的东西，基础js肯定不能defer掉……\nvar curScriptNode = (function() {\n    var scripts = document.getElementsByTagName('script');\n    return scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n})();"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/getPath.js",
    "content": "/**\n * 获取真实url\n * 来自massframework\n * @param  {[type]} url [description]\n * @return {[type]}     [description]\n */\n\nfunction getPath(url, root) {\n    var ret = url;\n    var tmp;\n    var _2;\n    var alias = _.alias;\n    var id;\n    root = root || defaultConfig.baseURL;\n    root = root.substr(0, root.lastIndexOf('/'));\n    id = url; //模块id\n\n    if (regAlias.test(url) && alias[url]) {\n        ret = alias[url];\n\n    } else if (/^(\\w+)(\\d)?:.*/.test(url)) { //如果用户路径包含协议\n        ret = url;\n    } else {\n        tmp = url.charAt(0);\n        _2 = url.slice(0, 2);\n\n        if (tmp !== '.' && tmp !== '/') { //相对于根路径\n            ret = root + '/' + url;\n        } else if (_2 === './') { //相对于兄弟路径\n            id = url.substr(2);\n            ret = root + '/' + id;\n        } else if (_2 === '..') { //相对于父路径\n            // var arr = root.replace(/\\/$/, '').split('/');\n            var arr = root.split('/');\n            tmp = url.replace(/\\.\\.\\//g, function() {\n                arr.pop();\n                return '';\n            });\n            id = tmp;\n            ret = arr.join('/') + '/' + tmp;\n        }\n    }\n\n    var ext = 'js'; //默认是js文件\n    tmp = ret.replace(/[?#].*/, '');\n    if (/\\.(\\w+)$/.test(tmp)) {\n        ext = RegExp.$1;\n    }\n    if (ext !== 'css' && tmp === ret && !regIsJS.test(ret)) { //如果没有后缀名会补上.js\n        ret += '.js';\n    }\n    return [ret, ext, id];\n}"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/intro.js",
    "content": "(function(window, undefined) {\n'use strict';\nvar document = window.document;\nvar setTimeout = window.setTimeout;"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/loadcss-img.js",
    "content": "//放弃轮询方法，改用img的方法，对于不支持的古老级别浏览器自动屏蔽\n/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n    \n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n\n    \n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    //弱化css 错误处理，只有callback的时候才处理\n    if($.isFunction(callback)){\n        complete = $.isFunction(complete) ? complete : emptyFn;\n        var cb,err;\n        cb = function() {\n            if (!done) {\n                done = true;\n                link.onload = link.onerror = link.onreadystatechange = null;\n                mapLoaded[href] = 'loaded';\n                $.isFunction(callback) && callback();\n                complete('load');\n            }\n        }\n        if($.isFunction(fail)){\n            err = function() {\n                if (!done) {\n                    done = true;\n                    link.onload = link.onerror = link.onreadystatechange = null;\n                    mapLoaded[href] = 'error';\n                    fail();\n                    complete('error');\n                }\n            }\n        }\n\n        cssCallback(link, cb, err);\n        if (timeout) {\n            setTimeout(function() {\n                if (!done) {\n                    done = true;\n                    mapLoaded[href] = 'timeout';\n                    complete('timeout');\n                }\n            }, timeout);\n        }\n    }\n    \n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\n\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        if ($.isFunction(callback)) {\n            var img = new Image();\n            img.src = node.href;\n            img.error = callback;            \n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/loadcss.js",
    "content": "/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    var cb = function() {\n        if (!done) {\n            done = true;\n            link.onload = link.onerror = link.onreadystatechange = null;\n            mapLoaded[href] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    }\n    var err = function() {\n        done = true;\n        link.onload = link.onerror = link.onreadystatechange = null;\n        mapLoaded[href] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    }\n\n    cssCallback(link, cb, err);\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[href] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n//为了保证每个poll的重试次数为300\nvar pollTimers = {};\n///css load检测来自seajs\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        // Begin after node insertion\n        if ($.isFunction(callback)) {\n            //设置timer\n            pollTimers[node.href] = 0;\n            setTimeout(function() {\n                poll(node, callback);\n            }, 50);\n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n\nfunction poll(node, callback) {\n    var done = false;\n    var count = pollTimers[node.href]++;\n    if (count > 300) {\n        callback();\n        done = true;\n        return;\n    }\n    // for WebKit < 536\n    if (isOldWebKit) {\n        if (node.sheet) {\n            done = true;\n        }\n    }\n    // for Firefox < 9.0\n    else if (node.sheet) {\n        try {\n            if (node.sheet.cssRules) {\n                done = true;\n            }\n        } catch (ex) {\n            // The value of `ex.name` is changed from\n            // 'NS_ERROR_DOM_SECURITY_ERR' to 'SecurityError' since Firefox 13.0\n            // But Firefox is less than 9.0 in here, So it is ok to just rely on\n            // 'NS_ERROR_DOM_SECURITY_ERR'\n            if (ex.name === 'NS_ERROR_DOM_SECURITY_ERR') {\n                done = true;\n            }\n        }\n    }\n    setTimeout(function() {\n        if (done) {\n            // Place callback in here due to giving time for style rendering.\n            callback();\n        } else {\n            poll(node, callback);\n        }\n    }, 50)\n}"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/loadjs.js",
    "content": "/**\n * 加载js\n * @param  {String}   src      路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\nfunction loadJS(src, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(src)) {\n        callback = src.callback;\n        attrs = src.attrs;\n        timeout = src.timeout;\n        fail = src.fail;\n        complete = src.complete;\n        src = src.src;\n        return loadJS(src, callback, attrs, timeout, fail, complete);\n    }\n    var script = document.createElement('script');\n    var done = false;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            script.setAttribute(i, attrs[i]);\n        }\n    }\n    var urls = getPath(src);\n    src = script.src = urls[0];\n    script.async = true;\n    script.type = 'text/javascript';\n    script.charset = defaultConfig.charset;\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    script.onload = script.onreadystatechange = function(e) {\n        e = e || cleanObj\n        if (!done && (e.type === 'load' || /loaded|complete|undefined/.test(script.readyState))) {\n            done = true;\n            removeNode(script);\n            mapLoaded[src] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    };\n    script.onerror = function() {\n        done = true;\n        mapLoaded[src] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    };\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[src] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[src] = 'pending';\n    head.insertBefore(script, base);\n    return _;\n}\n/**\n * 移出node节点，释放内存\n * @param  {Element} node 节点\n */\nfunction removeNode(node) {\n    //确保执行一次+内存回收\n    node.onload = node.onerror = node.onreadystatechange = null;\n    if (node.parentNode) {\n        setTimeout(function() {\n            node.parentNode.removeChild(node);\n            node = null;\n        }, 0);\n    }\n}"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/outro.js",
    "content": "}(this));"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/typeof.js",
    "content": "//基本类型判断\n'Function,String,Array,Number'.replace(/[^, ]+/g, function(t) {\n    $['is' + t] = function(s) {\n        return isType(s, t);\n    }\n});\nif (typeof(/./) !== 'function') {\n    $.isFunction = function(obj) {\n        return typeof obj === 'function';\n    };\n}\n$.isObject = function(obj) {\n    return typeof obj === 'object';\n}\n\n$.isBoolean = function(obj) {\n    return obj === true || obj === false || isType(obj, 'Boolean');\n};\n\n$.isUndefined = function(obj) {\n    return obj === undefined;\n};\n\n/**\n * 获取类型\n * @param  {Object} obj 要判断的对象\n * @return {String}     返回类型\n */\n\nfunction isType(obj, type) {\n    return cleanObj.toString.call(obj).slice(8, -1) === type;\n}"
  },
  {
    "path": "ppt/node-generator-koa/js/mixjs/src/vars.js",
    "content": "var VERSION = 'MixJS 0.3 butterfly';\nvar emptyFn = function() {};\nvar cleanObj = {};\nvar emptyArr = [];\nvar head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;\nvar base = head.getElementsByTagName('base')[0] || null;\nvar arrSlice = emptyArr.slice;\n\n//获取当前文件父路径\nvar PATH = (function(node) {\n    var url = node.hasAttribute ? node.src : node.getAttribute('src', 4);\n    return url.substr(0, url.lastIndexOf('/')) + '/';\n})(curScriptNode);\n\n//是否为js\nvar regIsJS = /\\.js$/i;\n//是否为css\nvar regIsCSS = /\\.css$/i;\n//alias\nvar regAlias = /^[-\\w\\d_$]{2,}$/i;\nvar $ = {};\n\nvar defaultConfig = {\n    timeout: 2E4, //超时时间二十秒\n    baseURL: PATH,\n    charset: 'utf-8'\n};\n\n//=============>maps\n//别名列表\nvar mapAlias = {};\n//加载完的文件列表\nvar mapLoaded = {};\n//已经定义模块的状态表：undefined|pending|defined\nvar mapDefined = {};\n//通过依赖找上一级模块的promise\nvar mapDeps2ModulePromise = {};"
  },
  {
    "path": "ppt/node-generator-koa/js/nodeppt.control.js",
    "content": "/**\n * 控制端函数\n */\n(function($win, $doc, $B, Slide, loadJS, undefined) {\n    var $slides = Slide.$slides;\n    var doSlide = Slide.doSlide;\n\n    function doItem(id, itemID) {\n        itemID = itemID | 0;\n        var $curSlide = $slides[id];\n        var buildClass = '.build > *,.fadeIn > *,.moveIn > *,.bounceIn > *,.zoomIn > *,.fade > *';\n        var toBuild = $curSlide.querySelectorAll(buildClass);\n        var list;\n        var index = itemID;\n\n        while (itemID >= 0) {\n            list = toBuild.item(itemID).classList;\n            list.remove('to-build');\n            list.add(itemID === index ? 'building' : 'build-fade');\n            itemID--;\n        }\n    }\n\n    function getType(obj) {\n        return ({}).toString.call(obj).slice(8, -1)\n    }\n\n    var Control = {\n        state: 'unbind',\n        methods: {},\n        init: function() {\n            this.bindListener();\n        },\n        bindListener: function() {\n            var t = this;\n            //监听用户端发出的广播\n            $B.on('slide change ID', function(json) {\n                var slideID = json.slideID;\n                //发送请求\n                t.sendUpdate(slideID);\n\n            }).on('slide do build', function(json) {\n                var slideID = json.slideID;\n                var buildItem = json.build;\n                //发送请求\n                t.sendUpdateItem(slideID, buildItem);\n            }).on('slide event keyup', function(e) {\n                t.sendKeyEvent(e.keyCode);\n            }).on('overview', function(e) {\n                t.sendKeyEvent(79);\n            }).on('show paint', function(e){\n                t.sendKeyEvent(80);\n            }).on('remove paint', function(){\n                t.sendKeyEvent(67);\n            }).on('paint points', function(points) {\n                var data = {\n                    points: points,\n                    screen: {\n                        width: $doc.body.offsetWidth,\n                        height: $doc.body.offsetHeight\n                    }\n                };\n                t.send_('broadcast', ['paint points', data]);\n            })\n            //监听控制来的广播\n            .on('from control order', function(json) {\n                var fnName = json.fnName;\n                var args = json.args;\n                Slide.proxyFn(fnName, args);\n            }).on('from control update', function(json) {\n                doSlide(json.id, false);\n            }).on('from control updateItem', function(json) {\n                doSlide(json.id, false);\n                doItem(json.id, json.item);\n            }).on('from control key event', function(json) {\n                t.createKeyEvent_(json.keyCode);\n            })\n        },\n        createKeyEvent_: function(keyCode) {\n            var evt = document.createEvent('Event');\n            evt.initEvent('keyup', true, true);\n            evt.keyCode = keyCode;\n            evt.isFromControl = true;\n\n            document.dispatchEvent(evt);\n        },\n        send_: function(fnName, args) {\n            var methods = this.methods;\n            var method;\n            args = getType(args) === 'Array' ? args : [args];\n            for (var i in methods) {\n                method = methods[i];\n                method = method[fnName];\n                typeof method === 'function' && method.apply(Slide, args);\n            }\n        },\n        sendUpdate: function(slideID) {\n            this.send_('update', [slideID]);\n        },\n        sendUpdateItem: function(id, buildItem) {\n            this.send_('updateItem', [id, buildItem]);\n        },\n        sendKeyEvent: function(keycode) {\n            this.send_('keyEvent', [keycode]);\n        },\n\n        //添加一个新的监控\n        add: function(name, factory, override) {\n            var methods = this.methods;\n\n            if (override || !methods[name]) {\n                methods[name] = factory(Slide, $B);\n                //必须包括4个函数一个是监控翻页的update\n                //另外一个是updateItem\n                //一个是init\n                //keyEvent;\n            }\n        },\n        load: function(type, args) {\n            var url = Slide.dir + 'nodeppt.control.' + type + '.js';\n            loadJS(url, function() {\n                Slide.Control.methods[type].init(args);\n            });\n        }\n    };\n    Control.init();\n    Slide.Control = Control;\n}(window, document, MixJS.event.broadcast, Slide, MixJS.loadJS));\n"
  },
  {
    "path": "ppt/node-generator-koa/js/nodeppt.control.postMessage.js",
    "content": "/**\n * postMessage 只能单方面控制\n *\n */\nSlide.Control.add('postMessage', function(S, broadcast) {\n    function parseQuery(url) {\n        var back = {};\n        (url || location.search.substring(1)).split('&').forEach(function(v) {\n            v = v.split('=');\n            back[v[0].toLowerCase()] = v[1];\n        });\n        return back;\n    }\n\n    var postWin, popup, timer;\n    var postMSG = {\n        role: '', //角色\n        broadcast: function(evtName, data) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: evtName,\n                    data: data\n                }, '*');\n            }\n        },\n        update: function(id) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'update',\n                    id: id\n                }, '*');\n            }\n\n        },\n        updateItem: function(id, item) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'updateItem',\n                    id: id,\n                    item: item\n                }, '*');\n            }\n\n        },\n        keyEvent: function(keyCode) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'keyEvent',\n                    keyCode: keyCode\n                }, '*');\n            }\n        },\n        // evtControl: function(e) {\n        //     console.log('client 发来贺电', arguments);\n        // },\n        evtClient: function(e) {\n            var data = e.data;\n            switch (data.action) {\n                case 'update':\n                    broadcast.fire('from control update', data);\n                    break;\n                case 'updateItem':\n                    broadcast.fire('from control updateItem', data);\n                    break;\n                case 'keyEvent':\n                    broadcast.fire('from control key event', data);\n                    break;\n                case 'userOrder':\n                    var fnName = data.fn;\n                    var args = data.args;\n                    try {\n                        args = JSON.parse(args);\n                    } catch (e) {}\n                    Slide.proxyFn(fnName, args);\n                    break;\n                default:\n                    broadcast.fire('from control '+data.action, data.data);\n            }\n\n        },\n        closeClient: function() {\n            if (popup) {\n                popup.close();\n            }\n            timer && clearInterval(timer);\n        },\n        init: function(args) {\n            var t = this;\n            var params = parseQuery();\n\n            if (params._multiscreen === '1') {\n                this.role = 'client';\n                var url = location.href.replace('_multiscreen=1', '_multiscreen=control');\n\n                var sWidth = screen.width,\n                    sHeight = screen.height,\n                    tWidth = sWidth * 0.8,\n                    tHeight = sHeight * 0.8;\n\n                var temp = 'height=' + tHeight + ',width=' + tWidth + ',top=' + 10 + ',left=' + (sWidth - tWidth) / 2 + ',toolbar=no,menubar=no,location=yes,resizable=yes,scrollbars=no,status=no';\n                popup = window.open(url, 'ppt', temp);\n                window.addEventListener('message', this.evtClient, false);\n                window.addEventListener('beforeunload', this.closeClient, false);\n            } else if (params._multiscreen === 'control') {\n                this.role = 'control';\n                //如果是控制端，则重写proxyFn函数\n                Slide.proxyFn = function(fnName, args) {\n                    args = JSON.stringify(args);\n                    window.opener.postMessage({\n                        action: 'userOrder',\n                        fn: fnName,\n                        args: args\n                    }, '*');\n                }\n                var $body = document.body;\n                $body.classList.add('popup');\n                $body.classList.add('with-notes');\n                var $timer = document.createElement('time');\n                $timer.id = '_timer_';\n                $body.appendChild($timer);\n                var hour = 0,\n                    sec = 0,\n                    min = 0;\n                timer = setInterval(function() {\n                    sec++;\n                    if (sec === 60) {\n                        sec = 0;\n                        min++;\n                    }\n                    if (min === 60) {\n                        hour++;\n                    }\n                    $timer.innerHTML = ['时间：' + time2str(hour), time2str(min), time2str(sec) + ' 幻灯片：' + Slide.current + '/' + Slide.count].join(':');\n                }, 1000);\n                postWin = window.opener;\n            }\n        }\n    };\n\n    function time2str(time) {\n        time = '00' + time;\n        return time.substr(-2);\n    }\n    return postMSG;\n});\n"
  },
  {
    "path": "ppt/node-generator-koa/js/nodeppt.control.socket.js",
    "content": "var socketIOURL = '//' + location.host + '/socket.io/socket.io.js';\n\nSlide.Control.add('socket', function(S, broadcast) {\n    S.clientUID = 0;\n\n    function time2str(time) {\n        time = '00' + time;\n        return time.substr(-2);\n    }\n    var showQrcode;\n    var qrcodeLink = function() {\n        //按 q显示控制区域二维码\n        document.addEventListener('keydown', function(e) {\n            if (e.keyCode === 81) {\n                showQrcode(e);\n            }\n        }, true);\n        var $layer = document.createElement('div');\n        $layer.className = 'qrcode';\n        $layer.id = 'qrcodeBox';\n        $layer.innerHTML = '<div id=\"qrcode\"></div><p><a id=\"ctrlLink\" href=\"#\" target=\"_blank\">打开控制端</a></p>';\n        var $body = document.getElementsByTagName('body')[0];\n        $body.appendChild($layer);\n        var $container = document.getElementById('container');\n\n        showQrcode = function(e) {\n            if (showQrcode.isShow) {\n                // $container.style.display = 'block';\n                $layer.style.display = 'none';\n                showQrcode.isShow = false;\n            } else {\n                // $container.style.display = 'none';\n                $layer.style.display = 'block';\n                showQrcode.isShow = true;\n            }\n        };\n    };\n\n    var webSocket;\n\n    var Socket = {\n        host: '',\n        role: '', //角色\n        clientConnect: function() {\n            //角色是client，即被控制端，则连控制端服务器\n            webSocket.on('data from another client', function(data) {\n                var action = data.action;\n                switch (action) {\n                    case 'from control order':\n                        var fnName = data.fn;\n                        var args = data.args;\n                        try {\n                            args = JSON.parse(args);\n                        } catch (e) {}\n                        Slide.proxyFn(fnName, args);\n                        break;\n                    case 'from control updateItem':\n                    case 'from control update':\n                    case 'from control key event':\n                        broadcast.fire(action, data);\n                        break;\n                    default:\n                        broadcast.fire(action, data.data);\n                }\n            });\n\n        },\n        controlConnect: function() {\n            webSocket.emit('add client', {\n                targetUid: this.clientUID\n            });\n\n            //控制端不在直接运行函数，而是变成发送socket给client\n            //注意参数，进行了json处理哦~\n            Slide.proxyFn = function(fnName, args) {\n                args = JSON.stringify(args);\n                webSocket.emit('repost data', {\n                    action: 'from control order',\n                    fn: fnName,\n                    args: args\n                });\n            };\n            //角色是控制端，则连被控制端（client）服务器\n\n            webSocket.on('data from another client', function(data) {\n                var action = data.action;\n                if (action.indexOf('client') !== -1) {\n                    return;\n                }\n                action = action.replace('client', 'control');\n\n                broadcast.fire(action, data);\n\n                // switch (action) {\n                //     case 'from client update':\n                //         broadcast.fire('from control update', data);\n                //         break;\n                //     case 'from client updateItem':\n                //         broadcast.fire('from control updateItem', data);\n                //         break;\n                // }\n            });\n\n        },\n        connect: function() {\n            webSocket = io.connect(this.host);\n            webSocket.on('UUID', function(uid) {\n                webSocket.uid = uid;\n                if (Socket.role === 'client') {\n                    MixJS.loadJS('/js/qrcode.js', function() {\n                        qrcodeLink();\n                        var url = location.href.split('#')[0];\n                        url += (!~url.indexOf('?')) ? '?' : '&';\n                        url += 'iscontroller=1&clientid=' + uid;\n                        var qrcode = new QRCode('qrcode', {\n                            text: url,\n                            width: 256,\n                            height: 256\n                        });\n                        document.getElementById('ctrlLink').href = url;\n                    });\n                }\n            });\n            webSocket.on('system', function(data) {\n                // console.log(data);\n                if (showQrcode && showQrcode.isShow) {\n                    showQrcode();\n                }\n            });\n\n            this[this.role + 'Connect']();\n        },\n        broadcast: function(evtName, data) {\n            webSocket.emit('repost data', {\n                action: 'from control ' + evtName,\n                data: data\n            });\n        },\n        update: function(id) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' update',\n                id: id\n            });\n        },\n        updateItem: function(id, item) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' updateItem',\n                id: id,\n                item: item\n            });\n        },\n        keyEvent: function(keyCode) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' key event',\n                keyCode: keyCode\n            });\n        },\n\n        init: function(args) {\n            this.host = args.host || location.href;\n            this.clientUID = args.clientId;\n            // console.log(this.clientUID);\n            //角色，是否为控制端\n            if (args.isControl) {\n                console.log(this.clientUID);\n                this.role = 'control';\n                var $body = document.body;\n                $body.classList.add('popup');\n                $body.classList.add('with-notes');\n                var $timer = document.createElement('time');\n                $timer.id = '_timer_';\n                $body.appendChild($timer);\n                var hour = 0,\n                    sec = 0,\n                    min = 0;\n                timer = setInterval(function() {\n                    sec++;\n                    if (sec === 60) {\n                        sec = 0;\n                        min++;\n                    }\n                    if (min === 60) {\n                        hour++;\n                    }\n                    $timer.innerHTML = ['时间：' + time2str(hour), time2str(min), time2str(sec) + ' 幻灯片：' + Slide.current + '/' + Slide.count].join(':');\n                }, 1000);\n            } else {\n                this.role = 'client';\n            }\n            if (args.shake) {\n                //添加shake\n                MixJS.loadJS(Slide.dir + 'shake.js', function() {\n                    var lastTime = Date.now();\n                    window.addEventListener('shake', function() {\n                        var now = Date.now();\n                        if (now - lastTime > 3000) {\n                            lastTime = now;\n                            Slide.next();\n                        }\n                    }, true);\n\n                });\n            }\n\n            MixJS.loadJS(socketIOURL, function() {\n                Socket.connect();\n            });\n        }\n    };\n    return Socket;\n});\n"
  },
  {
    "path": "ppt/node-generator-koa/js/nodeppt.js",
    "content": "(function($win, $doc, $B, loadJS, loadCSS, undefined) {\n    //用于单页ppt预加载资源\n    var preloadFn = {\n        loadJS: loadJS,\n        loadCSS: loadCSS\n    };\n\n    var $body = $doc.body;\n    var emptyFn = function() {};\n    var emptyArr = [];\n\n    var touchDX = 0; //touch事件x数据\n    var touchDY = 0; //touch事件y数据\n    var touchStartX = 0;\n    var touchStartY = 0;\n    var ISSYNC = false;\n\n    var ctrlType = 'bind';\n    var doHash = true;\n    var lockSlide = false;\n    var slideWidth; //单页宽度\n    var slideHeight;\n    var curIndex = 0; //当前幻灯片索引\n    var pastIndex = 0; //上一个幻灯片索引\n    var $progress; //进度条\n    var $container; //幻灯片容器\n    var $slides; //幻灯片集合\n    var $drawBoard; //画板\n    var $slideTip;\n    var slideCount; //幻灯片总页数-1\n\n    //设置底部进度条\n\n    function setProgress() {\n        //添加dataset\n        Slide.current = curIndex + 1;\n        if ($progress) {\n            $progress.style.width = ((curIndex + 1) / (slideCount + 1)) * 100 + '%';\n        }\n    }\n\n    //泛数组转换为数组\n\n    function toArray(arrayLike) {\n            return emptyArr.slice.call(arrayLike);\n        }\n        //封装选择器\n\n    function $(selector, context) {\n            context = (context && context.nodeType === 1) ? context : $doc;\n            return context.querySelectorAll(selector);\n        }\n        //getID方法\n\n    function $$(id) {\n        return $doc.getElementById(id);\n    }\n\n\n    //上一页\n    function prevSlide() {\n\n            slideOutCallBack($slides[curIndex]);\n            pastIndex = curIndex;\n            --curIndex < 0 && (curIndex = 0);\n            doSlide();\n        }\n        //下一页\n    function nextSlide() {\n            if (buildNextItem()) {\n                // $B.fire('slide change ID',{\n                //    slideID:curIndex\n                // })\n                return;\n            }\n            slideOutCallBack($slides[curIndex]);\n            pastIndex = curIndex;\n            ++curIndex > slideCount && (curIndex = slideCount);\n            doSlide();\n            preload($slides[curIndex])($slides[curIndex + 1]);\n        }\n        //slide切入回调incallback\n        //<slide data-incallback=\"\"\n    var slideInTimer;\n\n    function slideInCallBack() {\n        if (slideInTimer) {\n            clearTimeout(slideInTimer);\n        }\n        slideInTimer = setTimeout(slideInCallBack_, 1500);\n\n    }\n\n    function slideInCallBack_() {\n            var $cur = $slides[curIndex];\n            if (!$cur || ($cur && $cur.nodeType !== 1)) {\n                return;\n            }\n            var cb = $cur.dataset.incallback;\n            //如果有data-incallback那么就执行callback\n            cb && typeof $win[cb] === 'function' && proxyFn(cb);\n            //检测iframe\n            var $iframe = toArray($('iframe[data-src]', $cur));\n            if ($iframe.length) {\n                $iframe.forEach(function(v) {\n                    var src = v.dataset.src;\n                    v.src = src;\n                });\n\n            }\n        }\n        //slide切出回调outcallback\n        //<slide data-outcallback=\"\"\n    var slideOutTimer;\n\n    function slideOutCallBack(prev) {\n        if (!prev || (prev && prev.nodeType !== 1)) {\n            return;\n        }\n        if (slideOutTimer) {\n            clearTimeout(slideOutTimer);\n        }\n        slideOutTimer = setTimeout(function() {\n            slideOutCallBack_(prev);\n        }, 1500);\n    }\n\n    function slideOutCallBack_(prev) {\n        var cb = prev.dataset.outcallback;\n        //如果有data-outcallback那么就执行callback\n        cb && typeof $win[cb] === 'function' && proxyFn(cb);\n    }\n\n    //预加载资源\n    //<preload data-type=\"js||css\" data-url=\"\">\n\n    function preload(node) {\n            var self = arguments.callee;\n            if (node && node.nodeType === 1) {\n                var $preload = $('preload', node),\n                    len = $preload.length;\n                while (len--) {\n                    var tmpNode = $preload[len],\n                        dataset = tmpNode.dataset,\n                        type = dataset.type,\n                        url = dataset.url;\n                    var fn = preloadFn['load' + type.toUpperCase()];\n                    typeof fn === 'function' && fn(url, function(tmpNode) {\n                        return function() {\n                            //将该标签删除，释放内存\n                            tmpNode.parentNode && tmpNode.parentNode.removeChild(tmpNode);\n                            tmpNode = null;\n                        };\n                    }(tmpNode));\n                }\n            }\n            return self;\n        }\n        //单行前进\n\n    function buildNextItem() {\n        if ($body.classList.contains('overview')) {\n            return false;\n        }\n        $curSlide = $slides[curIndex];\n        var builded = toArray($('.building'), $curSlide);\n        var list;\n        if (builded.length) {\n\n            while (list = builded.shift()) {\n                list = list.classList\n                list.remove('building');\n                list.add('build-fade');\n            }\n        }\n        var toBuild = $('.to-build', $curSlide);\n\n        if (!toBuild.length) {\n            return false;\n        }\n\n        var item = toBuild.item(0);\n        $B.fire('slide do build', {\n            slideID: curIndex,\n            build: item.dataset.index\n        })\n        list = item.classList;\n        $B.fire('slide.update',curIndex|0, item.dataset.index|0+1);\n        list.remove('to-build');\n        list.add('building');\n\n        return true;\n    }\n\n    //设置单行页面添加\n\n    function makeBuildLists() {\n        var i = slideCount;\n        var slide;\n        var transition = defaultOptions.transition;\n        var buildClass = '.build > *,.fadeIn > *,.moveIn > *,.bounceIn > *,.zoomIn > *,.fade > *';\n        while (slide = $slides[i--]) {\n            var items = $(buildClass, slide);\n            var dataset = slide.dataset;\n            for (var j = 0, item; item = items[j]; j++) {\n                var t = item.classList\n                if (t) {\n                    t.add('to-build');\n                    item.dataset.index = j;\n                }\n            }\n            if (!dataset.transition) {\n                dataset.transition = transition;\n            }\n        }\n\n    }\n\n    //切换动画\n\n    function doSlide(slideID, isSync) {\n        ISSYNC = typeof isSync === 'boolean' ? isSync : true;\n        slideID = slideID === undefined ? curIndex : (slideID | 0);\n        curIndex = slideID;\n\n        // $container.style.marginLeft = -(slideID * slideWidth) + 'px';\n        updateSlideClass();\n        setProgress();\n        //发布slide切换状态广播\n        ISSYNC && $B.fire('slide change ID', {\n            slideID: slideID\n        });\n        if (doHash) {\n            lockSlide = true;\n            $win.location.hash = \"#\" + slideID;\n        }\n        slideInCallBack();\n        removePaint();\n\n        if ($doc.body.classList.contains('overview')) {\n            focusOverview_();\n            return;\n        }else if(!$doc.body.classList.contains('popup')){\n            $doc.body.classList.remove('with-notes');\n        }\n\n    }\n\n    function updateSlideClass() {\n        var curSlide = curIndex;\n        var pageClass = 'pagedown';\n        if (pastIndex === curIndex) {\n            $cur = $slides[curIndex];\n            if ($cur.classList.contains('pageup')) {\n                return;\n            }\n        }\n        if (pastIndex > curIndex) {\n            //往前翻页\n            pageClass = 'pageup';\n        } else {\n            //往后翻页\n        }\n        for (var i = 0, len = $slides.length; i < len; ++i) {\n            switch (i) {\n                case curSlide - 2:\n                    updateSlideClass_(i, 'far-past', pageClass);\n                    break;\n                case curSlide - 1:\n                    updateSlideClass_(i, 'past', pageClass);\n                    break;\n                case curSlide:\n                    updateSlideClass_(i, 'current', pageClass);\n                    break;\n                case curSlide + 1:\n                    updateSlideClass_(i, 'next', pageClass);\n                    break;\n                case curSlide + 2:\n                    updateSlideClass_(i, 'far-next', pageClass);\n                    break;\n                default:\n                    updateSlideClass_(i);\n                    break;\n            }\n        }\n        $B.fire('slide.update', curIndex,0, pageClass);\n\n    }\n\n    function overview(isFromControl) {\n        $body.classList.toggle('overview');\n        focusOverview_();\n        if (!isFromControl) {\n            $B.fire('overview');\n        }\n    }\n\n    function focusOverview_() {\n        var isOV = $doc.body.classList.contains('overview');\n        for (var i = 0, slide; slide = $slides[i]; i++) {\n            slide.style.transform = slide.style.webkitTransform = slide.style.msTransform = slide.style.mozTransform = isOV ?\n                'translateZ(-2500px) translate(' + ((i - curIndex) * 105) +\n                '%, 0%)' : '';\n            slide.style.animation = slide.style.webkitAnimation = slide.style.msAnimation = slide.style.mozAnimation = isOV ?\n                'none' : '';\n        }\n    }\n\n    function updateSlideClass_(slideNo, className, pageClass) {\n        var el = $slides[slideNo];\n\n        if (!el) {\n            return;\n        }\n        if (className) {\n            el.classList.add(className);\n        }\n        if (pageClass && location.href.indexOf('_multiscreen=control') === -1 && location.href.indexOf('iscontroller=1') === -1) {\n            el.classList.add(pageClass);\n        }\n\n        var arr = ['next', 'past', 'far-next', 'far-past', 'current', 'pagedown', 'pageup'];\n        arr.forEach(function(v) {\n            if (className !== v && pageClass !== v) {\n                el.classList.remove(v);\n            }\n        });\n\n    }\n\n    //显示tips\n\n    function showTips(msg) {\n        if (!$slideTip) {\n            return;\n        }\n        $slideTip.innerHTML = msg;\n        $slideTip.style.display = 'block';\n        setTimeout(function() {\n            $slideTip.style.display = 'none';\n        }, 3E3);\n    }\n\n\n    /*************************events***************/\n\n    //pc键盘翻页事件逻辑\n\n    function evtDocUp(e) {\n            var key = e.keyCode;\n            var target = e.target;\n            //防止input和textarea，和可以编辑tag\n            if (/^(input|textarea)$/i.test(target.nodeName) || target.isContentEditable) {\n                return;\n            }\n            if (!e.isFromControl) {\n                switch (key) {\n                    case 13:\n                    case 72:\n                    case 87:\n                    case 79:\n                    case 78:\n                    case 80:\n                    case 67:\n                        $B.fire('slide event keyup', e);\n                        break;\n                }\n            }\n            switch (key) {\n                case 13:\n                    // Enter\n                    if ($doc.body.classList.contains('overview')) {\n                        overview(e.isFromControl);\n                    }\n\n                    break;\n                case 72:\n                    // H: Toggle code highlighting\n                    $doc.body.classList.toggle('highlight-code');\n                    setTimeout(function() {\n                        $doc.body.classList.toggle('highlight-code');\n                    }, 2000);\n                    break;\n                    // 下掉宽屏模式，默认width：100%\n                case 87:\n                    // W: Toggle widescreen\n                    // Only respect 'w' on body. Don't want to capture keys from an <input>.\n                    if (!(e.shiftKey && e.metaKey)) {\n                        if (!$body.classList.contains('popup'))\n                            $container.classList.toggle('layout-widescreen');\n                    }\n                    break;\n                case 79:\n                    // O: Toggle overview\n                    overview(e.isFromControl);\n\n                    break;\n                case 78:\n                    // N\n                    if (!$body.classList.contains('popup'))\n                        $doc.body.classList.toggle('with-notes');\n                    break;\n                case 80:\n                    //P\n                    if (!$body.classList.contains('popup')) {\n                        showPaint(e.isFromControl);\n                    }\n                    break;\n                case 67:\n                    //c\n                    if (!$body.classList.contains('popup')) {\n                        removePaint(e.isFromControl);\n                    }\n                    break;\n                    //上一页\n                case 33:\n                    // pg up\n                case 37:\n                    // left\n                case 38:\n                    // up\n                    prevSlide();\n                    break;\n                    //下一页\n                    // case 9:\n                    // tab\n                case 32:\n                    // space\n                case 34:\n                    // pg down\n                case 39:\n                    // right\n                case 40:\n                    // down\n                    nextSlide()\n                    break;\n            }\n\n            //        $container.style.marginLeft = -(curIndex * slideWidth) + 'px';\n            //        setProgress();\n            //        setHistory();\n        }\n        /******************************** Touch events *********************/\n    var isStopTouchEvent = false;\n\n    function evtTouchStart(event) {\n            if (!isStopTouchEvent && event.touches.length === 1) {\n                touchDX = 0;\n                touchDY = 0;\n                var touch = event.touches[0];\n                touchStartX = touch.pageX;\n                touchStartY = touch.pageY;\n                //捕获，尽早发现事件\n                $body.addEventListener('touchmove', evtTouchMove, true);\n                $body.addEventListener('touchend', evtTouchEnd, true);\n            }\n        }\n        //touch事件\n\n    function evtTouchMove(event) {\n            if (event.touches.length > 1) {\n                cancelTouch();\n            } else {\n                var touch = event.touches[0];\n\n                touchDX = touch.pageX - touchStartX;\n                touchDY = touch.pageY - touchStartY;\n            }\n            event.preventDefault();\n\n        }\n        //touchend事件\n\n    function evtTouchEnd(event) {\n            var dx = Math.abs(touchDX);\n            var dy = Math.abs(touchDY);\n\n            if ((dx > 15) && (dy < (dx * 2 / 3))) {\n                if (touchDX > 0) {\n                    prevSlide();\n                } else {\n                    nextSlide();\n                }\n            }\n            cancelTouch();\n        }\n        //取消绑定\n\n    function cancelTouch() {\n            $body.removeEventListener('touchmove', evtTouchMove, true);\n            $body.removeEventListener('touchend', evtTouchEnd, true);\n        }\n        //绑定事件\n\n    function bindEvent() {\n        $doc.addEventListener('keyup', evtDocUp, false);\n        $body.addEventListener('touchstart', evtTouchStart, false);\n        $$('_btn-bar').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n                if (!isOpen) {\n                    this.classList.remove('fa-bars');\n                    this.classList.add('fa-close');\n                    $$('_btn-box').style.display = 'inline-block';\n                } else {\n                    this.classList.remove('fa-close');\n                    this.classList.add('fa-bars');\n                    $$('_btn-box').style.display = 'none';\n\n                }\n                isOpen = !isOpen;\n            };\n        }(), false);\n        $$('_btn-prev').addEventListener('click', prevSlide, false);\n        $$('_btn-next').addEventListener('click', nextSlide, false);\n        $$('_btn-overview').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n\n                if (isOpen) {\n                    this.classList.add('fa-compress');\n                    this.classList.remove('fa-expand');\n                } else {\n                    this.classList.add('fa-expand');\n                    this.classList.remove('fa-compress');\n                }\n\n                overview();\n                isOpen = !isOpen;\n            };\n        }(), false);\n        $$('_btn-brush').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n                if (isOpen) {\n                    this.classList.add('fa-paint-brush');\n                    this.classList.remove('fa-eraser');\n                    removePaint();\n                } else {\n                    showPaint();\n                    this.classList.add('fa-eraser');\n                    this.classList.remove('fa-paint-brush');\n                }\n                isOpen = !isOpen;\n            }\n        }(), false);\n\n        $win.addEventListener('hashchange', function() {\n            if (location.hash && !lockSlide) {\n                doHash = false;\n                slideOutCallBack($slides[curIndex]);\n                pastIndex = curIndex;\n                curIndex = location.hash.substr(1) | 0;\n\n                doSlide();\n                doHash = true;\n            }\n            lockSlide = false;\n        }, true);\n    }\n\n\n    /***********画图部分事件处理函数************/\n    //画图前准备\n\n    function drawCanvasReady() {\n            $drawBoard.context = $drawBoard.getContext('2d');\n            var context = $drawBoard.context;\n            context.lineWidth = 3;\n            context.lineCap = 'round';\n            context.strokeStyle = \"red\";\n        }\n        //显示画板\n    var isControl = 0;\n\n    function showPaint(isFromControl) {\n            if (!$drawBoard) {\n                return;\n            }\n\n            //1、将翻页停止\n            isStopTouchEvent = true;\n            //2、将管理模式去掉\n            if ($body.classList.contains('with-notes')) {\n                isControl = 1;\n                $body.classList.remove('with-notes');\n                $body.classList.remove('popup');\n            }\n            $drawBoard.width = $body.clientWidth;\n            $drawBoard.height = $body.clientHeight;\n            drawCanvasReady();\n\n            $drawBoard.style.display = '';\n            $container.style.overflow = 'hidden';\n\n            $drawBoard.addEventListener('mousedown', pMouseDown, true);\n            $drawBoard.addEventListener('mouseup', pMouseUp, true);\n            $drawBoard.addEventListener('mousemove', pMouseMove, true);\n            //滑动\n            $drawBoard.addEventListener('touchmove', pMouseMove, true);\n            $drawBoard.addEventListener('touchend', pMouseUp, true);\n            $drawBoard.addEventListener('touchcancel', pMouseUp, true);\n            $drawBoard.addEventListener('touchstart', pMouseDown, true);\n\n            $doc.addEventListener('selectstart', stopSelect, true);\n            if (!isFromControl) {\n                $B.fire('show paint');\n            }\n        }\n        //禁止选中\n\n    function stopSelect() {\n            return false;\n        }\n        //清除画板内容\n\n    function clearPaint() {\n            $container.style.overflow = '';\n            $drawBoard.context && $drawBoard.context.clearRect(0, 0, slideWidth, slideHeight);\n            $drawBoard.style.display = 'none';\n        }\n        //删除画板\n    var removePaint = function(isFromControl) {\n        clearPaint();\n        if (isControl) {\n            $body.classList.add('with-notes');\n            $body.classList.add('popup');\n        }\n        isStopTouchEvent = false;\n        $drawBoard.removeEventListener('mousedown', pMouseDown);\n        $drawBoard.removeEventListener('mouseup', pMouseUp);\n        $drawBoard.removeEventListener('mousemove', pMouseMove);\n        //滑动\n        $drawBoard.removeEventListener('touchstart', pMouseDown);\n        $drawBoard.removeEventListener('touchmove', pMouseMove);\n        $drawBoard.removeEventListener('touchend', pMouseUp);\n        $drawBoard.removeEventListener('touchcancel', pMouseUp);\n\n\n        $doc.removeEventListener('selectstart', stopSelect, true);\n        if (!isFromControl) {\n            $B.fire('remove paint');\n        }\n    };\n    var pMouseDown = function(e) {\n        $drawBoard.isMouseDown = true;\n        //        $drawBoard.iLastX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);\n        //        $drawBoard.iLastY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);\n        var x = $drawBoard.iLastX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));\n        var y = $drawBoard.iLastY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));\n        pPoints.push({\n            x: x,\n            y: y\n        });\n    };\n    var pPoints = [];\n    var pMouseUp = function(e) {\n        $drawBoard.isMouseDown = false;\n        $drawBoard.iLastX = -1;\n        $drawBoard.iLastY = -1;\n        if (!e.isFromControl) {\n            $B.fire('paint points', pPoints);\n        }\n        pPoints.length = 0;\n    };\n    $B.on('from control paint points', function(data) {\n        // console.log(data);\n        var points = data.points;\n        //远程来的屏幕\n        var wh = data.screen;\n        var tOX = wh.width / 2,\n            tOY = wh.height / 2;\n\n        var width = $body.offsetWidth;\n        var height = $body.offsetHeight;\n        var cOX = width / 2,\n            cOY = height / 2;\n\n        var iw = width / wh.width;\n        var ih = height / wh.height;\n\n        var context = $drawBoard.context;\n        context.beginPath();\n        var startX = cOX - (tOX - points[0].x) * iw;\n        var startY = cOY - (tOY - points[0].y) * ih;\n        // console.log(startX, points[0].x, startY, iw, wh);\n        context.moveTo(startX, startY);\n        for (var i = 0, len = points.length; i < len; i++) {\n            context.lineTo(cOX - (tOX - points[i].x) * iw, cOY - (tOY - points[i].y) * ih);\n        }\n        context.stroke();\n    });\n    var pMouseMove = function(e) {\n        if ($drawBoard.isMouseDown) {\n            //            var iX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);\n            //            var iY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);\n            var iX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));\n            var iY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));\n            var context = $drawBoard.context;\n            context.beginPath();\n            context.moveTo($drawBoard.iLastX, $drawBoard.iLastY);\n            context.lineTo(iX, iY);\n            context.stroke();\n            $drawBoard.iLastX = iX;\n            $drawBoard.iLastY = iY;\n            pPoints.push({\n                x: iX,\n                y: iY\n            });\n            e.preventDefault();\n        }\n    };\n    //代理函数，用于函数控制\n\n    function proxyFn(fnName, args) {\n        $win[fnName](args);\n    }\n\n    /**\n     * 默认配置\n     * @type {Object}\n     */\n    var defaultOptions = {\n        containerID: 'container',\n        isControlDevice: false,\n        drawBoardID: 'drawBoard',\n        slideClass: '.slide',\n        buildClass: '.build',\n        progressID: 'progress',\n        transition: '',\n        tipID: 'tip',\n        webSocketHost: '',\n        width: 900,\n        dir: './',\n        height: 700,\n        control: false\n    };\n\n    //初始化变量\n\n    function initVar() {\n\n        $slideTip = $$(defaultOptions.tipID);\n        $container = $$(defaultOptions.containerID);\n        slideWidth = defaultOptions.width;\n        slideHeight = defaultOptions.height;\n        $progress = $$(defaultOptions.progressID);\n        Slide.$slides = $slides = toArray($(defaultOptions.slideClass, $container));\n\n\n\n        slideCount = $slides.length; //幻灯片总页数-1\n        Slide.count = slideCount;\n\n        // $container.style.width = slideCount*slideWidth + 'px';//设置容器总宽度\n        slideCount--;\n        $drawBoard = $$(defaultOptions.drawBoardID);\n        if ($drawBoard) {\n            $drawBoard.style.display = 'none';\n        }\n    }\n\n    function fullImg() {\n\n            loadJS(defaultOptions.dir + 'img.screenfull.js', function() {\n                //图片处理\n                var $imgs = toArray($(defaultOptions.slideClass + ' img', $container));\n                screenfull($imgs);\n            });\n        }\n        //初始化\n\n    function init(options) {\n        options = options || {};\n\n        for (var key in defaultOptions) {\n            if (!!(key in options)) {\n                defaultOptions[key] = options[key];\n            }\n        }\n        Slide.dir = defaultOptions.dir;\n        if (defaultOptions.control) {\n            var control = defaultOptions.control;\n            loadJS(defaultOptions.dir + 'nodeppt.control.js', function() {\n                Slide.Control.load(control.type, control.args);\n            });\n        }\n\n\n        initVar(); //初始化变量\n        makeBuildLists();\n        fullImg(); //图片全屏\n        bindEvent();\n        pastIndex = curIndex;\n        if (location.hash && (curIndex = (location.hash.substr(1) | 0))) {\n            doSlide();\n        } else {\n            updateSlideClass();\n            setProgress();\n            slideInCallBack();\n        }\n        preload($slides[curIndex])($slides[curIndex + 1]);\n        $body.style.opacity = 1;\n    }\n    var Slide = {\n        init: init,\n        next: nextSlide,\n        prev: prevSlide,\n        doSlide: doSlide,\n        proxyFn: proxyFn,\n        showPaint: showPaint,\n        removePaint: removePaint\n    };\n    ['on', 'un', 'fire'].forEach(function(v) {\n        Slide[v] = function() {\n            var args = toArray(arguments);\n            args[0] = 'slide.' + args[0];\n            $B[v].apply(null, args);\n        }\n    });\n\n    $win.Slide = Slide;\n\n}(window, document, MixJS.event.broadcast, MixJS.loadJS, MixJS.loadCSS));\n"
  },
  {
    "path": "ppt/node-generator-koa/js/prettify.js",
    "content": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:\"0\"<=b&&b<=\"7\"?parseInt(a.substring(1),8):b===\"u\"||b===\"x\"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?\"\\\\x0\":\"\\\\x\")+a.toString(16);a=String.fromCharCode(a);if(a===\"\\\\\"||a===\"-\"||a===\"[\"||a===\"]\")a=\"\\\\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\S\\s]|[^\\\\]/g),a=\n[],b=[],o=f[0]===\"^\",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&\"-\"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=[\"[\"];o&&b.push(\"^\");b.push.apply(b,a);for(c=0;c<\nf.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push(\"-\"),b.push(e(i[1])));b.push(\"]\");return b.join(\"\")}function y(a){for(var f=a.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j===\"(\"?++i:\"\\\\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j===\"(\"?(++i,d[i]===void 0&&(f[c]=\"(?:\")):\"\\\\\"===j.charAt(0)&&\n(j=+j.substring(1))&&j<=i&&(f[c]=\"\\\\\"+d[i]);for(i=c=0;c<b;++c)\"^\"===f[c]&&\"^\"!==f[c+1]&&(f[c]=\"\");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a===\"[\"?f[c]=h(j):a!==\"\\\\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return f.join(\"\")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\\\u[\\da-f]{4}|\\\\x[\\da-f]{2}|\\\\[^UXux]/gi,\"\"))){s=!0;l=!1;break}}for(var r=\n{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(\"\"+g);n.push(\"(?:\"+y(g)+\")\")}return RegExp(n.join(\"|\"),l?\"gi\":\"g\")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if(\"BR\"===g||\"LI\"===g)h[s]=\"\\n\",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\\r\\n?/g,\"\\n\"):g.replace(/[\\t\\n\\r ]+/g,\" \"),h[s]=g,t[s<<1]=y,y+=g.length,\nt[s++<<1|1]=a)}}var e=/(?:^|\\s)nocode(?:\\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);m(a);return{a:h.join(\"\").replace(/\\n$/,\"\"),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,\"pln\"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===\n\"string\")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b=\"pln\")}if((c=b.length>=5&&\"lang-\"===b.substring(0,5))&&!(o&&typeof o[1]===\"string\"))c=!1,b=\"src\";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),\nl=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=\"\"+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\\S\\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push([\"str\",/^(?:'''(?:[^'\\\\]|\\\\[\\S\\s]|''?(?=[^']))*(?:'''|$)|\"\"\"(?:[^\"\\\\]|\\\\[\\S\\s]|\"\"?(?=[^\"]))*(?:\"\"\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$))/,q,\"'\\\"\"]):a.multiLineStrings?m.push([\"str\",/^(?:'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,\nq,\"'\\\"`\"]):m.push([\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*(?:'|$)|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,q,\"\\\"'\"]);a.verbatimStrings&&e.push([\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,\"#\"]):m.push([\"com\",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,q,\"#\"]),e.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,q])):m.push([\"com\",/^#[^\\n\\r]*/,\nq,\"#\"]));a.cStyleComments&&(e.push([\"com\",/^\\/\\/[^\\n\\r]*/,q]),e.push([\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,q]));a.regexLiterals&&e.push([\"lang-regex\",/^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)/]);(h=a.types)&&e.push([\"typ\",h]);a=(\"\"+a.keywords).replace(/^ | $/g,\n\"\");a.length&&e.push([\"kwd\",RegExp(\"^(?:\"+a.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),q]);m.push([\"pln\",/^\\s+/,q,\" \\r\\n\\t\\xa0\"]);e.push([\"lit\",/^@[$_a-z][\\w$@]*/i,q],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,q],[\"pln\",/^[$_a-z][\\w$@]*/i,q],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,q,\"0123456789\"],[\"pln\",/^\\\\[\\S\\s]?/,q],[\"pun\",/^.[^\\s\\w\"-$'./@\\\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if(\"BR\"===a.nodeName)h(a),\na.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}\nfor(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\\s)nocode(?:\\s|$)/,t=/\\r\\n?|\\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);for(l=s.createElement(\"LI\");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute(\"value\",\nm);var r=s.createElement(\"OL\");r.className=\"linenums\";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className=\"L\"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode(\"\\xa0\")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn(\"cannot override language handler %s\",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\\s*</.test(m)?\"default-markup\":\"default-code\";return A[a]}function E(a){var m=\na.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\\bMSIE\\b/.test(navigator.userAgent),m=/\\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,\"\\r\"));i.nodeValue=\nj;var u=i.ownerDocument,v=u.createElement(\"SPAN\");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){\"console\"in window&&console.log(w&&w.stack?w.stack:w)}}var v=[\"break,continue,do,else,for,if,return,while\"],w=[[v,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\n\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],F=[w,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],G=[w,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"],\nH=[G,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"],w=[w,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"],I=[v,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],\nJ=[v,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],v=[v,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/,N=/\\S/,O=u({keywords:[F,H,w,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\"+\nI,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,[\"default-code\"]);k(x([],[[\"pln\",/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],[\"lang-\",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\S\\s]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),\n[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);k(x([[\"pln\",/^\\s+/,q,\" \\t\\r\\n\"],[\"atv\",/^(?:\"[^\"]*\"?|'[^']*'?)/,q,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^\\s\"'>]*(?:[^\\s\"'/>]|\\/(?=\\s)))/],[\"pun\",/^[/<->]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\"([^\"]+)\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*'([^']+)'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\s\"'>]+)/i],[\"lang-css\",/^style\\s*=\\s*\"([^\"]+)\"/i],[\"lang-css\",/^style\\s*=\\s*'([^']+)'/i],[\"lang-css\",\n/^style\\s*=\\s*([^\\s\"'>]+)/i]]),[\"in.tag\"]);k(x([],[[\"atv\",/^[\\S\\s]+/]]),[\"uq.val\"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);k(u({keywords:\"null,true,false\"}),[\"json\"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),[\"cs\"]);k(u({keywords:G,cStyleComments:!0}),[\"java\"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),[\"bsh\",\"csh\",\"sh\"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),\n[\"cv\",\"py\"]);k(u({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"perl\",\"pl\",\"pm\"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),[\"js\"]);k(u({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\",\nhashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]);k(x([],[[\"str\",/^[\\S\\s]+/]]),[\"regex\"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement(\"PRE\");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf(\"prettyprint\")>=0){var k=k.match(g),f,b;if(b=\n!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&\"CODE\"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName===\"pre\"||o.tagName===\"code\"||o.tagName===\"xmp\")&&o.className&&o.className.indexOf(\"prettyprint\")>=0){b=!0;break}b||((b=(b=n.className.match(/\\blinenums\\b(?::(\\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,\n250):a&&a()}for(var e=[document.getElementsByTagName(\"pre\"),document.getElementsByTagName(\"code\"),document.getElementsByTagName(\"xmp\")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",\nPR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\"}})();\n"
  },
  {
    "path": "ppt/node-generator-koa/js/qrcode.js",
    "content": "/**\n * @fileoverview\n * - Using the 'QRCode for Javascript library'\n * - Fixed dataset of 'QRCode for Javascript library' for support full-spec.\n * - this library has no dependencies.\n * \n * @author davidshimjs\n * @see <a href=\"http://www.d-project.com/\" target=\"_blank\">http://www.d-project.com/</a>\n * @see <a href=\"http://jeromeetienne.github.com/jquery-qrcode/\" target=\"_blank\">http://jeromeetienne.github.com/jquery-qrcode/</a>\n */\nvar QRCode;\n\n(function () {\n\t//---------------------------------------------------------------------\n\t// QRCode for JavaScript\n\t//\n\t// Copyright (c) 2009 Kazuhiko Arase\n\t//\n\t// URL: http://www.d-project.com/\n\t//\n\t// Licensed under the MIT license:\n\t//   http://www.opensource.org/licenses/mit-license.php\n\t//\n\t// The word \"QR Code\" is registered trademark of \n\t// DENSO WAVE INCORPORATED\n\t//   http://www.denso-wave.com/qrcode/faqpatent-e.html\n\t//\n\t//---------------------------------------------------------------------\n\tfunction QR8bitByte(data){this.mode=QRMode.MODE_8BIT_BYTE;this.data=data;}\n\tQR8bitByte.prototype={getLength:function(buffer){return this.data.length;},write:function(buffer){for(var i=0;i<this.data.length;i++){buffer.put(this.data.charCodeAt(i),8);}}};function QRCodeModel(typeNumber,errorCorrectLevel){this.typeNumber=typeNumber;this.errorCorrectLevel=errorCorrectLevel;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[];}\n\tQRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+\",\"+col);}\n\treturn this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}\n\tthis.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}\n\tif(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}\n\tthis.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}\n\treturn pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}\n\treturn qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}\n\tthis.modules[r][6]=(r%2==0);}\n\tfor(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}\n\tthis.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}\n\tfor(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}\n\tfor(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}\n\tfor(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}\n\tthis.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}\n\tvar mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}\n\tthis.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}\n\trow+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}\n\tvar totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}\n\tif(buffer.getLengthInBits()>totalDataCount*8){throw new Error(\"code length overflow. (\"\n\t+buffer.getLengthInBits()\n\t+\">\"\n\t+totalDataCount*8\n\t+\")\");}\n\tif(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}\n\twhile(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}\n\twhile(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}\n\tbuffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}\n\tbuffer.put(QRCodeModel.PAD1,8);}\n\treturn QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}\n\toffset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}\n\tvar totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}\n\tvar data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}\n\tfor(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}\n\treturn data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}\n\treturn((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}\n\treturn(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}\n\treturn digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error(\"bad maskPattern:\"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}\n\treturn a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error(\"mode:\"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error(\"mode:\"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error(\"mode:\"+mode);}}else{throw new Error(\"type:\"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}\n\tfor(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}\n\tif(r==0&&c==0){continue;}\n\tif(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}\n\tif(sameCount>5){lostPoint+=(3+sameCount-5);}}}\n\tfor(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}\n\tfor(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}\n\tfor(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}\n\tvar darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}\n\tvar ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error(\"glog(\"+n+\")\");}\n\treturn QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}\n\twhile(n>=256){n-=255;}\n\treturn QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}\n\tfor(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}\n\tfor(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}\n\tfunction QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+\"/\"+shift);}\n\tvar offset=0;while(offset<num.length&&num[offset]==0){offset++;}\n\tthis.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}\n\tQRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}\n\treturn new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}\n\tvar ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}\n\tfor(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}\n\treturn new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}\n\tQRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error(\"bad rs block @ typeNumber:\"+typeNumber+\"/errorCorrectLevel:\"+errorCorrectLevel);}\n\tvar length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}\n\treturn list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}\n\tQRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}\n\tif(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}\n\tthis.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];\n\t\n\tfunction _isSupportCanvas() {\n\t\treturn typeof CanvasRenderingContext2D != \"undefined\";\n\t}\n\t\n\t// android 2.x doesn't support Data-URI spec\n\tfunction _getAndroid() {\n\t\tvar android = false;\n\t\tvar sAgent = navigator.userAgent;\n\t\t\n\t\tif (/android/i.test(sAgent)) { // android\n\t\t\tandroid = true;\n\t\t\taMat = sAgent.toString().match(/android ([0-9]\\.[0-9])/i);\n\t\t\t\n\t\t\tif (aMat && aMat[1]) {\n\t\t\t\tandroid = parseFloat(aMat[1]);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn android;\n\t}\n\t\n\t// Drawing in DOM by using Table tag\n\tvar Drawing = !_isSupportCanvas() ? (function () {\n\t\tvar _el = null;\n\t\tvar _htOption = null;\n\t\t\n\t\tvar Drawing = function (el, htOption) {\n\t\t\t_el = el;\n\t\t\t_htOption = htOption;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Draw the QRCode\n\t\t * \n\t\t * @param {QRCode} oQRCode\n\t\t */\n\t\tDrawing.prototype.draw = function (oQRCode) {\n\t\t\tvar nCount = oQRCode.getModuleCount();\n\t\t\tvar nWidth = Math.floor(_htOption.width / nCount);\n\t\t\tvar nHeight = Math.floor(_htOption.height / nCount);\n\t\t\tvar aHTML = ['<table style=\"border:0;border-collapse:collapse;\">'];\n\t\t\t\n\t\t\tfor (var row = 0; row < nCount; row++) {\n\t\t\t\taHTML.push('<tr>');\n\t\t\t\t\n\t\t\t\tfor (var col = 0; col < nCount; col++) {\n\t\t\t\t\taHTML.push('<td style=\"border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';\"></td>');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\taHTML.push('</tr>');\n\t\t\t}\n\t\t\t\n\t\t\taHTML.push('</table>');\n\t\t\t_el.innerHTML = aHTML.join('');\n\t\t\t\n\t\t\t// Fix the margin values as real size.\n\t\t\tvar elTable = _el.childNodes[0];\n\t\t\tvar nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;\n\t\t\tvar nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;\n\t\t\t\n\t\t\tif (nLeftMarginTable > 0 && nTopMarginTable > 0) {\n\t\t\t\telTable.style.margin = nTopMarginTable + \"px \" + nLeftMarginTable + \"px\";\t\n\t\t\t}\n\t\t};\n\t\t\n\t\t/**\n\t\t * Clear the QRCode\n\t\t */\n\t\tDrawing.prototype.clear = function () {\n\t\t\t_el.innerHTML = '';\n\t\t};\n\t\t\n\t\treturn Drawing;\n\t})() : (function () { // Drawing in Canvas\n\t\tvar _el = null;\n\t\tvar _elCanvas = null;\n\t\tvar _elImage = null;\n\t\tvar _fFail = null;\n\t\tvar _fSuccess = null;\n\t\tvar _htOption = null;\n\t\tvar _bSupportDataURI = null;\n\t\tvar _oContext = null;\n\t\tvar _bIsPainted = false;\n\t\tvar _android = _getAndroid();\n\t\t\n\t\tfunction _onMakeImage() {\n\t\t\t_elImage.src = _elCanvas.toDataURL(\"image/png\");\n\t\t\t_elImage.style.display = \"block\";\n\t\t\t_elCanvas.style.display = \"none\";\t\t\t\n\t\t}\n\t\t\n\t\t// Android 2.1 bug workaround\n\t\t// http://code.google.com/p/android/issues/detail?id=5141\n\t\tif (_android && _android <= 2.1) {\n\t    \tvar factor = 1 / window.devicePixelRatio;\n\t        var drawImage = CanvasRenderingContext2D.prototype.drawImage; \n\t    \tCanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {\n\t    \t\tif ((\"nodeName\" in image) && /img/i.test(image.nodeName)) {\n\t\t        \tfor (var i = arguments.length - 1; i >= 1; i--) {\n\t\t            \targuments[i] = arguments[i] * factor;\n\t\t        \t}\n\t    \t\t} else if (typeof dw == \"undefined\") {\n\t    \t\t\targuments[1] *= factor;\n\t    \t\t\targuments[2] *= factor;\n\t    \t\t\targuments[3] *= factor;\n\t    \t\t\targuments[4] *= factor;\n\t    \t\t}\n\t    \t\t\n\t        \tdrawImage.apply(this, arguments); \n\t    \t};\n\t\t}\n\t\t\n\t\t/**\n\t\t * Check whether the user's browser supports Data URI or not\n\t\t * \n\t\t * @private\n\t\t * @param {Function} fSuccess Occurs if it supports Data URI\n\t\t * @param {Function} fFail Occurs if it doesn't support Data URI\n\t\t */\n\t\tfunction _safeSetDataURI(fSuccess, fFail) {\n\t\t\t_fFail = fFail;\n\t\t\t_fSuccess = fSuccess;\n\t\n\t\t\t// Check it just once\n\t\t\tif (_bSupportDataURI === null) {\n\t\t\t\tvar el = document.createElement(\"img\");\n\t\t\t\tvar fOnError = function () {\n\t\t\t\t\t_bSupportDataURI = false;\n\t\t\t\t\t\n\t\t\t\t\tif (_fFail) {\n\t\t\t\t\t\t_fFail();\t\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t};\n\t\t\t\tvar fOnSuccess = function () {\n\t\t\t\t\t_bSupportDataURI = true;\n\t\t\t\t\t\n\t\t\t\t\tif (_fSuccess) {\n\t\t\t\t\t\t_fSuccess();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tel.onabort = fOnError;\n\t\t\t\tel.onerror = fOnError;\n\t\t\t\tel.onload = fOnSuccess;\n\t\t\t\tel.src = \"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\"; // the Image contains 1px data.\n\t\t\t\treturn;\n\t\t\t} else if (_bSupportDataURI === true && _fSuccess) {\n\t\t\t\t_fSuccess();\n\t\t\t} else if (_bSupportDataURI === false && _fFail) {\n\t\t\t\t_fFail();\n\t\t\t}\n\t\t};\n\t\t\n\t\t/**\n\t\t * Drawing QRCode by using canvas\n\t\t * \n\t\t * @constructor\n\t\t * @param {HTMLElement} el\n\t\t * @param {Object} htOption QRCode Options \n\t\t */\n\t\tvar Drawing = function (el, htOption) {\n\t\t\t_htOption = htOption;\n\t\t\t_elCanvas = document.createElement(\"canvas\");\n\t\t\t_elCanvas.width = htOption.width;\n\t\t\t_elCanvas.height = htOption.height;\n\t\t\tel.appendChild(_elCanvas);\n\t\t\t_el = el;\n\t\t\t_oContext = _elCanvas.getContext(\"2d\");\n\t\t\t_bIsPainted = false;\n\t\t\t_elImage = document.createElement(\"img\");\n\t\t\t_elImage.style.display = \"none\";\n\t\t\t_el.appendChild(_elImage);\n\t\t\t_bSupportDataURI = null;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Draw the QRCode\n\t\t * \n\t\t * @param {QRCode} oQRCode \n\t\t */\n\t\tDrawing.prototype.draw = function (oQRCode) {\n\t\t\t_elImage.style.display = \"none\";\n\t\t\tvar nCount = oQRCode.getModuleCount();\n\t\t\tvar nWidth = _htOption.width / nCount;\n\t\t\tvar nHeight = _htOption.height / nCount;\n\t\t\tvar nRoundedWidth = Math.round(nWidth);\n\t\t\tvar nRoundedHeight = Math.round(nHeight);\n\t\t\tthis.clear();\n\t\t\t\n\t\t\tfor (var row = 0; row < nCount; row++) {\n\t\t\t\tfor (var col = 0; col < nCount; col++) {\n\t\t\t\t\tvar bIsDark = oQRCode.isDark(row, col);\n\t\t\t\t\tvar nLeft = col * nWidth;\n\t\t\t\t\tvar nTop = row * nHeight;\n\t\t\t\t\t_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;\n\t\t\t\t\t_oContext.lineWidth = 1;\n\t\t\t\t\t_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;\t\t\t\t\t\n\t\t\t\t\t_oContext.fillRect(nLeft, nTop, nWidth, nHeight);\n\t\t\t\t\t\n\t\t\t\t\t// 안티 앨리어싱 방지 처리\n\t\t\t\t\t_oContext.strokeRect(\n\t\t\t\t\t\tMath.floor(nLeft) + 0.5,\n\t\t\t\t\t\tMath.floor(nTop) + 0.5,\n\t\t\t\t\t\tnRoundedWidth,\n\t\t\t\t\t\tnRoundedHeight\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\t_oContext.strokeRect(\n\t\t\t\t\t\tMath.ceil(nLeft) - 0.5,\n\t\t\t\t\t\tMath.ceil(nTop) - 0.5,\n\t\t\t\t\t\tnRoundedWidth,\n\t\t\t\t\t\tnRoundedHeight\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t_bIsPainted = true;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Make the image from Canvas if the browser supports Data URI.\n\t\t */\n\t\tDrawing.prototype.makeImage = function () {\n\t\t\tif (_bIsPainted) {\n\t\t\t\t_safeSetDataURI(_onMakeImage);\n\t\t\t}\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Return whether the QRCode is painted or not\n\t\t * \n\t\t * @return {Boolean}\n\t\t */\n\t\tDrawing.prototype.isPainted = function () {\n\t\t\treturn _bIsPainted;\n\t\t};\n\t\t\n\t\t/**\n\t\t * Clear the QRCode\n\t\t */\n\t\tDrawing.prototype.clear = function () {\n\t\t\t_oContext.clearRect(0, 0, _elCanvas.width, _elCanvas.height);\n\t\t\t_bIsPainted = false;\n\t\t};\n\t\t\n\t\t/**\n\t\t * @private\n\t\t * @param {Number} nNumber\n\t\t */\n\t\tDrawing.prototype.round = function (nNumber) {\n\t\t\tif (!nNumber) {\n\t\t\t\treturn nNumber;\n\t\t\t}\n\t\t\t\n\t\t\treturn Math.floor(nNumber * 1000) / 1000;\n\t\t};\n\t\t\n\t\treturn Drawing;\n\t})();\n\t\n\t/**\n\t * Get the type by string length\n\t * \n\t * @private\n\t * @param {String} sText\n\t * @param {Number} nCorrectLevel\n\t * @return {Number} type\n\t */\n\tfunction _getTypeNumber(sText, nCorrectLevel) {\t\t\t\n\t\tvar nType = 1;\n\t\t\n\t\tfor (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {\n\t\t\tvar nLimit = 0;\n\t\t\t\n\t\t\tswitch (nCorrectLevel) {\n\t\t\t\tcase QRErrorCorrectLevel.L :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][0];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.M :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.Q :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][2];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.H :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][3];\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tif (sText.length <= nLimit) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tnType++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (nType > QRCodeLimitLength.length) {\n\t\t\tthrow new Error(\"Too long data\");\n\t\t}\n\t\t\n\t\treturn nType;\n\t}\n\t\n\t/**\n\t * @class QRCode\n\t * @constructor\n\t * @example \n\t * new QRCode(document.getElementById(\"test\"), \"http://jindo.dev.naver.com/collie\");\n\t *\n\t * @example\n\t * var oQRCode = new QRCode(\"test\", {\n\t *    text : \"http://naver.com\",\n\t *    width : 128,\n\t *    height : 128\n\t * });\n\t * \n\t * oQRCode.clear(); // Clear the QRCode.\n\t * oQRCode.makeCode(\"http://map.naver.com\"); // Re-create the QRCode.\n\t *\n\t * @param {HTMLElement|String} el target element or 'id' attribute of element.\n\t * @param {Object|String} vOption\n\t * @param {String} vOption.text QRCode link data\n\t * @param {Number} [vOption.width=256]\n\t * @param {Number} [vOption.height=256]\n\t * @param {String} [vOption.colorDark=\"#000000\"]\n\t * @param {String} [vOption.colorLight=\"#ffffff\"]\n\t * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] \n\t */\n\tQRCode = function (el, vOption) {\n\t\tthis._htOption = {\n\t\t\twidth : 256, \n\t\t\theight : 256,\n\t\t\ttypeNumber : 4,\n\t\t\tcolorDark : \"#000000\",\n\t\t\tcolorLight : \"#ffffff\",\n\t\t\tcorrectLevel : QRErrorCorrectLevel.H\n\t\t};\n\t\t\n\t\tif (typeof vOption === 'string') {\n\t\t\tvOption\t= {\n\t\t\t\ttext : vOption\n\t\t\t};\n\t\t}\n\t\t\n\t\t// Overwrites options\n\t\tif (vOption) {\n\t\t\tfor (var i in vOption) {\n\t\t\t\tthis._htOption[i] = vOption[i];\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (typeof el == \"string\") {\n\t\t\tel = document.getElementById(el);\n\t\t}\n\t\t\n\t\tthis._android = _getAndroid();\n\t\tthis._el = el;\n\t\tthis._oQRCode = null;\n\t\tthis._oDrawing = new Drawing(this._el, this._htOption);\n\t\t\n\t\tif (this._htOption.text) {\n\t\t\tthis.makeCode(this._htOption.text);\t\n\t\t}\n\t};\n\t\n\t/**\n\t * Make the QRCode\n\t * \n\t * @param {String} sText link data\n\t */\n\tQRCode.prototype.makeCode = function (sText) {\n\t\tthis._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);\n\t\tthis._oQRCode.addData(sText);\n\t\tthis._oQRCode.make();\n\t\tthis._el.title = sText;\n\t\tthis._oDrawing.draw(this._oQRCode);\t\t\t\n\t\tthis.makeImage();\n\t};\n\t\n\t/**\n\t * Make the Image from Canvas element\n\t * - It occurs automatically\n\t * - Android below 3 doesn't support Data-URI spec.\n\t * \n\t * @private\n\t */\n\tQRCode.prototype.makeImage = function () {\n\t\tif (typeof this._oDrawing.makeImage == \"function\" && (!this._android || this._android >= 3)) {\n\t\t\tthis._oDrawing.makeImage();\n\t\t}\n\t};\n\t\n\t/**\n\t * Clear the QRCode\n\t */\n\tQRCode.prototype.clear = function () {\n\t\tthis._oDrawing.clear();\n\t};\n\t\n\t/**\n\t * @name QRCode.CorrectLevel\n\t */\n\tQRCode.CorrectLevel = QRErrorCorrectLevel;\n})();"
  },
  {
    "path": "ppt/node-generator-koa/js/shake.js",
    "content": "(function (window, document) {\n\n/**\n * from :https://github.com/alexgibson/shake.js/blob/master/shake.js\n *\n */\n    /**\n     * 摇一摇实现-抽奖游戏\n     * @global\n     * @class Shake\n     *\n     * @example\n     * ```html\n     * <script src=\"../output/template/common/bdbox/game/shake.js\"></script>\n     * <script>\n     * window.addEventListener('shake', shakeEventDidOccur, false);\n     * function shakeEventDidOccur () {\n     *     alert('被摇了');\n     * }\n     * </script>\n     * ```\n     */\n    function Shake() {\n\n        //feature detect\n        this.hasDeviceMotion = 'ondevicemotion' in window;\n\n        //default velocity threshold for shake to register\n        this.threshold = 15;\n\n        //use date to prevent multiple shakes firing\n        this.lastTime = new Date();\n\n        //accelerometer values\n        this.lastX = null;\n        this.lastY = null;\n        this.lastZ = null;\n\n        //create custom event\n        if (typeof document.CustomEvent === \"function\") {\n            this.event = new document.CustomEvent('shake', {\n                bubbles: true,\n                cancelable: true\n            });\n        } else if (typeof document.createEvent === \"function\") {\n            this.event = document.createEvent('Event');\n            this.event.initEvent('shake', true, true);\n        } else {\n          return false;\n        }\n    }\n\n    //reset timer values\n    Shake.prototype.reset = function () {\n        this.lastTime = new Date();\n        this.lastX = null;\n        this.lastY = null;\n        this.lastZ = null;\n    };\n\n    //start listening for devicemotion\n    Shake.prototype.start = function () {\n        this.reset();\n        if (this.hasDeviceMotion) { window.addEventListener('devicemotion', this, false); }\n    };\n\n    //stop listening for devicemotion\n    Shake.prototype.stop = function () {\n\n        if (this.hasDeviceMotion) { window.removeEventListener('devicemotion', this, false); }\n        this.reset();\n    };\n\n    //calculates if shake did occur\n    Shake.prototype.devicemotion = function (e) {\n\n        var current = e.accelerationIncludingGravity,\n            currentTime,\n            timeDifference,\n            deltaX = 0,\n            deltaY = 0,\n            deltaZ = 0;\n\n        if ((this.lastX === null) && (this.lastY === null) && (this.lastZ === null)) {\n            this.lastX = current.x;\n            this.lastY = current.y;\n            this.lastZ = current.z;\n            return;\n        }\n\n        deltaX = Math.abs(this.lastX - current.x);\n        deltaY = Math.abs(this.lastY - current.y);\n        deltaZ = Math.abs(this.lastZ - current.z);\n\n        if (((deltaX > this.threshold) && (deltaY > this.threshold)) || ((deltaX > this.threshold) && (deltaZ > this.threshold)) || ((deltaY > this.threshold) && (deltaZ > this.threshold))) {\n            //calculate time in milliseconds since last shake registered\n            currentTime = new Date();\n            timeDifference = currentTime.getTime() - this.lastTime.getTime();\n\n            if (timeDifference > 1000) {\n                window.dispatchEvent(this.event);\n                this.lastTime = new Date();\n            }\n        }\n\n        this.lastX = current.x;\n        this.lastY = current.y;\n        this.lastZ = current.z;\n\n    };\n\n    //event handler\n    Shake.prototype.handleEvent = function (e) {\n\n        if (typeof (this[e.type]) === 'function') {\n            return this[e.type](e);\n        }\n    };\n\n    //create a new instance of shake.js.\n    var myShakeEvent = new Shake();\n    myShakeEvent.start();\n\n}(window, document));\n"
  },
  {
    "path": "ppt/node-generator-koa/js/socket.io.js",
    "content": "/*! Socket.IO.js build:0.9.6, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n  /**\n   * IO namespace.\n   *\n   * @namespace\n   */\n\n  var io = exports;\n\n  /**\n   * Socket.IO version\n   *\n   * @api public\n   */\n\n  io.version = '0.9.6';\n\n  /**\n   * Protocol implemented.\n   *\n   * @api public\n   */\n\n  io.protocol = 1;\n\n  /**\n   * Available transports, these will be populated with the available transports\n   *\n   * @api public\n   */\n\n  io.transports = [];\n\n  /**\n   * Keep track of jsonp callbacks.\n   *\n   * @api private\n   */\n\n  io.j = [];\n\n  /**\n   * Keep track of our io.Sockets\n   *\n   * @api private\n   */\n  io.sockets = {};\n\n\n  /**\n   * Manages connections to hosts.\n   *\n   * @param {String} uri\n   * @Param {Boolean} force creation of new socket (defaults to false)\n   * @api public\n   */\n\n  io.connect = function (host, details) {\n    var uri = io.util.parseUri(host)\n      , uuri\n      , socket;\n\n    if (global && global.location) {\n      uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);\n      uri.host = uri.host || (global.document\n        ? global.document.domain : global.location.hostname);\n      uri.port = uri.port || global.location.port;\n    }\n\n    uuri = io.util.uniqueUri(uri);\n\n    var options = {\n        host: uri.host\n      , secure: 'https' == uri.protocol\n      , port: uri.port || ('https' == uri.protocol ? 443 : 80)\n      , query: uri.query || ''\n    };\n\n    io.util.merge(options, details);\n\n    if (options['force new connection'] || !io.sockets[uuri]) {\n      socket = new io.Socket(options);\n    }\n\n    if (!options['force new connection'] && socket) {\n      io.sockets[uuri] = socket;\n    }\n\n    socket = socket || io.sockets[uuri];\n\n    // if path is different from '' or /\n    return socket.of(uri.path.length > 1 ? uri.path : '');\n  };\n\n})('object' === typeof module ? module.exports : (this.io = {}), this);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n  /**\n   * Utilities namespace.\n   *\n   * @namespace\n   */\n\n  var util = exports.util = {};\n\n  /**\n   * Parses an URI\n   *\n   * @author Steven Levithan <stevenlevithan.com> (MIT license)\n   * @api public\n   */\n\n  var re = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\n  var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password',\n               'host', 'port', 'relative', 'path', 'directory', 'file', 'query',\n               'anchor'];\n\n  util.parseUri = function (str) {\n    var m = re.exec(str || '')\n      , uri = {}\n      , i = 14;\n\n    while (i--) {\n      uri[parts[i]] = m[i] || '';\n    }\n\n    return uri;\n  };\n\n  /**\n   * Produces a unique url that identifies a Socket.IO connection.\n   *\n   * @param {Object} uri\n   * @api public\n   */\n\n  util.uniqueUri = function (uri) {\n    var protocol = uri.protocol\n      , host = uri.host\n      , port = uri.port;\n\n    if ('document' in global) {\n      host = host || document.domain;\n      port = port || (protocol == 'https'\n        && document.location.protocol !== 'https:' ? 443 : document.location.port);\n    } else {\n      host = host || 'localhost';\n\n      if (!port && protocol == 'https') {\n        port = 443;\n      }\n    }\n\n    return (protocol || 'http') + '://' + host + ':' + (port || 80);\n  };\n\n  /**\n   * Mergest 2 query strings in to once unique query string\n   *\n   * @param {String} base\n   * @param {String} addition\n   * @api public\n   */\n\n  util.query = function (base, addition) {\n    var query = util.chunkQuery(base || '')\n      , components = [];\n\n    util.merge(query, util.chunkQuery(addition || ''));\n    for (var part in query) {\n      if (query.hasOwnProperty(part)) {\n        components.push(part + '=' + query[part]);\n      }\n    }\n\n    return components.length ? '?' + components.join('&') : '';\n  };\n\n  /**\n   * Transforms a querystring in to an object\n   *\n   * @param {String} qs\n   * @api public\n   */\n\n  util.chunkQuery = function (qs) {\n    var query = {}\n      , params = qs.split('&')\n      , i = 0\n      , l = params.length\n      , kv;\n\n    for (; i < l; ++i) {\n      kv = params[i].split('=');\n      if (kv[0]) {\n        query[kv[0]] = kv[1];\n      }\n    }\n\n    return query;\n  };\n\n  /**\n   * Executes the given function when the page is loaded.\n   *\n   *     io.util.load(function () { console.log('page loaded'); });\n   *\n   * @param {Function} fn\n   * @api public\n   */\n\n  var pageLoaded = false;\n\n  util.load = function (fn) {\n    if ('document' in global && document.readyState === 'complete' || pageLoaded) {\n      return fn();\n    }\n\n    util.on(global, 'load', fn, false);\n  };\n\n  /**\n   * Adds an event.\n   *\n   * @api private\n   */\n\n  util.on = function (element, event, fn, capture) {\n    if (element.attachEvent) {\n      element.attachEvent('on' + event, fn);\n    } else if (element.addEventListener) {\n      element.addEventListener(event, fn, capture);\n    }\n  };\n\n  /**\n   * Generates the correct `XMLHttpRequest` for regular and cross domain requests.\n   *\n   * @param {Boolean} [xdomain] Create a request that can be used cross domain.\n   * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest.\n   * @api private\n   */\n\n  util.request = function (xdomain) {\n\n    if (xdomain && 'undefined' != typeof XDomainRequest) {\n      return new XDomainRequest();\n    }\n\n    if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) {\n      return new XMLHttpRequest();\n    }\n\n    if (!xdomain) {\n      try {\n        return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP');\n      } catch(e) { }\n    }\n\n    return null;\n  };\n\n  /**\n   * XHR based transport constructor.\n   *\n   * @constructor\n   * @api public\n   */\n\n  /**\n   * Change the internal pageLoaded value.\n   */\n\n  if ('undefined' != typeof window) {\n    util.load(function () {\n      pageLoaded = true;\n    });\n  }\n\n  /**\n   * Defers a function to ensure a spinner is not displayed by the browser\n   *\n   * @param {Function} fn\n   * @api public\n   */\n\n  util.defer = function (fn) {\n    if (!util.ua.webkit || 'undefined' != typeof importScripts) {\n      return fn();\n    }\n\n    util.load(function () {\n      setTimeout(fn, 100);\n    });\n  };\n\n  /**\n   * Merges two objects.\n   *\n   * @api public\n   */\n  \n  util.merge = function merge (target, additional, deep, lastseen) {\n    var seen = lastseen || []\n      , depth = typeof deep == 'undefined' ? 2 : deep\n      , prop;\n\n    for (prop in additional) {\n      if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) {\n        if (typeof target[prop] !== 'object' || !depth) {\n          target[prop] = additional[prop];\n          seen.push(additional[prop]);\n        } else {\n          util.merge(target[prop], additional[prop], depth - 1, seen);\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Merges prototypes from objects\n   *\n   * @api public\n   */\n  \n  util.mixin = function (ctor, ctor2) {\n    util.merge(ctor.prototype, ctor2.prototype);\n  };\n\n  /**\n   * Shortcut for prototypical and static inheritance.\n   *\n   * @api private\n   */\n\n  util.inherit = function (ctor, ctor2) {\n    function f() {};\n    f.prototype = ctor2.prototype;\n    ctor.prototype = new f;\n  };\n\n  /**\n   * Checks if the given object is an Array.\n   *\n   *     io.util.isArray([]); // true\n   *     io.util.isArray({}); // false\n   *\n   * @param Object obj\n   * @api public\n   */\n\n  util.isArray = Array.isArray || function (obj) {\n    return Object.prototype.toString.call(obj) === '[object Array]';\n  };\n\n  /**\n   * Intersects values of two arrays into a third\n   *\n   * @api public\n   */\n\n  util.intersect = function (arr, arr2) {\n    var ret = []\n      , longest = arr.length > arr2.length ? arr : arr2\n      , shortest = arr.length > arr2.length ? arr2 : arr;\n\n    for (var i = 0, l = shortest.length; i < l; i++) {\n      if (~util.indexOf(longest, shortest[i]))\n        ret.push(shortest[i]);\n    }\n\n    return ret;\n  }\n\n  /**\n   * Array indexOf compatibility.\n   *\n   * @see bit.ly/a5Dxa2\n   * @api public\n   */\n\n  util.indexOf = function (arr, o, i) {\n    \n    for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; \n         i < j && arr[i] !== o; i++) {}\n\n    return j <= i ? -1 : i;\n  };\n\n  /**\n   * Converts enumerables to array.\n   *\n   * @api public\n   */\n\n  util.toArray = function (enu) {\n    var arr = [];\n\n    for (var i = 0, l = enu.length; i < l; i++)\n      arr.push(enu[i]);\n\n    return arr;\n  };\n\n  /**\n   * UA / engines detection namespace.\n   *\n   * @namespace\n   */\n\n  util.ua = {};\n\n  /**\n   * Whether the UA supports CORS for XHR.\n   *\n   * @api public\n   */\n\n  util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () {\n    try {\n      var a = new XMLHttpRequest();\n    } catch (e) {\n      return false;\n    }\n\n    return a.withCredentials != undefined;\n  })();\n\n  /**\n   * Detect webkit.\n   *\n   * @api public\n   */\n\n  util.ua.webkit = 'undefined' != typeof navigator\n    && /webkit/i.test(navigator.userAgent);\n\n})('undefined' != typeof io ? io : module.exports, this);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.EventEmitter = EventEmitter;\n\n  /**\n   * Event emitter constructor.\n   *\n   * @api public.\n   */\n\n  function EventEmitter () {};\n\n  /**\n   * Adds a listener\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.on = function (name, fn) {\n    if (!this.$events) {\n      this.$events = {};\n    }\n\n    if (!this.$events[name]) {\n      this.$events[name] = fn;\n    } else if (io.util.isArray(this.$events[name])) {\n      this.$events[name].push(fn);\n    } else {\n      this.$events[name] = [this.$events[name], fn];\n    }\n\n    return this;\n  };\n\n  EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n  /**\n   * Adds a volatile listener.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.once = function (name, fn) {\n    var self = this;\n\n    function on () {\n      self.removeListener(name, on);\n      fn.apply(this, arguments);\n    };\n\n    on.listener = fn;\n    this.on(name, on);\n\n    return this;\n  };\n\n  /**\n   * Removes a listener.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.removeListener = function (name, fn) {\n    if (this.$events && this.$events[name]) {\n      var list = this.$events[name];\n\n      if (io.util.isArray(list)) {\n        var pos = -1;\n\n        for (var i = 0, l = list.length; i < l; i++) {\n          if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {\n            pos = i;\n            break;\n          }\n        }\n\n        if (pos < 0) {\n          return this;\n        }\n\n        list.splice(pos, 1);\n\n        if (!list.length) {\n          delete this.$events[name];\n        }\n      } else if (list === fn || (list.listener && list.listener === fn)) {\n        delete this.$events[name];\n      }\n    }\n\n    return this;\n  };\n\n  /**\n   * Removes all listeners for an event.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.removeAllListeners = function (name) {\n    // TODO: enable this when node 0.5 is stable\n    //if (name === undefined) {\n      //this.$events = {};\n      //return this;\n    //}\n\n    if (this.$events && this.$events[name]) {\n      this.$events[name] = null;\n    }\n\n    return this;\n  };\n\n  /**\n   * Gets all listeners for a certain event.\n   *\n   * @api publci\n   */\n\n  EventEmitter.prototype.listeners = function (name) {\n    if (!this.$events) {\n      this.$events = {};\n    }\n\n    if (!this.$events[name]) {\n      this.$events[name] = [];\n    }\n\n    if (!io.util.isArray(this.$events[name])) {\n      this.$events[name] = [this.$events[name]];\n    }\n\n    return this.$events[name];\n  };\n\n  /**\n   * Emits an event.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.emit = function (name) {\n    if (!this.$events) {\n      return false;\n    }\n\n    var handler = this.$events[name];\n\n    if (!handler) {\n      return false;\n    }\n\n    var args = Array.prototype.slice.call(arguments, 1);\n\n    if ('function' == typeof handler) {\n      handler.apply(this, args);\n    } else if (io.util.isArray(handler)) {\n      var listeners = handler.slice();\n\n      for (var i = 0, l = listeners.length; i < l; i++) {\n        listeners[i].apply(this, args);\n      }\n    } else {\n      return false;\n    }\n\n    return true;\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n/**\n * Based on JSON2 (http://www.JSON.org/js.html).\n */\n\n(function (exports, nativeJSON) {\n  \"use strict\";\n\n  // use native JSON if it's available\n  if (nativeJSON && nativeJSON.parse){\n    return exports.JSON = {\n      parse: nativeJSON.parse\n    , stringify: nativeJSON.stringify\n    }\n  }\n\n  var JSON = exports.JSON = {};\n\n  function f(n) {\n      // Format integers to have at least two digits.\n      return n < 10 ? '0' + n : n;\n  }\n\n  function date(d, key) {\n    return isFinite(d.valueOf()) ?\n        d.getUTCFullYear()     + '-' +\n        f(d.getUTCMonth() + 1) + '-' +\n        f(d.getUTCDate())      + 'T' +\n        f(d.getUTCHours())     + ':' +\n        f(d.getUTCMinutes())   + ':' +\n        f(d.getUTCSeconds())   + 'Z' : null;\n  };\n\n  var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n      escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n      gap,\n      indent,\n      meta = {    // table of character substitutions\n          '\\b': '\\\\b',\n          '\\t': '\\\\t',\n          '\\n': '\\\\n',\n          '\\f': '\\\\f',\n          '\\r': '\\\\r',\n          '\"' : '\\\\\"',\n          '\\\\': '\\\\\\\\'\n      },\n      rep;\n\n\n  function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n      escapable.lastIndex = 0;\n      return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n          var c = meta[a];\n          return typeof c === 'string' ? c :\n              '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n      }) + '\"' : '\"' + string + '\"';\n  }\n\n\n  function str(key, holder) {\n\n// Produce a string from holder[key].\n\n      var i,          // The loop counter.\n          k,          // The member key.\n          v,          // The member value.\n          length,\n          mind = gap,\n          partial,\n          value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n      if (value instanceof Date) {\n          value = date(key);\n      }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n      if (typeof rep === 'function') {\n          value = rep.call(holder, key, value);\n      }\n\n// What happens next depends on the value's type.\n\n      switch (typeof value) {\n      case 'string':\n          return quote(value);\n\n      case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n          return isFinite(value) ? String(value) : 'null';\n\n      case 'boolean':\n      case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n          return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n      case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n          if (!value) {\n              return 'null';\n          }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n          gap += indent;\n          partial = [];\n\n// Is the value an array?\n\n          if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n              length = value.length;\n              for (i = 0; i < length; i += 1) {\n                  partial[i] = str(i, value) || 'null';\n              }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n              v = partial.length === 0 ? '[]' : gap ?\n                  '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n                  '[' + partial.join(',') + ']';\n              gap = mind;\n              return v;\n          }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n          if (rep && typeof rep === 'object') {\n              length = rep.length;\n              for (i = 0; i < length; i += 1) {\n                  if (typeof rep[i] === 'string') {\n                      k = rep[i];\n                      v = str(k, value);\n                      if (v) {\n                          partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                      }\n                  }\n              }\n          } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n              for (k in value) {\n                  if (Object.prototype.hasOwnProperty.call(value, k)) {\n                      v = str(k, value);\n                      if (v) {\n                          partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                      }\n                  }\n              }\n          }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n          v = partial.length === 0 ? '{}' : gap ?\n              '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n              '{' + partial.join(',') + '}';\n          gap = mind;\n          return v;\n      }\n  }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n  JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n      var i;\n      gap = '';\n      indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n      if (typeof space === 'number') {\n          for (i = 0; i < space; i += 1) {\n              indent += ' ';\n          }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n      } else if (typeof space === 'string') {\n          indent = space;\n      }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n      rep = replacer;\n      if (replacer && typeof replacer !== 'function' &&\n              (typeof replacer !== 'object' ||\n              typeof replacer.length !== 'number')) {\n          throw new Error('JSON.stringify');\n      }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n      return str('', {'': value});\n  };\n\n// If the JSON object does not yet have a parse method, give it one.\n\n  JSON.parse = function (text, reviver) {\n  // The parse method takes a text and an optional reviver function, and returns\n  // a JavaScript value if the text is a valid JSON text.\n\n      var j;\n\n      function walk(holder, key) {\n\n  // The walk method is used to recursively walk the resulting structure so\n  // that modifications can be made.\n\n          var k, v, value = holder[key];\n          if (value && typeof value === 'object') {\n              for (k in value) {\n                  if (Object.prototype.hasOwnProperty.call(value, k)) {\n                      v = walk(value, k);\n                      if (v !== undefined) {\n                          value[k] = v;\n                      } else {\n                          delete value[k];\n                      }\n                  }\n              }\n          }\n          return reviver.call(holder, key, value);\n      }\n\n\n  // Parsing happens in four stages. In the first stage, we replace certain\n  // Unicode characters with escape sequences. JavaScript handles many characters\n  // incorrectly, either silently deleting them, or treating them as line endings.\n\n      text = String(text);\n      cx.lastIndex = 0;\n      if (cx.test(text)) {\n          text = text.replace(cx, function (a) {\n              return '\\\\u' +\n                  ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n          });\n      }\n\n  // In the second stage, we run the text against regular expressions that look\n  // for non-JSON patterns. We are especially concerned with '()' and 'new'\n  // because they can cause invocation, and '=' because it can cause mutation.\n  // But just to be safe, we want to reject all unexpected forms.\n\n  // We split the second stage into 4 regexp operations in order to work around\n  // crippling inefficiencies in IE's and Safari's regexp engines. First we\n  // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n  // replace all simple value tokens with ']' characters. Third, we delete all\n  // open brackets that follow a colon or comma or that begin the text. Finally,\n  // we look to see that the remaining characters are only whitespace or ']' or\n  // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n      if (/^[\\],:{}\\s]*$/\n              .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n                  .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n                  .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n  // In the third stage we use the eval function to compile the text into a\n  // JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n  // in JavaScript: it can begin a block or an object literal. We wrap the text\n  // in parens to eliminate the ambiguity.\n\n          j = eval('(' + text + ')');\n\n  // In the optional fourth stage, we recursively walk the new structure, passing\n  // each name/value pair to a reviver function for possible transformation.\n\n          return typeof reviver === 'function' ?\n              walk({'': j}, '') : j;\n      }\n\n  // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n      throw new SyntaxError('JSON.parse');\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , typeof JSON !== 'undefined' ? JSON : undefined\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Parser namespace.\n   *\n   * @namespace\n   */\n\n  var parser = exports.parser = {};\n\n  /**\n   * Packet types.\n   */\n\n  var packets = parser.packets = [\n      'disconnect'\n    , 'connect'\n    , 'heartbeat'\n    , 'message'\n    , 'json'\n    , 'event'\n    , 'ack'\n    , 'error'\n    , 'noop'\n  ];\n\n  /**\n   * Errors reasons.\n   */\n\n  var reasons = parser.reasons = [\n      'transport not supported'\n    , 'client not handshaken'\n    , 'unauthorized'\n  ];\n\n  /**\n   * Errors advice.\n   */\n\n  var advice = parser.advice = [\n      'reconnect'\n  ];\n\n  /**\n   * Shortcuts.\n   */\n\n  var JSON = io.JSON\n    , indexOf = io.util.indexOf;\n\n  /**\n   * Encodes a packet.\n   *\n   * @api private\n   */\n\n  parser.encodePacket = function (packet) {\n    var type = indexOf(packets, packet.type)\n      , id = packet.id || ''\n      , endpoint = packet.endpoint || ''\n      , ack = packet.ack\n      , data = null;\n\n    switch (packet.type) {\n      case 'error':\n        var reason = packet.reason ? indexOf(reasons, packet.reason) : ''\n          , adv = packet.advice ? indexOf(advice, packet.advice) : '';\n\n        if (reason !== '' || adv !== '')\n          data = reason + (adv !== '' ? ('+' + adv) : '');\n\n        break;\n\n      case 'message':\n        if (packet.data !== '')\n          data = packet.data;\n        break;\n\n      case 'event':\n        var ev = { name: packet.name };\n\n        if (packet.args && packet.args.length) {\n          ev.args = packet.args;\n        }\n\n        data = JSON.stringify(ev);\n        break;\n\n      case 'json':\n        data = JSON.stringify(packet.data);\n        break;\n\n      case 'connect':\n        if (packet.qs)\n          data = packet.qs;\n        break;\n\n      case 'ack':\n        data = packet.ackId\n          + (packet.args && packet.args.length\n              ? '+' + JSON.stringify(packet.args) : '');\n        break;\n    }\n\n    // construct packet with required fragments\n    var encoded = [\n        type\n      , id + (ack == 'data' ? '+' : '')\n      , endpoint\n    ];\n\n    // data fragment is optional\n    if (data !== null && data !== undefined)\n      encoded.push(data);\n\n    return encoded.join(':');\n  };\n\n  /**\n   * Encodes multiple messages (payload).\n   *\n   * @param {Array} messages\n   * @api private\n   */\n\n  parser.encodePayload = function (packets) {\n    var decoded = '';\n\n    if (packets.length == 1)\n      return packets[0];\n\n    for (var i = 0, l = packets.length; i < l; i++) {\n      var packet = packets[i];\n      decoded += '\\ufffd' + packet.length + '\\ufffd' + packets[i];\n    }\n\n    return decoded;\n  };\n\n  /**\n   * Decodes a packet\n   *\n   * @api private\n   */\n\n  var regexp = /([^:]+):([0-9]+)?(\\+)?:([^:]+)?:?([\\s\\S]*)?/;\n\n  parser.decodePacket = function (data) {\n    var pieces = data.match(regexp);\n\n    if (!pieces) return {};\n\n    var id = pieces[2] || ''\n      , data = pieces[5] || ''\n      , packet = {\n            type: packets[pieces[1]]\n          , endpoint: pieces[4] || ''\n        };\n\n    // whether we need to acknowledge the packet\n    if (id) {\n      packet.id = id;\n      if (pieces[3])\n        packet.ack = 'data';\n      else\n        packet.ack = true;\n    }\n\n    // handle different packet types\n    switch (packet.type) {\n      case 'error':\n        var pieces = data.split('+');\n        packet.reason = reasons[pieces[0]] || '';\n        packet.advice = advice[pieces[1]] || '';\n        break;\n\n      case 'message':\n        packet.data = data || '';\n        break;\n\n      case 'event':\n        try {\n          var opts = JSON.parse(data);\n          packet.name = opts.name;\n          packet.args = opts.args;\n        } catch (e) { }\n\n        packet.args = packet.args || [];\n        break;\n\n      case 'json':\n        try {\n          packet.data = JSON.parse(data);\n        } catch (e) { }\n        break;\n\n      case 'connect':\n        packet.qs = data || '';\n        break;\n\n      case 'ack':\n        var pieces = data.match(/^([0-9]+)(\\+)?(.*)/);\n        if (pieces) {\n          packet.ackId = pieces[1];\n          packet.args = [];\n\n          if (pieces[3]) {\n            try {\n              packet.args = pieces[3] ? JSON.parse(pieces[3]) : [];\n            } catch (e) { }\n          }\n        }\n        break;\n\n      case 'disconnect':\n      case 'heartbeat':\n        break;\n    };\n\n    return packet;\n  };\n\n  /**\n   * Decodes data payload. Detects multiple messages\n   *\n   * @return {Array} messages\n   * @api public\n   */\n\n  parser.decodePayload = function (data) {\n    // IE doesn't like data[i] for unicode chars, charAt works fine\n    if (data.charAt(0) == '\\ufffd') {\n      var ret = [];\n\n      for (var i = 1, length = ''; i < data.length; i++) {\n        if (data.charAt(i) == '\\ufffd') {\n          ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length)));\n          i += Number(length) + 1;\n          length = '';\n        } else {\n          length += data.charAt(i);\n        }\n      }\n\n      return ret;\n    } else {\n      return [parser.decodePacket(data)];\n    }\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.Transport = Transport;\n\n  /**\n   * This is the transport template for all supported transport methods.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function Transport (socket, sessid) {\n    this.socket = socket;\n    this.sessid = sessid;\n  };\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(Transport, io.EventEmitter);\n\n  /**\n   * Handles the response from the server. When a new response is received\n   * it will automatically update the timeout, decode the message and\n   * forwards the response to the onMessage function for further processing.\n   *\n   * @param {String} data Response from the server.\n   * @api private\n   */\n\n  Transport.prototype.onData = function (data) {\n    this.clearCloseTimeout();\n    \n    // If the connection in currently open (or in a reopening state) reset the close \n    // timeout since we have just received data. This check is necessary so\n    // that we don't reset the timeout on an explicitly disconnected connection.\n    if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) {\n      this.setCloseTimeout();\n    }\n\n    if (data !== '') {\n      // todo: we should only do decodePayload for xhr transports\n      var msgs = io.parser.decodePayload(data);\n\n      if (msgs && msgs.length) {\n        for (var i = 0, l = msgs.length; i < l; i++) {\n          this.onPacket(msgs[i]);\n        }\n      }\n    }\n\n    return this;\n  };\n\n  /**\n   * Handles packets.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onPacket = function (packet) {\n    this.socket.setHeartbeatTimeout();\n\n    if (packet.type == 'heartbeat') {\n      return this.onHeartbeat();\n    }\n\n    if (packet.type == 'connect' && packet.endpoint == '') {\n      this.onConnect();\n    }\n\n    if (packet.type == 'error' && packet.advice == 'reconnect') {\n      this.open = false;\n    }\n\n    this.socket.onPacket(packet);\n\n    return this;\n  };\n\n  /**\n   * Sets close timeout\n   *\n   * @api private\n   */\n  \n  Transport.prototype.setCloseTimeout = function () {\n    if (!this.closeTimeout) {\n      var self = this;\n\n      this.closeTimeout = setTimeout(function () {\n        self.onDisconnect();\n      }, this.socket.closeTimeout);\n    }\n  };\n\n  /**\n   * Called when transport disconnects.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onDisconnect = function () {\n    if (this.close && this.open) this.close();\n    this.clearTimeouts();\n    this.socket.onDisconnect();\n    return this;\n  };\n\n  /**\n   * Called when transport connects\n   *\n   * @api private\n   */\n\n  Transport.prototype.onConnect = function () {\n    this.socket.onConnect();\n    return this;\n  }\n\n  /**\n   * Clears close timeout\n   *\n   * @api private\n   */\n\n  Transport.prototype.clearCloseTimeout = function () {\n    if (this.closeTimeout) {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n    }\n  };\n\n  /**\n   * Clear timeouts\n   *\n   * @api private\n   */\n\n  Transport.prototype.clearTimeouts = function () {\n    this.clearCloseTimeout();\n\n    if (this.reopenTimeout) {\n      clearTimeout(this.reopenTimeout);\n    }\n  };\n\n  /**\n   * Sends a packet\n   *\n   * @param {Object} packet object.\n   * @api private\n   */\n\n  Transport.prototype.packet = function (packet) {\n    this.send(io.parser.encodePacket(packet));\n  };\n\n  /**\n   * Send the received heartbeat message back to server. So the server\n   * knows we are still connected.\n   *\n   * @param {String} heartbeat Heartbeat response from the server.\n   * @api private\n   */\n\n  Transport.prototype.onHeartbeat = function (heartbeat) {\n    this.packet({ type: 'heartbeat' });\n  };\n \n  /**\n   * Called when the transport opens.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onOpen = function () {\n    this.open = true;\n    this.clearCloseTimeout();\n    this.socket.onOpen();\n  };\n\n  /**\n   * Notifies the base when the connection with the Socket.IO server\n   * has been disconnected.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onClose = function () {\n    var self = this;\n\n    /* FIXME: reopen delay causing a infinit loop\n    this.reopenTimeout = setTimeout(function () {\n      self.open();\n    }, this.socket.options['reopen delay']);*/\n\n    this.open = false;\n    this.socket.onClose();\n    this.onDisconnect();\n  };\n\n  /**\n   * Generates a connection url based on the Socket.IO URL Protocol.\n   * See <https://github.com/learnboost/socket.io-node/> for more details.\n   *\n   * @returns {String} Connection url\n   * @api private\n   */\n\n  Transport.prototype.prepareUrl = function () {\n    var options = this.socket.options;\n\n    return this.scheme() + '://'\n      + options.host + ':' + options.port + '/'\n      + options.resource + '/' + io.protocol\n      + '/' + this.name + '/' + this.sessid;\n  };\n\n  /**\n   * Checks if the transport is ready to start a connection.\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  Transport.prototype.ready = function (socket, fn) {\n    fn.call(this);\n  };\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.Socket = Socket;\n\n  /**\n   * Create a new `Socket.IO client` which can establish a persistent\n   * connection with a Socket.IO enabled server.\n   *\n   * @api public\n   */\n\n  function Socket (options) {\n    this.options = {\n        port: 80\n      , secure: false\n      , document: 'document' in global ? document : false\n      , resource: 'socket.io'\n      , transports: io.transports\n      , 'connect timeout': 10000\n      , 'try multiple transports': true\n      , 'reconnect': true\n      , 'reconnection delay': 500\n      , 'reconnection limit': Infinity\n      , 'reopen delay': 3000\n      , 'max reconnection attempts': 10\n      , 'sync disconnect on unload': true\n      , 'auto connect': true\n      , 'flash policy port': 10843\n    };\n\n    io.util.merge(this.options, options);\n\n    this.connected = false;\n    this.open = false;\n    this.connecting = false;\n    this.reconnecting = false;\n    this.namespaces = {};\n    this.buffer = [];\n    this.doBuffer = false;\n\n    if (this.options['sync disconnect on unload'] &&\n        (!this.isXDomain() || io.util.ua.hasCORS)) {\n      var self = this;\n\n      io.util.on(global, 'unload', function () {\n        self.disconnectSync();\n      }, false);\n    }\n\n    if (this.options['auto connect']) {\n      this.connect();\n    }\n};\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(Socket, io.EventEmitter);\n\n  /**\n   * Returns a namespace listener/emitter for this socket\n   *\n   * @api public\n   */\n\n  Socket.prototype.of = function (name) {\n    if (!this.namespaces[name]) {\n      this.namespaces[name] = new io.SocketNamespace(this, name);\n\n      if (name !== '') {\n        this.namespaces[name].packet({ type: 'connect' });\n      }\n    }\n\n    return this.namespaces[name];\n  };\n\n  /**\n   * Emits the given event to the Socket and all namespaces\n   *\n   * @api private\n   */\n\n  Socket.prototype.publish = function () {\n    this.emit.apply(this, arguments);\n\n    var nsp;\n\n    for (var i in this.namespaces) {\n      if (this.namespaces.hasOwnProperty(i)) {\n        nsp = this.of(i);\n        nsp.$emit.apply(nsp, arguments);\n      }\n    }\n  };\n\n  /**\n   * Performs the handshake\n   *\n   * @api private\n   */\n\n  function empty () { };\n\n  Socket.prototype.handshake = function (fn) {\n    var self = this\n      , options = this.options;\n\n    function complete (data) {\n      if (data instanceof Error) {\n        self.onError(data.message);\n      } else {\n        fn.apply(null, data.split(':'));\n      }\n    };\n\n    var url = [\n          'http' + (options.secure ? 's' : '') + ':/'\n        , options.host + ':' + options.port\n        , options.resource\n        , io.protocol\n        , io.util.query(this.options.query, 't=' + +new Date)\n      ].join('/');\n\n    if (this.isXDomain() && !io.util.ua.hasCORS) {\n      var insertAt = document.getElementsByTagName('script')[0]\n        , script = document.createElement('script');\n\n      script.src = url + '&jsonp=' + io.j.length;\n      insertAt.parentNode.insertBefore(script, insertAt);\n\n      io.j.push(function (data) {\n        complete(data);\n        script.parentNode.removeChild(script);\n      });\n    } else {\n      var xhr = io.util.request();\n\n      xhr.open('GET', url, true);\n      xhr.withCredentials = true;\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState == 4) {\n          xhr.onreadystatechange = empty;\n\n          if (xhr.status == 200) {\n            complete(xhr.responseText);\n          } else {\n            !self.reconnecting && self.onError(xhr.responseText);\n          }\n        }\n      };\n      xhr.send(null);\n    }\n  };\n\n  /**\n   * Find an available transport based on the options supplied in the constructor.\n   *\n   * @api private\n   */\n\n  Socket.prototype.getTransport = function (override) {\n    var transports = override || this.transports, match;\n\n    for (var i = 0, transport; transport = transports[i]; i++) {\n      if (io.Transport[transport]\n        && io.Transport[transport].check(this)\n        && (!this.isXDomain() || io.Transport[transport].xdomainCheck())) {\n        return new io.Transport[transport](this, this.sessionid);\n      }\n    }\n\n    return null;\n  };\n\n  /**\n   * Connects to the server.\n   *\n   * @param {Function} [fn] Callback.\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.connect = function (fn) {\n    if (this.connecting) {\n      return this;\n    }\n\n    var self = this;\n\n    this.handshake(function (sid, heartbeat, close, transports) {\n      self.sessionid = sid;\n      self.closeTimeout = close * 1000;\n      self.heartbeatTimeout = heartbeat * 1000;\n      self.transports = transports ? io.util.intersect(\n          transports.split(',')\n        , self.options.transports\n      ) : self.options.transports;\n\n      self.setHeartbeatTimeout();\n\n      function connect (transports){\n        if (self.transport) self.transport.clearTimeouts();\n\n        self.transport = self.getTransport(transports);\n        if (!self.transport) return self.publish('connect_failed');\n\n        // once the transport is ready\n        self.transport.ready(self, function () {\n          self.connecting = true;\n          self.publish('connecting', self.transport.name);\n          self.transport.open();\n\n          if (self.options['connect timeout']) {\n            self.connectTimeoutTimer = setTimeout(function () {\n              if (!self.connected) {\n                self.connecting = false;\n\n                if (self.options['try multiple transports']) {\n                  if (!self.remainingTransports) {\n                    self.remainingTransports = self.transports.slice(0);\n                  }\n\n                  var remaining = self.remainingTransports;\n\n                  while (remaining.length > 0 && remaining.splice(0,1)[0] !=\n                         self.transport.name) {}\n\n                    if (remaining.length){\n                      connect(remaining);\n                    } else {\n                      self.publish('connect_failed');\n                    }\n                }\n              }\n            }, self.options['connect timeout']);\n          }\n        });\n      }\n\n      connect(self.transports);\n\n      self.once('connect', function (){\n        clearTimeout(self.connectTimeoutTimer);\n\n        fn && typeof fn == 'function' && fn();\n      });\n    });\n\n    return this;\n  };\n\n  /**\n   * Clears and sets a new heartbeat timeout using the value given by the\n   * server during the handshake.\n   *\n   * @api private\n   */\n\n  Socket.prototype.setHeartbeatTimeout = function () {\n    clearTimeout(this.heartbeatTimeoutTimer);\n\n    var self = this;\n    this.heartbeatTimeoutTimer = setTimeout(function () {\n      self.transport.onClose();\n    }, this.heartbeatTimeout);\n  };\n\n  /**\n   * Sends a message.\n   *\n   * @param {Object} data packet.\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.packet = function (data) {\n    if (this.connected && !this.doBuffer) {\n      this.transport.packet(data);\n    } else {\n      this.buffer.push(data);\n    }\n\n    return this;\n  };\n\n  /**\n   * Sets buffer state\n   *\n   * @api private\n   */\n\n  Socket.prototype.setBuffer = function (v) {\n    this.doBuffer = v;\n\n    if (!v && this.connected && this.buffer.length) {\n      this.transport.payload(this.buffer);\n      this.buffer = [];\n    }\n  };\n\n  /**\n   * Disconnect the established connect.\n   *\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.disconnect = function () {\n    if (this.connected || this.connecting) {\n      if (this.open) {\n        this.of('').packet({ type: 'disconnect' });\n      }\n\n      // handle disconnection immediately\n      this.onDisconnect('booted');\n    }\n\n    return this;\n  };\n\n  /**\n   * Disconnects the socket with a sync XHR.\n   *\n   * @api private\n   */\n\n  Socket.prototype.disconnectSync = function () {\n    // ensure disconnection\n    var xhr = io.util.request()\n      , uri = this.resource + '/' + io.protocol + '/' + this.sessionid;\n\n    xhr.open('GET', uri, true);\n\n    // handle disconnection immediately\n    this.onDisconnect('booted');\n  };\n\n  /**\n   * Check if we need to use cross domain enabled transports. Cross domain would\n   * be a different port or different domain name.\n   *\n   * @returns {Boolean}\n   * @api private\n   */\n\n  Socket.prototype.isXDomain = function () {\n\n    var port = global.location.port ||\n      ('https:' == global.location.protocol ? 443 : 80);\n\n    return this.options.host !== global.location.hostname \n      || this.options.port != port;\n  };\n\n  /**\n   * Called upon handshake.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onConnect = function () {\n    if (!this.connected) {\n      this.connected = true;\n      this.connecting = false;\n      if (!this.doBuffer) {\n        // make sure to flush the buffer\n        this.setBuffer(false);\n      }\n      this.emit('connect');\n    }\n  };\n\n  /**\n   * Called when the transport opens\n   *\n   * @api private\n   */\n\n  Socket.prototype.onOpen = function () {\n    this.open = true;\n  };\n\n  /**\n   * Called when the transport closes.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onClose = function () {\n    this.open = false;\n    clearTimeout(this.heartbeatTimeoutTimer);\n  };\n\n  /**\n   * Called when the transport first opens a connection\n   *\n   * @param text\n   */\n\n  Socket.prototype.onPacket = function (packet) {\n    this.of(packet.endpoint).onPacket(packet);\n  };\n\n  /**\n   * Handles an error.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onError = function (err) {\n    if (err && err.advice) {\n      if (err.advice === 'reconnect' && (this.connected || this.connecting)) {\n        this.disconnect();\n        if (this.options.reconnect) {\n          this.reconnect();\n        }\n      }\n    }\n\n    this.publish('error', err && err.reason ? err.reason : err);\n  };\n\n  /**\n   * Called when the transport disconnects.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onDisconnect = function (reason) {\n    var wasConnected = this.connected\n      , wasConnecting = this.connecting;\n\n    this.connected = false;\n    this.connecting = false;\n    this.open = false;\n\n    if (wasConnected || wasConnecting) {\n      this.transport.close();\n      this.transport.clearTimeouts();\n      if (wasConnected) {\n        this.publish('disconnect', reason);\n\n        if ('booted' != reason && this.options.reconnect && !this.reconnecting) {\n          this.reconnect();\n        }\n      }\n    }\n  };\n\n  /**\n   * Called upon reconnection.\n   *\n   * @api private\n   */\n\n  Socket.prototype.reconnect = function () {\n    this.reconnecting = true;\n    this.reconnectionAttempts = 0;\n    this.reconnectionDelay = this.options['reconnection delay'];\n\n    var self = this\n      , maxAttempts = this.options['max reconnection attempts']\n      , tryMultiple = this.options['try multiple transports']\n      , limit = this.options['reconnection limit'];\n\n    function reset () {\n      if (self.connected) {\n        for (var i in self.namespaces) {\n          if (self.namespaces.hasOwnProperty(i) && '' !== i) {\n              self.namespaces[i].packet({ type: 'connect' });\n          }\n        }\n        self.publish('reconnect', self.transport.name, self.reconnectionAttempts);\n      }\n\n      clearTimeout(self.reconnectionTimer);\n\n      self.removeListener('connect_failed', maybeReconnect);\n      self.removeListener('connect', maybeReconnect);\n\n      self.reconnecting = false;\n\n      delete self.reconnectionAttempts;\n      delete self.reconnectionDelay;\n      delete self.reconnectionTimer;\n      delete self.redoTransports;\n\n      self.options['try multiple transports'] = tryMultiple;\n    };\n\n    function maybeReconnect () {\n      if (!self.reconnecting) {\n        return;\n      }\n\n      if (self.connected) {\n        return reset();\n      };\n\n      if (self.connecting && self.reconnecting) {\n        return self.reconnectionTimer = setTimeout(maybeReconnect, 1000);\n      }\n\n      if (self.reconnectionAttempts++ >= maxAttempts) {\n        if (!self.redoTransports) {\n          self.on('connect_failed', maybeReconnect);\n          self.options['try multiple transports'] = true;\n          self.transport = self.getTransport();\n          self.redoTransports = true;\n          self.connect();\n        } else {\n          self.publish('reconnect_failed');\n          reset();\n        }\n      } else {\n        if (self.reconnectionDelay < limit) {\n          self.reconnectionDelay *= 2; // exponential back off\n        }\n\n        self.connect();\n        self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts);\n        self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay);\n      }\n    };\n\n    this.options['try multiple transports'] = false;\n    this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay);\n\n    this.on('connect', maybeReconnect);\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.SocketNamespace = SocketNamespace;\n\n  /**\n   * Socket namespace constructor.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function SocketNamespace (socket, name) {\n    this.socket = socket;\n    this.name = name || '';\n    this.flags = {};\n    this.json = new Flag(this, 'json');\n    this.ackPackets = 0;\n    this.acks = {};\n  };\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(SocketNamespace, io.EventEmitter);\n\n  /**\n   * Copies emit since we override it\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit;\n\n  /**\n   * Creates a new namespace, by proxying the request to the socket. This\n   * allows us to use the synax as we do on the server.\n   *\n   * @api public\n   */\n\n  SocketNamespace.prototype.of = function () {\n    return this.socket.of.apply(this.socket, arguments);\n  };\n\n  /**\n   * Sends a packet.\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.packet = function (packet) {\n    packet.endpoint = this.name;\n    this.socket.packet(packet);\n    this.flags = {};\n    return this;\n  };\n\n  /**\n   * Sends a message\n   *\n   * @api public\n   */\n\n  SocketNamespace.prototype.send = function (data, fn) {\n    var packet = {\n        type: this.flags.json ? 'json' : 'message'\n      , data: data\n    };\n\n    if ('function' == typeof fn) {\n      packet.id = ++this.ackPackets;\n      packet.ack = true;\n      this.acks[packet.id] = fn;\n    }\n\n    return this.packet(packet);\n  };\n\n  /**\n   * Emits an event\n   *\n   * @api public\n   */\n  \n  SocketNamespace.prototype.emit = function (name) {\n    var args = Array.prototype.slice.call(arguments, 1)\n      , lastArg = args[args.length - 1]\n      , packet = {\n            type: 'event'\n          , name: name\n        };\n\n    if ('function' == typeof lastArg) {\n      packet.id = ++this.ackPackets;\n      packet.ack = 'data';\n      this.acks[packet.id] = lastArg;\n      args = args.slice(0, args.length - 1);\n    }\n\n    packet.args = args;\n\n    return this.packet(packet);\n  };\n\n  /**\n   * Disconnects the namespace\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.disconnect = function () {\n    if (this.name === '') {\n      this.socket.disconnect();\n    } else {\n      this.packet({ type: 'disconnect' });\n      this.$emit('disconnect');\n    }\n\n    return this;\n  };\n\n  /**\n   * Handles a packet\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.onPacket = function (packet) {\n    var self = this;\n\n    function ack () {\n      self.packet({\n          type: 'ack'\n        , args: io.util.toArray(arguments)\n        , ackId: packet.id\n      });\n    };\n\n    switch (packet.type) {\n      case 'connect':\n        this.$emit('connect');\n        break;\n\n      case 'disconnect':\n        if (this.name === '') {\n          this.socket.onDisconnect(packet.reason || 'booted');\n        } else {\n          this.$emit('disconnect', packet.reason);\n        }\n        break;\n\n      case 'message':\n      case 'json':\n        var params = ['message', packet.data];\n\n        if (packet.ack == 'data') {\n          params.push(ack);\n        } else if (packet.ack) {\n          this.packet({ type: 'ack', ackId: packet.id });\n        }\n\n        this.$emit.apply(this, params);\n        break;\n\n      case 'event':\n        var params = [packet.name].concat(packet.args);\n\n        if (packet.ack == 'data')\n          params.push(ack);\n\n        this.$emit.apply(this, params);\n        break;\n\n      case 'ack':\n        if (this.acks[packet.ackId]) {\n          this.acks[packet.ackId].apply(this, packet.args);\n          delete this.acks[packet.ackId];\n        }\n        break;\n\n      case 'error':\n        if (packet.advice){\n          this.socket.onError(packet);\n        } else {\n          if (packet.reason == 'unauthorized') {\n            this.$emit('connect_failed', packet.reason);\n          } else {\n            this.$emit('error', packet.reason);\n          }\n        }\n        break;\n    }\n  };\n\n  /**\n   * Flag interface.\n   *\n   * @api private\n   */\n\n  function Flag (nsp, name) {\n    this.namespace = nsp;\n    this.name = name;\n  };\n\n  /**\n   * Send a message\n   *\n   * @api public\n   */\n\n  Flag.prototype.send = function () {\n    this.namespace.flags[this.name] = true;\n    this.namespace.send.apply(this.namespace, arguments);\n  };\n\n  /**\n   * Emit an event\n   *\n   * @api public\n   */\n\n  Flag.prototype.emit = function () {\n    this.namespace.flags[this.name] = true;\n    this.namespace.emit.apply(this.namespace, arguments);\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.websocket = WS;\n\n  /**\n   * The WebSocket transport uses the HTML5 WebSocket API to establish an\n   * persistent connection with the Socket.IO server. This transport will also\n   * be inherited by the FlashSocket fallback as it provides a API compatible\n   * polyfill for the WebSockets.\n   *\n   * @constructor\n   * @extends {io.Transport}\n   * @api public\n   */\n\n  function WS (socket) {\n    io.Transport.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from Transport.\n   */\n\n  io.util.inherit(WS, io.Transport);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  WS.prototype.name = 'websocket';\n\n  /**\n   * Initializes a new `WebSocket` connection with the Socket.IO server. We attach\n   * all the appropriate listeners to handle the responses from the server.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.open = function () {\n    var query = io.util.query(this.socket.options.query)\n      , self = this\n      , Socket\n\n\n    if (!Socket) {\n      Socket = global.MozWebSocket || global.WebSocket;\n    }\n\n    this.websocket = new Socket(this.prepareUrl() + query);\n\n    this.websocket.onopen = function () {\n      self.onOpen();\n      self.socket.setBuffer(false);\n    };\n    this.websocket.onmessage = function (ev) {\n      self.onData(ev.data);\n    };\n    this.websocket.onclose = function () {\n      self.onClose();\n      self.socket.setBuffer(true);\n    };\n    this.websocket.onerror = function (e) {\n      self.onError(e);\n    };\n\n    return this;\n  };\n\n  /**\n   * Send a message to the Socket.IO server. The message will automatically be\n   * encoded in the correct message format.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.send = function (data) {\n    this.websocket.send(data);\n    return this;\n  };\n\n  /**\n   * Payload\n   *\n   * @api private\n   */\n\n  WS.prototype.payload = function (arr) {\n    for (var i = 0, l = arr.length; i < l; i++) {\n      this.packet(arr[i]);\n    }\n    return this;\n  };\n\n  /**\n   * Disconnect the established `WebSocket` connection.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.close = function () {\n    this.websocket.close();\n    return this;\n  };\n\n  /**\n   * Handle the errors that `WebSocket` might be giving when we\n   * are attempting to connect or send messages.\n   *\n   * @param {Error} e The error.\n   * @api private\n   */\n\n  WS.prototype.onError = function (e) {\n    this.socket.onError(e);\n  };\n\n  /**\n   * Returns the appropriate scheme for the URI generation.\n   *\n   * @api private\n   */\n  WS.prototype.scheme = function () {\n    return this.socket.options.secure ? 'wss' : 'ws';\n  };\n\n  /**\n   * Checks if the browser has support for native `WebSockets` and that\n   * it's not the polyfill created for the FlashSocket transport.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  WS.check = function () {\n    return ('WebSocket' in global && !('__addTask' in WebSocket))\n          || 'MozWebSocket' in global;\n  };\n\n  /**\n   * Check if the `WebSocket` transport support cross domain communications.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  WS.xdomainCheck = function () {\n    return true;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('websocket');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   *\n   * @api public\n   */\n\n  exports.XHR = XHR;\n\n  /**\n   * XHR constructor\n   *\n   * @costructor\n   * @api public\n   */\n\n  function XHR (socket) {\n    if (!socket) return;\n\n    io.Transport.apply(this, arguments);\n    this.sendBuffer = [];\n  };\n\n  /**\n   * Inherits from Transport.\n   */\n\n  io.util.inherit(XHR, io.Transport);\n\n  /**\n   * Establish a connection\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.open = function () {\n    this.socket.setBuffer(false);\n    this.onOpen();\n    this.get();\n\n    // we need to make sure the request succeeds since we have no indication\n    // whether the request opened or not until it succeeded.\n    this.setCloseTimeout();\n\n    return this;\n  };\n\n  /**\n   * Check if we need to send data to the Socket.IO server, if we have data in our\n   * buffer we encode it and forward it to the `post` method.\n   *\n   * @api private\n   */\n\n  XHR.prototype.payload = function (payload) {\n    var msgs = [];\n\n    for (var i = 0, l = payload.length; i < l; i++) {\n      msgs.push(io.parser.encodePacket(payload[i]));\n    }\n\n    this.send(io.parser.encodePayload(msgs));\n  };\n\n  /**\n   * Send data to the Socket.IO server.\n   *\n   * @param data The message\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.send = function (data) {\n    this.post(data);\n    return this;\n  };\n\n  /**\n   * Posts a encoded message to the Socket.IO server.\n   *\n   * @param {String} data A encoded message.\n   * @api private\n   */\n\n  function empty () { };\n\n  XHR.prototype.post = function (data) {\n    var self = this;\n    this.socket.setBuffer(true);\n\n    function stateChange () {\n      if (this.readyState == 4) {\n        this.onreadystatechange = empty;\n        self.posting = false;\n\n        if (this.status == 200){\n          self.socket.setBuffer(false);\n        } else {\n          self.onClose();\n        }\n      }\n    }\n\n    function onload () {\n      this.onload = empty;\n      self.socket.setBuffer(false);\n    };\n\n    this.sendXHR = this.request('POST');\n\n    if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) {\n      this.sendXHR.onload = this.sendXHR.onerror = onload;\n    } else {\n      this.sendXHR.onreadystatechange = stateChange;\n    }\n\n    this.sendXHR.send(data);\n  };\n\n  /**\n   * Disconnects the established `XHR` connection.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.close = function () {\n    this.onClose();\n    return this;\n  };\n\n  /**\n   * Generates a configured XHR request\n   *\n   * @param {String} url The url that needs to be requested.\n   * @param {String} method The method the request should use.\n   * @returns {XMLHttpRequest}\n   * @api private\n   */\n\n  XHR.prototype.request = function (method) {\n    var req = io.util.request(this.socket.isXDomain())\n      , query = io.util.query(this.socket.options.query, 't=' + +new Date);\n\n    req.open(method || 'GET', this.prepareUrl() + query, true);\n\n    if (method == 'POST') {\n      try {\n        if (req.setRequestHeader) {\n          req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        } else {\n          // XDomainRequest\n          req.contentType = 'text/plain';\n        }\n      } catch (e) {}\n    }\n\n    return req;\n  };\n\n  /**\n   * Returns the scheme to use for the transport URLs.\n   *\n   * @api private\n   */\n\n  XHR.prototype.scheme = function () {\n    return this.socket.options.secure ? 'https' : 'http';\n  };\n\n  /**\n   * Check if the XHR transports are supported\n   *\n   * @param {Boolean} xdomain Check if we support cross domain requests.\n   * @returns {Boolean}\n   * @api public\n   */\n\n  XHR.check = function (socket, xdomain) {\n    try {\n      var request = io.util.request(xdomain),\n          usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest),\n          socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'),\n          isXProtocol = (socketProtocol != global.location.protocol);\n      if (request && !(usesXDomReq && isXProtocol)) {\n        return true;\n      }\n    } catch(e) {}\n\n    return false;\n  };\n\n  /**\n   * Check if the XHR transport supports cross domain requests.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  XHR.xdomainCheck = function () {\n    return XHR.check(null, true);\n  };\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.htmlfile = HTMLFile;\n\n  /**\n   * The HTMLFile transport creates a `forever iframe` based transport\n   * for Internet Explorer. Regular forever iframe implementations will \n   * continuously trigger the browsers buzy indicators. If the forever iframe\n   * is created inside a `htmlfile` these indicators will not be trigged.\n   *\n   * @constructor\n   * @extends {io.Transport.XHR}\n   * @api public\n   */\n\n  function HTMLFile (socket) {\n    io.Transport.XHR.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from XHR transport.\n   */\n\n  io.util.inherit(HTMLFile, io.Transport.XHR);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  HTMLFile.prototype.name = 'htmlfile';\n\n  /**\n   * Creates a new Ac...eX `htmlfile` with a forever loading iframe\n   * that can be used to listen to messages. Inside the generated\n   * `htmlfile` a reference will be made to the HTMLFile transport.\n   *\n   * @api private\n   */\n\n  HTMLFile.prototype.get = function () {\n    this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n    this.doc.open();\n    this.doc.write('<html></html>');\n    this.doc.close();\n    this.doc.parentWindow.s = this;\n\n    var iframeC = this.doc.createElement('div');\n    iframeC.className = 'socketio';\n\n    this.doc.body.appendChild(iframeC);\n    this.iframe = this.doc.createElement('iframe');\n\n    iframeC.appendChild(this.iframe);\n\n    var self = this\n      , query = io.util.query(this.socket.options.query, 't='+ +new Date);\n\n    this.iframe.src = this.prepareUrl() + query;\n\n    io.util.on(window, 'unload', function () {\n      self.destroy();\n    });\n  };\n\n  /**\n   * The Socket.IO server will write script tags inside the forever\n   * iframe, this function will be used as callback for the incoming\n   * information.\n   *\n   * @param {String} data The message\n   * @param {document} doc Reference to the context\n   * @api private\n   */\n\n  HTMLFile.prototype._ = function (data, doc) {\n    this.onData(data);\n    try {\n      var script = doc.getElementsByTagName('script')[0];\n      script.parentNode.removeChild(script);\n    } catch (e) { }\n  };\n\n  /**\n   * Destroy the established connection, iframe and `htmlfile`.\n   * And calls the `CollectGarbage` function of Internet Explorer\n   * to release the memory.\n   *\n   * @api private\n   */\n\n  HTMLFile.prototype.destroy = function () {\n    if (this.iframe){\n      try {\n        this.iframe.src = 'about:blank';\n      } catch(e){}\n\n      this.doc = null;\n      this.iframe.parentNode.removeChild(this.iframe);\n      this.iframe = null;\n\n      CollectGarbage();\n    }\n  };\n\n  /**\n   * Disconnects the established connection.\n   *\n   * @returns {Transport} Chaining.\n   * @api public\n   */\n\n  HTMLFile.prototype.close = function () {\n    this.destroy();\n    return io.Transport.XHR.prototype.close.call(this);\n  };\n\n  /**\n   * Checks if the browser supports this transport. The browser\n   * must have an `Ac...eXObject` implementation.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  HTMLFile.check = function () {\n    if (typeof window != \"undefined\" && (['Active'].concat('Object').join('X')) in window){\n      try {\n        var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n        return a && io.Transport.XHR.check();\n      } catch(e){}\n    }\n    return false;\n  };\n\n  /**\n   * Check if cross domain requests are supported.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  HTMLFile.xdomainCheck = function () {\n    // we can probably do handling for sub-domains, we should\n    // test that it's cross domain but a subdomain here\n    return false;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('htmlfile');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports['xhr-polling'] = XHRPolling;\n\n  /**\n   * The XHR-polling transport uses long polling XHR requests to create a\n   * \"persistent\" connection with the server.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function XHRPolling () {\n    io.Transport.XHR.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from XHR transport.\n   */\n\n  io.util.inherit(XHRPolling, io.Transport.XHR);\n\n  /**\n   * Merge the properties from XHR transport\n   */\n\n  io.util.merge(XHRPolling, io.Transport.XHR);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  XHRPolling.prototype.name = 'xhr-polling';\n\n  /** \n   * Establish a connection, for iPhone and Android this will be done once the page\n   * is loaded.\n   *\n   * @returns {Transport} Chaining.\n   * @api public\n   */\n\n  XHRPolling.prototype.open = function () {\n    var self = this;\n\n    io.Transport.XHR.prototype.open.call(self);\n    return false;\n  };\n\n  /**\n   * Starts a XHR request to wait for incoming messages.\n   *\n   * @api private\n   */\n\n  function empty () {};\n\n  XHRPolling.prototype.get = function () {\n    if (!this.open) return;\n\n    var self = this;\n\n    function stateChange () {\n      if (this.readyState == 4) {\n        this.onreadystatechange = empty;\n\n        if (this.status == 200) {\n          self.onData(this.responseText);\n          self.get();\n        } else {\n          self.onClose();\n        }\n      }\n    };\n\n    function onload () {\n      this.onload = empty;\n      this.onerror = empty;\n      self.onData(this.responseText);\n      self.get();\n    };\n\n    function onerror () {\n      self.onClose();\n    };\n\n    this.xhr = this.request();\n\n    if (global.XDomainRequest && this.xhr instanceof XDomainRequest) {\n      this.xhr.onload = onload;\n      this.xhr.onerror = onerror;\n    } else {\n      this.xhr.onreadystatechange = stateChange;\n    }\n\n    this.xhr.send(null);\n  };\n\n  /**\n   * Handle the unclean close behavior.\n   *\n   * @api private\n   */\n\n  XHRPolling.prototype.onClose = function () {\n    io.Transport.XHR.prototype.onClose.call(this);\n\n    if (this.xhr) {\n      this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty;\n      try {\n        this.xhr.abort();\n      } catch(e){}\n      this.xhr = null;\n    }\n  };\n\n  /**\n   * Webkit based browsers show a infinit spinner when you start a XHR request\n   * before the browsers onload event is called so we need to defer opening of\n   * the transport until the onload event is called. Wrapping the cb in our\n   * defer method solve this.\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  XHRPolling.prototype.ready = function (socket, fn) {\n    var self = this;\n\n    io.util.defer(function () {\n      fn.call(self);\n    });\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('xhr-polling');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n  /**\n   * There is a way to hide the loading indicator in Firefox. If you create and\n   * remove a iframe it will stop showing the current loading indicator.\n   * Unfortunately we can't feature detect that and UA sniffing is evil.\n   *\n   * @api private\n   */\n\n  var indicator = global.document && \"MozAppearance\" in\n    global.document.documentElement.style;\n\n  /**\n   * Expose constructor.\n   */\n\n  exports['jsonp-polling'] = JSONPPolling;\n\n  /**\n   * The JSONP transport creates an persistent connection by dynamically\n   * inserting a script tag in the page. This script tag will receive the\n   * information of the Socket.IO server. When new information is received\n   * it creates a new script tag for the new data stream.\n   *\n   * @constructor\n   * @extends {io.Transport.xhr-polling}\n   * @api public\n   */\n\n  function JSONPPolling (socket) {\n    io.Transport['xhr-polling'].apply(this, arguments);\n\n    this.index = io.j.length;\n\n    var self = this;\n\n    io.j.push(function (msg) {\n      self._(msg);\n    });\n  };\n\n  /**\n   * Inherits from XHR polling transport.\n   */\n\n  io.util.inherit(JSONPPolling, io.Transport['xhr-polling']);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  JSONPPolling.prototype.name = 'jsonp-polling';\n\n  /**\n   * Posts a encoded message to the Socket.IO server using an iframe.\n   * The iframe is used because script tags can create POST based requests.\n   * The iframe is positioned outside of the view so the user does not\n   * notice it's existence.\n   *\n   * @param {String} data A encoded message.\n   * @api private\n   */\n\n  JSONPPolling.prototype.post = function (data) {\n    var self = this\n      , query = io.util.query(\n             this.socket.options.query\n          , 't='+ (+new Date) + '&i=' + this.index\n        );\n\n    if (!this.form) {\n      var form = document.createElement('form')\n        , area = document.createElement('textarea')\n        , id = this.iframeId = 'socketio_iframe_' + this.index\n        , iframe;\n\n      form.className = 'socketio';\n      form.style.position = 'absolute';\n      form.style.top = '0px';\n      form.style.left = '0px';\n      form.style.display = 'none';\n      form.target = id;\n      form.method = 'POST';\n      form.setAttribute('accept-charset', 'utf-8');\n      area.name = 'd';\n      form.appendChild(area);\n      document.body.appendChild(form);\n\n      this.form = form;\n      this.area = area;\n    }\n\n    this.form.action = this.prepareUrl() + query;\n\n    function complete () {\n      initIframe();\n      self.socket.setBuffer(false);\n    };\n\n    function initIframe () {\n      if (self.iframe) {\n        self.form.removeChild(self.iframe);\n      }\n\n      try {\n        // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n        iframe = document.createElement('<iframe name=\"'+ self.iframeId +'\">');\n      } catch (e) {\n        iframe = document.createElement('iframe');\n        iframe.name = self.iframeId;\n      }\n\n      iframe.id = self.iframeId;\n\n      self.form.appendChild(iframe);\n      self.iframe = iframe;\n    };\n\n    initIframe();\n\n    // we temporarily stringify until we figure out how to prevent\n    // browsers from turning `\\n` into `\\r\\n` in form inputs\n    this.area.value = io.JSON.stringify(data);\n\n    try {\n      this.form.submit();\n    } catch(e) {}\n\n    if (this.iframe.attachEvent) {\n      iframe.onreadystatechange = function () {\n        if (self.iframe.readyState == 'complete') {\n          complete();\n        }\n      };\n    } else {\n      this.iframe.onload = complete;\n    }\n\n    this.socket.setBuffer(true);\n  };\n  \n  /**\n   * Creates a new JSONP poll that can be used to listen\n   * for messages from the Socket.IO server.\n   *\n   * @api private\n   */\n\n  JSONPPolling.prototype.get = function () {\n    var self = this\n      , script = document.createElement('script')\n      , query = io.util.query(\n             this.socket.options.query\n          , 't='+ (+new Date) + '&i=' + this.index\n        );\n\n    if (this.script) {\n      this.script.parentNode.removeChild(this.script);\n      this.script = null;\n    }\n\n    script.async = true;\n    script.src = this.prepareUrl() + query;\n    script.onerror = function () {\n      self.onClose();\n    };\n\n    var insertAt = document.getElementsByTagName('script')[0]\n    insertAt.parentNode.insertBefore(script, insertAt);\n    this.script = script;\n\n    if (indicator) {\n      setTimeout(function () {\n        var iframe = document.createElement('iframe');\n        document.body.appendChild(iframe);\n        document.body.removeChild(iframe);\n      }, 100);\n    }\n  };\n\n  /**\n   * Callback function for the incoming message stream from the Socket.IO server.\n   *\n   * @param {String} data The message\n   * @api private\n   */\n\n  JSONPPolling.prototype._ = function (msg) {\n    this.onData(msg);\n    if (this.open) {\n      this.get();\n    }\n    return this;\n  };\n\n  /**\n   * The indicator hack only works after onload\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  JSONPPolling.prototype.ready = function (socket, fn) {\n    var self = this;\n    if (!indicator) return fn.call(this);\n\n    io.util.load(function () {\n      fn.call(self);\n    });\n  };\n\n  /**\n   * Checks if browser supports this transport.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  JSONPPolling.check = function () {\n    return 'document' in global;\n  };\n\n  /**\n   * Check if cross domain requests are supported\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  JSONPPolling.xdomainCheck = function () {\n    return true;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('jsonp-polling');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n"
  },
  {
    "path": "ppt/think-in-css/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:\"\\f000\"}.fa-music:before{content:\"\\f001\"}.fa-search:before{content:\"\\f002\"}.fa-envelope-o:before{content:\"\\f003\"}.fa-heart:before{content:\"\\f004\"}.fa-star:before{content:\"\\f005\"}.fa-star-o:before{content:\"\\f006\"}.fa-user:before{content:\"\\f007\"}.fa-film:before{content:\"\\f008\"}.fa-th-large:before{content:\"\\f009\"}.fa-th:before{content:\"\\f00a\"}.fa-th-list:before{content:\"\\f00b\"}.fa-check:before{content:\"\\f00c\"}.fa-remove:before,.fa-close:before,.fa-times:before{content:\"\\f00d\"}.fa-search-plus:before{content:\"\\f00e\"}.fa-search-minus:before{content:\"\\f010\"}.fa-power-off:before{content:\"\\f011\"}.fa-signal:before{content:\"\\f012\"}.fa-gear:before,.fa-cog:before{content:\"\\f013\"}.fa-trash-o:before{content:\"\\f014\"}.fa-home:before{content:\"\\f015\"}.fa-file-o:before{content:\"\\f016\"}.fa-clock-o:before{content:\"\\f017\"}.fa-road:before{content:\"\\f018\"}.fa-download:before{content:\"\\f019\"}.fa-arrow-circle-o-down:before{content:\"\\f01a\"}.fa-arrow-circle-o-up:before{content:\"\\f01b\"}.fa-inbox:before{content:\"\\f01c\"}.fa-play-circle-o:before{content:\"\\f01d\"}.fa-rotate-right:before,.fa-repeat:before{content:\"\\f01e\"}.fa-refresh:before{content:\"\\f021\"}.fa-list-alt:before{content:\"\\f022\"}.fa-lock:before{content:\"\\f023\"}.fa-flag:before{content:\"\\f024\"}.fa-headphones:before{content:\"\\f025\"}.fa-volume-off:before{content:\"\\f026\"}.fa-volume-down:before{content:\"\\f027\"}.fa-volume-up:before{content:\"\\f028\"}.fa-qrcode:before{content:\"\\f029\"}.fa-barcode:before{content:\"\\f02a\"}.fa-tag:before{content:\"\\f02b\"}.fa-tags:before{content:\"\\f02c\"}.fa-book:before{content:\"\\f02d\"}.fa-bookmark:before{content:\"\\f02e\"}.fa-print:before{content:\"\\f02f\"}.fa-camera:before{content:\"\\f030\"}.fa-font:before{content:\"\\f031\"}.fa-bold:before{content:\"\\f032\"}.fa-italic:before{content:\"\\f033\"}.fa-text-height:before{content:\"\\f034\"}.fa-text-width:before{content:\"\\f035\"}.fa-align-left:before{content:\"\\f036\"}.fa-align-center:before{content:\"\\f037\"}.fa-align-right:before{content:\"\\f038\"}.fa-align-justify:before{content:\"\\f039\"}.fa-list:before{content:\"\\f03a\"}.fa-dedent:before,.fa-outdent:before{content:\"\\f03b\"}.fa-indent:before{content:\"\\f03c\"}.fa-video-camera:before{content:\"\\f03d\"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:\"\\f03e\"}.fa-pencil:before{content:\"\\f040\"}.fa-map-marker:before{content:\"\\f041\"}.fa-adjust:before{content:\"\\f042\"}.fa-tint:before{content:\"\\f043\"}.fa-edit:before,.fa-pencil-square-o:before{content:\"\\f044\"}.fa-share-square-o:before{content:\"\\f045\"}.fa-check-square-o:before{content:\"\\f046\"}.fa-arrows:before{content:\"\\f047\"}.fa-step-backward:before{content:\"\\f048\"}.fa-fast-backward:before{content:\"\\f049\"}.fa-backward:before{content:\"\\f04a\"}.fa-play:before{content:\"\\f04b\"}.fa-pause:before{content:\"\\f04c\"}.fa-stop:before{content:\"\\f04d\"}.fa-forward:before{content:\"\\f04e\"}.fa-fast-forward:before{content:\"\\f050\"}.fa-step-forward:before{content:\"\\f051\"}.fa-eject:before{content:\"\\f052\"}.fa-chevron-left:before{content:\"\\f053\"}.fa-chevron-right:before{content:\"\\f054\"}.fa-plus-circle:before{content:\"\\f055\"}.fa-minus-circle:before{content:\"\\f056\"}.fa-times-circle:before{content:\"\\f057\"}.fa-check-circle:before{content:\"\\f058\"}.fa-question-circle:before{content:\"\\f059\"}.fa-info-circle:before{content:\"\\f05a\"}.fa-crosshairs:before{content:\"\\f05b\"}.fa-times-circle-o:before{content:\"\\f05c\"}.fa-check-circle-o:before{content:\"\\f05d\"}.fa-ban:before{content:\"\\f05e\"}.fa-arrow-left:before{content:\"\\f060\"}.fa-arrow-right:before{content:\"\\f061\"}.fa-arrow-up:before{content:\"\\f062\"}.fa-arrow-down:before{content:\"\\f063\"}.fa-mail-forward:before,.fa-share:before{content:\"\\f064\"}.fa-expand:before{content:\"\\f065\"}.fa-compress:before{content:\"\\f066\"}.fa-plus:before{content:\"\\f067\"}.fa-minus:before{content:\"\\f068\"}.fa-asterisk:before{content:\"\\f069\"}.fa-exclamation-circle:before{content:\"\\f06a\"}.fa-gift:before{content:\"\\f06b\"}.fa-leaf:before{content:\"\\f06c\"}.fa-fire:before{content:\"\\f06d\"}.fa-eye:before{content:\"\\f06e\"}.fa-eye-slash:before{content:\"\\f070\"}.fa-warning:before,.fa-exclamation-triangle:before{content:\"\\f071\"}.fa-plane:before{content:\"\\f072\"}.fa-calendar:before{content:\"\\f073\"}.fa-random:before{content:\"\\f074\"}.fa-comment:before{content:\"\\f075\"}.fa-magnet:before{content:\"\\f076\"}.fa-chevron-up:before{content:\"\\f077\"}.fa-chevron-down:before{content:\"\\f078\"}.fa-retweet:before{content:\"\\f079\"}.fa-shopping-cart:before{content:\"\\f07a\"}.fa-folder:before{content:\"\\f07b\"}.fa-folder-open:before{content:\"\\f07c\"}.fa-arrows-v:before{content:\"\\f07d\"}.fa-arrows-h:before{content:\"\\f07e\"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:\"\\f080\"}.fa-twitter-square:before{content:\"\\f081\"}.fa-facebook-square:before{content:\"\\f082\"}.fa-camera-retro:before{content:\"\\f083\"}.fa-key:before{content:\"\\f084\"}.fa-gears:before,.fa-cogs:before{content:\"\\f085\"}.fa-comments:before{content:\"\\f086\"}.fa-thumbs-o-up:before{content:\"\\f087\"}.fa-thumbs-o-down:before{content:\"\\f088\"}.fa-star-half:before{content:\"\\f089\"}.fa-heart-o:before{content:\"\\f08a\"}.fa-sign-out:before{content:\"\\f08b\"}.fa-linkedin-square:before{content:\"\\f08c\"}.fa-thumb-tack:before{content:\"\\f08d\"}.fa-external-link:before{content:\"\\f08e\"}.fa-sign-in:before{content:\"\\f090\"}.fa-trophy:before{content:\"\\f091\"}.fa-github-square:before{content:\"\\f092\"}.fa-upload:before{content:\"\\f093\"}.fa-lemon-o:before{content:\"\\f094\"}.fa-phone:before{content:\"\\f095\"}.fa-square-o:before{content:\"\\f096\"}.fa-bookmark-o:before{content:\"\\f097\"}.fa-phone-square:before{content:\"\\f098\"}.fa-twitter:before{content:\"\\f099\"}.fa-facebook:before{content:\"\\f09a\"}.fa-github:before{content:\"\\f09b\"}.fa-unlock:before{content:\"\\f09c\"}.fa-credit-card:before{content:\"\\f09d\"}.fa-rss:before{content:\"\\f09e\"}.fa-hdd-o:before{content:\"\\f0a0\"}.fa-bullhorn:before{content:\"\\f0a1\"}.fa-bell:before{content:\"\\f0f3\"}.fa-certificate:before{content:\"\\f0a3\"}.fa-hand-o-right:before{content:\"\\f0a4\"}.fa-hand-o-left:before{content:\"\\f0a5\"}.fa-hand-o-up:before{content:\"\\f0a6\"}.fa-hand-o-down:before{content:\"\\f0a7\"}.fa-arrow-circle-left:before{content:\"\\f0a8\"}.fa-arrow-circle-right:before{content:\"\\f0a9\"}.fa-arrow-circle-up:before{content:\"\\f0aa\"}.fa-arrow-circle-down:before{content:\"\\f0ab\"}.fa-globe:before{content:\"\\f0ac\"}.fa-wrench:before{content:\"\\f0ad\"}.fa-tasks:before{content:\"\\f0ae\"}.fa-filter:before{content:\"\\f0b0\"}.fa-briefcase:before{content:\"\\f0b1\"}.fa-arrows-alt:before{content:\"\\f0b2\"}.fa-group:before,.fa-users:before{content:\"\\f0c0\"}.fa-chain:before,.fa-link:before{content:\"\\f0c1\"}.fa-cloud:before{content:\"\\f0c2\"}.fa-flask:before{content:\"\\f0c3\"}.fa-cut:before,.fa-scissors:before{content:\"\\f0c4\"}.fa-copy:before,.fa-files-o:before{content:\"\\f0c5\"}.fa-paperclip:before{content:\"\\f0c6\"}.fa-save:before,.fa-floppy-o:before{content:\"\\f0c7\"}.fa-square:before{content:\"\\f0c8\"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:\"\\f0c9\"}.fa-list-ul:before{content:\"\\f0ca\"}.fa-list-ol:before{content:\"\\f0cb\"}.fa-strikethrough:before{content:\"\\f0cc\"}.fa-underline:before{content:\"\\f0cd\"}.fa-table:before{content:\"\\f0ce\"}.fa-magic:before{content:\"\\f0d0\"}.fa-truck:before{content:\"\\f0d1\"}.fa-pinterest:before{content:\"\\f0d2\"}.fa-pinterest-square:before{content:\"\\f0d3\"}.fa-google-plus-square:before{content:\"\\f0d4\"}.fa-google-plus:before{content:\"\\f0d5\"}.fa-money:before{content:\"\\f0d6\"}.fa-caret-down:before{content:\"\\f0d7\"}.fa-caret-up:before{content:\"\\f0d8\"}.fa-caret-left:before{content:\"\\f0d9\"}.fa-caret-right:before{content:\"\\f0da\"}.fa-columns:before{content:\"\\f0db\"}.fa-unsorted:before,.fa-sort:before{content:\"\\f0dc\"}.fa-sort-down:before,.fa-sort-desc:before{content:\"\\f0dd\"}.fa-sort-up:before,.fa-sort-asc:before{content:\"\\f0de\"}.fa-envelope:before{content:\"\\f0e0\"}.fa-linkedin:before{content:\"\\f0e1\"}.fa-rotate-left:before,.fa-undo:before{content:\"\\f0e2\"}.fa-legal:before,.fa-gavel:before{content:\"\\f0e3\"}.fa-dashboard:before,.fa-tachometer:before{content:\"\\f0e4\"}.fa-comment-o:before{content:\"\\f0e5\"}.fa-comments-o:before{content:\"\\f0e6\"}.fa-flash:before,.fa-bolt:before{content:\"\\f0e7\"}.fa-sitemap:before{content:\"\\f0e8\"}.fa-umbrella:before{content:\"\\f0e9\"}.fa-paste:before,.fa-clipboard:before{content:\"\\f0ea\"}.fa-lightbulb-o:before{content:\"\\f0eb\"}.fa-exchange:before{content:\"\\f0ec\"}.fa-cloud-download:before{content:\"\\f0ed\"}.fa-cloud-upload:before{content:\"\\f0ee\"}.fa-user-md:before{content:\"\\f0f0\"}.fa-stethoscope:before{content:\"\\f0f1\"}.fa-suitcase:before{content:\"\\f0f2\"}.fa-bell-o:before{content:\"\\f0a2\"}.fa-coffee:before{content:\"\\f0f4\"}.fa-cutlery:before{content:\"\\f0f5\"}.fa-file-text-o:before{content:\"\\f0f6\"}.fa-building-o:before{content:\"\\f0f7\"}.fa-hospital-o:before{content:\"\\f0f8\"}.fa-ambulance:before{content:\"\\f0f9\"}.fa-medkit:before{content:\"\\f0fa\"}.fa-fighter-jet:before{content:\"\\f0fb\"}.fa-beer:before{content:\"\\f0fc\"}.fa-h-square:before{content:\"\\f0fd\"}.fa-plus-square:before{content:\"\\f0fe\"}.fa-angle-double-left:before{content:\"\\f100\"}.fa-angle-double-right:before{content:\"\\f101\"}.fa-angle-double-up:before{content:\"\\f102\"}.fa-angle-double-down:before{content:\"\\f103\"}.fa-angle-left:before{content:\"\\f104\"}.fa-angle-right:before{content:\"\\f105\"}.fa-angle-up:before{content:\"\\f106\"}.fa-angle-down:before{content:\"\\f107\"}.fa-desktop:before{content:\"\\f108\"}.fa-laptop:before{content:\"\\f109\"}.fa-tablet:before{content:\"\\f10a\"}.fa-mobile-phone:before,.fa-mobile:before{content:\"\\f10b\"}.fa-circle-o:before{content:\"\\f10c\"}.fa-quote-left:before{content:\"\\f10d\"}.fa-quote-right:before{content:\"\\f10e\"}.fa-spinner:before{content:\"\\f110\"}.fa-circle:before{content:\"\\f111\"}.fa-mail-reply:before,.fa-reply:before{content:\"\\f112\"}.fa-github-alt:before{content:\"\\f113\"}.fa-folder-o:before{content:\"\\f114\"}.fa-folder-open-o:before{content:\"\\f115\"}.fa-smile-o:before{content:\"\\f118\"}.fa-frown-o:before{content:\"\\f119\"}.fa-meh-o:before{content:\"\\f11a\"}.fa-gamepad:before{content:\"\\f11b\"}.fa-keyboard-o:before{content:\"\\f11c\"}.fa-flag-o:before{content:\"\\f11d\"}.fa-flag-checkered:before{content:\"\\f11e\"}.fa-terminal:before{content:\"\\f120\"}.fa-code:before{content:\"\\f121\"}.fa-mail-reply-all:before,.fa-reply-all:before{content:\"\\f122\"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:\"\\f123\"}.fa-location-arrow:before{content:\"\\f124\"}.fa-crop:before{content:\"\\f125\"}.fa-code-fork:before{content:\"\\f126\"}.fa-unlink:before,.fa-chain-broken:before{content:\"\\f127\"}.fa-question:before{content:\"\\f128\"}.fa-info:before{content:\"\\f129\"}.fa-exclamation:before{content:\"\\f12a\"}.fa-superscript:before{content:\"\\f12b\"}.fa-subscript:before{content:\"\\f12c\"}.fa-eraser:before{content:\"\\f12d\"}.fa-puzzle-piece:before{content:\"\\f12e\"}.fa-microphone:before{content:\"\\f130\"}.fa-microphone-slash:before{content:\"\\f131\"}.fa-shield:before{content:\"\\f132\"}.fa-calendar-o:before{content:\"\\f133\"}.fa-fire-extinguisher:before{content:\"\\f134\"}.fa-rocket:before{content:\"\\f135\"}.fa-maxcdn:before{content:\"\\f136\"}.fa-chevron-circle-left:before{content:\"\\f137\"}.fa-chevron-circle-right:before{content:\"\\f138\"}.fa-chevron-circle-up:before{content:\"\\f139\"}.fa-chevron-circle-down:before{content:\"\\f13a\"}.fa-html5:before{content:\"\\f13b\"}.fa-css3:before{content:\"\\f13c\"}.fa-anchor:before{content:\"\\f13d\"}.fa-unlock-alt:before{content:\"\\f13e\"}.fa-bullseye:before{content:\"\\f140\"}.fa-ellipsis-h:before{content:\"\\f141\"}.fa-ellipsis-v:before{content:\"\\f142\"}.fa-rss-square:before{content:\"\\f143\"}.fa-play-circle:before{content:\"\\f144\"}.fa-ticket:before{content:\"\\f145\"}.fa-minus-square:before{content:\"\\f146\"}.fa-minus-square-o:before{content:\"\\f147\"}.fa-level-up:before{content:\"\\f148\"}.fa-level-down:before{content:\"\\f149\"}.fa-check-square:before{content:\"\\f14a\"}.fa-pencil-square:before{content:\"\\f14b\"}.fa-external-link-square:before{content:\"\\f14c\"}.fa-share-square:before{content:\"\\f14d\"}.fa-compass:before{content:\"\\f14e\"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:\"\\f150\"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:\"\\f151\"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:\"\\f152\"}.fa-euro:before,.fa-eur:before{content:\"\\f153\"}.fa-gbp:before{content:\"\\f154\"}.fa-dollar:before,.fa-usd:before{content:\"\\f155\"}.fa-rupee:before,.fa-inr:before{content:\"\\f156\"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:\"\\f157\"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:\"\\f158\"}.fa-won:before,.fa-krw:before{content:\"\\f159\"}.fa-bitcoin:before,.fa-btc:before{content:\"\\f15a\"}.fa-file:before{content:\"\\f15b\"}.fa-file-text:before{content:\"\\f15c\"}.fa-sort-alpha-asc:before{content:\"\\f15d\"}.fa-sort-alpha-desc:before{content:\"\\f15e\"}.fa-sort-amount-asc:before{content:\"\\f160\"}.fa-sort-amount-desc:before{content:\"\\f161\"}.fa-sort-numeric-asc:before{content:\"\\f162\"}.fa-sort-numeric-desc:before{content:\"\\f163\"}.fa-thumbs-up:before{content:\"\\f164\"}.fa-thumbs-down:before{content:\"\\f165\"}.fa-youtube-square:before{content:\"\\f166\"}.fa-youtube:before{content:\"\\f167\"}.fa-xing:before{content:\"\\f168\"}.fa-xing-square:before{content:\"\\f169\"}.fa-youtube-play:before{content:\"\\f16a\"}.fa-dropbox:before{content:\"\\f16b\"}.fa-stack-overflow:before{content:\"\\f16c\"}.fa-instagram:before{content:\"\\f16d\"}.fa-flickr:before{content:\"\\f16e\"}.fa-adn:before{content:\"\\f170\"}.fa-bitbucket:before{content:\"\\f171\"}.fa-bitbucket-square:before{content:\"\\f172\"}.fa-tumblr:before{content:\"\\f173\"}.fa-tumblr-square:before{content:\"\\f174\"}.fa-long-arrow-down:before{content:\"\\f175\"}.fa-long-arrow-up:before{content:\"\\f176\"}.fa-long-arrow-left:before{content:\"\\f177\"}.fa-long-arrow-right:before{content:\"\\f178\"}.fa-apple:before{content:\"\\f179\"}.fa-windows:before{content:\"\\f17a\"}.fa-android:before{content:\"\\f17b\"}.fa-linux:before{content:\"\\f17c\"}.fa-dribbble:before{content:\"\\f17d\"}.fa-skype:before{content:\"\\f17e\"}.fa-foursquare:before{content:\"\\f180\"}.fa-trello:before{content:\"\\f181\"}.fa-female:before{content:\"\\f182\"}.fa-male:before{content:\"\\f183\"}.fa-gittip:before{content:\"\\f184\"}.fa-sun-o:before{content:\"\\f185\"}.fa-moon-o:before{content:\"\\f186\"}.fa-archive:before{content:\"\\f187\"}.fa-bug:before{content:\"\\f188\"}.fa-vk:before{content:\"\\f189\"}.fa-weibo:before{content:\"\\f18a\"}.fa-renren:before{content:\"\\f18b\"}.fa-pagelines:before{content:\"\\f18c\"}.fa-stack-exchange:before{content:\"\\f18d\"}.fa-arrow-circle-o-right:before{content:\"\\f18e\"}.fa-arrow-circle-o-left:before{content:\"\\f190\"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:\"\\f191\"}.fa-dot-circle-o:before{content:\"\\f192\"}.fa-wheelchair:before{content:\"\\f193\"}.fa-vimeo-square:before{content:\"\\f194\"}.fa-turkish-lira:before,.fa-try:before{content:\"\\f195\"}.fa-plus-square-o:before{content:\"\\f196\"}.fa-space-shuttle:before{content:\"\\f197\"}.fa-slack:before{content:\"\\f198\"}.fa-envelope-square:before{content:\"\\f199\"}.fa-wordpress:before{content:\"\\f19a\"}.fa-openid:before{content:\"\\f19b\"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:\"\\f19c\"}.fa-mortar-board:before,.fa-graduation-cap:before{content:\"\\f19d\"}.fa-yahoo:before{content:\"\\f19e\"}.fa-google:before{content:\"\\f1a0\"}.fa-reddit:before{content:\"\\f1a1\"}.fa-reddit-square:before{content:\"\\f1a2\"}.fa-stumbleupon-circle:before{content:\"\\f1a3\"}.fa-stumbleupon:before{content:\"\\f1a4\"}.fa-delicious:before{content:\"\\f1a5\"}.fa-digg:before{content:\"\\f1a6\"}.fa-pied-piper:before{content:\"\\f1a7\"}.fa-pied-piper-alt:before{content:\"\\f1a8\"}.fa-drupal:before{content:\"\\f1a9\"}.fa-joomla:before{content:\"\\f1aa\"}.fa-language:before{content:\"\\f1ab\"}.fa-fax:before{content:\"\\f1ac\"}.fa-building:before{content:\"\\f1ad\"}.fa-child:before{content:\"\\f1ae\"}.fa-paw:before{content:\"\\f1b0\"}.fa-spoon:before{content:\"\\f1b1\"}.fa-cube:before{content:\"\\f1b2\"}.fa-cubes:before{content:\"\\f1b3\"}.fa-behance:before{content:\"\\f1b4\"}.fa-behance-square:before{content:\"\\f1b5\"}.fa-steam:before{content:\"\\f1b6\"}.fa-steam-square:before{content:\"\\f1b7\"}.fa-recycle:before{content:\"\\f1b8\"}.fa-automobile:before,.fa-car:before{content:\"\\f1b9\"}.fa-cab:before,.fa-taxi:before{content:\"\\f1ba\"}.fa-tree:before{content:\"\\f1bb\"}.fa-spotify:before{content:\"\\f1bc\"}.fa-deviantart:before{content:\"\\f1bd\"}.fa-soundcloud:before{content:\"\\f1be\"}.fa-database:before{content:\"\\f1c0\"}.fa-file-pdf-o:before{content:\"\\f1c1\"}.fa-file-word-o:before{content:\"\\f1c2\"}.fa-file-excel-o:before{content:\"\\f1c3\"}.fa-file-powerpoint-o:before{content:\"\\f1c4\"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:\"\\f1c5\"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:\"\\f1c6\"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:\"\\f1c7\"}.fa-file-movie-o:before,.fa-file-video-o:before{content:\"\\f1c8\"}.fa-file-code-o:before{content:\"\\f1c9\"}.fa-vine:before{content:\"\\f1ca\"}.fa-codepen:before{content:\"\\f1cb\"}.fa-jsfiddle:before{content:\"\\f1cc\"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:\"\\f1cd\"}.fa-circle-o-notch:before{content:\"\\f1ce\"}.fa-ra:before,.fa-rebel:before{content:\"\\f1d0\"}.fa-ge:before,.fa-empire:before{content:\"\\f1d1\"}.fa-git-square:before{content:\"\\f1d2\"}.fa-git:before{content:\"\\f1d3\"}.fa-hacker-news:before{content:\"\\f1d4\"}.fa-tencent-weibo:before{content:\"\\f1d5\"}.fa-qq:before{content:\"\\f1d6\"}.fa-wechat:before,.fa-weixin:before{content:\"\\f1d7\"}.fa-send:before,.fa-paper-plane:before{content:\"\\f1d8\"}.fa-send-o:before,.fa-paper-plane-o:before{content:\"\\f1d9\"}.fa-history:before{content:\"\\f1da\"}.fa-circle-thin:before{content:\"\\f1db\"}.fa-header:before{content:\"\\f1dc\"}.fa-paragraph:before{content:\"\\f1dd\"}.fa-sliders:before{content:\"\\f1de\"}.fa-share-alt:before{content:\"\\f1e0\"}.fa-share-alt-square:before{content:\"\\f1e1\"}.fa-bomb:before{content:\"\\f1e2\"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:\"\\f1e3\"}.fa-tty:before{content:\"\\f1e4\"}.fa-binoculars:before{content:\"\\f1e5\"}.fa-plug:before{content:\"\\f1e6\"}.fa-slideshare:before{content:\"\\f1e7\"}.fa-twitch:before{content:\"\\f1e8\"}.fa-yelp:before{content:\"\\f1e9\"}.fa-newspaper-o:before{content:\"\\f1ea\"}.fa-wifi:before{content:\"\\f1eb\"}.fa-calculator:before{content:\"\\f1ec\"}.fa-paypal:before{content:\"\\f1ed\"}.fa-google-wallet:before{content:\"\\f1ee\"}.fa-cc-visa:before{content:\"\\f1f0\"}.fa-cc-mastercard:before{content:\"\\f1f1\"}.fa-cc-discover:before{content:\"\\f1f2\"}.fa-cc-amex:before{content:\"\\f1f3\"}.fa-cc-paypal:before{content:\"\\f1f4\"}.fa-cc-stripe:before{content:\"\\f1f5\"}.fa-bell-slash:before{content:\"\\f1f6\"}.fa-bell-slash-o:before{content:\"\\f1f7\"}.fa-trash:before{content:\"\\f1f8\"}.fa-copyright:before{content:\"\\f1f9\"}.fa-at:before{content:\"\\f1fa\"}.fa-eyedropper:before{content:\"\\f1fb\"}.fa-paint-brush:before{content:\"\\f1fc\"}.fa-birthday-cake:before{content:\"\\f1fd\"}.fa-area-chart:before{content:\"\\f1fe\"}.fa-pie-chart:before{content:\"\\f200\"}.fa-line-chart:before{content:\"\\f201\"}.fa-lastfm:before{content:\"\\f202\"}.fa-lastfm-square:before{content:\"\\f203\"}.fa-toggle-off:before{content:\"\\f204\"}.fa-toggle-on:before{content:\"\\f205\"}.fa-bicycle:before{content:\"\\f206\"}.fa-bus:before{content:\"\\f207\"}.fa-ioxhost:before{content:\"\\f208\"}.fa-angellist:before{content:\"\\f209\"}.fa-cc:before{content:\"\\f20a\"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:\"\\f20b\"}.fa-meanpath:before{content:\"\\f20c\"}\n"
  },
  {
    "path": "ppt/think-in-css/css/nodeppt.css",
    "content": "@import url(http://fonts.useso.com/css?family=Source%20Code%20Pro:light,regular,semibold);html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:\"\";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}html{height:100%;overflow:hidden}body{margin:0;padding:0;opacity:0;height:100%;width:100%;overflow:hidden;color:#fff;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;-ms-font-smoothing:antialiased;-o-font-smoothing:antialiased;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}body.loaded{opacity:1 !important}input,button{vertical-align:middle}slides>slide[hidden]{display:none !important}slides{width:100%;height:100%;position:absolute;left:0;top:0;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);-moz-perspective:1000;-webkit-perspective:1000;perspective:1000;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transition:opacity 800ms ease-in 100ms;-o-transition:opacity 800ms ease-in 100ms;-webkit-transition:opacity 800ms ease-in;-webkit-transition-delay:100ms;transition:opacity 800ms ease-in 100ms}slides>slide{display:block;position:absolute;overflow:hidden;left:50%;top:50%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}article.fill iframe{position:absolute;left:0;top:0;width:100%;height:100%;border:0;margin:0;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;z-index:-1}slide.fill{background-repeat:no-repeat;-moz-background-size:cover;-o-background-size:cover;-webkit-background-size:cover;background-size:cover}slide.fill img{position:absolute;left:0;top:0;min-width:100%;min-height:100%;z-index:-1}.transparent{opacity:0}::selection{color:#fff;background-color:#ffd14d;text-shadow:none}::-webkit-scrollbar{height:10px;overflow:visible;width:10px}::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,0.1);background-clip:padding-box;border:solid transparent;min-height:28px;padding:100px 0 0;-moz-box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);-webkit-box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);box-shadow:inset 1px 1px 0 rgba(0,0,0,0.1),inset 0 -1px 0 rgba(0,0,0,0.07);border-width:1px 1px 1px 6px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,0.5)}::-webkit-scrollbar-button{height:0;width:0}::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}::-webkit-scrollbar-corner{background:transparent}body{background:black;font-family:\"YaHei Consolas Hybrid\",STHeiti,\"Microsoft Yahei\",Arial,Helvetica,sans-serif}a{color:#ff8c78;padding:0 3px;text-decoration:none;border-bottom:1px dashed #ff8c78;cursor:help;margin:0 5px;background-color:transparent;display:inline-block;vertical-align:middle;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-box-shadow:0 0 1px transparent;-moz-box-shadow:0 0 1px transparent;-ms-box-shadow:0 0 1px transparent;-o-box-shadow:0 0 1px transparent;box-shadow:0 0 1px transparent;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-o-backface-visibility:hidden;backface-visibility:hidden;-moz-osx-font-smoothing:grayscale;position:relative;overflow:hidden}a:hover{color:#ff4d2e;border-bottom:none;background-color:transparent}a:before{content:\"\";position:absolute;z-index:-1;left:50%;right:50%;bottom:0;background:#ff4d2e;height:4px;-webkit-transition-property:left, right;-moz-transition-property:left, right;-ms-transition-property:left, right;-o-transition-property:left, right;transition-property:left, right;-webkit-transition-duration:0.3s;-moz-transition-duration:0.3s;-ms-transition-duration:0.3s;-o-transition-duration:0.3s;transition-duration:0.3s;-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}a:hover:before,a:focus:before,a:active:before{left:0;right:0}h1,h2,h3{font-weight:600;color:#fff;text-shadow:2px 2px 2px #000}h1{font-size:45px;line-height:1.5;color:white;margin-bottom:0.5em;text-shadow:2px 3px 4px #000}h2{font-weight:bold;font-size:34px;line-height:2;color:white}h3{font-size:28px;line-height:1.5;font-weight:inherit;color:white}p{line-height:1.75em}ul{margin-left:1.2em;position:relative;list-style:disc inside;text-align:left;display:inline-block}ul li{line-height:1.75em;list-style-position:outside}ul li ul{margin-left:2em;margin-bottom:0;list-style-type:none;display:block}ul li ul li:before{content:'-';position:absolute;margin-left:-1em;font-weight:600}ul ul{margin-top:.5em}ol{list-style-type:decimal;display:inline-block;text-align:left;margin:0 0 0 1em}ol li{line-height:1.5em}mark{color:#468847;background-color:#dff0d8}pre{font-family:\"Source Code Pro\",Consolas,\"Courier New\",Courier,monospace;font-size:20px;line-height:1.2em;letter-spacing:-1px;margin-bottom:20px;text-align:left;position:relative;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}pre code{font-size:95%;font-family:\"Source Code Pro\",Consolas,\"Courier New\",Courier,monospace;color:black;border:none 0;padding:0;background-color:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}code{margin:0;font-family:\"Source Code Pro\",Consolas,\"Courier New\",Courier,monospace;border:1px solid #ddd;background-color:#f8f8f8;padding:0 3px;margin:0 5px;vertical-align:middle;color:#dd1144;text-shadow:none;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}iframe{width:100%;height:480px;background:white;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}dt{font-weight:bold}table{width:100%;color:black;border-collapse:-moz-initial;border-collapse:initial;border-spacing:1px;border-bottom:1px solid #797979}table thead th{background-color:#e6e6e6;font-weight:bold}table tr>td:first-child,table th{font-weight:bolder}table tr{background-color:white}table tr:nth-child(even){background-color:#e6e6e6}table td,table th{font-size:18px;padding:1em 0.5em;line-height:1.5}table td.highlight{font-weight:bold;color:#468847;background-color:#dff0d8 !important}table.rows{border-bottom:none;border-right:1px solid #797979}button{border:0 none}.btn{outline:0;-webkit-transition:all 0.3s linear;-moz-transition:all 0.3s linear;-ms-transition:all 0.3s linear;-o-transition:all 0.3s linear;transition:all 0.3s linear;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;padding:9px 12px;font-size:13px;-webkit-font-smoothing:antialiased;line-height:14px}.btn:focus,.btn:active,.btn.active,.btn:active:focus,.btn.active:focus{outline:0}.btn:active,.btn.active{-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.1);-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.1);box-shadow:inset 0 3px 8px rgba(0,0,0,0.1)}.btn-lg,.btn-group-lg>.btn{padding:15px 16px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}.btn-sm,.btn-group-sm>.btn{padding:7px 10px}.btn-xs,.btn-group-xs>.btn{padding:3px 5px;font-size:10px}.btn-rounded,.btn-rounded a,.btn-rounded .btn{-moz-border-radius:40px;-webkit-border-radius:40px;border-radius:40px}.btn-default .btn-default{color:#000;background-color:#eaecf6;border-color:#d5d9ed}.btn-default .btn-default:hover,.btn-default .btn-default:focus,.btn-default .btn-default:active,.btn-default .btn-default.active,.btn-default .btn-default.disabled,.btn-default .btn-default[disabled]{background-color:#d8dcee;border-color:#b1b8de}.btn-default .btn-default.btn-outline{background-color:transparent;color:#eaecf6;background-color:#eaecf6;color:#000}.btn-default.btn-outline{color:#000}.btn-primary{color:#fff;background-color:#1582dc;border-color:#1582dc}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#1374c5;border-color:#1166ad}.btn-primary.btn-outline{background-color:transparent;color:#1582dc;background-color:#1582dc;color:#fff}.btn-warning{color:#fff;background-color:#daac16;border-color:#daac16}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#c39a14;border-color:#ac8711}.btn-warning.btn-outline{background-color:transparent;color:#daac16;background-color:#daac16;color:#fff}.btn-success{color:#fff;background-color:#15db81;border-color:#15db81}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#13c473;border-color:#11ac66}.btn-success.btn-outline{background-color:transparent;color:#15db81;background-color:#15db81;color:#fff}.btn-info{color:#fff;background-color:#15acdc;border-color:#15acdc}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#139ac5;border-color:#1188ad}.btn-info.btn-outline{background-color:transparent;color:#15acdc;background-color:#15acdc;color:#fff}.btn-danger{color:#fff;background-color:#da3e16;border-color:#da3e16}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#c33714;border-color:#ac3111}.btn-danger.btn-outline{background-color:transparent;color:#da3e16;background-color:#da3e16;color:#fff}.ptl{position:absolute;top:0;left:0}.ptr{position:absolute;top:0;right:0}.pbl{position:absolute;bottom:0;left:0}.pbr{position:absolute;bottom:0;right:0}.bg-none{background-color:transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.shadow{-moz-box-shadow:0 0 5px rgba(0,0,0,0.2);-webkit-box-shadow:0 0 5px rgba(0,0,0,0.2);box-shadow:0 0 5px rgba(0,0,0,0.2)}.no-shadow{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.no-m{margin:0 !important}.mn{margin-right:-15px;margin-left:-15px}.mrn{margin-right:-15px}.mln{margin-left:-15px}.mbn{margin-bottom:-15px}.ml0{margin-left:0}.mr0{margin-right:0}.mt0{margin-top:0}.mb0{margin-bottom:0}.m25{margin:25px}.mr25{margin-right:25px}.ml25{margin-left:25px}.mt25{margin-top:25px}.mb25{margin-bottom:25px}.m20{margin:20px}.mr20{margin-right:20px}.ml20{margin-left:20px}.mt20{margin-top:20px}.mb20{margin-bottom:20px}.m15{margin:15px}.mr15{margin-right:15px}.ml15{margin-left:15px}.mt15{margin-top:15px}.mb15{margin-bottom:15px}.m10{margin:10px}.mr10{margin-right:10px}.ml10{margin-left:10px}.mt10{margin-top:10px}.mb10{margin-bottom:10px}.m5{margin:5px}.mr5{margin-right:5px}.ml5{margin-left:5px}.mt5{margin-top:5px}.mb5{margin-bottom:5px}.no-p{padding:0 !important}.pl0{padding-left:0}.pr0{padding-right:0}.pt0{padding-top:0}.pb0{padding-bottom:0}.p25{padding:25px}.pr25{padding-right:25px}.pl25{padding-left:25px}.pt25{padding-top:25px}.pb25{padding-bottom:25px}.p20{padding:20px}.pr20{padding-right:20px}.pl20{padding-left:20px}.pt20{padding-top:20px}.pb20{padding-bottom:20px}.p15{padding:15px}.pr15{padding-right:15px}.pl15{padding-left:15px}.pt15{padding-top:15px}.pb15{padding-bottom:15px}.p10{padding:10px}.pr10{padding-right:10px}.pl10{padding-left:10px}.pt10{padding-top:10px}.pb10{padding-bottom:10px}.p5{padding:5px}.pr5{padding-right:5px}.pl5{padding-left:5px}.pt5{padding-top:5px}.pb5{padding-bottom:5px}.draw-board{position:fixed;cursor:url(pen.cur),default;z-index:9999;top:0;left:0;right:0;bottom:0}.slideTip{display:none;padding:10px 0;width:300px;background:rgba(0,0,0,0.3);border-radius:5px;padding:10px;margin:0 auto;color:#FFF;position:fixed;top:40%;left:50%;margin-left:-150px;text-align:center}.progress{position:fixed;height:3px;width:100%;bottom:0;left:0;background:#000}.progress span{display:block;background:#2187E7;height:100%;width:0;border:none;-moz-border-radius:0 2px 2px 0;-webkit-border-radius:0;border-radius:0 2px 2px 0;-moz-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);-o-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);-webkit-transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);transition:width 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985)}.slides{width:100%;height:100%;text-align:center}slides>slide .slide-wrapper{max-width:900px;text-align:center;margin:0 auto;position:relative;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;height:100%}slides>slide .slide-wrapper>hgroup+article{margin-top:20px}slides>slide .slide-wrapper>hgroup+article.flexbox.vcenter,slides>slide .slide-wrapper>hgroup+article.flexbox.vleft,slides>slide .slide-wrapper>hgroup+article.flexbox.vright{height:80%}slides>slide .slide-wrapper>hgroup+article p>img:only-child{margin-bottom:1em}slides>slide .slide-wrapper>article:only-child h2{font-weight:normal}slides>slide .slide-wrapper>article:only-child>pre{overflow-y:auto;max-height:98%}slides>slide .slide-wrapper>article:only-child>iframe{height:98%}slides>slide .slide-wrapper img{-webkit-justify-content:space-around;justify-content:space-around;max-width:100%;max-height:520px}slides>slide .slide-wrapper blockquote{font-size:28px;line-height:1.5em;padding:5px 5px 5px 20px;background-color:#f9ff95;border-left:5px solid #3e87cf;color:#000;text-align:left;min-width:500px;display:inline-block}slides>slide .slide-wrapper blockquote small{display:block;line-height:20px;color:#999}slides>slide .slide-wrapper blockquote small::before{content:'\\2014 \\00A0'}slides>slide .slide-wrapper blockquote p{margin-bottom:0 !important;font-size:17.5px;font-weight:300;line-height:1.25}slides>slide .slide-wrapper blockquote.pull-right{padding-left:15px;border-right:5px solid #3E87CF;text-align:right;padding-right:20px;border-left:none}slides>slide .slide-wrapper blockquote.pull-right small::before{content:''}slides>slide .slide-wrapper blockquote.pull-right small::after{content:'\\00A0 \\2014'}slides>slide .slide-wrapper b,slides>slide .slide-wrapper strong{font-weight:bold;margin:0 5px;text-shadow:2px 3px 1px rgba(0,0,0,0.8)}slides>slide .slide-wrapper em{margin:0 5px;font-weight:bold;text-shadow:-1px -2px 1px rgba(0,0,0,0.8)}slides>slide .slide-wrapper pre b,slides>slide .slide-wrapper pre strong{margin:0;text-shadow:none}slides>slide{display:none;font-size:26px;color:#fff;background-color:#03c8cb;width:100%;height:100%;position:absolute;top:0;left:0;z-index:9;padding:40px 60px;-moz-transition:all 0.6s ease-in-out;-o-transition:all 0.6s ease-in-out;-webkit-transition:all 0.6s ease-in-out;transition:all 0.6s ease-in-out;-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;-o-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}slides>slide.far-past{display:none}slides>slide.past{display:block;opacity:0}slides>slide.current{display:block;opacity:1;z-index:99}slides>slide.current .auto-fadein{opacity:1}slides>slide.current .gdbar{-moz-background-size:100% 100%;-o-background-size:100% 100%;-webkit-background-size:100% 100%;background-size:100% 100%}slides>slide.next{display:block;opacity:0}slides>slide.far-next{display:none}slides>slide.dark{background:#515151 !important}slides>slide.title-slide:after{content:'';position:absolute;bottom:40px;right:40px;width:100%;height:60px}slides>slide.backdrop{z-index:-10;display:block !important;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iODUlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZTZlNmU2Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(85%, #ffffff),color-stop(100%, #e6e6e6));background:-moz-linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background:-webkit-linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background:linear-gradient(#ffffff,#ffffff 85%,#e6e6e6);background-color:white}slides>slide.backdrop:after,slides>slide.backdrop:before{display:none}slides>slide:nth-child(6n+1){background-color:#dc6c5f}slides>slide:nth-child(6n+2){background-color:#04aa55}slides>slide:nth-child(6n+3){background-color:#487bd3}slides>slide:nth-child(6n+4){background-color:#049dbf}slides>slide:nth-child(6n+5){background-color:#da4a89}slides>slide .note{color:#000}slides>slide .note h1,slides>slide .note h2,slides>slide .note h3,slides>slide .note h4{color:#000;text-shadow:none}.highlight-code slide.current b,.highlight-code slide.current strong,slide.current .hljs b,slide.current .hljs strong{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:shake;-moz-animation-name:shake;-ms-animation-name:shake;-o-animation-name:shake;animation-name:shake;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current em,slide.current .hljs em{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:flash;-moz-animation-name:flash;-ms-animation-name:flash;-o-animation-name:flash;animation-name:flash;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current .hljs b,.highlight-code slide.current .hljs strong{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:flash;-moz-animation-name:flash;-ms-animation-name:flash;-o-animation-name:flash;animation-name:flash;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}.highlight-code slide.current .hljs em{-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-name:shake;-moz-animation-name:shake;-ms-animation-name:shake;-o-animation-name:shake;animation-name:shake;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;-ms-animation-duration:1.5s;-o-animation-duration:1.5s;animation-duration:1.5s}slides.layout-faux-widescreen>slide{padding:40px 160px}slides.layout-widescreen>slide .slide-wrapper,slides.layout-faux-widescreen>slide .slide-wrapper{width:100%;max-width:100%}slides.layout-widescreen>slide .slide-wrapper img,slides.layout-faux-widescreen>slide .slide-wrapper img{max-width:980px}slides.layout-widescreen>slide.far-past,slides.layout-faux-widescreen>slide.far-past{display:block;display:none;-moz-transform:translate(-2260px);-ms-transform:translate(-2260px);-webkit-transform:translate(-2260px);transform:translate(-2260px);-moz-transform:translate3d(-2260px, 0, 0);-ms-transform:translate3d(-2260px, 0, 0);-webkit-transform:translate3d(-2260px, 0, 0);transform:translate3d(-2260px, 0, 0)}slides.layout-widescreen>slide.past,slides.layout-faux-widescreen>slide.past{display:block;opacity:0}slides.layout-widescreen>slide.current,slides.layout-faux-widescreen>slide.current{display:block;opacity:1}slides.layout-widescreen>slide.next,slides.layout-faux-widescreen>slide.next{display:block;opacity:0}slides.layout-widescreen>slide.far-next,slides.layout-faux-widescreen>slide.far-next{display:block;display:none;-moz-transform:translate(2260px);-ms-transform:translate(2260px);-webkit-transform:translate(2260px);transform:translate(2260px);-moz-transform:translate3d(2260px, 0, 0);-ms-transform:translate3d(2260px, 0, 0);-webkit-transform:translate3d(2260px, 0, 0);transform:translate3d(2260px, 0, 0)}slides.layout-widescreen #prev-slide-area,slides.layout-faux-widescreen #prev-slide-area{margin-left:-650px}slides.layout-widescreen #next-slide-area,slides.layout-faux-widescreen #next-slide-area{margin-left:550px}:disabled{color:#a9a9a9}.blue{color:#4387fd !important}.blue2,.blue-2{color:#3c8ef3 !important}.blue3,.blue-3{color:#2a7cdf !important}.yellow{color:#ffd14d}.yellow2,.yellow-2{color:#f9cc46 !important}.yellow3,.yellow-3{color:#f6c000 !important}.green{color:#0da861 !important}.green2,.green-2{color:#00a86d !important}.green3,.green-3{color:#009f5d !important}.red{color:#f44a3f}.red2,.red-2{color:#e0543e !important}.red3,.red-3{color:#d94d3a !important}.gray{color:#e6e6e6 !important}.gray2,.gray-2{color:#a9a9a9 !important}.gray3,.gray-3{color:#797979 !important}.gray4,.gray-4{color:#515151 !important}.white{color:white !important}.black{color:black !important}.columns-2,.columns2{-moz-column-count:2;-webkit-column-count:2;column-count:2}.columns-3,.columns3{-moz-column-count:3;-webkit-column-count:3;column-count:3}.label{line-height:inherit;font-weight:400}.label-default{background-color:#eaecf6;color:black;border:1px solid #fafafa}.label-default[href]:hover,.label-default[href]:focus{background-color:#c6cce7}.label-primary{background-color:#1582dc;color:#fff}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#1166ad}.label-success{background-color:#15db81}.label-success[href]:hover,.label-success[href]:focus{background-color:#11ac66}.label-info{background-color:#15acdc}.label-info[href]:hover,.label-info[href]:focus{background-color:#1188ad}.label-warning{background-color:#daac16}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ac8711}.label-danger{background-color:#da3e16}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#ac3111}.text-default{color:#eaecf6 !important}.text-primary{color:#1582dc !important}.text-success{color:#15db81 !important}.text-warning{color:#daac16 !important}.text-danger{color:#da3e16 !important}.text-info{color:#15acdc !important}.text-white{color:#fff !important}.text-dark{color:#4f5061 !important}slide.fill{background-repeat:no-repeat;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-background-size:cover;-o-background-size:cover;-webkit-background-size:cover;background-size:cover}article.smaller p,article.smaller ul{font-size:20px;line-height:24px;letter-spacing:0}article.smaller table td,article.smaller table th{font-size:14px}article.smaller pre{font-size:15px;line-height:20px;letter-spacing:0}article.smaller q{font-size:40px;line-height:48px}article.smaller q:before,article.smaller q:after{font-size:60px}.slide .subSlide.tobuild{visibility:hidden}.slide .subSlide.builded.subBuilded{display:none}.subSlide{display:none;opacity:0;visibility:hidden}.subSlide.building{opacity:1;display:block;visibility:visible;-moz-transition:opacity 0.3s ease;-o-transition:opacity 0.3s ease;-webkit-transition:opacity 0.3s ease;transition:opacity 0.3s ease}.subSlide.builded{opacity:1;display:block;visibility:visible}.subSlide.subBuilded{display:none;opacity:0;visibility:hidden;-moz-transition:opacity 0.3s ease,display 0.4s ease;-o-transition:opacity 0.3s ease,display 0.4s ease;-webkit-transition:opacity 0.3s ease,display 0.4s ease;transition:opacity 0.3s ease,display 0.4s ease}.fade{display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center}.fade>*{opacity:0;-moz-transition:opacity 0.5s ease-in-out 0.2s;-o-transition:opacity 0.5s ease-in-out 0.2s;-webkit-transition:opacity 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:opacity 0.5s ease-in-out 0.2s}.fade>.tobuild:first-child{display:-webkit-flex;display:flex;visibility:hidden}.fade>.builded{opacity:0;display:none;visibility:hidden}.fade>.builded:last-child{opacity:1;display:-webkit-flex;display:flex;visibility:visible}.fade>.building{display:-webkit-flex;display:flex;opacity:1}.fade .tobuild{opacity:0;display:none}.fadeIn>*{-moz-transition:opacity 0.5s ease-in-out 0.2s;-o-transition:opacity 0.5s ease-in-out 0.2s;-webkit-transition:opacity 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:opacity 0.5s ease-in-out 0.2s}.fadeIn .tobuild{opacity:0}.bounceIn>*,.zoomIn>*{opacity:1}.bounceIn .tobuild,.zoomIn .tobuild{opacity:0}.bounceIn .building,.zoomIn .building{opacity:1;-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.bounceIn .building{-webkit-animation-name:bounceIn;animation-name:bounceIn}.zoomIn .building{-webkit-animation-name:zoomIn;animation-name:zoomIn}.moveIn>*{-moz-transition:all 0.5s ease-in-out 0.2s;-o-transition:all 0.5s ease-in-out 0.2s;-webkit-transition:all 0.5s ease-in-out;-webkit-transition-delay:0.2s;transition:all 0.5s ease-in-out 0.2s}.moveIn .tobuild{opacity:0;-moz-transform:translate3d(60px, 0, 0);-ms-transform:translate3d(60px, 0, 0);-webkit-transform:translate3d(60px, 0, 0);transform:translate3d(60px, 0, 0)}.rollIn>*{-moz-transition:all 0.4s ease;-o-transition:all 0.4s ease;-webkit-transition:all 0.4s ease;transition:all 0.4s ease}.rollIn .building{opacity:1;visibility:visible;-moz-transform:rotateX(0);-ms-transform:rotateX(0);-webkit-transform:rotateX(0);transform:rotateX(0)}.rollIn .tobuild{opacity:0;visibility:hidden;-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-webkit-transform:rotateX(90deg);transform:rotateX(90deg)}.popup .next .build .tobuild{opacity:1 !important}.popup .next .build .builded{opacity:1 !important}.note{position:absolute;width:100%;height:100%;top:0;left:0;padding:1em;background:rgba(0,0,0,0.3);opacity:0;display:-webkit-flex;display:flex;-webkit-flex-flow:row;flex-flow:row;-webkit-justify-content:center;justify-content:center;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-transition:all 0.4s ease-in-out;-o-transition:all 0.4s ease-in-out;-webkit-transition:all 0.4s ease-in-out;transition:all 0.4s ease-in-out}.note>section{text-align:left;background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-shadow:inset 0 0 10px #6f6f6f;-webkit-box-shadow:inset 0 0 10px #6f6f6f;box-shadow:inset 0 0 10px #6f6f6f;width:70%;padding:2em}.qrcode{display:none;position:fixed;width:100%;height:100%;left:0;top:0;background:rgba(0,0,0,0.5)}.qrcode #qrcode{width:256px;height:300px;vertical-align:middle;margin:0 auto;position:relative;background-color:white;padding:20px 20px 10px;top:100px}.qrcode p{text-align:center;line-height:44px;position:absolute;top:380px;width:100%}.with-notes.popup.overview slide.next{opacity:0.5 !important}.with-notes .progress{display:none}.with-notes.popup slides.layout-widescreen slide.next,.with-notes.popup slides.layout-faux-widescreen slide.next{-moz-transform:translate3d(690px, 80px, 0) scale(0.35);-ms-transform:translate3d(690px, 80px, 0) scale(0.35);-webkit-transform:translate3d(690px, 80px, 0) scale(0.35);transform:translate3d(690px, 80px, 0) scale(0.35)}.with-notes.popup slides.layout-widescreen slide .note,.with-notes.popup slides.layout-faux-widescreen slide .note{z-index:100;-moz-transform:translate3d(300px, 700px, 0) scale(1.5);-ms-transform:translate3d(300px, 700px, 0) scale(1.5);-webkit-transform:translate3d(300px, 700px, 0) scale(1.5);transform:translate3d(300px, 700px, 0) scale(1.5)}.with-notes.popup slide{width:1100px !important;overflow:visible;-moz-transition:none !important;-o-transition:none !important;-webkit-transition:none !important;transition:none !important;-moz-transform-origin:0 0 !important;-ms-transform-origin:0 0 !important;-webkit-transform-origin:0 0 !important;transform-origin:0 0 !important}.with-notes.popup slide[data-transition].current,.with-notes.popup slide[data-transition].next,.with-notes.popup slide[data-transition].past{top:auto !important;left:auto !important;-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-animation-name:none;animation-name:none}.with-notes.popup slide:not(.backdrop){-moz-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);-ms-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);-webkit-transform:scale(0.6) translate3d(0.5em, 0.5em, 0);transform:scale(0.6) translate3d(0.5em, 0.5em, 0)}.with-notes.popup slide.backdrop{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PHJhZGlhbEdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY3g9IjUwJSIgY3k9IjUwJSIgcj0iNjAwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2IxZGZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQzODdmZCIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px);background-image:-webkit-radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px);background-image:radial-gradient(50% 50%, #b1dfff 0%,#4387fd 600px)}.with-notes.popup slide.next{-moz-transform:translate3d(690px, 80px, 0) scale(0.35);-ms-transform:translate3d(690px, 80px, 0) scale(0.35);-webkit-transform:translate3d(690px, 80px, 0) scale(0.35);transform:translate3d(690px, 80px, 0) scale(0.35);opacity:1 !important;-webkit-clip-path:none !important}.with-notes.popup slide.next .note{display:none !important}.with-notes.popup .note{width:100%;height:210px;padding:0;-moz-transform:translate3d(350px, 850px, 0) scale(1.5);-ms-transform:translate3d(350px, 850px, 0) scale(1.5);-webkit-transform:translate3d(350px, 850px, 0) scale(1.5);transform:translate3d(350px, 850px, 0) scale(1.5);-moz-transition:opacity 400ms ease-in-out;-o-transition:opacity 400ms ease-in-out;-webkit-transition:opacity 400ms ease-in-out;transition:opacity 400ms ease-in-out}.with-notes.popup .note>section{background:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;height:100%;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;overflow:auto;padding:1em}.with-notes .note{display:-webkit-flex;display:flex;opacity:1;-moz-transform:translateY(0);-ms-transform:translateY(0);-webkit-transform:translateY(0);transform:translateY(0);pointer-events:auto;z-index:100}@media screen and (min-width: 1200px){.with-notes.popup .note{-moz-transform:translate3d(350px, 1050px, 0) scale(1.5);-ms-transform:translate3d(350px, 1050px, 0) scale(1.5);-webkit-transform:translate3d(350px, 1050px, 0) scale(1.5);transform:translate3d(350px, 1050px, 0) scale(1.5)}.with-notes.popup slide.next{-moz-transform:translate3d(890px, 80px, 0) scale(0.35);-ms-transform:translate3d(890px, 80px, 0) scale(0.35);-webkit-transform:translate3d(890px, 80px, 0) scale(0.35);transform:translate3d(890px, 80px, 0) scale(0.35)}}#_timer_{display:block;position:fixed;bottom:1em;left:0.5em}.img-full{-webkit-box-align:center;-moz-box-align:center;box-align:center;-webkit-box-orient:vertical;-moz-box-orient:vertical;box-orient:vertical;-webkit-box-pack:center;-moz-box-pack:center;box-pack:center;-moz-transition:opacity 800ms;-o-transition:opacity 800ms;-webkit-transition:opacity 800ms;transition:opacity 800ms;background-color:#000;bottom:0;display:-webkit-box;display:-moz-box;display:box;left:0;overflow:auto;position:fixed;right:0;top:0;display:none}.img-full img{background:#000;color:#333;padding:0;position:fixed;min-width:100px;z-index:0;top:20px;left:50%;-webkit-transition:800ms -webkit-transform;-moz-transition:800ms -moz-transform;transition:800ms transform}.img-full img.transparent{-moz-transform:scale(0.99) translateY(-20px);-ms-transform:scale(0.99) translateY(-20px);-webkit-transform:scale(0.99) translateY(-20px);transform:scale(0.99) translateY(-20px)}#_buttons{position:fixed;bottom:0.25em;z-index:9999;right:0.25em}#_buttons ._btn-box{display:inline-block}#_buttons button{font-size:1rem;background:none;border:0 none;color:rgba(0,0,0,0.3);text-shadow:0 0 transparent}#_buttons button:hover{color:black}.popup.with-notes #_buttons ._btn-box,.overview #_buttons ._btn-box{display:inline-block !important}.popup.with-notes #_buttons #_btn-bar,.overview #_buttons #_btn-bar{display:none !important}.popup.with-notes #_buttons button,.overview #_buttons button{color:white}.source{font-size:14px;color:#a9a9a9;position:absolute;line-height:2em;bottom:70px;left:60px}.centered{text-align:center}.reflect{-webkit-box-reflect:below 3px -webkit-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-moz-box-reflect:below 3px -moz-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-o-box-reflect:below 3px -o-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);-ms-box-reflect:below 3px -ms-linear-gradient(rgba(255,255,255,0) 85%, #fff 150%);box-reflect:below 3px linear-gradient(rgba(255,255,255,0) 85%,#ffffff 150%)}.flexbox{display:-webkit-flex;display:flex;-webkit-flex-flow:row;flex-flow:row}.flexbox.vcenter{display:-webkit-flex;display:flex;-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;height:100%;width:100%}.flexbox.vleft{-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;height:100%;width:100%;text-align:left}.flexbox.vright{-webkit-flex-flow:column;flex-flow:column;-webkit-justify-content:center;justify-content:center;-webkit-align-content:flex-end;align-content:flex-end;text-align:right;height:100%;width:100%}.auto-fadein{-moz-transition:opacity 0.6s ease-in 1s;-o-transition:opacity 0.6s ease-in 1s;-webkit-transition:opacity 0.6s ease-in;-webkit-transition-delay:1s;transition:opacity 0.6s ease-in 1s;opacity:0}.slide-area{z-index:1000;position:absolute;left:0;top:0;width:100px;height:600px;left:50%;top:50%;cursor:pointer;margin-top:-300px}#prev-slide-area{margin-left:-550px}#next-slide-area{margin-left:450px}.logoslide img{width:383px;height:92px}.segue{padding:60px 120px}.segue h2{color:#e6e6e6;font-size:60px}.segue h3{color:#e6e6e6;line-height:2.8}.segue hgroup{position:absolute;bottom:225px}.thank-you-slide{background:#4387fd !important;color:#fff}.thank-you-slide h2{font-size:60px;color:inherit}.thank-you-slide h3{font-size:52px;color:inherit;text-align:right}.thank-you-slide article>p{margin-top:2em;font-size:20pt}.thank-you-slide>p{position:absolute;bottom:80px;font-size:24pt;line-height:1.3em}aside.gdbar{height:97px;width:215px;position:absolute;left:-1px;top:125px;-moz-border-radius:0 10px 10px 0;-webkit-border-radius:0;border-radius:0 10px 10px 0;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U2ZTZlNiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2U2ZTZlNiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==') no-repeat;background:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e6e6e6),color-stop(100%, #e6e6e6)) no-repeat;background:-moz-linear-gradient(left, #e6e6e6,#e6e6e6) no-repeat;background:-webkit-linear-gradient(left, #e6e6e6,#e6e6e6) no-repeat;background:linear-gradient(to right, #e6e6e6,#e6e6e6) no-repeat;-moz-background-size:0% 100%;-o-background-size:0% 100%;-webkit-background-size:0% 100%;background-size:0% 100%;-moz-transition:all 0.5s ease-out 0.5s;-o-transition:all 0.5s ease-out 0.5s;-webkit-transition:all 0.5s ease-out;-webkit-transition-delay:0.5s;transition:all 0.5s ease-out 0.5s}aside.gdbar.right{right:0;left:-moz-initial;left:initial;top:204px;-moz-transform:rotateZ(180deg);-ms-transform:rotateZ(180deg);-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}aside.gdbar.right img{-moz-transform:rotateZ(180deg);-ms-transform:rotateZ(180deg);-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}aside.gdbar.bottom{top:-moz-initial;top:initial;bottom:60px}aside.gdbar img{width:85px;height:85px;position:absolute;right:0;margin:8px 15px}.title-slide hgroup{bottom:100px}.title-slide hgroup h1{font-size:65px;line-height:1.4;letter-spacing:-3px;color:#515151}.title-slide hgroup h2{font-size:34px;color:#a9a9a9;font-weight:inherit}.title-slide hgroup p{font-size:20px;color:#797979;line-height:1.3;margin-top:2em}.quote{color:#e6e6e6}.quote .author{font-size:24px;position:absolute;bottom:80px;line-height:1.4}.overview.popup .note{display:none !important}.overview slides slide{display:block;cursor:pointer;opacity:0.5;pointer-events:auto !important;width:1100px}.overview slides slide.backdrop{display:none !important}.overview slides slide.far-past,.overview slides slide.past,.overview slides slide.next,.overview slides slide.far-next,.overview slides slide.far-past{opacity:0.5 !important;display:block !important}.overview slides slide.current{opacity:1 !important}.overview .slide-area{display:none}slide[data-transition=\"zoomout\"].past,slide[data-transition=\"zoomin\"].next{-moz-transform:scale(1.2);-ms-transform:scale(1.2);-webkit-transform:scale(1.2);transform:scale(1.2)}slide[data-transition=\"zoomin\"].past,slide[data-transition=\"zoomout\"].next{-moz-transform:scale(0.8);-ms-transform:scale(0.8);-webkit-transform:scale(0.8);transform:scale(0.8)}slide[data-transition=\"horizontal\"].current{-moz-transform-origin:20% 80% 50%;-ms-transform-origin:20% 80% 50%;-webkit-transform-origin:20% 80% 50%;transform-origin:20% 80% 50%}slide[data-transition=\"horizontal\"].next,slide[data-transition=\"horizontal\"].past{-moz-transform:rotate(-30deg);-ms-transform:rotate(-30deg);-webkit-transform:rotate(-30deg);transform:rotate(-30deg)}slide[data-transition=\"horizontal\"].next{left:450px}slide[data-transition=\"horizontal\"].past{left:-450px}slides.layout-widescreen>slide[data-transition=\"horizontal\"].next{left:550px}slides.layout-widescreen>slide[data-transition=\"horizontal\"].past{left:-550px}slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform-origin:50% 50% -450px 50%;-ms-transform-origin:50% 50% -450px 50%;-webkit-transform-origin:50% 50% -450px 50%;transform-origin:50% 50% -450px 50%}.layout-widescreen slide[data-transition=\"horizontal3d\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-origin:50% 50% -550px 50%;-ms-transform-origin:50% 50% -550px 50%;-webkit-transform-origin:50% 50% -550px 50%;transform-origin:50% 50% -550px 50%}slide[data-transition=\"horizontal3d\"].next{-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}slide[data-transition=\"horizontal3d\"].past{-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}slide[data-transition=\"vertical3d\"].next{top:300px;-moz-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);-ms-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);-webkit-transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0);transform:translate3d(0, 75%, 0) rotateX(60deg) translate3d(0, 75%, 0)}slide[data-transition=\"vertical3d\"].past{-moz-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);-ms-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);-webkit-transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);transform:translate3d(0, -75%, 0) rotateX(-60deg) translate3d(0, -75%, 0);top:-300px}slide[data-transition=\"cards\"]{-moz-transition:all 0.8s ease;-o-transition:all 0.8s ease;-webkit-transition:all 0.8s ease;transition:all 0.8s ease;-moz-transform-style:preserve-3d;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-moz-transform-origin:0 100% 0 50%;-ms-transform-origin:0 100% 0 50%;-webkit-transform-origin:0 100% 0 50%;transform-origin:0 100% 0 50%}slide[data-transition=\"cards\"].next{-moz-transform:translate3d(50px, 0, -100px);-ms-transform:translate3d(50px, 0, -100px);-webkit-transform:translate3d(50px, 0, -100px);transform:translate3d(50px, 0, -100px);opacity:0}slide[data-transition=\"cards\"].past{-moz-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);-ms-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);-webkit-transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);transform:translateZ(40px) rotateY(-60deg) translateX(-400px) rotateZ(120deg);opacity:0}slide.pagedown[data-transition=\"glue\"].current{-webkit-animation:moveFromRight 0.6s ease both;-moz-animation:moveFromRight 0.6s ease both;-ms-animation:moveFromRight 0.6s ease both;-o-animation:moveFromRight 0.6s ease both;animation:moveFromRight 0.6s ease both;-webkit-animation-delay:0.3s;-moz-animation-delay:0.3s;-ms-animation-delay:0.3s;-o-animation-delay:0.3s;animation-delay:0.3s;z-index:999}slide.pagedown[data-transition=\"glue\"].next{-webkit-transform-origin:0 50%;-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-o-transform-origin:0 50%;transform-origin:0 50%;-webkit-animation:rotateRightSideFirst 0.8s both ease-in;-moz-animation:rotateRightSideFirst 0.8s both ease-in;-ms-animation:rotateRightSideFirst 0.8s both ease-in;-o-animation:rotateRightSideFirst 0.8s both ease-in;animation:rotateRightSideFirst 0.8s both ease-in;opacity:1}slide.pagedown[data-transition=\"glue\"].past{-webkit-transform-origin:100% 50%;-moz-transform-origin:100% 50%;-ms-transform-origin:100% 50%;-o-transform-origin:100% 50%;transform-origin:100% 50%}slide.pageup[data-transition=\"glue\"].current{-webkit-animation:moveFromLeft 0.6s ease both;-moz-animation:moveFromLeft 0.6s ease both;-ms-animation:moveFromLeft 0.6s ease both;-o-animation:moveFromLeft 0.6s ease both;animation:moveFromLeft 0.6s ease both;-webkit-animation-delay:0.3s;-moz-animation-delay:0.3s;-ms-animation-delay:0.3s;-o-animation-delay:0.3s;animation-delay:0.3s;z-index:999}slide.pageup[data-transition=\"glue\"].next{-webkit-transform-origin:0 50%;-moz-transform-origin:0 50%;-ms-transform-origin:0 50%;-o-transform-origin:0 50%;transform-origin:0 50%}slide.pageup[data-transition=\"glue\"].past{-webkit-transform-origin:100% 50%;-moz-transform-origin:100% 50%;-ms-transform-origin:100% 50%;-o-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-animation:rotateLeftSideFirst 0.8s both ease-in;-moz-animation:rotateLeftSideFirst 0.8s both ease-in;-ms-animation:rotateLeftSideFirst 0.8s both ease-in;-o-animation:rotateLeftSideFirst 0.8s both ease-in;animation:rotateLeftSideFirst 0.8s both ease-in;opacity:1}slide.pagedown[data-transition=\"kontext\"]{-moz-transform:translateZ(-100px);-ms-transform:translateZ(-100px);-webkit-transform:translateZ(-100px);transform:translateZ(-100px)}slide.pagedown[data-transition=\"kontext\"].current{-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-animation:show-right 1s forwards ease;-moz-animation:show-right 1s forwards ease;-ms-animation:show-right 1s forwards ease;-o-animation:show-right 1s forwards ease;animation:show-right 1s forwards ease;z-index:999}slide.pagedown[data-transition=\"kontext\"].past{-webkit-animation:hide-right 1s forwards ease;-moz-animation:hide-right 1s forwards ease;-ms-animation:hide-right 1s forwards ease;-o-animation:hide-right 1s forwards ease;animation:hide-right 1s forwards ease;opacity:1;z-index:99}slide.pageup[data-transition=\"kontext\"].current{-webkit-animation:show-left 1s forwards ease;-moz-animation:show-left 1s forwards ease;-ms-animation:show-left 1s forwards ease;-o-animation:show-left 1s forwards ease;animation:show-left 1s forwards ease;-moz-transform:translateZ(0);-ms-transform:translateZ(0);-webkit-transform:translateZ(0);transform:translateZ(0)}slide.pageup[data-transition=\"kontext\"].next{-webkit-animation:hide-left 1s forwards ease;-moz-animation:hide-left 1s forwards ease;-ms-animation:hide-left 1s forwards ease;-o-animation:hide-left 1s forwards ease;animation:hide-left 1s forwards ease;opacity:1;z-index:99}slide[data-transition=\"newspaper\"].current{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:rotateInNewspaper 0.5s both ease-out;-moz-animation:rotateInNewspaper 0.5s both ease-out;-ms-animation:rotateInNewspaper 0.5s both ease-out;-o-animation:rotateInNewspaper 0.5s both ease-out;animation:rotateInNewspaper 0.5s both ease-out;-webkit-animation-delay:0.5s;-moz-animation-delay:0.5s;-ms-animation-delay:0.5s;-o-animation-delay:0.5s;animation-delay:0.5s;z-index:999}slide[data-transition=\"newspaper\"].past{-webkit-transform-origin:50% 50%;-moz-transform-origin:50% 50%;-ms-transform-origin:50% 50%;-o-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-animation:rotateOutNewspaper 0.5s both ease-out;-moz-animation:rotateOutNewspaper 0.5s both ease-out;-ms-animation:rotateOutNewspaper 0.5s both ease-out;-o-animation:rotateOutNewspaper 0.5s both ease-out;animation:rotateOutNewspaper 0.5s both ease-out;opacity:1;z-index:99}slide[data-transition=\"newspaper\"].next{z-index:99}slide.pagedown[data-transition=\"move\"]{z-index:99}slide.pagedown[data-transition=\"move\"].current{-webkit-animation:moveFromRight 0.6s ease both;-moz-animation:moveFromRight 0.6s ease both;-ms-animation:moveFromRight 0.6s ease both;-o-animation:moveFromRight 0.6s ease both;animation:moveFromRight 0.6s ease both;z-index:999}slide.pagedown[data-transition=\"move\"].past{-webkit-animation:moveToLeft 0.7s ease-in-out both;-moz-animation:moveToLeft 0.7s ease-in-out both;-ms-animation:moveToLeft 0.7s ease-in-out both;-o-animation:moveToLeft 0.7s ease-in-out both;animation:moveToLeft 0.7s ease-in-out both;opacity:1;z-index:999}slide.pageup[data-transition=\"move\"].current{-webkit-animation:moveFromLeft 0.6s ease both;-moz-animation:moveFromLeft 0.6s ease both;-ms-animation:moveFromLeft 0.6s ease both;-o-animation:moveFromLeft 0.6s ease both;animation:moveFromLeft 0.6s ease both;z-index:999}slide.pageup[data-transition=\"move\"].next{-webkit-animation:moveToRight 0.7s ease-in-out both;-moz-animation:moveToRight 0.7s ease-in-out both;-ms-animation:moveToRight 0.7s ease-in-out both;-o-animation:moveToRight 0.7s ease-in-out both;animation:moveToRight 0.7s ease-in-out both;opacity:1;z-index:99}slide.pagedown[data-transition=\"stick\"],slide.pageup[data-transition=\"stick\"]{-webkit-perspective:1600px;-moz-perspective:1600px;-ms-perspective:1600px;-o-perspective:1600px;perspective:1600px;opacity:0;z-index:999}slide.pagedown[data-transition=\"stick\"].current{z-index:1001;opacity:1;-webkit-animation:slideInFromBottomDelayed 0.8s forwards;-moz-animation:slideInFromBottomDelayed 0.8s forwards;-ms-animation:slideInFromBottomDelayed 0.8s forwards;-o-animation:slideInFromBottomDelayed 0.8s forwards;animation:slideInFromBottomDelayed 0.8s forwards}slide.pagedown[data-transition=\"stick\"].past{opacity:0;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;-o-transform-origin:50% 0;transform-origin:50% 0;-webkit-animation:rotateBottomSideOut 0.8s forwards ease-in;-moz-animation:rotateBottomSideOut 0.8s forwards ease-in;-ms-animation:rotateBottomSideOut 0.8s forwards ease-in;-o-animation:rotateBottomSideOut 0.8s forwards ease-in;animation:rotateBottomSideOut 0.8s forwards ease-in}slide.pageup[data-transition=\"stick\"].current{opacity:1;-webkit-transform-origin:50% 0;-moz-transform-origin:50% 0;-ms-transform-origin:50% 0;-o-transform-origin:50% 0;transform-origin:50% 0;-webkit-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;-moz-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;-ms-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;-o-animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in;animation:rotateBottomSideIn 0.8s 0.1s forwards ease-in}slide.pageup[data-transition=\"stick\"].next{opacity:1;-webkit-animation:slideOutToBottom 0.8s forwards;-moz-animation:slideOutToBottom 0.8s forwards;-ms-animation:slideOutToBottom 0.8s forwards;-o-animation:slideOutToBottom 0.8s forwards;animation:slideOutToBottom 0.8s forwards}slide[data-transition=\"vkontext\"]{-webkit-perspective:1000px;-moz-perspective:1000px;-ms-perspective:1000px;-o-perspective:1000px;perspective:1000px}slide.pagedown[data-transition=\"vkontext\"].current{-webkit-animation:showRight 1s forwards;-moz-animation:showRight 1s forwards;-ms-animation:showRight 1s forwards;-o-animation:showRight 1s forwards;animation:showRight 1s forwards}slide.pagedown[data-transition=\"vkontext\"].past{-webkit-animation:hideLeft 1s forwards;-moz-animation:hideLeft 1s forwards;-ms-animation:hideLeft 1s forwards;-o-animation:hideLeft 1s forwards;animation:hideLeft 1s forwards}slide.pageup[data-transition=\"vkontext\"].current{-webkit-animation:showLeft 1s forwards;-moz-animation:showLeft 1s forwards;-ms-animation:showLeft 1s forwards;-o-animation:showLeft 1s forwards;animation:showLeft 1s forwards}slide.pageup[data-transition=\"vkontext\"].next{-webkit-animation:hideRight 1s forwards;-moz-animation:hideRight 1s forwards;-ms-animation:hideRight 1s forwards;-o-animation:hideRight 1s forwards;animation:hideRight 1s forwards}slide.pagedown[data-transition=\"earthquake\"].current{-webkit-animation:pushFromTop 1s 0.1s forwards;-moz-animation:pushFromTop 1s 0.1s forwards;-ms-animation:pushFromTop 1s 0.1s forwards;-o-animation:pushFromTop 1s 0.1s forwards;animation:pushFromTop 1s 0.1s forwards;opacity:1}slide.pagedown[data-transition=\"earthquake\"].past{opacity:1;-webkit-animation:shakeSlideBottom 1s 0.1s forwards;-moz-animation:shakeSlideBottom 1s 0.1s forwards;-ms-animation:shakeSlideBottom 1s 0.1s forwards;-o-animation:shakeSlideBottom 1s 0.1s forwards;animation:shakeSlideBottom 1s 0.1s forwards}slide.pageup[data-transition=\"earthquake\"].current{opacity:1;-webkit-animation:pushFromBottom 1s 0.1s forwards;-moz-animation:pushFromBottom 1s 0.1s forwards;-ms-animation:pushFromBottom 1s 0.1s forwards;-o-animation:pushFromBottom 1s 0.1s forwards;animation:pushFromBottom 1s 0.1s forwards}slide.pageup[data-transition=\"earthquake\"].next{opacity:1;-webkit-animation:shakeSlideTop 1s 0.1s forwards;-moz-animation:shakeSlideTop 1s 0.1s forwards;-ms-animation:shakeSlideTop 1s 0.1s forwards;-o-animation:shakeSlideTop 1s 0.1s forwards;animation:shakeSlideTop 1s 0.1s forwards}slide[data-transition=\"earthquake\"]::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;pointer-events:none;background-color:rgba(0,0,0,0.3);transition:opacity 0.5s}slide[data-transition=\"earthquake\"].next::after,slide[data-transition=\"earthquake\"].past::after{opacity:1}slide.pagedown[data-transition=\"circle\"],slide.pageup[data-transition=\"circle\"]{-webkit-transform-origin:50% 400%;transform-origin:50% 400%}slide.pagedown[data-transition=\"circle\"]::after,slide.pageup[data-transition=\"circle\"]::after{content:'';position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;pointer-events:none;background-color:#000;-webkit-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);-moz-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);-ms-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);-o-transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1);transition:opacity 0.9s cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"circle\"].current{opacity:1;-webkit-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateInCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"circle\"].past{opacity:1;-webkit-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateOutCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"circle\"].current{opacity:1;-webkit-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateInCircLeft 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"circle\"].next{opacity:1;-webkit-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:rotateOutCircRight 0.9s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide[data-transition=\"circle\"].next::after,slide[data-transition=\"circle\"].past::after{opacity:1}slide.pagedown[data-transition=\"pulse\"],slide.pageup[data-transition=\"pulse\"]{opacity:0}slide.pagedown[data-transition=\"pulse\"].past,slide.pageup[data-transition=\"pulse\"].next{-webkit-animation:scaleUpFadeOut 0.8s forwards ease-in;-moz-animation:scaleUpFadeOut 0.8s forwards ease-in;-ms-animation:scaleUpFadeOut 0.8s forwards ease-in;-o-animation:scaleUpFadeOut 0.8s forwards ease-in;animation:scaleUpFadeOut 0.8s forwards ease-in}slide.pageup[data-transition=\"pulse\"].current,slide.pagedown[data-transition=\"pulse\"].current{-webkit-animation:scaleDownFadeIn 0.8s forwards ease-out;-moz-animation:scaleDownFadeIn 0.8s forwards ease-out;-ms-animation:scaleDownFadeIn 0.8s forwards ease-out;-o-animation:scaleDownFadeIn 0.8s forwards ease-out;animation:scaleDownFadeIn 0.8s forwards ease-out}slide.pagedown[data-transition=\"slide\"].past{-webkit-animation:rotateSlideOutToLeft 1s both ease;-moz-animation:rotateSlideOutToLeft 1s both ease;-ms-animation:rotateSlideOutToLeft 1s both ease;-o-animation:rotateSlideOutToLeft 1s both ease;animation:rotateSlideOutToLeft 1s both ease}slide.pagedown[data-transition=\"slide\"].current{-webkit-animation:rotateSlideInFromRight 1s both ease;-moz-animation:rotateSlideInFromRight 1s both ease;-ms-animation:rotateSlideInFromRight 1s both ease;-o-animation:rotateSlideInFromRight 1s both ease;animation:rotateSlideInFromRight 1s both ease}slide.pageup[data-transition=\"slide\"].current{-webkit-animation:rotateSlideInFromLeft 1s both ease;-moz-animation:rotateSlideInFromLeft 1s both ease;-ms-animation:rotateSlideInFromLeft 1s both ease;-o-animation:rotateSlideInFromLeft 1s both ease;animation:rotateSlideInFromLeft 1s both ease}slide.pageup[data-transition=\"slide\"].next{-webkit-animation:rotateSlideOutToRight 1s both ease;-moz-animation:rotateSlideOutToRight 1s both ease;-ms-animation:rotateSlideOutToRight 1s both ease;-o-animation:rotateSlideOutToRight 1s both ease;animation:rotateSlideOutToRight 1s both ease}slide.pagedown[data-transition=\"slide2\"].past{-webkit-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideOutScaleLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"slide2\"].current{opacity:1;-webkit-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideInFromRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"slide2\"].next{-webkit-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-moz-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-ms-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);-o-animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideOutScaleRight 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pageup[data-transition=\"slide2\"].current{opacity:1;-webkit-animation:slideInFromLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1);animation:slideInFromLeft 1.2s forwards cubic-bezier(0.7, 0, 0.3, 1)}slide.pagedown[data-transition=\"slide3\"].past{-webkit-animation:slideOutScaleLeft 1.2s forwards;-moz-animation:slideOutScaleLeft 1.2s forwards;-ms-animation:slideOutScaleLeft 1.2s forwards;-o-animation:slideOutScaleLeft 1.2s forwards;animation:slideOutScaleLeft 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide.pagedown[data-transition=\"slide3\"].current{opacity:1;-webkit-animation:slideInFromRight 1.2s forwards;-moz-animation:slideInFromRight 1.2s forwards;-ms-animation:slideInFromRight 1.2s forwards;-o-animation:slideInFromRight 1.2s forwards;animation:slideInFromRight 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide.pageup[data-transition=\"slide3\"].current{opacity:1;-webkit-animation:slideInFromLeft 1.2s forwards;-moz-animation:slideInFromLeft 1.2s forwards;-ms-animation:slideInFromLeft 1.2s forwards;-o-animation:slideInFromLeft 1.2s forwards;animation:slideInFromLeft 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide.pageup[data-transition=\"slide3\"].next{opacity:1;-webkit-animation:slideOutScaleRight 1.2s forwards;-moz-animation:slideOutScaleRight 1.2s forwards;-ms-animation:slideOutScaleRight 1.2s forwards;-o-animation:slideOutScaleRight 1.2s forwards;animation:slideOutScaleRight 1.2s forwards;-webkit-animation-timing-function:cubic-bezier(1, 0, 0, 1);-moz-animation-timing-function:cubic-bezier(1, 0, 0, 1);-ms-animation-timing-function:cubic-bezier(1, 0, 0, 1);-o-animation-timing-function:cubic-bezier(1, 0, 0, 1);animation-timing-function:cubic-bezier(1, 0, 0, 1)}slide[data-transition=\"cover-diamond\"]{-moz-transition:opacity 0s,-webkit-clip-path 1s;-o-transition:opacity 0s,-webkit-clip-path 1s;-webkit-transition:opacity 0s,-webkit-clip-path 1s;transition:opacity 0s,-webkit-clip-path 1s;opacity:0;-webkit-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);-moz-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);-ms-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);-o-clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);clip-path:polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%)}slide[data-transition=\"cover-diamond\"].current{opacity:1;-webkit-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);-moz-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);-ms-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);-o-clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%);clip-path:polygon(50% -100%, 137.5% 50%, 50% 200%, -37.5% 50%)}slide[data-transition=\"cover-diamond\"].past{-moz-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;-o-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;-webkit-transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s;transition:opacity,cubic-bezier(0.11, 0.75, 0.58, 0.97) 0s}slide[data-transition=\"cover-circle\"]{opacity:0;-moz-transition:opacity 0,-webkit-clip-path 1s;-o-transition:opacity 0,-webkit-clip-path 1s;-webkit-transition:opacity 0,-webkit-clip-path 1s;transition:opacity 0,-webkit-clip-path 1s;-webkit-clip-path:circle(5% at 50% 50%);-moz-clip-path:circle(5% at 50% 50%);-ms-clip-path:circle(5% at 50% 50%);-o-clip-path:circle(5% at 50% 50%);clip-path:circle(5% at 50% 50%)}slide[data-transition=\"cover-circle\"].current{opacity:1;-webkit-clip-path:circle(80% at 50% 50%);-moz-clip-path:circle(80% at 50% 50%);-ms-clip-path:circle(80% at 50% 50%);-o-clip-path:circle(80% at 50% 50%);clip-path:circle(80% at 50% 50%)}slide[data-transition=\"cover-circle\"].past{opacity:0;-moz-transition:opacity,0 ease-in;-o-transition:opacity,0 ease-in;-webkit-transition:opacity,0 ease-in;transition:opacity,0 ease-in}@-webkit-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-moz-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-ms-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-o-keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@keyframes slideOutScaleRight{from{opacity:1}to{-webkit-transform:translateX(100%) scale(0.9);-moz-transform:translateX(100%) scale(0.9);-ms-transform:translateX(100%) scale(0.9);-o-transform:translateX(100%) scale(0.9);transform:translateX(100%) scale(0.9);opacity:0}}@-webkit-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-moz-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-ms-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-o-keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@keyframes slideOutScaleLeft{from{opacity:1}to{-webkit-transform:translateX(-100%) scale(0.9);-moz-transform:translateX(-100%) scale(0.9);-ms-transform:translateX(-100%) scale(0.9);-o-transform:translateX(-100%) scale(0.9);transform:translateX(-100%) scale(0.9);opacity:0}}@-webkit-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-moz-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-ms-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-o-keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@keyframes slideInFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}to{-webkit-transform:translateX(0);-moz-transform:translateX(0);-ms-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-moz-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-ms-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-o-keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@keyframes scaleUpFadeOut{from{opacity:1}50%{-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2);opacity:.5}75%{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-ms-transform:scale(1.1);-o-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1);opacity:0}}@-webkit-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes scaleDownFadeIn{from{opacity:0}50%{opacity:0.5;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}100%{opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-webkit-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-moz-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-ms-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-o-keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@keyframes rotateOutCircLeft{to{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}}@-webkit-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-moz-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-ms-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-o-keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@keyframes rotateInCircRight{from{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-webkit-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-moz-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-ms-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-o-keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@keyframes rotateOutCircRight{to{-webkit-transform:rotate(20deg) translateX(100%);-moz-transform:rotate(20deg) translateX(100%);-ms-transform:rotate(20deg) translateX(100%);-o-transform:rotate(20deg) translateX(100%);transform:rotate(20deg) translateX(100%)}}@-webkit-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-moz-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-ms-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-o-keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@keyframes rotateInCircLeft{from{-webkit-transform:rotate(-20deg) translateX(-100%);-moz-transform:rotate(-20deg) translateX(-100%);-ms-transform:rotate(-20deg) translateX(-100%);-o-transform:rotate(-20deg) translateX(-100%);transform:rotate(-20deg) translateX(-100%)}to{-webkit-transform:rotate(0deg) translateX(0);-moz-transform:rotate(0deg) translateX(0);-ms-transform:rotate(0deg) translateX(0);-o-transform:rotate(0deg) translateX(0);transform:rotate(0deg) translateX(0)}}@-webkit-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes shakeSlideBottom{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes pushFromTop{0%,70%{opacity:0;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}100%{opacity:1;-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes shakeSlideTop{0%{-webkit-transform:translate(0px, 0px) rotate(0deg);-moz-transform:translate(0px, 0px) rotate(0deg);-ms-transform:translate(0px, 0px) rotate(0deg);-o-transform:translate(0px, 0px) rotate(0deg);transform:translate(0px, 0px) rotate(0deg)}2%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}4%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}6%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}8%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}10%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}12%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}14%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}16%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}18%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}20%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}22%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}24%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}26%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}28%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}30%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}32%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}34%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}36%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}38%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}40%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}42%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}44%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}46%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}48%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}50%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}52%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}54%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}56%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}58%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}60%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}62%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}64%{-webkit-transform:translate(0px, -1px) rotate(-0.5deg);-moz-transform:translate(0px, -1px) rotate(-0.5deg);-ms-transform:translate(0px, -1px) rotate(-0.5deg);-o-transform:translate(0px, -1px) rotate(-0.5deg);transform:translate(0px, -1px) rotate(-0.5deg)}66%{-webkit-transform:translate(-1px, -1px) rotate(-0.5deg);-moz-transform:translate(-1px, -1px) rotate(-0.5deg);-ms-transform:translate(-1px, -1px) rotate(-0.5deg);-o-transform:translate(-1px, -1px) rotate(-0.5deg);transform:translate(-1px, -1px) rotate(-0.5deg)}68%{-webkit-transform:translate(-1px, 0px) rotate(-0.5deg);-moz-transform:translate(-1px, 0px) rotate(-0.5deg);-ms-transform:translate(-1px, 0px) rotate(-0.5deg);-o-transform:translate(-1px, 0px) rotate(-0.5deg);transform:translate(-1px, 0px) rotate(-0.5deg)}70%{-webkit-transform:translate(0px, 0px) rotate(-0.5deg);-moz-transform:translate(0px, 0px) rotate(-0.5deg);-ms-transform:translate(0px, 0px) rotate(-0.5deg);-o-transform:translate(0px, 0px) rotate(-0.5deg);transform:translate(0px, 0px) rotate(-0.5deg)}100%{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-moz-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-ms-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-o-keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@keyframes pushFromBottom{0%,70%{opacity:0;-webkit-transition-timing-function:translateY(100%);-moz-transition-timing-function:translateY(100%);-ms-transition-timing-function:translateY(100%);-o-transition-timing-function:translateY(100%);transition-timing-function:translateY(100%)}100%{opacity:1;-webkit-transition-timing-function:translateY(0);-moz-transition-timing-function:translateY(0);-ms-transition-timing-function:translateY(0);-o-transition-timing-function:translateY(0);transition-timing-function:translateY(0)}}@-webkit-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-moz-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-ms-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-o-keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@keyframes hideLeft{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-webkit-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-moz-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-ms-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-o-keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@keyframes showRight{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1}41%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);opacity:1;z-index:9999}100%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px);opacity:1;z-index:9999}}@-webkit-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-moz-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-ms-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-o-keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@keyframes hideRight{0%{-webkit-transition-timing-function:translateZ(0px);-moz-transition-timing-function:translateZ(0px);-ms-transition-timing-function:translateZ(0px);-o-transition-timing-function:translateZ(0px);transition-timing-function:translateZ(0px)}40%{-webkit-transition-timing-function:translate(0, 40%) scale(0.8);-moz-transition-timing-function:translate(0, 40%) scale(0.8);-ms-transition-timing-function:translate(0, 40%) scale(0.8);-o-transition-timing-function:translate(0, 40%) scale(0.8);transition-timing-function:translate(0, 40%) scale(0.8);z-index:9999}100%{opacity:1;-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px)}}@-webkit-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-moz-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-ms-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-o-keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@keyframes showLeft{0%{-webkit-transition-timing-function:translateZ(-400px);-moz-transition-timing-function:translateZ(-400px);-ms-transition-timing-function:translateZ(-400px);-o-transition-timing-function:translateZ(-400px);transition-timing-function:translateZ(-400px);opacity:1}40%{-webkit-transition-timing-function:translate(0, -40%) scale(0.8);-moz-transition-timing-function:translate(0, -40%) scale(0.8);-ms-transition-timing-function:translate(0, -40%) scale(0.8);-o-transition-timing-function:translate(0, -40%) scale(0.8);transition-timing-function:translate(0, -40%) scale(0.8);opacity:1}41%{-webkit-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-moz-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-ms-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);-o-transform:translate(0, -40%) scale(0.8) rotateX(-20deg);transform:translate(0, -40%) scale(0.8) rotateX(-20deg);opacity:1;z-index:9999}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);opacity:1;z-index:9999}}@-webkit-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-moz-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-ms-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-o-keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@keyframes show-right{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-webkit-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-moz-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-ms-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-o-keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@keyframes hide-right{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-webkit-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-moz-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-ms-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-o-keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@keyframes show-left{0%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px)}40%{-webkit-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-moz-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-ms-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);-o-transform:translate(-40%, 0) scale(0.8) rotateY(20deg);transform:translate(-40%, 0) scale(0.8) rotateY(20deg)}100%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px)}}@-webkit-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-moz-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-ms-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-o-keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@keyframes hide-left{0%{-webkit-transform:translateZ(0px);-moz-transform:translateZ(0px);-ms-transform:translateZ(0px);-o-transform:translateZ(0px);transform:translateZ(0px);visibility:visible}40%{-webkit-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-moz-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-ms-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);-o-transform:translate(40%, 0) scale(0.8) rotateY(-20deg);transform:translate(40%, 0) scale(0.8) rotateY(-20deg)}100%{-webkit-transform:translateZ(-200px);-moz-transform:translateZ(-200px);-ms-transform:translateZ(-200px);-o-transform:translateZ(-200px);transform:translateZ(-200px);visibility:hidden}}@-webkit-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveToLeft{to{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveFromLeft{from{-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveToRight{to{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveFromRight{from{-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveToTop{to{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveFromTop{from{-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveToBottom{to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveFromBottom{from{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes fade{to{opacity:0.3}}@-moz-keyframes fade{to{opacity:0.3}}@-ms-keyframes fade{to{opacity:0.3}}@-o-keyframes fade{to{opacity:0.3}}@keyframes fade{to{opacity:0.3}}@-webkit-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveToLeftFade{to{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-moz-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-ms-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-o-keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@keyframes moveFromLeftFade{from{opacity:0.3;-webkit-transform:translateX(-100%);-moz-transform:translateX(-100%);-ms-transform:translateX(-100%);-o-transform:translateX(-100%);transform:translateX(-100%)}}@-webkit-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveToRightFade{to{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-moz-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-ms-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-o-keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@keyframes moveFromRightFade{from{opacity:0.3;-webkit-transform:translateX(100%);-moz-transform:translateX(100%);-ms-transform:translateX(100%);-o-transform:translateX(100%);transform:translateX(100%)}}@-webkit-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveToTopFade{to{opacity:0.3;-webkit-transform:translateY(-100%);-moz-transform:translateY(-100%);-ms-transform:translateY(-100%);-o-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-moz-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-ms-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-o-keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@keyframes moveFromTopFade{from{opacity:0.3;-webkit-transform:translateY(-100%);transform:translateY(-100%)}}@-webkit-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveToBottomFade{to{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes moveFromBottomFade{from{opacity:0.3;-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-moz-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-ms-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-o-keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@keyframes scaleDown{to{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-webkit-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-moz-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-ms-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-o-keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@keyframes scaleUp{from{opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}}@-webkit-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-moz-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-ms-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-o-keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@keyframes scaleUpDown{from{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-webkit-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-moz-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-ms-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-o-keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@keyframes scaleDownUp{to{opacity:0;-webkit-transform:scale(1.2);-moz-transform:scale(1.2);-ms-transform:scale(1.2);-o-transform:scale(1.2);transform:scale(1.2)}}@-webkit-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-moz-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-ms-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-o-keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@keyframes scaleDownCenter{to{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-webkit-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-moz-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-ms-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-o-keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@keyframes scaleUpCenter{from{opacity:0;-webkit-transform:scale(0.7);-moz-transform:scale(0.7);-ms-transform:scale(0.7);-o-transform:scale(0.7);transform:scale(0.7)}}@-webkit-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateRightSideFirst{40%{-webkit-transform:rotateY(15deg);-moz-transform:rotateY(15deg);-ms-transform:rotateY(15deg);-o-transform:rotateY(15deg);transform:rotateY(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateLeftSideFirst{40%{-webkit-transform:rotateY(-15deg);-moz-transform:rotateY(-15deg);-ms-transform:rotateY(-15deg);-o-transform:rotateY(-15deg);transform:rotateY(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateTopSideFirst{40%{-webkit-transform:rotateX(15deg);-moz-transform:rotateX(15deg);-ms-transform:rotateX(15deg);-o-transform:rotateX(15deg);transform:rotateX(15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-moz-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-ms-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-o-keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@keyframes rotateBottomSideFirst{40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);opacity:.8;-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px);opacity:0}}@-webkit-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-moz-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-ms-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-o-keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@keyframes flipOutRight{to{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-webkit-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-moz-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-ms-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-o-keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@keyframes flipInLeft{from{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-webkit-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-moz-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-ms-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-o-keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@keyframes flipOutLeft{to{-webkit-transform:translateZ(-1000px) rotateY(-90deg);-moz-transform:translateZ(-1000px) rotateY(-90deg);-ms-transform:translateZ(-1000px) rotateY(-90deg);-o-transform:translateZ(-1000px) rotateY(-90deg);transform:translateZ(-1000px) rotateY(-90deg);opacity:0.2}}@-webkit-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-moz-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-ms-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-o-keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@keyframes flipInRight{from{-webkit-transform:translateZ(-1000px) rotateY(90deg);-moz-transform:translateZ(-1000px) rotateY(90deg);-ms-transform:translateZ(-1000px) rotateY(90deg);-o-transform:translateZ(-1000px) rotateY(90deg);transform:translateZ(-1000px) rotateY(90deg);opacity:0.2}}@-webkit-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-moz-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-ms-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-o-keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@keyframes flipOutTop{to{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-webkit-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-moz-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-ms-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-o-keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@keyframes flipInBottom{from{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-webkit-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-moz-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-ms-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-o-keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@keyframes flipOutBottom{to{-webkit-transform:translateZ(-1000px) rotateX(-90deg);-moz-transform:translateZ(-1000px) rotateX(-90deg);-ms-transform:translateZ(-1000px) rotateX(-90deg);-o-transform:translateZ(-1000px) rotateX(-90deg);transform:translateZ(-1000px) rotateX(-90deg);opacity:0.2}}@-webkit-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-moz-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-ms-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-o-keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@keyframes flipInTop{from{-webkit-transform:translateZ(-1000px) rotateX(90deg);-moz-transform:translateZ(-1000px) rotateX(90deg);-ms-transform:translateZ(-1000px) rotateX(90deg);-o-transform:translateZ(-1000px) rotateX(90deg);transform:translateZ(-1000px) rotateX(90deg);opacity:0.2}}@-webkit-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-moz-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-ms-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-o-keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@keyframes rotateFall{0%{-webkit-transform:rotateZ(0deg);-moz-transform:rotateZ(0deg);-ms-transform:rotateZ(0deg);-o-transform:rotateZ(0deg);transform:rotateZ(0deg)}20%{-webkit-transform:rotateZ(10deg);-moz-transform:rotateZ(10deg);-ms-transform:rotateZ(10deg);-o-transform:rotateZ(10deg);transform:rotateZ(10deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}40%{-webkit-transform:rotateZ(17deg);-moz-transform:rotateZ(17deg);-ms-transform:rotateZ(17deg);-o-transform:rotateZ(17deg);transform:rotateZ(17deg)}60%{-webkit-transform:rotateZ(16deg);-moz-transform:rotateZ(16deg);-ms-transform:rotateZ(16deg);-o-transform:rotateZ(16deg);transform:rotateZ(16deg)}100%{-webkit-transform:translateY(100%) rotateZ(17deg);-moz-transform:translateY(100%) rotateZ(17deg);-ms-transform:translateY(100%) rotateZ(17deg);-o-transform:translateY(100%) rotateZ(17deg);transform:translateY(100%) rotateZ(17deg)}}@-webkit-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-moz-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-ms-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-o-keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@keyframes rotateOutNewspaper{to{-webkit-transform:translateZ(-3000px) rotateZ(360deg);-moz-transform:translateZ(-3000px) rotateZ(360deg);-ms-transform:translateZ(-3000px) rotateZ(360deg);-o-transform:translateZ(-3000px) rotateZ(360deg);transform:translateZ(-3000px) rotateZ(360deg);opacity:0}}@-webkit-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-moz-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-ms-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-o-keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@keyframes rotateInNewspaper{from{-webkit-transform:translateZ(-3000px) rotateZ(-360deg);-moz-transform:translateZ(-3000px) rotateZ(-360deg);-ms-transform:translateZ(-3000px) rotateZ(-360deg);-o-transform:translateZ(-3000px) rotateZ(-360deg);transform:translateZ(-3000px) rotateZ(-360deg);opacity:0}}@-webkit-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-moz-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-ms-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-o-keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@keyframes rotatePushLeft{to{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-webkit-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-moz-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-ms-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-o-keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@keyframes rotatePushRight{to{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-webkit-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-moz-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-ms-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-o-keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@keyframes rotatePushTop{to{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-webkit-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-moz-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-ms-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-o-keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@keyframes rotatePushBottom{to{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-webkit-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-moz-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-ms-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-o-keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@keyframes rotatePullRight{from{opacity:0;-webkit-transform:rotateY(-90deg);-moz-transform:rotateY(-90deg);-ms-transform:rotateY(-90deg);-o-transform:rotateY(-90deg);transform:rotateY(-90deg)}}@-webkit-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-moz-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-ms-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-o-keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@keyframes rotatePullLeft{from{opacity:0;-webkit-transform:rotateY(90deg);-moz-transform:rotateY(90deg);-ms-transform:rotateY(90deg);-o-transform:rotateY(90deg);transform:rotateY(90deg)}}@-webkit-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-moz-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-ms-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-o-keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@keyframes rotatePullTop{from{opacity:0;-webkit-transform:rotateX(-90deg);-moz-transform:rotateX(-90deg);-ms-transform:rotateX(-90deg);-o-transform:rotateX(-90deg);transform:rotateX(-90deg)}}@-webkit-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-moz-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-ms-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-o-keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@keyframes rotatePullBottom{from{opacity:0;-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-ms-transform:rotateX(90deg);-o-transform:rotateX(90deg);transform:rotateX(90deg)}}@-webkit-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-moz-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-ms-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-o-keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@keyframes rotateFoldRight{to{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-moz-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-ms-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-o-keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateFoldLeft{to{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-moz-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-ms-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-o-keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateFoldTop{to{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-moz-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-ms-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-o-keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@keyframes rotateFoldBottom{to{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-moz-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-ms-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-o-keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateUnfoldLeft{from{opacity:0;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-moz-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-ms-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-o-keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@keyframes rotateUnfoldRight{from{opacity:0;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-moz-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-ms-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-o-keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateUnfoldTop{from{opacity:0;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-moz-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-ms-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-o-keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@keyframes rotateUnfoldBottom{from{opacity:0;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-moz-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-ms-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-o-keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@keyframes rotateRoomLeftOut{to{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-webkit-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-moz-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-ms-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-o-keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@keyframes rotateRoomLeftIn{from{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-webkit-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-moz-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-ms-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-o-keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@keyframes rotateRoomRightOut{to{opacity:.3;-webkit-transform:translateX(100%) rotateY(-90deg);-moz-transform:translateX(100%) rotateY(-90deg);-ms-transform:translateX(100%) rotateY(-90deg);-o-transform:translateX(100%) rotateY(-90deg);transform:translateX(100%) rotateY(-90deg)}}@-webkit-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-moz-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-ms-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-o-keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@keyframes rotateRoomRightIn{from{opacity:.3;-webkit-transform:translateX(-100%) rotateY(90deg);-moz-transform:translateX(-100%) rotateY(90deg);-ms-transform:translateX(-100%) rotateY(90deg);-o-transform:translateX(-100%) rotateY(90deg);transform:translateX(-100%) rotateY(90deg)}}@-webkit-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-moz-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-ms-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-o-keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@keyframes rotateRoomTopOut{to{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-webkit-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-moz-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-ms-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-o-keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@keyframes rotateRoomTopIn{from{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-webkit-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-moz-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-ms-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-o-keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@keyframes rotateRoomBottomOut{to{opacity:.3;-webkit-transform:translateY(100%) rotateX(90deg);-moz-transform:translateY(100%) rotateX(90deg);-ms-transform:translateY(100%) rotateX(90deg);-o-transform:translateY(100%) rotateX(90deg);transform:translateY(100%) rotateX(90deg)}}@-webkit-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-moz-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-ms-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-o-keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@keyframes rotateRoomBottomIn{from{opacity:.3;-webkit-transform:translateY(-100%) rotateX(-90deg);-moz-transform:translateY(-100%) rotateX(-90deg);-ms-transform:translateY(-100%) rotateX(-90deg);-o-transform:translateY(-100%) rotateX(-90deg);transform:translateY(-100%) rotateX(-90deg)}}@-webkit-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-moz-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-ms-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-o-keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@keyframes rotateCubeLeftOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}100%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}}@-webkit-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-moz-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-ms-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-o-keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@keyframes rotateCubeLeftIn{0%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}}@-webkit-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-moz-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-ms-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-o-keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@keyframes rotateCubeRightOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-moz-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-ms-transform:translateX(50%) translateZ(-200px) rotateY(45deg);-o-transform:translateX(50%) translateZ(-200px) rotateY(45deg);transform:translateX(50%) translateZ(-200px) rotateY(45deg)}100%{opacity:.3;-webkit-transform:translateX(100%) rotateY(90deg);-moz-transform:translateX(100%) rotateY(90deg);-ms-transform:translateX(100%) rotateY(90deg);-o-transform:translateX(100%) rotateY(90deg);transform:translateX(100%) rotateY(90deg)}}@-webkit-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-moz-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-ms-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-o-keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@keyframes rotateCubeRightIn{0%{opacity:.3;-webkit-transform:translateX(-100%) rotateY(-90deg);-moz-transform:translateX(-100%) rotateY(-90deg);-ms-transform:translateX(-100%) rotateY(-90deg);-o-transform:translateX(-100%) rotateY(-90deg);transform:translateX(-100%) rotateY(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-moz-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-ms-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);-o-transform:translateX(-50%) translateZ(-200px) rotateY(-45deg);transform:translateX(-50%) translateZ(-200px) rotateY(-45deg)}}@-webkit-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-moz-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-ms-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-o-keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@keyframes rotateCubeTopOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transform:translateY(-50%) translateZ(-200px) rotateX(45deg);transform:translateY(-50%) translateZ(-200px) rotateX(45deg)}100%{opacity:.3;-webkit-transform:translateY(-100%) rotateX(90deg);-moz-transform:translateY(-100%) rotateX(90deg);-ms-transform:translateY(-100%) rotateX(90deg);-o-transform:translateY(-100%) rotateX(90deg);transform:translateY(-100%) rotateX(90deg)}}@-webkit-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-moz-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-ms-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-o-keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@keyframes rotateCubeTopIn{0%{opacity:.3;-webkit-transform:translateY(100%) rotateX(-90deg);-moz-transform:translateY(100%) rotateX(-90deg);-ms-transform:translateY(100%) rotateX(-90deg);-o-transform:translateY(100%) rotateX(-90deg);transform:translateY(100%) rotateX(-90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transform:translateY(50%) translateZ(-200px) rotateX(-45deg);transform:translateY(50%) translateZ(-200px) rotateX(-45deg)}}@-webkit-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-moz-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-ms-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-o-keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@keyframes rotateCubeBottomOut{50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-moz-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-ms-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);-o-transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg);transition-timing-function:translateY(50%) translateZ(-200px) rotateX(-45deg)}100%{opacity:.3;-webkit-transition-timing-function:translateY(100%) rotateX(-90deg);-moz-transition-timing-function:translateY(100%) rotateX(-90deg);-ms-transition-timing-function:translateY(100%) rotateX(-90deg);-o-transition-timing-function:translateY(100%) rotateX(-90deg);transition-timing-function:translateY(100%) rotateX(-90deg)}}@-webkit-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-moz-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-ms-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-o-keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@keyframes rotateCubeBottomIn{0%{opacity:.3;-webkit-transition-timing-function:translateY(-100%) rotateX(90deg);-moz-transition-timing-function:translateY(-100%) rotateX(90deg);-ms-transition-timing-function:translateY(-100%) rotateX(90deg);-o-transition-timing-function:translateY(-100%) rotateX(90deg);transition-timing-function:translateY(-100%) rotateX(90deg)}50%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-moz-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-ms-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);-o-transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg);transition-timing-function:translateY(-50%) translateZ(-200px) rotateX(45deg)}}@-webkit-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-moz-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-ms-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-o-keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@keyframes rotateCarouselLeftOut{to{opacity:.3;-webkit-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-150%) scale(0.4) rotateY(-65deg)}}@-webkit-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-moz-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-ms-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-o-keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@keyframes rotateCarouselLeftIn{from{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-webkit-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-moz-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-ms-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-o-keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@keyframes rotateCarouselRightOut{to{opacity:.3;-webkit-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-moz-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-ms-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);-o-transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg);transition-timing-function:translateX(200%) scale(0.4) rotateY(65deg)}}@-webkit-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-moz-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-ms-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-o-keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@keyframes rotateCarouselRightIn{from{opacity:.3;-webkit-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-moz-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-ms-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);-o-transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg);transition-timing-function:translateX(-200%) scale(0.4) rotateY(-65deg)}}@-webkit-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-moz-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-ms-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-o-keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@keyframes rotateCarouselTopOut{to{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-webkit-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-moz-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-ms-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-o-keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@keyframes rotateCarouselTopIn{from{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-webkit-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-moz-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-ms-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-o-keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@keyframes rotateCarouselBottomOut{to{opacity:.3;-webkit-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-moz-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-ms-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);-o-transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg);transition-timing-function:translateY(200%) scale(0.4) rotateX(-65deg)}}@-webkit-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-moz-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-ms-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-o-keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@keyframes rotateCarouselBottomIn{from{opacity:.3;-webkit-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-moz-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-ms-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);-o-transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg);transition-timing-function:translateY(-200%) scale(0.4) rotateX(65deg)}}@-webkit-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-moz-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-ms-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-o-keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@keyframes rotateSidesOut{to{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(90deg);-o-transition-timing-function:translateZ(-500px) rotateY(90deg);transition-timing-function:translateZ(-500px) rotateY(90deg)}}@-webkit-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-moz-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-ms-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-o-keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@keyframes rotateSidesIn{from{opacity:0;-webkit-transition-timing-function:translateZ(-500px) rotateY(-90deg);-moz-transition-timing-function:translateZ(-500px) rotateY(-90deg);-ms-transition-timing-function:translateZ(-500px) rotateY(-90deg);-o-transition-timing-function:translateZ(-500px) rotateY(-90deg);transition-timing-function:translateZ(-500px) rotateY(-90deg)}}@-webkit-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-moz-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-ms-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-o-keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@keyframes rotateSlideOutToLeft{25%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px);-moz-transition-timing-function:translateZ(-500px);-ms-transition-timing-function:translateZ(-500px);-o-transition-timing-function:translateZ(-500px);transition-timing-function:translateZ(-500px)}75%{opacity:.5;-webkit-transition-timing-function:translateZ(-500px) translateX(-200%);-moz-transition-timing-function:translateZ(-500px) translateX(-200%);-ms-transition-timing-function:translateZ(-500px) translateX(-200%);-o-transition-timing-function:translateZ(-500px) translateX(-200%);transition-timing-function:translateZ(-500px) translateX(-200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}}@-webkit-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-moz-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-ms-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-o-keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@keyframes rotateSlideOutToRight{0%{opacity:1}25%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}75%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}100%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}}@-webkit-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-moz-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-ms-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-o-keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@keyframes rotateSlideInFromRight{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(200%);-moz-transform:translateZ(-500px) translateX(200%);-ms-transform:translateZ(-500px) translateX(200%);-o-transform:translateZ(-500px) translateX(200%);transform:translateZ(-500px) translateX(200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-webkit-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-moz-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-ms-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-o-keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@keyframes rotateSlideInFromLeft{0%,25%{opacity:.5;-webkit-transform:translateZ(-500px) translateX(-200%);-moz-transform:translateZ(-500px) translateX(-200%);-ms-transform:translateZ(-500px) translateX(-200%);-o-transform:translateZ(-500px) translateX(-200%);transform:translateZ(-500px) translateX(-200%)}75%{opacity:.5;-webkit-transform:translateZ(-500px);-moz-transform:translateZ(-500px);-ms-transform:translateZ(-500px);-o-transform:translateZ(-500px);transform:translateZ(-500px)}100%{opacity:1;-webkit-transform:translateZ(0) translateX(0);-moz-transform:translateZ(0) translateX(0);-ms-transform:translateZ(0) translateX(0);-o-transform:translateZ(0) translateX(0);transform:translateZ(0) translateX(0)}}@-webkit-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-moz-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-ms-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-o-keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes bounceIn{0%,100%,20%,40%,60%,80%{-webkit-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1);transition-timing-function:cubic-bezier(0.215, 0.61, 0.355, 1)}0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}20%{-webkit-transform:scale3d(1.1, 1.1, 1.1);-moz-transform:scale3d(1.1, 1.1, 1.1);-ms-transform:scale3d(1.1, 1.1, 1.1);-o-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}40%{-webkit-transform:scale3d(0.9, 0.9, 0.9);-moz-transform:scale3d(0.9, 0.9, 0.9);-ms-transform:scale3d(0.9, 0.9, 0.9);-o-transform:scale3d(0.9, 0.9, 0.9);transform:scale3d(0.9, 0.9, 0.9)}60%{opacity:1;-webkit-transform:scale3d(1.03, 1.03, 1.03);-moz-transform:scale3d(1.03, 1.03, 1.03);-ms-transform:scale3d(1.03, 1.03, 1.03);-o-transform:scale3d(1.03, 1.03, 1.03);transform:scale3d(1.03, 1.03, 1.03)}80%{-webkit-transform:scale3d(0.97, 0.97, 0.97);-moz-transform:scale3d(0.97, 0.97, 0.97);-ms-transform:scale3d(0.97, 0.97, 0.97);-o-transform:scale3d(0.97, 0.97, 0.97);transform:scale3d(0.97, 0.97, 0.97)}100%{opacity:1;-webkit-transform:scale3d(1, 1, 1);-moz-transform:scale3d(1, 1, 1);-ms-transform:scale3d(1, 1, 1);-o-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@-webkit-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-moz-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-ms-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-o-keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@keyframes shake{0%,100%{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}10%,30%,50%,70%,90%{-webkit-transform:translate3d(-10px, 0, 0);-moz-transform:translate3d(-10px, 0, 0);-ms-transform:translate3d(-10px, 0, 0);-o-transform:translate3d(-10px, 0, 0);transform:translate3d(-10px, 0, 0)}20%,40%,60%,80%{-webkit-transform:translate3d(10px, 0, 0);-moz-transform:translate3d(10px, 0, 0);-ms-transform:translate3d(10px, 0, 0);-o-transform:translate3d(10px, 0, 0);transform:translate3d(10px, 0, 0)}}@-webkit-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-moz-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-ms-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-o-keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@keyframes zoomIn{0%{opacity:0;-webkit-transform:scale3d(0.3, 0.3, 0.3);-moz-transform:scale3d(0.3, 0.3, 0.3);-ms-transform:scale3d(0.3, 0.3, 0.3);-o-transform:scale3d(0.3, 0.3, 0.3);transform:scale3d(0.3, 0.3, 0.3)}50%{opacity:1}}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-moz-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-ms-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-o-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-webkit-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-moz-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-ms-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-o-keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@keyframes rotateBottomSideOut{0%{opacity:1}40%{-webkit-transform:rotateX(-15deg);-moz-transform:rotateX(-15deg);-ms-transform:rotateX(-15deg);-o-transform:rotateX(-15deg);transform:rotateX(-15deg);-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out}100%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}}@-webkit-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-ms-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-o-keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@keyframes slideInFromBottomDelayed{0%,30%{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-ms-transform:translateY(0);-o-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-moz-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-ms-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-o-keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@keyframes rotateBottomSideIn{0%{opacity:0;-webkit-transform:scale(0.8) translateZ(-200px);-moz-transform:scale(0.8) translateZ(-200px);-ms-transform:scale(0.8) translateZ(-200px);-o-transform:scale(0.8) translateZ(-200px);transform:scale(0.8) translateZ(-200px)}60%{-webkit-animation-timing-function:ease-out;-moz-animation-timing-function:ease-out;-ms-animation-timing-function:ease-out;-o-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-transform:scale(1) translateZ(0) rotateX(-15deg);-moz-transform:scale(1) translateZ(0) rotateX(-15deg);-ms-transform:scale(1) translateZ(0) rotateX(-15deg);-o-transform:scale(1) translateZ(0) rotateX(-15deg);transform:scale(1) translateZ(0) rotateX(-15deg)}100%{opacity:1;-webkit-transform:scale(1) translateZ(0) rotateX(0deg);-moz-transform:scale(1) translateZ(0) rotateX(0deg);-ms-transform:scale(1) translateZ(0) rotateX(0deg);-o-transform:scale(1) translateZ(0) rotateX(0deg);transform:scale(1) translateZ(0) rotateX(0deg)}}@-webkit-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-moz-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-ms-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@-o-keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}@keyframes slideOutToBottom{from{opacity:1}to{-webkit-transform:translateY(100%);-moz-transform:translateY(100%);-ms-transform:translateY(100%);-o-transform:translateY(100%);transform:translateY(100%)}}\n"
  },
  {
    "path": "ppt/think-in-css/css/pdf.css",
    "content": "*{-webkit-print-color-adjust:exact}body{margin:0 auto !important;border:0;padding:0;float:none !important;overflow:visible}html{width:100%;height:100%;overflow:visible}slides>slide{display:block !important;position:relative;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important;width:100%;height:100%;page-break-after:always;top:auto !important;left:auto !important;margin-top:0 !important;margin-left:0 !important;opacity:1 !important}slides>slide.far-past,slides>slide.past,slides>slide.next,slides>slide.far-next,slides>slide.far-past,slides>slide.current{opacity:1 !important;display:block !important}slides>slide .build>*{-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none}slides>slide .build .to-build,slides>slide .build .build-fade{opacity:1}slides>slide .auto-fadein{opacity:1 !important}slides>slide.backdrop{display:none !important}slides>slide table.rows{border-right:0}slides>slide[hidden]{display:none !important}.slide-area{display:none}pre,code{font-family:'Source Code Pro',monospace !important}slides>slide{-webkit-clip-path:none !important;opacity:1 !important;visibility:visible !important;padding:0}slides>slide .slide-wrapper,slides>slide.past .slide-wrapper,slides>slide.far-past .slide-wrapper,slides>slide.far-next .slide-wrapper,slides>slide.next .slide-wrapper{opacity:1 !important;visibility:visible !important;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;-webkit-align-content:center;align-content:center;position:static;width:1100px !important;left:0;top:0;right:0;bottom:0;margin:0 auto 10pt !important;overflow:visible;-moz-perspective:none !important;-webkit-perspective:none !important;perspective:none !important;-moz-perspective-origin:50% 50% !important;-webkit-perspective-origin:50% 50% !important;perspective-origin:50% 50% !important;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}slides>slide .slide-wrapper .build-fade,slides>slide .slide-wrapper .to-buid,slides>slide .slide-wrapper .building,slides>slide.past .slide-wrapper .build-fade,slides>slide.past .slide-wrapper .to-buid,slides>slide.past .slide-wrapper .building,slides>slide.far-past .slide-wrapper .build-fade,slides>slide.far-past .slide-wrapper .to-buid,slides>slide.far-past .slide-wrapper .building,slides>slide.far-next .slide-wrapper .build-fade,slides>slide.far-next .slide-wrapper .to-buid,slides>slide.far-next .slide-wrapper .building,slides>slide.next .slide-wrapper .build-fade,slides>slide.next .slide-wrapper .to-buid,slides>slide.next .slide-wrapper .building{opacity:1 !important;visibility:visible !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}slides>slide .slide-wrapper *,slides>slide.past .slide-wrapper *,slides>slide.far-past .slide-wrapper *,slides>slide.far-next .slide-wrapper *,slides>slide.next .slide-wrapper *{opacity:1 !important;visibility:visible !important;-moz-transform:none !important;-ms-transform:none !important;-webkit-transform:none !important;transform:none !important}#_buttons,#drawBoard,.progress,#tip{display:none !important}\n"
  },
  {
    "path": "ppt/think-in-css/css/phone.css",
    "content": "slides>slide{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;-webkit-transition:none !important;transition:none !important;-moz-transform-origin:0 0 !important;-ms-transform-origin:0 0 !important;-webkit-transform-origin:0 0 !important;transform-origin:0 0 !important}slides>slide[data-transition].current,slides>slide[data-transition].next,slides>slide[data-transition].past{-moz-transition:none;-o-transition:none;-webkit-transition:none;transition:none;-moz-transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-animation-name:none;animation-name:none}\n"
  },
  {
    "path": "ppt/think-in-css/css/theme.blue.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#f47f40;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #086fd1,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #086fd1,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:#000;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #2e87d3;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px white solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#086fd1}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#086fd1}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#4fff00}slides>slide .slide-wrapper blockquote{position:relative;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/think-in-css/css/theme.dark.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#fa5b04;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #232323,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #232323,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:black;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#232323}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#232323}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00ced1}slides>slide .slide-wrapper blockquote{position:relative;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/think-in-css/css/theme.green.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#ff8c78;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#fff;text-shadow:1px 2px 0px #699b98,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #699b98,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:#f8f7f7;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#f8f7f7;letter-spacing:2px;background-color:#699b98}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#699b98}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00ced1}slides>slide .slide-wrapper blockquote{position:relative;background-color:#ace2d2;border-left:0 none;color:#000;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#000;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/think-in-css/css/theme.light.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#fa5b04;background-color:transparent;border-bottom:0}a:hover{color:#fe7429;background-color:transparent}h1,h2,h3{color:#000;text-shadow:1px 2px 0px #e8efee,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #e8efee,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:#232323;border-bottom:0 none;border-collapse:collapse;background-color:white;-moz-box-shadow:0 none;-webkit-box-shadow:0 none;box-shadow:0 none}table thead th{font-weight:bolder;background-color:transparent;border-bottom:1px solid #111;vertical-align:bottom}table tbody tr td{vertical-align:top;border-bottom:1px #bfbfbf solid}table tr{background-color:transparent}table tr:nth-child(even){background-color:transparent}table tbody tr:nth-child(odd){background-color:#eee}table td.highlight{color:#0377C0;text-shadow:1px 1px 1px #aaa;font-weight:normal;background-color:transparent !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#232323;letter-spacing:2px;background-color:#e8efee}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#e8efee}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#00ced1}slides>slide .slide-wrapper blockquote{position:relative;background-color:#ace2d2;border-left:0 none;color:#232323;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#232323;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/think-in-css/css/theme.moon.css",
    "content": "::selection{color:#fff;background-color:#d33682;text-shadow:none}a{color:#f9d905;background-color:transparent;border-bottom:0}a:hover{color:#f5be78;background-color:transparent}h1,h2,h3{color:#e8f0f3;text-shadow:1px 2px 0px #152e4f,3px 5px 0px rgba(0,0,0,0.2);letter-spacing:4px;font-weight:bolder}h1{text-shadow:1px 2px 0px #152e4f,3px 5px 0px rgba(0,0,0,0.2)}table{width:100%;color:black;border-bottom:0 none;-moz-box-shadow:1px 1px 10px #000;-webkit-box-shadow:1px 1px 10px #000;box-shadow:1px 1px 10px #000}table thead th{background-color:#e6e6e6}table tr{background-color:white}table tr:nth-child(even){background-color:#e6e6e6}table td.highlight{color:#468847;background-color:#dff0d8 !important}table.rows{border-right:1px solid #797979}slides>slide{-webkit-font-smoothing:subpixel-antialiased;color:#e8f0f3;letter-spacing:2px;background-color:#152e4f}slides>slide:nth-child(6n+1),slides>slide:nth-child(6n+2),slides>slide:nth-child(6n+3),slides>slide:nth-child(6n+4),slides>slide:nth-child(6n+5){background-color:#152e4f}slides>slide .slide-wrapper strong{text-shadow:none;font-weight:bolder;color:#16d5b5}slides>slide .slide-wrapper blockquote{position:relative;background-color:#0b6c96;border-left:0 none;color:#e5dcdc;padding:5px 5px 5px 28px;text-shadow:none}slides>slide .slide-wrapper blockquote.pull-right{border-right:0 none;padding:5px 28px 5px 5px}slides>slide .slide-wrapper blockquote.pull-right ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10e\";right:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote.pull-right small::after{position:absolute;content:''}slides>slide .slide-wrapper blockquote ::before{font:normal normal normal 14px/1 FontAwesome;content:\"\\f10d\";left:6px;position:absolute;top:6px}slides>slide .slide-wrapper blockquote p{font-size:22px;line-height:1.7em}slides>slide .slide-wrapper blockquote small{color:#999;position:relative;padding-left:24px}slides>slide .slide-wrapper blockquote small::before{position:absolute;top:3px;content:'\\2015 \\00A0'}.progress span{background:#2187e7}\n"
  },
  {
    "path": "ppt/think-in-css/index.html",
    "content": "<!--\n    Powered By nodePPT - This is probably the best web presentation tool so far!\n    version: 1.2.3\n    site: https://github.com/ksky521/nodePPT\n-->\n<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>express介绍及实战 - By 王兴龙</title>\n    <link rel=\"stylesheet\" media=\"all\" href=\"./css/nodeppt.css\">\n    <link rel=\"stylesheet\" media=\"only screen and (max-device-width: 480px)\" href=\"./css/phone.css\">\n    <link rel=\"stylesheet\" media=\"print\" href=\"./css/pdf.css\">\n    <link rel=\"stylesheet\" href=\"./js/highlight/styles/monokai_sublime.css\">\n    <link rel=\"stylesheet\" href=\"./css/font-awesome.css\">\n</head>\n<body>\n<div class=\"slides\">\n    <slides id=\"container\">\n        <slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<style type=\"text/css\">\n    .flex {\n        display:box;\n        display: -webkit-box;\n    }\n\n    .auto-flex {\n        box-flex:1;\n        flex:1;\n        width: 50%;\n        margin-right: 20px;\n    }\n\n    .last-fixed {\n        margin-right: 0px;\n    }\n\n</style><h1>express介绍及实战</h1>\n<p><small>2015年09月11日 王兴龙</small></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express介绍</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>TJ Holowaychuk</li>\n<li>Connect与Express</li>\n<li>SSH与MEAN.js</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express的安装</h1>\n\n</hgroup><article>\n\n<blockquote>\n<p>$ npm install express</p>\n<p>$ npm install -g express-generator</p>\n</blockquote>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express的入口</h1>\n\n</hgroup><article>\n\n<div class=\"flex\">\n    <div class=\"auto-flex\">\n    <pre><code class=\"javascript\">\nvar express = require('express')\nvar app = express()\napp.get('/', function (req, res) {\n      res.send('Hello World')\n})\napp.listen(3000)\n    </code></pre>\n    </div>    <div  class=\"auto-flex last-fixed\">\n    <pre><code class=\"javascript\">\nvar http = require(&#39;http&#39;);\nhttp.createServer(function(req, res) {\n     res.write(&#39;hello world&#39;);\n     res.end();\n}).listen(8000);\n    </code></pre>\n    </div>\n</div>\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>理解app</h1>\n\n</hgroup><article>\n\n<p><a href=\"https://github.com/strongloop/express/blob/master/lib/application.js\" target=\"_blank\">https://github.com/strongloop/express/blob/master/lib/application.js</a></p>\n<pre><code class=\"javascript\">var app = function(req, res, next) {\n  app.handle(req, res, next);\n};\n\napp.listen = function(){\n  var server = http.createServer(this);\n  return server.listen.apply(server, arguments);\n};\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Express模板引擎</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>Jade</li>\n<li>Handlebars</li>\n<li>EJS(与UTC一致)</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>中间件</h1>\n<pre><code class=\"javascript\">app.use(&#39;/public&#39;,express.static(__dirname + &#39;/public&#39;));\napp.use(logger());\napp.use(function(req, res, next){\n    console.log(&#39;hello middleware&#39;);\n    next();\n});\napp.get(&#39;/&#39;, function(req, res){\nres.send(&#39;Hello World&#39;);\n});\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<p><img src=\"http://images.cnitblog.com/blog/304265/201312/22104418-e0efc8bc5ffb46e4bc92843a2b3ae3d5.png\" alt=\"\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>URL组成部分</h1>\n\n</hgroup><article>\n\n<table>\n<thead>\n<tr>\n<th style=\"text-align:center\">http://</th>\n<th style=\"text-align:center\">m.sm.cn</th>\n<th style=\"text-align:center\">/s</th>\n<th style=\"text-align:center\">?q=周杰伦</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td style=\"text-align:center\">协议</td>\n<td style=\"text-align:center\">主机名</td>\n<td  class=\"highlight\" style=\"text-align:center;\">路径</td>\n<td  class=\"highlight\" style=\"text-align:center;\">查询字符串</td>\n</tr>\n</tbody>\n</table>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>路由</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>将请求路由到处理他们的代码去得一种机制</li>\n<li>路由处理器是中间件</li>\n<li>支持正则表达式</li>\n<li>路由参数</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>一个例子</h1>\n\n</hgroup><article>\n\n<pre><code class=\"javascript\">app.get(&#39;staff/:city/:name&#39;, function(req, res){\n    //req.params.city\n})\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>路由组织</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>给路由处理器用命令函数</li>\n<li>按逻辑分组</li>\n<li>路由的命名</li>\n<li>路由参数</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>路由组织例子</h1>\n\n</hgroup><article>\n\n<pre><code class=\"javascript\">//route.js\nmodule.exports = function(app) {\n    app.get(&#39;/&#39;, function(req, res){\n\n    })\n}\n\n//index.js\nrequrie(&#39;./route.js&#39;)(app)\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>自动化渲染视图</h1>\n\n</hgroup><article>\n\n<p>添加一个foo.ejs就可以通过/foo来访问\n场景：适合不需要首屏的静态模板</p>\n<pre><code class=\"javascript\">var autoViews = {};\nvar fs = require(&#39;fs&#39;);\n\napp.use(function(req, res, next) {\n    var path = req.path.toLowerCase();\n    //检查缓存\n    if(autoView[path]) return res.render(autoViews[path])；\n    //不在缓存\n    if(fs.exitsSync(__dirname + &#39;/views&#39; + path + &#39;.ejs&#39;)) {\n        autoViews[path] = path.repalce(/^\\//, &#39;&#39;);\n        reuturn res.render(autoViews[path]);\n    }\n    //没发现到404\n    next();\n})\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>持久化</h1>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>文件持久化</li>\n<li>云持久化</li>\n<li>数据库持久化</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h2>数据库持久化</h2>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>结构化数据库<ul>\n<li>Oracle、MySQL、SQL Server、</li>\n</ul>\n</li>\n<li>NoSQL<ul>\n<li>MongoDB</li>\n<li><a href=\"https://cnodejs.org/topic/504b4924e2b84515770103dd\" target=\"_blank\">https://cnodejs.org/topic/504b4924e2b84515770103dd</a></li>\n</ul>\n</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h2>一些框架</h2>\n\n</hgroup><article>\n\n<ul class=\"rollIn\">\n<li>mongoose<ul>\n<li><a href=\"https://github.com/Automattic/mongoose\" target=\"_blank\">https://github.com/Automattic/mongoose</a></li>\n</ul>\n</li>\n<li>orm2 <ul>\n<li><a href=\"https://github.com/dresende/node-orm2\" target=\"_blank\">https://github.com/dresende/node-orm2</a></li>\n</ul>\n</li>\n<li>AWS<ul>\n<li><a href=\"https://aws.amazon.com/sdkfornodejs\" target=\"_blank\">https://aws.amazon.com/sdkfornodejs</a></li>\n</ul>\n</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>进程管理:PM2</h1>\n<blockquote>\n<p><a href=\"https://github.com/Unitech/pm2\" target=\"_blank\">https://github.com/Unitech/pm2</a></p>\n</blockquote>\n<p><img src=\"https://github.com/unitech/pm2/raw/master/pres/pm2-list.png\" alt=\"pm2\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>实战：动效平台</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>架构图</h1>\n<p><img src=\"http://ww1.sinaimg.cn/large/8ae515a4jw1evwkb97qvjj20sg0lcdi6.jpg\" alt=\"jiagoutu\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>路由</h1>\n<pre><code class=\"javascript\">// 新建组件页面\napp.get(&#39;/component/create&#39;, ComponentController.renderCreationPage);\n\n// 组件类的路由\napp.post(&#39;/component/create&#39;, multipartMiddleware, ComponentController.create);\n\napp.put(&#39;...&#39;, ...);\napp.delete(&#39;...&#39;, ...);\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>控制器</h1>\n<pre><code class=\"javascript\">create: function(req, res) {\n    var data = req.body,\n        files = req.files;\n    //当组件存储完成、文件上传完成，才响应\n    createComponent(data, files).then(function(data) {\n        //渲染页面\n        //res.render(&#39;index&#39;, data.componentHistory.componentHistoryID);\n        res.send(JSON.stringify(data));\n    }).catch(function(e) {\n        console.error(e);\n        res.redirect(&#39;error&#39;);\n    });\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<pre><code class=\"javascript\">//创建组件、组件项\nfunction createComponent(data, files) {\n    //组件\n    var component = new Component(data.name, data.categoryID, &#39;userid&#39;, data.remarks); //用户ID后期通过session给值\n    //历史版本\n    var componentHistory = new ComponentHistory(component.componentID, data.html, data.js, data.css, &#39;userid&#39;, data.updata); //用户ID后期通过session给值\n\n    //首先保存到数据然，然后再保存到文件中\n    return Promise.all([\n            ComponentDAL.createComponent(component),\n            ComponentHistoryDAL.createComponentHistory(componentHistory),\n            saveFile({\n                files : files,\n                component : component.componentID\n            })\n        ]);\n\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>DAL层</h1>\n<pre><code class=\"javascript\">//创建组件\nfunction createComponent(component) {\n    return new Promise(function(resolve, reject) {\n        ComponentTable.create([component],function(err, data) {\n            if(err) {\n                console.error(err);\n                reject(err);\n            }else {\n                console.debug(&#39;上传组件成功&#39;, JSON.stringify(data));\n                resolve(JSON.stringify(data));\n            }\n        });\n\n    });\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>复杂SQL</h1>\n<pre><code class=\"javascript\">var getComponentHistoryByComponentIDSQL = &#39;SELECT componentHistory.componentHistoryID, componentHistory.html, componentHistory.js, componentHistory.css, component.componentID , component.name, component.remarks FROM (SELECT componentID, name, remarks FROM component WHERE component.componentID = ?) component inner join componentHistory ON componentHistory.componentID = component.componentID ORDER BY componentHistory.createTime DESC LIMIT 1&#39;;\n//找到某一个组件下最新版本的组件历史\nfunction getComponentHistoryByComponentID(componentID) {\n    return new Promise(function(resolve, reject) {\n        db.driver.execQuery(getComponentHistoryByComponentIDSQL,  [componentID], function(err, data) {\n            if(err) {\n                console.error(err);\n                throw err;\n            }else {\n                resolve(data);\n            }\n        });\n    });\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>日志处理:Log4Js</h1>\n<pre><code class=\"javascript\">var log4js = require(&#39;log4js&#39;);\n\nlog4js.configure({\n    appenders: [\n        //控制台输出\n        {\n            type: &#39;console&#39;,\n            category: &quot;console&quot;\n        }\n        ////线上打开，否则没有这个软件会报错\n        //{\n        //    type: &quot;dateFile&quot;,\n        //    filename: &#39;logs/log.log&#39;,\n        //    pattern: &quot;_yyyy-MM-dd&quot;,\n        //    alwaysIncludePattern: false,\n        //    category: &#39;dateFileLog&#39;\n        //}//日期文件格式\n    ],\n    replaceConsole: true,   //替换console.log\n    levels:{\n        dateFileLog: &#39;ERROR&#39;,\n        console : &#39;DEBUG&#39;\n    }\n});\n\nvar dateFileLog = log4js.getLogger(&#39;dateFileLog&#39;);\n\nmodule.exports = function(app) {\n    //页面请求日志,用auto的话,默认级别是WARN\n    app.use(log4js.connectLogger(dateFileLog, {level:dateFileLog.level.ERROR, format:&#39;:method :url&#39;}));\n};\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>效果展示</h1>\n<p><img src=\"http://ww2.sinaimg.cn/large/8ae515a4jw1evwl2nx52bj21kw0x7437.jpg\" alt=\"\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>下一步要做的</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>脚手架</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>拥抱ES6(2015), ES7(2016)</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<h2>Class, Generator ,async</h2>\n<pre><code class=\"javascript\">class Component extend BaseClass {\n    constructor(name) {\n        this.name = name;\n    }\n    getComponentName() {\n    }\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>回顾</h1>\n<p>想实现一个基于mvc的web系统</p>\n<ul class=\"rollIn\">\n<li>templet</li>\n<li>route</li>\n<li>controller</li>\n<li>dal</li>\n<li>model</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><hgroup>\n<h1>Q&amp;A</h1>\n\n</hgroup><article>\n\n\n</article></section></slide>\n        <!--slide class=\"slide thank-you-slide segue nobackground\">\n            <article class=\"flexbox vleft auto-fadein\">\n                <h2>Q &amp; A</h2>\n                <h3>&lt;Thank You!&gt;</h3>\n            </article>\n        </slide-->\n        <slide class=\"slide logoslide dark nobackground\">\n            <article class=\"flexbox vcenter\">\n              <h2 style=\"color: white;\">Powered By nodePPT v1.2.3</h2>\n            </article>\n          </slide>\n        <div class=\"slideTip\" id=\"tip\"></div>\n    </slides>\n</div>\n<canvas id=\"drawBoard\" class=\"draw-board\" width=\"900\" height=\"700\"></canvas>\n<div class=\"progress\"><span id=\"progress\"></span></div>\n<div id=\"_buttons\">\n    <div class=\"_btn-box\" id=\"_btn-box\" style=\"display:none;\">\n        <button class=\"fa fa-arrow-circle-left\" id=\"_btn-prev\"></button>\n        <button class=\"fa fa-arrow-circle-right\" id=\"_btn-next\"></button>\n        <button class=\"fa fa-paint-brush\" id=\"_btn-brush\"></button>\n        <button class=\"fa fa-compress\" id=\"_btn-overview\" data-toggle=\"fa fa-expand\"></button>\n    </div>\n    <button class=\"fa fa-bars\" id=\"_btn-bar\"  data-toggle=\"fa fa-close\"></button>\n</div>\n<script src=\"./js/mixjs/lib/mix.0.3.0.min.js\"></script>\n<script>\nvar base = location.protocol + '//' + location.host;\n\nvar path = location.pathname.split('/').filter(function(v){\n    return !!v;\n});\npath.pop();\npath = path.join('/');\nMixJS.config({\n    baseURL: [ base, path, 'js'].join('/')+'/'\n});\n\n</script>\n<script src=\"./js/mixjs/lib/event/broadcast.js\"></script>\n<script src=\"./js/nodeppt.js\"></script>\n<script>\nSlide.init({\n    containerID: 'container',\n    drawBoardID: 'drawBoard',\n    slideClass: '.slide',\n    buildClass: '.build',\n    progressID: 'progress',\n    transition: 'move',\n    width: 1100,\n    dir: './',\n    \n    //打开下面的注释就开启postMessage方式\n    //访问网址127.0.0.1:8080/ppt/demo#client\n    control:{\n        type: 'postMessage',\n        args:{\n            isControl:  false\n        }\n    },\n    \n    tipID: 'tip'\n});\nMixJS.loadJS('highlight/hljs-0.8.js',function(){\n    hljs.tabReplace = '  ';\n    hljs.initHighlightingOnLoad();\n});\n</script>\n<script src=\"./js/demo.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/demo.css\">\n<script src=\"./js/zoom.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/theme.moon.css\">\n<!--placeholder-->\n</body>\n</html>\n"
  },
  {
    "path": "ppt/think-in-css/js/event/broadcast.js",
    "content": "/**\n * 广播事件处理\n * 状态：稳定\n * \n * 目标: 为了尽可能的减少模块之间业务逻辑的耦合度, 而开发了这个eventbus, 主要用于业务逻辑的事件传递\n * 使用规范: 每个js模块尽可能通过事件去通信, 减少模块之间的直接调用和依赖(耦合)\n * 使用示例：\n *     //触发\n *     MixJS.event.broadcast.fire('abc',{abc:1}) \n *     //订阅\n *     MixJS.event.broadcast.on('abc',function(a){\n *         console.log(a);\n *     }, scope);\n    \n * @return {[type]} \n * @author  theowang\n * $Id: broadcast.js 65871 2012-11-05 01:51:42Z theowang $\n */\nMixJS.define('event/broadcast', function($) {\n    var _cache = {};\n    var broadcast = {\n\n        /**\n         * 派发\n         * @param  {[type]} type 事件类型\n         * @param  {[type]} data 回调数据\n         * @return {[type]}      [description]\n         */\n        fire: function(type, data) {\n            var listeners = _cache[type],\n                len = 0;\n            if (!$.isUndefined(listeners)) {\n                var args = [].slice.call(arguments, 0);\n                args = args.length > 2 ? args.splice(2, args.length - 1) : [];\n                args = [data].concat(args);\n\n                len = listeners.length;\n                for (var i = 0; i < len; i++) {\n                    var listener = listeners[i];\n                    if (listener && listener.callback) {\n                        args = args.concat(listener.args);\n                        listener.callback.apply(listener.scope, args);\n                    }\n                }\n            }\n            return this;\n        },\n        /**\n         * 订阅广播事件\n         * @param  {[type]}   types     事件类型，支持,分隔符\n         * @param  {Function} callback 回调函数\n         * @param  {[type]}   scope    回调函数上下文\n         * @return {[type]}            this\n         */\n        on: function(types, callback, scope) {\n            types = types || [];\n            var args = [].slice.call(arguments);\n\n            if ($.isString(types)) {\n                types = types.split(',');\n            }\n            var len = types.length;\n            if (len === 0) {\n                return this;\n            }\n            args = args.length > 3 ? args.splice(3, args.length - 1) : [];\n            for (var i = 0; i < len; i++) {\n                var type = types[i];\n                _cache[type] = _cache[type] || [];\n                _cache[type].push({\n                    callback: callback,\n                    scope: scope,\n                    args: args\n                });\n            }\n            return this;\n        },\n        /**\n         * 退订\n         * @param  {[type]}   type     [description]\n         * @param  {Function} callback 假如传入则移出传入的监控事件，否则移出全部\n         * @return {[type]}            [description]\n         */\n        un: function(type, callback, scope) {\n            var listeners = _cache[type];\n            if (!listeners) {\n                return this;\n            }\n            if (callback) {\n                var len = listeners.length,\n                    tmp = [];\n\n                for (var i = 0; i < len; i++) {\n                    var listener = listeners[i];\n                    if (listener.callback == callback && listener.scope == scope) {} else {\n                        tmp.push(listener);\n                    }\n                }\n                listeners = tmp;\n            } else {\n                listeners.length = 0;\n            }\n            return this;\n        },\n\n\n        removeAll: function() {\n            _cache = {};\n            return this;\n        }\n    };\n    return broadcast;\n});"
  },
  {
    "path": "ppt/think-in-css/js/highlight/default.css",
    "content": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\npre code {\n  display: block; padding: 0.5em;\n  /*background: #F0F0F0;*/\n}\n\npre code,\npre .ruby .subst,\npre .tag .title,\npre .lisp .title {\n  color: black;\n}\n\npre .string,\npre .title,\npre .constant,\npre .parent,\npre .tag .value,\npre .rules .value,\npre .rules .value .number,\npre .preprocessor,\npre .ruby .symbol,\npre .ruby .symbol .string,\npre .ruby .symbol .keyword,\npre .ruby .symbol .keymethods,\npre .instancevar,\npre .aggregate,\npre .template_tag,\npre .django .variable,\npre .smalltalk .class,\npre .addition,\npre .flow,\npre .stream,\npre .bash .variable,\npre .apache .tag,\npre .apache .cbracket,\npre .tex .command,\npre .tex .special,\npre .erlang_repl .function_or_atom,\npre .markdown .header {\n  color: #800;\n}\n\npre .comment,\npre .annotation,\npre .template_comment,\npre .diff .header,\npre .chunk,\npre .markdown .blockquote {\n  color: #888;\n}\n\npre .number,\npre .date,\npre .regexp,\npre .literal,\npre .smalltalk .symbol,\npre .smalltalk .char,\npre .go .constant,\npre .change,\npre .markdown .bullet,\npre .markdown .link_url {\n  color: #080;\n}\n\npre .label,\npre .javadoc,\npre .ruby .string,\npre .decorator,\npre .filter .argument,\npre .localvars,\npre .array,\npre .attr_selector,\npre .important,\npre .pseudo,\npre .pi,\npre .doctype,\npre .deletion,\npre .envvar,\npre .shebang,\npre .apache .sqbracket,\npre .nginx .built_in,\npre .tex .formula,\npre .erlang_repl .reserved,\npre .input_number,\npre .markdown .link_label {\n  color: #88F\n}\n\npre .keyword,\npre .id,\npre .phpdoc,\npre .title,\npre .built_in,\npre .aggregate,\npre .css .tag,\npre .javadoctag,\npre .phpdoc,\npre .yardoctag,\npre .smalltalk .class,\npre .winutils,\npre .bash .variable,\npre .apache .tag,\npre .go .typename,\npre .tex .command,\npre .markdown .strong {\n  font-weight: bold;\n}\n\npre .markdown .emphasis {\n  font-style: italic;\n}\n\npre .nginx .built_in {\n  font-weight: normal;\n}\n\npre .coffeescript .javascript,\npre .xml .css,\npre .xml .javascript,\npre .xml .vbscript,\npre .tex .formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/highlight.pack.js",
    "content": "var hljs=new function(){function m(p){return p.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\")}function c(r,q,p){return RegExp(q,\"m\"+(r.cI?\"i\":\"\")+(p?\"g\":\"\"))}function j(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName==\"CODE\"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\\s+/))){break}}}function g(t,s){var r=\"\";for(var q=0;q<t.childNodes.length;q++){if(t.childNodes[q].nodeType==3){var p=t.childNodes[q].nodeValue;if(s){p=p.replace(/\\n/g,\"\")}r+=p}else{if(t.childNodes[q].nodeName==\"BR\"){r+=\"\\n\"}else{r+=g(t.childNodes[q])}}}if(/MSIE [678]/.test(navigator.userAgent)){r=r.replace(/\\r/g,\"\\n\")}return r}function a(s){var q=s.className.split(/\\s+/);q=q.concat(s.parentNode.className.split(/\\s+/));for(var p=0;p<q.length;p++){var r=q[p].replace(/^language-/,\"\");if(d[r]||r==\"no-highlight\"){return r}}}function b(p){var q=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName==\"BR\"){t+=1}else{if(s.childNodes[r].nodeType==1){q.push({event:\"start\",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);q.push({event:\"stop\",offset:t,node:s.childNodes[r]})}}}}return t})(p,0);return q}function l(y,z,x){var r=0;var w=\"\";var t=[];function u(){if(y.length&&z.length){if(y[0].offset!=z[0].offset){return(y[0].offset<z[0].offset)?y:z}else{return z[0].event==\"start\"?y:z}}else{return y.length?y:z}}function s(C){var D=\"<\"+C.nodeName.toLowerCase();for(var A=0;A<C.attributes.length;A++){var B=C.attributes[A];D+=\" \"+B.nodeName.toLowerCase();if(B.value!==undefined&&B.value!==false&&B.value!==null){D+='=\"'+m(B.value)+'\"'}}return D+\">\"}while(y.length||z.length){var v=u().splice(0,1)[0];w+=m(x.substr(r,v.offset-r));r=v.offset;if(v.event==\"start\"){w+=s(v.node);t.push(v.node)}else{if(v.event==\"stop\"){var p,q=t.length;do{q--;p=t[q];w+=(\"</\"+p.nodeName.toLowerCase()+\">\")}while(p!=v.node);t.splice(q,1);while(q<t.length){w+=s(t[q]);q++}}}}return w+m(x.substr(r))}function i(){function p(w,u,x){if(w.compiled){return}var t;if(!x){w.bR=c(u,w.b?w.b:\"\\\\B|\\\\b\");if(!w.e&&!w.eW){w.e=\"\\\\B|\\\\b\"}if(w.e){w.eR=c(u,w.e)}}if(w.i){w.iR=c(u,w.i)}if(w.r===undefined){w.r=1}if(w.k){w.lR=c(u,w.l||hljs.IR,true);for(var v in w.k){if(!w.k.hasOwnProperty(v)){continue}if(w.k[v] instanceof Object){t=w.k[v]}else{t=w.k;v=\"keyword\"}for(var s in t){if(!t.hasOwnProperty(s)){continue}w.k[s]=[v,t[s]]}}}if(!w.c){w.c=[]}w.compiled=true;for(var r=0;r<w.c.length;r++){if(w.c[r]==\"self\"){w.c[r]=w}p(w.c[r],u,false)}if(w.starts){p(w.starts,u,false)}}for(var q in d){if(!d.hasOwnProperty(q)){continue}p(d[q].dM,d[q],true)}}function e(J,D){if(!i.called){i();i.called=true}function z(r,M){for(var L=0;L<M.c.length;L++){if(M.c[L].bR.test(r)){return M.c[L]}}}function w(L,r){if(C[L].e&&C[L].eR.test(r)){return 1}if(C[L].eW){var M=w(L-1,r);return M?M+1:0}return 0}function x(r,L){return L.i&&L.iR.test(r)}function A(O,N){var M=[];for(var L=0;L<O.c.length;L++){M.push(O.c[L].b)}var r=C.length-1;do{if(C[r].e){M.push(C[r].e)}r--}while(C[r+1].eW);if(O.i){M.push(O.i)}return c(N,\"(\"+M.join(\"|\")+\")\",true)}function s(M,L){var N=C[C.length-1];if(!N.t){N.t=A(N,H)}N.t.lastIndex=L;var r=N.t.exec(M);if(r){return[M.substr(L,r.index-L),r[0],false]}else{return[M.substr(L),\"\",true]}}function p(N,r){var L=H.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(M,O){M=m(M);if(!O.k){return M}var N=\"\";var P=0;O.lR.lastIndex=0;var L=O.lR.exec(M);while(L){N+=M.substr(P,L.index-P);var r=p(O,L);if(r){t+=r[1];N+='<span class=\"'+r[0]+'\">'+L[0]+\"</span>\"}else{N+=L[0]}P=O.lR.lastIndex;L=O.lR.exec(M)}return N+M.substr(P,M.length-P)}function K(r,M){if(M.sL&&d[M.sL]){var L=e(M.sL,r);t+=L.keyword_count;return L.value}else{return F(r,M)}}function I(M,r){var L=M.cN?'<span class=\"'+M.cN+'\">':\"\";if(M.rB){q+=L;M.buffer=\"\"}else{if(M.eB){q+=m(r)+L;M.buffer=\"\"}else{q+=L;M.buffer=r}}C.push(M);B+=M.r}function E(O,L,Q){var R=C[C.length-1];if(Q){q+=K(R.buffer+O,R);return false}var M=z(L,R);if(M){q+=K(R.buffer+O,R);I(M,L);return M.rB}var r=w(C.length-1,L);if(r){var N=R.cN?\"</span>\":\"\";if(R.rE){q+=K(R.buffer+O,R)+N}else{if(R.eE){q+=K(R.buffer+O,R)+N+m(L)}else{q+=K(R.buffer+O+L,R)+N}}while(r>1){N=C[C.length-2].cN?\"</span>\":\"\";q+=N;r--;C.length--}var P=C[C.length-1];C.length--;C[C.length-1].buffer=\"\";if(P.starts){I(P.starts,\"\")}return R.rE}if(x(L,R)){throw\"Illegal\"}}var H=d[J];var C=[H.dM];var B=0;var t=0;var q=\"\";try{var y,v=0;H.dM.buffer=\"\";do{y=s(D,v);var u=E(y[0],y[1],y[2]);v+=y[0].length;if(!u){v+=y[1].length}}while(!y[2]);if(C.length>1){throw\"Illegal\"}return{r:B,keyword_count:t,value:q}}catch(G){if(G==\"Illegal\"){return{r:0,keyword_count:0,value:m(D)}}else{throw G}}}function f(t){var r={keyword_count:0,r:0,value:m(t)};var q=r;for(var p in d){if(!d.hasOwnProperty(p)){continue}var s=e(p,t);s.language=p;if(s.keyword_count+s.r>q.keyword_count+q.r){q=s}if(s.keyword_count+s.r>r.keyword_count+r.r){q=r;r=s}}if(q.language){r.second_best=q}return r}function h(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\\t)+)/gm,function(t,w,v,u){return w.replace(/\\t/g,q)})}if(p){r=r.replace(/\\n/g,\"<br>\")}return r}function o(u,x,q){var y=g(u,q);var s=a(u);var w,r;if(s==\"no-highlight\"){return}if(s){w=e(s,y)}else{w=f(y);s=w.language}var p=b(u);if(p.length){r=document.createElement(\"pre\");r.innerHTML=w.value;w.value=l(p,b(r),y)}w.value=h(w.value,x,q);var t=u.className;if(!t.match(\"(\\\\s|^)(language-)?\"+s+\"(\\\\s|$)\")){t=t?(t+\" \"+s):s}if(/MSIE [678]/.test(navigator.userAgent)&&u.tagName==\"CODE\"&&u.parentNode.tagName==\"PRE\"){r=u.parentNode;var v=document.createElement(\"div\");v.innerHTML=\"<pre><code>\"+w.value+\"</code></pre>\";u=v.firstChild.firstChild;v.firstChild.cN=r.cN;r.parentNode.replaceChild(v.firstChild,r)}else{u.innerHTML=w.value}u.className=t;u.result={language:s,kw:w.keyword_count,re:w.r};if(w.second_best){u.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName(\"pre\");for(var p=0;p<r.length;p++){var q=j(r[p]);if(q){o(q,hljs.tabReplace)}}}function n(){if(window.addEventListener){window.addEventListener(\"DOMContentLoaded\",k,false);window.addEventListener(\"load\",k,false)}else{if(window.attachEvent){window.attachEvent(\"onload\",k)}else{window.onload=k}}}var d={};this.LANGUAGES=d;this.highlight=e;this.highlightAuto=f;this.fixMarkup=h;this.highlightBlock=o;this.initHighlighting=k;this.initHighlightingOnLoad=n;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"\\\\b(0[xX][a-fA-F0-9]+|(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|\\\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\.\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE],r:0};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE],r:0};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.inherit=function(p,s){var r={};for(var q in p){r[q]=p[q]}if(s){for(var q in s){r[q]=s[q]}}return r}}();hljs.LANGUAGES.bash=function(){var d={\"true\":1,\"false\":1};var c={cN:\"variable\",b:\"\\\\$([a-zA-Z0-9_]+)\\\\b\"};var a={cN:\"variable\",b:\"\\\\$\\\\{(([^}])|(\\\\\\\\}))+\\\\}\",c:[hljs.CNM]};var f={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[hljs.BE,c,a],r:0};var b={cN:\"string\",b:\"'\",e:\"'\",r:0};var e={cN:\"test_condition\",b:\"\",e:\"\",c:[f,b,c,a,hljs.CNM],k:{literal:d},r:0};return{dM:{k:{keyword:{\"if\":1,then:1,\"else\":1,fi:1,\"for\":1,\"break\":1,\"continue\":1,\"while\":1,\"in\":1,\"do\":1,done:1,echo:1,exit:1,\"return\":1,set:1,declare:1},literal:d},c:[{cN:\"shebang\",b:\"(#!\\\\/bin\\\\/bash)|(#!\\\\/bin\\\\/sh)\",r:10},c,a,hljs.HCM,hljs.CNM,f,b,hljs.inherit(e,{b:\"\\\\[ \",e:\" \\\\]\",r:0}),hljs.inherit(e,{b:\"\\\\[\\\\[ \",e:\" \\\\]\\\\]\"})]}}}();hljs.LANGUAGES.erlang=function(){var h=\"[a-z'][a-zA-Z0-9_']*\";var m=\"(\"+h+\":\"+h+\"|\"+h+\")\";var d={keyword:{after:1,and:1,andalso:10,band:1,begin:1,bnot:1,bor:1,bsl:1,bzr:1,bxor:1,\"case\":1,\"catch\":1,cond:1,div:1,end:1,fun:1,let:1,not:1,of:1,orelse:10,query:1,receive:1,rem:1,\"try\":1,when:1,xor:1},literal:{\"false\":1,\"true\":1}};var k={cN:\"comment\",b:\"%\",e:\"$\",r:0};var f={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0};var c={b:\"fun\\\\s+\"+h+\"/\\\\d+\"};var n={b:m+\"\\\\(\",e:\"\\\\)\",rB:true,r:0,c:[{cN:\"function_name\",b:m,r:0},{b:\"\\\\(\",e:\"\\\\)\",eW:true,rE:true,r:0}]};var g={cN:\"tuple\",b:\"{\",e:\"}\",r:0};var a={cN:\"variable\",b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",r:0};var l={cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_]*\",r:0};var i={b:\"#\",e:\"}\",i:\".\",r:0,rB:true,c:[{cN:\"record_name\",b:\"#\"+hljs.UIR,r:0},{b:\"{\",eW:true,r:0}]};var j={k:d,b:\"(fun|receive|if|try|case)\",e:\"end\"};j.c=[k,c,hljs.inherit(hljs.ASM,{cN:\"\"}),j,n,hljs.QSM,f,g,a,l,i];var b=[k,c,j,n,hljs.QSM,f,g,a,l,i];n.c[1].c=b;g.c=b;i.c[1].c=b;var e={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",eW:true,c:b};return{dM:{k:d,i:\"(</|\\\\*=|\\\\+=|-=|/=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+h+\"\\\\(\",e:\";|\\\\.\",rB:true,c:[e,{cN:\"title\",b:h},{k:d,b:\"->\",eW:true,c:b}]},k,{cN:\"pp\",b:\"^-\",e:\"\\\\.\",r:0,eE:true,rB:true,l:\"-\"+hljs.IR,k:{\"-module\":1,\"-record\":1,\"-undef\":1,\"-export\":1,\"-ifdef\":1,\"-ifndef\":1,\"-author\":1,\"-copyright\":1,\"-doc\":1,\"-vsn\":1,\"-import\":1,\"-include\":1,\"-include_lib\":1,\"-compile\":1,\"-define\":1,\"-else\":1,\"-endif\":1,\"-file\":1,\"-behaviour\":1,\"-behavior\":1},c:[e]},f,hljs.QSM,i,a,l,g]}}}();hljs.LANGUAGES.cs={dM:{k:{\"abstract\":1,as:1,base:1,bool:1,\"break\":1,\"byte\":1,\"case\":1,\"catch\":1,\"char\":1,checked:1,\"class\":1,\"const\":1,\"continue\":1,decimal:1,\"default\":1,delegate:1,\"do\":1,\"double\":1,\"else\":1,\"enum\":1,event:1,explicit:1,extern:1,\"false\":1,\"finally\":1,fixed:1,\"float\":1,\"for\":1,foreach:1,\"goto\":1,\"if\":1,implicit:1,\"in\":1,\"int\":1,\"interface\":1,internal:1,is:1,lock:1,\"long\":1,namespace:1,\"new\":1,\"null\":1,object:1,operator:1,out:1,override:1,params:1,\"private\":1,\"protected\":1,\"public\":1,readonly:1,ref:1,\"return\":1,sbyte:1,sealed:1,\"short\":1,sizeof:1,stackalloc:1,\"static\":1,string:1,struct:1,\"switch\":1,\"this\":1,\"throw\":1,\"true\":1,\"try\":1,\"typeof\":1,uint:1,ulong:1,unchecked:1,unsafe:1,ushort:1,using:1,virtual:1,\"volatile\":1,\"void\":1,\"while\":1,ascending:1,descending:1,from:1,get:1,group:1,into:1,join:1,let:1,orderby:1,partial:1,select:1,set:1,value:1,\"var\":1,where:1,yield:1},c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},hljs.CLCM,hljs.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:{\"if\":1,\"else\":1,elif:1,endif:1,define:1,undef:1,warning:1,error:1,line:1,region:1,endregion:1,pragma:1,checksum:1}},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},hljs.ASM,hljs.QSM,hljs.CNM]}};hljs.LANGUAGES.ruby=function(){var c=\"[a-zA-Z_][a-zA-Z0-9_]*(\\\\!|\\\\?)?\";var i=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var a={keyword:{and:1,\"false\":1,then:1,defined:1,module:1,\"in\":1,\"return\":1,redo:1,\"if\":1,BEGIN:1,retry:1,end:1,\"for\":1,\"true\":1,self:1,when:1,next:1,until:1,\"do\":1,begin:1,unless:1,END:1,rescue:1,nil:1,\"else\":1,\"break\":1,undef:1,not:1,\"super\":1,\"class\":1,\"case\":1,require:1,yield:1,alias:1,\"while\":1,ensure:1,elsif:1,or:1,def:1},keymethods:{__id__:1,__send__:1,abort:1,abs:1,\"all?\":1,allocate:1,ancestors:1,\"any?\":1,arity:1,assoc:1,at:1,at_exit:1,autoload:1,\"autoload?\":1,\"between?\":1,binding:1,binmode:1,\"block_given?\":1,call:1,callcc:1,caller:1,capitalize:1,\"capitalize!\":1,casecmp:1,\"catch\":1,ceil:1,center:1,chomp:1,\"chomp!\":1,chop:1,\"chop!\":1,chr:1,\"class\":1,class_eval:1,\"class_variable_defined?\":1,class_variables:1,clear:1,clone:1,close:1,close_read:1,close_write:1,\"closed?\":1,coerce:1,collect:1,\"collect!\":1,compact:1,\"compact!\":1,concat:1,\"const_defined?\":1,const_get:1,const_missing:1,const_set:1,constants:1,count:1,crypt:1,\"default\":1,default_proc:1,\"delete\":1,\"delete!\":1,delete_at:1,delete_if:1,detect:1,display:1,div:1,divmod:1,downcase:1,\"downcase!\":1,downto:1,dump:1,dup:1,each:1,each_byte:1,each_index:1,each_key:1,each_line:1,each_pair:1,each_value:1,each_with_index:1,\"empty?\":1,entries:1,eof:1,\"eof?\":1,\"eql?\":1,\"equal?\":1,\"eval\":1,exec:1,exit:1,\"exit!\":1,extend:1,fail:1,fcntl:1,fetch:1,fileno:1,fill:1,find:1,find_all:1,first:1,flatten:1,\"flatten!\":1,floor:1,flush:1,for_fd:1,foreach:1,fork:1,format:1,freeze:1,\"frozen?\":1,fsync:1,getc:1,gets:1,global_variables:1,grep:1,gsub:1,\"gsub!\":1,\"has_key?\":1,\"has_value?\":1,hash:1,hex:1,id:1,include:1,\"include?\":1,included_modules:1,index:1,indexes:1,indices:1,induced_from:1,inject:1,insert:1,inspect:1,instance_eval:1,instance_method:1,instance_methods:1,\"instance_of?\":1,\"instance_variable_defined?\":1,instance_variable_get:1,instance_variable_set:1,instance_variables:1,\"integer?\":1,intern:1,invert:1,ioctl:1,\"is_a?\":1,isatty:1,\"iterator?\":1,join:1,\"key?\":1,keys:1,\"kind_of?\":1,lambda:1,last:1,length:1,lineno:1,ljust:1,load:1,local_variables:1,loop:1,lstrip:1,\"lstrip!\":1,map:1,\"map!\":1,match:1,max:1,\"member?\":1,merge:1,\"merge!\":1,method:1,\"method_defined?\":1,method_missing:1,methods:1,min:1,module_eval:1,modulo:1,name:1,nesting:1,\"new\":1,next:1,\"next!\":1,\"nil?\":1,nitems:1,\"nonzero?\":1,object_id:1,oct:1,open:1,pack:1,partition:1,pid:1,pipe:1,pop:1,popen:1,pos:1,prec:1,prec_f:1,prec_i:1,print:1,printf:1,private_class_method:1,private_instance_methods:1,\"private_method_defined?\":1,private_methods:1,proc:1,protected_instance_methods:1,\"protected_method_defined?\":1,protected_methods:1,public_class_method:1,public_instance_methods:1,\"public_method_defined?\":1,public_methods:1,push:1,putc:1,puts:1,quo:1,raise:1,rand:1,rassoc:1,read:1,read_nonblock:1,readchar:1,readline:1,readlines:1,readpartial:1,rehash:1,reject:1,\"reject!\":1,remainder:1,reopen:1,replace:1,require:1,\"respond_to?\":1,reverse:1,\"reverse!\":1,reverse_each:1,rewind:1,rindex:1,rjust:1,round:1,rstrip:1,\"rstrip!\":1,scan:1,seek:1,select:1,send:1,set_trace_func:1,shift:1,singleton_method_added:1,singleton_methods:1,size:1,sleep:1,slice:1,\"slice!\":1,sort:1,\"sort!\":1,sort_by:1,split:1,sprintf:1,squeeze:1,\"squeeze!\":1,srand:1,stat:1,step:1,store:1,strip:1,\"strip!\":1,sub:1,\"sub!\":1,succ:1,\"succ!\":1,sum:1,superclass:1,swapcase:1,\"swapcase!\":1,sync:1,syscall:1,sysopen:1,sysread:1,sysseek:1,system:1,syswrite:1,taint:1,\"tainted?\":1,tell:1,test:1,\"throw\":1,times:1,to_a:1,to_ary:1,to_f:1,to_hash:1,to_i:1,to_int:1,to_io:1,to_proc:1,to_s:1,to_str:1,to_sym:1,tr:1,\"tr!\":1,tr_s:1,\"tr_s!\":1,trace_var:1,transpose:1,trap:1,truncate:1,\"tty?\":1,type:1,ungetc:1,uniq:1,\"uniq!\":1,unpack:1,unshift:1,untaint:1,untrace_var:1,upcase:1,\"upcase!\":1,update:1,upto:1,\"value?\":1,values:1,values_at:1,warn:1,write:1,write_nonblock:1,\"zero?\":1,zip:1}};var d={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var k=[{cN:\"comment\",b:\"#\",e:\"$\",c:[d]},{cN:\"comment\",b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[d],r:10},{cN:\"comment\",b:\"^__END__\",e:\"\\\\n$\"}];var e={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:c,k:a};var g=[hljs.BE,e];var f=[{cN:\"string\",b:\"'\",e:\"'\",c:g,r:0},{cN:\"string\",b:'\"',e:'\"',c:g,r:0},{cN:\"string\",b:\"%[qw]?\\\\(\",e:\"\\\\)\",c:g,r:10},{cN:\"string\",b:\"%[qw]?\\\\[\",e:\"\\\\]\",c:g,r:10},{cN:\"string\",b:\"%[qw]?{\",e:\"}\",c:g,r:10},{cN:\"string\",b:\"%[qw]?<\",e:\">\",c:g,r:10},{cN:\"string\",b:\"%[qw]?/\",e:\"/\",c:g,r:10},{cN:\"string\",b:\"%[qw]?%\",e:\"%\",c:g,r:10},{cN:\"string\",b:\"%[qw]?-\",e:\"-\",c:g,r:10},{cN:\"string\",b:\"%[qw]?\\\\|\",e:\"\\\\|\",c:g,r:10}];var h={cN:\"function\",b:\"\\\\bdef\\\\s+\",e:\" |$|;\",l:c,k:a,c:[{cN:\"title\",b:i,l:c,k:a},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:c,k:a}].concat(k)};var j={cN:\"identifier\",b:c,l:c,k:a,r:0};var b=k.concat(f.concat([{cN:\"class\",b:\"\\\\b(class|module)\\\\b\",e:\"$|;\",k:{\"class\":1,module:1},c:[{cN:\"title\",b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\",r:0},{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+hljs.IR+\"::)?\"+hljs.IR}]}].concat(k)},h,{cN:\"constant\",b:\"(::)?([A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:f.concat([j]),r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"number\",b:\"\\\\?\\\\w\"},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},j,{b:\"(\"+hljs.RSR+\")\\\\s*\",c:k.concat([{cN:\"regexp\",b:\"/\",e:\"/[a-z]*\",i:\"\\\\n\",c:[hljs.BE]}]),r:0}]));e.c=b;h.c[1].c=b;return{dM:{l:c,k:a,c:b}}}();hljs.LANGUAGES.rust=function(){var c={cN:\"title\",b:hljs.UIR};var d={cN:\"string\",b:'\"',e:'\"',c:[hljs.BE],r:0};var b={cN:\"number\",b:\"\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)\",r:0};var a={alt:1,any:1,as:1,assert:1,be:1,bind:1,block:1,bool:1,\"break\":1,\"char\":1,check:1,claim:1,\"const\":1,cont:1,dir:1,\"do\":1,\"else\":1,\"enum\":1,\"export\":1,f32:1,f64:1,fail:1,\"false\":1,\"float\":1,fn:10,\"for\":1,i16:1,i32:1,i64:1,i8:1,\"if\":1,iface:10,impl:10,\"import\":1,\"in\":1,\"int\":1,let:1,log:1,mod:1,mutable:1,\"native\":1,note:1,of:1,prove:1,pure:10,resource:1,ret:1,self:1,str:1,syntax:1,\"true\":1,type:1,u16:1,u32:1,u64:1,u8:1,uint:1,unchecked:1,unsafe:1,use:1,vec:1,\"while\":1};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,d,hljs.ASM,b,{cN:\"function\",b:\"fn\",e:\"(\\\\(|<)\",k:{fn:1},c:[c]},{cN:\"preprocessor\",b:\"#\\\\[\",e:\"\\\\]\"},{b:\"type\",e:\"(=|<)\",k:{type:1},c:[c]},{b:\"iface\",e:\"({|<)\",k:{iface:1},c:[c]},{b:\"enum\",e:\"({|<)\",k:{\"enum\":1},c:[c]}]}}}();hljs.LANGUAGES.diff={cI:true,dM:{c:[{cN:\"chunk\",b:\"^\\\\@\\\\@ +\\\\-\\\\d+,\\\\d+ +\\\\+\\\\d+,\\\\d+ +\\\\@\\\\@$\",r:10},{cN:\"chunk\",b:\"^\\\\*\\\\*\\\\* +\\\\d+,\\\\d+ +\\\\*\\\\*\\\\*\\\\*$\",r:10},{cN:\"chunk\",b:\"^\\\\-\\\\-\\\\- +\\\\d+,\\\\d+ +\\\\-\\\\-\\\\-\\\\-$\",r:10},{cN:\"header\",b:\"Index: \",e:\"$\"},{cN:\"header\",b:\"=====\",e:\"=====$\"},{cN:\"header\",b:\"^\\\\-\\\\-\\\\-\",e:\"$\"},{cN:\"header\",b:\"^\\\\*{3} \",e:\"$\"},{cN:\"header\",b:\"^\\\\+\\\\+\\\\+\",e:\"$\"},{cN:\"header\",b:\"\\\\*{5}\",e:\"\\\\*{5}$\"},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}};hljs.LANGUAGES.rib={dM:{k:{keyword:{ArchiveRecord:1,AreaLightSource:1,Atmosphere:1,Attribute:1,AttributeBegin:1,AttributeEnd:1,Basis:1,Begin:1,Blobby:1,Bound:1,Clipping:1,ClippingPlane:1,Color:1,ColorSamples:1,ConcatTransform:1,Cone:1,CoordinateSystem:1,CoordSysTransform:1,CropWindow:1,Curves:1,Cylinder:1,DepthOfField:1,Detail:1,DetailRange:1,Disk:1,Displacement:1,Display:1,End:1,ErrorHandler:1,Exposure:1,Exterior:1,Format:1,FrameAspectRatio:1,FrameBegin:1,FrameEnd:1,GeneralPolygon:1,GeometricApproximation:1,Geometry:1,Hider:1,Hyperboloid:1,Identity:1,Illuminate:1,Imager:1,Interior:1,LightSource:1,MakeCubeFaceEnvironment:1,MakeLatLongEnvironment:1,MakeShadow:1,MakeTexture:1,Matte:1,MotionBegin:1,MotionEnd:1,NuPatch:1,ObjectBegin:1,ObjectEnd:1,ObjectInstance:1,Opacity:1,Option:1,Orientation:1,Paraboloid:1,Patch:1,PatchMesh:1,Perspective:1,PixelFilter:1,PixelSamples:1,PixelVariance:1,Points:1,PointsGeneralPolygons:1,PointsPolygons:1,Polygon:1,Procedural:1,Projection:1,Quantize:1,ReadArchive:1,RelativeDetail:1,ReverseOrientation:1,Rotate:1,Scale:1,ScreenWindow:1,ShadingInterpolation:1,ShadingRate:1,Shutter:1,Sides:1,Skew:1,SolidBegin:1,SolidEnd:1,Sphere:1,SubdivisionMesh:1,Surface:1,TextureCoordinates:1,Torus:1,Transform:1,TransformBegin:1,TransformEnd:1,TransformPoints:1,Translate:1,TrimCurve:1,WorldBegin:1,WorldEnd:1}},i:\"</\",c:[hljs.HCM,hljs.CNM,hljs.ASM,hljs.QSM]}};hljs.LANGUAGES.rsl={dM:{k:{keyword:{\"float\":1,color:1,point:1,normal:1,vector:1,matrix:1,\"while\":1,\"for\":1,\"if\":1,\"do\":1,\"return\":1,\"else\":1,\"break\":1,extern:1,\"continue\":1},built_in:{abs:1,acos:1,ambient:1,area:1,asin:1,atan:1,atmosphere:1,attribute:1,calculatenormal:1,ceil:1,cellnoise:1,clamp:1,comp:1,concat:1,cos:1,degrees:1,depth:1,Deriv:1,diffuse:1,distance:1,Du:1,Dv:1,environment:1,exp:1,faceforward:1,filterstep:1,floor:1,format:1,fresnel:1,incident:1,length:1,lightsource:1,log:1,match:1,max:1,min:1,mod:1,noise:1,normalize:1,ntransform:1,opposite:1,option:1,phong:1,pnoise:1,pow:1,printf:1,ptlined:1,radians:1,random:1,reflect:1,refract:1,renderinfo:1,round:1,setcomp:1,setxcomp:1,setycomp:1,setzcomp:1,shadow:1,sign:1,sin:1,smoothstep:1,specular:1,specularbrdf:1,spline:1,sqrt:1,step:1,tan:1,texture:1,textureinfo:1,trace:1,transform:1,vtransform:1,xcomp:1,ycomp:1,zcomp:1}},i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,hljs.ASM,hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"shader\",b:\"surface |displacement |light |volume |imager \",e:\"\\\\(\",k:{surface:1,displacement:1,light:1,volume:1,imager:1}},{cN:\"shading\",b:\"illuminate|illuminance|gather\",e:\"\\\\(\",k:{illuminate:1,illuminance:1,gather:1}}]}};hljs.LANGUAGES.javascript={dM:{k:{keyword:{\"in\":1,\"if\":1,\"for\":1,\"while\":1,\"finally\":1,\"var\":1,\"new\":1,\"function\":1,\"do\":1,\"return\":1,\"void\":1,\"else\":1,\"break\":1,\"catch\":1,\"instanceof\":1,\"with\":1,\"throw\":1,\"case\":1,\"default\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"typeof\":1,\"delete\":1},literal:{\"true\":1,\"false\":1,\"null\":1}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{b:\"(\"+hljs.RSR+\"|case|return|throw)\\\\s*\",k:{\"return\":1,\"throw\":1,\"case\":1},c:[hljs.CLCM,hljs.CBLCLM,{cN:\"regexp\",b:\"/\",e:\"/[gim]*\",c:[{b:\"\\\\\\\\/\"}]}],r:0},{cN:\"function\",b:\"\\\\bfunction\\\\b\",e:\"{\",k:{\"function\":1},c:[{cN:\"title\",b:\"[A-Za-z$_][0-9A-Za-z$_]*\"},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM]}]}]}};hljs.LANGUAGES.lua=function(){var b=\"\\\\[=*\\\\[\";var d=\"\\\\]=*\\\\]\";var a={b:b,e:d,c:[\"self\"]};var c=[{cN:\"comment\",b:\"--(?!\"+b+\")\",e:\"$\"},{cN:\"comment\",b:\"--\"+b,e:d,c:[a],r:10}];return{dM:{l:hljs.UIR,k:{keyword:{and:1,\"break\":1,\"do\":1,\"else\":1,elseif:1,end:1,\"false\":1,\"for\":1,\"if\":1,\"in\":1,local:1,nil:1,not:1,or:1,repeat:1,\"return\":1,then:1,\"true\":1,until:1,\"while\":1},built_in:{_G:1,_VERSION:1,assert:1,collectgarbage:1,dofile:1,error:1,getfenv:1,getmetatable:1,ipairs:1,load:1,loadfile:1,loadstring:1,module:1,next:1,pairs:1,pcall:1,print:1,rawequal:1,rawget:1,rawset:1,require:1,select:1,setfenv:1,setmetatable:1,tonumber:1,tostring:1,type:1,unpack:1,xpcall:1,coroutine:1,debug:1,io:1,math:1,os:1,\"package\":1,string:1,table:1}},c:c.concat([{cN:\"function\",b:\"\\\\bfunction\\\\b\",e:\"\\\\)\",k:{\"function\":1},c:[{cN:\"title\",b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"},{cN:\"params\",b:\"\\\\(\",eW:true,c:c}].concat(c)},hljs.CNM,hljs.ASM,hljs.QSM,{cN:\"string\",b:b,e:d,c:[a],r:10}])}}}();hljs.LANGUAGES.xml=function(){var b=\"[A-Za-z0-9\\\\._:-]+\";var a={eW:true,c:[{cN:\"attribute\",b:b,r:0},{b:'=\"',rB:true,e:'\"',c:[{cN:\"value\",b:'\"',eW:true}]},{b:\"='\",rB:true,e:\"'\",c:[{cN:\"value\",b:\"'\",eW:true}]},{b:\"=\",c:[{cN:\"value\",b:\"[^\\\\s/>]+\"}]}]};return{cI:true,dM:{c:[{cN:\"pi\",b:\"<\\\\?\",e:\"\\\\?>\",r:10},{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:{style:1}},c:[a],starts:{cN:\"css\",e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:{script:1}},c:[a],starts:{cN:\"javascript\",e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{cN:\"vbscript\",b:\"<%\",e:\"%>\",sL:\"vbscript\"},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ />]+\"},a]}]}}}();hljs.LANGUAGES.markdown={cI:true,dM:{c:[{cN:\"header\",b:\"^#{1,3}\",e:\"$\"},{cN:\"header\",b:\"^.+?\\\\n[=-]{2,}$\"},{b:\"<\",e:\">\",sL:\"xml\"},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",b:\"[*_].+?[*_]\"},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",b:\"`.+?`\"},{cN:\"code\",b:\"^    \",e:\"$\",r:0},{cN:\"horizontal_rule\",b:\"^-{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\]\\\\(.+?\\\\)\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[.+\\\\]\"},{cN:\"link_url\",b:\"\\\\(\",e:\"\\\\)\",eB:true,eE:true}]}]}};hljs.LANGUAGES.css=function(){var a={cN:\"function\",b:hljs.IR+\"\\\\(\",e:\"\\\\)\",c:[{eW:true,eE:true,c:[hljs.NM,hljs.ASM,hljs.QSM]}]};return{cI:true,dM:{i:\"[=/|']\",c:[hljs.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:{\"font-face\":1,page:1}},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",eE:true,k:{\"import\":1,page:1,media:1,charset:1},c:[a,hljs.ASM,hljs.QSM,hljs.NM]},{cN:\"tag\",b:hljs.IR,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[hljs.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[a,hljs.NM,hljs.QSM,hljs.ASM,hljs.CBLCLM,{cN:\"hexcolor\",b:\"\\\\#[0-9A-F]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}}}();hljs.LANGUAGES.lisp=function(){var k=\"[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#]*\";var m=\"(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\";var a={cN:\"literal\",b:\"\\\\b(t{1}|nil)\\\\b\"};var f=[{cN:\"number\",b:m},{cN:\"number\",b:\"#b[0-1]+(/[0-1]+)?\"},{cN:\"number\",b:\"#o[0-7]+(/[0-7]+)?\"},{cN:\"number\",b:\"#x[0-9a-f]+(/[0-9a-f]+)?\"},{cN:\"number\",b:\"#c\\\\(\"+m+\" +\"+m,e:\"\\\\)\"}];var b={cN:\"string\",b:'\"',e:'\"',c:[hljs.BE],r:0};var l={cN:\"comment\",b:\";\",e:\"$\"};var c={cN:\"variable\",b:\"\\\\*\",e:\"\\\\*\"};var j={cN:\"keyword\",b:\"[:&]\"+k};var h={b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",a,b].concat(f)};var e={cN:\"quoted\",b:\"['`]\\\\(\",e:\"\\\\)\",c:f.concat([b,c,j,h])};var d={cN:\"quoted\",b:\"\\\\(quote \",e:\"\\\\)\",k:{title:{quote:1}},c:f.concat([b,c,j,h])};var i={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var g={cN:\"body\",eW:true,eE:true};i.c=[{cN:\"title\",b:k},g];g.c=[e,d,i,a].concat(f).concat([b,l,c,j]);return{cI:true,dM:{i:\"[^\\\\s]\",c:f.concat([a,b,l,e,d,i])}}}();hljs.LANGUAGES.profile={dM:{c:[hljs.CNM,{cN:\"builtin\",b:\"{\",e:\"}$\",eB:true,eE:true,c:[hljs.ASM,hljs.QSM],r:0},{cN:\"filename\",b:\"[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}\",e:\":\",eE:true},{cN:\"header\",b:\"(ncalls|tottime|cumtime)\",e:\"$\",k:{ncalls:1,tottime:10,cumtime:10,filename:1},r:10},{cN:\"summary\",b:\"function calls\",e:\"$\",c:[hljs.CNM],r:10},hljs.ASM,hljs.QSM,{cN:\"function\",b:\"\\\\(\",e:\"\\\\)$\",c:[{cN:\"title\",b:hljs.UIR,r:0}],r:0}]}};hljs.LANGUAGES.java={dM:{k:{\"false\":1,\"synchronized\":1,\"int\":1,\"abstract\":1,\"float\":1,\"private\":1,\"char\":1,\"interface\":1,\"boolean\":1,\"static\":1,\"null\":1,\"if\":1,\"const\":1,\"for\":1,\"true\":1,\"while\":1,\"long\":1,\"throw\":1,strictfp:1,\"finally\":1,\"protected\":1,\"extends\":1,\"import\":1,\"native\":1,\"final\":1,\"implements\":1,\"return\":1,\"void\":1,\"enum\":1,\"else\":1,\"break\":1,\"transient\":1,\"new\":1,\"catch\":1,\"instanceof\":1,\"byte\":1,\"super\":1,\"class\":1,\"volatile\":1,\"case\":1,assert:1,\"short\":1,\"package\":1,\"default\":1,\"double\":1,\"public\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"throws\":1},c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,{cN:\"class\",b:\"(class |interface )\",e:\"{\",k:{\"class\":1,\"interface\":1},i:\":\",c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:10},{cN:\"title\",b:hljs.UIR}]},hljs.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}};hljs.LANGUAGES.php={cI:true,dM:{k:{and:1,include_once:1,list:1,\"abstract\":1,global:1,\"private\":1,echo:1,\"interface\":1,as:1,\"static\":1,endswitch:1,array:1,\"null\":1,\"if\":1,endwhile:1,or:1,\"const\":1,\"for\":1,endforeach:1,self:1,\"var\":1,\"while\":1,isset:1,\"public\":1,\"protected\":1,exit:1,foreach:1,\"throw\":1,elseif:1,\"extends\":1,include:1,__FILE__:1,empty:1,require_once:1,\"function\":1,\"do\":1,xor:1,\"return\":1,\"implements\":1,parent:1,clone:1,use:1,__CLASS__:1,__LINE__:1,\"else\":1,\"break\":1,print:1,\"eval\":1,\"new\":1,\"catch\":1,__METHOD__:1,\"class\":1,\"case\":1,exception:1,php_user_filter:1,\"default\":1,die:1,require:1,__FUNCTION__:1,enddeclare:1,\"final\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,endfor:1,endif:1,declare:1,unset:1,\"true\":1,\"false\":1,namespace:1,trait:1,\"goto\":1,\"instanceof\":1,__DIR__:1,__NAMESPACE__:1,__halt_compiler:1},c:[hljs.CLCM,hljs.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"}]},{cN:\"comment\",eB:true,b:\"__halt_compiler[^;]+;\",e:\"[\\\\n\\\\r]$\"},hljs.CNM,hljs.BNM,hljs.inherit(hljs.ASM,{i:null}),hljs.inherit(hljs.QSM,{i:null}),{cN:\"string\",b:'b\"',e:'\"',c:[hljs.BE]},{cN:\"string\",b:\"b'\",e:\"'\",c:[hljs.BE]},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[hljs.BE]},{cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"},{cN:\"preprocessor\",b:\"<\\\\?php\",r:10},{cN:\"preprocessor\",b:\"\\\\?>\"}]}};hljs.LANGUAGES.haskell=function(){var a={cN:\"label\",b:\"\\\\b[A-Z][\\\\w']*\",r:0};var b={cN:\"container\",b:\"\\\\(\",e:\"\\\\)\",c:[{cN:\"label\",b:\"\\\\b[A-Z][\\\\w\\\\(\\\\)\\\\.']*\"},{cN:\"title\",b:\"[_a-z][\\\\w']*\"}]};return{dM:{k:{keyword:{let:1,\"in\":1,\"if\":1,then:1,\"else\":1,\"case\":1,of:1,where:1,\"do\":1,module:1,\"import\":1,hiding:1,qualified:1,type:1,data:1,newtype:1,deriving:1,\"class\":1,instance:1,\"null\":1,not:1,as:1}},c:[{cN:\"comment\",b:\"--\",e:\"$\"},{cN:\"comment\",b:\"{-\",e:\"-}\"},{cN:\"string\",b:\"\\\\s+'\",e:\"'\",c:[hljs.BE],r:0},hljs.QSM,{cN:\"import\",b:\"\\\\bimport\",e:\"$\",k:{\"import\":1,qualified:1,as:1,hiding:1},c:[b]},{cN:\"module\",b:\"\\\\bmodule\",e:\"where\",k:{module:1,where:1},c:[b]},{cN:\"class\",b:\"\\\\b(class|instance|data|(new)?type)\",e:\"(where|$)\",k:{\"class\":1,where:1,instance:1,data:1,type:1,newtype:1,deriving:1},c:[a]},hljs.CNM,{cN:\"shebang\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,{cN:\"title\",b:\"^[_a-z][\\\\w']*\"}]}}}();hljs.LANGUAGES[\"1c\"]=function(){var b=\"[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*\";var e={\"возврат\":1,\"дата\":1,\"для\":1,\"если\":1,\"и\":1,\"или\":1,\"иначе\":1,\"иначеесли\":1,\"исключение\":1,\"конецесли\":1,\"конецпопытки\":1,\"конецпроцедуры\":1,\"конецфункции\":1,\"конеццикла\":1,\"константа\":1,\"не\":1,\"перейти\":1,\"перем\":1,\"перечисление\":1,\"по\":1,\"пока\":1,\"попытка\":1,\"прервать\":1,\"продолжить\":1,\"процедура\":1,\"строка\":1,\"тогда\":1,\"фс\":1,\"функция\":1,\"цикл\":1,\"число\":1,\"экспорт\":1};var d={ansitooem:1,oemtoansi:1,\"ввестивидсубконто\":1,\"ввестидату\":1,\"ввестизначение\":1,\"ввестиперечисление\":1,\"ввестипериод\":1,\"ввестиплансчетов\":1,\"ввестистроку\":1,\"ввестичисло\":1,\"вопрос\":1,\"восстановитьзначение\":1,\"врег\":1,\"выбранныйплансчетов\":1,\"вызватьисключение\":1,\"датагод\":1,\"датамесяц\":1,\"датачисло\":1,\"добавитьмесяц\":1,\"завершитьработусистемы\":1,\"заголовоксистемы\":1,\"записьжурналарегистрации\":1,\"запуститьприложение\":1,\"зафиксироватьтранзакцию\":1,\"значениевстроку\":1,\"значениевстрокувнутр\":1,\"значениевфайл\":1,\"значениеизстроки\":1,\"значениеизстрокивнутр\":1,\"значениеизфайла\":1,\"имякомпьютера\":1,\"имяпользователя\":1,\"каталогвременныхфайлов\":1,\"каталогиб\":1,\"каталогпользователя\":1,\"каталогпрограммы\":1,\"кодсимв\":1,\"командасистемы\":1,\"конгода\":1,\"конецпериодаби\":1,\"конецрассчитанногопериодаби\":1,\"конецстандартногоинтервала\":1,\"конквартала\":1,\"конмесяца\":1,\"коннедели\":1,\"лев\":1,\"лог\":1,\"лог10\":1,\"макс\":1,\"максимальноеколичествосубконто\":1,\"мин\":1,\"монопольныйрежим\":1,\"названиеинтерфейса\":1,\"названиенабораправ\":1,\"назначитьвид\":1,\"назначитьсчет\":1,\"найти\":1,\"найтипомеченныенаудаление\":1,\"найтиссылки\":1,\"началопериодаби\":1,\"началостандартногоинтервала\":1,\"начатьтранзакцию\":1,\"начгода\":1,\"начквартала\":1,\"начмесяца\":1,\"начнедели\":1,\"номерднягода\":1,\"номерднянедели\":1,\"номернеделигода\":1,\"нрег\":1,\"обработкаожидания\":1,\"окр\":1,\"описаниеошибки\":1,\"основнойжурналрасчетов\":1,\"основнойплансчетов\":1,\"основнойязык\":1,\"открытьформу\":1,\"открытьформумодально\":1,\"отменитьтранзакцию\":1,\"очиститьокносообщений\":1,\"периодстр\":1,\"полноеимяпользователя\":1,\"получитьвремята\":1,\"получитьдатута\":1,\"получитьдокументта\":1,\"получитьзначенияотбора\":1,\"получитьпозициюта\":1,\"получитьпустоезначение\":1,\"получитьта\":1,\"прав\":1,\"праводоступа\":1,\"предупреждение\":1,\"префиксавтонумерации\":1,\"пустаястрока\":1,\"пустоезначение\":1,\"рабочаядаттьпустоезначение\":1,\"рабочаядата\":1,\"разделительстраниц\":1,\"разделительстрок\":1,\"разм\":1,\"разобратьпозициюдокумента\":1,\"рассчитатьрегистрына\":1,\"рассчитатьрегистрыпо\":1,\"сигнал\":1,\"симв\":1,\"символтабуляции\":1,\"создатьобъект\":1,\"сокрл\":1,\"сокрлп\":1,\"сокрп\":1,\" сообщить\":1,\"состояние\":1,\"сохранитьзначение\":1,\"сред\":1,\"статусвозврата\":1,\"стрдлина\":1,\"стрзаменить\":1,\"стрколичествострок\":1,\"стрполучитьстроку\":1,\" стрчисловхождений\":1,\"сформироватьпозициюдокумента\":1,\"счетпокоду\":1,\"текущаядата\":1,\"текущеевремя\":1,\"типзначения\":1,\"типзначениястр\":1,\"удалитьобъекты\":1,\"установитьтана\":1,\"установитьтапо\":1,\"фиксшаблон\":1,\"формат\":1,\"цел\":1,\"шаблон\":1};var a={cN:\"dquote\",b:'\"\"'};var c={cN:\"string\",b:'\"',e:'\"|$',c:[a],r:0};var f={cN:\"string\",b:\"\\\\|\",e:'\"|$',c:[a]};return{cI:true,dM:{l:b,k:{keyword:e,built_in:d},c:[hljs.CLCM,hljs.NM,c,f,{cN:\"function\",b:\"(процедура|функция)\",e:\"$\",l:b,k:{\"процедура\":1,\"экспорт\":1,\"функция\":1},c:[{cN:\"title\",b:b},{cN:\"tail\",eW:true,c:[{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:b,k:{\"знач\":1},c:[c,f]},{cN:\"export\",b:\"экспорт\",eW:true,l:b,k:{\"экспорт\":1},c:[hljs.CLCM]}]},hljs.CLCM]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"date\",b:\"'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})'\"}]}}}();hljs.LANGUAGES.python=function(){var a=[{cN:\"string\",b:\"(u|b)?r?'''\",e:\"'''\",r:10},{cN:\"string\",b:'(u|b)?r?\"\"\"',e:'\"\"\"',r:10},{cN:\"string\",b:\"(u|r|ur)'\",e:\"'\",c:[hljs.BE],r:10},{cN:\"string\",b:'(u|r|ur)\"',e:'\"',c:[hljs.BE],r:10},{cN:\"string\",b:\"(b|br)'\",e:\"'\",c:[hljs.BE]},{cN:\"string\",b:'(b|br)\"',e:'\"',c:[hljs.BE]}].concat([hljs.ASM,hljs.QSM]);var b={cN:\"title\",b:hljs.UIR};var c={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:a.concat([hljs.CNM])};return{dM:{k:{keyword:{and:1,elif:1,is:1,global:1,as:1,\"in\":1,\"if\":1,from:1,raise:1,\"for\":1,except:1,\"finally\":1,print:1,\"import\":1,pass:1,\"return\":1,exec:1,\"else\":1,\"break\":1,not:1,\"with\":1,\"class\":1,assert:1,yield:1,\"try\":1,\"while\":1,\"continue\":1,del:1,or:1,def:1,lambda:1,nonlocal:10},built_in:{None:1,True:1,False:1,Ellipsis:1,NotImplemented:1}},i:\"(</|->|\\\\?)\",c:a.concat([hljs.HCM,{cN:\"function\",b:\"\\\\bdef \",e:\":\",i:\"$\",k:{def:1},c:[b,c],r:10},{cN:\"class\",b:\"\\\\bclass \",e:\":\",i:\"[${]\",k:{\"class\":1},c:[b,c],r:10},hljs.CNM,{cN:\"decorator\",b:\"@\",e:\"$\"}])}}}();hljs.LANGUAGES.smalltalk=function(){var b=\"[a-z][a-zA-Z0-9_]*\";var c={cN:\"char\",b:\"\\\\$.{1}\"};var a={cN:\"symbol\",b:\"#\"+hljs.UIR};return{dM:{k:{self:1,\"super\":1,nil:1,\"true\":1,\"false\":1,thisContext:1},c:[{cN:\"comment\",b:'\"',e:'\"',r:0},hljs.ASM,{cN:\"class\",b:\"\\\\b[A-Z][A-Za-z0-9_]*\",r:0},{cN:\"method\",b:b+\":\"},hljs.CNM,a,c,{cN:\"localvars\",b:\"\\\\|\\\\s*((\"+b+\")\\\\s*)+\\\\|\"},{cN:\"array\",b:\"\\\\#\\\\(\",e:\"\\\\)\",c:[hljs.ASM,c,hljs.CNM,a]}]}}}();hljs.LANGUAGES.tex=function(){var c={cN:\"command\",b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]?\",r:10};var b={cN:\"command\",b:\"\\\\\\\\[^a-zA-Zа-яА-я0-9]\",r:0};var a={cN:\"special\",b:\"[{}\\\\[\\\\]\\\\&#~]\",r:0};return{dM:{c:[{b:\"\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",rB:true,c:[c,b,{cN:\"number\",b:\" *=\",e:\"-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",eB:true}],r:10},c,b,a,{cN:\"formula\",b:\"\\\\$\\\\$\",e:\"\\\\$\\\\$\",c:[c,b,a],r:0},{cN:\"formula\",b:\"\\\\$\",e:\"\\\\$\",c:[c,b,a],r:0},{cN:\"comment\",b:\"%\",e:\"$\",r:0}]}}}();hljs.LANGUAGES.actionscript=function(){var c=\"[a-zA-Z_$][a-zA-Z0-9_$]*\";var a=\"([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)\";var d={cN:\"rest_arg\",b:\"[.]{3}\",e:c,r:10};var b={cN:\"title\",b:c};return{dM:{k:{keyword:{as:1,\"break\":1,\"case\":1,\"catch\":1,\"class\":1,\"const\":1,\"continue\":1,\"default\":1,\"delete\":1,\"do\":1,dynamic:5,each:1,\"else\":1,\"extends\":1,\"final\":1,\"finally\":1,\"for\":1,\"function\":1,get:1,\"if\":1,\"implements\":1,\"import\":1,\"in\":1,include:1,\"instanceof\":1,\"interface\":1,internal:1,is:1,namespace:1,\"native\":1,\"new\":1,override:1,\"package\":1,\"private\":1,\"protected\":1,\"public\":1,\"return\":1,set:1,\"static\":1,\"super\":5,\"switch\":1,\"this\":1,\"throw\":1,\"try\":1,\"typeof\":1,use:1,\"var\":1,\"void\":1,\"while\":1,\"with\":1},literal:{\"true\":1,\"false\":1,\"null\":1,\"undefined\":1},reserved:{\"abstract\":0,\"boolean\":0,\"byte\":0,cast:0,\"char\":0,\"debugger\":0,\"double\":0,\"enum\":0,\"export\":0,\"float\":0,\"goto\":0,intrinsic:0,\"long\":0,prototype:0,\"short\":0,\"synchronized\":0,\"throws\":0,to:0,\"transient\":0,type:0,virtual:0,\"volatile\":0}},c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,hljs.CNM,{cN:\"package\",b:\"package ?\",e:\"{\",k:{\"package\":1},c:[b]},{cN:\"class\",b:\"(class|interface) \",e:\"{\",k:{\"class\":1,\"interface\":1},c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:5},b]},{cN:\"preprocessor\",b:\"(import|include)\\\\b\",e:\";\",k:{\"import\":1,include:1}},{cN:\"function\",b:\"function \",e:\"[{;]\",k:{\"function\":1},c:[b,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,hljs.CLCM,hljs.CBLCLM,d]},{cN:\"type\",b:\":\",e:a,r:10}]}]}}}();hljs.LANGUAGES.sql={cI:true,dM:{i:\"[^\\\\s]\",c:[{cN:\"operator\",b:\"(begin|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant)\\\\b\",e:\";|$\",k:{keyword:{all:1,partial:1,global:1,month:1,current_timestamp:1,using:1,go:1,revoke:1,smallint:1,indicator:1,\"end-exec\":1,disconnect:1,zone:1,\"with\":1,character:1,assertion:1,to:1,add:1,current_user:1,usage:1,input:1,local:1,alter:1,match:1,collate:1,real:1,then:1,rollback:1,get:1,read:1,timestamp:1,session_user:1,not:1,integer:1,bit:1,unique:1,day:1,minute:1,desc:1,insert:1,execute:1,like:1,ilike:2,level:1,decimal:1,drop:1,\"continue\":1,isolation:1,found:1,where:1,constraints:1,domain:1,right:1,national:1,some:1,module:1,transaction:1,relative:1,second:1,connect:1,escape:1,close:1,system_user:1,\"for\":1,deferred:1,section:1,cast:1,current:1,sqlstate:1,allocate:1,intersect:1,deallocate:1,numeric:1,\"public\":1,preserve:1,full:1,\"goto\":1,initially:1,asc:1,no:1,key:1,output:1,collation:1,group:1,by:1,union:1,session:1,both:1,last:1,language:1,constraint:1,column:1,of:1,space:1,foreign:1,deferrable:1,prior:1,connection:1,unknown:1,action:1,commit:1,view:1,or:1,first:1,into:1,\"float\":1,year:1,primary:1,cascaded:1,except:1,restrict:1,set:1,references:1,names:1,table:1,outer:1,open:1,select:1,size:1,are:1,rows:1,from:1,prepare:1,distinct:1,leading:1,create:1,only:1,next:1,inner:1,authorization:1,schema:1,corresponding:1,option:1,declare:1,precision:1,immediate:1,\"else\":1,timezone_minute:1,external:1,varying:1,translation:1,\"true\":1,\"case\":1,exception:1,join:1,hour:1,\"default\":1,\"double\":1,scroll:1,value:1,cursor:1,descriptor:1,values:1,dec:1,fetch:1,procedure:1,\"delete\":1,and:1,\"false\":1,\"int\":1,is:1,describe:1,\"char\":1,as:1,at:1,\"in\":1,varchar:1,\"null\":1,trailing:1,any:1,absolute:1,current_time:1,end:1,grant:1,privileges:1,when:1,cross:1,check:1,write:1,current_date:1,pad:1,begin:1,temporary:1,exec:1,time:1,update:1,catalog:1,user:1,sql:1,date:1,on:1,identity:1,timezone_hour:1,natural:1,whenever:1,interval:1,work:1,order:1,cascade:1,diagnostics:1,nchar:1,having:1,left:1,call:1,\"do\":1,handler:1,load:1,replace:1,truncate:1,start:1,lock:1,show:1,pragma:1},aggregate:{count:1,sum:1,min:1,max:1,avg:1}},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,{b:\"''\"}],r:0},{cN:\"string\",b:'\"',e:'\"',c:[hljs.BE,{b:'\"\"'}],r:0},{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},hljs.CNM,{b:\"\\\\n\"}]},hljs.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}};hljs.LANGUAGES.vala={dM:{k:{keyword:{\"char\":1,uchar:1,unichar:1,\"int\":1,uint:1,\"long\":1,ulong:1,\"short\":1,ushort:1,int8:1,int16:1,int32:1,int64:1,uint8:1,uint16:1,uint32:1,uint64:1,\"float\":1,\"double\":1,bool:1,struct:1,\"enum\":1,string:1,\"void\":1,weak:5,unowned:5,owned:5,async:5,signal:5,\"static\":1,\"abstract\":1,\"interface\":1,override:1,\"while\":1,\"do\":1,\"for\":1,foreach:1,\"else\":1,\"switch\":1,\"case\":1,\"break\":1,\"default\":1,\"return\":1,\"try\":1,\"catch\":1,\"public\":1,\"private\":1,\"protected\":1,internal:1,using:1,\"new\":1,\"this\":1,get:1,set:1,\"const\":1,stdout:1,stdin:1,stderr:1,\"var\":1,DBus:2,GLib:2,CCode:10,Gee:10,Object:1},literal:{\"false\":1,\"true\":1,\"null\":1}},c:[{cN:\"class\",b:\"(class |interface |delegate |namespace )\",e:\"{\",k:{\"class\":1,\"interface\":1},c:[{b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1}},{cN:\"title\",b:hljs.UIR}]},hljs.CLCM,hljs.CBLCLM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',r:5},hljs.ASM,hljs.QSM,hljs.CNM,{cN:\"preprocessor\",b:\"^#\",e:\"$\",r:2},{cN:\"constant\",b:\" [A-Z_]+ \",r:0}]}};hljs.LANGUAGES.ini={cI:true,dM:{i:\"[^\\\\s]\",c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9_\\\\[\\\\]]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:{on:1,off:1,\"true\":1,\"false\":1,yes:1,no:1},c:[hljs.QSM,hljs.NM]}]}]}};hljs.LANGUAGES.axapta={dM:{k:{\"false\":1,\"int\":1,\"abstract\":1,\"private\":1,\"char\":1,\"interface\":1,\"boolean\":1,\"static\":1,\"null\":1,\"if\":1,\"for\":1,\"true\":1,\"while\":1,\"long\":1,\"throw\":1,\"finally\":1,\"protected\":1,\"extends\":1,\"final\":1,\"implements\":1,\"return\":1,\"void\":1,\"enum\":1,\"else\":1,\"break\":1,\"new\":1,\"catch\":1,\"byte\":1,\"super\":1,\"class\":1,\"case\":1,\"short\":1,\"default\":1,\"double\":1,\"public\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,reverse:1,firstfast:1,firstonly:1,forupdate:1,nofetch:1,sum:1,avg:1,minof:1,maxof:1,count:1,order:1,group:1,by:1,asc:1,desc:1,index:1,hint:1,like:1,dispaly:1,edit:1,client:1,server:1,ttsbegin:1,ttscommit:1,str:1,real:1,date:1,container:1,anytype:1,common:1,div:1,mod:1},c:[hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(class |interface )\",e:\"{\",i:\":\",k:{\"class\":1,\"interface\":1},c:[{cN:\"inheritance\",b:\"(implements|extends)\",k:{\"extends\":1,\"implements\":1},r:10},{cN:\"title\",b:hljs.UIR}]}]}};hljs.LANGUAGES.perl=function(){var c={getpwent:1,getservent:1,quotemeta:1,msgrcv:1,scalar:1,kill:1,dbmclose:1,undef:1,lc:1,ma:1,syswrite:1,tr:1,send:1,umask:1,sysopen:1,shmwrite:1,vec:1,qx:1,utime:1,local:1,oct:1,semctl:1,localtime:1,readpipe:1,\"do\":1,\"return\":1,format:1,read:1,sprintf:1,dbmopen:1,pop:1,getpgrp:1,not:1,getpwnam:1,rewinddir:1,qq:1,fileno:1,qw:1,endprotoent:1,wait:1,sethostent:1,bless:1,s:1,opendir:1,\"continue\":1,each:1,sleep:1,endgrent:1,shutdown:1,dump:1,chomp:1,connect:1,getsockname:1,die:1,socketpair:1,close:1,flock:1,exists:1,index:1,shmget:1,sub:1,\"for\":1,endpwent:1,redo:1,lstat:1,msgctl:1,setpgrp:1,abs:1,exit:1,select:1,print:1,ref:1,gethostbyaddr:1,unshift:1,fcntl:1,syscall:1,\"goto\":1,getnetbyaddr:1,join:1,gmtime:1,symlink:1,semget:1,splice:1,x:1,getpeername:1,recv:1,log:1,setsockopt:1,cos:1,last:1,reverse:1,gethostbyname:1,getgrnam:1,study:1,formline:1,endhostent:1,times:1,chop:1,length:1,gethostent:1,getnetent:1,pack:1,getprotoent:1,getservbyname:1,rand:1,mkdir:1,pos:1,chmod:1,y:1,substr:1,endnetent:1,printf:1,next:1,open:1,msgsnd:1,readdir:1,use:1,unlink:1,getsockopt:1,getpriority:1,rindex:1,wantarray:1,hex:1,system:1,getservbyport:1,endservent:1,\"int\":1,chr:1,untie:1,rmdir:1,prototype:1,tell:1,listen:1,fork:1,shmread:1,ucfirst:1,setprotoent:1,\"else\":1,sysseek:1,link:1,getgrgid:1,shmctl:1,waitpid:1,unpack:1,getnetbyname:1,reset:1,chdir:1,grep:1,split:1,require:1,caller:1,lcfirst:1,until:1,warn:1,\"while\":1,values:1,shift:1,telldir:1,getpwuid:1,my:1,getprotobynumber:1,\"delete\":1,and:1,sort:1,uc:1,defined:1,srand:1,accept:1,\"package\":1,seekdir:1,getprotobyname:1,semop:1,our:1,rename:1,seek:1,\"if\":1,q:1,chroot:1,sysread:1,setpwent:1,no:1,crypt:1,getc:1,chown:1,sqrt:1,write:1,setnetent:1,setpriority:1,foreach:1,tie:1,sin:1,msgget:1,map:1,stat:1,getlogin:1,unless:1,elsif:1,truncate:1,exec:1,keys:1,glob:1,tied:1,closedir:1,ioctl:1,socket:1,readlink:1,\"eval\":1,xor:1,readline:1,binmode:1,setservent:1,eof:1,ord:1,bind:1,alarm:1,pipe:1,atan2:1,getgrent:1,exp:1,time:1,push:1,setgrent:1,gt:1,lt:1,or:1,ne:1,m:1};var e={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:c,r:10};var b={cN:\"variable\",b:\"\\\\$\\\\d\"};var a={cN:\"variable\",b:\"[\\\\$\\\\%\\\\@\\\\*](\\\\^\\\\w\\\\b|#\\\\w+(\\\\:\\\\:\\\\w+)*|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+(\\\\:\\\\:\\\\w*)*)\"};var h=[hljs.BE,e,b,a];var g={b:\"->\",c:[{b:hljs.IR},{b:\"{\",e:\"}\"}]};var d={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var f=[b,a,hljs.HCM,d,g,{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",c:h,r:5},{cN:\"string\",b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",c:h,r:5},{cN:\"string\",b:\"qw\\\\s+q\",e:\"q\",c:h,r:5},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE],r:0},{cN:\"string\",b:'\"',e:'\"',c:h,r:0},{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},{cN:\"string\",b:\"{\\\\w+}\",r:0},{cN:\"string\",b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\"+hljs.RSR+\"|split|return|print|reverse|grep)\\\\s*\",k:{split:1,\"return\":1,print:1,reverse:1,grep:1},r:0,c:[hljs.HCM,d,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[hljs.BE],r:0}]},{cN:\"sub\",b:\"\\\\bsub\\\\b\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",k:{sub:1},r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0},{cN:\"pod\",b:\"\\\\=\\\\w\",e:\"\\\\=cut\"}];e.c=f;g.c[1].c=f;return{dM:{k:c,c:f}}}();hljs.LANGUAGES.scala=function(){var a={cN:\"annotation\",b:\"@[A-Za-z]+\"};var b={cN:\"string\",b:'u?r?\"\"\"',e:'\"\"\"',r:10};return{dM:{k:{type:1,yield:1,lazy:1,override:1,def:1,\"with\":1,val:1,\"var\":1,\"false\":1,\"true\":1,sealed:1,\"abstract\":1,\"private\":1,trait:1,object:1,\"null\":1,\"if\":1,\"for\":1,\"while\":1,\"throw\":1,\"finally\":1,\"protected\":1,\"extends\":1,\"import\":1,\"final\":1,\"return\":1,\"else\":1,\"break\":1,\"new\":1,\"catch\":1,\"super\":1,\"class\":1,\"case\":1,\"package\":1,\"default\":1,\"try\":1,\"this\":1,match:1,\"continue\":1,\"throws\":1},c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},hljs.CLCM,hljs.CBLCLM,hljs.ASM,hljs.QSM,b,{cN:\"class\",b:\"((case )?class |object |trait )\",e:\"({|$)\",i:\":\",k:{\"case\":1,\"class\":1,trait:1,object:1},c:[{b:\"(extends|with)\",k:{\"extends\":1,\"with\":1},r:10},{cN:\"title\",b:hljs.UIR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[hljs.ASM,hljs.QSM,b,a]}]},hljs.CNM,a]}}}();hljs.LANGUAGES.cmake={cI:true,dM:{k:{add_custom_command:2,add_custom_target:2,add_definitions:2,add_dependencies:2,add_executable:2,add_library:2,add_subdirectory:2,add_test:2,aux_source_directory:2,\"break\":1,build_command:2,cmake_minimum_required:3,cmake_policy:3,configure_file:1,create_test_sourcelist:1,define_property:1,\"else\":1,elseif:1,enable_language:2,enable_testing:2,endforeach:1,endfunction:1,endif:1,endmacro:1,endwhile:1,execute_process:2,\"export\":1,find_file:1,find_library:2,find_package:2,find_path:1,find_program:1,fltk_wrap_ui:2,foreach:1,\"function\":1,get_cmake_property:3,get_directory_property:1,get_filename_component:1,get_property:1,get_source_file_property:1,get_target_property:1,get_test_property:1,\"if\":1,include:1,include_directories:2,include_external_msproject:1,include_regular_expression:2,install:1,link_directories:1,load_cache:1,load_command:1,macro:1,mark_as_advanced:1,message:1,option:1,output_required_files:1,project:1,qt_wrap_cpp:2,qt_wrap_ui:2,remove_definitions:2,\"return\":1,separate_arguments:1,set:1,set_directory_properties:1,set_property:1,set_source_files_properties:1,set_target_properties:1,set_tests_properties:1,site_name:1,source_group:1,string:1,target_link_libraries:2,try_compile:2,try_run:2,unset:1,variable_watch:2,\"while\":1,build_name:1,exec_program:1,export_library_dependencies:1,install_files:1,install_programs:1,install_targets:1,link_libraries:1,make_directory:1,remove:1,subdir_depends:1,subdirs:1,use_mangled_mesa:1,utility_source:1,variable_requires:1,write_file:1},c:[{cN:\"envvar\",b:\"\\\\${\",e:\"}\"},hljs.HCM,hljs.QSM,hljs.NM]}};hljs.LANGUAGES.objectivec=function(){var a={keyword:{\"false\":1,\"int\":1,\"float\":1,\"while\":1,\"private\":1,\"char\":1,\"catch\":1,\"export\":1,sizeof:2,typedef:2,\"const\":1,struct:1,\"for\":1,union:1,unsigned:1,\"long\":1,\"volatile\":2,\"static\":1,\"protected\":1,bool:1,mutable:1,\"if\":1,\"public\":1,\"do\":1,\"return\":1,\"goto\":1,\"void\":2,\"enum\":1,\"else\":1,\"break\":1,extern:1,\"true\":1,\"class\":1,asm:1,\"case\":1,\"short\":1,\"default\":1,\"double\":1,\"throw\":1,register:1,explicit:1,signed:1,typename:1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,wchar_t:1,inline:1,readonly:1,assign:1,property:1,protocol:10,self:1,\"synchronized\":1,end:1,synthesize:50,id:1,optional:1,required:1,implementation:10,nonatomic:1,\"interface\":1,\"super\":1,unichar:1,\"finally\":2,dynamic:2,nil:1},built_in:{YES:5,NO:5,NULL:1,IBOutlet:50,IBAction:50,NSString:50,NSDictionary:50,CGRect:50,CGPoint:50,NSRange:50,release:1,retain:1,autorelease:50,UIButton:50,UILabel:50,UITextView:50,UIWebView:50,MKMapView:50,UISegmentedControl:50,NSObject:50,UITableViewDelegate:50,UITableViewDataSource:50,NSThread:50,UIActivityIndicator:50,UITabbar:50,UIToolBar:50,UIBarButtonItem:50,UIImageView:50,NSAutoreleasePool:50,UITableView:50,BOOL:1,NSInteger:20,CGFloat:20,NSException:50,NSLog:50,NSMutableString:50,NSMutableArray:50,NSMutableDictionary:50,NSURL:50}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.CNM,hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"interface|class|protocol|implementation\",e:\"({|$)\",k:{\"interface\":1,\"class\":1,protocol:5,implementation:5},c:[{cN:\"id\",b:hljs.UIR}]}]}}}();hljs.LANGUAGES.avrasm={cI:true,dM:{k:{keyword:{adc:1,add:1,adiw:1,and:1,andi:1,asr:1,bclr:1,bld:1,brbc:1,brbs:1,brcc:1,brcs:1,\"break\":1,breq:1,brge:1,brhc:1,brhs:1,brid:1,brie:1,brlo:1,brlt:1,brmi:1,brne:1,brpl:1,brsh:1,brtc:1,brts:1,brvc:1,brvs:1,bset:1,bst:1,call:1,cbi:1,cbr:1,clc:1,clh:1,cli:1,cln:1,clr:1,cls:1,clt:1,clv:1,clz:1,com:1,cp:1,cpc:1,cpi:1,cpse:1,dec:1,eicall:1,eijmp:1,elpm:1,eor:1,fmul:1,fmuls:1,fmulsu:1,icall:1,ijmp:1,\"in\":1,inc:1,jmp:1,ld:1,ldd:1,ldi:1,lds:1,lpm:1,lsl:1,lsr:1,mov:1,movw:1,mul:1,muls:1,mulsu:1,neg:1,nop:1,or:1,ori:1,out:1,pop:1,push:1,rcall:1,ret:1,reti:1,rjmp:1,rol:1,ror:1,sbc:1,sbr:1,sbrc:1,sbrs:1,sec:1,seh:1,sbi:1,sbci:1,sbic:1,sbis:1,sbiw:1,sei:1,sen:1,ser:1,ses:1,set:1,sev:1,sez:1,sleep:1,spm:1,st:1,std:1,sts:1,sub:1,subi:1,swap:1,tst:1,wdr:1},built_in:{r0:1,r1:1,r2:1,r3:1,r4:1,r5:1,r6:1,r7:1,r8:1,r9:1,r10:1,r11:1,r12:1,r13:1,r14:1,r15:1,r16:1,r17:1,r18:1,r19:1,r20:1,r21:1,r22:1,r23:1,r24:1,r25:1,r26:1,r27:1,r28:1,r29:1,r30:1,r31:1,x:1,xh:1,xl:1,y:1,yh:1,yl:1,z:1,zh:1,zl:1,ucsr1c:1,udr1:1,ucsr1a:1,ucsr1b:1,ubrr1l:1,ubrr1h:1,ucsr0c:1,ubrr0h:1,tccr3c:1,tccr3a:1,tccr3b:1,tcnt3h:1,tcnt3l:1,ocr3ah:1,ocr3al:1,ocr3bh:1,ocr3bl:1,ocr3ch:1,ocr3cl:1,icr3h:1,icr3l:1,etimsk:1,etifr:1,tccr1c:1,ocr1ch:1,ocr1cl:1,twcr:1,twdr:1,twar:1,twsr:1,twbr:1,osccal:1,xmcra:1,xmcrb:1,eicra:1,spmcsr:1,spmcr:1,portg:1,ddrg:1,ping:1,portf:1,ddrf:1,sreg:1,sph:1,spl:1,xdiv:1,rampz:1,eicrb:1,eimsk:1,gimsk:1,gicr:1,eifr:1,gifr:1,timsk:1,tifr:1,mcucr:1,mcucsr:1,tccr0:1,tcnt0:1,ocr0:1,assr:1,tccr1a:1,tccr1b:1,tcnt1h:1,tcnt1l:1,ocr1ah:1,ocr1al:1,ocr1bh:1,ocr1bl:1,icr1h:1,icr1l:1,tccr2:1,tcnt2:1,ocr2:1,ocdr:1,wdtcr:1,sfior:1,eearh:1,eearl:1,eedr:1,eecr:1,porta:1,ddra:1,pina:1,portb:1,ddrb:1,pinb:1,portc:1,ddrc:1,pinc:1,portd:1,ddrd:1,pind:1,spdr:1,spsr:1,spcr:1,udr0:1,ucsr0a:1,ucsr0b:1,ubrr0l:1,acsr:1,admux:1,adcsr:1,adch:1,adcl:1,porte:1,ddre:1,pine:1,pinf:1}},c:[hljs.CBLCLM,{cN:\"comment\",b:\";\",e:\"$\"},hljs.CNM,hljs.BNM,{cN:\"number\",b:\"\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)\"},hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"label\",b:\"^[A-Za-z0-9_.$]+:\"},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"preprocessor\",b:\"\\\\.[a-zA-Z]+\"},{cN:\"localvars\",b:\"@[0-9]+\"}]}};hljs.LANGUAGES.vhdl={cI:true,dM:{k:{keyword:{abs:1,access:1,after:1,alias:1,all:1,and:1,architecture:2,array:1,assert:1,attribute:1,begin:1,block:1,body:1,buffer:1,bus:1,\"case\":1,component:2,configuration:1,constant:1,disconnect:2,downto:2,\"else\":1,elsif:1,end:1,entity:2,exit:1,file:1,\"for\":1,\"function\":1,generate:2,generic:2,group:1,guarded:2,\"if\":0,impure:2,\"in\":1,inertial:1,inout:1,is:1,label:1,library:1,linkage:1,literal:1,loop:1,map:1,mod:1,nand:1,\"new\":1,next:1,nor:1,not:1,\"null\":1,of:1,on:1,open:1,or:1,others:1,out:1,\"package\":1,port:2,postponed:1,procedure:1,process:1,pure:2,range:1,record:1,register:1,reject:1,\"return\":1,rol:1,ror:1,select:1,severity:1,signal:1,shared:1,sla:1,sli:1,sra:1,srl:1,subtype:2,then:1,to:1,transport:1,type:1,units:1,until:1,use:1,variable:1,wait:1,when:1,\"while\":1,\"with\":1,xnor:1,xor:1},type:{\"boolean\":1,bit:1,character:1,severity_level:2,integer:1,time:1,delay_length:2,natural:1,positive:1,string:1,bit_vector:2,file_open_kind:2,file_open_status:2,std_ulogic:2,std_ulogic_vector:2,std_logic:2,std_logic_vector:2}},i:\"{\",c:[{cN:\"comment\",b:\"--\",e:\"$\"},hljs.QSM,hljs.CNM,{cN:\"literal\",b:\"'(U|X|0|1|Z|W|L|H|-)\",e:\"'\",c:[hljs.BE]}]}};hljs.LANGUAGES.coffeescript=function(){var d={keyword:{\"in\":1,\"if\":1,\"for\":1,\"while\":1,\"finally\":1,\"new\":1,\"do\":1,\"return\":1,\"else\":1,\"break\":1,\"catch\":1,\"instanceof\":1,\"throw\":1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,\"typeof\":1,\"delete\":1,\"debugger\":1,\"class\":1,\"extends\":1,\"super\":1,then:1,unless:1,until:1,loop:2,of:2,by:1,when:2,and:1,or:1,is:1,isnt:2,not:1},literal:{\"true\":1,\"false\":1,\"null\":1,\"undefined\":1,yes:1,no:1,on:1,off:1},reserved:{\"case\":1,\"default\":1,\"function\":1,\"var\":1,\"void\":1,\"with\":1,\"const\":1,let:1,\"enum\":1,\"export\":1,\"import\":1,\"native\":1,__hasProp:1,__extends:1,__slice:1,__bind:1,__indexOf:1}};var a=\"[A-Za-z$_][0-9A-Za-z$_]*\";var b={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:d,c:[hljs.CNM,hljs.BNM]};var c={cN:\"string\",b:'\"',e:'\"',r:0,c:[hljs.BE,b]};var h={cN:\"string\",b:'\"\"\"',e:'\"\"\"',c:[hljs.BE,b]};var g={cN:\"comment\",b:\"###\",e:\"###\"};var f={cN:\"regexp\",b:\"///\",e:\"///\",c:[hljs.HCM]};var i={cN:\"function\",b:a+\"\\\\s*=\\\\s*(\\\\(.+\\\\))?\\\\s*[-=]>\",rB:true,c:[{cN:\"title\",b:a},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]};var e={cN:\"javascript\",b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"};return{dM:{k:d,c:[hljs.CNM,hljs.BNM,hljs.ASM,h,c,g,hljs.HCM,f,e,i]}}}();hljs.LANGUAGES.nginx=function(){var c={cN:\"variable\",b:\"\\\\$\\\\d+\"};var b={cN:\"variable\",b:\"\\\\${\",e:\"}\"};var a={cN:\"variable\",b:\"[\\\\$\\\\@]\"+hljs.UIR};return{dM:{c:[hljs.HCM,{b:hljs.UIR,e:\";|{\",rE:true,k:{accept_mutex:1,accept_mutex_delay:1,access_log:1,add_after_body:1,add_before_body:1,add_header:1,addition_types:1,alias:1,allow:1,ancient_browser:1,ancient_browser_value:1,auth_basic:1,auth_basic_user_file:1,autoindex:1,autoindex_exact_size:1,autoindex_localtime:1,\"break\":1,charset:1,charset_map:1,charset_types:1,client_body_buffer_size:1,client_body_in_file_only:1,client_body_in_single_buffer:1,client_body_temp_path:1,client_body_timeout:1,client_header_buffer_size:1,client_header_timeout:1,client_max_body_size:1,connection_pool_size:1,connections:1,create_full_put_path:1,daemon:1,dav_access:1,dav_methods:1,debug_connection:1,debug_points:1,default_type:1,deny:1,directio:1,directio_alignment:1,echo:1,echo_after_body:1,echo_before_body:1,echo_blocking_sleep:1,echo_duplicate:1,echo_end:1,echo_exec:1,echo_flush:1,echo_foreach_split:1,echo_location:1,echo_location_async:1,echo_read_request_body:1,echo_request_body:1,echo_reset_timer:1,echo_sleep:1,echo_subrequest:1,echo_subrequest_async:1,empty_gif:1,env:1,error_log:1,error_page:1,events:1,expires:1,fastcgi_bind:1,fastcgi_buffer_size:1,fastcgi_buffers:1,fastcgi_busy_buffers_size:1,fastcgi_cache:1,fastcgi_cache_key:1,fastcgi_cache_methods:1,fastcgi_cache_min_uses:1,fastcgi_cache_path:1,fastcgi_cache_use_stale:1,fastcgi_cache_valid:1,fastcgi_catch_stderr:1,fastcgi_connect_timeout:1,fastcgi_hide_header:1,fastcgi_ignore_client_abort:1,fastcgi_ignore_headers:1,fastcgi_index:1,fastcgi_intercept_errors:1,fastcgi_max_temp_file_size:1,fastcgi_next_upstream:1,fastcgi_param:1,fastcgi_pass:1,fastcgi_pass_header:1,fastcgi_pass_request_body:1,fastcgi_pass_request_headers:1,fastcgi_read_timeout:1,fastcgi_send_lowat:1,fastcgi_send_timeout:1,fastcgi_split_path_info:1,fastcgi_store:1,fastcgi_store_access:1,fastcgi_temp_file_write_size:1,fastcgi_temp_path:1,fastcgi_upstream_fail_timeout:1,fastcgi_upstream_max_fails:1,flv:1,geo:1,geoip_city:1,geoip_country:1,gzip:1,gzip_buffers:1,gzip_comp_level:1,gzip_disable:1,gzip_hash:1,gzip_http_version:1,gzip_min_length:1,gzip_no_buffer:1,gzip_proxied:1,gzip_static:1,gzip_types:1,gzip_vary:1,gzip_window:1,http:1,\"if\":1,if_modified_since:1,ignore_invalid_headers:1,image_filter:1,image_filter_buffer:1,image_filter_jpeg_quality:1,image_filter_transparency:1,include:1,index:1,internal:1,ip_hash:1,js:1,js_load:1,js_require:1,js_utf8:1,keepalive_requests:1,keepalive_timeout:1,kqueue_changes:1,kqueue_events:1,large_client_header_buffers:1,limit_conn:1,limit_conn_log_level:1,limit_except:1,limit_rate:1,limit_rate_after:1,limit_req:1,limit_req_log_level:1,limit_req_zone:1,limit_zone:1,lingering_time:1,lingering_timeout:1,listen:1,location:1,lock_file:1,log_format:1,log_not_found:1,log_subrequest:1,map:1,map_hash_bucket_size:1,map_hash_max_size:1,master_process:1,memcached_bind:1,memcached_buffer_size:1,memcached_connect_timeout:1,memcached_next_upstream:1,memcached_pass:1,memcached_read_timeout:1,memcached_send_timeout:1,memcached_upstream_fail_timeout:1,memcached_upstream_max_fails:1,merge_slashes:1,min_delete_depth:1,modern_browser:1,modern_browser_value:1,more_clear_headers:1,more_clear_input_headers:1,more_set_headers:1,more_set_input_headers:1,msie_padding:1,msie_refresh:1,multi_accept:1,open_file_cache:1,open_file_cache_errors:1,open_file_cache_events:1,open_file_cache_min_uses:1,open_file_cache_retest:1,open_file_cache_valid:1,open_log_file_cache:1,optimize_server_names:1,output_buffers:1,override_charset:1,perl:1,perl_modules:1,perl_require:1,perl_set:1,pid:1,port_in_redirect:1,post_action:1,postpone_gzipping:1,postpone_output:1,proxy_bind:1,proxy_buffer_size:1,proxy_buffering:1,proxy_buffers:1,proxy_busy_buffers_size:1,proxy_cache:1,proxy_cache_key:1,proxy_cache_methods:1,proxy_cache_min_uses:1,proxy_cache_path:1,proxy_cache_use_stale:1,proxy_cache_valid:1,proxy_connect_timeout:1,proxy_headers_hash_bucket_size:1,proxy_headers_hash_max_size:1,proxy_hide_header:1,proxy_ignore_client_abort:1,proxy_ignore_headers:1,proxy_intercept_errors:1,proxy_max_temp_file_size:1,proxy_method:1,proxy_next_upstream:1,proxy_pass:1,proxy_pass_header:1,proxy_pass_request_body:1,proxy_pass_request_headers:1,proxy_read_timeout:1,proxy_redirect:1,proxy_send_lowat:1,proxy_send_timeout:1,proxy_set_body:1,proxy_set_header:1,proxy_store:1,proxy_store_access:1,proxy_temp_file_write_size:1,proxy_temp_path:1,proxy_upstream_fail_timeout:1,proxy_upstream_max_fails:1,push_authorized_channels_only:1,push_channel_group:1,push_max_channel_id_length:1,push_max_channel_subscribers:1,push_max_message_buffer_length:1,push_max_reserved_memory:1,push_message_buffer_length:1,push_message_timeout:1,push_min_message_buffer_length:1,push_min_message_recipients:1,push_publisher:1,push_store_messages:1,push_subscriber:1,push_subscriber_concurrency:1,random_index:1,read_ahead:1,real_ip_header:1,recursive_error_pages:1,request_pool_size:1,reset_timedout_connection:1,resolver:1,resolver_timeout:1,\"return\":1,rewrite:1,rewrite_log:1,root:1,satisfy:1,satisfy_any:1,send_lowat:1,send_timeout:1,sendfile:1,sendfile_max_chunk:1,server:1,server_name:1,server_name_in_redirect:1,server_names_hash_bucket_size:1,server_names_hash_max_size:1,server_tokens:1,set:1,set_real_ip_from:1,source_charset:1,ssi:1,ssi_ignore_recycled_buffers:1,ssi_min_file_chunk:1,ssi_silent_errors:1,ssi_types:1,ssi_value_length:1,ssl:1,ssl_certificate:1,ssl_certificate_key:1,ssl_ciphers:1,ssl_client_certificate:1,ssl_crl:1,ssl_dhparam:1,ssl_prefer_server_ciphers:1,ssl_protocols:1,ssl_session_cache:1,ssl_session_timeout:1,ssl_verify_client:1,ssl_verify_depth:1,sub_filter:1,sub_filter_once:1,sub_filter_types:1,tcp_nodelay:1,tcp_nopush:1,timer_resolution:1,try_files:1,types:1,types_hash_bucket_size:1,types_hash_max_size:1,underscores_in_headers:1,uninitialized_variable_warn:1,upstream:1,use:1,user:1,userid:1,userid_domain:1,userid_expires:1,userid_mark:1,userid_name:1,userid_p3p:1,userid_path:1,userid_service:1,valid_referers:1,variables_hash_bucket_size:1,variables_hash_max_size:1,worker_connections:1,worker_cpu_affinity:1,worker_priority:1,worker_processes:1,worker_rlimit_core:1,worker_rlimit_nofile:1,worker_rlimit_sigpending:1,working_directory:1,xml_entities:1,xslt_stylesheet:1,xslt_types:1},r:0,c:[hljs.HCM,{b:\"\\\\s\",e:\"[;{]\",rB:true,rE:true,l:\"[a-z/]+\",k:{built_in:{on:1,off:1,yes:1,no:1,\"true\":1,\"false\":1,none:1,blocked:1,debug:1,info:1,notice:1,warn:1,error:1,crit:1,select:1,permanent:1,redirect:1,kqueue:1,rtsig:1,epoll:1,poll:1,\"/dev/poll\":1}},r:0,c:[hljs.HCM,{cN:\"string\",b:'\"',e:'\"',c:[hljs.BE,c,b,a],r:0},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,c,b,a],r:0},{cN:\"string\",b:\"([a-z]+):/\",e:\"[;\\\\s]\",rE:true},{cN:\"regexp\",b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true,c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true,c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"\\\\*(\\\\.[a-z\\\\-]+)+\",c:[hljs.BE,c,b,a]},{cN:\"regexp\",b:\"([a-z\\\\-]+\\\\.)+\\\\*\",c:[hljs.BE,c,b,a]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\b\"},{cN:\"number\",b:\"\\\\s\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},c,b,a]}]}]}}}();hljs.LANGUAGES.erlang_repl={dM:{k:{special_functions:{spawn:10,spawn_link:10,self:2},reserved:{after:1,and:1,andalso:5,band:1,begin:1,bnot:1,bor:1,bsl:1,bsr:1,bxor:1,\"case\":1,\"catch\":0,cond:1,div:1,end:1,fun:0,\"if\":0,let:1,not:0,of:1,or:1,orelse:5,query:1,receive:0,rem:1,\"try\":0,when:1,xor:1}},c:[{cN:\"input_number\",b:\"^[0-9]+> \",r:10},{cN:\"comment\",b:\"%\",e:\"$\"},{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0},hljs.ASM,hljs.QSM,{cN:\"constant\",b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{cN:\"arrow\",b:\"->\"},{cN:\"ok\",b:\"ok\"},{cN:\"exclamation_mark\",b:\"!\"},{cN:\"function_or_atom\",b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",r:0},{cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_']*\",r:0}]}};hljs.LANGUAGES.django=function(){function c(f,e){return(e==undefined||(!f.cN&&e.cN==\"tag\")||f.cN==\"value\")}function d(j,e){var h={};for(var g in j){if(g!=\"contains\"){h[g]=j[g]}var k=[];for(var f=0;j.c&&f<j.c.length;f++){k.push(d(j.c[f],j))}if(c(j,e)){k=b.concat(k)}if(k.length){h.c=k}}return h}var a={cN:\"filter\",b:\"\\\\|[A-Za-z]+\\\\:?\",eE:true,k:{truncatewords:1,removetags:1,linebreaksbr:1,yesno:1,get_digit:1,timesince:1,random:1,striptags:1,filesizeformat:1,escape:1,linebreaks:1,length_is:1,ljust:1,rjust:1,cut:1,urlize:1,fix_ampersands:1,title:1,floatformat:1,capfirst:1,pprint:1,divisibleby:1,add:1,make_list:1,unordered_list:1,urlencode:1,timeuntil:1,urlizetrunc:1,wordcount:1,stringformat:1,linenumbers:1,slice:1,date:1,dictsort:1,dictsortreversed:1,default_if_none:1,pluralize:1,lower:1,join:1,center:1,\"default\":1,truncatewords_html:1,upper:1,length:1,phone2numeric:1,wordwrap:1,time:1,addslashes:1,slugify:1,first:1},c:[{cN:\"argument\",b:'\"',e:'\"'}]};var b=[{cN:\"template_comment\",b:\"{%\\\\s*comment\\\\s*%}\",e:\"{%\\\\s*endcomment\\\\s*%}\"},{cN:\"template_comment\",b:\"{#\",e:\"#}\"},{cN:\"template_tag\",b:\"{%\",e:\"%}\",k:{comment:1,endcomment:1,load:1,templatetag:1,ifchanged:1,endifchanged:1,\"if\":1,endif:1,firstof:1,\"for\":1,endfor:1,\"in\":1,ifnotequal:1,endifnotequal:1,widthratio:1,\"extends\":1,include:1,spaceless:1,endspaceless:1,regroup:1,by:1,as:1,ifequal:1,endifequal:1,ssi:1,now:1,\"with\":1,cycle:1,url:1,filter:1,endfilter:1,debug:1,block:1,endblock:1,\"else\":1},c:[a]},{cN:\"variable\",b:\"{{\",e:\"}}\",c:[a]}];return{cI:true,dM:d(hljs.LANGUAGES.xml.dM)}}();hljs.LANGUAGES.delphi=function(){var a={and:1,safecall:1,cdecl:1,then:1,string:1,exports:1,library:1,not:1,pascal:1,set:1,virtual:1,file:1,\"in\":1,array:1,label:1,packed:1,\"end.\":1,index:1,\"while\":1,\"const\":1,raise:1,\"for\":1,to:1,implementation:1,\"with\":1,except:1,overload:1,destructor:1,downto:1,\"finally\":1,program:1,exit:1,unit:1,inherited:1,override:1,\"if\":1,type:1,until:1,\"function\":1,\"do\":1,begin:1,repeat:1,\"goto\":1,nil:1,far:1,initialization:1,object:1,\"else\":1,\"var\":1,uses:1,external:1,resourcestring:1,\"interface\":1,end:1,finalization:1,\"class\":1,asm:1,mod:1,\"case\":1,on:1,shr:1,shl:1,of:1,register:1,xorwrite:1,threadvar:1,\"try\":1,record:1,near:1,stored:1,constructor:1,stdcall:1,inline:1,div:1,out:1,or:1,procedure:1};var c={safecall:1,stdcall:1,pascal:1,stored:1,\"const\":1,implementation:1,finalization:1,except:1,to:1,\"finally\":1,program:1,inherited:1,override:1,then:1,exports:1,string:1,read:1,not:1,mod:1,shr:1,\"try\":1,div:1,shl:1,set:1,library:1,message:1,packed:1,index:1,\"for\":1,near:1,overload:1,label:1,downto:1,exit:1,\"public\":1,\"goto\":1,\"interface\":1,asm:1,on:1,of:1,constructor:1,or:1,\"private\":1,array:1,unit:1,raise:1,destructor:1,\"var\":1,type:1,until:1,\"function\":1,\"else\":1,external:1,\"with\":1,\"case\":1,\"default\":1,record:1,\"while\":1,\"protected\":1,property:1,procedure:1,published:1,and:1,cdecl:1,\"do\":1,threadvar:1,file:1,\"in\":1,\"if\":1,end:1,virtual:1,write:1,far:1,out:1,begin:1,repeat:1,nil:1,initialization:1,object:1,uses:1,resourcestring:1,\"class\":1,register:1,xorwrite:1,inline:1,\"static\":1};var f={cN:\"comment\",b:\"{\",e:\"}\",r:0};var e={cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",r:10};var d={cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}],r:0};var b={cN:\"string\",b:\"(#\\\\d+)+\"};var g={cN:\"function\",b:\"(procedure|constructor|destructor|function)\\\\b\",e:\"[:;]\",k:{\"function\":1,constructor:10,destructor:10,procedure:10},c:[{cN:\"title\",b:hljs.IR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:a,c:[d,b]},f,e]};return{cI:true,dM:{k:a,i:'(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',c:[f,e,hljs.CLCM,d,b,hljs.NM,g,{cN:\"class\",b:\"=\\\\bclass\\\\b\",e:\"end;\",k:c,c:[d,b,f,e,hljs.CLCM,g]}]}}}();hljs.LANGUAGES.vbscript={cI:true,dM:{k:{keyword:{call:1,\"class\":1,\"const\":1,dim:1,\"do\":1,loop:1,erase:1,execute:1,executeglobal:1,exit:1,\"for\":1,each:1,next:1,\"function\":1,\"if\":1,then:1,\"else\":1,on:1,error:1,option:1,explicit:1,\"new\":1,\"private\":1,property:1,let:1,get:1,\"public\":1,randomize:1,redim:1,rem:1,select:1,\"case\":1,set:1,stop:1,sub:1,\"while\":1,wend:1,\"with\":1,end:1,to:1,elseif:1,is:1,or:1,xor:1,and:1,not:1,class_initialize:1,class_terminate:1,\"default\":1,preserve:1,\"in\":1,me:1,byval:1,byref:1,step:1,resume:1,\"goto\":1},built_in:{lcase:1,month:1,vartype:1,instrrev:1,ubound:1,setlocale:1,getobject:1,rgb:1,getref:1,string:1,weekdayname:1,rnd:1,dateadd:1,monthname:1,now:1,day:1,minute:1,isarray:1,cbool:1,round:1,formatcurrency:1,conversions:1,csng:1,timevalue:1,second:1,year:1,space:1,abs:1,clng:1,timeserial:1,fixs:1,len:1,asc:1,isempty:1,maths:1,dateserial:1,atn:1,timer:1,isobject:1,filter:1,weekday:1,datevalue:1,ccur:1,isdate:1,instr:1,datediff:1,formatdatetime:1,replace:1,isnull:1,right:1,sgn:1,array:1,snumeric:1,log:1,cdbl:1,hex:1,chr:1,lbound:1,msgbox:1,ucase:1,getlocale:1,cos:1,cdate:1,cbyte:1,rtrim:1,join:1,hour:1,oct:1,typename:1,trim:1,strcomp:1,\"int\":1,createobject:1,loadpicture:1,tan:1,formatnumber:1,mid:1,scriptenginebuildversion:1,scriptengine:1,split:1,scriptengineminorversion:1,cint:1,sin:1,datepart:1,ltrim:1,sqr:1,scriptenginemajorversion:1,time:1,derived:1,\"eval\":1,date:1,formatpercent:1,exp:1,inputbox:1,left:1,ascw:1,chrw:1,regexp:1,server:1,response:1,request:1,cstr:1,err:1},literal:{\"true\":1,\"false\":1,\"null\":1,nothing:1,empty:1}},i:\"//\",c:[{cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[{b:'\"\"'}],r:0},{cN:\"comment\",b:\"'\",e:\"$\"},hljs.CNM]}};hljs.LANGUAGES.mel={dM:{k:{\"int\":1,\"float\":1,string:1,vector:1,matrix:1,\"if\":1,\"else\":1,\"switch\":1,\"case\":1,\"default\":1,\"while\":1,\"do\":1,\"for\":1,\"in\":1,\"break\":1,\"continue\":1,global:1,proc:1,\"return\":1,about:1,abs:1,addAttr:1,addAttributeEditorNodeHelp:1,addDynamic:1,addNewShelfTab:1,addPP:1,addPanelCategory:1,addPrefixToName:1,advanceToNextDrivenKey:1,affectedNet:1,affects:1,aimConstraint:1,air:1,alias:1,aliasAttr:1,align:1,alignCtx:1,alignCurve:1,alignSurface:1,allViewFit:1,ambientLight:1,angle:1,angleBetween:1,animCone:1,animCurveEditor:1,animDisplay:1,animView:1,annotate:1,appendStringArray:1,applicationName:1,applyAttrPreset:1,applyTake:1,arcLenDimContext:1,arcLengthDimension:1,arclen:1,arrayMapper:1,art3dPaintCtx:1,artAttrCtx:1,artAttrPaintVertexCtx:1,artAttrSkinPaintCtx:1,artAttrTool:1,artBuildPaintMenu:1,artFluidAttrCtx:1,artPuttyCtx:1,artSelectCtx:1,artSetPaintCtx:1,artUserPaintCtx:1,assignCommand:1,assignInputDevice:1,assignViewportFactories:1,attachCurve:1,attachDeviceAttr:1,attachSurface:1,attrColorSliderGrp:1,attrCompatibility:1,attrControlGrp:1,attrEnumOptionMenu:1,attrEnumOptionMenuGrp:1,attrFieldGrp:1,attrFieldSliderGrp:1,attrNavigationControlGrp:1,attrPresetEditWin:1,attributeExists:1,attributeInfo:1,attributeMenu:1,attributeQuery:1,autoKeyframe:1,autoPlace:1,bakeClip:1,bakeFluidShading:1,bakePartialHistory:1,bakeResults:1,bakeSimulation:1,basename:1,basenameEx:1,batchRender:1,bessel:1,bevel:1,bevelPlus:1,binMembership:1,bindSkin:1,blend2:1,blendShape:1,blendShapeEditor:1,blendShapePanel:1,blendTwoAttr:1,blindDataType:1,boneLattice:1,boundary:1,boxDollyCtx:1,boxZoomCtx:1,bufferCurve:1,buildBookmarkMenu:1,buildKeyframeMenu:1,button:1,buttonManip:1,CBG:1,cacheFile:1,cacheFileCombine:1,cacheFileMerge:1,cacheFileTrack:1,camera:1,cameraView:1,canCreateManip:1,canvas:1,capitalizeString:1,\"catch\":1,catchQuiet:1,ceil:1,changeSubdivComponentDisplayLevel:1,changeSubdivRegion:1,channelBox:1,character:1,characterMap:1,characterOutlineEditor:1,characterize:1,chdir:1,checkBox:1,checkBoxGrp:1,checkDefaultRenderGlobals:1,choice:1,circle:1,circularFillet:1,clamp:1,clear:1,clearCache:1,clip:1,clipEditor:1,clipEditorCurrentTimeCtx:1,clipSchedule:1,clipSchedulerOutliner:1,clipTrimBefore:1,closeCurve:1,closeSurface:1,cluster:1,cmdFileOutput:1,cmdScrollFieldExecuter:1,cmdScrollFieldReporter:1,cmdShell:1,coarsenSubdivSelectionList:1,collision:1,color:1,colorAtPoint:1,colorEditor:1,colorIndex:1,colorIndexSliderGrp:1,colorSliderButtonGrp:1,colorSliderGrp:1,columnLayout:1,commandEcho:1,commandLine:1,commandPort:1,compactHairSystem:1,componentEditor:1,compositingInterop:1,computePolysetVolume:1,condition:1,cone:1,confirmDialog:1,connectAttr:1,connectControl:1,connectDynamic:1,connectJoint:1,connectionInfo:1,constrain:1,constrainValue:1,constructionHistory:1,container:1,containsMultibyte:1,contextInfo:1,control:1,convertFromOldLayers:1,convertIffToPsd:1,convertLightmap:1,convertSolidTx:1,convertTessellation:1,convertUnit:1,copyArray:1,copyFlexor:1,copyKey:1,copySkinWeights:1,cos:1,cpButton:1,cpCache:1,cpClothSet:1,cpCollision:1,cpConstraint:1,cpConvClothToMesh:1,cpForces:1,cpGetSolverAttr:1,cpPanel:1,cpProperty:1,cpRigidCollisionFilter:1,cpSeam:1,cpSetEdit:1,cpSetSolverAttr:1,cpSolver:1,cpSolverTypes:1,cpTool:1,cpUpdateClothUVs:1,createDisplayLayer:1,createDrawCtx:1,createEditor:1,createLayeredPsdFile:1,createMotionField:1,createNewShelf:1,createNode:1,createRenderLayer:1,createSubdivRegion:1,cross:1,crossProduct:1,ctxAbort:1,ctxCompletion:1,ctxEditMode:1,ctxTraverse:1,currentCtx:1,currentTime:1,currentTimeCtx:1,currentUnit:1,currentUnit:1,curve:1,curveAddPtCtx:1,curveCVCtx:1,curveEPCtx:1,curveEditorCtx:1,curveIntersect:1,curveMoveEPCtx:1,curveOnSurface:1,curveSketchCtx:1,cutKey:1,cycleCheck:1,cylinder:1,dagPose:1,date:1,defaultLightListCheckBox:1,defaultNavigation:1,defineDataServer:1,defineVirtualDevice:1,deformer:1,deg_to_rad:1,\"delete\":1,deleteAttr:1,deleteShadingGroupsAndMaterials:1,deleteShelfTab:1,deleteUI:1,deleteUnusedBrushes:1,delrandstr:1,detachCurve:1,detachDeviceAttr:1,detachSurface:1,deviceEditor:1,devicePanel:1,dgInfo:1,dgdirty:1,dgeval:1,dgtimer:1,dimWhen:1,directKeyCtx:1,directionalLight:1,dirmap:1,dirname:1,disable:1,disconnectAttr:1,disconnectJoint:1,diskCache:1,displacementToPoly:1,displayAffected:1,displayColor:1,displayCull:1,displayLevelOfDetail:1,displayPref:1,displayRGBColor:1,displaySmoothness:1,displayStats:1,displayString:1,displaySurface:1,distanceDimContext:1,distanceDimension:1,doBlur:1,dolly:1,dollyCtx:1,dopeSheetEditor:1,dot:1,dotProduct:1,doubleProfileBirailSurface:1,drag:1,dragAttrContext:1,draggerContext:1,dropoffLocator:1,duplicate:1,duplicateCurve:1,duplicateSurface:1,dynCache:1,dynControl:1,dynExport:1,dynExpression:1,dynGlobals:1,dynPaintEditor:1,dynParticleCtx:1,dynPref:1,dynRelEdPanel:1,dynRelEditor:1,dynamicLoad:1,editAttrLimits:1,editDisplayLayerGlobals:1,editDisplayLayerMembers:1,editRenderLayerAdjustment:1,editRenderLayerGlobals:1,editRenderLayerMembers:1,editor:1,editorTemplate:1,effector:1,emit:1,emitter:1,enableDevice:1,encodeString:1,endString:1,endsWith:1,env:1,equivalent:1,equivalentTol:1,erf:1,error:1,\"eval\":1,\"eval\":1,evalDeferred:1,evalEcho:1,event:1,exactWorldBoundingBox:1,exclusiveLightCheckBox:1,exec:1,executeForEachObject:1,exists:1,exp:1,expression:1,expressionEditorListen:1,extendCurve:1,extendSurface:1,extrude:1,fcheck:1,fclose:1,feof:1,fflush:1,fgetline:1,fgetword:1,file:1,fileBrowserDialog:1,fileDialog:1,fileExtension:1,fileInfo:1,filetest:1,filletCurve:1,filter:1,filterCurve:1,filterExpand:1,filterStudioImport:1,findAllIntersections:1,findAnimCurves:1,findKeyframe:1,findMenuItem:1,findRelatedSkinCluster:1,finder:1,firstParentOf:1,fitBspline:1,flexor:1,floatEq:1,floatField:1,floatFieldGrp:1,floatScrollBar:1,floatSlider:1,floatSlider2:1,floatSliderButtonGrp:1,floatSliderGrp:1,floor:1,flow:1,fluidCacheInfo:1,fluidEmitter:1,fluidVoxelInfo:1,flushUndo:1,fmod:1,fontDialog:1,fopen:1,formLayout:1,format:1,fprint:1,frameLayout:1,fread:1,freeFormFillet:1,frewind:1,fromNativePath:1,fwrite:1,gamma:1,gauss:1,geometryConstraint:1,getApplicationVersionAsFloat:1,getAttr:1,getClassification:1,getDefaultBrush:1,getFileList:1,getFluidAttr:1,getInputDeviceRange:1,getMayaPanelTypes:1,getModifiers:1,getPanel:1,getParticleAttr:1,getPluginResource:1,getenv:1,getpid:1,glRender:1,glRenderEditor:1,globalStitch:1,gmatch:1,goal:1,gotoBindPose:1,grabColor:1,gradientControl:1,gradientControlNoAttr:1,graphDollyCtx:1,graphSelectContext:1,graphTrackCtx:1,gravity:1,grid:1,gridLayout:1,group:1,groupObjectsByName:1,HfAddAttractorToAS:1,HfAssignAS:1,HfBuildEqualMap:1,HfBuildFurFiles:1,HfBuildFurImages:1,HfCancelAFR:1,HfConnectASToHF:1,HfCreateAttractor:1,HfDeleteAS:1,HfEditAS:1,HfPerformCreateAS:1,HfRemoveAttractorFromAS:1,HfSelectAttached:1,HfSelectAttractors:1,HfUnAssignAS:1,hardenPointCurve:1,hardware:1,hardwareRenderPanel:1,headsUpDisplay:1,headsUpMessage:1,help:1,helpLine:1,hermite:1,hide:1,hilite:1,hitTest:1,hotBox:1,hotkey:1,hotkeyCheck:1,hsv_to_rgb:1,hudButton:1,hudSlider:1,hudSliderButton:1,hwReflectionMap:1,hwRender:1,hwRenderLoad:1,hyperGraph:1,hyperPanel:1,hyperShade:1,hypot:1,iconTextButton:1,iconTextCheckBox:1,iconTextRadioButton:1,iconTextRadioCollection:1,iconTextScrollList:1,iconTextStaticLabel:1,ikHandle:1,ikHandleCtx:1,ikHandleDisplayScale:1,ikSolver:1,ikSplineHandleCtx:1,ikSystem:1,ikSystemInfo:1,ikfkDisplayMethod:1,illustratorCurves:1,image:1,imfPlugins:1,inheritTransform:1,insertJoint:1,insertJointCtx:1,insertKeyCtx:1,insertKnotCurve:1,insertKnotSurface:1,instance:1,instanceable:1,instancer:1,intField:1,intFieldGrp:1,intScrollBar:1,intSlider:1,intSliderGrp:1,interToUI:1,internalVar:1,intersect:1,iprEngine:1,isAnimCurve:1,isConnected:1,isDirty:1,isParentOf:1,isSameObject:1,isTrue:1,isValidObjectName:1,isValidString:1,isValidUiName:1,isolateSelect:1,itemFilter:1,itemFilterAttr:1,itemFilterRender:1,itemFilterType:1,joint:1,jointCluster:1,jointCtx:1,jointDisplayScale:1,jointLattice:1,keyTangent:1,keyframe:1,keyframeOutliner:1,keyframeRegionCurrentTimeCtx:1,keyframeRegionDirectKeyCtx:1,keyframeRegionDollyCtx:1,keyframeRegionInsertKeyCtx:1,keyframeRegionMoveKeyCtx:1,keyframeRegionScaleKeyCtx:1,keyframeRegionSelectKeyCtx:1,keyframeRegionSetKeyCtx:1,keyframeRegionTrackCtx:1,keyframeStats:1,lassoContext:1,lattice:1,latticeDeformKeyCtx:1,launch:1,launchImageEditor:1,layerButton:1,layeredShaderPort:1,layeredTexturePort:1,layout:1,layoutDialog:1,lightList:1,lightListEditor:1,lightListPanel:1,lightlink:1,lineIntersection:1,linearPrecision:1,linstep:1,listAnimatable:1,listAttr:1,listCameras:1,listConnections:1,listDeviceAttachments:1,listHistory:1,listInputDeviceAxes:1,listInputDeviceButtons:1,listInputDevices:1,listMenuAnnotation:1,listNodeTypes:1,listPanelCategories:1,listRelatives:1,listSets:1,listTransforms:1,listUnselected:1,listerEditor:1,loadFluid:1,loadNewShelf:1,loadPlugin:1,loadPluginLanguageResources:1,loadPrefObjects:1,localizedPanelLabel:1,lockNode:1,loft:1,log:1,longNameOf:1,lookThru:1,ls:1,lsThroughFilter:1,lsType:1,lsUI:1,Mayatomr:1,mag:1,makeIdentity:1,makeLive:1,makePaintable:1,makeRoll:1,makeSingleSurface:1,makeTubeOn:1,makebot:1,manipMoveContext:1,manipMoveLimitsCtx:1,manipOptions:1,manipRotateContext:1,manipRotateLimitsCtx:1,manipScaleContext:1,manipScaleLimitsCtx:1,marker:1,match:1,max:1,memory:1,menu:1,menuBarLayout:1,menuEditor:1,menuItem:1,menuItemToShelf:1,menuSet:1,menuSetPref:1,messageLine:1,min:1,minimizeApp:1,mirrorJoint:1,modelCurrentTimeCtx:1,modelEditor:1,modelPanel:1,mouse:1,movIn:1,movOut:1,move:1,moveIKtoFK:1,moveKeyCtx:1,moveVertexAlongDirection:1,multiProfileBirailSurface:1,mute:1,nParticle:1,nameCommand:1,nameField:1,namespace:1,namespaceInfo:1,newPanelItems:1,newton:1,nodeCast:1,nodeIconButton:1,nodeOutliner:1,nodePreset:1,nodeType:1,noise:1,nonLinear:1,normalConstraint:1,normalize:1,nurbsBoolean:1,nurbsCopyUVSet:1,nurbsCube:1,nurbsEditUV:1,nurbsPlane:1,nurbsSelect:1,nurbsSquare:1,nurbsToPoly:1,nurbsToPolygonsPref:1,nurbsToSubdiv:1,nurbsToSubdivPref:1,nurbsUVSet:1,nurbsViewDirectionVector:1,objExists:1,objectCenter:1,objectLayer:1,objectType:1,objectTypeUI:1,obsoleteProc:1,oceanNurbsPreviewPlane:1,offsetCurve:1,offsetCurveOnSurface:1,offsetSurface:1,openGLExtension:1,openMayaPref:1,optionMenu:1,optionMenuGrp:1,optionVar:1,orbit:1,orbitCtx:1,orientConstraint:1,outlinerEditor:1,outlinerPanel:1,overrideModifier:1,paintEffectsDisplay:1,pairBlend:1,palettePort:1,paneLayout:1,panel:1,panelConfiguration:1,panelHistory:1,paramDimContext:1,paramDimension:1,paramLocator:1,parent:1,parentConstraint:1,particle:1,particleExists:1,particleInstancer:1,particleRenderInfo:1,partition:1,pasteKey:1,pathAnimation:1,pause:1,pclose:1,percent:1,performanceOptions:1,pfxstrokes:1,pickWalk:1,picture:1,pixelMove:1,planarSrf:1,plane:1,play:1,playbackOptions:1,playblast:1,plugAttr:1,plugNode:1,pluginInfo:1,pluginResourceUtil:1,pointConstraint:1,pointCurveConstraint:1,pointLight:1,pointMatrixMult:1,pointOnCurve:1,pointOnSurface:1,pointPosition:1,poleVectorConstraint:1,polyAppend:1,polyAppendFacetCtx:1,polyAppendVertex:1,polyAutoProjection:1,polyAverageNormal:1,polyAverageVertex:1,polyBevel:1,polyBlendColor:1,polyBlindData:1,polyBoolOp:1,polyBridgeEdge:1,polyCacheMonitor:1,polyCheck:1,polyChipOff:1,polyClipboard:1,polyCloseBorder:1,polyCollapseEdge:1,polyCollapseFacet:1,polyColorBlindData:1,polyColorDel:1,polyColorPerVertex:1,polyColorSet:1,polyCompare:1,polyCone:1,polyCopyUV:1,polyCrease:1,polyCreaseCtx:1,polyCreateFacet:1,polyCreateFacetCtx:1,polyCube:1,polyCut:1,polyCutCtx:1,polyCylinder:1,polyCylindricalProjection:1,polyDelEdge:1,polyDelFacet:1,polyDelVertex:1,polyDuplicateAndConnect:1,polyDuplicateEdge:1,polyEditUV:1,polyEditUVShell:1,polyEvaluate:1,polyExtrudeEdge:1,polyExtrudeFacet:1,polyExtrudeVertex:1,polyFlipEdge:1,polyFlipUV:1,polyForceUV:1,polyGeoSampler:1,polyHelix:1,polyInfo:1,polyInstallAction:1,polyLayoutUV:1,polyListComponentConversion:1,polyMapCut:1,polyMapDel:1,polyMapSew:1,polyMapSewMove:1,polyMergeEdge:1,polyMergeEdgeCtx:1,polyMergeFacet:1,polyMergeFacetCtx:1,polyMergeUV:1,polyMergeVertex:1,polyMirrorFace:1,polyMoveEdge:1,polyMoveFacet:1,polyMoveFacetUV:1,polyMoveUV:1,polyMoveVertex:1,polyNormal:1,polyNormalPerVertex:1,polyNormalizeUV:1,polyOptUvs:1,polyOptions:1,polyOutput:1,polyPipe:1,polyPlanarProjection:1,polyPlane:1,polyPlatonicSolid:1,polyPoke:1,polyPrimitive:1,polyPrism:1,polyProjection:1,polyPyramid:1,polyQuad:1,polyQueryBlindData:1,polyReduce:1,polySelect:1,polySelectConstraint:1,polySelectConstraintMonitor:1,polySelectCtx:1,polySelectEditCtx:1,polySeparate:1,polySetToFaceNormal:1,polySewEdge:1,polyShortestPathCtx:1,polySmooth:1,polySoftEdge:1,polySphere:1,polySphericalProjection:1,polySplit:1,polySplitCtx:1,polySplitEdge:1,polySplitRing:1,polySplitVertex:1,polyStraightenUVBorder:1,polySubdivideEdge:1,polySubdivideFacet:1,polyToSubdiv:1,polyTorus:1,polyTransfer:1,polyTriangulate:1,polyUVSet:1,polyUnite:1,polyWedgeFace:1,popen:1,popupMenu:1,pose:1,pow:1,preloadRefEd:1,print:1,progressBar:1,progressWindow:1,projFileViewer:1,projectCurve:1,projectTangent:1,projectionContext:1,projectionManip:1,promptDialog:1,propModCtx:1,propMove:1,psdChannelOutliner:1,psdEditTextureFile:1,psdExport:1,psdTextureFile:1,putenv:1,pwd:1,python:1,querySubdiv:1,quit:1,rad_to_deg:1,radial:1,radioButton:1,radioButtonGrp:1,radioCollection:1,radioMenuItemCollection:1,rampColorPort:1,rand:1,randomizeFollicles:1,randstate:1,rangeControl:1,readTake:1,rebuildCurve:1,rebuildSurface:1,recordAttr:1,recordDevice:1,redo:1,reference:1,referenceEdit:1,referenceQuery:1,refineSubdivSelectionList:1,refresh:1,refreshAE:1,registerPluginResource:1,rehash:1,reloadImage:1,removeJoint:1,removeMultiInstance:1,removePanelCategory:1,rename:1,renameAttr:1,renameSelectionList:1,renameUI:1,render:1,renderGlobalsNode:1,renderInfo:1,renderLayerButton:1,renderLayerParent:1,renderLayerPostProcess:1,renderLayerUnparent:1,renderManip:1,renderPartition:1,renderQualityNode:1,renderSettings:1,renderThumbnailUpdate:1,renderWindowEditor:1,renderWindowSelectContext:1,renderer:1,reorder:1,reorderDeformers:1,requires:1,reroot:1,resampleFluid:1,resetAE:1,resetPfxToPolyCamera:1,resetTool:1,resolutionNode:1,retarget:1,reverseCurve:1,reverseSurface:1,revolve:1,rgb_to_hsv:1,rigidBody:1,rigidSolver:1,roll:1,rollCtx:1,rootOf:1,rot:1,rotate:1,rotationInterpolation:1,roundConstantRadius:1,rowColumnLayout:1,rowLayout:1,runTimeCommand:1,runup:1,sampleImage:1,saveAllShelves:1,saveAttrPreset:1,saveFluid:1,saveImage:1,saveInitialState:1,saveMenu:1,savePrefObjects:1,savePrefs:1,saveShelf:1,saveToolSettings:1,scale:1,scaleBrushBrightness:1,scaleComponents:1,scaleConstraint:1,scaleKey:1,scaleKeyCtx:1,sceneEditor:1,sceneUIReplacement:1,scmh:1,scriptCtx:1,scriptEditorInfo:1,scriptJob:1,scriptNode:1,scriptTable:1,scriptToShelf:1,scriptedPanel:1,scriptedPanelType:1,scrollField:1,scrollLayout:1,sculpt:1,searchPathArray:1,seed:1,selLoadSettings:1,select:1,selectContext:1,selectCurveCV:1,selectKey:1,selectKeyCtx:1,selectKeyframeRegionCtx:1,selectMode:1,selectPref:1,selectPriority:1,selectType:1,selectedNodes:1,selectionConnection:1,separator:1,setAttr:1,setAttrEnumResource:1,setAttrMapping:1,setAttrNiceNameResource:1,setConstraintRestPosition:1,setDefaultShadingGroup:1,setDrivenKeyframe:1,setDynamic:1,setEditCtx:1,setEditor:1,setFluidAttr:1,setFocus:1,setInfinity:1,setInputDeviceMapping:1,setKeyCtx:1,setKeyPath:1,setKeyframe:1,setKeyframeBlendshapeTargetWts:1,setMenuMode:1,setNodeNiceNameResource:1,setNodeTypeFlag:1,setParent:1,setParticleAttr:1,setPfxToPolyCamera:1,setPluginResource:1,setProject:1,setStampDensity:1,setStartupMessage:1,setState:1,setToolTo:1,setUITemplate:1,setXformManip:1,sets:1,shadingConnection:1,shadingGeometryRelCtx:1,shadingLightRelCtx:1,shadingNetworkCompare:1,shadingNode:1,shapeCompare:1,shelfButton:1,shelfLayout:1,shelfTabLayout:1,shellField:1,shortNameOf:1,showHelp:1,showHidden:1,showManipCtx:1,showSelectionInTitle:1,showShadingGroupAttrEditor:1,showWindow:1,sign:1,simplify:1,sin:1,singleProfileBirailSurface:1,size:1,sizeBytes:1,skinCluster:1,skinPercent:1,smoothCurve:1,smoothTangentSurface:1,smoothstep:1,snap2to2:1,snapKey:1,snapMode:1,snapTogetherCtx:1,snapshot:1,soft:1,softMod:1,softModCtx:1,sort:1,sound:1,soundControl:1,source:1,spaceLocator:1,sphere:1,sphrand:1,spotLight:1,spotLightPreviewPort:1,spreadSheetEditor:1,spring:1,sqrt:1,squareSurface:1,srtContext:1,stackTrace:1,startString:1,startsWith:1,stitchAndExplodeShell:1,stitchSurface:1,stitchSurfacePoints:1,strcmp:1,stringArrayCatenate:1,stringArrayContains:1,stringArrayCount:1,stringArrayInsertAtIndex:1,stringArrayIntersector:1,stringArrayRemove:1,stringArrayRemoveAtIndex:1,stringArrayRemoveDuplicates:1,stringArrayRemoveExact:1,stringArrayToString:1,stringToStringArray:1,strip:1,stripPrefixFromName:1,stroke:1,subdAutoProjection:1,subdCleanTopology:1,subdCollapse:1,subdDuplicateAndConnect:1,subdEditUV:1,subdListComponentConversion:1,subdMapCut:1,subdMapSewMove:1,subdMatchTopology:1,subdMirror:1,subdToBlind:1,subdToPoly:1,subdTransferUVsToCache:1,subdiv:1,subdivCrease:1,subdivDisplaySmoothness:1,substitute:1,substituteAllString:1,substituteGeometry:1,substring:1,surface:1,surfaceSampler:1,surfaceShaderList:1,swatchDisplayPort:1,switchTable:1,symbolButton:1,symbolCheckBox:1,sysFile:1,system:1,tabLayout:1,tan:1,tangentConstraint:1,texLatticeDeformContext:1,texManipContext:1,texMoveContext:1,texMoveUVShellContext:1,texRotateContext:1,texScaleContext:1,texSelectContext:1,texSelectShortestPathCtx:1,texSmudgeUVContext:1,texWinToolCtx:1,text:1,textCurves:1,textField:1,textFieldButtonGrp:1,textFieldGrp:1,textManip:1,textScrollList:1,textToShelf:1,textureDisplacePlane:1,textureHairColor:1,texturePlacementContext:1,textureWindow:1,threadCount:1,threePointArcCtx:1,timeControl:1,timePort:1,timerX:1,toNativePath:1,toggle:1,toggleAxis:1,toggleWindowVisibility:1,tokenize:1,tokenizeList:1,tolerance:1,tolower:1,toolButton:1,toolCollection:1,toolDropped:1,toolHasOptions:1,toolPropertyWindow:1,torus:1,toupper:1,trace:1,track:1,trackCtx:1,transferAttributes:1,transformCompare:1,transformLimits:1,translator:1,trim:1,trunc:1,truncateFluidCache:1,truncateHairCache:1,tumble:1,tumbleCtx:1,turbulence:1,twoPointArcCtx:1,uiRes:1,uiTemplate:1,unassignInputDevice:1,undo:1,undoInfo:1,ungroup:1,uniform:1,unit:1,unloadPlugin:1,untangleUV:1,untitledFileName:1,untrim:1,upAxis:1,updateAE:1,userCtx:1,uvLink:1,uvSnapshot:1,validateShelfName:1,vectorize:1,view2dToolCtx:1,viewCamera:1,viewClipPlane:1,viewFit:1,viewHeadOn:1,viewLookAt:1,viewManip:1,viewPlace:1,viewSet:1,visor:1,volumeAxis:1,vortex:1,waitCursor:1,warning:1,webBrowser:1,webBrowserPrefs:1,whatIs:1,window:1,windowPref:1,wire:1,wireContext:1,workspace:1,wrinkle:1,wrinkleContext:1,writeTake:1,xbmLangPathList:1,xform:1},i:\"</\",c:[hljs.CNM,hljs.ASM,hljs.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[hljs.BE]},{cN:\"variable\",b:\"\\\\$\\\\d\",r:5},{cN:\"variable\",b:\"[\\\\$\\\\%\\\\@\\\\*](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\"},hljs.CLCM,hljs.CBLCLM]}};hljs.LANGUAGES.dos={cI:true,dM:{k:{flow:{\"if\":1,\"else\":1,\"goto\":1,\"for\":1,\"in\":1,\"do\":1,call:1,exit:1,not:1,exist:1,errorlevel:1,defined:1,equ:1,neq:1,lss:1,leq:1,gtr:1,geq:1},keyword:{shift:1,cd:1,dir:1,echo:1,setlocal:1,endlocal:1,set:1,pause:1,copy:1},stream:{prn:1,nul:1,lpt3:1,lpt2:1,lpt1:1,con:1,com4:1,com3:1,com2:1,com1:1,aux:1},winutils:{ping:1,net:1,ipconfig:1,taskkill:1,xcopy:1,ren:1,del:1}},c:[{cN:\"envvar\",b:\"%%[^ ]\"},{cN:\"envvar\",b:\"%[^ ]+?%\"},{cN:\"envvar\",b:\"![^ ]+?!\"},{cN:\"number\",b:\"\\\\b\\\\d+\",r:0},{cN:\"comment\",b:\"@?rem\",e:\"$\"}]}};hljs.LANGUAGES.apache=function(){var a={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,dM:{k:{keyword:{acceptfilter:1,acceptmutex:1,acceptpathinfo:1,accessfilename:1,action:1,addalt:1,addaltbyencoding:1,addaltbytype:1,addcharset:1,adddefaultcharset:1,adddescription:1,addencoding:1,addhandler:1,addicon:1,addiconbyencoding:1,addiconbytype:1,addinputfilter:1,addlanguage:1,addmoduleinfo:1,addoutputfilter:1,addoutputfilterbytype:1,addtype:1,alias:1,aliasmatch:1,allow:1,allowconnect:1,allowencodedslashes:1,allowoverride:1,anonymous:1,anonymous_logemail:1,anonymous_mustgiveemail:1,anonymous_nouserid:1,anonymous_verifyemail:1,authbasicauthoritative:1,authbasicprovider:1,authdbduserpwquery:1,authdbduserrealmquery:1,authdbmgroupfile:1,authdbmtype:1,authdbmuserfile:1,authdefaultauthoritative:1,authdigestalgorithm:1,authdigestdomain:1,authdigestnccheck:1,authdigestnonceformat:1,authdigestnoncelifetime:1,authdigestprovider:1,authdigestqop:1,authdigestshmemsize:1,authgroupfile:1,authldapbinddn:1,authldapbindpassword:1,authldapcharsetconfig:1,authldapcomparednonserver:1,authldapdereferencealiases:1,authldapgroupattribute:1,authldapgroupattributeisdn:1,authldapremoteuserattribute:1,authldapremoteuserisdn:1,authldapurl:1,authname:1,authnprovideralias:1,authtype:1,authuserfile:1,authzdbmauthoritative:1,authzdbmtype:1,authzdefaultauthoritative:1,authzgroupfileauthoritative:1,authzldapauthoritative:1,authzownerauthoritative:1,authzuserauthoritative:1,balancermember:1,browsermatch:1,browsermatchnocase:1,bufferedlogs:1,cachedefaultexpire:1,cachedirlength:1,cachedirlevels:1,cachedisable:1,cacheenable:1,cachefile:1,cacheignorecachecontrol:1,cacheignoreheaders:1,cacheignorenolastmod:1,cacheignorequerystring:1,cachelastmodifiedfactor:1,cachemaxexpire:1,cachemaxfilesize:1,cacheminfilesize:1,cachenegotiateddocs:1,cacheroot:1,cachestorenostore:1,cachestoreprivate:1,cgimapextension:1,charsetdefault:1,charsetoptions:1,charsetsourceenc:1,checkcaseonly:1,checkspelling:1,chrootdir:1,contentdigest:1,cookiedomain:1,cookieexpires:1,cookielog:1,cookiename:1,cookiestyle:1,cookietracking:1,coredumpdirectory:1,customlog:1,dav:1,davdepthinfinity:1,davgenericlockdb:1,davlockdb:1,davmintimeout:1,dbdexptime:1,dbdkeep:1,dbdmax:1,dbdmin:1,dbdparams:1,dbdpersist:1,dbdpreparesql:1,dbdriver:1,defaulticon:1,defaultlanguage:1,defaulttype:1,deflatebuffersize:1,deflatecompressionlevel:1,deflatefilternote:1,deflatememlevel:1,deflatewindowsize:1,deny:1,directoryindex:1,directorymatch:1,directoryslash:1,documentroot:1,dumpioinput:1,dumpiologlevel:1,dumpiooutput:1,enableexceptionhook:1,enablemmap:1,enablesendfile:1,errordocument:1,errorlog:1,example:1,expiresactive:1,expiresbytype:1,expiresdefault:1,extendedstatus:1,extfilterdefine:1,extfilteroptions:1,fileetag:1,filterchain:1,filterdeclare:1,filterprotocol:1,filterprovider:1,filtertrace:1,forcelanguagepriority:1,forcetype:1,forensiclog:1,gracefulshutdowntimeout:1,group:1,header:1,headername:1,hostnamelookups:1,identitycheck:1,identitychecktimeout:1,imapbase:1,imapdefault:1,imapmenu:1,include:1,indexheadinsert:1,indexignore:1,indexoptions:1,indexorderdefault:1,indexstylesheet:1,isapiappendlogtoerrors:1,isapiappendlogtoquery:1,isapicachefile:1,isapifakeasync:1,isapilognotsupported:1,isapireadaheadbuffer:1,keepalive:1,keepalivetimeout:1,languagepriority:1,ldapcacheentries:1,ldapcachettl:1,ldapconnectiontimeout:1,ldapopcacheentries:1,ldapopcachettl:1,ldapsharedcachefile:1,ldapsharedcachesize:1,ldaptrustedclientcert:1,ldaptrustedglobalcert:1,ldaptrustedmode:1,ldapverifyservercert:1,limitinternalrecursion:1,limitrequestbody:1,limitrequestfields:1,limitrequestfieldsize:1,limitrequestline:1,limitxmlrequestbody:1,listen:1,listenbacklog:1,loadfile:1,loadmodule:1,lockfile:1,logformat:1,loglevel:1,maxclients:1,maxkeepaliverequests:1,maxmemfree:1,maxrequestsperchild:1,maxrequestsperthread:1,maxspareservers:1,maxsparethreads:1,maxthreads:1,mcachemaxobjectcount:1,mcachemaxobjectsize:1,mcachemaxstreamingbuffer:1,mcacheminobjectsize:1,mcacheremovalalgorithm:1,mcachesize:1,metadir:1,metafiles:1,metasuffix:1,mimemagicfile:1,minspareservers:1,minsparethreads:1,mmapfile:1,mod_gzip_on:1,mod_gzip_add_header_count:1,mod_gzip_keep_workfiles:1,mod_gzip_dechunk:1,mod_gzip_min_http:1,mod_gzip_minimum_file_size:1,mod_gzip_maximum_file_size:1,mod_gzip_maximum_inmem_size:1,mod_gzip_temp_dir:1,mod_gzip_item_include:1,mod_gzip_item_exclude:1,mod_gzip_command_version:1,mod_gzip_can_negotiate:1,mod_gzip_handle_methods:1,mod_gzip_static_suffix:1,mod_gzip_send_vary:1,mod_gzip_update_static:1,modmimeusepathinfo:1,multiviewsmatch:1,namevirtualhost:1,noproxy:1,nwssltrustedcerts:1,nwsslupgradeable:1,options:1,order:1,passenv:1,pidfile:1,protocolecho:1,proxybadheader:1,proxyblock:1,proxydomain:1,proxyerroroverride:1,proxyftpdircharset:1,proxyiobuffersize:1,proxymaxforwards:1,proxypass:1,proxypassinterpolateenv:1,proxypassmatch:1,proxypassreverse:1,proxypassreversecookiedomain:1,proxypassreversecookiepath:1,proxypreservehost:1,proxyreceivebuffersize:1,proxyremote:1,proxyremotematch:1,proxyrequests:1,proxyset:1,proxystatus:1,proxytimeout:1,proxyvia:1,readmename:1,receivebuffersize:1,redirect:1,redirectmatch:1,redirectpermanent:1,redirecttemp:1,removecharset:1,removeencoding:1,removehandler:1,removeinputfilter:1,removelanguage:1,removeoutputfilter:1,removetype:1,requestheader:1,require:2,rewritebase:1,rewritecond:10,rewriteengine:1,rewritelock:1,rewritelog:1,rewriteloglevel:1,rewritemap:1,rewriteoptions:1,rewriterule:10,rlimitcpu:1,rlimitmem:1,rlimitnproc:1,satisfy:1,scoreboardfile:1,script:1,scriptalias:1,scriptaliasmatch:1,scriptinterpretersource:1,scriptlog:1,scriptlogbuffer:1,scriptloglength:1,scriptsock:1,securelisten:1,seerequesttail:1,sendbuffersize:1,serveradmin:1,serveralias:1,serverlimit:1,servername:1,serverpath:1,serverroot:1,serversignature:1,servertokens:1,setenv:1,setenvif:1,setenvifnocase:1,sethandler:1,setinputfilter:1,setoutputfilter:1,ssienableaccess:1,ssiendtag:1,ssierrormsg:1,ssistarttag:1,ssitimeformat:1,ssiundefinedecho:1,sslcacertificatefile:1,sslcacertificatepath:1,sslcadnrequestfile:1,sslcadnrequestpath:1,sslcarevocationfile:1,sslcarevocationpath:1,sslcertificatechainfile:1,sslcertificatefile:1,sslcertificatekeyfile:1,sslciphersuite:1,sslcryptodevice:1,sslengine:1,sslhonorciperorder:1,sslmutex:1,ssloptions:1,sslpassphrasedialog:1,sslprotocol:1,sslproxycacertificatefile:1,sslproxycacertificatepath:1,sslproxycarevocationfile:1,sslproxycarevocationpath:1,sslproxyciphersuite:1,sslproxyengine:1,sslproxymachinecertificatefile:1,sslproxymachinecertificatepath:1,sslproxyprotocol:1,sslproxyverify:1,sslproxyverifydepth:1,sslrandomseed:1,sslrequire:1,sslrequiressl:1,sslsessioncache:1,sslsessioncachetimeout:1,sslusername:1,sslverifyclient:1,sslverifydepth:1,startservers:1,startthreads:1,substitute:1,suexecusergroup:1,threadlimit:1,threadsperchild:1,threadstacksize:1,timeout:1,traceenable:1,transferlog:1,typesconfig:1,unsetenv:1,usecanonicalname:1,usecanonicalphysicalport:1,user:1,userdir:1,virtualdocumentroot:1,virtualdocumentrootip:1,virtualscriptalias:1,virtualscriptaliasip:1,win32disableacceptex:1,xbithack:1},literal:{on:1,off:1}},c:[hljs.HCM,{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",a]},a,{cN:\"tag\",b:\"</?\",e:\">\"},hljs.QSM]}}}();hljs.LANGUAGES.cpp=function(){var a={keyword:{\"false\":1,\"int\":1,\"float\":1,\"while\":1,\"private\":1,\"char\":1,\"catch\":1,\"export\":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,\"const\":1,struct:1,\"for\":1,static_cast:2,union:1,namespace:1,unsigned:1,\"long\":1,\"throw\":1,\"volatile\":2,\"static\":1,\"protected\":1,bool:1,template:1,mutable:1,\"if\":1,\"public\":1,friend:2,\"do\":1,\"return\":1,\"goto\":1,auto:1,\"void\":2,\"enum\":1,\"else\":1,\"break\":1,\"new\":1,extern:1,using:1,\"true\":1,\"class\":1,asm:1,\"case\":1,typeid:1,\"short\":1,reinterpret_cast:2,\"default\":1,\"double\":1,register:1,explicit:1,signed:1,typename:1,\"try\":1,\"this\":1,\"switch\":1,\"continue\":1,wchar_t:1,inline:1,\"delete\":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1,restrict:1,_Bool:1,complex:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},hljs.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:a,r:10,c:[\"self\"]}]}}}();hljs.LANGUAGES.matlab={dM:{k:{keyword:{\"break\":1,\"case\":1,\"catch\":1,classdef:1,\"continue\":1,\"else\":1,elseif:1,end:1,enumerated:1,events:1,\"for\":1,\"function\":1,global:1,\"if\":1,methods:1,otherwise:1,parfor:1,persistent:1,properties:1,\"return\":1,spmd:1,\"switch\":1,\"try\":1,\"while\":1},built_in:{sin:1,sind:1,sinh:1,asin:1,asind:1,asinh:1,cos:1,cosd:1,cosh:1,acos:1,acosd:1,acosh:1,tan:1,tand:1,tanh:1,atan:1,atand:1,atan2:1,atanh:1,sec:1,secd:1,sech:1,asec:1,asecd:1,asech:1,csc:1,cscd:1,csch:1,acsc:1,acscd:1,acsch:1,cot:1,cotd:1,coth:1,acot:1,acotd:1,acoth:1,hypot:1,exp:1,expm1:1,log:1,log1p:1,log10:1,log2:1,pow2:1,realpow:1,reallog:1,realsqrt:1,sqrt:1,nthroot:1,nextpow2:1,abs:1,angle:1,complex:1,conj:1,imag:1,real:1,unwrap:1,isreal:1,cplxpair:1,fix:1,floor:1,ceil:1,round:1,mod:1,rem:1,sign:1,airy:1,besselj:1,bessely:1,besselh:1,besseli:1,besselk:1,beta:1,betainc:1,betaln:1,ellipj:1,ellipke:1,erf:1,erfc:1,erfcx:1,erfinv:1,expint:1,gamma:1,gammainc:1,gammaln:1,psi:1,legendre:1,cross:1,dot:1,factor:1,isprime:1,primes:1,gcd:1,lcm:1,rat:1,rats:1,perms:1,nchoosek:1,factorial:1,cart2sph:1,cart2pol:1,pol2cart:1,sph2cart:1,hsv2rgb:1,rgb2hsv:1,zeros:1,ones:1,eye:1,repmat:1,rand:1,randn:1,linspace:1,logspace:1,freqspace:1,meshgrid:1,accumarray:1,size:1,length:1,ndims:1,numel:1,disp:1,isempty:1,isequal:1,isequalwithequalnans:1,cat:1,reshape:1,diag:1,blkdiag:1,tril:1,triu:1,fliplr:1,flipud:1,flipdim:1,rot90:1,find:1,end:1,sub2ind:1,ind2sub:1,bsxfun:1,ndgrid:1,permute:1,ipermute:1,shiftdim:1,circshift:1,squeeze:1,isscalar:1,isvector:1,ans:1,eps:1,realmax:1,realmin:1,pi:1,i:1,inf:1,nan:1,isnan:1,isinf:1,isfinite:1,j:1,why:1,compan:1,gallery:1,hadamard:1,hankel:1,hilb:1,invhilb:1,magic:1,pascal:1,rosser:1,toeplitz:1,vander:1,wilkinson:1},},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",b:\"function\",e:\"$\",k:{\"function\":1},c:[{cN:\"title\",b:hljs.UIR},{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},{cN:\"params\",b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"string\",b:\"'\",e:\"'\",c:[hljs.BE,{b:\"''\"}]},{cN:\"comment\",b:\"\\\\%\",e:\"$\"},hljs.CNM]}};hljs.LANGUAGES.parser3={dM:{sL:\"html\",c:[{cN:\"comment\",b:\"^#\",e:\"$\"},{cN:\"comment\",b:\"\\\\^rem{\",e:\"}\",r:10,c:[{b:\"{\",e:\"}\",c:[\"self\"]}]},{cN:\"preprocessor\",b:\"^@(?:BASE|USE|CLASS|OPTIONS)$\",r:10},{cN:\"title\",b:\"@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$\"},{cN:\"variable\",b:\"\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?\"},{cN:\"keyword\",b:\"\\\\^[\\\\w\\\\-\\\\.\\\\:]+\"},{cN:\"number\",b:\"\\\\^#[0-9a-fA-F]+\"},hljs.CNM]}};hljs.LANGUAGES.go=function(){var a={keyword:{\"break\":1,\"default\":1,func:1,\"interface\":1,select:1,\"case\":1,map:1,struct:1,chan:1,\"else\":1,\"goto\":1,\"package\":1,\"switch\":1,\"const\":1,fallthrough:1,\"if\":1,range:1,type:1,\"continue\":1,\"for\":1,\"import\":1,\"return\":1,\"var\":1,go:1,defer:1},constant:{\"true\":1,\"false\":1,iota:1,nil:1},typename:{bool:1,\"byte\":1,complex64:1,complex128:1,float32:1,float64:1,int8:1,int16:1,int32:1,int64:1,string:1,uint8:1,uint16:1,uint32:1,uint64:1,\"int\":1,uint:1,uintptr:1,rune:1},built_in:{append:1,cap:1,close:1,complex:1,copy:1,imag:1,len:1,make:1,\"new\":1,panic:1,print:1,println:1,real:1,recover:1,\"delete\":1}};return{dM:{k:a,i:\"</\",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",r:0},{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"number\",b:\"[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\",r:0},hljs.CNM]}}}();"
  },
  {
    "path": "ppt/think-in-css/js/highlight/hljs-0.8.js",
    "content": "var hljs=new function(){function k(v){return v.replace(/&/gm,\"&amp;\").replace(/</gm,\"&lt;\").replace(/>/gm,\"&gt;\")}function t(v){return v.nodeName.toLowerCase()}function i(w,x){var v=w&&w.exec(x);return v&&v.index==0}function d(v){return Array.prototype.map.call(v.childNodes,function(w){if(w.nodeType==3){return b.useBR?w.nodeValue.replace(/\\n/g,\"\"):w.nodeValue}if(t(w)==\"br\"){return\"\\n\"}return d(w)}).join(\"\")}function r(w){var v=(w.className+\" \"+(w.parentNode?w.parentNode.className:\"\")).split(/\\s+/);v=v.map(function(x){return x.replace(/^language-/,\"\")});return v.filter(function(x){return j(x)||x==\"no-highlight\"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)==\"br\"){z+=1}else{if(A.nodeType==1){v.push({event:\"start\",offset:z,node:A});z=w(A,z);v.push({event:\"stop\",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F=\"\";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset<y[0].offset)?w:y}return y[0].event==\"start\"?w:y}function A(H){function G(I){return\" \"+I.nodeName+'=\"'+k(I.value)+'\"'}F+=\"<\"+t(H)+Array.prototype.map.call(H.attributes,G).join(\"\")+\">\"}function E(G){F+=\"</\"+t(G)+\">\"}function v(G){(G.event==\"start\"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=k(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event==\"start\"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+k(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),\"m\"+(y.cI?\"i\":\"\")+(z?\"g\":\"\"))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};function E(G,F){if(y.cI){F=F.toLowerCase()}F.split(\" \").forEach(function(H){var I=H.split(\"|\");z[I[0]]=[G,I[1]?Number(I[1]):1]})}if(typeof D.k==\"string\"){E(\"keyword\",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\\b[A-Za-z0-9_]+\\b/,true);if(C){if(D.bK){D.b=D.bK.split(\" \").join(\"|\")}if(!D.b){D.b=/\\B|\\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\\B|\\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||\"\";if(D.eW&&C.tE){D.tE+=(D.e?\"|\":\"\")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F==\"self\"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?\"\\\\.?\\\\b(\"+F.b+\")\\\\b\\\\.?\":F.b}).concat([D.tE]).concat([D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join(\"|\"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T<V.c.length;T++){if(i(V.c[T].bR,U)){return V.c[T]}}}function z(U,T){if(i(U.eR,T)){return U}if(U.eW){return z(U.parent,T)}}function A(T,U){return !J&&i(U.iR,T)}function E(V,T){var U=M.cI?T[0].toLowerCase():T[0];return V.k.hasOwnProperty(U)&&V.k[U]}function w(Z,X,W,V){var T=V?\"\":b.classPrefix,U='<span class=\"'+T,Y=W?\"\":\"</span>\";U+=Z+'\">';return U+X+Y}function N(){var U=k(C);if(!I.k){return U}var T=\"\";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(U);while(V){T+=U.substr(X,V.index-X);var W=E(I,V);if(W){H+=W[1];T+=w(W[0],V[0])}else{T+=V[0]}X=I.lR.lastIndex;V=I.lR.exec(U)}return T+U.substr(X)}function F(){if(I.sL&&!f[I.sL]){return k(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):g(C);if(I.r>0){H+=T.r}if(I.subLanguageMode==\"continuous\"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,\"\",true):\"\";if(V.rB){D+=T;C=\"\"}else{if(V.eB){D+=k(U)+T;C=\"\"}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=\"</span>\"}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=k(X)}C=\"\";if(W.starts){P(W.starts,\"\")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme \"'+X+'\" for mode \"'+(I.cN||\"<unnamed>\")+'\"')}C+=X;return X.length||1}var M=j(S);if(!M){throw new Error('Unknown language: \"'+S+'\"')}m(M);var I=R||M;var D=\"\";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,D,true)}}var C=\"\";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=\"</span>\"}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf(\"Illegal\")!=-1){return{r:0,value:k(L)}}else{throw O}}}function g(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:k(y)};var w=v;x.forEach(function(z){if(!j(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function h(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\\t)+)/gm,function(w,z,y,x){return z.replace(/\\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\\n/g,\"<br>\")}return v}function p(z){var y=d(z);var A=r(z);if(A==\"no-highlight\"){return}var v=A?c(A,y,true):g(y);var w=u(z);if(w.length){var x=document.createElementNS(\"http://www.w3.org/1999/xhtml\",\"pre\");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=h(v.value);z.innerHTML=v.value;z.className+=\" hljs \"+(!A&&v.language||\"\");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:\"hljs-\",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll(\"pre code\");Array.prototype.forEach.call(v,p)}function a(){addEventListener(\"DOMContentLoaded\",l,false);addEventListener(\"load\",l,false)}var f={};var n={};function e(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function j(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=g;this.fixMarkup=h;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=e;this.getLanguage=j;this.inherit=o;this.IR=\"[a-zA-Z][a-zA-Z0-9_]*\";this.UIR=\"[a-zA-Z_][a-zA-Z0-9_]*\";this.NR=\"\\\\b\\\\d+(\\\\.\\\\d+)?\";this.CNR=\"(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\";this.BNR=\"\\\\b(0b[01]+)\";this.RSR=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\";this.BE={b:\"\\\\\\\\[\\\\s\\\\S]\",r:0};this.ASM={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[this.BE]};this.QSM={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[this.BE]};this.CLCM={cN:\"comment\",b:\"//\",e:\"$\"};this.CBLCLM={cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\"};this.HCM={cN:\"comment\",b:\"#\",e:\"$\"};this.NM={cN:\"number\",b:this.NR,r:0};this.CNM={cN:\"number\",b:this.CNR,r:0};this.BNM={cN:\"number\",b:this.BNR,r:0};this.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gim]*/,i:/\\n/,c:[this.BE,{b:/\\[/,e:/\\]/,r:0,c:[this.BE]}]};this.TM={cN:\"title\",b:this.IR,r:0};this.UTM={cN:\"title\",b:this.UIR,r:0}}();hljs.registerLanguage(\"ruleslanguage\",function(a){return{k:{keyword:\"BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM NUMDAYS READ_DATE STAGING\",built_in:\"IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME\"},c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:\"array\",b:\"#[a-zA-Z .]+\"}]}});hljs.registerLanguage(\"ruby\",function(e){var h=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\";var g=\"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\";var a={cN:\"yardoctag\",b:\"@[A-Za-z]+\"};var i={cN:\"comment\",v:[{b:\"#\",e:\"$\",c:[a]},{b:\"^\\\\=begin\",e:\"^\\\\=end\",c:[a],r:10},{b:\"^__END__\",e:\"\\\\n$\"}]};var c={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:g};var d={cN:\"string\",c:[e.BE,c],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:\"%[qw]?\\\\(\",e:\"\\\\)\"},{b:\"%[qw]?\\\\[\",e:\"\\\\]\"},{b:\"%[qw]?{\",e:\"}\"},{b:\"%[qw]?<\",e:\">\",r:10},{b:\"%[qw]?/\",e:\"/\",r:10},{b:\"%[qw]?%\",e:\"%\",r:10},{b:\"%[qw]?-\",e:\"-\",r:10},{b:\"%[qw]?\\\\|\",e:\"\\\\|\",r:10},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/}]};var b={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:g};var f=[d,i,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{cN:\"inheritance\",b:\"<\\\\s*\",c:[{cN:\"parent\",b:\"(\"+e.IR+\"::)?\"+e.IR}]},i]},{cN:\"function\",bK:\"def\",e:\" |$|;\",r:0,c:[e.inherit(e.TM,{b:h}),b,i]},{cN:\"constant\",b:\"(::)?(\\\\b[A-Z]\\\\w*(::)?)+\",r:0},{cN:\"symbol\",b:\":\",c:[d,{b:h}],r:0},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",r:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[i,{cN:\"regexp\",c:[e.BE,c],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],r:0}];c.c=f;b.c=f;return{k:g,c:f}});hljs.registerLanguage(\"haml\",function(a){return{cI:true,c:[{cN:\"doctype\",b:\"^!!!( (5|1\\\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\\\b.*))?$\",r:10},{cN:\"comment\",b:\"^\\\\s*(!=#|=#|-#|/).*$\",r:0},{b:\"^\\\\s*(-|=|!=)(?!#)\",starts:{e:\"\\\\n\",sL:\"ruby\"}},{cN:\"tag\",b:\"^\\\\s*%\",c:[{cN:\"title\",b:\"\\\\w+\"},{cN:\"value\",b:\"[#\\\\.]\\\\w+\"},{b:\"{\\\\s*\",e:\"\\\\s*}\",eE:true,c:[{b:\":\\\\w+\\\\s*=>\",e:\",\\\\s+\",rB:true,eW:true,c:[{cN:\"symbol\",b:\":\\\\w+\"},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]}]},{b:\"\\\\(\\\\s*\",e:\"\\\\s*\\\\)\",eE:true,c:[{b:\"\\\\w+\\\\s*=\",e:\"\\\\s+\",rB:true,eW:true,c:[{cN:\"attribute\",b:\"\\\\w+\",r:0},{cN:\"string\",b:'\"',e:'\"'},{cN:\"string\",b:\"'\",e:\"'\"},{b:\"\\\\w+\",r:0}]},]}]},{cN:\"bullet\",b:\"^\\\\s*[=~]\\\\s*\",r:0},{b:\"#{\",starts:{e:\"}\",sL:\"ruby\"}}]}});hljs.registerLanguage(\"haskell\",function(f){var g={cN:\"comment\",v:[{b:\"--\",e:\"$\"},{b:\"{-\",e:\"-}\",c:[\"self\"]}]};var e={cN:\"pragma\",b:\"{-#\",e:\"#-}\"};var b={cN:\"preprocessor\",b:\"^#\",e:\"$\"};var d={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",r:0};var c={cN:\"container\",b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[e,g,b,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},f.inherit(f.TM,{b:\"[_a-z][\\\\w']*\"})]};var a={cN:\"container\",b:\"{\",e:\"}\",c:c.c};return{k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{cN:\"module\",b:\"\\\\bmodule\\\\b\",e:\"where\",k:\"module where\",c:[c,g],i:\"\\\\W\\\\.|;\"},{cN:\"import\",b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import|0 qualified as hiding\",c:[c,g],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[d,c,g]},{cN:\"typedef\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[e,g,d,c,a]},{cN:\"default\",bK:\"default\",e:\"$\",c:[d,c,g]},{cN:\"infix\",bK:\"infix infixl infixr\",e:\"$\",c:[f.CNM,g]},{cN:\"foreign\",b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[d,f.QSM,g]},{cN:\"shebang\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},e,g,b,f.QSM,f.CNM,d,f.inherit(f.TM,{b:\"^[_a-z][\\\\w']*\"}),{b:\"->|<-\"}]}});hljs.registerLanguage(\"xml\",function(a){var c=\"[A-Za-z0-9\\\\._:-]+\";var d={b:/<\\?(php)?(?!\\w)/,e:/\\?>/,sL:\"php\",subLanguageMode:\"continuous\"};var b={eW:true,i:/</,r:0,c:[d,{cN:\"attribute\",b:c,r:0},{b:\"=\",r:0,c:[{cN:\"value\",v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/[^\\s\\/>]+/}]}]}]};return{aliases:[\"html\"],cI:true,c:[{cN:\"doctype\",b:\"<!DOCTYPE\",e:\">\",r:10,c:[{b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"comment\",b:\"<!--\",e:\"-->\",r:10},{cN:\"cdata\",b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",r:10},{cN:\"tag\",b:\"<style(?=\\\\s|>|$)\",e:\">\",k:{title:\"style\"},c:[b],starts:{e:\"</style>\",rE:true,sL:\"css\"}},{cN:\"tag\",b:\"<script(?=\\\\s|>|$)\",e:\">\",k:{title:\"script\"},c:[b],starts:{e:\"<\\/script>\",rE:true,sL:\"javascript\"}},{b:\"<%\",e:\"%>\",sL:\"vbscript\"},d,{cN:\"pi\",b:/<\\?\\w+/,e:/\\?>/,r:10},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"title\",b:\"[^ /><]+\",r:0},b]}]}});hljs.registerLanguage(\"django\",function(a){var b={cN:\"filter\",b:/\\|[A-Za-z]+\\:?/,k:\"truncatewords removetags linebreaksbr yesno get_digit timesince random striptags filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort dictsortreversed default_if_none pluralize lower join center default truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize localtime utc timezone\",c:[{cN:\"argument\",b:/\"/,e:/\"/},{cN:\"argument\",b:/'/,e:/'/}]};return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"template_comment\",b:/\\{%\\s*comment\\s*%}/,e:/\\{%\\s*endcomment\\s*%}/},{cN:\"template_comment\",b:/\\{#/,e:/#}/},{cN:\"template_tag\",b:/\\{%/,e:/%}/,k:\"comment endcomment load templatetag ifchanged endifchanged if endif firstof for endfor in ifnotequal endifnotequal widthratio extends include spaceless endspaceless regroup by as ifequal endifequal ssi now with cycle url filter endfilter debug block endblock else autoescape endautoescape csrf_token empty elif endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix plural get_current_language language get_available_languages get_current_language_bidi get_language_info get_language_info_list localize endlocalize localtime endlocaltime timezone endtimezone get_current_timezone verbatim\",c:[b]},{cN:\"variable\",b:/\\{\\{/,e:/}}/,c:[b]}]}});hljs.registerLanguage(\"bash\",function(b){var a={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)\\}/}]};var d={cN:\"string\",b:/\"/,e:/\"/,c:[b.BE,a,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[b.BE]}]};var c={cN:\"string\",b:/'/,e:/'/};return{l:/-?[a-z\\.]+/,k:{keyword:\"if then else elif fi for break continue while in do done exit return set declare case esac export exec\",literal:\"true false\",built_in:\"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo\",operator:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"shebang\",b:/^#![^\\n]+sh\\s*$/,r:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:true,c:[b.inherit(b.TM,{b:/\\w[\\w\\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage(\"ini\",function(a){return{cI:true,i:/\\S/,c:[{cN:\"comment\",b:\";\",e:\"$\"},{cN:\"title\",b:\"^\\\\[\",e:\"\\\\]\"},{cN:\"setting\",b:\"^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*\",e:\"$\",c:[{cN:\"value\",eW:true,k:\"on off true false yes no\",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage(\"objectivec\",function(a){var d={keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign self synchronized id nonatomic super unichar IBOutlet IBAction strong weak @private @protected @public @try @property @end @throw @catch @finally @synthesize @dynamic @selector @optional @required\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b=\"@interface @class @protocol @implementation\";return{k:d,l:c,i:\"</\",c:[a.CLCM,a.CBLCLM,a.CNM,a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"preprocessor\",b:\"#import\",e:\"$\",c:[{cN:\"title\",b:'\"',e:'\"'},{cN:\"title\",b:\"<\",e:\">\"}]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",b:\"(\"+b.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",k:b,l:c,c:[a.UTM]},{cN:\"variable\",b:\"\\\\.\"+a.UIR,r:0}]}});hljs.registerLanguage(\"scss\",function(a){var c=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var d={cN:\"function\",b:c+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]};var b={cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"};var e={cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[d,b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:\"important\",b:\"!important\"}]}};return{cI:true,i:\"[=/|']\",c:[a.CLCM,a.CBLCLM,{cN:\"function\",b:c+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]},{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\",r:0},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",r:0},{cN:\"pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},{cN:\"attribute\",b:\"\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{cN:\"value\",b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{cN:\"value\",b:\":\",e:\";\",c:[b,a.NM,a.QSM,a.ASM,{cN:\"important\",b:\"!important\"}]},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",k:\"mixin include extend for if else each while charset import debug media page content font-face namespace warn\",c:[d,a.QSM,a.ASM,b,a.NM,{cN:\"preprocessor\",b:\"\\\\s[A-Za-z0-9_.-]+\",r:0}]}]}});hljs.registerLanguage(\"python\",function(a){var f={cN:\"prompt\",b:/^(>>>|\\.\\.\\.) /};var b={cN:\"string\",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)\"/,e:/\"/,r:10},{b:/(b|br)'/,e:/'/,},{b:/(b|br)\"/,e:/\"/,},a.ASM,a.QSM]};var d={cN:\"number\",r:0,v:[{b:a.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:a.CNR+\"[lLjJ]?\"}]};var e={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",f,d,b]};var c={e:/:/,i:/[${=;\\n]/,c:[a.UTM,e]};return{k:{keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False\",built_in:\"Ellipsis NotImplemented\"},i:/(<\\/|->|\\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:\"function\",bK:\"def\",r:10}),a.inherit(c,{cN:\"class\",bK:\"class\"}),{cN:\"decorator\",b:/@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"mel\",function(a){return{k:\"int float string vector matrix if else switch case default while do for in break continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor animDisplay animView annotate appendStringArray applicationName applyAttrPreset applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem componentEditor compositingInterop computePolysetVolume condition cone confirmDialog connectAttr connectControl connectDynamic connectJoint connectionInfo constrain constrainValue constructionHistory container containsMultibyte contextInfo control convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected displayColor displayCull displayLevelOfDetail displayPref displayRGBColor displaySmoothness displayStats displayString displaySurface distanceDimContext distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor editorTemplate effector emit emitter enableDevice encodeString endString endsWith env equivalent equivalentTol erf error eval evalDeferred evalEcho event exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo filetest filletCurve filter filterCurve filterExpand filterStudioImport findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss geometryConstraint getApplicationVersionAsFloat getAttr getClassification getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation listNodeTypes listPanelCategories listRelatives listSets listTransforms listUnselected listerEditor loadFluid loadNewShelf loadPlugin loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration panelHistory paramDimContext paramDimension paramLocator parent parentConstraint particle particleExists particleInstancer particleRenderInfo partition pasteKey pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE registerPluginResource rehash reloadImage removeJoint removeMultiInstance removePanelCategory rename renameAttr renameSelectionList renameUI render renderGlobalsNode renderInfo renderLayerButton renderLayerParent renderLayerPostProcess renderLayerUnparent renderManip renderPartition renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor renderWindowSelectContext renderer reorder reorderDeformers requires reroot resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType selectedNodes selectionConnection separator setAttr setAttrEnumResource setAttrMapping setAttrNiceNameResource setConstraintRestPosition setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField shortNameOf showHelp showHidden showManipCtx showSelectionInTitle showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString stringToStringArray strip stripPrefixFromName stroke subdAutoProjection subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList textToShelf textureDisplacePlane textureHairColor texturePlacementContext textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper trace track trackCtx transferAttributes transformCompare transformLimits translator trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform\",i:\"</\",c:[a.CNM,a.ASM,a.QSM,{cN:\"string\",b:\"`\",e:\"`\",c:[a.BE]},{cN:\"variable\",v:[{b:\"\\\\$\\\\d\"},{b:\"[\\\\$\\\\%\\\\@](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\"},{b:\"\\\\*(\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)\",r:0}]},a.CLCM,a.CBLCLM]}});hljs.registerLanguage(\"dos\",function(a){return{cI:true,k:{flow:\"if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq\",keyword:\"shift cd dir echo setlocal endlocal set pause copy\",stream:\"prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux\",winutils:\"ping net ipconfig taskkill xcopy ren del\"},c:[{cN:\"envvar\",b:\"%%[^ ]\"},{cN:\"envvar\",b:\"%[^ ]+?%\"},{cN:\"envvar\",b:\"![^ ]+?!\"},{cN:\"number\",b:\"\\\\b\\\\d+\",r:0},{cN:\"comment\",b:\"@?rem\",e:\"$\"}]}});hljs.registerLanguage(\"java\",function(b){var a=\"false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws\";return{k:a,i:/<\\//,c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"(^|\\\\s)@[A-Za-z]+\"}],r:10},b.CLCM,b.CBLCLM,b.ASM,b.QSM,{bK:\"protected public private\",e:/[{;=]/,k:a,c:[{cN:\"class\",bK:\"class interface\",eW:true,i:/[:\"<>]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{b:b.UIR+\"\\\\s*\\\\(\",rB:true,c:[b.UTM]}]},b.CNM,{cN:\"annotation\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"tex\",function(a){var d={cN:\"command\",b:\"\\\\\\\\[a-zA-ZÐ°-ÑÐ-Ñ]+[\\\\*]?\"};var c={cN:\"command\",b:\"\\\\\\\\[^a-zA-ZÐ°-ÑÐ-Ñ0-9]\"};var b={cN:\"special\",b:\"[{}\\\\[\\\\]\\\\&#~]\",r:0};return{c:[{b:\"\\\\\\\\[a-zA-ZÐ°-ÑÐ-Ñ]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",rB:true,c:[d,c,{cN:\"number\",b:\" *=\",e:\"-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?\",eB:true}],r:10},d,c,b,{cN:\"formula\",b:\"\\\\$\\\\$\",e:\"\\\\$\\\\$\",c:[d,c,b],r:0},{cN:\"formula\",b:\"\\\\$\",e:\"\\\\$\",c:[d,c,b],r:0},{cN:\"comment\",b:\"%\",e:\"$\",r:0}]}});hljs.registerLanguage(\"glsl\",function(a){return{k:{keyword:\"atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly\",built_in:\"gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffsetgl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse\",literal:\"true false\"},i:'\"',c:[a.CLCM,a.CBLCLM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"}]}});hljs.registerLanguage(\"brainfuck\",function(b){var a={cN:\"literal\",b:\"[\\\\+\\\\-]\",r:0};return{c:[{cN:\"comment\",b:\"[^\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",rE:true,e:\"[\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]\",r:0},{cN:\"title\",b:\"[\\\\[\\\\]]\",r:0},{cN:\"string\",b:\"[\\\\.,]\",r:0},{b:/\\+\\+|\\-\\-/,rB:true,c:[a]},a]}});hljs.registerLanguage(\"mathematica\",function(a){return{aliases:[\"mma\"],l:\"(\\\\$|\\\\b)\"+a.IR+\"\\\\b\",k:\"AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine Transparent UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian XMLElement XMLObject Xnor Xor Yellow YuleDissimilarity ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform $Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber\",c:[{cN:\"comment\",b:/\\(\\*/,e:/\\*\\)/},a.ASM,a.QSM,a.CNM,{cN:\"list\",b:/\\{/,e:/\\}/,i:/:/}]}});hljs.registerLanguage(\"cs\",function(b){var a=\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield\";return{k:a,c:[{cN:\"comment\",b:\"///\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"///|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"}]},b.CLCM,b.CBLCLM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elif endif define undef warning error line region endregion pragma checksum\"},{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},b.ASM,b.QSM,b.CNM,{bK:\"protected public private internal\",e:/[{;=]/,k:a,c:[{bK:\"class namespace interface\",starts:{c:[b.TM]}},{b:b.IR+\"\\\\s*\\\\(\",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage(\"http\",function(a){return{i:\"\\\\S\",c:[{cN:\"status\",b:\"^HTTP/[0-9\\\\.]+\",e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{cN:\"request\",b:\"^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$\",rB:true,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:true,eE:true}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:true,i:\"\\\\n|\\\\s|=\",starts:{cN:\"string\",e:\"$\"}},{b:\"\\\\n\\\\n\",starts:{sL:\"\",eW:true}}]}});hljs.registerLanguage(\"rust\",function(b){var c={cN:\"number\",b:\"\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)\",r:0};var a=\"assert bool break char check claim comm const cont copy dir do drop else enum extern export f32 f64 fail false float fn for i16 i32 i64 i8 if impl int let log loop match mod move mut priv pub pure ref return self static str struct task true trait type u16 u32 u64 u8 uint unsafe use vec while\";return{k:a,i:\"</\",c:[b.CLCM,b.CBLCLM,b.inherit(b.QSM,{i:null}),b.ASM,c,{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",c:[b.UTM]},{cN:\"preprocessor\",b:\"#\\\\[\",e:\"\\\\]\"},{bK:\"type\",e:\"(=|<)\",c:[b.UTM],i:\"\\\\S\"},{bK:\"trait enum\",e:\"({|<)\",c:[b.UTM],i:\"\\\\S\"}]}});hljs.registerLanguage(\"handlebars\",function(b){var a=\"each in with if else unless bindattr action collection debugger log outlet template unbound view yield\";return{cI:true,sL:\"xml\",subLanguageMode:\"continuous\",c:[{cN:\"expression\",b:\"{{\",e:\"}}\",c:[{cN:\"begin-block\",b:\"#[a-zA-Z- .]+\",k:a},{cN:\"string\",b:'\"',e:'\"'},{cN:\"end-block\",b:\"\\\\/[a-zA-Z- .]+\",k:a},{cN:\"variable\",b:\"[a-zA-Z-.]+\",k:a}]}]}});hljs.registerLanguage(\"cmake\",function(a){return{cI:true,k:{keyword:\"add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory break build_command cmake_minimum_required cmake_policy configure_file create_test_sourcelist define_property else elseif enable_language enable_testing endforeach endfunction endif endmacro endwhile execute_process export find_file find_library find_package find_path find_program fltk_wrap_ui foreach function get_cmake_property get_directory_property get_filename_component get_property get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install link_directories load_cache load_command macro mark_as_advanced message option output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return separate_arguments set set_directory_properties set_property set_source_files_properties set_target_properties set_tests_properties site_name source_group string target_link_libraries try_compile try_run unset variable_watch while build_name exec_program export_library_dependencies install_files install_programs install_targets link_libraries make_directory remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or\",operator:\"equal less greater strless strgreater strequal matches\"},c:[{cN:\"envvar\",b:\"\\\\${\",e:\"}\"},a.HCM,a.QSM,a.NM]}});hljs.registerLanguage(\"lisp\",function(h){var k=\"[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#!]*\";var l=\"(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\";var j={cN:\"shebang\",b:\"^#!\",e:\"$\"};var b={cN:\"literal\",b:\"\\\\b(t{1}|nil)\\\\b\"};var d={cN:\"number\",v:[{b:l,r:0},{b:\"#b[0-1]+(/[0-1]+)?\"},{b:\"#o[0-7]+(/[0-7]+)?\"},{b:\"#x[0-9a-f]+(/[0-9a-f]+)?\"},{b:\"#c\\\\(\"+l+\" +\"+l,e:\"\\\\)\"}]};var g=h.inherit(h.QSM,{i:null});var m={cN:\"comment\",b:\";\",e:\"$\"};var f={cN:\"variable\",b:\"\\\\*\",e:\"\\\\*\"};var n={cN:\"keyword\",b:\"[:&]\"+k};var c={b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",b,g,d]};var a={cN:\"quoted\",c:[d,g,f,n,c],v:[{b:\"['`]\\\\(\",e:\"\\\\)\",},{b:\"\\\\(quote \",e:\"\\\\)\",k:{title:\"quote\"},}]};var i={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var e={eW:true,r:0};i.c=[{cN:\"title\",b:k},e];e.c=[a,i,b,d,g,m,f,n];return{i:/\\S/,c:[d,j,b,g,m,a,i]}});hljs.registerLanguage(\"rib\",function(a){return{k:\"ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry Hider Hyperboloid Identity Illuminate Imager Interior LightSource MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd TransformPoints Translate TrimCurve WorldBegin WorldEnd\",i:\"</\",c:[a.HCM,a.CNM,a.ASM,a.QSM]}});hljs.registerLanguage(\"css\",function(a){var b=\"[a-zA-Z-][a-zA-Z0-9_-]*\";var c={cN:\"function\",b:b+\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.NM,a.ASM,a.QSM]};return{cI:true,i:\"[=/|']\",c:[a.CBLCLM,{cN:\"id\",b:\"\\\\#[A-Za-z0-9_-]+\"},{cN:\"class\",b:\"\\\\.[A-Za-z0-9_-]+\",r:0},{cN:\"attr_selector\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"pseudo\",b:\":(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\\\"\\\\']+\"},{cN:\"at_rule\",b:\"@(font-face|page)\",l:\"[a-z-]+\",k:\"font-face page\"},{cN:\"at_rule\",b:\"@\",e:\"[{;]\",c:[{cN:\"keyword\",b:/\\S+/},{b:/\\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.NM]}]},{cN:\"tag\",b:b,r:0},{cN:\"rules\",b:\"{\",e:\"}\",i:\"[^\\\\s]\",r:0,c:[a.CBLCLM,{cN:\"rule\",b:\"[^\\\\s]\",rB:true,e:\";\",eW:true,c:[{cN:\"attribute\",b:\"[A-Z\\\\_\\\\.\\\\-]+\",e:\":\",eE:true,i:\"[^\\\\s]\",starts:{cN:\"value\",eW:true,eE:true,c:[c,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:\"hexcolor\",b:\"#[0-9A-Fa-f]+\"},{cN:\"important\",b:\"!important\"}]}}]}]}]}});hljs.registerLanguage(\"avrasm\",function(a){return{cI:true,k:{keyword:\"adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub subi swap tst wdr\",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf\"},c:[a.CBLCLM,{cN:\"comment\",b:\";\",e:\"$\",r:0},a.CNM,a.BNM,{cN:\"number\",b:\"\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)\"},a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",i:\"[^\\\\\\\\][^']\"},{cN:\"label\",b:\"^[A-Za-z0-9_.$]+:\"},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"preprocessor\",b:\"\\\\.[a-zA-Z]+\"},{cN:\"localvars\",b:\"@[0-9]+\"}]}});hljs.registerLanguage(\"apache\",function(a){var b={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{cI:true,c:[a.HCM,{cN:\"tag\",b:\"</?\",e:\">\"},{cN:\"keyword\",b:/\\w+/,r:0,k:{common:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,r:0,k:{literal:\"on off all\"},c:[{cN:\"sqbracket\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"cbracket\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",b]},b,a.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"1c\",function(b){var f=\"[a-zA-ZÐ°-ÑÐ-Ð¯][a-zA-Z0-9_Ð°-ÑÐ-Ð¯]*\";var c=\"Ð²Ð¾Ð·Ð²Ñ€Ð°Ñ‚ Ð´Ð°Ñ‚Ð° Ð´Ð»Ñ ÐµÑÐ»Ð¸ Ð¸ Ð¸Ð»Ð¸ Ð¸Ð½Ð°Ñ‡Ðµ Ð¸Ð½Ð°Ñ‡ÐµÐµÑÐ»Ð¸ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ ÐºÐ¾Ð½ÐµÑ†ÐµÑÐ»Ð¸ ÐºÐ¾Ð½ÐµÑ†Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ¸ ÐºÐ¾Ð½ÐµÑ†Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ ÐºÐ¾Ð½ÐµÑ†Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ ÐºÐ¾Ð½ÐµÑ†Ñ†Ð¸ÐºÐ»Ð° ÐºÐ¾Ð½ÑÑ‚Ð°Ð½Ñ‚Ð° Ð½Ðµ Ð¿ÐµÑ€ÐµÐ¹Ñ‚Ð¸ Ð¿ÐµÑ€ÐµÐ¼ Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ðµ Ð¿Ð¾ Ð¿Ð¾ÐºÐ° Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° Ð¿Ñ€ÐµÑ€Ð²Ð°Ñ‚ÑŒ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÑŒ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° ÑÑ‚Ñ€Ð¾ÐºÐ° Ñ‚Ð¾Ð³Ð´Ð° Ñ„Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñ†Ð¸ÐºÐ» Ñ‡Ð¸ÑÐ»Ð¾ ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\";var e=\"ansitooem oemtoansi Ð²Ð²ÐµÑÑ‚Ð¸Ð²Ð¸Ð´ÑÑƒÐ±ÐºÐ¾Ð½Ñ‚Ð¾ Ð²Ð²ÐµÑÑ‚Ð¸Ð´Ð°Ñ‚Ñƒ Ð²Ð²ÐµÑÑ‚Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿ÐµÑ€ÐµÑ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ðµ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿ÐµÑ€Ð¸Ð¾Ð´ Ð²Ð²ÐµÑÑ‚Ð¸Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð²Ð²ÐµÑÑ‚Ð¸ÑÑ‚Ñ€Ð¾ÐºÑƒ Ð²Ð²ÐµÑÑ‚Ð¸Ñ‡Ð¸ÑÐ»Ð¾ Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð²Ñ€ÐµÐ³ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¹Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð²Ñ‹Ð·Ð²Ð°Ñ‚ÑŒÐ¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ðµ Ð´Ð°Ñ‚Ð°Ð³Ð¾Ð´ Ð´Ð°Ñ‚Ð°Ð¼ÐµÑÑÑ† Ð´Ð°Ñ‚Ð°Ñ‡Ð¸ÑÐ»Ð¾ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒÐ¼ÐµÑÑÑ† Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑŒÑ€Ð°Ð±Ð¾Ñ‚ÑƒÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾ÐºÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ Ð·Ð°Ð¿Ð¸ÑÑŒÐ¶ÑƒÑ€Ð½Ð°Ð»Ð°Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ð¸ Ð·Ð°Ð¿ÑƒÑÑ‚Ð¸Ñ‚ÑŒÐ¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ Ð·Ð°Ñ„Ð¸ÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²ÑÑ‚Ñ€Ð¾ÐºÑƒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²ÑÑ‚Ñ€Ð¾ÐºÑƒÐ²Ð½ÑƒÑ‚Ñ€ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ²Ñ„Ð°Ð¹Ð» Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·ÑÑ‚Ñ€Ð¾ÐºÐ¸ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·ÑÑ‚Ñ€Ð¾ÐºÐ¸Ð²Ð½ÑƒÑ‚Ñ€ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÐµÐ¸Ð·Ñ„Ð°Ð¹Ð»Ð° Ð¸Ð¼ÑÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° Ð¸Ð¼ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ñ…Ñ„Ð°Ð¹Ð»Ð¾Ð² ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¸Ð± ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ ÐºÐ¾Ð´ÑÐ¸Ð¼Ð² ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°ÑÐ¸ÑÑ‚ÐµÐ¼Ñ‹ ÐºÐ¾Ð½Ð³Ð¾Ð´Ð° ÐºÐ¾Ð½ÐµÑ†Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ ÐºÐ¾Ð½ÐµÑ†Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ð½Ð½Ð¾Ð³Ð¾Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ ÐºÐ¾Ð½ÐµÑ†ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¾Ð³Ð¾Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð° ÐºÐ¾Ð½ÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»Ð° ÐºÐ¾Ð½Ð¼ÐµÑÑÑ†Ð° ÐºÐ¾Ð½Ð½ÐµÐ´ÐµÐ»Ð¸ Ð»ÐµÐ² Ð»Ð¾Ð³ Ð»Ð¾Ð³10 Ð¼Ð°ÐºÑ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¾ÐµÐºÐ¾Ð»Ð¸Ñ‡ÐµÑÑ‚Ð²Ð¾ÑÑƒÐ±ÐºÐ¾Ð½Ñ‚Ð¾ Ð¼Ð¸Ð½ Ð¼Ð¾Ð½Ð¾Ð¿Ð¾Ð»ÑŒÐ½Ñ‹Ð¹Ñ€ÐµÐ¶Ð¸Ð¼ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹ÑÐ° Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ½Ð°Ð±Ð¾Ñ€Ð°Ð¿Ñ€Ð°Ð² Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒÐ²Ð¸Ð´ Ð½Ð°Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÑŒÑÑ‡ÐµÑ‚ Ð½Ð°Ð¹Ñ‚Ð¸ Ð½Ð°Ð¹Ñ‚Ð¸Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹ÐµÐ½Ð°ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ðµ Ð½Ð°Ð¹Ñ‚Ð¸ÑÑÑ‹Ð»ÐºÐ¸ Ð½Ð°Ñ‡Ð°Ð»Ð¾Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð°Ð±Ð¸ Ð½Ð°Ñ‡Ð°Ð»Ð¾ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð¾Ð³Ð¾Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð° Ð½Ð°Ñ‡Ð°Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð½Ð°Ñ‡Ð³Ð¾Ð´Ð° Ð½Ð°Ñ‡ÐºÐ²Ð°Ñ€Ñ‚Ð°Ð»Ð° Ð½Ð°Ñ‡Ð¼ÐµÑÑÑ†Ð° Ð½Ð°Ñ‡Ð½ÐµÐ´ÐµÐ»Ð¸ Ð½Ð¾Ð¼ÐµÑ€Ð´Ð½ÑÐ³Ð¾Ð´Ð° Ð½Ð¾Ð¼ÐµÑ€Ð´Ð½ÑÐ½ÐµÐ´ÐµÐ»Ð¸ Ð½Ð¾Ð¼ÐµÑ€Ð½ÐµÐ´ÐµÐ»Ð¸Ð³Ð¾Ð´Ð° Ð½Ñ€ÐµÐ³ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¾ÐºÑ€ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸ÐµÐ¾ÑˆÐ¸Ð±ÐºÐ¸ Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹Ð¶ÑƒÑ€Ð½Ð°Ð»Ñ€Ð°ÑÑ‡ÐµÑ‚Ð¾Ð² Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹Ð¿Ð»Ð°Ð½ÑÑ‡ÐµÑ‚Ð¾Ð² Ð¾ÑÐ½Ð¾Ð²Ð½Ð¾Ð¹ÑÐ·Ñ‹Ðº Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒÑ„Ð¾Ñ€Ð¼Ñƒ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒÑ„Ð¾Ñ€Ð¼ÑƒÐ¼Ð¾Ð´Ð°Ð»ÑŒÐ½Ð¾ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒÑ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ Ð¾Ñ‡Ð¸ÑÑ‚Ð¸Ñ‚ÑŒÐ¾ÐºÐ½Ð¾ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ð¹ Ð¿ÐµÑ€Ð¸Ð¾Ð´ÑÑ‚Ñ€ Ð¿Ð¾Ð»Ð½Ð¾ÐµÐ¸Ð¼ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ²Ñ€ÐµÐ¼ÑÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ´Ð°Ñ‚ÑƒÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑÐ¾Ñ‚Ð±Ð¾Ñ€Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÑ‚Ð° Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÐ¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÑ‚Ð° Ð¿Ñ€Ð°Ð² Ð¿Ñ€Ð°Ð²Ð¾Ð´Ð¾ÑÑ‚ÑƒÐ¿Ð° Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑÐ°Ð²Ñ‚Ð¾Ð½ÑƒÐ¼ÐµÑ€Ð°Ñ†Ð¸Ð¸ Ð¿ÑƒÑÑ‚Ð°ÑÑÑ‚Ñ€Ð¾ÐºÐ° Ð¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ñ€Ð°Ð±Ð¾Ñ‡Ð°ÑÐ´Ð°Ñ‚Ñ‚ÑŒÐ¿ÑƒÑÑ‚Ð¾ÐµÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ Ñ€Ð°Ð±Ð¾Ñ‡Ð°ÑÐ´Ð°Ñ‚Ð° Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÑÑ‚Ñ€Ð°Ð½Ð¸Ñ† Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÑŒÑÑ‚Ñ€Ð¾Ðº Ñ€Ð°Ð·Ð¼ Ñ€Ð°Ð·Ð¾Ð±Ñ€Ð°Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð° Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ñ‚ÑŒÑ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ñ‹Ð½Ð° Ñ€Ð°ÑÑÑ‡Ð¸Ñ‚Ð°Ñ‚ÑŒÑ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ñ‹Ð¿Ð¾ ÑÐ¸Ð³Ð½Ð°Ð» ÑÐ¸Ð¼Ð² ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ‚Ð°Ð±ÑƒÐ»ÑÑ†Ð¸Ð¸ ÑÐ¾Ð·Ð´Ð°Ñ‚ÑŒÐ¾Ð±ÑŠÐµÐºÑ‚ ÑÐ¾ÐºÑ€Ð» ÑÐ¾ÐºÑ€Ð»Ð¿ ÑÐ¾ÐºÑ€Ð¿ ÑÐ¾Ð¾Ð±Ñ‰Ð¸Ñ‚ÑŒ ÑÐ¾ÑÑ‚Ð¾ÑÐ½Ð¸Ðµ ÑÐ¾Ñ…Ñ€Ð°Ð½Ð¸Ñ‚ÑŒÐ·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ ÑÑ€ÐµÐ´ ÑÑ‚Ð°Ñ‚ÑƒÑÐ²Ð¾Ð·Ð²Ñ€Ð°Ñ‚Ð° ÑÑ‚Ñ€Ð´Ð»Ð¸Ð½Ð° ÑÑ‚Ñ€Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ ÑÑ‚Ñ€ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑÑ‚Ð²Ð¾ÑÑ‚Ñ€Ð¾Ðº ÑÑ‚Ñ€Ð¿Ð¾Ð»ÑƒÑ‡Ð¸Ñ‚ÑŒÑÑ‚Ñ€Ð¾ÐºÑƒ  ÑÑ‚Ñ€Ñ‡Ð¸ÑÐ»Ð¾Ð²Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ð¹ ÑÑ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒÐ¿Ð¾Ð·Ð¸Ñ†Ð¸ÑŽÐ´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð° ÑÑ‡ÐµÑ‚Ð¿Ð¾ÐºÐ¾Ð´Ñƒ Ñ‚ÐµÐºÑƒÑ‰Ð°ÑÐ´Ð°Ñ‚Ð° Ñ‚ÐµÐºÑƒÑ‰ÐµÐµÐ²Ñ€ÐµÐ¼Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¸Ð¿Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸ÑÑÑ‚Ñ€ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒÐ¾Ð±ÑŠÐµÐºÑ‚Ñ‹ ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÑ‚Ð°Ð½Ð° ÑƒÑÑ‚Ð°Ð½Ð¾Ð²Ð¸Ñ‚ÑŒÑ‚Ð°Ð¿Ð¾ Ñ„Ð¸ÐºÑÑˆÐ°Ð±Ð»Ð¾Ð½ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ Ñ†ÐµÐ» ÑˆÐ°Ð±Ð»Ð¾Ð½\";var a={cN:\"dquote\",b:'\"\"'};var d={cN:\"string\",b:'\"',e:'\"|$',c:[a]};var g={cN:\"string\",b:\"\\\\|\",e:'\"|$',c:[a]};return{cI:true,l:f,k:{keyword:c,built_in:e},c:[b.CLCM,b.NM,d,g,{cN:\"function\",b:\"(Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°|Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ)\",e:\"$\",l:f,k:\"Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð° Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ\",c:[b.inherit(b.TM,{b:f}),{cN:\"tail\",eW:true,c:[{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",l:f,k:\"Ð·Ð½Ð°Ñ‡\",c:[d,g]},{cN:\"export\",b:\"ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\",eW:true,l:f,k:\"ÑÐºÑÐ¿Ð¾Ñ€Ñ‚\",c:[b.CLCM]}]},b.CLCM]},{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"date\",b:\"'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})'\"}]}});hljs.registerLanguage(\"javascript\",function(a){return{aliases:[\"js\"],k:{keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require\"},c:[{cN:\"pi\",b:/^\\s*('|\")use strict('|\")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:\"(\"+a.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[a.CLCM,a.CBLCLM,a.REGEXP_MODE,{b:/</,e:/>;/,r:0,sL:\"xml\"}],r:0},{cN:\"function\",bK:\"function\",e:/\\{/,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:\"params\",b:/\\(/,e:/\\)/,c:[a.CLCM,a.CBLCLM],i:/[\"'\\(]/}],i:/\\[|%/},{b:/\\$[(.]/},{b:\"\\\\.\"+a.IR,r:0}]}});hljs.registerLanguage(\"vbnet\",function(a){return{cI:true,k:{keyword:\"addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass namespace narrowing new next not notinheritable notoverridable of off on operator option optional or order orelse overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim rem removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly xor\",built_in:\"boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype date decimal directcast double gettype getxmlnamespace iif integer long object sbyte short single string trycast typeof uinteger ulong ushort\",literal:\"true false nothing\"},i:\"//|{|}|endif|gosub|variant|wend\",c:[a.inherit(a.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:\"'\",e:\"$\",rB:true,c:[{cN:\"xmlDocTag\",b:\"'''|<!--|-->\"},{cN:\"xmlDocTag\",b:\"</?\",e:\">\"},]},a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",k:\"if else elseif end region externalsource\"},]}});hljs.registerLanguage(\"fsharp\",function(a){return{k:\"abstract and as assert base begin class default delegate do done downcast downto elif else end exception extern false finally for fun function global if in inherit inline interface internal lazy let match member module mutable namespace new null of open or override private public rec return sig static struct then to true try type upcast use val void when while with yield\",c:[{cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\"},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[a.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},{cN:\"attribute\",b:\"\\\\B('[A-Za-z])\\\\b\",c:[a.BE]},a.CLCM,a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage(\"matlab\",function(a){var b=[a.CNM,{cN:\"string\",b:\"'\",e:\"'\",c:[a.BE,{b:\"''\"}]}];return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson\"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},{cN:\"params\",b:\"\\\\[\",e:\"\\\\]\"}]},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",c:b,r:0},{cN:\"cell\",b:\"\\\\{\",e:\"\\\\}'*[\\\\.']*\",c:b,i:/:/},{cN:\"comment\",b:\"\\\\%\",e:\"$\"}].concat(b)}});hljs.registerLanguage(\"applescript\",function(a){var b=a.inherit(a.QSM,{i:\"\"});var d={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",a.CNM,b]};var c=[{cN:\"comment\",b:\"--\",e:\"$\",},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\",{b:\"--\",e:\"$\"}]},a.HCM];return{k:{keyword:\"about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the then third through thru timeout times to transaction try until where while whose with without\",constant:\"AppleScript false linefeed return pi quote result space tab true\",type:\"alias application boolean class constant date file integer list number real record string text\",command:\"activate beep count delay launch log offset read round run say summarize write\",property:\"character characters contents day frontmost id item length month name paragraph paragraphs rest reverse running time version weekday word words year\"},c:[b,a.CNM,{cN:\"type\",b:\"\\\\bPOSIX file\\\\b\"},{cN:\"command\",b:\"\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|mount volume|path to|(close|open for) access|(get|set) eof|current date|do shell script|get volume settings|random number|set volume|system attribute|system info|time to GMT|(load|run|store) script|scripting components|ASCII (character|number)|localized string|choose (application|color|file|file name|folder|from list|remote application|URL)|display (alert|dialog))\\\\b|^\\\\s*return\\\\b\"},{cN:\"constant\",b:\"\\\\b(text item delimiters|current application|missing value)\\\\b\"},{cN:\"keyword\",b:\"\\\\b(apart from|aside from|instead of|out of|greater than|isn't|(doesn't|does not) (equal|come before|come after|contain)|(greater|less) than( or equal)?|(starts?|ends|begins?) with|contained by|comes (before|after)|a (ref|reference))\\\\b\"},{cN:\"property\",b:\"\\\\b(POSIX path|(date|time) string|quoted form)\\\\b\"},{cN:\"function_start\",bK:\"on\",i:\"[${=;\\\\n]\",c:[a.UTM,d]}].concat(c),i:\"//\"}});hljs.registerLanguage(\"delphi\",function(b){var a=\"exports register file shl array record property for mod while set ally label uses raise not stored class safecall var interface or private static exit index inherited to else stdcall override shr asm far resourcestring finalization packed virtual out and protected library do xorwrite goto near function end div overload object unit begin string on inline repeat until destructor write message program with read initialization except default nil if case cdecl in downto threadvar of try pascal const external constructor type public then implementation finally published procedure\";var e={cN:\"comment\",v:[{b:/\\{/,e:/\\}/,r:0},{b:/\\(\\*/,e:/\\*\\)/,r:10}]};var c={cN:\"string\",b:/'/,e:/'/,c:[{b:/''/}]};var d={cN:\"string\",b:/(#\\d+)+/};var f={b:b.IR+\"\\\\s*=\\\\s*class\\\\s*\\\\(\",rB:true,c:[b.TM]};var g={cN:\"function\",bK:\"function constructor destructor procedure\",e:/[:;]/,k:\"function constructor|10 destructor|10 procedure|10\",c:[b.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:a,c:[c,d]},e]};return{cI:true,k:a,i:/(\"|\\$[G-Zg-z]|\\/\\*|<\\/)/,c:[e,b.CLCM,c,d,b.NM,f,g]}});hljs.registerLanguage(\"cpp\",function(a){var b={keyword:\"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary\",built_in:\"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf\"};return{aliases:[\"c\"],k:b,i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:\"string\",b:\"'\\\\\\\\?.\",e:\"'\",i:\".\"},{cN:\"number\",b:\"\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)\"},a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\",c:[{b:\"include\\\\s*<\",e:\">\",i:\"\\\\n\"},a.CLCM]},{cN:\"stl_container\",b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:b,r:10,c:[\"self\"]}]}});hljs.registerLanguage(\"json\",function(a){var e={literal:\"true false null\"};var d=[a.QSM,a.CNM];var c={cN:\"value\",e:\",\",eW:true,eE:true,c:d,k:e};var b={b:\"{\",e:\"}\",c:[{cN:\"attribute\",b:'\\\\s*\"',e:'\"\\\\s*:\\\\s*',eB:true,eE:true,c:[a.BE],i:\"\\\\n\",starts:c}],i:\"\\\\S\"};var f={b:\"\\\\[\",e:\"\\\\]\",c:[a.inherit(c,{cN:null})],i:\"\\\\S\"};d.splice(d.length,0,b,f);return{c:d,k:e,i:\"\\\\S\"}});hljs.registerLanguage(\"perl\",function(c){var d=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\";var f={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:d};var g={b:\"->{\",e:\"}\"};var a={cN:\"variable\",v:[{b:/\\$\\d/},{b:/[\\$\\%\\@\\*](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},{b:/[\\$\\%\\@\\*][^\\s\\w{]/,r:0}]};var e={cN:\"comment\",b:\"^(__END__|__DATA__)\",e:\"\\\\n$\",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:\"comment\",b:\"^\\\\=\\\\w\",e:\"\\\\=cut\",eW:true},g,{cN:\"string\",c:h,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",r:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",r:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",r:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",r:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",r:5},{b:\"qw\\\\s+q\",e:\"q\",r:5},{b:\"'\",e:\"'\",c:[c.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[c.BE]},{b:\"{\\\\w+}\",c:[],r:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],r:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",r:0},{b:\"(\\\\/\\\\/|\"+c.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",r:0,c:[c.HCM,e,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",r:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[c.BE],r:0}]},{cN:\"sub\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",r:5},{cN:\"operator\",b:\"-\\\\w\\\\b\",r:0}];f.c=b;g.c=b;return{k:d,c:b}});hljs.registerLanguage(\"markdown\",function(a){return{c:[{cN:\"header\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",r:0},{cN:\"bullet\",b:\"^([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",r:0}]},{cN:\"blockquote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"`.+?`\"},{b:\"^( {4}|\\t)\",e:\"$\",r:0}]},{cN:\"horizontal_rule\",b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]\",rB:true,c:[{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,rE:true,r:0},{cN:\"link_url\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:true,eE:true},{cN:\"link_reference\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:true,eE:true,}],r:10},{b:\"^\\\\[.+\\\\]:\",e:\"$\",rB:true,c:[{cN:\"link_reference\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true},{cN:\"link_url\",b:\"\\\\s\",e:\"$\"}]}]}});hljs.registerLanguage(\"ocaml\",function(a){return{k:{keyword:\"and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec ref sig struct then to true try type val virtual when while with parser value\",built_in:\"bool char float int list unit array exn option int32 int64 nativeint format4 format6 lazy_t in_channel out_channel string\",},i:/\\/\\//,c:[{cN:\"string\",b:'\"\"\"',e:'\"\"\"'},{cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",c:[\"self\"]},{cN:\"class\",bK:\"type\",e:\"\\\\(|=|$\",c:[a.UTM]},{cN:\"annotation\",b:\"\\\\[<\",e:\">\\\\]\"},a.CBLCLM,a.inherit(a.ASM,{i:null}),a.inherit(a.QSM,{i:null}),a.CNM]}});hljs.registerLanguage(\"d\",function(x){var b={keyword:\"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__\",built_in:\"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring\",literal:\"false null true\"};var c=\"(0|[1-9][\\\\d_]*)\",q=\"(0|[1-9][\\\\d_]*|\\\\d[\\\\d_]*|[\\\\d_]+?\\\\d)\",h=\"0[bB][01_]+\",v=\"([\\\\da-fA-F][\\\\da-fA-F_]*|_[\\\\da-fA-F][\\\\da-fA-F_]*)\",y=\"0[xX]\"+v,p=\"([eE][+-]?\"+q+\")\",o=\"(\"+q+\"(\\\\.\\\\d*|\"+p+\")|\\\\d+\\\\.\"+q+q+\"|\\\\.\"+c+p+\"?)\",k=\"(0[xX](\"+v+\"\\\\.\"+v+\"|\\\\.?\"+v+\")[pP][+-]?\"+q+\")\",l=\"(\"+c+\"|\"+h+\"|\"+y+\")\",n=\"(\"+k+\"|\"+o+\")\";var z=\"\\\\\\\\(['\\\"\\\\?\\\\\\\\abfnrtv]|u[\\\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\\\dA-Fa-f]{2}|U[\\\\dA-Fa-f]{8})|&[a-zA-Z\\\\d]{2,};\";var m={cN:\"number\",b:\"\\\\b\"+l+\"(L|u|U|Lu|LU|uL|UL)?\",r:0};var j={cN:\"number\",b:\"\\\\b(\"+n+\"([fF]|L|i|[fF]i|Li)?|\"+l+\"(i|[fF]i|Li))\",r:0};var s={cN:\"string\",b:\"'(\"+z+\"|.)\",e:\"'\",i:\".\"};var r={b:z,r:0};var w={cN:\"string\",b:'\"',c:[r],e:'\"[cwd]?'};var f={cN:\"string\",b:'[rq]\"',e:'\"[cwd]?',r:5};var u={cN:\"string\",b:\"`\",e:\"`[cwd]?\"};var i={cN:\"string\",b:'x\"[\\\\da-fA-F\\\\s\\\\n\\\\r]*\"[cwd]?',r:10};var t={cN:\"string\",b:'q\"\\\\{',e:'\\\\}\"'};var e={cN:\"shebang\",b:\"^#!\",e:\"$\",r:5};var g={cN:\"preprocessor\",b:\"#(line)\",e:\"$\",r:5};var d={cN:\"keyword\",b:\"@[a-zA-Z_][a-zA-Z_\\\\d]*\"};var a={cN:\"comment\",b:\"\\\\/\\\\+\",c:[\"self\"],e:\"\\\\+\\\\/\",r:10};return{l:x.UIR,k:b,c:[x.CLCM,x.CBLCLM,a,i,w,f,u,t,j,m,s,e,g,d]}});hljs.registerLanguage(\"coffeescript\",function(c){var b={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",reserved:\"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf\",built_in:\"npm require console print module exports global window document\"};var a=\"[A-Za-z$_][0-9A-Za-z$_]*\";var f=c.inherit(c.TM,{b:a});var e={cN:\"subst\",b:/#\\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:\"(\\\\s*/)?\",r:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[c.BE,e]},{b:/\"/,e:/\"/,c:[c.BE,e]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[e,c.HCM]},{b:\"//[gim]*\",r:0},{b:\"/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)\"}]},{cN:\"property\",b:\"@\"+a},{b:\"`\",e:\"`\",eB:true,eE:true,sL:\"javascript\"}];e.c=d;return{k:b,c:d.concat([{cN:\"comment\",b:\"###\",e:\"###\"},c.HCM,{cN:\"function\",b:\"(\"+a+\"\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",e:\"[-=]>\",rB:true,c:[f,{cN:\"params\",b:\"\\\\(\",rB:true,c:[{b:/\\(/,e:/\\)/,k:b,c:[\"self\"].concat(d)}]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:true,i:/[:=\"\\[\\]]/,c:[f]},f]},{cN:\"attribute\",b:a+\":\",e:\":\",rB:true,eE:true,r:0}])}});hljs.registerLanguage(\"lua\",function(b){var a=\"\\\\[=*\\\\[\";var e=\"\\\\]=*\\\\]\";var c={b:a,e:e,c:[\"self\"]};var d=[{cN:\"comment\",b:\"--(?!\"+a+\")\",e:\"$\"},{cN:\"comment\",b:\"--\"+a,e:e,c:[c],r:10}];return{l:b.UIR,k:{keyword:\"and break do else elseif end false for if in local nil not or repeat return then true until while\",built_in:\"_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug io math os package string table\"},c:d.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[b.inherit(b.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:true,c:d}].concat(d)},b.CNM,b.ASM,b.QSM,{cN:\"string\",b:a,e:e,c:[c],r:10}])}});hljs.registerLanguage(\"makefile\",function(a){var b={cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[a.BE]};return{c:[a.HCM,{b:/^\\w+\\s*\\W*=/,rB:true,r:0,starts:{cN:\"constant\",e:/\\s*\\W*=/,eE:true,starts:{e:/$/,r:0,c:[b],}}},{cN:\"title\",b:/^[\\w]+:\\s*$/},{cN:\"phony\",b:/^\\.PHONY:/,e:/$/,k:\".PHONY\",l:/[\\.\\w]+/},{b:/^\\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage(\"rsl\",function(a){return{k:{keyword:\"float color point normal vector matrix while for if do return else break extern continue\",built_in:\"abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp faceforward filterstep floor format fresnel incident length lightsource log match max min mod noise normalize ntransform opposite option phong pnoise pow printf ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan texture textureinfo trace transform vtransform xcomp ycomp zcomp\"},i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,a.ASM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"shader\",bK:\"surface displacement light volume imager\",e:\"\\\\(\"},{cN:\"shading\",bK:\"illuminate illuminance gather\",e:\"\\\\(\"}]}});hljs.registerLanguage(\"vbscript\",function(a){return{cI:true,k:{keyword:\"call class const dim do loop erase execute executeglobal exit for each next function if then else on error option explicit new private property let get public randomize redim rem select case set stop sub while wend with end to elseif is or xor and not class_initialize class_terminate default preserve in me byval byref step resume goto\",built_in:\"lcase month vartype instrrev ubound setlocale getobject rgb getref string weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency conversions csng timevalue second year space abs clng timeserial fixs len asc isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion scriptengine split scriptengineminorversion cint sin datepart ltrim sqr scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw chrw regexp server response request cstr err\",literal:\"true false null nothing empty\"},i:\"//\",c:[a.inherit(a.QSM,{c:[{b:'\"\"'}]}),{cN:\"comment\",b:/'/,e:/$/,r:0},a.CNM]}});hljs.registerLanguage(\"go\",function(a){var b={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer\",constant:\"true false iota nil\",typename:\"bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:b,i:\"</\",c:[a.CLCM,a.CBLCLM,a.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\"},{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"number\",b:\"[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?\",r:0},a.CNM]}});hljs.registerLanguage(\"axapta\",function(a){return{k:\"false int abstract private char boolean static null if for true while long throw finally protected final return void enum else break new catch byte super case short default double public try this switch continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count order group by asc desc index hint like dispaly edit client server ttsbegin ttscommit str real date container anytype common div mod\",c:[a.CLCM,a.CBLCLM,a.ASM,a.QSM,a.CNM,{cN:\"preprocessor\",b:\"#\",e:\"$\"},{cN:\"class\",bK:\"class interface\",e:\"{\",i:\":\",c:[{cN:\"inheritance\",bK:\"extends implements\",r:10},a.UTM]}]}});hljs.registerLanguage(\"vala\",function(a){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface delegate namespace\",e:\"{\",i:\"[^,:\\\\n\\\\s\\\\.]\",c:[a.UTM]},a.CLCM,a.CBLCLM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',r:5},a.ASM,a.QSM,a.CNM,{cN:\"preprocessor\",b:\"^#\",e:\"$\",r:2},{cN:\"constant\",b:\" [A-Z_]+ \",r:0}]}});hljs.registerLanguage(\"erlang\",function(i){var c=\"[a-z'][a-zA-Z0-9_']*\";var o=\"(\"+c+\":\"+c+\"|\"+c+\")\";var f={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let not of orelse|10 query receive rem try when xor\",literal:\"false true\"};var l={cN:\"comment\",b:\"%\",e:\"$\",r:0};var e={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0};var g={b:\"fun\\\\s+\"+c+\"/\\\\d+\"};var n={b:o+\"\\\\(\",e:\"\\\\)\",rB:true,r:0,c:[{cN:\"function_name\",b:o,r:0},{b:\"\\\\(\",e:\"\\\\)\",eW:true,rE:true,r:0}]};var h={cN:\"tuple\",b:\"{\",e:\"}\",r:0};var a={cN:\"variable\",b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",r:0};var m={cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_]*\",r:0};var b={b:\"#\"+i.UIR,r:0,rB:true,c:[{cN:\"record_name\",b:\"#\"+i.UIR,r:0},{b:\"{\",e:\"}\",r:0}]};var k={bK:\"fun receive if try case\",e:\"end\",k:f};k.c=[l,g,i.inherit(i.ASM,{cN:\"\"}),k,n,i.QSM,e,h,a,m,b];var j=[l,g,k,n,i.QSM,e,h,a,m,b];n.c[1].c=j;h.c=j;b.c[1].c=j;var d={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:j};return{k:f,i:\"(</|\\\\*=|\\\\+=|-=|/=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+c+\"\\\\s*\\\\(\",e:\"->\",rB:true,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[d,i.inherit(i.TM,{b:c})],starts:{e:\";|\\\\.\",k:f,c:j}},l,{cN:\"pp\",b:\"^-\",e:\"\\\\.\",r:0,eE:true,rB:true,l:\"-\"+i.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior\",c:[d]},e,i.QSM,b,a,m,h]}});hljs.registerLanguage(\"sql\",function(a){return{cI:true,i:/[<>]/,c:[{cN:\"operator\",b:\"\\\\b(begin|end|start|commit|rollback|savepoint|lock|alter|create|drop|rename|call|delete|do|handler|insert|load|replace|select|truncate|update|set|show|pragma|grant|merge)\\\\b(?!:)\",e:\";\",eW:true,k:{keyword:\"all partial global month current_timestamp using go revoke smallint indicator end-exec disconnect zone with character assertion to add current_user usage input local alter match collate real then rollback get read timestamp session_user not integer bit unique day minute desc insert execute like ilike|2 level decimal drop continue isolation found where constraints domain right national some module transaction relative second connect escape close system_user for deferred section cast current sqlstate allocate intersect deallocate numeric public preserve full goto initially asc no key output collation group by union session both last language constraint column of space foreign deferrable prior connection unknown action commit view or first into float year primary cascaded except restrict set references names table outer open select size are rows from prepare distinct leading create only next inner authorization schema corresponding option declare precision immediate else timezone_minute external varying translation true case exception join hour default double scroll value cursor descriptor values dec fetch procedure delete and false int is describe char as at in varchar null trailing any absolute current_time end grant privileges when cross check write current_date pad begin temporary exec time update catalog user sql date on identity timezone_hour natural whenever interval work order cascade diagnostics nchar having left call do handler load replace truncate start lock show pragma exists number trigger if before after each row merge matched database\",aggregate:\"count sum min max avg\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[a.BE,{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[a.BE,{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\",c:[a.BE]},a.CNM]},a.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"}]}});hljs.registerLanguage(\"mizar\",function(a){return{k:[\"environ vocabularies notations constructors definitions registrations theorems schemes requirements\",\"begin end definition registration cluster existence pred func defpred deffunc theorem proof\",\"let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from\",\"be being by means equals implies iff redefine define now not or attr is mode suppose per cases set\",\"thesis contradiction scheme reserve struct\",\"correctness compatibility coherence symmetry assymetry reflexivity irreflexivity\",\"connectedness uniqueness commutativity idempotence involutiveness projectivity\"].join(\" \"),c:[{cN:\"comment\",b:\"::\",e:\"$\"}]}});hljs.registerLanguage(\"lasso\",function(d){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*\";var i=\"<\\\\?(lasso(script)?|=)\";var c=\"\\\\]|\\\\?>\";var g={literal:\"true false none minimal full all void and or not bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft\",built_in:\"array date decimal duration integer map pair string tag xml null bytes list queue set stack staticarray tie local var variable global data self inherited\",keyword:\"error_code error_msg error_pop error_push error_reset cache database_names database_schemanames database_tablenames define_tag define_type email_batch encode_set html_comment handle handle_error header if inline iterate ljax_target link link_currentaction link_currentgroup link_currentrecord link_detail link_firstgroup link_firstrecord link_lastgroup link_lastrecord link_nextgroup link_nextrecord link_prevgroup link_prevrecord log loop namespace_using output_none portal private protect records referer referrer repeating resultset rows search_args search_arguments select sort_args sort_arguments thread_atomic value_list while abort case else if_empty if_false if_null if_true loop_abort loop_continue loop_count params params_up return return_value run_children soap_definetag soap_lastrequest soap_lastresponse tag_name ascending average by define descending do equals frozen group handle_failure import in into join let match max min on order parent protected provide public require returnhome skip split_thread sum take thread to trait type where with yield yieldhome\"};var a={cN:\"comment\",b:\"<!--\",e:\"-->\",r:0};var j={cN:\"preprocessor\",b:\"\\\\[noprocess\\\\]\",starts:{cN:\"markup\",e:\"\\\\[/noprocess\\\\]\",rE:true,c:[a]}};var e={cN:\"preprocessor\",b:\"\\\\[/noprocess|\"+i};var h={cN:\"variable\",b:\"'\"+b+\"'\"};var f=[d.CLCM,{cN:\"javadoc\",b:\"/\\\\*\\\\*!\",e:\"\\\\*/\"},d.CBLCLM,d.inherit(d.CNM,{b:d.CNR+\"|-?(infinity|nan)\\\\b\"}),d.inherit(d.ASM,{i:null}),d.inherit(d.QSM,{i:null}),{cN:\"string\",b:\"`\",e:\"`\"},{cN:\"variable\",v:[{b:\"[#$]\"+b},{b:\"#\",e:\"\\\\d+\",i:\"\\\\W\"}]},{cN:\"tag\",b:\"::\\\\s*\",e:b,i:\"\\\\W\"},{cN:\"attribute\",b:\"\\\\.\\\\.\\\\.|-\"+d.UIR},{cN:\"subst\",v:[{b:\"->\\\\s*\",c:[h]},{b:\":=|/(?!\\\\w)=?|[-+*%=<>&|!?\\\\\\\\]+\",r:0}]},{cN:\"built_in\",b:\"\\\\.\\\\.?\",r:0,c:[h]},{cN:\"class\",bK:\"define\",rE:true,e:\"\\\\(|=>\",c:[d.inherit(d.TM,{b:d.UIR+\"(=(?!>))?\"})]}];return{aliases:[\"ls\",\"lassoscript\"],cI:true,l:b+\"|&[lg]t;\",k:g,c:[{cN:\"preprocessor\",b:c,r:0,starts:{cN:\"markup\",e:\"\\\\[|\"+i,rE:true,r:0,c:[a]}},j,e,{cN:\"preprocessor\",b:\"\\\\[no_square_brackets\",starts:{e:\"\\\\[/no_square_brackets\\\\]\",l:b+\"|&[lg]t;\",k:g,c:[{cN:\"preprocessor\",b:c,r:0,starts:{cN:\"markup\",e:i,rE:true,c:[a]}},j,e].concat(f)}},{cN:\"preprocessor\",b:\"\\\\[\",r:0},{cN:\"shebang\",b:\"^#!.+lasso9\\\\b\",r:10}].concat(f)}});hljs.registerLanguage(\"r\",function(a){var b=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[a.HCM,{b:b,l:b,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch|10 stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...|10\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},r:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",r:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",r:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",r:0},{b:\"`\",e:\"`\",r:0},{cN:\"string\",c:[a.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"scala\",function(a){var c={cN:\"annotation\",b:\"@[A-Za-z]+\"};var b={cN:\"string\",b:'u?r?\"\"\"',e:'\"\"\"',r:10};return{k:\"type yield lazy override def with val var false true sealed abstract private trait object null if for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws\",c:[{cN:\"javadoc\",b:\"/\\\\*\\\\*\",e:\"\\\\*/\",c:[{cN:\"javadoctag\",b:\"@[A-Za-z]+\"}],r:10},a.CLCM,a.CBLCLM,b,a.ASM,a.QSM,{cN:\"class\",b:\"((case )?class |object |trait )\",e:\"({|$)\",i:\":\",k:\"case class trait object\",c:[{bK:\"extends with\",r:10},a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[a.ASM,a.QSM,b,c]}]},a.CNM,c]}});hljs.registerLanguage(\"livecodeserver\",function(a){var e={cN:\"variable\",b:\"\\\\b[gtps][A-Z]+[A-Za-z0-9_\\\\-]*\\\\b|\\\\$_[A-Z]+\",r:0};var b={cN:\"comment\",e:\"$\",v:[a.CBLCLM,a.HCM,{b:\"--\",},{b:\"[^:]//\",}]};var d=a.inherit(a.TM,{v:[{b:\"\\\\b_*rig[A-Z]+[A-Za-z0-9_\\\\-]*\"},{b:\"\\\\b_[a-z0-9\\\\-]+\"}]});var c=a.inherit(a.TM,{b:\"\\\\b([A-Za-z0-9_\\\\-]+)\\\\b\"});return{cI:false,k:{keyword:\"after byte bytes english the until http forever descending using line real8 with seventh for stdout finally element word fourth before black ninth sixth characters chars stderr uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat end repeat URL in try into switch to words https token binfile each tenth as ticks tick system real4 by dateItems without char character ascending eighth whole dateTime numeric short first ftp integer abbreviated abbr abbrev private case while if\",constant:\"SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five quote empty one true return cr linefeed right backslash null seven tab three two RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK\",operator:\"div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within contains ends with begins the keys of keys\",built_in:\"put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset add breakpoint cancel clear local variable file word line folder directory URL close socket process combine constant convert create new alias folder directory decrypt delete variable word line folder directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split subtract union unload wait write\"},c:[e,{cN:\"keyword\",b:\"\\\\bend\\\\sif\\\\b\"},{cN:\"function\",bK:\"function\",e:\"$\",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:\"function\",bK:\"end\",e:\"$\",c:[c,d]},{cN:\"command\",bK:\"command on\",e:\"$\",c:[e,c,a.ASM,a.QSM,a.BNM,a.CNM,d]},{cN:\"command\",bK:\"end\",e:\"$\",c:[c,d]},{cN:\"preprocessor\",b:\"<\\\\?rev|<\\\\?lc|<\\\\?livecode\",r:10},{cN:\"preprocessor\",b:\"<\\\\?\"},{cN:\"preprocessor\",b:\"\\\\?>\"},b,a.ASM,a.QSM,a.BNM,a.CNM,d],i:\";$|^\\\\[|^=\"}});hljs.registerLanguage(\"profile\",function(a){return{c:[a.CNM,{cN:\"built_in\",b:\"{\",e:\"}$\",eB:true,eE:true,c:[a.ASM,a.QSM],r:0},{cN:\"filename\",b:\"[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}\",e:\":\",eE:true},{cN:\"header\",b:\"(ncalls|tottime|cumtime)\",e:\"$\",k:\"ncalls tottime|10 cumtime|10 filename\",r:10},{cN:\"summary\",b:\"function calls\",e:\"$\",c:[a.CNM],r:10},a.ASM,a.QSM,{cN:\"function\",b:\"\\\\(\",e:\"\\\\)$\",c:[a.UTM],r:0}]}});hljs.registerLanguage(\"php\",function(b){var e={cN:\"variable\",b:\"\\\\$+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*\"};var a={cN:\"preprocessor\",b:/<\\?(php)?|\\?>/};var c={cN:\"string\",c:[b.BE,a],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{cI:true,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[b.CLCM,b.HCM,{cN:\"comment\",b:\"/\\\\*\",e:\"\\\\*/\",c:[{cN:\"phpdoc\",b:\"\\\\s@[A-Za-z]+\"},a]},{cN:\"comment\",b:\"__halt_compiler.+?;\",eW:true,k:\"__halt_compiler\",l:b.UIR},{cN:\"string\",b:\"<<<['\\\"]?\\\\w+['\\\"]?$\",e:\"^\\\\w+;\",c:[b.BE]},a,e,{cN:\"function\",bK:\"function\",e:/[;{]/,i:\"\\\\$|\\\\[|%\",c:[b.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",e,b.CBLCLM,c,d]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\",r:10},b.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[b.UTM]},{bK:\"use\",e:\";\",c:[b.UTM]},{b:\"=>\"},c,d]}});hljs.registerLanguage(\"parser3\",function(a){return{sL:\"xml\",r:0,c:[{cN:\"comment\",b:\"^#\",e:\"$\"},{cN:\"comment\",b:\"\\\\^rem{\",e:\"}\",r:10,c:[{b:\"{\",e:\"}\",c:[\"self\"]}]},{cN:\"preprocessor\",b:\"^@(?:BASE|USE|CLASS|OPTIONS)$\",r:10},{cN:\"title\",b:\"@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$\"},{cN:\"variable\",b:\"\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?\"},{cN:\"keyword\",b:\"\\\\^[\\\\w\\\\-\\\\.\\\\:]+\"},{cN:\"number\",b:\"\\\\^#[0-9a-fA-F]+\"},a.CNM]}});hljs.registerLanguage(\"actionscript\",function(a){var c=\"[a-zA-Z_$][a-zA-Z0-9_$]*\";var b=\"([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)\";var d={cN:\"rest_arg\",b:\"[.]{3}\",e:c,r:10};return{k:{keyword:\"as break case catch class const continue default delete do dynamic each else extends final finally for function get if implements import in include instanceof interface internal is namespace native new override package private protected public return set static super switch this throw try typeof use var void while with\",literal:\"true false null undefined\"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{cN:\"package\",bK:\"package\",e:\"{\",c:[a.TM]},{cN:\"class\",bK:\"class interface\",e:\"{\",c:[{bK:\"extends implements\"},a.TM]},{cN:\"preprocessor\",bK:\"import include\",e:\";\"},{cN:\"function\",bK:\"function\",e:\"[{;]\",i:\"\\\\S\",c:[a.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,d]},{cN:\"type\",b:\":\",e:b,r:10}]}]}});hljs.registerLanguage(\"nginx\",function(c){var b={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+c.UIR}]};var a={eW:true,l:\"[a-z/_]+\",k:{built_in:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},r:0,i:\"=>\",c:[c.HCM,{cN:\"string\",c:[c.BE,b],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{cN:\"url\",b:\"([a-z]+):/\",e:\"\\\\s\",eW:true,eE:true},{cN:\"regexp\",c:[c.BE,b],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:true},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:true},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",r:0},b]};return{c:[c.HCM,{b:c.UIR+\"\\\\s\",e:\";|{\",rB:true,c:[c.inherit(c.UTM,{starts:a})],r:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"vhdl\",function(a){return{cI:true,k:{keyword:\"abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant context cover disconnect downto default else elsif end entity exit fairness file for force function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process property protected pure range record register reject release rem report restrict restrict_guarantee return rol ror select sequence severity shared signal sla sll sra srl strong subtype then to transport type unaffected units until use variable vmode vprop vunit wait when while with xnor xor\",typename:\"boolean bit character severity_level integer time delay_length natural positive string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector std_logic std_logic_vector unsigned signed boolean_vector integer_vector real_vector time_vector\"},i:\"{\",c:[a.CBLCLM,{cN:\"comment\",b:\"--\",e:\"$\"},a.QSM,a.CNM,{cN:\"literal\",b:\"'(U|X|0|1|Z|W|L|H|-)'\",c:[a.BE]},{cN:\"attribute\",b:\"'[A-Za-z](_?[A-Za-z0-9])*\",c:[a.BE]}]}});hljs.registerLanguage(\"fix\",function(a){return{c:[{b:/[^\\u2401\\u0001]+/,e:/[\\u2401\\u0001]/,eE:true,rB:true,rE:false,c:[{b:/([^\\u2401\\u0001=]+)/,e:/=([^\\u2401\\u0001=]+)/,rE:true,rB:false,cN:\"attribute\"},{b:/=/,e:/([\\u2401\\u0001])/,eE:true,eB:true,cN:\"string\"}]}],cI:true}});hljs.registerLanguage(\"diff\",function(a){return{c:[{cN:\"chunk\",r:10,v:[{b:/^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"header\",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\\-\\-\\-/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+\\+\\+/,e:/$/},{b:/\\*{5}/,e:/\\*{5}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"change\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"smalltalk\",function(a){var b=\"[a-z][a-zA-Z0-9_]*\";var d={cN:\"char\",b:\"\\\\$.{1}\"};var c={cN:\"symbol\",b:\"#\"+a.UIR};return{k:\"self super nil true false thisContext\",c:[{cN:\"comment\",b:'\"',e:'\"'},a.ASM,{cN:\"class\",b:\"\\\\b[A-Z][A-Za-z0-9_]*\",r:0},{cN:\"method\",b:b+\":\",r:0},a.CNM,c,d,{cN:\"localvars\",b:\"\\\\|[ ]*\"+b+\"([ ]+\"+b+\")*[ ]*\\\\|\",rB:true,e:/\\|/,i:/\\S/,c:[{b:\"(\\\\|[ ]*)?\"+b}]},{cN:\"array\",b:\"\\\\#\\\\(\",e:\"\\\\)\",c:[a.ASM,d,a.CNM,c]}]}});hljs.registerLanguage(\"clojure\",function(l){var e={built_in:\"def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize\"};var f=\"[a-zA-Z_0-9\\\\!\\\\.\\\\?\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#\\\\$';]+\";var a=\"[\\\\s:\\\\(\\\\{]+\\\\d+(\\\\.\\\\d+)?\";var d={cN:\"number\",b:a,r:0};var j=l.inherit(l.QSM,{i:null});var o={cN:\"comment\",b:\";\",e:\"$\",r:0};var n={cN:\"collection\",b:\"[\\\\[\\\\{]\",e:\"[\\\\]\\\\}]\"};var c={cN:\"comment\",b:\"\\\\^\"+f};var b={cN:\"comment\",b:\"\\\\^\\\\{\",e:\"\\\\}\"};var h={cN:\"attribute\",b:\"[:]\"+f};var m={cN:\"list\",b:\"\\\\(\",e:\"\\\\)\"};var g={eW:true,k:{literal:\"true false nil\"},r:0};var i={k:e,l:f,cN:\"title\",b:f,starts:g};m.c=[{cN:\"comment\",b:\"comment\"},i,g];g.c=[m,j,c,b,o,h,n,d];n.c=[m,j,c,o,h,n,d];return{i:/\\S/,c:[o,m,{cN:\"prompt\",b:/^=> /,starts:{e:/\\n\\n|\\Z/}}]}});hljs.registerLanguage(\"oxygene\",function(b){var g=\"abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained\";var a={cN:\"comment\",b:\"{\",e:\"}\",r:0};var e={cN:\"comment\",b:\"\\\\(\\\\*\",e:\"\\\\*\\\\)\",r:10};var c={cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]};var d={cN:\"string\",b:\"(#\\\\d+)+\"};var f={cN:\"function\",bK:\"function constructor destructor procedure method\",e:\"[:;]\",k:\"function constructor|10 destructor|10 procedure|10 method|10\",c:[b.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",k:g,c:[c,d]},a,e]};return{cI:true,k:g,i:'(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',c:[a,e,b.CLCM,c,d,b.NM,f,{cN:\"class\",b:\"=\\\\bclass\\\\b\",e:\"end;\",k:g,c:[c,d,a,e,b.CLCM,f]}]}});hljs.registerLanguage(\"asciidoc\",function(a){return{c:[{cN:\"comment\",b:\"^/{4,}\\\\n\",e:\"\\\\n/{4,}$\",r:10},{cN:\"comment\",b:\"^//\",e:\"$\",r:0},{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",r:10},{cN:\"header\",b:\"^(={1,5}) .+?( \\\\1)?$\",r:10},{cN:\"header\",b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\",r:10},{cN:\"attribute\",b:\"^:.+?:\",e:\"\\\\s\",eE:true,r:10},{cN:\"attribute\",b:\"^\\\\[.+?\\\\]$\",r:0},{cN:\"blockquote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",r:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",r:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",r:0}],r:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"label\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",r:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",r:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",r:0}],r:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",r:0},{cN:\"smartquote\",b:\"``.+?''\",r:10},{cN:\"smartquote\",b:\"`.+?'\",r:10},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",r:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",r:0},{cN:\"horizontal_rule\",b:\"^'{3,}[ \\\\t]*$\",r:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:true,c:[{b:\"(link|image:?):\",r:0},{cN:\"link_url\",b:\"\\\\w\",e:\"[^\\\\[]+\",r:0},{cN:\"link_label\",b:\"\\\\[\",e:\"\\\\]\",eB:true,eE:true,r:0}],r:10}]}});hljs.registerLanguage(\"erlang-repl\",function(a){return{k:{special_functions:\"spawn spawn_link self\",reserved:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"prompt\",b:\"^[0-9]+> \",r:10},{cN:\"comment\",b:\"%\",e:\"$\"},{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",r:0},a.ASM,a.QSM,{cN:\"constant\",b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{cN:\"arrow\",b:\"->\"},{cN:\"ok\",b:\"ok\"},{cN:\"exclamation_mark\",b:\"!\"},{cN:\"function_or_atom\",b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",r:0},{cN:\"variable\",b:\"[A-Z][a-zA-Z0-9_']*\",r:0}]}});hljs.registerLanguage(\"autohotkey\",function(b){var d={cN:\"escape\",b:\"`[\\\\s\\\\S]\"};var c={cN:\"comment\",b:\";\",e:\"$\",r:0};var a=[{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{cN:\"built_in\",bK:\"ComSpec Clipboard ClipboardAll ErrorLevel\"}];return{cI:true,k:{keyword:\"Break Continue Else Gosub If Loop Return While\",literal:\"A true false NOT AND OR\"},c:a.concat([d,b.inherit(b.QSM,{c:[d]}),c,{cN:\"number\",b:b.NR,r:0},{cN:\"var_expand\",b:\"%\",e:\"%\",i:\"\\\\n\",c:[d]},{cN:\"label\",c:[d],v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',r:0}]},{b:\",\\\\s*,\",r:10}])}});hljs.registerLanguage(\"scilab\",function(a){var b=[a.CNM,{cN:\"string\",b:\"'|\\\"\",e:\"'|\\\"\",c:[a.BE,{b:\"''\"}]}];return{k:{keyword:\"abort break case clear catch continue do elseif else endfunction end for functionglobal if pause return resume select try then while%f %F %t %T %pi %eps %inf %nan %e %i %z %s\",built_in:\"abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp errorexec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isemptyisinfisnan isvector lasterror length load linspace list listfiles log10 log2 logmax min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand realround sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tantype typename warning zeros matrix\"},i:'(\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function endfunction\",e:\"$\",k:\"function endfunction|10\",c:[a.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"},],},{cN:\"transposed_variable\",b:\"[a-zA-Z_][a-zA-Z_0-9]*('+[\\\\.']*|[\\\\.']+)\",e:\"\",r:0},{cN:\"matrix\",b:\"\\\\[\",e:\"\\\\]'*[\\\\.']*\",r:0,c:b},{cN:\"comment\",b:\"//\",e:\"$\"}].concat(b)}});\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/1c.js",
    "content": "/*\nLanguage: 1C\nAuthor: Yuri Ivanov <ivanov@supersoft.ru>\nContributors: Sergey Baranov <segyrn@yandex.ru>\n*/\n\nfunction(hljs){\n  var IDENT_RE_RU = '[a-zA-Zа-яА-Я][a-zA-Z0-9_а-яА-Я]*';\n  var OneS_KEYWORDS = 'возврат дата для если и или иначе иначеесли исключение конецесли ' +\n    'конецпопытки конецпроцедуры конецфункции конеццикла константа не перейти перем ' +\n    'перечисление по пока попытка прервать продолжить процедура строка тогда фс функция цикл ' +\n    'число экспорт';\n  var OneS_BUILT_IN = 'ansitooem oemtoansi ввестивидсубконто ввестидату ввестизначение ' +\n    'ввестиперечисление ввестипериод ввестиплансчетов ввестистроку ввестичисло вопрос ' +\n    'восстановитьзначение врег выбранныйплансчетов вызватьисключение датагод датамесяц ' +\n    'датачисло добавитьмесяц завершитьработусистемы заголовоксистемы записьжурналарегистрации ' +\n    'запуститьприложение зафиксироватьтранзакцию значениевстроку значениевстрокувнутр ' +\n    'значениевфайл значениеизстроки значениеизстрокивнутр значениеизфайла имякомпьютера ' +\n    'имяпользователя каталогвременныхфайлов каталогиб каталогпользователя каталогпрограммы ' +\n    'кодсимв командасистемы конгода конецпериодаби конецрассчитанногопериодаби ' +\n    'конецстандартногоинтервала конквартала конмесяца коннедели лев лог лог10 макс ' +\n    'максимальноеколичествосубконто мин монопольныйрежим названиеинтерфейса названиенабораправ ' +\n    'назначитьвид назначитьсчет найти найтипомеченныенаудаление найтиссылки началопериодаби ' +\n    'началостандартногоинтервала начатьтранзакцию начгода начквартала начмесяца начнедели ' +\n    'номерднягода номерднянедели номернеделигода нрег обработкаожидания окр описаниеошибки ' +\n    'основнойжурналрасчетов основнойплансчетов основнойязык открытьформу открытьформумодально ' +\n    'отменитьтранзакцию очиститьокносообщений периодстр полноеимяпользователя получитьвремята ' +\n    'получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта ' +\n    'получитьпустоезначение получитьта прав праводоступа предупреждение префиксавтонумерации ' +\n    'пустаястрока пустоезначение рабочаядаттьпустоезначение рабочаядата разделительстраниц ' +\n    'разделительстрок разм разобратьпозициюдокумента рассчитатьрегистрына ' +\n    'рассчитатьрегистрыпо сигнал симв символтабуляции создатьобъект сокрл сокрлп сокрп ' +\n    'сообщить состояние сохранитьзначение сред статусвозврата стрдлина стрзаменить ' +\n    'стрколичествострок стрполучитьстроку  стрчисловхождений сформироватьпозициюдокумента ' +\n    'счетпокоду текущаядата текущеевремя типзначения типзначениястр удалитьобъекты ' +\n    'установитьтана установитьтапо фиксшаблон формат цел шаблон';\n  var DQUOTE =  {className: 'dquote',  begin: '\"\"'};\n  var STR_START = {\n      className: 'string',\n      begin: '\"', end: '\"|$',\n      contains: [DQUOTE]\n    };\n  var STR_CONT = {\n    className: 'string',\n    begin: '\\\\|', end: '\"|$',\n    contains: [DQUOTE]\n  };\n\n  return {\n    case_insensitive: true,\n    lexemes: IDENT_RE_RU,\n    keywords: {keyword: OneS_KEYWORDS, built_in: OneS_BUILT_IN},\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.NUMBER_MODE,\n      STR_START, STR_CONT,\n      {\n        className: 'function',\n        begin: '(процедура|функция)', end: '$',\n        lexemes: IDENT_RE_RU,\n        keywords: 'процедура функция',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE_RU}),\n          {\n            className: 'tail',\n            endsWithParent: true,\n            contains: [\n              {\n                className: 'params',\n                begin: '\\\\(', end: '\\\\)',\n                lexemes: IDENT_RE_RU,\n                keywords: 'знач',\n                contains: [STR_START, STR_CONT]\n              },\n              {\n                className: 'export',\n                begin: 'экспорт', endsWithParent: true,\n                lexemes: IDENT_RE_RU,\n                keywords: 'экспорт',\n                contains: [hljs.C_LINE_COMMENT_MODE]\n              }\n            ]\n          },\n          hljs.C_LINE_COMMENT_MODE\n        ]\n      },\n      {className: 'preprocessor', begin: '#', end: '$'},\n      {className: 'date', begin: '\\'\\\\d{2}\\\\.\\\\d{2}\\\\.(\\\\d{2}|\\\\d{4})\\''}\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/actionscript.js",
    "content": "/*\nLanguage: ActionScript\nAuthor: Alexander Myadzel <myadzel@gmail.com>\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';\n  var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';\n\n  var AS3_REST_ARG_MODE = {\n    className: 'rest_arg',\n    begin: '[.]{3}', end: IDENT_RE,\n    relevance: 10\n  };\n\n  return {\n    aliases: ['as'],\n    keywords: {\n      keyword: 'as break case catch class const continue default delete do dynamic each ' +\n        'else extends final finally for function get if implements import in include ' +\n        'instanceof interface internal is namespace native new override package private ' +\n        'protected public return set static super switch this throw try typeof use var void ' +\n        'while with',\n      literal: 'true false null undefined'\n    },\n    contains: [\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'package',\n        beginKeywords: 'package', end: '{',\n        contains: [hljs.TITLE_MODE]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.TITLE_MODE\n        ]\n      },\n      {\n        className: 'preprocessor',\n        beginKeywords: 'import include', end: ';'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '[{;]', excludeEnd: true,\n        illegal: '\\\\S',\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              AS3_REST_ARG_MODE\n            ]\n          },\n          {\n            className: 'type',\n            begin: ':',\n            end: IDENT_FUNC_RETURN_TYPE_RE,\n            relevance: 10\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/apache.js",
    "content": "/*\nLanguage: Apache\nAuthor: Ruslan Keba <rukeba@gmail.com>\nContributors: Ivan Sagalaev <maniac@softwaremaniacs.org>\nWebsite: http://rukeba.com/\nDescription: language definition for Apache configuration files (httpd.conf & .htaccess)\n*/\n\nfunction(hljs) {\n  var NUMBER = {className: 'number', begin: '[\\\\$%]\\\\d+'};\n  return {\n    aliases: ['apacheconf'],\n    case_insensitive: true,\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {className: 'tag', begin: '</?', end: '>'},\n      {\n        className: 'keyword',\n        begin: /\\w+/,\n        relevance: 0,\n        // keywords aren’t needed for highlighting per se, they only boost relevance\n        // for a very generally defined mode (starts with a word, ends with line-end\n        keywords: {\n          common:\n            'order deny allow setenv rewriterule rewriteengine rewritecond documentroot ' +\n            'sethandler errordocument loadmodule options header listen serverroot ' +\n            'servername'\n        },\n        starts: {\n          end: /$/,\n          relevance: 0,\n          keywords: {\n            literal: 'on off all'\n          },\n          contains: [\n            {\n              className: 'sqbracket',\n              begin: '\\\\s\\\\[', end: '\\\\]$'\n            },\n            {\n              className: 'cbracket',\n              begin: '[\\\\$%]\\\\{', end: '\\\\}',\n              contains: ['self', NUMBER]\n            },\n            NUMBER,\n            hljs.QUOTE_STRING_MODE\n          ]\n        }\n      }\n    ],\n    illegal: /\\S/\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/applescript.js",
    "content": "/*\nLanguage: AppleScript\nAuthors: Nathan Grigg <nathan@nathanamy.org>\n         Dr. Drang <drdrang@gmail.com>\n*/\n\nfunction(hljs) {\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: ''});\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    contains: ['self', hljs.C_NUMBER_MODE, STRING]\n  };\n  var COMMENTS = [\n    {\n      className: 'comment',\n      begin: '--', end: '$'\n    },\n    {\n      className: 'comment',\n      begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n      contains: ['self', {begin: '--', end: '$'}] //allow nesting\n    },\n    hljs.HASH_COMMENT_MODE\n  ];\n\n  return {\n    aliases: ['osascript'],\n    keywords: {\n      keyword:\n        'about above after against and around as at back before beginning ' +\n        'behind below beneath beside between but by considering ' +\n        'contain contains continue copy div does eighth else end equal ' +\n        'equals error every exit fifth first for fourth from front ' +\n        'get given global if ignoring in into is it its last local me ' +\n        'middle mod my ninth not of on onto or over prop property put ref ' +\n        'reference repeat returning script second set seventh since ' +\n        'sixth some tell tenth that the|0 then third through thru ' +\n        'timeout times to transaction try until where while whose with ' +\n        'without',\n      constant:\n        'AppleScript false linefeed return pi quote result space tab true',\n      type:\n        'alias application boolean class constant date file integer list ' +\n        'number real record string text',\n      command:\n        'activate beep count delay launch log offset read round ' +\n        'run say summarize write',\n      property:\n        'character characters contents day frontmost id item length ' +\n        'month name paragraph paragraphs rest reverse running time version ' +\n        'weekday word words year'\n    },\n    contains: [\n      STRING,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'type',\n        begin: '\\\\bPOSIX file\\\\b'\n      },\n      {\n        className: 'command',\n        begin:\n          '\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|' +\n          'mount volume|path to|(close|open for) access|(get|set) eof|' +\n          'current date|do shell script|get volume settings|random number|' +\n          'set volume|system attribute|system info|time to GMT|' +\n          '(load|run|store) script|scripting components|' +\n          'ASCII (character|number)|localized string|' +\n          'choose (application|color|file|file name|' +\n          'folder|from list|remote application|URL)|' +\n          'display (alert|dialog))\\\\b|^\\\\s*return\\\\b'\n      },\n      {\n        className: 'constant',\n        begin:\n          '\\\\b(text item delimiters|current application|missing value)\\\\b'\n      },\n      {\n        className: 'keyword',\n        begin:\n          '\\\\b(apart from|aside from|instead of|out of|greater than|' +\n          \"isn't|(doesn't|does not) (equal|come before|come after|contain)|\" +\n          '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' +\n          'contained by|comes (before|after)|a (ref|reference))\\\\b'\n      },\n      {\n        className: 'property',\n        begin:\n          '\\\\b(POSIX path|(date|time) string|quoted form)\\\\b'\n      },\n      {\n        className: 'function_start',\n        beginKeywords: 'on',\n        illegal: '[${=;\\\\n]',\n        contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]\n      }\n    ].concat(COMMENTS),\n    illegal: '//'\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/asciidoc.js",
    "content": "/*\nLanguage: AsciiDoc\nRequires: xml.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://google.com/profiles/dan.j.allen\nDescription: A semantic, text-based document format that can be exported to HTML, DocBook and other backends.\n*/\nfunction(hljs) {\n  return {\n    contains: [\n      // block comment\n      {\n        className: 'comment',\n        begin: '^/{4,}\\\\n',\n        end: '\\\\n/{4,}$',\n        // can also be done as...\n        //begin: '^/{4,}$',\n        //end: '^/{4,}$',\n        relevance: 10\n      },\n      // line comment\n      {\n        className: 'comment',\n        begin: '^//',\n        end: '$',\n        relevance: 0\n      },\n      // title\n      {\n        className: 'title',\n        begin: '^\\\\.\\\\w.*$'\n      },\n      // example, admonition & sidebar blocks\n      {\n        begin: '^[=\\\\*]{4,}\\\\n',\n        end: '\\\\n^[=\\\\*]{4,}$',\n        relevance: 10\n      },\n      // headings\n      {\n        className: 'header',\n        begin: '^(={1,5}) .+?( \\\\1)?$',\n        relevance: 10\n      },\n      {\n        className: 'header',\n        begin: '^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$',\n        relevance: 10\n      },\n      // document attributes\n      {\n        className: 'attribute',\n        begin: '^:.+?:',\n        end: '\\\\s',\n        excludeEnd: true,\n        relevance: 10\n      },\n      // block attributes\n      {\n        className: 'attribute',\n        begin: '^\\\\[.+?\\\\]$',\n        relevance: 0\n      },\n      // quoteblocks\n      {\n        className: 'blockquote',\n        begin: '^_{4,}\\\\n',\n        end: '\\\\n_{4,}$',\n        relevance: 10\n      },\n      // listing and literal blocks\n      {\n        className: 'code',\n        begin: '^[\\\\-\\\\.]{4,}\\\\n',\n        end: '\\\\n[\\\\-\\\\.]{4,}$',\n        relevance: 10\n      },\n      // passthrough blocks\n      {\n        begin: '^\\\\+{4,}\\\\n',\n        end: '\\\\n\\\\+{4,}$',\n        contains: [\n          {\n            begin: '<', end: '>',\n            subLanguage: 'xml',\n            relevance: 0\n          }\n        ],\n        relevance: 10\n      },\n      // lists (can only capture indicators)\n      {\n        className: 'bullet',\n        begin: '^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+'\n      },\n      // admonition\n      {\n        className: 'label',\n        begin: '^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+',\n        relevance: 10\n      },\n      // inline strong\n      {\n        className: 'strong',\n        // must not follow a word character or be followed by an asterisk or space\n        begin: '\\\\B\\\\*(?![\\\\*\\\\s])',\n        end: '(\\\\n{2}|\\\\*)',\n        // allow escaped asterisk followed by word char\n        contains: [\n          {\n            begin: '\\\\\\\\*\\\\w',\n            relevance: 0\n          }\n        ]\n      },\n      // inline emphasis\n      {\n        className: 'emphasis',\n        // must not follow a word character or be followed by a single quote or space\n        begin: '\\\\B\\'(?![\\'\\\\s])',\n        end: '(\\\\n{2}|\\')',\n        // allow escaped single quote followed by word char\n        contains: [\n          {\n            begin: '\\\\\\\\\\'\\\\w',\n            relevance: 0\n          }\n        ],\n        relevance: 0\n      },\n      // inline emphasis (alt)\n      {\n        className: 'emphasis',\n        // must not follow a word character or be followed by an underline or space\n        begin: '_(?![_\\\\s])',\n        end: '(\\\\n{2}|_)',\n        relevance: 0\n      },\n      // inline double smart quotes\n      {\n        className: 'smartquote',\n        begin: \"``.+?''\",\n        relevance: 10\n      },\n      // inline single smart quotes\n      {\n        className: 'smartquote',\n        begin: \"`.+?'\",\n        relevance: 10\n      },\n      // inline code snippets (TODO should get same treatment as strong and emphasis)\n      {\n        className: 'code',\n        begin: '(`.+?`|\\\\+.+?\\\\+)',\n        relevance: 0\n      },\n      // indented literal block\n      {\n        className: 'code',\n        begin: '^[ \\\\t]',\n        end: '$',\n        relevance: 0\n      },\n      // horizontal rules\n      {\n        className: 'horizontal_rule',\n        begin: '^\\'{3,}[ \\\\t]*$',\n        relevance: 10\n      },\n      // images and links\n      {\n        begin: '(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]',\n        returnBegin: true,\n        contains: [\n          {\n            //className: 'macro',\n            begin: '(link|image:?):',\n            relevance: 0\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\w',\n            end: '[^\\\\[]+',\n            relevance: 0\n          },\n          {\n            className: 'link_label',\n            begin: '\\\\[',\n            end: '\\\\]',\n            excludeBegin: true,\n            excludeEnd: true,\n            relevance: 0\n          }\n        ],\n        relevance: 10\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/autohotkey.js",
    "content": "/*\nLanguage: AutoHotkey\nAuthor: Seongwon Lee <dlimpid@gmail.com>\nDescription: AutoHotkey language definition\n*/\n\nfunction(hljs) {\n  var BACKTICK_ESCAPE = {\n    className: 'escape',\n    begin: '`[\\\\s\\\\S]'\n  };\n  var COMMENTS = {\n    className: 'comment',\n    begin: ';', end: '$',\n    relevance: 0\n  };\n  var BUILT_IN = [\n    {\n      className: 'built_in',\n      begin: 'A_[a-zA-Z0-9]+'\n    },\n    {\n      className: 'built_in',\n      beginKeywords: 'ComSpec Clipboard ClipboardAll ErrorLevel'\n    }\n  ];\n\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword: 'Break Continue Else Gosub If Loop Return While',\n      literal: 'A true false NOT AND OR'\n    },\n    contains: BUILT_IN.concat([\n      BACKTICK_ESCAPE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [BACKTICK_ESCAPE]}),\n      COMMENTS,\n      {\n        className: 'number',\n        begin: hljs.NUMBER_RE,\n        relevance: 0\n      },\n      {\n        className: 'var_expand', // FIXME\n        begin: '%', end: '%',\n        illegal: '\\\\n',\n        contains: [BACKTICK_ESCAPE]\n      },\n      {\n        className: 'label',\n        contains: [BACKTICK_ESCAPE],\n        variants: [\n          {begin: '^[^\\\\n\";]+::(?!=)'},\n          {begin: '^[^\\\\n\";]+:(?!=)', relevance: 0} // zero relevance as it catches a lot of things\n                                                    // followed by a single ':' in many languages\n        ]\n      },\n      {\n        // consecutive commas, not for highlighting but just for relevance\n        begin: ',\\\\s*,',\n        relevance: 10\n      }\n    ])\n  }\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/avrasm.js",
    "content": "/*\nLanguage: AVR Assembler\nAuthor: Vladimir Ermakov <vooon341@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    lexemes: '\\\\.?' + hljs.IDENT_RE,\n    keywords: {\n      keyword:\n        /* mnemonic */\n        'adc add adiw and andi asr bclr bld brbc brbs brcc brcs break breq brge brhc brhs ' +\n        'brid brie brlo brlt brmi brne brpl brsh brtc brts brvc brvs bset bst call cbi cbr ' +\n        'clc clh cli cln clr cls clt clv clz com cp cpc cpi cpse dec eicall eijmp elpm eor ' +\n        'fmul fmuls fmulsu icall ijmp in inc jmp ld ldd ldi lds lpm lsl lsr mov movw mul ' +\n        'muls mulsu neg nop or ori out pop push rcall ret reti rjmp rol ror sbc sbr sbrc sbrs ' +\n        'sec seh sbi sbci sbic sbis sbiw sei sen ser ses set sev sez sleep spm st std sts sub ' +\n        'subi swap tst wdr',\n      built_in:\n        /* general purpose registers */\n        'r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 ' +\n        'r23 r24 r25 r26 r27 r28 r29 r30 r31 x|0 xh xl y|0 yh yl z|0 zh zl ' +\n        /* IO Registers (ATMega128) */\n        'ucsr1c udr1 ucsr1a ucsr1b ubrr1l ubrr1h ucsr0c ubrr0h tccr3c tccr3a tccr3b tcnt3h ' +\n        'tcnt3l ocr3ah ocr3al ocr3bh ocr3bl ocr3ch ocr3cl icr3h icr3l etimsk etifr tccr1c ' +\n        'ocr1ch ocr1cl twcr twdr twar twsr twbr osccal xmcra xmcrb eicra spmcsr spmcr portg ' +\n        'ddrg ping portf ddrf sreg sph spl xdiv rampz eicrb eimsk gimsk gicr eifr gifr timsk ' +\n        'tifr mcucr mcucsr tccr0 tcnt0 ocr0 assr tccr1a tccr1b tcnt1h tcnt1l ocr1ah ocr1al ' +\n        'ocr1bh ocr1bl icr1h icr1l tccr2 tcnt2 ocr2 ocdr wdtcr sfior eearh eearl eedr eecr ' +\n        'porta ddra pina portb ddrb pinb portc ddrc pinc portd ddrd pind spdr spsr spcr udr0 ' +\n        'ucsr0a ucsr0b ubrr0l acsr admux adcsr adch adcl porte ddre pine pinf',\n      preprocessor:\n        '.byte .cseg .db .def .device .dseg .dw .endmacro .equ .eseg .exit .include .list ' +\n        '.listmac .macro .nolist .org .set'\n    },\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      {className: 'comment', begin: ';',  end: '$', relevance: 0},\n      hljs.C_NUMBER_MODE, // 0x..., decimal, float\n      hljs.BINARY_NUMBER_MODE, // 0b...\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\$[a-zA-Z0-9]+|0o[0-7]+)' // $..., 0o...\n      },\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'', end: '[^\\\\\\\\]\\'',\n        illegal: '[^\\\\\\\\][^\\']'\n      },\n      {className: 'label',  begin: '^[A-Za-z0-9_.$]+:'},\n      {className: 'preprocessor', begin: '#', end: '$'},\n      {  // подстановка в «.macro»\n        className: 'localvars',\n        begin: '@[0-9]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/axapta.js",
    "content": "/*\nLanguage: Axapta\nAuthor: Dmitri Roudakov <dmitri@roudakov.ru>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: 'false int abstract private char boolean static null if for true ' +\n      'while long throw finally protected final return void enum else ' +\n      'break new catch byte super case short default double public try this switch ' +\n      'continue reverse firstfast firstonly forupdate nofetch sum avg minof maxof count ' +\n      'order group by asc desc index hint like dispaly edit client server ttsbegin ' +\n      'ttscommit str real date container anytype common div mod',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        illegal: ':',\n        contains: [\n          {\n            className: 'inheritance',\n            beginKeywords: 'extends implements',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/bash.js",
    "content": "/*\nLanguage: Bash\nAuthor: vah <vahtenberg@gmail.com>\nContributrors: Benjamin Pannell <contact@sierrasoftworks.com>\n*/\n\nfunction(hljs) {\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$[\\w\\d#@][\\w\\d_]*/},\n      {begin: /\\$\\{(.*?)\\}/}\n    ]\n  };\n  var QUOTE_STRING = {\n    className: 'string',\n    begin: /\"/, end: /\"/,\n    contains: [\n      hljs.BACKSLASH_ESCAPE,\n      VAR,\n      {\n        className: 'variable',\n        begin: /\\$\\(/, end: /\\)/,\n        contains: [hljs.BACKSLASH_ESCAPE]\n      }\n    ]\n  };\n  var APOS_STRING = {\n    className: 'string',\n    begin: /'/, end: /'/\n  };\n\n  return {\n    aliases: ['sh', 'zsh'],\n    lexemes: /-?[a-z\\.]+/,\n    keywords: {\n      keyword:\n        'if then else elif fi for break continue while in do done exit return set '+\n        'declare case esac export exec',\n      literal:\n        'true false',\n      built_in:\n        'printf echo read cd pwd pushd popd dirs let eval unset typeset readonly '+\n        'getopts source shopt caller type hash bind help sudo',\n      operator:\n        '-ne -eq -lt -gt -f -d -e -s -l -a' // relevance booster\n    },\n    contains: [\n      {\n        className: 'shebang',\n        begin: /^#![^\\n]+sh\\s*$/,\n        relevance: 10\n      },\n      {\n        className: 'function',\n        begin: /\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,\n        returnBegin: true,\n        contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\\w[\\w\\d_]*/})],\n        relevance: 0\n      },\n      hljs.HASH_COMMENT_MODE,\n      hljs.NUMBER_MODE,\n      QUOTE_STRING,\n      APOS_STRING,\n      VAR\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/brainfuck.js",
    "content": "/*\nLanguage: Brainfuck\nAuthor: Evgeny Stepanischev <imbolk@gmail.com>\n*/\n\nfunction(hljs){\n  var LITERAL = {\n    className: 'literal',\n    begin: '[\\\\+\\\\-]',\n    relevance: 0\n  };\n  return {\n    aliases: ['bf'],\n    contains: [\n      {\n        className: 'comment',\n        begin: '[^\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]',\n        returnEnd: true,\n        end: '[\\\\[\\\\]\\\\.,\\\\+\\\\-<> \\r\\n]',\n        relevance: 0\n      },\n      {\n        className: 'title',\n        begin: '[\\\\[\\\\]]',\n        relevance: 0\n      },\n      {\n        className: 'string',\n        begin: '[\\\\.,]',\n        relevance: 0\n      },\n      {\n        // this mode works as the only relevance counter\n        begin: /\\+\\+|\\-\\-/, returnBegin: true,\n        contains: [LITERAL]\n      },\n      LITERAL\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/capnproto.js",
    "content": "/*\nLanguage: Cap’n Proto\nAuthor: Oleg Efimov <efimovov@gmail.com>\nDescription: Cap’n Proto message definition format\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['capnp'],\n    keywords: {\n      keyword:\n        'struct enum interface union group import using const annotation extends in of on as with from fixed',\n      built_in:\n        'Void Bool Int8 Int16 Int32 Int64 UInt8 UInt16 UInt32 UInt64 Float32 Float64 ' +\n        'Text Data AnyPointer AnyStruct Capability List',\n      literal:\n        'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'shebang',\n        begin: /@0x[\\w\\d]{16};/,\n        illegal: /\\n/\n      },\n      {\n        className: 'number',\n        begin: /@\\d+\\b/\n      },\n      {\n        className: 'class',\n        beginKeywords: 'struct enum', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'interface', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/clojure.js",
    "content": "/*\nLanguage: Clojure\nDescription: Clojure syntax (based on lisp.js)\nAuthor: mfornos\n*/\n\nfunction(hljs) {\n  var keywords = {\n    built_in:\n      // Clojure keywords\n      'def cond apply if-not if-let if not not= = &lt; < > &lt;= <= >= == + / * - rem '+\n      'quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? '+\n      'set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? '+\n      'class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? '+\n      'string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . '+\n      'inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last '+\n      'drop-while while intern condp case reduced cycle split-at split-with repeat replicate '+\n      'iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext '+\n      'nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends '+\n      'add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler '+\n      'set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter '+\n      'monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or '+\n      'when when-not when-let comp juxt partial sequence memoize constantly complement identity assert '+\n      'peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast '+\n      'sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import '+\n      'refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! '+\n      'assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger '+\n      'bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline '+\n      'flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking '+\n      'assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! '+\n      'reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! '+\n      'new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty '+\n      'hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list '+\n      'disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer '+\n      'chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate '+\n      'unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta '+\n      'lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize'\n   };\n\n  var CLJ_IDENT_RE = '[a-zA-Z_0-9\\\\!\\\\.\\\\?\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#\\\\$\\';]+';\n  var SIMPLE_NUMBER_RE = '[\\\\s:\\\\(\\\\{]+\\\\d+(\\\\.\\\\d+)?';\n\n  var NUMBER = {\n    className: 'number', begin: SIMPLE_NUMBER_RE,\n    relevance: 0\n  };\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});\n  var COMMENT = {\n    className: 'comment',\n    begin: ';', end: '$',\n    relevance: 0\n  };\n  var COLLECTION = {\n    className: 'collection',\n    begin: '[\\\\[\\\\{]', end: '[\\\\]\\\\}]'\n  };\n  var HINT = {\n    className: 'comment',\n    begin: '\\\\^' + CLJ_IDENT_RE\n  };\n  var HINT_COL = {\n    className: 'comment',\n    begin: '\\\\^\\\\{', end: '\\\\}'\n\n  };\n  var KEY = {\n    className: 'attribute',\n    begin: '[:]' + CLJ_IDENT_RE\n  };\n  var LIST = {\n    className: 'list',\n    begin: '\\\\(', end: '\\\\)'\n  };\n  var BODY = {\n    endsWithParent: true,\n    keywords: {literal: 'true false nil'},\n    relevance: 0\n  };\n  var TITLE = {\n    keywords: keywords,\n    lexemes: CLJ_IDENT_RE,\n    className: 'title', begin: CLJ_IDENT_RE,\n    starts: BODY\n  };\n\n  LIST.contains = [{className: 'comment', begin: 'comment'}, TITLE, BODY];\n  BODY.contains = [LIST, STRING, HINT, HINT_COL, COMMENT, KEY, COLLECTION, NUMBER];\n  COLLECTION.contains = [LIST, STRING, HINT, COMMENT, KEY, COLLECTION, NUMBER];\n\n  return {\n    aliases: ['clj'],\n    illegal: /\\S/,\n    contains: [\n      COMMENT,\n      LIST,\n      {\n        className: 'prompt',\n        begin: /^=> /,\n        starts: {end: /\\n\\n|\\Z/} // eat up prompt output to not interfere with the illegal\n      }\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/cmake.js",
    "content": "/*\nLanguage: CMake\nDescription: CMake is an open-source cross-platform system for build automation.\nAuthor: Igor Kalnitsky <igor@kalnitsky.org>\nWebsite: http://kalnitsky.org/\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['cmake.in'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'add_custom_command add_custom_target add_definitions add_dependencies ' +\n        'add_executable add_library add_subdirectory add_test aux_source_directory ' +\n        'break build_command cmake_minimum_required cmake_policy configure_file ' +\n        'create_test_sourcelist define_property else elseif enable_language enable_testing ' +\n        'endforeach endfunction endif endmacro endwhile execute_process export find_file ' +\n        'find_library find_package find_path find_program fltk_wrap_ui foreach function ' +\n        'get_cmake_property get_directory_property get_filename_component get_property ' +\n        'get_source_file_property get_target_property get_test_property if include ' +\n        'include_directories include_external_msproject include_regular_expression install ' +\n        'link_directories load_cache load_command macro mark_as_advanced message option ' +\n        'output_required_files project qt_wrap_cpp qt_wrap_ui remove_definitions return ' +\n        'separate_arguments set set_directory_properties set_property ' +\n        'set_source_files_properties set_target_properties set_tests_properties site_name ' +\n        'source_group string target_link_libraries try_compile try_run unset variable_watch ' +\n        'while build_name exec_program export_library_dependencies install_files ' +\n        'install_programs install_targets link_libraries make_directory remove subdir_depends ' +\n        'subdirs use_mangled_mesa utility_source variable_requires write_file ' +\n        'qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or',\n      operator:\n        'equal less greater strless strgreater strequal matches'\n    },\n    contains: [\n      {\n        className: 'envvar',\n        begin: '\\\\${', end: '}'\n      },\n      hljs.HASH_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/coffeescript.js",
    "content": "/*\nLanguage: CoffeeScript\nAuthor: Dmytrii Nagirniak <dnagir@gmail.com>\nContributors: Oleg Efimov <efimovov@gmail.com>, Cédric Néhémie <cedric.nehemie@gmail.com>\nDescription: CoffeeScript is a programming language that transcompiles to JavaScript. For info about language see http://coffeescript.org/\n*/\n\nfunction(hljs) {\n  var KEYWORDS = {\n    keyword:\n      // JS keywords\n      'in if for while finally new do return else break catch instanceof throw try this ' +\n      'switch continue typeof delete debugger super ' +\n      // Coffee keywords\n      'then unless until loop of by when and or is isnt not',\n    literal:\n      // JS literals\n      'true false null undefined ' +\n      // Coffee literals\n      'yes no on off',\n    reserved:\n      'case default function var void with const let enum export import native ' +\n      '__hasProp __extends __slice __bind __indexOf',\n    built_in:\n      'npm require console print module global window document'\n  };\n  var JS_IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';\n  var TITLE = hljs.inherit(hljs.TITLE_MODE, {begin: JS_IDENT_RE});\n  var SUBST = {\n    className: 'subst',\n    begin: /#\\{/, end: /}/,\n    keywords: KEYWORDS\n  };\n  var EXPRESSIONS = [\n    hljs.BINARY_NUMBER_MODE,\n    hljs.inherit(hljs.C_NUMBER_MODE, {starts: {end: '(\\\\s*/)?', relevance: 0}}), // a number tries to eat the following slash to prevent treating it as a regexp\n    {\n      className: 'string',\n      variants: [\n        {\n          begin: /'''/, end: /'''/,\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: /'/, end: /'/,\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: /\"\"\"/, end: /\"\"\"/,\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST]\n        },\n        {\n          begin: /\"/, end: /\"/,\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST]\n        }\n      ]\n    },\n    {\n      className: 'regexp',\n      variants: [\n        {\n          begin: '///', end: '///',\n          contains: [SUBST, hljs.HASH_COMMENT_MODE]\n        },\n        {\n          begin: '//[gim]*',\n          relevance: 0\n        },\n        {\n          begin: '/\\\\S(\\\\\\\\.|[^\\\\n])*?/[gim]*(?=\\\\s|\\\\W|$)' // \\S is required to parse x / 2 / 3 as two divisions\n        }\n      ]\n    },\n    {\n      className: 'property',\n      begin: '@' + JS_IDENT_RE\n    },\n    {\n      begin: '`', end: '`',\n      excludeBegin: true, excludeEnd: true,\n      subLanguage: 'javascript'\n    }\n  ];\n  SUBST.contains = EXPRESSIONS;\n\n  return {\n    aliases: ['coffee', 'cson', 'iced'],\n    keywords: KEYWORDS,\n    contains: EXPRESSIONS.concat([\n      {\n        className: 'comment',\n        begin: '###', end: '###'\n      },\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'function',\n        begin: '(' + JS_IDENT_RE + '\\\\s*=\\\\s*)?(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>', end: '[-=]>',\n        returnBegin: true,\n        contains: [\n          TITLE,\n          {\n            className: 'params',\n            begin: '\\\\(', returnBegin: true,\n            /* We need another contained nameless mode to not have every nested\n            pair of parens to be called \"params\" */\n            contains: [{\n              begin: /\\(/, end: /\\)/,\n              keywords: KEYWORDS,\n              contains: ['self'].concat(EXPRESSIONS)\n            }]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class',\n        end: '$',\n        illegal: /[:=\"\\[\\]]/,\n        contains: [\n          {\n            beginKeywords: 'extends',\n            endsWithParent: true,\n            illegal: /[:=\"\\[\\]]/,\n            contains: [TITLE]\n          },\n          TITLE\n        ]\n      },\n      {\n        className: 'attribute',\n        begin: JS_IDENT_RE + ':', end: ':',\n        returnBegin: true, excludeEnd: true,\n        relevance: 0\n      }\n    ])\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/cpp.js",
    "content": "/*\nLanguage: C++\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Zaven Muradyan <megalivoithos@gmail.com>\n*/\n\nfunction(hljs) {\n  var CPP_KEYWORDS = {\n    keyword: 'false int float while private char catch export virtual operator sizeof ' +\n      'dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace ' +\n      'unsigned long throw volatile static protected bool template mutable if public friend ' +\n      'do return goto auto void enum else break new extern using true class asm case typeid ' +\n      'short reinterpret_cast|10 default double register explicit signed typename try this ' +\n      'switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype ' +\n      'noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary',\n    built_in: 'std string cin cout cerr clog stringstream istringstream ostringstream ' +\n      'auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set ' +\n      'unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos ' +\n      'asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp ' +\n      'fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper ' +\n      'isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow ' +\n      'printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp ' +\n      'strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan ' +\n      'vfprintf vprintf vsprintf'\n  };\n  return {\n    aliases: ['c', 'h', 'c++', 'h++'],\n    keywords: CPP_KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'\\\\\\\\?.', end: '\\'',\n        illegal: '.'\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)(u|U|l|L|ul|UL|f|F)'\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elif endif define undef warning error line pragma',\n        contains: [\n          {\n            begin: 'include\\\\s*[<\"]', end: '[>\"]',\n            keywords: 'include',\n            illegal: '\\\\n'\n          },\n          hljs.C_LINE_COMMENT_MODE\n        ]\n      },\n      {\n        className: 'stl_container',\n        begin: '\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<', end: '>',\n        keywords: CPP_KEYWORDS,\n        contains: ['self']\n      },\n      {\n        begin: hljs.IDENT_RE + '::'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/cs.js",
    "content": "/*\nLanguage: C#\nAuthor: Jason Diamond <jason@diamond.name>\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    // Normal keywords.\n    'abstract as base bool break byte case catch char checked const continue decimal ' +\n    'default delegate do double else enum event explicit extern false finally fixed float ' +\n    'for foreach goto if implicit in int interface internal is lock long new null ' +\n    'object operator out override params private protected public readonly ref return sbyte ' +\n    'sealed short sizeof stackalloc static string struct switch this throw true try typeof ' +\n    'uint ulong unchecked unsafe ushort using virtual volatile void while async await ' +\n    // Contextual keywords.\n    'ascending descending from get group into join let orderby partial select set value var ' +\n    'where yield';\n  return {\n    aliases: ['csharp'],\n    keywords: KEYWORDS,\n    illegal: /::/,\n    contains: [\n      {\n        className: 'comment',\n        begin: '///', end: '$', returnBegin: true,\n        contains: [\n          {\n            className: 'xmlDocTag',\n            variants: [\n              {\n                begin: '///', relevance: 0\n              },\n              {\n                begin: '<!--|-->'\n              },\n              {\n                begin: '</?', end: '>'\n              }\n            ]\n          }\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elif endif define undef warning error line region endregion pragma checksum'\n      },\n      {\n        className: 'string',\n        begin: '@\"', end: '\"',\n        contains: [{begin: '\"\"'}]\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        beginKeywords: 'protected public private internal', end: /[{;=]/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            beginKeywords: 'class namespace interface',\n            starts: {\n              contains: [hljs.TITLE_MODE]\n            }\n          },\n          {\n            begin: hljs.IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n            contains: [\n              hljs.TITLE_MODE\n            ]\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/css.js",
    "content": "/*\nLanguage: CSS\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  var FUNCTION = {\n    className: 'function',\n    begin: IDENT_RE + '\\\\(', \n    returnBegin: true,\n    excludeEnd: true,\n    end: '\\\\('\n  };\n  return {\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'id', begin: '\\\\#[A-Za-z0-9_-]+'\n      },\n      {\n        className: 'class', begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'attr_selector',\n        begin: '\\\\[', end: '\\\\]',\n        illegal: '$'\n      },\n      {\n        className: 'pseudo',\n        begin: ':(:)?[a-zA-Z0-9\\\\_\\\\-\\\\+\\\\(\\\\)\\\\\"\\\\\\']+'\n      },\n      {\n        className: 'at_rule',\n        begin: '@(font-face|page)',\n        lexemes: '[a-z-]+',\n        keywords: 'font-face page'\n      },\n      {\n        className: 'at_rule',\n        begin: '@', end: '[{;]', // at_rule eating first \"{\" is a good thing\n                                 // because it doesn’t let it to be parsed as\n                                 // a rule set but instead drops parser into\n                                 // the default mode which is how it should be.\n        contains: [\n          {\n            className: 'keyword',\n            begin: /\\S+/\n          },\n          {\n            begin: /\\s/, endsWithParent: true, excludeEnd: true,\n            relevance: 0,\n            contains: [\n              FUNCTION,\n              hljs.APOS_STRING_MODE, hljs.QUOTE_STRING_MODE,\n              hljs.CSS_NUMBER_MODE\n            ]\n          }\n        ]\n      },\n      {\n        className: 'tag', begin: IDENT_RE,\n        relevance: 0\n      },\n      {\n        className: 'rules',\n        begin: '{', end: '}',\n        illegal: '[^\\\\s]',\n        relevance: 0,\n        contains: [\n          hljs.C_BLOCK_COMMENT_MODE,\n          {\n            className: 'rule',\n            begin: '[^\\\\s]', returnBegin: true, end: ';', endsWithParent: true,\n            contains: [\n              {\n                className: 'attribute',\n                begin: '[A-Z\\\\_\\\\.\\\\-]+', end: ':',\n                excludeEnd: true,\n                illegal: '[^\\\\s]',\n                starts: {\n                  className: 'value',\n                  endsWithParent: true, excludeEnd: true,\n                  contains: [\n                    FUNCTION,\n                    hljs.CSS_NUMBER_MODE,\n                    hljs.QUOTE_STRING_MODE,\n                    hljs.APOS_STRING_MODE,\n                    hljs.C_BLOCK_COMMENT_MODE,\n                    {\n                      className: 'hexcolor', begin: '#[0-9A-Fa-f]+'\n                    },\n                    {\n                      className: 'important', begin: '!important'\n                    }\n                  ]\n                }\n              }\n            ]\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/d.js",
    "content": "/*\nLanguage: D\nAuthor: Aleksandar Ruzicic <aleksandar@ruzicic.info>\nDescription: D is a language with C-like syntax and static typing. It pragmatically combines efficiency, control, and modeling power, with safety and programmer productivity.\nVersion: 1.0a\nDate: 2012-04-08\n*/\n\n/**\n * Known issues:\n *\n * - invalid hex string literals will be recognized as a double quoted strings\n *   but 'x' at the beginning of string will not be matched\n *\n * - delimited string literals are not checked for matching end delimiter\n *   (not possible to do with js regexp)\n *\n * - content of token string is colored as a string (i.e. no keyword coloring inside a token string)\n *   also, content of token string is not validated to contain only valid D tokens\n *\n * - special token sequence rule is not strictly following D grammar (anything following #line\n *   up to the end of line is matched as special token sequence)\n */\n\nfunction(hljs) {\n  /**\n   * Language keywords\n   *\n   * @type {Object}\n   */\n  var D_KEYWORDS = {\n    keyword:\n      'abstract alias align asm assert auto body break byte case cast catch class ' +\n      'const continue debug default delete deprecated do else enum export extern final ' +\n      'finally for foreach foreach_reverse|10 goto if immutable import in inout int ' +\n      'interface invariant is lazy macro mixin module new nothrow out override package ' +\n      'pragma private protected public pure ref return scope shared static struct ' +\n      'super switch synchronized template this throw try typedef typeid typeof union ' +\n      'unittest version void volatile while with __FILE__ __LINE__ __gshared|10 ' +\n      '__thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__',\n    built_in:\n      'bool cdouble cent cfloat char creal dchar delegate double dstring float function ' +\n      'idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar ' +\n      'wstring',\n    literal:\n      'false null true'\n  };\n\n  /**\n   * Number literal regexps\n   *\n   * @type {String}\n   */\n  var decimal_integer_re = '(0|[1-9][\\\\d_]*)',\n    decimal_integer_nosus_re = '(0|[1-9][\\\\d_]*|\\\\d[\\\\d_]*|[\\\\d_]+?\\\\d)',\n    binary_integer_re = '0[bB][01_]+',\n    hexadecimal_digits_re = '([\\\\da-fA-F][\\\\da-fA-F_]*|_[\\\\da-fA-F][\\\\da-fA-F_]*)',\n    hexadecimal_integer_re = '0[xX]' + hexadecimal_digits_re,\n\n    decimal_exponent_re = '([eE][+-]?' + decimal_integer_nosus_re + ')',\n    decimal_float_re = '(' + decimal_integer_nosus_re + '(\\\\.\\\\d*|' + decimal_exponent_re + ')|' +\n                '\\\\d+\\\\.' + decimal_integer_nosus_re + decimal_integer_nosus_re + '|' +\n                '\\\\.' + decimal_integer_re + decimal_exponent_re + '?' +\n              ')',\n    hexadecimal_float_re = '(0[xX](' +\n                  hexadecimal_digits_re + '\\\\.' + hexadecimal_digits_re + '|'+\n                  '\\\\.?' + hexadecimal_digits_re +\n                 ')[pP][+-]?' + decimal_integer_nosus_re + ')',\n\n    integer_re = '(' +\n      decimal_integer_re + '|' +\n      binary_integer_re  + '|' +\n       hexadecimal_integer_re   +\n    ')',\n\n    float_re = '(' +\n      hexadecimal_float_re + '|' +\n      decimal_float_re  +\n    ')';\n\n  /**\n   * Escape sequence supported in D string and character literals\n   *\n   * @type {String}\n   */\n  var escape_sequence_re = '\\\\\\\\(' +\n              '[\\'\"\\\\?\\\\\\\\abfnrtv]|' +  // common escapes\n              'u[\\\\dA-Fa-f]{4}|' +     // four hex digit unicode codepoint\n              '[0-7]{1,3}|' +       // one to three octal digit ascii char code\n              'x[\\\\dA-Fa-f]{2}|' +    // two hex digit ascii char code\n              'U[\\\\dA-Fa-f]{8}' +      // eight hex digit unicode codepoint\n              ')|' +\n              '&[a-zA-Z\\\\d]{2,};';      // named character entity\n\n  /**\n   * D integer number literals\n   *\n   * @type {Object}\n   */\n  var D_INTEGER_MODE = {\n    className: 'number',\n      begin: '\\\\b' + integer_re + '(L|u|U|Lu|LU|uL|UL)?',\n      relevance: 0\n  };\n\n  /**\n   * [D_FLOAT_MODE description]\n   * @type {Object}\n   */\n  var D_FLOAT_MODE = {\n    className: 'number',\n    begin: '\\\\b(' +\n        float_re + '([fF]|L|i|[fF]i|Li)?|' +\n        integer_re + '(i|[fF]i|Li)' +\n      ')',\n    relevance: 0\n  };\n\n  /**\n   * D character literal\n   *\n   * @type {Object}\n   */\n  var D_CHARACTER_MODE = {\n    className: 'string',\n    begin: '\\'(' + escape_sequence_re + '|.)', end: '\\'',\n    illegal: '.'\n  };\n\n  /**\n   * D string escape sequence\n   *\n   * @type {Object}\n   */\n  var D_ESCAPE_SEQUENCE = {\n    begin: escape_sequence_re,\n    relevance: 0\n  };\n\n  /**\n   * D double quoted string literal\n   *\n   * @type {Object}\n   */\n  var D_STRING_MODE = {\n    className: 'string',\n    begin: '\"',\n    contains: [D_ESCAPE_SEQUENCE],\n    end: '\"[cwd]?'\n  };\n\n  /**\n   * D wysiwyg and delimited string literals\n   *\n   * @type {Object}\n   */\n  var D_WYSIWYG_DELIMITED_STRING_MODE = {\n    className: 'string',\n    begin: '[rq]\"',\n    end: '\"[cwd]?',\n    relevance: 5\n  };\n\n  /**\n   * D alternate wysiwyg string literal\n   *\n   * @type {Object}\n   */\n  var D_ALTERNATE_WYSIWYG_STRING_MODE = {\n    className: 'string',\n    begin: '`',\n    end: '`[cwd]?'\n  };\n\n  /**\n   * D hexadecimal string literal\n   *\n   * @type {Object}\n   */\n  var D_HEX_STRING_MODE = {\n    className: 'string',\n    begin: 'x\"[\\\\da-fA-F\\\\s\\\\n\\\\r]*\"[cwd]?',\n    relevance: 10\n  };\n\n  /**\n   * D delimited string literal\n   *\n   * @type {Object}\n   */\n  var D_TOKEN_STRING_MODE = {\n    className: 'string',\n    begin: 'q\"\\\\{',\n    end: '\\\\}\"'\n  };\n\n  /**\n   * Hashbang support\n   *\n   * @type {Object}\n   */\n  var D_HASHBANG_MODE = {\n    className: 'shebang',\n    begin: '^#!',\n    end: '$',\n    relevance: 5\n  };\n\n  /**\n   * D special token sequence\n   *\n   * @type {Object}\n   */\n  var D_SPECIAL_TOKEN_SEQUENCE_MODE = {\n    className: 'preprocessor',\n    begin: '#(line)',\n    end: '$',\n    relevance: 5\n  };\n\n  /**\n   * D attributes\n   *\n   * @type {Object}\n   */\n  var D_ATTRIBUTE_MODE = {\n    className: 'keyword',\n    begin: '@[a-zA-Z_][a-zA-Z_\\\\d]*'\n  };\n\n  /**\n   * D nesting comment\n   *\n   * @type {Object}\n   */\n  var D_NESTING_COMMENT_MODE = {\n    className: 'comment',\n    begin: '\\\\/\\\\+',\n    contains: ['self'],\n    end: '\\\\+\\\\/',\n    relevance: 10\n  };\n\n  return {\n    lexemes: hljs.UNDERSCORE_IDENT_RE,\n    keywords: D_KEYWORDS,\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n        hljs.C_BLOCK_COMMENT_MODE,\n        D_NESTING_COMMENT_MODE,\n        D_HEX_STRING_MODE,\n        D_STRING_MODE,\n        D_WYSIWYG_DELIMITED_STRING_MODE,\n        D_ALTERNATE_WYSIWYG_STRING_MODE,\n        D_TOKEN_STRING_MODE,\n        D_FLOAT_MODE,\n        D_INTEGER_MODE,\n        D_CHARACTER_MODE,\n        D_HASHBANG_MODE,\n        D_SPECIAL_TOKEN_SEQUENCE_MODE,\n        D_ATTRIBUTE_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/delphi.js",
    "content": "/*\nLanguage: Delphi\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    'exports register file shl array record property for mod while set ally label uses raise not ' +\n    'stored class safecall var interface or private static exit index inherited to else stdcall ' +\n    'override shr asm far resourcestring finalization packed virtual out and protected library do ' +\n    'xorwrite goto near function end div overload object unit begin string on inline repeat until ' +\n    'destructor write message program with read initialization except default nil if case cdecl in ' +\n    'downto threadvar of try pascal const external constructor type public then implementation ' +\n    'finally published procedure';\n  var COMMENT =  {\n    className: 'comment',\n    variants: [\n      {begin: /\\{/, end: /\\}/, relevance: 0},\n      {begin: /\\(\\*/, end: /\\*\\)/, relevance: 10}\n    ]\n  };\n  var STRING = {\n    className: 'string',\n    begin: /'/, end: /'/,\n    contains: [{begin: /''/}]\n  };\n  var CHAR_STRING = {\n    className: 'string', begin: /(#\\d+)+/\n  };\n  var CLASS = {\n    begin: hljs.IDENT_RE + '\\\\s*=\\\\s*class\\\\s*\\\\(', returnBegin: true,\n    contains: [\n      hljs.TITLE_MODE\n    ]\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'function constructor destructor procedure', end: /[:;]/,\n    keywords: 'function constructor|10 destructor|10 procedure|10',\n    contains: [\n      hljs.TITLE_MODE,\n      {\n        className: 'params',\n        begin: /\\(/, end: /\\)/,\n        keywords: KEYWORDS,\n        contains: [STRING, CHAR_STRING]\n      },\n      COMMENT\n    ]\n  };\n  return {\n    case_insensitive: true,\n    keywords: KEYWORDS,\n    illegal: /(\"|\\$[G-Zg-z]|\\/\\*|<\\/)/,\n    contains: [\n      COMMENT, hljs.C_LINE_COMMENT_MODE,\n      STRING, CHAR_STRING,\n      hljs.NUMBER_MODE,\n      CLASS,\n      FUNCTION\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/diff.js",
    "content": "/*\nLanguage: Diff\nDescription: Unified and context diff\nAuthor: Vasily Polovnyov <vast@whiteants.net>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['patch'],\n    contains: [\n      {\n        className: 'chunk',\n        relevance: 10,\n        variants: [\n          {begin: /^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$/},\n          {begin: /^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},\n          {begin: /^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}\n        ]\n      },\n      {\n        className: 'header',\n        variants: [\n          {begin: /Index: /, end: /$/},\n          {begin: /=====/, end: /=====$/},\n          {begin: /^\\-\\-\\-/, end: /$/},\n          {begin: /^\\*{3} /, end: /$/},\n          {begin: /^\\+\\+\\+/, end: /$/},\n          {begin: /\\*{5}/, end: /\\*{5}$/}\n        ]\n      },\n      {\n        className: 'addition',\n        begin: '^\\\\+', end: '$'\n      },\n      {\n        className: 'deletion',\n        begin: '^\\\\-', end: '$'\n      },\n      {\n        className: 'change',\n        begin: '^\\\\!', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/django.js",
    "content": "/*\nLanguage: Django\nRequires: xml.js\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\nContributors: Ilya Baryshev <baryshev@gmail.com>\n*/\n\nfunction(hljs) {\n  var FILTER = {\n    className: 'filter',\n    begin: /\\|[A-Za-z]+\\:?/,\n    keywords:\n      'truncatewords removetags linebreaksbr yesno get_digit timesince random striptags ' +\n      'filesizeformat escape linebreaks length_is ljust rjust cut urlize fix_ampersands ' +\n      'title floatformat capfirst pprint divisibleby add make_list unordered_list urlencode ' +\n      'timeuntil urlizetrunc wordcount stringformat linenumbers slice date dictsort ' +\n      'dictsortreversed default_if_none pluralize lower join center default ' +\n      'truncatewords_html upper length phone2numeric wordwrap time addslashes slugify first ' +\n      'escapejs force_escape iriencode last safe safeseq truncatechars localize unlocalize ' +\n      'localtime utc timezone',\n    contains: [\n      {className: 'argument', begin: /\"/, end: /\"/},\n      {className: 'argument', begin: /'/, end: /'/}\n    ]\n  };\n\n  return {\n    aliases: ['jinja'],\n    case_insensitive: true,\n    subLanguage: 'xml', subLanguageMode: 'continuous',\n    contains: [\n      {\n        className: 'template_comment',\n        begin: /\\{%\\s*comment\\s*%}/, end: /\\{%\\s*endcomment\\s*%}/\n      },\n      {\n        className: 'template_comment',\n        begin: /\\{#/, end: /#}/\n      },\n      {\n        className: 'template_tag',\n        begin: /\\{%/, end: /%}/,\n        keywords:\n          'comment endcomment load templatetag ifchanged endifchanged if endif firstof for ' +\n          'endfor in ifnotequal endifnotequal widthratio extends include spaceless ' +\n          'endspaceless regroup by as ifequal endifequal ssi now with cycle url filter ' +\n          'endfilter debug block endblock else autoescape endautoescape csrf_token empty elif ' +\n          'endwith static trans blocktrans endblocktrans get_static_prefix get_media_prefix ' +\n          'plural get_current_language language get_available_languages ' +\n          'get_current_language_bidi get_language_info get_language_info_list localize ' +\n          'endlocalize localtime endlocaltime timezone endtimezone get_current_timezone ' +\n          'verbatim',\n        contains: [FILTER]\n      },\n      {\n        className: 'variable',\n        begin: /\\{\\{/, end: /}}/,\n        contains: [FILTER]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/dos.js",
    "content": "/*\nLanguage: DOS .bat\nAuthor: Alexander Makarov (http://rmcreative.ru/)\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['bat', 'cmd'],\n    case_insensitive: true,\n    keywords: {\n      flow: 'if else goto for in do call exit not exist errorlevel defined equ neq lss leq gtr geq',\n      keyword: 'shift cd dir echo setlocal endlocal set pause copy',\n      stream: 'prn nul lpt3 lpt2 lpt1 con com4 com3 com2 com1 aux',\n      winutils: 'ping net ipconfig taskkill xcopy ren del'\n    },\n    contains: [\n      {\n        className: 'envvar', begin: '%%[^ ]'\n      },\n      {\n        className: 'envvar', begin: '%[^ ]+?%'\n      },\n      {\n        className: 'envvar', begin: '![^ ]+?!'\n      },\n      {\n        className: 'number', begin: '\\\\b\\\\d+',\n        relevance: 0\n      },\n      {\n        className: 'comment',\n        begin: '@?rem', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/elixir.js",
    "content": "/*\nLanguage: Elixir\nAuthor: Josh Adams <josh@isotope11.com>\nDescription: language definition for Elixir source code files (.ex and .exs).  Based on ruby language support.\n*/\n\nfunction(hljs) {\n  var ELIXIR_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_]*(\\\\!|\\\\?)?';\n  var ELIXIR_METHOD_RE = '[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?';\n  var ELIXIR_KEYWORDS =\n    'and false then defined module in return redo retry end for true self when ' +\n    'next until do begin unless nil break not case cond alias while ensure or ' +\n    'include use alias fn quote';\n  var SUBST = {\n    className: 'subst',\n    begin: '#\\\\{', end: '}',\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n    variants: [\n      {\n        begin: /'/, end: /'/\n      },\n      {\n        begin: /\"/, end: /\"/\n      }\n    ]\n  };\n  var PARAMS = {\n    endsWithParent: true, returnEnd: true,\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS,\n    relevance: 0\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'def defmacro', end: /\\bdo\\b/,\n    contains: [\n      hljs.inherit(hljs.TITLE_MODE, {\n        begin: ELIXIR_METHOD_RE,\n        starts: PARAMS\n      })\n    ]\n  };\n  var CLASS = hljs.inherit(FUNCTION, {\n    className: 'class',\n    beginKeywords: 'defmodule defrecord', end: /\\bdo\\b|$|;/\n  })\n  var ELIXIR_DEFAULT_CONTAINS = [\n    STRING,\n    hljs.HASH_COMMENT_MODE,\n    CLASS,\n    FUNCTION,\n    {\n      className: 'constant',\n      begin: '(\\\\b[A-Z_]\\\\w*(.)?)+',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':',\n      contains: [STRING, {begin: ELIXIR_METHOD_RE}],\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ELIXIR_IDENT_RE + ':',\n      relevance: 0\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    {\n      className: 'variable',\n      begin: '(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))'\n    },\n    {\n      begin: '->'\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + ')\\\\s*',\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        {\n          className: 'regexp',\n          illegal: '\\\\n',\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n          variants: [\n            {\n              begin: '/', end: '/[a-z]*'\n            },\n            {\n              begin: '%r\\\\[', end: '\\\\][a-z]*'\n            }\n          ]\n        }\n      ],\n      relevance: 0\n    }\n  ];\n  SUBST.contains = ELIXIR_DEFAULT_CONTAINS;\n  PARAMS.contains = ELIXIR_DEFAULT_CONTAINS;\n\n  return {\n    lexemes: ELIXIR_IDENT_RE,\n    keywords: ELIXIR_KEYWORDS,\n    contains: ELIXIR_DEFAULT_CONTAINS\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/erlang-repl.js",
    "content": "/*\n Language: Erlang REPL\n Author: Sergey Ignatov <sergey@ignatov.spb.su>\n */\n\nfunction(hljs) {\n  return {\n    keywords: {\n      special_functions:\n        'spawn spawn_link self',\n      reserved:\n        'after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if ' +\n        'let not of or orelse|10 query receive rem try when xor'\n    },\n    contains: [\n      {\n        className: 'prompt', begin: '^[0-9]+> ',\n        relevance: 10\n      },\n      {\n        className: 'comment',\n        begin: '%', end: '$'\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)',\n        relevance: 0\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'constant', begin: '\\\\?(::)?([A-Z]\\\\w*(::)?)+'\n      },\n      {\n        className: 'arrow', begin: '->'\n      },\n      {\n        className: 'ok', begin: 'ok'\n      },\n      {\n        className: 'exclamation_mark', begin: '!'\n      },\n      {\n        className: 'function_or_atom',\n        begin: '(\\\\b[a-z\\'][a-zA-Z0-9_\\']*:[a-z\\'][a-zA-Z0-9_\\']*)|(\\\\b[a-z\\'][a-zA-Z0-9_\\']*)',\n        relevance: 0\n      },\n      {\n        className: 'variable',\n        begin: '[A-Z][a-zA-Z0-9_\\']*',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/erlang.js",
    "content": "/*\nLanguage: Erlang\nDescription: Erlang is a general-purpose functional language, with strict evaluation, single assignment, and dynamic typing.\nAuthor: Nikolay Zakharov <nikolay.desh@gmail.com>, Dmitry Kovega <arhibot@gmail.com>\n*/\n\nfunction(hljs) {\n  var BASIC_ATOM_RE = '[a-z\\'][a-zA-Z0-9_\\']*';\n  var FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';\n  var ERLANG_RESERVED = {\n    keyword:\n      'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun let ' +\n      'not of orelse|10 query receive rem try when xor',\n    literal:\n      'false true'\n  };\n\n  var COMMENT = {\n    className: 'comment',\n    begin: '%', end: '$'\n  };\n  var NUMBER = {\n    className: 'number',\n    begin: '\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)',\n    relevance: 0\n  };\n  var NAMED_FUN = {\n    begin: 'fun\\\\s+' + BASIC_ATOM_RE + '/\\\\d+'\n  };\n  var FUNCTION_CALL = {\n    begin: FUNCTION_NAME_RE + '\\\\(', end: '\\\\)',\n    returnBegin: true,\n    relevance: 0,\n    contains: [\n      {\n        className: 'function_name', begin: FUNCTION_NAME_RE,\n        relevance: 0\n      },\n      {\n        begin: '\\\\(', end: '\\\\)', endsWithParent: true,\n        returnEnd: true,\n        relevance: 0\n        // \"contains\" defined later\n      }\n    ]\n  };\n  var TUPLE = {\n    className: 'tuple',\n    begin: '{', end: '}',\n    relevance: 0\n    // \"contains\" defined later\n  };\n  var VAR1 = {\n    className: 'variable',\n    begin: '\\\\b_([A-Z][A-Za-z0-9_]*)?',\n    relevance: 0\n  };\n  var VAR2 = {\n    className: 'variable',\n    begin: '[A-Z][a-zA-Z0-9_]*',\n    relevance: 0\n  };\n  var RECORD_ACCESS = {\n    begin: '#' + hljs.UNDERSCORE_IDENT_RE,\n    relevance: 0,\n    returnBegin: true,\n    contains: [\n      {\n        className: 'record_name',\n        begin: '#' + hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: '{', end: '}',\n        relevance: 0\n        // \"contains\" defined later\n      }\n    ]\n  };\n\n  var BLOCK_STATEMENTS = {\n    beginKeywords: 'fun receive if try case', end: 'end',\n    keywords: ERLANG_RESERVED\n  };\n  BLOCK_STATEMENTS.contains = [\n    COMMENT,\n    NAMED_FUN,\n    hljs.inherit(hljs.APOS_STRING_MODE, {className: ''}),\n    BLOCK_STATEMENTS,\n    FUNCTION_CALL,\n    hljs.QUOTE_STRING_MODE,\n    NUMBER,\n    TUPLE,\n    VAR1, VAR2,\n    RECORD_ACCESS\n  ];\n\n  var BASIC_MODES = [\n    COMMENT,\n    NAMED_FUN,\n    BLOCK_STATEMENTS,\n    FUNCTION_CALL,\n    hljs.QUOTE_STRING_MODE,\n    NUMBER,\n    TUPLE,\n    VAR1, VAR2,\n    RECORD_ACCESS\n  ];\n  FUNCTION_CALL.contains[1].contains = BASIC_MODES;\n  TUPLE.contains = BASIC_MODES;\n  RECORD_ACCESS.contains[1].contains = BASIC_MODES;\n\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    contains: BASIC_MODES\n  };\n  return {\n    aliases: ['erl'],\n    keywords: ERLANG_RESERVED,\n    illegal: '(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))',\n    contains: [\n      {\n        className: 'function',\n        begin: '^' + BASIC_ATOM_RE + '\\\\s*\\\\(', end: '->',\n        returnBegin: true,\n        illegal: '\\\\(|#|//|/\\\\*|\\\\\\\\|:|;',\n        contains: [\n          PARAMS,\n          hljs.inherit(hljs.TITLE_MODE, {begin: BASIC_ATOM_RE})\n        ],\n        starts: {\n          end: ';|\\\\.',\n          keywords: ERLANG_RESERVED,\n          contains: BASIC_MODES\n        }\n      },\n      COMMENT,\n      {\n        className: 'pp',\n        begin: '^-', end: '\\\\.',\n        relevance: 0,\n        excludeEnd: true,\n        returnBegin: true,\n        lexemes: '-' + hljs.IDENT_RE,\n        keywords:\n          '-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn ' +\n          '-import -include -include_lib -compile -define -else -endif -file -behaviour ' +\n          '-behavior -spec',\n        contains: [PARAMS]\n      },\n      NUMBER,\n      hljs.QUOTE_STRING_MODE,\n      RECORD_ACCESS,\n      VAR1, VAR2,\n      TUPLE,\n      {begin: /\\.$/} // relevance booster\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/fix.js",
    "content": "/*\nLanguage: FIX\nAuthor: Brent Bradbury <brent@brentium.com>\n*/\n\nfunction(hljs) {\n  return {\n    contains: [\n    {\n      begin: /[^\\u2401\\u0001]+/,\n      end: /[\\u2401\\u0001]/,\n      excludeEnd: true,\n      returnBegin: true,\n      returnEnd: false,\n      contains: [\n      {\n        begin: /([^\\u2401\\u0001=]+)/,\n        end: /=([^\\u2401\\u0001=]+)/,\n        returnEnd: true,\n        returnBegin: false,\n        className: 'attribute'\n      },\n      {\n        begin: /=/,\n        end: /([\\u2401\\u0001])/,\n        excludeEnd: true,\n        excludeBegin: true,\n        className: 'string'\n      }]\n    }],\n    case_insensitive: true\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/fsharp.js",
    "content": "/*\nLanguage: F#\nAuthor: Jonas Follesø <jonas@follesoe.no>\nContributors: Troy Kershaw <hello@troykershaw.com>\nDescription: F# language definition.\n*/\nfunction(hljs) {\n  return {\n    aliases: ['fs'],\n    keywords:\n      'abstract and as assert base begin class default delegate do done ' +\n      'downcast downto elif else end exception extern false finally for ' +\n      'fun function global if in inherit inline interface internal lazy let ' +\n      'match member module mutable namespace new null of open or ' +\n      'override private public rec return sig static struct then to ' +\n      'true try type upcast use val void when while with yield',\n    contains: [\n      {\n        className: 'string',\n        begin: '@\"', end: '\"',\n        contains: [{begin: '\"\"'}]\n      },\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\(\\\\*', end: '\\\\*\\\\)'\n      },\n      {\n        className: 'class',\n        beginKeywords: 'type', end: '\\\\(|=|$', excludeEnd: true,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'annotation',\n        begin: '\\\\[<', end: '>\\\\]'\n      },\n      {\n        className: 'attribute',\n        begin: '\\\\B(\\'[A-Za-z])\\\\b',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/gherkin.js",
    "content": "/*\n Language: Gherkin\n Author: Sam Pikesley (@pikesley) <sam.pikesley@theodi.org>\n Description: Gherkin (Cucumber etc)\n */\n\nfunction (hljs) {\n  return {\n    keywords: 'Feature Background Ability Business\\ Need Scenario Scenarios Scenario\\ Outline Scenario\\ Template Examples Given And Then But When',\n    contains: [\n      {\n        className: 'keyword',\n        begin: '\\\\*'\n      },\n      {\n        className: 'comment',\n        begin: '@[^@\\r\\n\\t ]+', end: '$'\n      },\n      {\n        className: 'string',\n        begin: '\\\\|', end: '\\\\$'\n      },\n      {\n        className: 'variable',\n        begin: '<', end: '>',\n      },\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/glsl.js",
    "content": "/*\nLanguage: GLSL\nDescription: OpenGL Shading Language\nAuthor: Sergey Tikhomirov <me@stikhomirov.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        'atomic_uint attribute bool break bvec2 bvec3 bvec4 case centroid coherent const continue default ' +\n        'discard dmat2 dmat2x2 dmat2x3 dmat2x4 dmat3 dmat3x2 dmat3x3 dmat3x4 dmat4 dmat4x2 dmat4x3 ' +\n        'dmat4x4 do double dvec2 dvec3 dvec4 else flat float for highp if iimage1D iimage1DArray ' +\n        'iimage2D iimage2DArray iimage2DMS iimage2DMSArray iimage2DRect iimage3D iimageBuffer iimageCube ' +\n        'iimageCubeArray image1D image1DArray image2D image2DArray image2DMS image2DMSArray image2DRect ' +\n        'image3D imageBuffer imageCube imageCubeArray in inout int invariant isampler1D isampler1DArray ' +\n        'isampler2D isampler2DArray isampler2DMS isampler2DMSArray isampler2DRect isampler3D isamplerBuffer ' +\n        'isamplerCube isamplerCubeArray ivec2 ivec3 ivec4 layout lowp mat2 mat2x2 mat2x3 mat2x4 mat3 mat3x2 ' +\n        'mat3x3 mat3x4 mat4 mat4x2 mat4x3 mat4x4 mediump noperspective out patch precision readonly restrict ' +\n        'return sample sampler1D sampler1DArray sampler1DArrayShadow sampler1DShadow sampler2D sampler2DArray ' +\n        'sampler2DArrayShadow sampler2DMS sampler2DMSArray sampler2DRect sampler2DRectShadow sampler2DShadow ' +\n        'sampler3D samplerBuffer samplerCube samplerCubeArray samplerCubeArrayShadow samplerCubeShadow smooth ' +\n        'struct subroutine switch uimage1D uimage1DArray uimage2D uimage2DArray uimage2DMS uimage2DMSArray ' +\n        'uimage2DRect uimage3D uimageBuffer uimageCube uimageCubeArray uint uniform usampler1D usampler1DArray ' +\n        'usampler2D usampler2DArray usampler2DMS usampler2DMSArray usampler2DRect usampler3D usamplerBuffer ' +\n        'usamplerCube usamplerCubeArray uvec2 uvec3 uvec4 varying vec2 vec3 vec4 void volatile while writeonly',\n      built_in:\n        'gl_BackColor gl_BackLightModelProduct gl_BackLightProduct gl_BackMaterial ' +\n        'gl_BackSecondaryColor gl_ClipDistance gl_ClipPlane gl_ClipVertex gl_Color ' +\n        'gl_DepthRange gl_EyePlaneQ gl_EyePlaneR gl_EyePlaneS gl_EyePlaneT gl_Fog gl_FogCoord ' +\n        'gl_FogFragCoord gl_FragColor gl_FragCoord gl_FragData gl_FragDepth gl_FrontColor ' +\n        'gl_FrontFacing gl_FrontLightModelProduct gl_FrontLightProduct gl_FrontMaterial ' +\n        'gl_FrontSecondaryColor gl_InstanceID gl_InvocationID gl_Layer gl_LightModel ' +\n        'gl_LightSource gl_MaxAtomicCounterBindings gl_MaxAtomicCounterBufferSize ' +\n        'gl_MaxClipDistances gl_MaxClipPlanes gl_MaxCombinedAtomicCounterBuffers ' +\n        'gl_MaxCombinedAtomicCounters gl_MaxCombinedImageUniforms gl_MaxCombinedImageUnitsAndFragmentOutputs ' +\n        'gl_MaxCombinedTextureImageUnits gl_MaxDrawBuffers gl_MaxFragmentAtomicCounterBuffers ' +\n        'gl_MaxFragmentAtomicCounters gl_MaxFragmentImageUniforms gl_MaxFragmentInputComponents ' +\n        'gl_MaxFragmentUniformComponents gl_MaxFragmentUniformVectors gl_MaxGeometryAtomicCounterBuffers ' +\n        'gl_MaxGeometryAtomicCounters gl_MaxGeometryImageUniforms gl_MaxGeometryInputComponents ' +\n        'gl_MaxGeometryOutputComponents gl_MaxGeometryOutputVertices gl_MaxGeometryTextureImageUnits ' +\n        'gl_MaxGeometryTotalOutputComponents gl_MaxGeometryUniformComponents gl_MaxGeometryVaryingComponents ' +\n        'gl_MaxImageSamples gl_MaxImageUnits gl_MaxLights gl_MaxPatchVertices gl_MaxProgramTexelOffset ' +\n        'gl_MaxTessControlAtomicCounterBuffers gl_MaxTessControlAtomicCounters gl_MaxTessControlImageUniforms ' +\n        'gl_MaxTessControlInputComponents gl_MaxTessControlOutputComponents gl_MaxTessControlTextureImageUnits ' +\n        'gl_MaxTessControlTotalOutputComponents gl_MaxTessControlUniformComponents ' +\n        'gl_MaxTessEvaluationAtomicCounterBuffers gl_MaxTessEvaluationAtomicCounters ' +\n        'gl_MaxTessEvaluationImageUniforms gl_MaxTessEvaluationInputComponents gl_MaxTessEvaluationOutputComponents ' +\n        'gl_MaxTessEvaluationTextureImageUnits gl_MaxTessEvaluationUniformComponents ' +\n        'gl_MaxTessGenLevel gl_MaxTessPatchComponents gl_MaxTextureCoords gl_MaxTextureImageUnits ' +\n        'gl_MaxTextureUnits gl_MaxVaryingComponents gl_MaxVaryingFloats gl_MaxVaryingVectors ' +\n        'gl_MaxVertexAtomicCounterBuffers gl_MaxVertexAtomicCounters gl_MaxVertexAttribs ' +\n        'gl_MaxVertexImageUniforms gl_MaxVertexOutputComponents gl_MaxVertexTextureImageUnits ' +\n        'gl_MaxVertexUniformComponents gl_MaxVertexUniformVectors gl_MaxViewports gl_MinProgramTexelOffset'+\n        'gl_ModelViewMatrix gl_ModelViewMatrixInverse gl_ModelViewMatrixInverseTranspose ' +\n        'gl_ModelViewMatrixTranspose gl_ModelViewProjectionMatrix gl_ModelViewProjectionMatrixInverse ' +\n        'gl_ModelViewProjectionMatrixInverseTranspose gl_ModelViewProjectionMatrixTranspose ' +\n        'gl_MultiTexCoord0 gl_MultiTexCoord1 gl_MultiTexCoord2 gl_MultiTexCoord3 gl_MultiTexCoord4 ' +\n        'gl_MultiTexCoord5 gl_MultiTexCoord6 gl_MultiTexCoord7 gl_Normal gl_NormalMatrix ' +\n        'gl_NormalScale gl_ObjectPlaneQ gl_ObjectPlaneR gl_ObjectPlaneS gl_ObjectPlaneT gl_PatchVerticesIn ' +\n        'gl_PerVertex gl_Point gl_PointCoord gl_PointSize gl_Position gl_PrimitiveID gl_PrimitiveIDIn ' +\n        'gl_ProjectionMatrix gl_ProjectionMatrixInverse gl_ProjectionMatrixInverseTranspose ' +\n        'gl_ProjectionMatrixTranspose gl_SampleID gl_SampleMask gl_SampleMaskIn gl_SamplePosition ' +\n        'gl_SecondaryColor gl_TessCoord gl_TessLevelInner gl_TessLevelOuter gl_TexCoord gl_TextureEnvColor ' +\n        'gl_TextureMatrixInverseTranspose gl_TextureMatrixTranspose gl_Vertex gl_VertexID ' +\n        'gl_ViewportIndex gl_in gl_out EmitStreamVertex EmitVertex EndPrimitive EndStreamPrimitive ' +\n        'abs acos acosh all any asin asinh atan atanh atomicCounter atomicCounterDecrement ' +\n        'atomicCounterIncrement barrier bitCount bitfieldExtract bitfieldInsert bitfieldReverse ' +\n        'ceil clamp cos cosh cross dFdx dFdy degrees determinant distance dot equal exp exp2 faceforward ' +\n        'findLSB findMSB floatBitsToInt floatBitsToUint floor fma fract frexp ftransform fwidth greaterThan ' +\n        'greaterThanEqual imageAtomicAdd imageAtomicAnd imageAtomicCompSwap imageAtomicExchange ' +\n        'imageAtomicMax imageAtomicMin imageAtomicOr imageAtomicXor imageLoad imageStore imulExtended ' +\n        'intBitsToFloat interpolateAtCentroid interpolateAtOffset interpolateAtSample inverse inversesqrt ' +\n        'isinf isnan ldexp length lessThan lessThanEqual log log2 matrixCompMult max memoryBarrier ' +\n        'min mix mod modf noise1 noise2 noise3 noise4 normalize not notEqual outerProduct packDouble2x32 ' +\n        'packHalf2x16 packSnorm2x16 packSnorm4x8 packUnorm2x16 packUnorm4x8 pow radians reflect refract ' +\n        'round roundEven shadow1D shadow1DLod shadow1DProj shadow1DProjLod shadow2D shadow2DLod shadow2DProj ' +\n        'shadow2DProjLod sign sin sinh smoothstep sqrt step tan tanh texelFetch texelFetchOffset texture ' +\n        'texture1D texture1DLod texture1DProj texture1DProjLod texture2D texture2DLod texture2DProj ' +\n        'texture2DProjLod texture3D texture3DLod texture3DProj texture3DProjLod textureCube textureCubeLod ' +\n        'textureGather textureGatherOffset textureGatherOffsets textureGrad textureGradOffset textureLod ' +\n        'textureLodOffset textureOffset textureProj textureProjGrad textureProjGradOffset textureProjLod ' +\n        'textureProjLodOffset textureProjOffset textureQueryLod textureSize transpose trunc uaddCarry ' +\n        'uintBitsToFloat umulExtended unpackDouble2x32 unpackHalf2x16 unpackSnorm2x16 unpackSnorm4x8 ' +\n        'unpackUnorm2x16 unpackUnorm4x8 usubBorrow gl_TextureMatrix gl_TextureMatrixInverse',\n      literal: 'true false'\n    },\n    illegal: '\"',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/go.js",
    "content": "/*\nLanguage: Go\nAuthor: Stephan Kountso aka StepLg <steplg@gmail.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>\nDescription: Google go language (golang). For info about language see http://golang.org/\n*/\n\nfunction(hljs) {\n  var GO_KEYWORDS = {\n    keyword:\n      'break default func interface select case map struct chan else goto package switch ' +\n      'const fallthrough if range type continue for import return var go defer',\n    constant:\n       'true false iota nil',\n    typename:\n      'bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 ' +\n      'uint16 uint32 uint64 int uint uintptr rune',\n    built_in:\n      'append cap close complex copy imag len make new panic print println real recover delete'\n  };\n  return {\n    aliases: [\"golang\"],\n    keywords: GO_KEYWORDS,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '\\'', end: '[^\\\\\\\\]\\''\n      },\n      {\n        className: 'string',\n        begin: '`', end: '`'\n      },\n      {\n        className: 'number',\n        begin: '[^a-zA-Z_0-9](\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?',\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/gradle.js",
    "content": "/*\nLanguage: Gradle\nAuthor: Damian Mee <mee.damian@gmail.com>\nWebsite: http://meeDamian.com\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'task project allprojects subprojects artifacts buildscript configurations ' +\n        'dependencies repositories sourceSets description delete from into include ' +\n        'exclude source classpath destinationDir includes options sourceCompatibility ' +\n        'targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant ' +\n        'def abstract break case catch continue default do else extends final finally ' +\n        'for if implements instanceof native new private protected public return static ' +\n        'switch synchronized throw throws transient try volatile while strictfp package ' +\n        'import false null super this true antlrtask checkstyle codenarc copy boolean ' +\n        'byte char class double float int interface long short void compile runTime ' +\n        'file fileTree abs any append asList asWritable call collect compareTo count ' +\n        'div dump each eachByte eachFile eachLine every find findAll flatten getAt ' +\n        'getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods ' +\n        'isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter ' +\n        'newReader newWriter next plus pop power previous print println push putAt read ' +\n        'readBytes readLines reverse reverseEach round size sort splitEachLine step subMap ' +\n        'times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader ' +\n        'withStream withWriter withWriterAppend write writeLine'\n    },\n    contains: [    \n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.REGEXP_MODE\n\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/haml.js",
    "content": "/*\nLanguage: Haml\nRequires: ruby.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://google.com/profiles/dan.j.allen\n*/\n\n// TODO support filter tags like :javascript, support inline HTML\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    contains: [\n      {\n        className: 'doctype',\n        begin: '^!!!( (5|1\\\\.1|Strict|Frameset|Basic|Mobile|RDFa|XML\\\\b.*))?$',\n        relevance: 10\n      },\n      {\n        className: 'comment',\n        // FIXME these comments should be allowed to span indented lines\n        begin: '^\\\\s*(!=#|=#|-#|/).*$',\n        relevance: 0\n      },\n      {\n        begin: '^\\\\s*(-|=|!=)(?!#)',\n        starts: {\n          end: '\\\\n',\n          subLanguage: 'ruby'\n        }\n      },\n      {\n        className: 'tag',\n        begin: '^\\\\s*%',\n        contains: [\n          {\n            className: 'title',\n            begin: '\\\\w+'\n          },\n          {\n            className: 'value',\n            begin: '[#\\\\.]\\\\w+'\n          },\n          {\n            begin: '{\\\\s*',\n            end: '\\\\s*}',\n            excludeEnd: true,\n            contains: [\n              {\n                //className: 'attribute',\n                begin: ':\\\\w+\\\\s*=>',\n                end: ',\\\\s+',\n                returnBegin: true,\n                endsWithParent: true,\n                contains: [\n                  {\n                    className: 'symbol',\n                    begin: ':\\\\w+'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\"',\n                    end: '\"'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\\'',\n                    end: '\\''\n                  },\n                  {\n                    begin: '\\\\w+',\n                    relevance: 0\n                  }\n                ]\n              }\n            ]\n          },\n          {\n            begin: '\\\\(\\\\s*',\n            end: '\\\\s*\\\\)',\n            excludeEnd: true,\n            contains: [\n              {\n                //className: 'attribute',\n                begin: '\\\\w+\\\\s*=',\n                end: '\\\\s+',\n                returnBegin: true,\n                endsWithParent: true,\n                contains: [\n                  {\n                    className: 'attribute',\n                    begin: '\\\\w+',\n                    relevance: 0\n                  },\n                  {\n                    className: 'string',\n                    begin: '\"',\n                    end: '\"'\n                  },\n                  {\n                    className: 'string',\n                    begin: '\\'',\n                    end: '\\''\n                  },\n                  {\n                    begin: '\\\\w+',\n                    relevance: 0\n                  }\n                ]\n              }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'bullet',\n        begin: '^\\\\s*[=~]\\\\s*',\n        relevance: 0\n      },\n      {\n        begin: '#{',\n        starts: {\n          end: '}',\n          subLanguage: 'ruby'\n        }\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/handlebars.js",
    "content": "/*\nLanguage: Handlebars\nRequires: xml.js\nAuthor: Robin Ward <robin.ward@gmail.com>\nDescription: Matcher for Handlebars as well as EmberJS additions.\n*/\n\nfunction(hljs) {\n  var EXPRESSION_KEYWORDS = 'each in with if else unless bindattr action collection debugger log outlet template unbound view yield';\n  return {\n    aliases: ['hbs', 'html.hbs', 'html.handlebars'],\n    case_insensitive: true,\n    subLanguage: 'xml', subLanguageMode: 'continuous',\n    contains: [\n      {\n        className: 'expression',\n        begin: '{{', end: '}}',\n        contains: [\n          {\n            className: 'begin-block', begin: '\\#[a-zA-Z\\-\\ \\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          },\n          {\n            className: 'string',\n            begin: '\"', end: '\"'\n          },\n          {\n            className: 'end-block', begin: '\\\\\\/[a-zA-Z\\-\\ \\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          },\n          {\n            className: 'variable', begin: '[a-zA-Z\\-\\.]+',\n            keywords: EXPRESSION_KEYWORDS\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/haskell.js",
    "content": "/*\nLanguage: Haskell\nAuthor: Jeremy Hull <sourdrums@gmail.com>\nContributors: Zena Treep <zena.treep@gmail.com>\n*/\n\nfunction(hljs) {\n\n  var COMMENT = {\n    className: 'comment',\n    variants: [\n      { begin: '--', end: '$' },\n      { begin: '{-', end: '-}'\n      , contains: ['self']\n      }\n    ]\n  };\n\n  var PRAGMA = {\n    className: 'pragma',\n    begin: '{-#', end: '#-}'\n  };\n\n  var PREPROCESSOR = {\n    className: 'preprocessor',\n    begin: '^#', end: '$'\n  };\n\n  var CONSTRUCTOR = {\n    className: 'type',\n    begin: '\\\\b[A-Z][\\\\w\\']*', // TODO: other constructors (build-in, infix).\n    relevance: 0\n  };\n\n  var LIST = {\n    className: 'container',\n    begin: '\\\\(', end: '\\\\)',\n    illegal: '\"',\n    contains: [\n      PRAGMA,\n      COMMENT,\n      PREPROCESSOR,\n      {className: 'type', begin: '\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?'},\n      hljs.inherit(hljs.TITLE_MODE, {begin: '[_a-z][\\\\w\\']*'})\n    ]\n  };\n\n  var RECORD = {\n    className: 'container',\n    begin: '{', end: '}',\n    contains: LIST.contains\n  };\n\n  return {\n    aliases: ['hs'],\n    keywords:\n      'let in if then else case of where do module import hiding ' +\n      'qualified type data newtype deriving class instance as default ' +\n      'infix infixl infixr foreign export ccall stdcall cplusplus ' +\n      'jvm dotnet safe unsafe family forall mdo proc rec',\n    contains: [\n\n      // Top-level constructions.\n\n      {\n        className: 'module',\n        begin: '\\\\bmodule\\\\b', end: 'where',\n        keywords: 'module where',\n        contains: [LIST, COMMENT],\n        illegal: '\\\\W\\\\.|;'\n      },\n      {\n        className: 'import',\n        begin: '\\\\bimport\\\\b', end: '$',\n        keywords: 'import|0 qualified as hiding',\n        contains: [LIST, COMMENT],\n        illegal: '\\\\W\\\\.|;'\n      },\n\n      {\n        className: 'class',\n        begin: '^(\\\\s*)?(class|instance)\\\\b', end: 'where',\n        keywords: 'class family instance where',\n        contains: [CONSTRUCTOR, LIST, COMMENT]\n      },\n      {\n        className: 'typedef',\n        begin: '\\\\b(data|(new)?type)\\\\b', end: '$',\n        keywords: 'data family type newtype deriving',\n        contains: [PRAGMA, COMMENT, CONSTRUCTOR, LIST, RECORD]\n      },\n      {\n        className: 'default',\n        beginKeywords: 'default', end: '$',\n        contains: [CONSTRUCTOR, LIST, COMMENT]\n      },\n      {\n        className: 'infix',\n        beginKeywords: 'infix infixl infixr', end: '$',\n        contains: [hljs.C_NUMBER_MODE, COMMENT]\n      },\n      {\n        className: 'foreign',\n        begin: '\\\\bforeign\\\\b', end: '$',\n        keywords: 'foreign import export ccall stdcall cplusplus jvm ' +\n                  'dotnet safe unsafe',\n        contains: [CONSTRUCTOR, hljs.QUOTE_STRING_MODE, COMMENT]\n      },\n      {\n        className: 'shebang',\n        begin: '#!\\\\/usr\\\\/bin\\\\/env\\ runhaskell', end: '$'\n      },\n\n      // \"Whitespaces\".\n\n      PRAGMA,\n      COMMENT,\n      PREPROCESSOR,\n\n      // Literals and names.\n\n      // TODO: characters.\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      CONSTRUCTOR,\n      hljs.inherit(hljs.TITLE_MODE, {begin: '^[_a-z][\\\\w\\']*'}),\n\n      {begin: '->|<-'} // No markup, relevance booster\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/haxe.js",
    "content": "/*\nLanguage: Haxe\nAuthor: Christopher Kaster <ikasoki@gmail.com> (Based on the actionscript.js language file by Alexander Myadzel)\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*';\n  var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)';\n\n  return {\n    aliases: ['hx'],\n    keywords: {\n      keyword: 'break callback case cast catch class continue default do dynamic else enum extends extern ' +\n\t\t'for function here if implements import in inline interface never new override package private ' + \n\t\t'public return static super switch this throw trace try typedef untyped using var while',\n      literal: 'true false null'\n    },\n    contains: [\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.TITLE_MODE\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elseif end error'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '[{;]', excludeEnd: true,\n        illegal: '\\\\S',\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.APOS_STRING_MODE,\n              hljs.QUOTE_STRING_MODE,\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ]\n          },\n          {\n            className: 'type',\n            begin: ':',\n            end: IDENT_FUNC_RETURN_TYPE_RE,\n            relevance: 10\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/http.js",
    "content": "/*\n  Language: HTTP\n  Description: HTTP request and response headers with automatic body highlighting\n  Author: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  return {\n    illegal: '\\\\S',\n    contains: [\n      {\n        className: 'status',\n        begin: '^HTTP/[0-9\\\\.]+', end: '$',\n        contains: [{className: 'number', begin: '\\\\b\\\\d{3}\\\\b'}]\n      },\n      {\n        className: 'request',\n        begin: '^[A-Z]+ (.*?) HTTP/[0-9\\\\.]+$', returnBegin: true, end: '$',\n        contains: [\n          {\n            className: 'string',\n            begin: ' ', end: ' ',\n            excludeBegin: true, excludeEnd: true\n          }\n        ]\n      },\n      {\n        className: 'attribute',\n        begin: '^\\\\w', end: ': ', excludeEnd: true,\n        illegal: '\\\\n|\\\\s|=',\n        starts: {className: 'string', end: '$'}\n      },\n      {\n        begin: '\\\\n\\\\n',\n        starts: {subLanguage: '', endsWithParent: true}\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/ini.js",
    "content": "/*\nLanguage: Ini\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    illegal: /\\S/,\n    contains: [\n      {\n        className: 'comment',\n        begin: ';', end: '$'\n      },\n      {\n        className: 'title',\n        begin: '^\\\\[', end: '\\\\]'\n      },\n      {\n        className: 'setting',\n        begin: '^[a-z0-9\\\\[\\\\]_-]+[ \\\\t]*=[ \\\\t]*', end: '$',\n        contains: [\n          {\n            className: 'value',\n            endsWithParent: true,\n            keywords: 'on off true false yes no',\n            contains: [hljs.QUOTE_STRING_MODE, hljs.NUMBER_MODE],\n            relevance: 0\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/java.js",
    "content": "/*\nLanguage: Java\nAuthor: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>\n*/\n\nfunction(hljs) {\n  var KEYWORDS =\n    'false synchronized int abstract float private char boolean static null if const ' +\n    'for true while long throw strictfp finally protected import native final return void ' +\n    'enum else break transient new catch instanceof byte super volatile case assert short ' +\n    'package default double public try this switch continue throws';\n  return {\n    aliases: ['jsp'],\n    keywords: KEYWORDS,\n    illegal: /<\\//,\n    contains: [\n      {\n        className: 'javadoc',\n        begin: '/\\\\*\\\\*', end: '\\\\*/',\n        contains: [{\n          className: 'javadoctag', begin: '(^|\\\\s)@[A-Za-z]+'\n        }],\n        relevance: 10\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        beginKeywords: 'protected public private', end: /[{;=]/,\n        keywords: KEYWORDS,\n        contains: [\n          {\n            className: 'class',\n            beginKeywords: 'class interface', endsWithParent: true, excludeEnd: true,\n            illegal: /[:\"\\[\\]]/,\n            contains: [\n              {\n                beginKeywords: 'extends implements',\n                relevance: 10\n              },\n              hljs.UNDERSCORE_TITLE_MODE\n            ]\n          },\n          {\n            begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s*\\\\(', returnBegin: true,\n            contains: [\n              hljs.UNDERSCORE_TITLE_MODE\n            ]\n          }\n        ]\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'annotation', begin: '@[A-Za-z]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/javascript.js",
    "content": "/*\nLanguage: JavaScript\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['js'],\n    keywords: {\n      keyword:\n        'in if for while finally var new function do return void else break catch ' +\n        'instanceof with throw case default try this switch continue typeof delete ' +\n        'let yield const class',\n      literal:\n        'true false null undefined NaN Infinity',\n      built_in:\n        'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +\n        'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +\n        'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +\n        'TypeError URIError Number Math Date String RegExp Array Float32Array ' +\n        'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +\n        'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +\n        'module console window document'\n    },\n    contains: [\n      {\n        className: 'pi',\n        begin: /^\\s*('|\")use strict('|\")/,\n        relevance: 10\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        contains: [\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          hljs.REGEXP_MODE,\n          { // E4X\n            begin: /</, end: />;/,\n            relevance: 0,\n            subLanguage: 'xml'\n          }\n        ],\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /\\{/, excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/}),\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"'\\(]/\n          }\n        ],\n        illegal: /\\[|%/\n      },\n      {\n        begin: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      },\n      {\n        begin: '\\\\.' + hljs.IDENT_RE, relevance: 0 // hack: prevents detection of keywords after dots\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/json.js",
    "content": "/*\nLanguage: JSON\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var LITERALS = {literal: 'true false null'};\n  var TYPES = [\n    hljs.QUOTE_STRING_MODE,\n    hljs.C_NUMBER_MODE\n  ];\n  var VALUE_CONTAINER = {\n    className: 'value',\n    end: ',', endsWithParent: true, excludeEnd: true,\n    contains: TYPES,\n    keywords: LITERALS\n  };\n  var OBJECT = {\n    begin: '{', end: '}',\n    contains: [\n      {\n        className: 'attribute',\n        begin: '\\\\s*\"', end: '\"\\\\s*:\\\\s*', excludeBegin: true, excludeEnd: true,\n        contains: [hljs.BACKSLASH_ESCAPE],\n        illegal: '\\\\n',\n        starts: VALUE_CONTAINER\n      }\n    ],\n    illegal: '\\\\S'\n  };\n  var ARRAY = {\n    begin: '\\\\[', end: '\\\\]',\n    contains: [hljs.inherit(VALUE_CONTAINER, {className: null})], // inherit is also a workaround for a bug that makes shared modes with endsWithParent compile only the ending of one of the parents\n    illegal: '\\\\S'\n  };\n  TYPES.splice(TYPES.length, 0, OBJECT, ARRAY);\n  return {\n    contains: TYPES,\n    keywords: LITERALS,\n    illegal: '\\\\S'\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/lasso.js",
    "content": "/*\nLanguage: Lasso\nAuthor: Eric Knibbe <eric@lassosoft.com>\nDescription: Lasso is a language and server platform for database-driven web applications. This definition handles Lasso 9 syntax and LassoScript for Lasso 8.6 and earlier.\n*/\n\nfunction(hljs) {\n  var LASSO_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_.]*';\n  var LASSO_ANGLE_RE = '<\\\\?(lasso(script)?|=)';\n  var LASSO_CLOSE_RE = '\\\\]|\\\\?>';\n  var LASSO_KEYWORDS = {\n    literal:\n      'true false none minimal full all void and or not ' +\n      'bw nbw ew new cn ncn lt lte gt gte eq neq rx nrx ft',\n    built_in:\n      'array date decimal duration integer map pair string tag xml null ' +\n      'bytes list queue set stack staticarray tie local var variable ' +\n      'global data self inherited',\n    keyword:\n      'error_code error_msg error_pop error_push error_reset cache ' +\n      'database_names database_schemanames database_tablenames define_tag ' +\n      'define_type email_batch encode_set html_comment handle handle_error ' +\n      'header if inline iterate ljax_target link link_currentaction ' +\n      'link_currentgroup link_currentrecord link_detail link_firstgroup ' +\n      'link_firstrecord link_lastgroup link_lastrecord link_nextgroup ' +\n      'link_nextrecord link_prevgroup link_prevrecord log loop ' +\n      'namespace_using output_none portal private protect records referer ' +\n      'referrer repeating resultset rows search_args search_arguments ' +\n      'select sort_args sort_arguments thread_atomic value_list while ' +\n      'abort case else if_empty if_false if_null if_true loop_abort ' +\n      'loop_continue loop_count params params_up return return_value ' +\n      'run_children soap_definetag soap_lastrequest soap_lastresponse ' +\n      'tag_name ascending average by define descending do equals ' +\n      'frozen group handle_failure import in into join let match max ' +\n      'min on order parent protected provide public require returnhome ' +\n      'skip split_thread sum take thread to trait type where with ' +\n      'yield yieldhome'\n  };\n  var HTML_COMMENT = {\n    className: 'comment',\n    begin: '<!--', end: '-->',\n    relevance: 0\n  };\n  var LASSO_NOPROCESS = {\n    className: 'preprocessor',\n    begin: '\\\\[noprocess\\\\]',\n    starts: {\n      className: 'markup',\n      end: '\\\\[/noprocess\\\\]',\n      returnEnd: true,\n      contains: [HTML_COMMENT]\n    }\n  };\n  var LASSO_START = {\n    className: 'preprocessor',\n    begin: '\\\\[/noprocess|' + LASSO_ANGLE_RE\n  };\n  var LASSO_DATAMEMBER = {\n    className: 'variable',\n    begin: '\\'' + LASSO_IDENT_RE + '\\''\n  };\n  var LASSO_CODE = [\n    hljs.C_LINE_COMMENT_MODE,\n    {\n      className: 'javadoc',\n      begin: '/\\\\*\\\\*!', end: '\\\\*/',\n      contains: [hljs.PHRASAL_WORDS_MODE]\n    },\n    hljs.C_BLOCK_COMMENT_MODE,\n    hljs.inherit(hljs.C_NUMBER_MODE, {begin: hljs.C_NUMBER_RE + '|-?(infinity|nan)\\\\b'}),\n    hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n    hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n    {\n      className: 'string',\n      begin: '`', end: '`'\n    },\n    {\n      className: 'variable',\n      variants: [\n        {\n          begin: '[#$]' + LASSO_IDENT_RE\n        },\n        {\n          begin: '#', end: '\\\\d+',\n          illegal: '\\\\W'\n        }\n      ]\n    },\n    {\n      className: 'tag',\n      begin: '::\\\\s*', end: LASSO_IDENT_RE,\n      illegal: '\\\\W'\n    },\n    {\n      className: 'attribute',\n      variants: [\n        {\n          begin: '-' + hljs.UNDERSCORE_IDENT_RE,\n          relevance: 0\n        },\n        {\n          begin: '(\\\\.\\\\.\\\\.)'\n        }\n      ]\n    },\n    {\n      className: 'subst',\n      variants: [\n        {\n          begin: '->\\\\s*',\n          contains: [LASSO_DATAMEMBER]\n        },\n        {\n          begin: ':=|/(?!\\\\w)=?|[-+*%=<>&|!?\\\\\\\\]+',\n          relevance: 0\n        }\n      ]\n    },\n    {\n      className: 'built_in',\n      begin: '\\\\.\\\\.?',\n      relevance: 0,\n      contains: [LASSO_DATAMEMBER]\n    },\n    {\n      className: 'class',\n      beginKeywords: 'define',\n      returnEnd: true, end: '\\\\(|=>',\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: hljs.UNDERSCORE_IDENT_RE + '(=(?!>))?'})\n      ]\n    }\n  ];\n  return {\n    aliases: ['ls', 'lassoscript'],\n    case_insensitive: true,\n    lexemes: LASSO_IDENT_RE + '|&[lg]t;',\n    keywords: LASSO_KEYWORDS,\n    contains: [\n      {\n        className: 'preprocessor',\n        begin: LASSO_CLOSE_RE,\n        relevance: 0,\n        starts: {\n          className: 'markup',\n          end: '\\\\[|' + LASSO_ANGLE_RE,\n          returnEnd: true,\n          relevance: 0,\n          contains: [HTML_COMMENT]\n        }\n      },\n      LASSO_NOPROCESS,\n      LASSO_START,\n      {\n        className: 'preprocessor',\n        begin: '\\\\[no_square_brackets',\n        starts: {\n          end: '\\\\[/no_square_brackets\\\\]', // not implemented in the language\n          lexemes: LASSO_IDENT_RE + '|&[lg]t;',\n          keywords: LASSO_KEYWORDS,\n          contains: [\n            {\n              className: 'preprocessor',\n              begin: LASSO_CLOSE_RE,\n              relevance: 0,\n              starts: {\n                className: 'markup',\n                end: LASSO_ANGLE_RE,\n                returnEnd: true,\n                contains: [HTML_COMMENT]\n              }\n            },\n            LASSO_NOPROCESS,\n            LASSO_START\n          ].concat(LASSO_CODE)\n        }\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\[',\n        relevance: 0\n      },\n      {\n        className: 'shebang',\n        begin: '^#!.+lasso9\\\\b',\n        relevance: 10\n      }\n    ].concat(LASSO_CODE)\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/lisp.js",
    "content": "/*\nLanguage: Lisp\nDescription: Generic lisp syntax\nAuthor: Vasily Polovnyov <vast@whiteants.net>\n*/\n\nfunction(hljs) {\n  var LISP_IDENT_RE = '[a-zA-Z_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#][a-zA-Z0-9_\\\\-\\\\+\\\\*\\\\/\\\\<\\\\=\\\\>\\\\&\\\\#!]*';\n  var LISP_SIMPLE_NUMBER_RE = '(\\\\-|\\\\+)?\\\\d+(\\\\.\\\\d+|\\\\/\\\\d+)?((d|e|f|l|s)(\\\\+|\\\\-)?\\\\d+)?';\n  var SHEBANG = {\n    className: 'shebang',\n    begin: '^#!', end: '$'\n  };\n  var LITERAL = {\n    className: 'literal',\n    begin: '\\\\b(t{1}|nil)\\\\b'\n  };\n  var NUMBER = {\n    className: 'number',\n    variants: [\n      {begin: LISP_SIMPLE_NUMBER_RE, relevance: 0},\n      {begin: '#b[0-1]+(/[0-1]+)?'},\n      {begin: '#o[0-7]+(/[0-7]+)?'},\n      {begin: '#x[0-9a-f]+(/[0-9a-f]+)?'},\n      {begin: '#c\\\\(' + LISP_SIMPLE_NUMBER_RE + ' +' + LISP_SIMPLE_NUMBER_RE, end: '\\\\)'}\n    ]\n  };\n  var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null});\n  var COMMENT = {\n    className: 'comment',\n    begin: ';', end: '$'\n  };\n  var VARIABLE = {\n    className: 'variable',\n    begin: '\\\\*', end: '\\\\*'\n  };\n  var KEYWORD = {\n    className: 'keyword',\n    begin: '[:&]' + LISP_IDENT_RE\n  };\n  var QUOTED_LIST = {\n    begin: '\\\\(', end: '\\\\)',\n    contains: ['self', LITERAL, STRING, NUMBER]\n  };\n  var QUOTED = {\n    className: 'quoted',\n    contains: [NUMBER, STRING, VARIABLE, KEYWORD, QUOTED_LIST],\n    variants: [\n      {\n        begin: '[\\'`]\\\\(', end: '\\\\)'\n      },\n      {\n        begin: '\\\\(quote ', end: '\\\\)',\n        keywords: {title: 'quote'}\n      }\n    ]\n  };\n  var QUOTED_ATOM = {\n    className: 'quoted',\n    begin: '\\'' + LISP_IDENT_RE\n  };\n  var LIST = {\n    className: 'list',\n    begin: '\\\\(', end: '\\\\)'\n  };\n  var BODY = {\n    endsWithParent: true,\n    relevance: 0\n  };\n  LIST.contains = [{className: 'title', begin: LISP_IDENT_RE}, BODY];\n  BODY.contains = [QUOTED, QUOTED_ATOM, LIST, LITERAL, NUMBER, STRING, COMMENT, VARIABLE, KEYWORD];\n\n  return {\n    illegal: /\\S/,\n    contains: [\n      NUMBER,\n      SHEBANG,\n      LITERAL,\n      STRING,\n      COMMENT,\n      QUOTED,\n      QUOTED_ATOM,\n      LIST\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/livecodeserver.js",
    "content": "/*\nLanguage: LiveCode server and revIgniter\nAuthor: Ralf Bitter <rabit@revigniter.com>\nDescription: Language definition for LiveCode server accounting for revIgniter (a web application framework) characteristics.\nVersion: 1.0a\nDate: 2013-06-03\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable', begin: '\\\\b[gtps][A-Z]+[A-Za-z0-9_\\\\-]*\\\\b|\\\\$_[A-Z]+',\n    relevance: 0\n  };\n  var COMMENT = {\n    className: 'comment', end: '$',\n    variants: [\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: '--'\n      },\n      {\n        begin: '[^:]//'\n      }\n    ]\n  };\n  var TITLE1 = hljs.inherit(hljs.TITLE_MODE, {\n    variants: [\n      {begin: '\\\\b_*rig[A-Z]+[A-Za-z0-9_\\\\-]*'},\n      {begin: '\\\\b_[a-z0-9\\\\-]+'}\n    ]\n  });\n  var TITLE2 = hljs.inherit(hljs.TITLE_MODE, {begin: '\\\\b([A-Za-z0-9_\\\\-]+)\\\\b'});\n  return {\n    case_insensitive: false,\n    keywords: {\n      keyword:\n        'after byte bytes english the until http forever descending using line real8 with seventh ' +\n        'for stdout finally element word fourth before black ninth sixth characters chars stderr ' +\n        'uInt1 uInt1s uInt2 uInt2s stdin string lines relative rel any fifth items from middle mid ' +\n        'at else of catch then third it file milliseconds seconds second secs sec int1 int1s int4 ' +\n        'int4s internet int2 int2s normal text item last long detailed effective uInt4 uInt4s repeat ' +\n        'end repeat URL in try into switch to words https token binfile each tenth as ticks tick ' +\n        'system real4 by dateItems without char character ascending eighth whole dateTime numeric short ' +\n        'first ftp integer abbreviated abbr abbrev private case while if',\n      constant:\n        'SIX TEN FORMFEED NINE ZERO NONE SPACE FOUR FALSE COLON CRLF PI COMMA ENDOFFILE EOF EIGHT FIVE ' +\n        'QUOTE EMPTY ONE TRUE RETURN CR LINEFEED RIGHT BACKSLASH NULL SEVEN TAB THREE TWO ' +\n        'six ten formfeed nine zero none space four false colon crlf pi comma endoffile eof eight five ' +\n        'quote empty one true return cr linefeed right backslash null seven tab three two ' +\n        'RIVERSION RISTATE FILE_READ_MODE FILE_WRITE_MODE FILE_WRITE_MODE DIR_WRITE_MODE FILE_READ_UMASK ' +\n        'FILE_WRITE_UMASK DIR_READ_UMASK DIR_WRITE_UMASK',\n      operator:\n        'div mod wrap and or bitAnd bitNot bitOr bitXor among not in a an within ' +\n        'contains ends with begins the keys of keys',\n      built_in:\n        'put abs acos aliasReference annuity arrayDecode arrayEncode asin atan atan2 average avg base64Decode ' +\n        'base64Encode baseConvert binaryDecode binaryEncode byteToNum cachedURL cachedURLs charToNum ' +\n        'cipherNames commandNames compound compress constantNames cos date dateFormat decompress directories ' +\n        'diskSpace DNSServers exp exp1 exp2 exp10 extents files flushEvents folders format functionNames global ' +\n        'globals hasMemory hostAddress hostAddressToName hostName hostNameToAddress isNumber ISOToMac itemOffset ' +\n        'keys len length libURLErrorData libUrlFormData libURLftpCommand libURLLastHTTPHeaders libURLLastRHHeaders ' +\n        'libUrlMultipartFormAddPart libUrlMultipartFormData libURLVersion lineOffset ln ln1 localNames log log2 log10 ' +\n        'longFilePath lower macToISO matchChunk matchText matrixMultiply max md5Digest median merge millisec ' +\n        'millisecs millisecond milliseconds min monthNames num number numToByte numToChar offset open openfiles ' +\n        'openProcesses openProcessIDs openSockets paramCount param params peerAddress pendingMessages platform ' +\n        'processID random randomBytes replaceText result revCreateXMLTree revCreateXMLTreeFromFile revCurrentRecord ' +\n        'revCurrentRecordIsFirst revCurrentRecordIsLast revDatabaseColumnCount revDatabaseColumnIsNull ' +\n        'revDatabaseColumnLengths revDatabaseColumnNames revDatabaseColumnNamed revDatabaseColumnNumbered ' +\n        'revDatabaseColumnTypes revDatabaseConnectResult revDatabaseCursors revDatabaseID revDatabaseTableNames ' +\n        'revDatabaseType revDataFromQuery revdb_closeCursor revdb_columnbynumber revdb_columncount revdb_columnisnull ' +\n        'revdb_columnlengths revdb_columnnames revdb_columntypes revdb_commit revdb_connect revdb_connections ' +\n        'revdb_connectionerr revdb_currentrecord revdb_cursorconnection revdb_cursorerr revdb_cursors revdb_dbtype ' +\n        'revdb_disconnect revdb_execute revdb_iseof revdb_isbof revdb_movefirst revdb_movelast revdb_movenext ' +\n        'revdb_moveprev revdb_query revdb_querylist revdb_recordcount revdb_rollback revdb_tablenames ' +\n        'revGetDatabaseDriverPath revNumberOfRecords revOpenDatabase revOpenDatabases revQueryDatabase ' +\n        'revQueryDatabaseBlob revQueryResult revQueryIsAtStart revQueryIsAtEnd revUnixFromMacPath ' +\n        'revXMLAttribute revXMLAttributes revXMLAttributeValues revXMLChildContents revXMLChildNames ' +\n        'revXMLFirstChild revXMLMatchingNode revXMLNextSibling revXMLNodeContents revXMLNumberOfChildren ' +\n        'revXMLParent revXMLPreviousSibling revXMLRootNode revXMLRPC_CreateRequest revXMLRPC_Documents ' +\n        'revXMLRPC_Error revXMLRPC_Execute revXMLRPC_GetHost revXMLRPC_GetMethod revXMLRPC_GetParam revXMLText ' +\n        'revXMLRPC_GetParamCount revXMLRPC_GetParamNode revXMLRPC_GetParamType revXMLRPC_GetPath revXMLRPC_GetPort ' +\n        'revXMLRPC_GetProtocol revXMLRPC_GetRequest revXMLRPC_GetResponse revXMLRPC_GetSocket revXMLTree ' +\n        'revXMLTrees revXMLValidateDTD revZipDescribeItem revZipEnumerateItems revZipOpenArchives round ' +\n        'sec secs seconds sha1Digest shell shortFilePath sin specialFolderPath sqrt standardDeviation statRound ' +\n        'stdDev sum sysError systemVersion tan tempName tick ticks time to toLower toUpper transpose trunc ' +\n        'uniDecode uniEncode upper URLDecode URLEncode URLStatus value variableNames version waitDepth weekdayNames wordOffset ' +\n        'add breakpoint cancel clear local variable file word line folder directory URL close socket process ' +\n        'combine constant convert create new alias folder directory decrypt delete variable word line folder ' +\n        'directory URL dispatch divide do encrypt filter get include intersect kill libURLDownloadToFile ' +\n        'libURLFollowHttpRedirects libURLftpUpload libURLftpUploadFile libURLresetAll libUrlSetAuthCallback ' +\n        'libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime ' +\n        'libURLSetStatusCallback load multiply socket process post seek rel relative read from process rename ' +\n        'replace require resetAll revAddXMLNode revAppendXML revCloseCursor revCloseDatabase revCommitDatabase ' +\n        'revCopyFile revCopyFolder revCopyXMLNode revDeleteFolder revDeleteXMLNode revDeleteAllXMLTrees ' +\n        'revDeleteXMLTree revExecuteSQL revGoURL revInsertXMLNode revMoveFolder revMoveToFirstRecord revMoveToLastRecord ' +\n        'revMoveToNextRecord revMoveToPreviousRecord revMoveToRecord revMoveXMLNode revPutIntoXMLNode revRollBackDatabase ' +\n        'revSetDatabaseDriverPath revSetXMLAttribute revXMLRPC_AddParam revXMLRPC_DeleteAllDocuments revXMLAddDTD ' +\n        'revXMLRPC_Free revXMLRPC_FreeAll revXMLRPC_DeleteDocument revXMLRPC_DeleteParam revXMLRPC_SetHost ' +\n        'revXMLRPC_SetMethod revXMLRPC_SetPort revXMLRPC_SetProtocol revXMLRPC_SetSocket revZipAddItemWithData ' +\n        'revZipAddItemWithFile revZipAddUncompressedItemWithData revZipAddUncompressedItemWithFile revZipCancel ' +\n        'revZipCloseArchive revZipDeleteItem revZipExtractItemToFile revZipExtractItemToVariable revZipSetProgressCallback ' +\n        'revZipRenameItem revZipReplaceItemWithData revZipReplaceItemWithFile revZipOpenArchive send set sort split ' +\n        'subtract union unload wait write'\n    },\n    contains: [\n      VARIABLE,\n      {\n        className: 'keyword',\n        begin: '\\\\bend\\\\sif\\\\b'\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '$',\n        contains: [\n          VARIABLE,\n          TITLE2,\n          hljs.APOS_STRING_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.BINARY_NUMBER_MODE,\n          hljs.C_NUMBER_MODE,\n          TITLE1\n        ]\n      },\n      {\n        className: 'function',\n        beginKeywords: 'end', end: '$',\n        contains: [\n          TITLE2,\n          TITLE1\n        ]\n      },\n      {\n        className: 'command',\n        beginKeywords: 'command on', end: '$',\n        contains: [\n          VARIABLE,\n          TITLE2,\n          hljs.APOS_STRING_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.BINARY_NUMBER_MODE,\n          hljs.C_NUMBER_MODE,\n          TITLE1\n        ]\n      },\n      {\n        className: 'command',\n        beginKeywords: 'end', end: '$',\n        contains: [\n          TITLE2,\n          TITLE1\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '<\\\\?rev|<\\\\?lc|<\\\\?livecode',\n        relevance: 10\n      },\n      {\n        className: 'preprocessor',\n        begin: '<\\\\?'\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\?>'\n      },\n      COMMENT,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.BINARY_NUMBER_MODE,\n      hljs.C_NUMBER_MODE,\n      TITLE1\n    ],\n    illegal: ';$|^\\\\[|^='\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/lua.js",
    "content": "/*\nLanguage: Lua\nAuthor: Andrew Fedorov <dmmdrs@mail.ru>\n*/\n\nfunction(hljs) {\n  var OPENING_LONG_BRACKET = '\\\\[=*\\\\[';\n  var CLOSING_LONG_BRACKET = '\\\\]=*\\\\]';\n  var LONG_BRACKETS = {\n    begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n    contains: ['self']\n  };\n  var COMMENTS = [\n    {\n      className: 'comment',\n      begin: '--(?!' + OPENING_LONG_BRACKET + ')', end: '$'\n    },\n    {\n      className: 'comment',\n      begin: '--' + OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n      contains: [LONG_BRACKETS],\n      relevance: 10\n    }\n  ]\n  return {\n    lexemes: hljs.UNDERSCORE_IDENT_RE,\n    keywords: {\n      keyword:\n        'and break do else elseif end false for if in local nil not or repeat return then ' +\n        'true until while',\n      built_in:\n        '_G _VERSION assert collectgarbage dofile error getfenv getmetatable ipairs load ' +\n        'loadfile loadstring module next pairs pcall print rawequal rawget rawset require ' +\n        'select setfenv setmetatable tonumber tostring type unpack xpcall coroutine debug ' +\n        'io math os package string table'\n    },\n    contains: COMMENTS.concat([\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '\\\\)',\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: '([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*'}),\n          {\n            className: 'params',\n            begin: '\\\\(', endsWithParent: true,\n            contains: COMMENTS\n          }\n        ].concat(COMMENTS)\n      },\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: OPENING_LONG_BRACKET, end: CLOSING_LONG_BRACKET,\n        contains: [LONG_BRACKETS],\n        relevance: 5\n      }\n    ])\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/makefile.js",
    "content": "/*\nLanguage: Makefile\nAuthor: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable',\n    begin: /\\$\\(/, end: /\\)/,\n    contains: [hljs.BACKSLASH_ESCAPE]\n  };\n  return {\n    aliases: ['mk', 'mak'],\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: /^\\w+\\s*\\W*=/, returnBegin: true,\n        relevance: 0,\n        starts: {\n          className: 'constant',\n          end: /\\s*\\W*=/, excludeEnd: true,\n          starts: {\n            end: /$/,\n            relevance: 0,\n            contains: [\n              VARIABLE\n            ]\n          }\n        }\n      },\n      {\n        className: 'title',\n        begin: /^[\\w]+:\\s*$/\n      },\n      {\n        className: 'phony',\n        begin: /^\\.PHONY:/, end: /$/,\n        keywords: '.PHONY', lexemes: /[\\.\\w]+/\n      },\n      {\n        begin: /^\\t+/, end: /$/,\n        contains: [\n          hljs.QUOTE_STRING_MODE,\n          VARIABLE\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/markdown.js",
    "content": "/*\nLanguage: Markdown\nRequires: xml.js\nAuthor: John Crepezzi <john.crepezzi@gmail.com>\nWebsite: http://seejohncode.com/\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['md', 'mkdown', 'mkd'],\n    contains: [\n      // highlight headers\n      {\n        className: 'header',\n        variants: [\n          { begin: '^#{1,6}', end: '$' },\n          { begin: '^.+?\\\\n[=-]{2,}$' }\n        ]\n      },\n      // inline html\n      {\n        begin: '<', end: '>',\n        subLanguage: 'xml',\n        relevance: 0\n      },\n      // lists (indicators only)\n      {\n        className: 'bullet',\n        begin: '^([*+-]|(\\\\d+\\\\.))\\\\s+'\n      },\n      // strong segments\n      {\n        className: 'strong',\n        begin: '[*_]{2}.+?[*_]{2}'\n      },\n      // emphasis segments\n      {\n        className: 'emphasis',\n        variants: [\n          { begin: '\\\\*.+?\\\\*' },\n          { begin: '_.+?_'\n          , relevance: 0\n          }\n        ]\n      },\n      // blockquotes\n      {\n        className: 'blockquote',\n        begin: '^>\\\\s+', end: '$'\n      },\n      // code snippets\n      {\n        className: 'code',\n        variants: [\n          { begin: '`.+?`' },\n          { begin: '^( {4}|\\t)', end: '$'\n          , relevance: 0\n          }\n        ]\n      },\n      // horizontal rules\n      {\n        className: 'horizontal_rule',\n        begin: '^[-\\\\*]{3,}', end: '$'\n      },\n      // using links - title and link\n      {\n        begin: '\\\\[.+?\\\\][\\\\(\\\\[].+?[\\\\)\\\\]]',\n        returnBegin: true,\n        contains: [\n          {\n            className: 'link_label',\n            begin: '\\\\[', end: '\\\\]',\n            excludeBegin: true,\n            returnEnd: true,\n            relevance: 0\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\]\\\\(', end: '\\\\)',\n            excludeBegin: true, excludeEnd: true\n          },\n          {\n            className: 'link_reference',\n            begin: '\\\\]\\\\[', end: '\\\\]',\n            excludeBegin: true, excludeEnd: true\n          }\n        ],\n        relevance: 10\n      },\n      {\n        begin: '^\\\\[\\.+\\\\]:', end: '$',\n        returnBegin: true,\n        contains: [\n          {\n            className: 'link_reference',\n            begin: '\\\\[', end: '\\\\]',\n            excludeBegin: true, excludeEnd: true\n          },\n          {\n            className: 'link_url',\n            begin: '\\\\s', end: '$'\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/mathematica.js",
    "content": "/*\nLanguage: Mathematica\nAuthor: Daniel Kvasnicka <dkvasnicka@vendavo.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['mma'],\n    lexemes: '(\\\\$|\\\\b)' + hljs.IDENT_RE + '\\\\b',\n    keywords: 'AbelianGroup Abort AbortKernels AbortProtect Above Abs Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Active ActiveItem ActiveStyle AcyclicGraphQ AddOnHelpPath AddTo AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AffineTransform After AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowedDimensions AllowGroupClose AllowInlineCells AllowKernelInitialization AllowReverseGroupClose AllowScriptLevelChange AlphaChannel AlternatingGroup AlternativeHypothesis Alternatives AmbientLight Analytic AnchoredSearch And AndersonDarlingTest AngerJ AngleBracket AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotation Annuity AnnuityDue Antialiasing Antisymmetric Apart ApartSquareFree Appearance AppearanceElements AppellF1 Append AppendTo Apply ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess ARProcess Array ArrayComponents ArrayDepth ArrayFlatten ArrayPad ArrayPlot ArrayQ ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads AspectRatio AspectRatioFixed Assert Assuming Assumptions AstronomicalData Asynchronous AsynchronousTaskObject AsynchronousTasks AtomQ Attributes AugmentedSymmetricPolynomial AutoAction AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords Axes AxesEdge AxesLabel AxesOrigin AxesStyle Axis ' +\n      'BabyMonsterGroupB Back Background BackgroundTasksSettings Backslash Backsubstitution Backward Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseForm Baseline BaselinePosition BaseStyle BatesDistribution BattleLemarieWavelet Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized BetweennessCentrality BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms Booleans BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryStyle Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BubbleChart BubbleChart3D BubbleScale BubbleSizes BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteCount ByteOrdering ' +\n      'C CachedValue CacheGraphics CalendarData CalendarType CallPacket CanberraDistance Cancel CancelButton CandlestickChart Cap CapForm CapitalDifferentialD CardinalBSplineBasis CarmichaelLambda Cases Cashflow Casoratian Catalan CatalanNumber Catch CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterDot CentralMoment CentralMomentGeneratingFunction CForm ChampernowneNumber ChanVeseBinarize Character CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop Circle CircleBox CircleDot CircleMinus CirclePlus CircleTimes CirculantGraph CityData Clear ClearAll ClearAttributes ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent ClusteringComponents CMYKColor Coarse Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorCombine ColorConvert ColorData ColorDataFunction ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorSpace Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CommonDefaultFormatTypes Commonest CommonestFilter CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledFunction Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComponentMeasurements ' +\n      'ComponentwiseContextMenu Compose ComposeList ComposeSeries Composition CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath Congruent Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphQ ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray Constants ConstrainedMax ConstrainedMin ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFilename ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean Control ControlActive ControlAlignment ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateDialog CreateDirectory CreateDocument CreateIntermediateDirectories CreatePalette CreatePalettePacket CreateScheduledTask CreateTemporary CreateWindow CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossingDetect CrossMatrix Csc Csch CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrentImage CurrentlySpeakingPacket CurrentValue CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecomposition ' +\n      'D DagumDistribution DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DataCompression DataDistribution DataRange DataReversed Date DateDelimiters DateDifference DateFunction DateList DateListLogPlot DateListPlot DatePattern DatePlus DateRange DateString DateTicksFormat DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayMatchQ DayName DayPlus DayRange DayRound DeBruijnGraph Debug DebugTag Decimal DeclareKnownSymbols DeclarePackage Decompose Decrement DedekindEta Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic Deinitialization Del Deletable Delete DeleteBorderComponents DeleteCases DeleteContents DeleteDirectory DeleteDuplicates DeleteFile DeleteSmallComponents DeleteWithContents DeletionWarning Delimiter DelimiterFlashTime DelimiterMatching Delimiters Denominator DensityGraphics DensityHistogram DensityPlot DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DescriptorStateSpace DesignMatrix Det DGaussianWavelet DiacriticalPositioning Diagonal DiagonalMatrix Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DifferenceDelta DifferenceOrder DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralGroup Dilation Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletCharacter DirichletConvolve DirichletDistribution DirichletL DirichletTransform DirichletWindow DisableConsolePrintPacket DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform ' +\n      'DiscreteWaveletTransform Discriminant Disjunction Disk DiskBox DiskMatrix Dispatch DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentNotebook DominantColors DOSTextFormat Dot DotDashed DotEqual Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DSolve Dt DualLinearProgramming DualSystemsModel DumpGet DumpSave DuplicateFreeQ Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptions ' +\n      'E EccentricityCentrality EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeCost EdgeCount EdgeCoverQ EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData Eliminate EliminationOrder EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EnableConsolePrintPacket Enabled Encode End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfFile EndOfLine EndOfString EndPackage EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entropy EntropyFilter Environment Epilog Equal EqualColumns EqualRows EqualTilde EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerE EulerGamma EulerianGraphQ EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluationCell EvaluationCompletionAction EvaluationElements EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpToTrig ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalCall ExternalDataCharacterEncoding Extract ExtractArchive ExtremeValueDistribution ' +\n      'FaceForm FaceGrids FaceGridsStyle Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail FailureDistribution False FARIMAProcess FEDisableConsolePrintPacket FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket Fibonacci FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileDate FileExistsQ FileExtension FileFormat FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileType FilledCurve FilledCurveBox Filling FillingStyle FillingTransform FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindArgMax FindArgMin FindClique FindClusters FindCurvePath FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEulerianCycle FindFaces FindFile FindFit FindGeneratingFunction FindGeoLocation FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMaximum FindMaximumFlow FindMaxValue FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindPermutation FindPostmanTour FindProcessParameters FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindThreshold FindVertexCover FindVertexCut Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstPassageTimeDistribution FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FittedModel FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlatTopWindow FlipView Floor FlushPrintOutputPacket Fold FoldList Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrequencySamplingFilterKernel FresnelC FresnelS Friday FrobeniusNumber FrobeniusSolve ' +\n      'FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullOptions FullSimplify Function FunctionExpand FunctionInterpolation FunctionSpace FussellVeselyImportance ' +\n      'GaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins Gamma GammaDistribution GammaRegularized GapPenalty Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateConditions GeneratedCell GeneratedParameters GeneratingFunction Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDistance GeoGridPosition GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoPosition GeoPositionENU GeoPositionXYZ GeoProjectionData GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter Graph GraphAssortativity GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion ' +\n      'GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel GreatCircleDistance Greater GreaterEqual GreaterEqualLess GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterTilde Green Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain Gudermannian GumbelDistribution ' +\n      'HaarWavelet HadamardMatrix HalfNormalDistribution HamiltonianGraphQ HammingDistance HammingWindow HankelH1 HankelH2 HankelMatrix HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash HashTable Haversine HazardFunction Head HeadCompose Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenSurface HighlightGraph HighlightImage HighpassFilter HigmanSimsGroupHS HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HitMissTransform HITSCentrality HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HotellingTSquareDistribution HoytDistribution HTMLSave Hue HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestData ' +\n      'I Identity IdentityMatrix If IgnoreCase Im Image Image3D Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageAspectRatio ImageAssemble ImageCache ImageCacheValid ImageCapture ImageChannels ImageClip ImageColorSpace ImageCompose ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDataPacket ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDistance ImageEffect ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageForestingComponents ImageForwardTransformation ImageHistogram ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarkers ImageMeasurements ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImageQ ImageRangeCache ImageReflect ImageRegion ImageResize ImageResolution ImageRotate ImageRotated ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions Implies Import ImportAutoReplacements ImportString ImprovementImportance In IncidenceGraph IncidenceList IncidenceMatrix IncludeConstantBasis IncludeFileExtension IncludePods IncludeSingularTerm Increment Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentUnit IndependentVertexSetQ Indeterminate IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers Infinity Infix Information Inherited InheritScope Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InlineCounterAssignments InlineCounterIncrements InlineRules Inner Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionPointObject InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Install InstallService InString Integer IntegerDigits IntegerExponent IntegerLength IntegerPart IntegerPartitions IntegerQ Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction ' +\n      'InterpretTemplate InterquartileRange Interrupt InterruptSettings Intersection Interval IntervalIntersection IntervalMemberQ IntervalUnion Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHaversine InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InversePermutation InverseRadon InverseSeries InverseSurvivalFunction InverseWaveletTransform InverseWeierstrassP InverseZTransform Invisible InvisibleApplication InvisibleTimes IrreduciblePolynomialQ IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcess ' +\n      'JaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join Joined JoinedCurve JoinedCurveBox JoinForm JordanDecomposition JordanModelDecomposition ' +\n      'K KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelMixtureDistribution KernelObject Kernels Ket Khinchin KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnightTourGraph KnotData KnownUnitQ KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter ' +\n      'Label Labeled LabeledSlider LabelingFunction LabelStyle LaguerreL LambdaComponents LambertW LanczosWindow LandauDistribution Language LanguageCategory LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCM LeafCount LeapYearQ LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessFullEqual LessGreater LessLess LessSlantEqual LessTilde LetterCharacter LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox LinearFilter LinearFractionalTransform LinearModelFit LinearOffsetFunction LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBreak LinebreakAdjustments LineBreakChart LineBreakWithin LineColor LineForm LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRead LinkReadHeld LinkReadyQ Links LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot Listen ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalClusteringCoefficient LocalizeVariables LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions ' +\n      'LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestAscendingSequence LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow Loopback LoopFreeGraphQ LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LyapunovSolve LyonsGroupLy ' +\n      'MachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules MangoldtLambda ManhattanDistance Manipulate Manipulator MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixPlot MatrixPower MatrixQ MatrixRank Max MaxBend MaxDetect MaxExtraBandwidths MaxExtraConditions MaxFeatures MaxFilter Maximize MaxIterations MaxMemoryUsed MaxMixtureKernels MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxValue MaxwellDistribution McLaughlinGroupMcL Mean MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter Median MedianDeviation MedianFilter Medium MeijerG MeixnerDistribution MemberQ MemoryConstrained MemoryInUse Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuPacket MenuSortingValue MenuStyle MenuView MergeDifferences Mesh MeshFunctions MeshRange MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation Method MethodOptions MexicanHatWavelet MeyerWavelet Min MinDetect MinFilter MinimalPolynomial MinimalStateSpaceModel Minimize Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingDataMethod MittagLefflerE MixedRadix MixedRadixQuantity MixtureDistribution Mod Modal Mode Modular ModularLambda Module Modulus MoebiusMu Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction Monday Monitor MonomialList MonomialOrder MonsterGroupM MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform Most MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovingAverage MovingMedian MoyalDistribution MultiedgeStyle MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistribution ' +\n      'N NakagamiDistribution NameQ Names NamespaceBox Nand NArgMax NArgMin NBernoulliB NCache NDSolve NDSolveValue Nearest NearestFunction NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeMultinomialDistribution NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestList NestWhile NestWhileList NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextPrime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants None NonlinearModelFit NonlocalMeansFilter NonNegative NonPositive Nor NorlundB Norm Normal NormalDistribution NormalGrouping Normalize NormalizedSquaredEuclideanDistance NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde NotHumpDownHump NotHumpEqual NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms Null NullRecords NullSpace NullWords Number NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator ' +\n      'NumberSigns NumberString Numerator NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlot ' +\n      'O ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OddQ Off Offset OLEData On ONanGroupON OneIdentity Opacity Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering Orderless OrnsteinUhlenbeckProcess Orthogonalize Out Outer OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OwenT OwnValues ' +\n      'PackingMethod PaddedForm Padding PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageWidth PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParetoDistribution Part PartialCorrelationFunction PartialD ParticleData Partition PartitionsP PartitionsQ ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PerformanceGoal PeriodicInterpolation Periodogram PeriodogramArray PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PERTDistribution PetersenGraph PhaseMargins Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest Pink Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarGraphQ Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangePadding PlotRegion PlotStyle Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox PointBox PointFigureChart PointForm PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonBox PolygonBoxOptions PolygonHoleScale PolygonIntersections PolygonScale PolyhedronData PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position Positive PositiveDefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList ' +\n      'PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement PredictionRoot PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependTo PreserveImageOptions Previous PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitiveRoot PrincipalComponents PrincipalValue Print PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessEstimator ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptions ' +\n      'QBinomial QFactorial QGamma QHypergeometricPFQ QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ Quantile QuantilePlot Quantity QuantityForm QuantityMagnitude QuantityQ QuantityUnit Quartics QuartileDeviation Quartiles QuartileSkewness QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainder ' +\n      'RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Random RandomChoice RandomComplex RandomFunction RandomGraph RandomImage RandomInteger RandomPermutation RandomPrime RandomReal RandomSample RandomSeed RandomVariate RandomWalkProcess Range RangeFilter RangeSpecification RankedMax RankedMin Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios Raw RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadList ReadProtected Real RealBlockDiagonalForm RealDigits RealExponent Reals Reap Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate RegionBinarize RegionFunction RegionPlot RegionPlot3D RegularExpression Regularization Reinstall Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot Remove RemoveAlphaChannel RemoveAsynchronousTask Removed RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart Repeated RepeatedNull RepeatedString Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated Resampling Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask Residue Resolve Rest Resultant ResumePacket Return ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulerUnits Run RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilarity ' +\n      'SameQ SameTest SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveDefinitions SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTaskActiveQ ScheduledTaskData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition Sec Sech SechDistribution SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemialgebraicComponentInstances SendMail Sequence SequenceAlignment SequenceForm SequenceHold SequenceLimit Series SeriesCoefficient SeriesData SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPrecision SetProperty SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share Sharpen ShearingMatrix ShearingTransform ShenCastanMatrix Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortUpArrow Show ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiegelTheta SiegelTukeyTest Sign Signature SignedRankTest SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution Skip SliceDistribution Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDelayCompensator SmithWatermanSimilarity ' +\n      'SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SocialMediaData Socket SokalSneathDissimilarity Solve SolveAlways SolveDelayed Sort SortBy Sound SoundAndGraphics SoundNote SoundVolume Sow Space SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution Speak SpeakTextPacket SpearmanRankTest SpearmanRho Spectrogram SpectrogramArray Specularity SpellingCorrection SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackInhibit StandardDeviation StandardDeviationFilter StandardForm Standardize StandbyDistribution Star StarGraph StartAsynchronousTask StartingStepSize StartOfLine StartOfString StartScheduledTask StartupSound StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringCount StringDrop StringExpression StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPosition StringQ StringReplace StringReplaceList StringReplacePart StringReverse StringRotateLeft StringRotateRight StringSkeleton StringSplit StringTake StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleBoxOptions StyleData StyleDefinitions StyleForm StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders ' +\n      'SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subset SubsetEqual Subsets SubStar Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde SuchThat Sum SumConvergence Sunday SuperDagger SuperMinus SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceColor SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SystemDialogInput SystemException SystemHelpPath SystemInformation SystemInformationData SystemOpen SystemOptions SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemStub ' +\n      'Tab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeWhile Tally Tan Tanh TargetFunctions TargetUnits TautologyQ TelegraphProcess TemplateBox TemplateBoxOptions TemplateSlotSequence TemporalData Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCell TextClipboardType TextData TextForm TextJustification TextLine TextPacket TextParagraph TextRecognize TextRendering TextStyle Texture TextureCoordinateFunction TextureCoordinateScaling Therefore ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreeJSymbol Threshold Through Throw Thumbnail Thursday Ticks TicksStyle Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint Times TimesBy TimeSeriesForecast TimeSeriesInvertibility TimeUsed TimeValue TimeZone Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate ToDiscreteTimeModel ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform TopologicalSort ToRadicals ToRules ToString Total TotalHeight TotalVariationFilter TotalWidth TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField Translate TranslationTransform TransparentColor Transpose TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle TriangleWave TriangularDistribution Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean True TrueQ TruncatedDistribution TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow Tuples TuranGraph TuringMachine ' +\n      'Transparent ' +\n      'UnateQ Uncompress Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UndirectedEdge UndirectedGraph UndirectedGraphQ UndocumentedTestFEParserPacket UndocumentedTestGetSelectionPacket Unequal Unevaluated UniformDistribution UniformGraphDistribution UniformSumDistribution Uninstall Union UnionPlus Unique UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitTriangle UnitVector Unprotect UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpValues URL URLFetch URLFetchAsynchronous URLSave URLSaveAsynchronous UseGraphicsRange Using UsingFrontEnd ' +\n      'V2Get ValidationLength Value ValueBox ValueBoxOptions ValueForm ValueQ ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerifyConvergence VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoigtDistribution VonMisesDistribution ' +\n      'WaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeberE Wedge Wednesday WeibullDistribution WeierstrassHalfPeriods WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WilksW WilksWTest WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult Word WordBoundary WordCharacter WordData WordSearch WordSeparators WorkingPrecision Write WriteString Wronskian ' +\n      'XMLElement XMLObject Xnor Xor ' +\n      'Yellow YuleDissimilarity ' +\n      'ZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZipfDistribution ZTest ZTransform ' +\n      '$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AssertFunction $Assumptions $AsynchronousTask $BaseDirectory $BatchInput $BatchOutput $BoxForms $ByteOrdering $Canceled $CharacterEncoding $CharacterEncodings $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $CreationDate $CurrentLink $DateStringFormat $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $Epilog $ExportFormats $Failed $FinancialDataSource $FormatType $FrontEnd $FrontEndSession $GeoLocation $HistoryLength $HomeDirectory $HTTPCookies $IgnoreEOF $ImagingDevices $ImportFormats $InitialDirectory $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $ModuleNumber $NetworkLicense $NewMessage $NewSymbol $Notebooks $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $PipeSupported $Post $Pre $PreferencesDirectory $PrePrint $PreRead $PrintForms $PrintLiteral $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $RandomState $RecursionLimit $ReleaseNumber $RootDirectory $ScheduledTask $ScriptCommandLine $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemWordLength $TemporaryDirectory $TemporaryPrefix $TextStyle $TimedOut $TimeUnit $TimeZone $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $Urgent $UserAddOnsDirectory $UserBaseDirectory $UserDocumentsDirectory $UserName $Version $VersionNumber',\n    contains: [\n      {\n        className: \"comment\",\n        begin: /\\(\\*/, end: /\\*\\)/\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'list',\n        begin: /\\{/, end: /\\}/,\n        illegal: /:/\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/matlab.js",
    "content": "/*\nLanguage: Matlab\nAuthor: Denis Bardadym <bardadymchik@gmail.com>\nContributors: Eugene Nizhibitsky <nizhibitsky@ya.ru>\n*/\n\nfunction(hljs) {\n  var COMMON_CONTAINS = [\n    hljs.C_NUMBER_MODE,\n    {\n      className: 'string',\n      begin: '\\'', end: '\\'',\n      contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n    }\n  ];\n\n  return {\n    keywords: {\n      keyword:\n        'break case catch classdef continue else elseif end enumerated events for function ' +\n        'global if methods otherwise parfor persistent properties return spmd switch try while',\n      built_in:\n        'sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan ' +\n        'atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot ' +\n        'cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog ' +\n        'realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal ' +\n        'cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli ' +\n        'besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma ' +\n        'gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms ' +\n        'nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones ' +\n        'eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ' +\n        'ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril ' +\n        'triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute ' +\n        'shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan ' +\n        'isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal ' +\n        'rosser toeplitz vander wilkinson'\n    },\n    illegal: '(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',\n    contains: [\n      {\n        className: 'function',\n        beginKeywords: 'function', end: '$',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n              className: 'params',\n              begin: '\\\\(', end: '\\\\)'\n          },\n          {\n              className: 'params',\n              begin: '\\\\[', end: '\\\\]'\n          }\n        ]\n      },\n      {\n        className: 'transposed_variable',\n        begin: '[a-zA-Z_][a-zA-Z_0-9]*(\\'+[\\\\.\\']*|[\\\\.\\']+)', end: '',\n        relevance: 0\n      },\n      {\n        className: 'matrix',\n        begin: '\\\\[', end: '\\\\]\\'*[\\\\.\\']*',\n        contains: COMMON_CONTAINS,\n        relevance: 0\n      },\n      {\n        className: 'cell',\n        begin: '\\\\{',\n        contains: COMMON_CONTAINS,\n        illegal: /:/,\n        variants: [\n          {end: /\\}'[\\.']*/},\n          {end: /\\}/, relevance: 0}\n        ]\n      },\n      {\n        className: 'comment',\n        begin: '\\\\%', end: '$'\n      }\n    ].concat(COMMON_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/mel.js",
    "content": "/*\nLanguage: MEL\nDescription: Maya Embedded Language\nAuthor: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords:\n      'int float string vector matrix if else switch case default while do for in break ' +\n      'continue global proc return about abs addAttr addAttributeEditorNodeHelp addDynamic ' +\n      'addNewShelfTab addPP addPanelCategory addPrefixToName advanceToNextDrivenKey ' +\n      'affectedNet affects aimConstraint air alias aliasAttr align alignCtx alignCurve ' +\n      'alignSurface allViewFit ambientLight angle angleBetween animCone animCurveEditor ' +\n      'animDisplay animView annotate appendStringArray applicationName applyAttrPreset ' +\n      'applyTake arcLenDimContext arcLengthDimension arclen arrayMapper art3dPaintCtx ' +\n      'artAttrCtx artAttrPaintVertexCtx artAttrSkinPaintCtx artAttrTool artBuildPaintMenu ' +\n      'artFluidAttrCtx artPuttyCtx artSelectCtx artSetPaintCtx artUserPaintCtx assignCommand ' +\n      'assignInputDevice assignViewportFactories attachCurve attachDeviceAttr attachSurface ' +\n      'attrColorSliderGrp attrCompatibility attrControlGrp attrEnumOptionMenu ' +\n      'attrEnumOptionMenuGrp attrFieldGrp attrFieldSliderGrp attrNavigationControlGrp ' +\n      'attrPresetEditWin attributeExists attributeInfo attributeMenu attributeQuery ' +\n      'autoKeyframe autoPlace bakeClip bakeFluidShading bakePartialHistory bakeResults ' +\n      'bakeSimulation basename basenameEx batchRender bessel bevel bevelPlus binMembership ' +\n      'bindSkin blend2 blendShape blendShapeEditor blendShapePanel blendTwoAttr blindDataType ' +\n      'boneLattice boundary boxDollyCtx boxZoomCtx bufferCurve buildBookmarkMenu ' +\n      'buildKeyframeMenu button buttonManip CBG cacheFile cacheFileCombine cacheFileMerge ' +\n      'cacheFileTrack camera cameraView canCreateManip canvas capitalizeString catch ' +\n      'catchQuiet ceil changeSubdivComponentDisplayLevel changeSubdivRegion channelBox ' +\n      'character characterMap characterOutlineEditor characterize chdir checkBox checkBoxGrp ' +\n      'checkDefaultRenderGlobals choice circle circularFillet clamp clear clearCache clip ' +\n      'clipEditor clipEditorCurrentTimeCtx clipSchedule clipSchedulerOutliner clipTrimBefore ' +\n      'closeCurve closeSurface cluster cmdFileOutput cmdScrollFieldExecuter ' +\n      'cmdScrollFieldReporter cmdShell coarsenSubdivSelectionList collision color ' +\n      'colorAtPoint colorEditor colorIndex colorIndexSliderGrp colorSliderButtonGrp ' +\n      'colorSliderGrp columnLayout commandEcho commandLine commandPort compactHairSystem ' +\n      'componentEditor compositingInterop computePolysetVolume condition cone confirmDialog ' +\n      'connectAttr connectControl connectDynamic connectJoint connectionInfo constrain ' +\n      'constrainValue constructionHistory container containsMultibyte contextInfo control ' +\n      'convertFromOldLayers convertIffToPsd convertLightmap convertSolidTx convertTessellation ' +\n      'convertUnit copyArray copyFlexor copyKey copySkinWeights cos cpButton cpCache ' +\n      'cpClothSet cpCollision cpConstraint cpConvClothToMesh cpForces cpGetSolverAttr cpPanel ' +\n      'cpProperty cpRigidCollisionFilter cpSeam cpSetEdit cpSetSolverAttr cpSolver ' +\n      'cpSolverTypes cpTool cpUpdateClothUVs createDisplayLayer createDrawCtx createEditor ' +\n      'createLayeredPsdFile createMotionField createNewShelf createNode createRenderLayer ' +\n      'createSubdivRegion cross crossProduct ctxAbort ctxCompletion ctxEditMode ctxTraverse ' +\n      'currentCtx currentTime currentTimeCtx currentUnit curve curveAddPtCtx ' +\n      'curveCVCtx curveEPCtx curveEditorCtx curveIntersect curveMoveEPCtx curveOnSurface ' +\n      'curveSketchCtx cutKey cycleCheck cylinder dagPose date defaultLightListCheckBox ' +\n      'defaultNavigation defineDataServer defineVirtualDevice deformer deg_to_rad delete ' +\n      'deleteAttr deleteShadingGroupsAndMaterials deleteShelfTab deleteUI deleteUnusedBrushes ' +\n      'delrandstr detachCurve detachDeviceAttr detachSurface deviceEditor devicePanel dgInfo ' +\n      'dgdirty dgeval dgtimer dimWhen directKeyCtx directionalLight dirmap dirname disable ' +\n      'disconnectAttr disconnectJoint diskCache displacementToPoly displayAffected ' +\n      'displayColor displayCull displayLevelOfDetail displayPref displayRGBColor ' +\n      'displaySmoothness displayStats displayString displaySurface distanceDimContext ' +\n      'distanceDimension doBlur dolly dollyCtx dopeSheetEditor dot dotProduct ' +\n      'doubleProfileBirailSurface drag dragAttrContext draggerContext dropoffLocator ' +\n      'duplicate duplicateCurve duplicateSurface dynCache dynControl dynExport dynExpression ' +\n      'dynGlobals dynPaintEditor dynParticleCtx dynPref dynRelEdPanel dynRelEditor ' +\n      'dynamicLoad editAttrLimits editDisplayLayerGlobals editDisplayLayerMembers ' +\n      'editRenderLayerAdjustment editRenderLayerGlobals editRenderLayerMembers editor ' +\n      'editorTemplate effector emit emitter enableDevice encodeString endString endsWith env ' +\n      'equivalent equivalentTol erf error eval evalDeferred evalEcho event ' +\n      'exactWorldBoundingBox exclusiveLightCheckBox exec executeForEachObject exists exp ' +\n      'expression expressionEditorListen extendCurve extendSurface extrude fcheck fclose feof ' +\n      'fflush fgetline fgetword file fileBrowserDialog fileDialog fileExtension fileInfo ' +\n      'filetest filletCurve filter filterCurve filterExpand filterStudioImport ' +\n      'findAllIntersections findAnimCurves findKeyframe findMenuItem findRelatedSkinCluster ' +\n      'finder firstParentOf fitBspline flexor floatEq floatField floatFieldGrp floatScrollBar ' +\n      'floatSlider floatSlider2 floatSliderButtonGrp floatSliderGrp floor flow fluidCacheInfo ' +\n      'fluidEmitter fluidVoxelInfo flushUndo fmod fontDialog fopen formLayout format fprint ' +\n      'frameLayout fread freeFormFillet frewind fromNativePath fwrite gamma gauss ' +\n      'geometryConstraint getApplicationVersionAsFloat getAttr getClassification ' +\n      'getDefaultBrush getFileList getFluidAttr getInputDeviceRange getMayaPanelTypes ' +\n      'getModifiers getPanel getParticleAttr getPluginResource getenv getpid glRender ' +\n      'glRenderEditor globalStitch gmatch goal gotoBindPose grabColor gradientControl ' +\n      'gradientControlNoAttr graphDollyCtx graphSelectContext graphTrackCtx gravity grid ' +\n      'gridLayout group groupObjectsByName HfAddAttractorToAS HfAssignAS HfBuildEqualMap ' +\n      'HfBuildFurFiles HfBuildFurImages HfCancelAFR HfConnectASToHF HfCreateAttractor ' +\n      'HfDeleteAS HfEditAS HfPerformCreateAS HfRemoveAttractorFromAS HfSelectAttached ' +\n      'HfSelectAttractors HfUnAssignAS hardenPointCurve hardware hardwareRenderPanel ' +\n      'headsUpDisplay headsUpMessage help helpLine hermite hide hilite hitTest hotBox hotkey ' +\n      'hotkeyCheck hsv_to_rgb hudButton hudSlider hudSliderButton hwReflectionMap hwRender ' +\n      'hwRenderLoad hyperGraph hyperPanel hyperShade hypot iconTextButton iconTextCheckBox ' +\n      'iconTextRadioButton iconTextRadioCollection iconTextScrollList iconTextStaticLabel ' +\n      'ikHandle ikHandleCtx ikHandleDisplayScale ikSolver ikSplineHandleCtx ikSystem ' +\n      'ikSystemInfo ikfkDisplayMethod illustratorCurves image imfPlugins inheritTransform ' +\n      'insertJoint insertJointCtx insertKeyCtx insertKnotCurve insertKnotSurface instance ' +\n      'instanceable instancer intField intFieldGrp intScrollBar intSlider intSliderGrp ' +\n      'interToUI internalVar intersect iprEngine isAnimCurve isConnected isDirty isParentOf ' +\n      'isSameObject isTrue isValidObjectName isValidString isValidUiName isolateSelect ' +\n      'itemFilter itemFilterAttr itemFilterRender itemFilterType joint jointCluster jointCtx ' +\n      'jointDisplayScale jointLattice keyTangent keyframe keyframeOutliner ' +\n      'keyframeRegionCurrentTimeCtx keyframeRegionDirectKeyCtx keyframeRegionDollyCtx ' +\n      'keyframeRegionInsertKeyCtx keyframeRegionMoveKeyCtx keyframeRegionScaleKeyCtx ' +\n      'keyframeRegionSelectKeyCtx keyframeRegionSetKeyCtx keyframeRegionTrackCtx ' +\n      'keyframeStats lassoContext lattice latticeDeformKeyCtx launch launchImageEditor ' +\n      'layerButton layeredShaderPort layeredTexturePort layout layoutDialog lightList ' +\n      'lightListEditor lightListPanel lightlink lineIntersection linearPrecision linstep ' +\n      'listAnimatable listAttr listCameras listConnections listDeviceAttachments listHistory ' +\n      'listInputDeviceAxes listInputDeviceButtons listInputDevices listMenuAnnotation ' +\n      'listNodeTypes listPanelCategories listRelatives listSets listTransforms ' +\n      'listUnselected listerEditor loadFluid loadNewShelf loadPlugin ' +\n      'loadPluginLanguageResources loadPrefObjects localizedPanelLabel lockNode loft log ' +\n      'longNameOf lookThru ls lsThroughFilter lsType lsUI Mayatomr mag makeIdentity makeLive ' +\n      'makePaintable makeRoll makeSingleSurface makeTubeOn makebot manipMoveContext ' +\n      'manipMoveLimitsCtx manipOptions manipRotateContext manipRotateLimitsCtx ' +\n      'manipScaleContext manipScaleLimitsCtx marker match max memory menu menuBarLayout ' +\n      'menuEditor menuItem menuItemToShelf menuSet menuSetPref messageLine min minimizeApp ' +\n      'mirrorJoint modelCurrentTimeCtx modelEditor modelPanel mouse movIn movOut move ' +\n      'moveIKtoFK moveKeyCtx moveVertexAlongDirection multiProfileBirailSurface mute ' +\n      'nParticle nameCommand nameField namespace namespaceInfo newPanelItems newton nodeCast ' +\n      'nodeIconButton nodeOutliner nodePreset nodeType noise nonLinear normalConstraint ' +\n      'normalize nurbsBoolean nurbsCopyUVSet nurbsCube nurbsEditUV nurbsPlane nurbsSelect ' +\n      'nurbsSquare nurbsToPoly nurbsToPolygonsPref nurbsToSubdiv nurbsToSubdivPref ' +\n      'nurbsUVSet nurbsViewDirectionVector objExists objectCenter objectLayer objectType ' +\n      'objectTypeUI obsoleteProc oceanNurbsPreviewPlane offsetCurve offsetCurveOnSurface ' +\n      'offsetSurface openGLExtension openMayaPref optionMenu optionMenuGrp optionVar orbit ' +\n      'orbitCtx orientConstraint outlinerEditor outlinerPanel overrideModifier ' +\n      'paintEffectsDisplay pairBlend palettePort paneLayout panel panelConfiguration ' +\n      'panelHistory paramDimContext paramDimension paramLocator parent parentConstraint ' +\n      'particle particleExists particleInstancer particleRenderInfo partition pasteKey ' +\n      'pathAnimation pause pclose percent performanceOptions pfxstrokes pickWalk picture ' +\n      'pixelMove planarSrf plane play playbackOptions playblast plugAttr plugNode pluginInfo ' +\n      'pluginResourceUtil pointConstraint pointCurveConstraint pointLight pointMatrixMult ' +\n      'pointOnCurve pointOnSurface pointPosition poleVectorConstraint polyAppend ' +\n      'polyAppendFacetCtx polyAppendVertex polyAutoProjection polyAverageNormal ' +\n      'polyAverageVertex polyBevel polyBlendColor polyBlindData polyBoolOp polyBridgeEdge ' +\n      'polyCacheMonitor polyCheck polyChipOff polyClipboard polyCloseBorder polyCollapseEdge ' +\n      'polyCollapseFacet polyColorBlindData polyColorDel polyColorPerVertex polyColorSet ' +\n      'polyCompare polyCone polyCopyUV polyCrease polyCreaseCtx polyCreateFacet ' +\n      'polyCreateFacetCtx polyCube polyCut polyCutCtx polyCylinder polyCylindricalProjection ' +\n      'polyDelEdge polyDelFacet polyDelVertex polyDuplicateAndConnect polyDuplicateEdge ' +\n      'polyEditUV polyEditUVShell polyEvaluate polyExtrudeEdge polyExtrudeFacet ' +\n      'polyExtrudeVertex polyFlipEdge polyFlipUV polyForceUV polyGeoSampler polyHelix ' +\n      'polyInfo polyInstallAction polyLayoutUV polyListComponentConversion polyMapCut ' +\n      'polyMapDel polyMapSew polyMapSewMove polyMergeEdge polyMergeEdgeCtx polyMergeFacet ' +\n      'polyMergeFacetCtx polyMergeUV polyMergeVertex polyMirrorFace polyMoveEdge ' +\n      'polyMoveFacet polyMoveFacetUV polyMoveUV polyMoveVertex polyNormal polyNormalPerVertex ' +\n      'polyNormalizeUV polyOptUvs polyOptions polyOutput polyPipe polyPlanarProjection ' +\n      'polyPlane polyPlatonicSolid polyPoke polyPrimitive polyPrism polyProjection ' +\n      'polyPyramid polyQuad polyQueryBlindData polyReduce polySelect polySelectConstraint ' +\n      'polySelectConstraintMonitor polySelectCtx polySelectEditCtx polySeparate ' +\n      'polySetToFaceNormal polySewEdge polyShortestPathCtx polySmooth polySoftEdge ' +\n      'polySphere polySphericalProjection polySplit polySplitCtx polySplitEdge polySplitRing ' +\n      'polySplitVertex polyStraightenUVBorder polySubdivideEdge polySubdivideFacet ' +\n      'polyToSubdiv polyTorus polyTransfer polyTriangulate polyUVSet polyUnite polyWedgeFace ' +\n      'popen popupMenu pose pow preloadRefEd print progressBar progressWindow projFileViewer ' +\n      'projectCurve projectTangent projectionContext projectionManip promptDialog propModCtx ' +\n      'propMove psdChannelOutliner psdEditTextureFile psdExport psdTextureFile putenv pwd ' +\n      'python querySubdiv quit rad_to_deg radial radioButton radioButtonGrp radioCollection ' +\n      'radioMenuItemCollection rampColorPort rand randomizeFollicles randstate rangeControl ' +\n      'readTake rebuildCurve rebuildSurface recordAttr recordDevice redo reference ' +\n      'referenceEdit referenceQuery refineSubdivSelectionList refresh refreshAE ' +\n      'registerPluginResource rehash reloadImage removeJoint removeMultiInstance ' +\n      'removePanelCategory rename renameAttr renameSelectionList renameUI render ' +\n      'renderGlobalsNode renderInfo renderLayerButton renderLayerParent ' +\n      'renderLayerPostProcess renderLayerUnparent renderManip renderPartition ' +\n      'renderQualityNode renderSettings renderThumbnailUpdate renderWindowEditor ' +\n      'renderWindowSelectContext renderer reorder reorderDeformers requires reroot ' +\n      'resampleFluid resetAE resetPfxToPolyCamera resetTool resolutionNode retarget ' +\n      'reverseCurve reverseSurface revolve rgb_to_hsv rigidBody rigidSolver roll rollCtx ' +\n      'rootOf rot rotate rotationInterpolation roundConstantRadius rowColumnLayout rowLayout ' +\n      'runTimeCommand runup sampleImage saveAllShelves saveAttrPreset saveFluid saveImage ' +\n      'saveInitialState saveMenu savePrefObjects savePrefs saveShelf saveToolSettings scale ' +\n      'scaleBrushBrightness scaleComponents scaleConstraint scaleKey scaleKeyCtx sceneEditor ' +\n      'sceneUIReplacement scmh scriptCtx scriptEditorInfo scriptJob scriptNode scriptTable ' +\n      'scriptToShelf scriptedPanel scriptedPanelType scrollField scrollLayout sculpt ' +\n      'searchPathArray seed selLoadSettings select selectContext selectCurveCV selectKey ' +\n      'selectKeyCtx selectKeyframeRegionCtx selectMode selectPref selectPriority selectType ' +\n      'selectedNodes selectionConnection separator setAttr setAttrEnumResource ' +\n      'setAttrMapping setAttrNiceNameResource setConstraintRestPosition ' +\n      'setDefaultShadingGroup setDrivenKeyframe setDynamic setEditCtx setEditor setFluidAttr ' +\n      'setFocus setInfinity setInputDeviceMapping setKeyCtx setKeyPath setKeyframe ' +\n      'setKeyframeBlendshapeTargetWts setMenuMode setNodeNiceNameResource setNodeTypeFlag ' +\n      'setParent setParticleAttr setPfxToPolyCamera setPluginResource setProject ' +\n      'setStampDensity setStartupMessage setState setToolTo setUITemplate setXformManip sets ' +\n      'shadingConnection shadingGeometryRelCtx shadingLightRelCtx shadingNetworkCompare ' +\n      'shadingNode shapeCompare shelfButton shelfLayout shelfTabLayout shellField ' +\n      'shortNameOf showHelp showHidden showManipCtx showSelectionInTitle ' +\n      'showShadingGroupAttrEditor showWindow sign simplify sin singleProfileBirailSurface ' +\n      'size sizeBytes skinCluster skinPercent smoothCurve smoothTangentSurface smoothstep ' +\n      'snap2to2 snapKey snapMode snapTogetherCtx snapshot soft softMod softModCtx sort sound ' +\n      'soundControl source spaceLocator sphere sphrand spotLight spotLightPreviewPort ' +\n      'spreadSheetEditor spring sqrt squareSurface srtContext stackTrace startString ' +\n      'startsWith stitchAndExplodeShell stitchSurface stitchSurfacePoints strcmp ' +\n      'stringArrayCatenate stringArrayContains stringArrayCount stringArrayInsertAtIndex ' +\n      'stringArrayIntersector stringArrayRemove stringArrayRemoveAtIndex ' +\n      'stringArrayRemoveDuplicates stringArrayRemoveExact stringArrayToString ' +\n      'stringToStringArray strip stripPrefixFromName stroke subdAutoProjection ' +\n      'subdCleanTopology subdCollapse subdDuplicateAndConnect subdEditUV ' +\n      'subdListComponentConversion subdMapCut subdMapSewMove subdMatchTopology subdMirror ' +\n      'subdToBlind subdToPoly subdTransferUVsToCache subdiv subdivCrease ' +\n      'subdivDisplaySmoothness substitute substituteAllString substituteGeometry substring ' +\n      'surface surfaceSampler surfaceShaderList swatchDisplayPort switchTable symbolButton ' +\n      'symbolCheckBox sysFile system tabLayout tan tangentConstraint texLatticeDeformContext ' +\n      'texManipContext texMoveContext texMoveUVShellContext texRotateContext texScaleContext ' +\n      'texSelectContext texSelectShortestPathCtx texSmudgeUVContext texWinToolCtx text ' +\n      'textCurves textField textFieldButtonGrp textFieldGrp textManip textScrollList ' +\n      'textToShelf textureDisplacePlane textureHairColor texturePlacementContext ' +\n      'textureWindow threadCount threePointArcCtx timeControl timePort timerX toNativePath ' +\n      'toggle toggleAxis toggleWindowVisibility tokenize tokenizeList tolerance tolower ' +\n      'toolButton toolCollection toolDropped toolHasOptions toolPropertyWindow torus toupper ' +\n      'trace track trackCtx transferAttributes transformCompare transformLimits translator ' +\n      'trim trunc truncateFluidCache truncateHairCache tumble tumbleCtx turbulence ' +\n      'twoPointArcCtx uiRes uiTemplate unassignInputDevice undo undoInfo ungroup uniform unit ' +\n      'unloadPlugin untangleUV untitledFileName untrim upAxis updateAE userCtx uvLink ' +\n      'uvSnapshot validateShelfName vectorize view2dToolCtx viewCamera viewClipPlane ' +\n      'viewFit viewHeadOn viewLookAt viewManip viewPlace viewSet visor volumeAxis vortex ' +\n      'waitCursor warning webBrowser webBrowserPrefs whatIs window windowPref wire ' +\n      'wireContext workspace wrinkle wrinkleContext writeTake xbmLangPathList xform',\n    illegal: '</',\n    contains: [\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        begin: '`', end: '`',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      {\n        className: 'variable',\n        variants: [\n          {begin: '\\\\$\\\\d'},\n          {begin: '[\\\\$\\\\%\\\\@](\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)'},\n          {begin: '\\\\*(\\\\^\\\\w\\\\b|#\\\\w+|[^\\\\s\\\\w{]|{\\\\w+}|\\\\w+)', relevance: 0}\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/mizar.js",
    "content": "/*\n  Language: Mizar\n  Author: Kelley van Evert <kelleyvanevert@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: [\n      \"environ vocabularies notations constructors definitions registrations theorems schemes requirements\",\n      \"begin end definition registration cluster existence pred func defpred deffunc theorem proof\",\n      \"let take assume then thus hence ex for st holds consider reconsider such that and in provided of as from\",\n      \"be being by means equals implies iff redefine define now not or attr is mode suppose per cases set\",\n      \"thesis contradiction scheme reserve struct\",\n      \"correctness compatibility coherence symmetry assymetry reflexivity irreflexivity\",\n      \"connectedness uniqueness commutativity idempotence involutiveness projectivity\"\n    ].join(\" \"),\n    contains: [\n      {\n        className: \"comment\",\n        begin: \"::\", end: \"$\"\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/monkey.js",
    "content": "/*\nLanguage: Monkey\nAuthor: Arthur Bikmullin <devolonter@gmail.com>\n*/\n\nfunction(hljs) {\n  var NUMBER = {\n    variants: [\n      {\n        className: 'number',\n        begin: '[$][a-fA-F0-9]+'\n      },\n      hljs.NUMBER_MODE\n    ]\n  }\n\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword: 'public private property continue exit extern new try catch ' +\n        'eachin not abstract final select case default const local global field ' +\n        'end if then else elseif endif while wend repeat until forever for to step next return module inline throw',\n\n      built_in: 'DebugLog DebugStop Error Print ACos ACosr ASin ASinr ATan ATan2 ATan2r ATanr Abs Abs Ceil ' +\n        'Clamp Clamp Cos Cosr Exp Floor Log Max Max Min Min Pow Sgn Sgn Sin Sinr Sqrt Tan Tanr Seed PI HALFPI TWOPI',\n\n      literal: 'true false null and or shl shr mod'\n    },\n    contains: [\n      {\n        className: 'comment',\n        begin: '#rem', end: '#end'\n      },\n      {\n        className: 'comment',\n        begin: \"'\", end: '$',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function method', end: '[(=:]|$',\n        illegal: /\\n/,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '$',\n        contains: [\n          {\n            beginKeywords: 'extends implements'\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'variable',\n        begin: '\\\\b(self|super)\\\\b'\n      },\n      {\n        className: 'preprocessor',\n        beginKeywords: 'import',\n        end: '$'\n      },\n      {\n        className: 'preprocessor',\n        begin: '\\\\s*#', end: '$',\n        keywords: 'if else elseif endif end then'\n      },\n      {\n        className: 'pi',\n        begin: '^\\\\s*strict\\\\b'\n      },\n      {\n        beginKeywords: 'alias', end: '=',\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      hljs.QUOTE_STRING_MODE,\n      NUMBER\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/nginx.js",
    "content": "/*\nLanguage: Nginx\nAuthor: Peter Leonov <gojpeg@yandex.ru>\nContributors: Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$\\d+/},\n      {begin: /\\$\\{/, end: /}/},\n      {begin: '[\\\\$\\\\@]' + hljs.UNDERSCORE_IDENT_RE}\n    ]\n  };\n  var DEFAULT = {\n    endsWithParent: true,\n    lexemes: '[a-z/_]+',\n    keywords: {\n      built_in:\n        'on off yes no true false none blocked debug info notice warn error crit ' +\n        'select break last permanent redirect kqueue rtsig epoll poll /dev/poll'\n    },\n    relevance: 0,\n    illegal: '=>',\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'string',\n        contains: [hljs.BACKSLASH_ESCAPE, VAR],\n        variants: [\n          {begin: /\"/, end: /\"/},\n          {begin: /'/, end: /'/}\n        ]\n      },\n      {\n        className: 'url',\n        begin: '([a-z]+):/', end: '\\\\s', endsWithParent: true, excludeEnd: true\n      },\n      {\n        className: 'regexp',\n        contains: [hljs.BACKSLASH_ESCAPE, VAR],\n        variants: [\n          {begin: \"\\\\s\\\\^\", end: \"\\\\s|{|;\", returnEnd: true},\n          // regexp locations (~, ~*)\n          {begin: \"~\\\\*?\\\\s+\", end: \"\\\\s|{|;\", returnEnd: true},\n          // *.example.com\n          {begin: \"\\\\*(\\\\.[a-z\\\\-]+)+\"},\n          // sub.example.*\n          {begin: \"([a-z\\\\-]+\\\\.)+\\\\*\"}\n        ]\n      },\n      // IP\n      {\n        className: 'number',\n        begin: '\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b'\n      },\n      // units\n      {\n        className: 'number',\n        begin: '\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b',\n        relevance: 0\n      },\n      VAR\n    ]\n  };\n\n  return {\n    aliases: ['nginxconf'],\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: hljs.UNDERSCORE_IDENT_RE + '\\\\s', end: ';|{', returnBegin: true,\n        contains: [\n          {\n            className: 'title',\n            begin: hljs.UNDERSCORE_IDENT_RE,\n            starts: DEFAULT\n          }\n        ],\n        relevance: 0\n      }\n    ],\n    illegal: '[^\\\\s\\\\}]'\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/nimrod.js",
    "content": "/*\nLanguage: Nimrod\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword: 'addr and as asm bind block break|0 case|0 cast const|0 continue|0 converter discard distinct|10 div do elif else|0 end|0 enum|0 except export finally for from generic if|0 import|0 in include|0 interface is isnot|10 iterator|10 let|0 macro method|10 mixin mod nil not notin|10 object|0 of or out proc|10 ptr raise ref|10 return shl shr static template|10 try|0 tuple type|0 using|0 var|0 when while|0 with without xor yield',\n      literal: 'shared guarded stdin stdout stderr result|10 true false'\n    },\n    contains: [ {\n        className: 'decorator', // Actually pragma\n        begin: /{\\./,\n        end: /\\.}/,\n        relevance: 10\n      }, {\n        className: 'string',\n        begin: /[a-zA-Z]\\w*\"/,\n        end: /\"/,\n        contains: [{begin: /\"\"/}]\n      }, {\n        className: 'string',\n        begin: /([a-zA-Z]\\w*)?\"\"\"/,\n        end: /\"\"\"/\n      }, {\n        className: 'string',\n        begin: /\"/,\n        end: /\"/,\n        illegal: /\\n/,\n        contains: [{begin: /\\\\./}]\n      }, {\n        className: 'type',\n        begin: /\\b[A-Z]\\w+\\b/,\n        relevance: 0\n      }, {\n        className: 'type',\n        begin: /\\b(int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|float|float32|float64|bool|char|string|cstring|pointer|expr|stmt|void|auto|any|range|array|openarray|varargs|seq|set|clong|culong|cchar|cschar|cshort|cint|csize|clonglong|cfloat|cdouble|clongdouble|cuchar|cushort|cuint|culonglong|cstringarray|semistatic)\\b/\n      }, {\n        className: 'number',\n        begin: /\\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      }, {\n        className: 'number',\n        begin: /\\b(\\d[_\\d]*)('?[iIuUfF](8|16|32|64))?/,\n        relevance: 0\n      },\n      hljs.HASH_COMMENT_MODE\n    ]\n  }\n}"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/nix.js",
    "content": "/*\nLanguage: Nix\nAuthor: Domen Kožar <domen@dev.si>\nDescription: Nix functional language. See http://nixos.org/nix\n*/\n\n\nfunction(hljs) {\n  var NIX_KEYWORDS = {\n    keyword: 'rec with let in inherit assert if else then',\n    constant: 'true false or and null',\n    built_in:\n      'import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation'\n  };\n  var ANTIQUOTE = {\n    className: 'subst',\n    begin: /\\$\\{/,\n    end: /\\}/,\n    keywords: NIX_KEYWORDS\n  };\n  var ATTRS = {\n    className: 'variable',\n    // TODO: we have to figure out a way how to exclude \\s*=\n    begin: /[a-zA-Z0-9-_]+(\\s*=)/\n  };\n  var SINGLE_QUOTE = {\n    className: 'string',\n    begin: \"''\",\n    end: \"''\",\n    contains: [\n      ANTIQUOTE\n    ]\n  };\n  var DOUBLE_QUOTE = {\n    className: 'string',\n    begin: '\"',\n    end: '\"',\n    contains: [\n      ANTIQUOTE\n    ]\n  };\n  var EXPRESSIONS = [\n    hljs.NUMBER_MODE,\n    hljs.HASH_COMMENT_MODE,\n    hljs.C_BLOCK_COMMENT_MODE,\n    SINGLE_QUOTE,\n    DOUBLE_QUOTE,\n    ATTRS\n  ];  \n  ANTIQUOTE.contains = EXPRESSIONS;\n  return {\n    aliases: [\"nixos\"],\n    keywords: NIX_KEYWORDS,\n    contains: EXPRESSIONS\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/nsis.js",
    "content": "/*\nLanguage: NSIS\nDescription: Nullsoft Scriptable Install System\nAuthor: Jan T. Sott <jan.sott@gmail.com>\nWebsite: http://github.com/idleberg\n*/\n\nfunction(hljs) {\n  var CONSTANTS = {\n    className: 'symbol',\n    begin: '\\\\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)'\n  };\n\n  var DEFINES = {\n    // ${defines}\n    className: 'constant',\n    begin: '\\\\$+{[a-zA-Z0-9_]+}'\n  };\n\n  var VARIABLES = {\n    // $variables\n    className: 'variable',\n    begin: '\\\\$+[a-zA-Z0-9_]+',\n    illegal: '\\\\(\\\\){}'\n  };\n\n  var LANGUAGES = {\n    // $(language_strings)\n    className: 'constant',\n    begin: '\\\\$+\\\\([a-zA-Z0-9_]+\\\\)'\n  };\n\n  var PARAMETERS = {\n    // command parameters\n    className: 'params',\n    begin: '(ARCHIVE|FILE_ATTRIBUTE_ARCHIVE|FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_OFFLINE|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_TEMPORARY|HKCR|HKCU|HKDD|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_DYN_DATA|HKEY_LOCAL_MACHINE|HKEY_PERFORMANCE_DATA|HKEY_USERS|HKLM|HKPD|HKU|IDABORT|IDCANCEL|IDIGNORE|IDNO|IDOK|IDRETRY|IDYES|MB_ABORTRETRYIGNORE|MB_DEFBUTTON1|MB_DEFBUTTON2|MB_DEFBUTTON3|MB_DEFBUTTON4|MB_ICONEXCLAMATION|MB_ICONINFORMATION|MB_ICONQUESTION|MB_ICONSTOP|MB_OK|MB_OKCANCEL|MB_RETRYCANCEL|MB_RIGHT|MB_RTLREADING|MB_SETFOREGROUND|MB_TOPMOST|MB_USERICON|MB_YESNO|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY)'\n  };\n\n  var COMPILER ={\n    // !compiler_flags\n    className: 'constant',\n    begin: '\\\\!(addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversionsystem|ifdef|ifmacrodef|ifmacrondef|ifndef|if|include|insertmacro|macroend|macro|packhdr|searchparse|searchreplace|tempfile|undef|verbose|warning)'\n  };\n\n  return {\n    case_insensitive: false,\n    keywords: {\n      keyword:\n      'Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileReadUTF16LE FileReadWord FileSeek FileWrite FileWriteByte FileWriteUTF16LE FileWriteWord FindClose FindFirst FindNext FindWindow FlushINI FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText ManifestDPIAware ManifestSupportedOS MessageBox MiscButtonText Name Nop OutFile Page PageCallbacks PageExEnd Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetPluginUnload SetRebootFlag SetRegView SetShellVarContext SetSilent ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubCaption SubSectionEnd Unicode UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIFileVersion VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle',\n      literal:\n      'admin all auto both colored current false force hide highest lastused leave listonly none normal notset off on open print show silent silentlog smooth textonly true user '\n    },\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"', end: '\"',\n        illegal: '\\\\n',\n        contains: [\n          { // $\\n, $\\r, $\\t, $$\n            className: 'symbol',\n            begin: '\\\\$(\\\\\\\\(n|r|t)|\\\\$)'\n          },\n          CONSTANTS,\n          DEFINES,\n          VARIABLES,\n          LANGUAGES\n        ]\n      },\n      { // line comments\n        className: 'comment',\n        begin: ';', end: '$',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'Function PageEx Section SectionGroup SubSection', end: '$'\n      },\n      COMPILER,\n      DEFINES,\n      VARIABLES,\n      LANGUAGES,\n      PARAMETERS,\n      hljs.NUMBER_MODE,\n      { // plug::ins\n        className: 'literal',\n        begin: hljs.IDENT_RE + '::' + hljs.IDENT_RE\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/objectivec.js",
    "content": "/*\nLanguage: Objective C\nAuthor: Valerii Hiora <valerii.hiora@gmail.com>\nContributors: Angel G. Olloqui <angelgarcia.mail@gmail.com>\n*/\n\nfunction(hljs) {\n  var OBJC_KEYWORDS = {\n    keyword:\n      'int float while char export sizeof typedef const struct for union ' +\n      'unsigned long volatile static bool mutable if do return goto void ' +\n      'enum else break extern asm case short default double register explicit ' +\n      'signed typename this switch continue wchar_t inline readonly assign ' +\n      'readwrite self @synchronized id typeof ' +\n      'nonatomic super unichar IBOutlet IBAction strong weak copy ' +\n      'in out inout bycopy byref oneway __strong __weak __block __autoreleasing ' +\n      '@private @protected @public @try @property @end @throw @catch @finally ' +\n      '@autoreleasepool @synthesize @dynamic @selector @optional @required',\n    literal:\n    \t'false true FALSE TRUE nil YES NO NULL',\n    built_in:\n      'NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView ' +\n      'NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet ' +\n      'UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread ' +\n      'UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool ' +\n      'UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray ' +\n      'NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController ' +\n      'UINavigationBar UINavigationController UITabBarController UIPopoverController ' +\n      'UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController ' +\n      'NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor ' +\n      'UIFont UIApplication NSNotFound NSNotificationCenter NSNotification ' +\n      'UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar ' +\n      'NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection ' +\n      'UIInterfaceOrientation MPMoviePlayerController dispatch_once_t ' +\n      'dispatch_queue_t dispatch_sync dispatch_async dispatch_once'\n  };\n  var LEXEMES = /[a-zA-Z@][a-zA-Z0-9_]*/;\n  var CLASS_KEYWORDS = '@interface @class @protocol @implementation';\n  return {\n    aliases: ['m', 'mm', 'objc', 'obj-c'],\n    keywords: OBJC_KEYWORDS, lexemes: LEXEMES,\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'string',\n        variants: [\n          {\n            begin: '@\"', end: '\"',\n            illegal: '\\\\n',\n            contains: [hljs.BACKSLASH_ESCAPE]\n          },\n          {\n            begin: '\\'', end: '[^\\\\\\\\]\\'',\n            illegal: '[^\\\\\\\\][^\\']'\n          }\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#',\n        end: '$',\n        contains: [\n          {\n            className: 'title',\n            variants: [\n              { begin: '\\\"', end: '\\\"' },\n              { begin: '<', end: '>' }\n            ]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        begin: '(' + CLASS_KEYWORDS.split(' ').join('|') + ')\\\\b', end: '({|$)', excludeEnd: true,\n        keywords: CLASS_KEYWORDS, lexemes: LEXEMES,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'variable',\n        begin: '\\\\.'+hljs.UNDERSCORE_IDENT_RE,\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/ocaml.js",
    "content": "/*\nLanguage: OCaml\nAuthor: Mehdi Dogguy <mehdi@dogguy.org>\nContributors: Nicolas Braud-Santoni <nicolas.braud-santoni@ens-cachan.fr>\nDescription: OCaml language definition.\n*/\nfunction(hljs) {\n  return {\n    aliases: ['ml'],\n    keywords: {\n      keyword:\n        'and as assert asr begin class constraint do done downto else end ' +\n        'exception external false for fun function functor if in include ' +\n        'inherit initializer land lazy let lor lsl lsr lxor match method ' +\n        'mod module mutable new object of open or private rec ref sig struct ' +\n        'then to true try type val virtual when while with parser value',\n      built_in:\n        'bool char float int list unit array exn option int32 int64 nativeint ' +\n        'format4 format6 lazy_t in_channel out_channel string'\n    },\n    illegal: /\\/\\//,\n    contains: [\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n        contains: ['self']\n      },\n      {\n        className: 'class',\n        beginKeywords: 'type', end: '\\\\(|=|$', excludeEnd: true,\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        className: 'annotation',\n        begin: '\\\\[<', end: '>\\\\]'\n      },\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      hljs.C_NUMBER_MODE\n    ]\n  }\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/oxygene.js",
    "content": "/*\nLanguage: Oxygene\nAuthor: Carlo Kok <ck@remobjects.com>\nDescription: Language definition for RemObjects Oxygene (http://www.remobjects.com)\n*/\n\nfunction(hljs) {\n  var OXYGENE_KEYWORDS = 'abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue '+\n    'create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false '+\n    'final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited '+\n    'inline interface into invariants is iterator join locked locking loop matching method mod module namespace nested new nil not notify nullable of '+\n    'old on operator or order out override parallel params partial pinned private procedure property protected public queryable raise read readonly '+\n    'record reintroduce remove repeat require result reverse sealed select self sequence set shl shr skip static step soft take then to true try tuple '+\n    'type union unit unsafe until uses using var virtual raises volatile where while with write xor yield await mapped deprecated stdcall cdecl pascal '+\n    'register safecall overload library platform reference packed strict published autoreleasepool selector strong weak unretained';\n  var CURLY_COMMENT =  {\n    className: 'comment',\n    begin: '{', end: '}',\n    relevance: 0\n  };\n  var PAREN_COMMENT = {\n    className: 'comment',\n    begin: '\\\\(\\\\*', end: '\\\\*\\\\)',\n    relevance: 10\n  };\n  var STRING = {\n    className: 'string',\n    begin: '\\'', end: '\\'',\n    contains: [{begin: '\\'\\''}]\n  };\n  var CHAR_STRING = {\n    className: 'string', begin: '(#\\\\d+)+'\n  };\n  var FUNCTION = {\n    className: 'function',\n    beginKeywords: 'function constructor destructor procedure method', end: '[:;]',\n    keywords: 'function constructor|10 destructor|10 procedure|10 method|10',\n    contains: [\n      hljs.TITLE_MODE,\n      {\n        className: 'params',\n        begin: '\\\\(', end: '\\\\)',\n        keywords: OXYGENE_KEYWORDS,\n        contains: [STRING, CHAR_STRING]\n      },\n      CURLY_COMMENT, PAREN_COMMENT\n    ]\n  };\n  return {\n    case_insensitive: true,\n    keywords: OXYGENE_KEYWORDS,\n    illegal: '(\"|\\\\$[G-Zg-z]|\\\\/\\\\*|</)',\n    contains: [\n      CURLY_COMMENT, PAREN_COMMENT, hljs.C_LINE_COMMENT_MODE,\n      STRING, CHAR_STRING,\n      hljs.NUMBER_MODE,\n      FUNCTION,\n      {\n        className: 'class',\n        begin: '=\\\\bclass\\\\b', end: 'end;',\n        keywords: OXYGENE_KEYWORDS,\n        contains: [\n          STRING, CHAR_STRING,\n          CURLY_COMMENT, PAREN_COMMENT, hljs.C_LINE_COMMENT_MODE,\n          FUNCTION\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/parser3.js",
    "content": "/*\nLanguage: Parser3\nRequires: xml.js\nAuthor: Oleg Volchkov <oleg@volchkov.net>\n*/\n\nfunction(hljs) {\n  return {\n    subLanguage: 'xml', relevance: 0,\n    contains: [\n      {\n        className: 'comment',\n        begin: '^#', end: '$'\n      },\n      {\n        className: 'comment',\n        begin: '\\\\^rem{', end: '}',\n        relevance: 10,\n        contains: [\n          {\n            begin: '{', end: '}',\n            contains: ['self']\n          }\n        ]\n      },\n      {\n        className: 'preprocessor',\n        begin: '^@(?:BASE|USE|CLASS|OPTIONS)$',\n        relevance: 10\n      },\n      {\n        className: 'title',\n        begin: '@[\\\\w\\\\-]+\\\\[[\\\\w^;\\\\-]*\\\\](?:\\\\[[\\\\w^;\\\\-]*\\\\])?(?:.*)$'\n      },\n      {\n        className: 'variable',\n        begin: '\\\\$\\\\{?[\\\\w\\\\-\\\\.\\\\:]+\\\\}?'\n      },\n      {\n        className: 'keyword',\n        begin: '\\\\^[\\\\w\\\\-\\\\.\\\\:]+'\n      },\n      {\n        className: 'number',\n        begin: '\\\\^#[0-9a-fA-F]+'\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/perl.js",
    "content": "/*\nLanguage: Perl\nAuthor: Peter Leonov <gojpeg@yandex.ru>\n*/\n\nfunction(hljs) {\n  var PERL_KEYWORDS = 'getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ' +\n    'ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime ' +\n    'readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq' +\n    'fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent ' +\n    'shutdown dump chomp connect getsockname die socketpair close flock exists index shmget' +\n    'sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr ' +\n    'unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 ' +\n    'getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline ' +\n    'endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand ' +\n    'mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink ' +\n    'getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr ' +\n    'untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link ' +\n    'getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller ' +\n    'lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and ' +\n    'sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 ' +\n    'chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach ' +\n    'tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir' +\n    'ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe ' +\n    'atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when';\n  var SUBST = {\n    className: 'subst',\n    begin: '[$@]\\\\{', end: '\\\\}',\n    keywords: PERL_KEYWORDS\n  };\n  var METHOD = {\n    begin: '->{', end: '}'\n    // contains defined later\n  };\n  var VAR = {\n    className: 'variable',\n    variants: [\n      {begin: /\\$\\d/},\n      {begin: /[\\$\\%\\@](\\^\\w\\b|#\\w+(\\:\\:\\w+)*|{\\w+}|\\w+(\\:\\:\\w*)*)/},\n      {begin: /[\\$\\%\\@][^\\s\\w{]/, relevance: 0}\n    ]\n  };\n  var COMMENT = {\n    className: 'comment',\n    begin: '^(__END__|__DATA__)', end: '\\\\n$',\n    relevance: 5\n  };\n  var STRING_CONTAINS = [hljs.BACKSLASH_ESCAPE, SUBST, VAR];\n  var PERL_DEFAULT_CONTAINS = [\n    VAR,\n    hljs.HASH_COMMENT_MODE,\n    COMMENT,\n    {\n      className: 'comment',\n      begin: '^\\\\=\\\\w', end: '\\\\=cut', endsWithParent: true\n    },\n    METHOD,\n    {\n      className: 'string',\n      contains: STRING_CONTAINS,\n      variants: [\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\(', end: '\\\\)',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\[', end: '\\\\]',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\{', end: '\\\\}',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\|', end: '\\\\|',\n          relevance: 5\n        },\n        {\n          begin: 'q[qwxr]?\\\\s*\\\\<', end: '\\\\>',\n          relevance: 5\n        },\n        {\n          begin: 'qw\\\\s+q', end: 'q',\n          relevance: 5\n        },\n        {\n          begin: '\\'', end: '\\'',\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: '\"', end: '\"'\n        },\n        {\n          begin: '`', end: '`',\n          contains: [hljs.BACKSLASH_ESCAPE]\n        },\n        {\n          begin: '{\\\\w+}',\n          contains: [],\n          relevance: 0\n        },\n        {\n          begin: '\\-?\\\\w+\\\\s*\\\\=\\\\>',\n          contains: [],\n          relevance: 0\n        }\n      ]\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    { // regexp container\n      begin: '(\\\\/\\\\/|' + hljs.RE_STARTERS_RE + '|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*',\n      keywords: 'split return print reverse grep',\n      relevance: 0,\n      contains: [\n        hljs.HASH_COMMENT_MODE,\n        COMMENT,\n        {\n          className: 'regexp',\n          begin: '(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*',\n          relevance: 10\n        },\n        {\n          className: 'regexp',\n          begin: '(m|qr)?/', end: '/[a-z]*',\n          contains: [hljs.BACKSLASH_ESCAPE],\n          relevance: 0 // allows empty \"//\" which is a common comment delimiter in other languages\n        }\n      ]\n    },\n    {\n      className: 'sub',\n      beginKeywords: 'sub', end: '(\\\\s*\\\\(.*?\\\\))?[;{]',\n      relevance: 5\n    },\n    {\n      className: 'operator',\n      begin: '-\\\\w\\\\b',\n      relevance: 0\n    }\n  ];\n  SUBST.contains = PERL_DEFAULT_CONTAINS;\n  METHOD.contains = PERL_DEFAULT_CONTAINS;\n\n  return {\n    aliases: ['pl'],\n    keywords: PERL_KEYWORDS,\n    contains: PERL_DEFAULT_CONTAINS\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/php.js",
    "content": "/*\nLanguage: PHP\nAuthor: Victor Karamzin <Victor.Karamzin@enterra-inc.com>\nContributors: Evgeny Stepanischev <imbolk@gmail.com>, Ivan Sagalaev <maniac@softwaremaniacs.org>\n*/\n\nfunction(hljs) {\n  var VARIABLE = {\n    className: 'variable', begin: '(\\\\$|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*'\n  };\n  var PREPROCESSOR = {\n    className: 'preprocessor', begin: /<\\?(php)?|\\?>/\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, PREPROCESSOR],\n    variants: [\n      {\n        begin: 'b\"', end: '\"'\n      },\n      {\n        begin: 'b\\'', end: '\\''\n      },\n      hljs.inherit(hljs.APOS_STRING_MODE, {illegal: null}),\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null})\n    ]\n  };\n  var NUMBER = {variants: [hljs.BINARY_NUMBER_MODE, hljs.C_NUMBER_MODE]};\n  return {\n    aliases: ['php3', 'php4', 'php5', 'php6'],\n    case_insensitive: true,\n    keywords:\n      'and include_once list abstract global private echo interface as static endswitch ' +\n      'array null if endwhile or const for endforeach self var while isset public ' +\n      'protected exit foreach throw elseif include __FILE__ empty require_once do xor ' +\n      'return parent clone use __CLASS__ __LINE__ else break print eval new ' +\n      'catch __METHOD__ case exception default die require __FUNCTION__ ' +\n      'enddeclare final try switch continue endfor endif declare unset true false ' +\n      'trait goto instanceof insteadof __DIR__ __NAMESPACE__ ' +\n      'yield finally',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.HASH_COMMENT_MODE,\n      {\n        className: 'comment',\n        begin: '/\\\\*', end: '\\\\*/',\n        contains: [\n          {\n            className: 'phpdoc',\n            begin: '\\\\s@[A-Za-z]+'\n          },\n          PREPROCESSOR\n        ]\n      },\n      {\n          className: 'comment',\n          begin: '__halt_compiler.+?;', endsWithParent: true,\n          keywords: '__halt_compiler', lexemes: hljs.UNDERSCORE_IDENT_RE\n      },\n      {\n        className: 'string',\n        begin: '<<<[\\'\"]?\\\\w+[\\'\"]?$', end: '^\\\\w+;',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      PREPROCESSOR,\n      VARIABLE,\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /[;{]/, excludeEnd: true,\n        illegal: '\\\\$|\\\\[|%',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              'self',\n              VARIABLE,\n              hljs.C_BLOCK_COMMENT_MODE,\n              STRING,\n              NUMBER\n            ]\n          }\n        ]\n      },\n      {\n        className: 'class',\n        beginKeywords: 'class interface', end: '{', excludeEnd: true,\n        illegal: /[:\\(\\$\"]/,\n        contains: [\n          {\n            beginKeywords: 'extends implements',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      {\n        beginKeywords: 'namespace', end: ';',\n        illegal: /[\\.']/,\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        beginKeywords: 'use', end: ';',\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        begin: '=>' // No markup, just a relevance booster\n      },\n      STRING,\n      NUMBER\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/profile.js",
    "content": "/*\nLanguage: Python profile\nDescription: Python profiler results\nAuthor: Brian Beck <exogen@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    contains: [\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'built_in',\n        begin: '{', end: '}$',\n        excludeBegin: true, excludeEnd: true,\n        contains: [hljs.APOS_STRING_MODE, hljs.QUOTE_STRING_MODE],\n        relevance: 0\n      },\n      {\n        className: 'filename',\n        begin: '[a-zA-Z_][\\\\da-zA-Z_]+\\\\.[\\\\da-zA-Z_]{1,3}', end: ':',\n        excludeEnd: true\n      },\n      {\n        className: 'header',\n        begin: '(ncalls|tottime|cumtime)', end: '$',\n        keywords: 'ncalls tottime|10 cumtime|10 filename',\n        relevance: 10\n      },\n      {\n        className: 'summary',\n        begin: 'function calls', end: '$',\n        contains: [hljs.C_NUMBER_MODE],\n        relevance: 10\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      {\n        className: 'function',\n        begin: '\\\\(', end: '\\\\)$',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ],\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/protobuf.js",
    "content": "/*\nLanguage: Protocol Buffers\nAuthor: Dan Tao <daniel.tao@gmail.com>\nDescription: Protocol buffer message definition format\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword: 'package import option optional required repeated group',\n      built_in: 'double float int32 int64 uint32 uint64 sint32 sint64 ' +\n        'fixed32 fixed64 sfixed32 sfixed64 bool string bytes',\n      literal: 'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'message enum service', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'function',\n        beginKeywords: 'rpc',\n        end: /;/, excludeEnd: true,\n        keywords: 'rpc returns'\n      },\n      {\n        className: 'constant',\n        begin: /^\\s*[A-Z_]+/,\n        end: /\\s*=/, excludeEnd: true\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/python.js",
    "content": "/*\nLanguage: Python\n*/\n\nfunction(hljs) {\n  var PROMPT = {\n    className: 'prompt',  begin: /^(>>>|\\.\\.\\.) /\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE],\n    variants: [\n      {\n        begin: /(u|b)?r?'''/, end: /'''/,\n        contains: [PROMPT],\n        relevance: 10\n      },\n      {\n        begin: /(u|b)?r?\"\"\"/, end: /\"\"\"/,\n        contains: [PROMPT],\n        relevance: 10\n      },\n      {\n        begin: /(u|r|ur)'/, end: /'/,\n        relevance: 10\n      },\n      {\n        begin: /(u|r|ur)\"/, end: /\"/,\n        relevance: 10\n      },\n      {\n        begin: /(b|br)'/, end: /'/\n      },\n      {\n        begin: /(b|br)\"/, end: /\"/\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n  var NUMBER = {\n    className: 'number', relevance: 0,\n    variants: [\n      {begin: hljs.BINARY_NUMBER_RE + '[lLjJ]?'},\n      {begin: '\\\\b(0o[0-7]+)[lLjJ]?'},\n      {begin: hljs.C_NUMBER_RE + '[lLjJ]?'}\n    ]\n  };\n  var PARAMS = {\n    className: 'params',\n    begin: /\\(/, end: /\\)/,\n    contains: ['self', PROMPT, NUMBER, STRING]\n  };\n  var FUNC_CLASS_PROTO = {\n    end: /:/,\n    illegal: /[${=;\\n]/,\n    contains: [hljs.UNDERSCORE_TITLE_MODE, PARAMS]\n  };\n\n  return {\n    aliases: ['py', 'gyp'],\n    keywords: {\n      keyword:\n        'and elif is global as in if from raise for except finally print import pass return ' +\n        'exec else break not with class assert yield try while continue del or def lambda ' +\n        'nonlocal|10 None True False',\n      built_in:\n        'Ellipsis NotImplemented'\n    },\n    illegal: /(<\\/|->|\\?)/,\n    contains: [\n      PROMPT,\n      NUMBER,\n      STRING,\n      hljs.HASH_COMMENT_MODE,\n      hljs.inherit(FUNC_CLASS_PROTO, {className: 'function', beginKeywords: 'def', relevance: 10}),\n      hljs.inherit(FUNC_CLASS_PROTO, {className: 'class', beginKeywords: 'class'}),\n      {\n        className: 'decorator',\n        begin: /@/, end: /$/\n      },\n      {\n        begin: /\\b(print|exec)\\(/ // don’t highlight keywords-turned-functions in Python 3\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/r.js",
    "content": "/*\nLanguage: R\nAuthor: Joe Cheng <joe@rstudio.org>\n*/\n\nfunction(hljs) {\n  var IDENT_RE = '([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*';\n\n  return {\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      {\n        begin: IDENT_RE,\n        lexemes: IDENT_RE,\n        keywords: {\n          keyword:\n            'function if in break next repeat else for return switch while try tryCatch|10 ' +\n            'stop warning require library attach detach source setMethod setGeneric ' +\n            'setGroupGeneric setClass ...|10',\n          literal:\n            'NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 ' +\n            'NA_complex_|10'\n        },\n        relevance: 0\n      },\n      {\n        // hex value\n        className: 'number',\n        begin: \"0[xX][0-9a-fA-F]+[Li]?\\\\b\",\n        relevance: 0\n      },\n      {\n        // explicit integer\n        className: 'number',\n        begin: \"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",\n        relevance: 0\n      },\n      {\n        // number with trailing decimal\n        className: 'number',\n        begin: \"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",\n        relevance: 0\n      },\n      {\n        // number\n        className: 'number',\n        begin: \"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",\n        relevance: 0\n      },\n      {\n        // number with leading decimal\n        className: 'number',\n        begin: \"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",\n        relevance: 0\n      },\n\n      {\n        // escaped identifier\n        begin: '`',\n        end: '`',\n        relevance: 0\n      },\n\n      {\n        className: 'string',\n        contains: [hljs.BACKSLASH_ESCAPE],\n        variants: [\n          {begin: '\"', end: '\"'},\n          {begin: \"'\", end: \"'\"}\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/rib.js",
    "content": "/*\nLanguage: RenderMan RIB\nAuthor: Konstantin Evdokimenko <qewerty@gmail.com>\nContributors: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords:\n      'ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis ' +\n      'Begin Blobby Bound Clipping ClippingPlane Color ColorSamples ConcatTransform Cone ' +\n      'CoordinateSystem CoordSysTransform CropWindow Curves Cylinder DepthOfField Detail ' +\n      'DetailRange Disk Displacement Display End ErrorHandler Exposure Exterior Format ' +\n      'FrameAspectRatio FrameBegin FrameEnd GeneralPolygon GeometricApproximation Geometry ' +\n      'Hider Hyperboloid Identity Illuminate Imager Interior LightSource ' +\n      'MakeCubeFaceEnvironment MakeLatLongEnvironment MakeShadow MakeTexture Matte ' +\n      'MotionBegin MotionEnd NuPatch ObjectBegin ObjectEnd ObjectInstance Opacity Option ' +\n      'Orientation Paraboloid Patch PatchMesh Perspective PixelFilter PixelSamples ' +\n      'PixelVariance Points PointsGeneralPolygons PointsPolygons Polygon Procedural Projection ' +\n      'Quantize ReadArchive RelativeDetail ReverseOrientation Rotate Scale ScreenWindow ' +\n      'ShadingInterpolation ShadingRate Shutter Sides Skew SolidBegin SolidEnd Sphere ' +\n      'SubdivisionMesh Surface TextureCoordinates Torus Transform TransformBegin TransformEnd ' +\n      'TransformPoints Translate TrimCurve WorldBegin WorldEnd',\n    illegal: '</',\n    contains: [\n      hljs.HASH_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/rsl.js",
    "content": "/*\nLanguage: RenderMan RSL\nAuthor: Konstantin Evdokimenko <qewerty@gmail.com>\nContributors: Shuen-Huei Guan <drake.guan@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        'float color point normal vector matrix while for if do return else break extern continue',\n      built_in:\n        'abs acos ambient area asin atan atmosphere attribute calculatenormal ceil cellnoise ' +\n        'clamp comp concat cos degrees depth Deriv diffuse distance Du Dv environment exp ' +\n        'faceforward filterstep floor format fresnel incident length lightsource log match ' +\n        'max min mod noise normalize ntransform opposite option phong pnoise pow printf ' +\n        'ptlined radians random reflect refract renderinfo round setcomp setxcomp setycomp ' +\n        'setzcomp shadow sign sin smoothstep specular specularbrdf spline sqrt step tan ' +\n        'texture textureinfo trace transform vtransform xcomp ycomp zcomp'\n    },\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$'\n      },\n      {\n        className: 'shader',\n        beginKeywords: 'surface displacement light volume imager', end: '\\\\('\n      },\n      {\n        className: 'shading',\n        beginKeywords: 'illuminate illuminance gather', end: '\\\\('\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/ruby.js",
    "content": "/*\nLanguage: Ruby\nAuthor: Anton Kovalyov <anton@kovalyov.net>\nContributors: Peter Leonov <gojpeg@yandex.ru>, Vasily Polovnyov <vast@whiteants.net>, Loren Segal <lsegal@soen.ca>, Pascal Hurni <phi@ruby-reactive.org>\n*/\n\nfunction(hljs) {\n  var RUBY_METHOD_RE = '[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?';\n  var RUBY_KEYWORDS =\n    'and false then defined module in return redo if BEGIN retry end for true self when ' +\n    'next until do begin unless END rescue nil else break undef not super class case ' +\n    'require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor';\n  var YARDOCTAG = {\n    className: 'yardoctag',\n    begin: '@[A-Za-z]+'\n  };\n  var IRB_OBJECT = {\n    className: 'value',\n    begin: '#<', end: '>'\n  };\n  var COMMENT = {\n    className: 'comment',\n    variants: [\n      {\n        begin: '#', end: '$',\n        contains: [YARDOCTAG]\n      },\n      {\n        begin: '^\\\\=begin', end: '^\\\\=end',\n        contains: [YARDOCTAG],\n        relevance: 10\n      },\n      {\n        begin: '^__END__', end: '\\\\n$'\n      }\n    ]\n  };\n  var SUBST = {\n    className: 'subst',\n    begin: '#\\\\{', end: '}',\n    keywords: RUBY_KEYWORDS\n  };\n  var STRING = {\n    className: 'string',\n    contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n    variants: [\n      {begin: /'/, end: /'/},\n      {begin: /\"/, end: /\"/},\n      {begin: '%[qw]?\\\\(', end: '\\\\)'},\n      {begin: '%[qw]?\\\\[', end: '\\\\]'},\n      {begin: '%[qw]?{', end: '}'},\n      {begin: '%[qw]?<', end: '>'},\n      {begin: '%[qw]?/', end: '/'},\n      {begin: '%[qw]?%', end: '%'},\n      {begin: '%[qw]?-', end: '-'},\n      {begin: '%[qw]?\\\\|', end: '\\\\|'},\n      {\n        // \\B in the beginning suppresses recognition of ?-sequences where ?\n        // is the last character of a preceding identifier, as in: `func?4`\n        begin: /\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/\n      }\n    ]\n  };\n  var PARAMS = {\n    className: 'params',\n    begin: '\\\\(', end: '\\\\)',\n    keywords: RUBY_KEYWORDS\n  };\n\n  var RUBY_DEFAULT_CONTAINS = [\n    STRING,\n    IRB_OBJECT,\n    COMMENT,\n    {\n      className: 'class',\n      beginKeywords: 'class module', end: '$|;',\n      illegal: /=/,\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: '[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?'}),\n        {\n          className: 'inheritance',\n          begin: '<\\\\s*',\n          contains: [{\n            className: 'parent',\n            begin: '(' + hljs.IDENT_RE + '::)?' + hljs.IDENT_RE\n          }]\n        },\n        COMMENT\n      ]\n    },\n    {\n      className: 'function',\n      beginKeywords: 'def', end: ' |$|;',\n      relevance: 0,\n      contains: [\n        hljs.inherit(hljs.TITLE_MODE, {begin: RUBY_METHOD_RE}),\n        PARAMS,\n        COMMENT\n      ]\n    },\n    {\n      className: 'constant',\n      begin: '(::)?(\\\\b[A-Z]\\\\w*(::)?)+',\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: ':',\n      contains: [STRING, {begin: RUBY_METHOD_RE}],\n      relevance: 0\n    },\n    {\n      className: 'symbol',\n      begin: hljs.UNDERSCORE_IDENT_RE + '(\\\\!|\\\\?)?:',\n      relevance: 0\n    },\n    {\n      className: 'number',\n      begin: '(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b',\n      relevance: 0\n    },\n    {\n      className: 'variable',\n      begin: '(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))'\n    },\n    { // regexp container\n      begin: '(' + hljs.RE_STARTERS_RE + ')\\\\s*',\n      contains: [\n        IRB_OBJECT,\n        COMMENT,\n        {\n          className: 'regexp',\n          contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n          illegal: /\\n/,\n          variants: [\n            {begin: '/', end: '/[a-z]*'},\n            {begin: '%r{', end: '}[a-z]*'},\n            {begin: '%r\\\\(', end: '\\\\)[a-z]*'},\n            {begin: '%r!', end: '![a-z]*'},\n            {begin: '%r\\\\[', end: '\\\\][a-z]*'}\n          ]\n        }\n      ],\n      relevance: 0\n    }\n  ];\n  SUBST.contains = RUBY_DEFAULT_CONTAINS;\n  PARAMS.contains = RUBY_DEFAULT_CONTAINS;\n  \n  var IRB_DEFAULT = [\n    {\n      relevance: 1,\n      className: 'output',\n      begin: '^\\\\s*=> ', end: \"$\",\n      returnBegin: true,\n      contains: [\n        {\n          className: 'status',\n          begin: '^\\\\s*=>'\n        },\n        {\n          begin: ' ', end: '$',\n          contains: RUBY_DEFAULT_CONTAINS\n        }\n      ]\n    },\n    {\n      relevance: 1,\n      className: 'input',\n      begin: '^[^ ][^=>]*>+ ', end: \"$\",\n      returnBegin: true,\n      contains: [\n        {\n          className: 'prompt',\n          begin: '^[^ ][^=>]*>+'\n        },\n        {\n          begin: ' ', end: '$',\n          contains: RUBY_DEFAULT_CONTAINS\n        }\n      ]\n    }\n  ];\n\n  return {\n    aliases: ['rb', 'gemspec', 'podspec', 'thor', 'irb'],\n    keywords: RUBY_KEYWORDS,\n    contains: IRB_DEFAULT.concat(RUBY_DEFAULT_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/ruleslanguage.js",
    "content": "/*\nLanguage: Oracle Rules Language\nAuthor: Jason Jacobson <jason.a.jacobson@gmail.com>\nDescription: The Oracle Utilities Rules Language is used to program the Oracle Utilities Applications acquired from LODESTAR Corporation.  The products include Billing Component, LPSS, Pricing Component etc. through version 1.6.1.\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n       keyword: 'BILL_PERIOD BILL_START BILL_STOP RS_EFFECTIVE_START RS_EFFECTIVE_STOP RS_JURIS_CODE RS_OPCO_CODE ' +\n         'INTDADDATTRIBUTE|5 INTDADDVMSG|5 INTDBLOCKOP|5 INTDBLOCKOPNA|5 INTDCLOSE|5 INTDCOUNT|5 ' +\n         'INTDCOUNTSTATUSCODE|5 INTDCREATEMASK|5 INTDCREATEDAYMASK|5 INTDCREATEFACTORMASK|5 ' +\n         'INTDCREATEHANDLE|5 INTDCREATEOVERRIDEDAYMASK|5 INTDCREATEOVERRIDEMASK|5 ' +\n         'INTDCREATESTATUSCODEMASK|5 INTDCREATETOUPERIOD|5 INTDDELETE|5 INTDDIPTEST|5 INTDEXPORT|5 ' +\n         'INTDGETERRORCODE|5 INTDGETERRORMESSAGE|5 INTDISEQUAL|5 INTDJOIN|5 INTDLOAD|5 INTDLOADACTUALCUT|5 ' +\n         'INTDLOADDATES|5 INTDLOADHIST|5 INTDLOADLIST|5 INTDLOADLISTDATES|5 INTDLOADLISTENERGY|5 ' +\n         'INTDLOADLISTHIST|5 INTDLOADRELATEDCHANNEL|5 INTDLOADSP|5 INTDLOADSTAGING|5 INTDLOADUOM|5 ' +\n         'INTDLOADUOMDATES|5 INTDLOADUOMHIST|5 INTDLOADVERSION|5 INTDOPEN|5 INTDREADFIRST|5 INTDREADNEXT|5 ' +\n         'INTDRECCOUNT|5 INTDRELEASE|5 INTDREPLACE|5 INTDROLLAVG|5 INTDROLLPEAK|5 INTDSCALAROP|5 INTDSCALE|5 ' +\n         'INTDSETATTRIBUTE|5 INTDSETDSTPARTICIPANT|5 INTDSETSTRING|5 INTDSETVALUE|5 INTDSETVALUESTATUS|5 ' +\n         'INTDSHIFTSTARTTIME|5 INTDSMOOTH|5 INTDSORT|5 INTDSPIKETEST|5 INTDSUBSET|5 INTDTOU|5 ' +\n         'INTDTOURELEASE|5 INTDTOUVALUE|5 INTDUPDATESTATS|5 INTDVALUE|5 STDEV INTDDELETEEX|5 ' +\n         'INTDLOADEXACTUAL|5 INTDLOADEXCUT|5 INTDLOADEXDATES|5 INTDLOADEX|5 INTDLOADEXRELATEDCHANNEL|5 ' +\n         'INTDSAVEEX|5 MVLOAD|5 MVLOADACCT|5 MVLOADACCTDATES|5 MVLOADACCTHIST|5 MVLOADDATES|5 MVLOADHIST|5 ' +\n         'MVLOADLIST|5 MVLOADLISTDATES|5 MVLOADLISTHIST|5 IF FOR NEXT DONE SELECT END CALL ABORT CLEAR CHANNEL FACTOR LIST NUMBER ' +\n         'OVERRIDE SET WEEK DISTRIBUTIONNODE ELSE WHEN THEN OTHERWISE IENUM CSV INCLUDE LEAVE RIDER SAVE DELETE ' +\n         'NOVALUE SECTION WARN SAVE_UPDATE DETERMINANT LABEL REPORT REVENUE EACH ' +\n         'IN FROM TOTAL CHARGE BLOCK AND OR CSV_FILE RATE_CODE AUXILIARY_DEMAND ' +\n         'UIDACCOUNT RS BILL_PERIOD_SELECT HOURS_PER_MONTH INTD_ERROR_STOP SEASON_SCHEDULE_NAME ' +\n         'ACCOUNTFACTOR ARRAYUPPERBOUND CALLSTOREDPROC GETADOCONNECTION GETCONNECT GETDATASOURCE ' +\n         'GETQUALIFIER GETUSERID HASVALUE LISTCOUNT LISTOP LISTUPDATE LISTVALUE PRORATEFACTOR RSPRORATE ' +\n         'SETBINPATH SETDBMONITOR WQ_OPEN BILLINGHOURS DATE DATEFROMFLOAT DATETIMEFROMSTRING ' +\n         'DATETIMETOSTRING DATETOFLOAT DAY DAYDIFF DAYNAME DBDATETIME HOUR MINUTE MONTH MONTHDIFF ' +\n         'MONTHHOURS MONTHNAME ROUNDDATE SAMEWEEKDAYLASTYEAR SECOND WEEKDAY WEEKDIFF YEAR YEARDAY ' +\n         'YEARSTR COMPSUM HISTCOUNT HISTMAX HISTMIN HISTMINNZ HISTVALUE MAXNRANGE MAXRANGE MINRANGE ' +\n         'COMPIKVA COMPKVA COMPKVARFROMKQKW COMPLF IDATTR FLAG LF2KW LF2KWH MAXKW POWERFACTOR ' +\n         'READING2USAGE AVGSEASON MAXSEASON MONTHLYMERGE SEASONVALUE SUMSEASON ACCTREADDATES ' +\n         'ACCTTABLELOAD CONFIGADD CONFIGGET CREATEOBJECT CREATEREPORT EMAILCLIENT EXPBLKMDMUSAGE ' +\n         'EXPMDMUSAGE EXPORT_USAGE FACTORINEFFECT GETUSERSPECIFIEDSTOP INEFFECT ISHOLIDAY RUNRATE ' +\n         'SAVE_PROFILE SETREPORTTITLE USEREXIT WATFORRUNRATE TO TABLE ACOS ASIN ATAN ATAN2 BITAND CEIL ' +\n         'COS COSECANT COSH COTANGENT DIVQUOT DIVREM EXP FABS FLOOR FMOD FREPM FREXPN LOG LOG10 MAX MAXN ' +\n         'MIN MINNZ MODF POW ROUND ROUND2VALUE ROUNDINT SECANT SIN SINH SQROOT TAN TANH FLOAT2STRING ' +\n         'FLOAT2STRINGNC INSTR LEFT LEN LTRIM MID RIGHT RTRIM STRING STRINGNC TOLOWER TOUPPER TRIM ' +\n         'NUMDAYS READ_DATE STAGING',\n       built_in: 'IDENTIFIER OPTIONS XML_ELEMENT XML_OP XML_ELEMENT_OF DOMDOCCREATE DOMDOCLOADFILE DOMDOCLOADXML ' +\n         'DOMDOCSAVEFILE DOMDOCGETROOT DOMDOCADDPI DOMNODEGETNAME DOMNODEGETTYPE DOMNODEGETVALUE DOMNODEGETCHILDCT ' +\n         'DOMNODEGETFIRSTCHILD DOMNODEGETSIBLING DOMNODECREATECHILDELEMENT DOMNODESETATTRIBUTE ' +\n         'DOMNODEGETCHILDELEMENTCT DOMNODEGETFIRSTCHILDELEMENT DOMNODEGETSIBLINGELEMENT DOMNODEGETATTRIBUTECT ' +\n         'DOMNODEGETATTRIBUTEI DOMNODEGETATTRIBUTEBYNAME DOMNODEGETBYNAME'\n    },\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      { className: 'array',\n        begin: '\\#[a-zA-Z\\ \\.]+'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/rust.js",
    "content": "/*\nLanguage: Rust\nAuthor: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>\nContributors: Roman Shmatov <romanshmatov@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['rs'],\n    keywords:\n      'alignof as be box break const continue crate do else enum extern ' +\n      'false fn for if impl in let loop match mod mut offsetof once priv ' +\n      'proc pub pure ref return self sizeof static struct super trait true ' +\n      'type typeof unsafe unsized use virtual while yield ' +\n      'int i8 i16 i32 i64 ' +\n      'uint u8 u32 u64 ' +\n      'float f32 f64 ' +\n      'str char bool',\n    illegal: '</',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),\n      {\n        className: 'string',\n        begin: /r(#*)\".*?\"\\1(?!#)/\n      },\n      {\n        className: 'string',\n        begin: /'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/\n      },\n      {\n        begin: /'[a-zA-Z_][a-zA-Z0-9_]*/\n      },\n      {\n        className: 'number',\n        begin: '\\\\b(0[xb][A-Za-z0-9_]+|[0-9_]+(\\\\.[0-9_]+)?([uif](8|16|32|64)?)?)',\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'fn', end: '(\\\\(|<)', excludeEnd: true,\n        contains: [hljs.UNDERSCORE_TITLE_MODE]\n      },\n      {\n        className: 'preprocessor',\n        begin: '#\\\\[', end: '\\\\]'\n      },\n      {\n        beginKeywords: 'type', end: '(=|<)',\n        contains: [hljs.UNDERSCORE_TITLE_MODE],\n        illegal: '\\\\S'\n      },\n      {\n        beginKeywords: 'trait enum', end: '({|<)',\n        contains: [hljs.UNDERSCORE_TITLE_MODE],\n        illegal: '\\\\S'\n      },\n      {\n        begin: hljs.IDENT_RE + '::'\n      },\n      {\n        begin: '->'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/scala.js",
    "content": "/*\nLanguage: Scala\nAuthor: Jan Berkel <jan.berkel@gmail.com>\n*/\n\nfunction(hljs) {\n  var ANNOTATION = {\n    className: 'annotation', begin: '@[A-Za-z]+'\n  };\n  var STRING = {\n    className: 'string',\n    begin: 'u?r?\"\"\"', end: '\"\"\"',\n    relevance: 10\n  };\n  var SYMBOL = {\n    className: 'symbol',\n    begin: '\\'\\\\w[\\\\w\\\\d_]*(?!\\')'\n  };\n  return {\n    keywords:\n      'type yield lazy override def with val var false true sealed abstract private trait ' +\n      'object null if for while throw finally protected extends import final return else ' +\n      'break new catch super class case package default try this match continue throws',\n    contains: [\n      {\n        className: 'javadoc',\n        begin: '/\\\\*\\\\*', end: '\\\\*/',\n        contains: [{\n          className: 'javadoctag',\n          begin: '@[A-Za-z]+'\n        }],\n        relevance: 10\n      },\n      hljs.C_LINE_COMMENT_MODE, hljs.C_BLOCK_COMMENT_MODE,\n      STRING, hljs.QUOTE_STRING_MODE,\n      SYMBOL,\n      {\n        className: 'class',\n        begin: '((case )?class |object |trait )', // beginKeywords won't work because a single \"case\" shouldn't start this mode\n        end: '({|$)', excludeEnd: true,\n        illegal: ':',\n        keywords: 'case class trait object',\n        contains: [\n          {\n            beginKeywords: 'extends with',\n            relevance: 10\n          },\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)',\n            contains: [\n              hljs.QUOTE_STRING_MODE, STRING,\n              ANNOTATION\n            ]\n          }\n        ]\n      },\n      hljs.C_NUMBER_MODE,\n      ANNOTATION\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/scilab.js",
    "content": "/*\nLanguage: Scilab\nAuthor: Sylvestre Ledru <sylvestre.ledru@scilab-enterprises.com>\nOrigin: matlab.js\nDescription: Scilab is a port from Matlab\n*/\n\nfunction(hljs) {\n\n  var COMMON_CONTAINS = [\n    hljs.C_NUMBER_MODE,\n    {\n      className: 'string',\n      begin: '\\'|\\\"', end: '\\'|\\\"',\n      contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n    }\n  ];\n\n  return {\n    aliases: ['sci'],\n    keywords: {\n      keyword: 'abort break case clear catch continue do elseif else endfunction end for function'+\n        'global if pause return resume select try then while'+\n        '%f %F %t %T %pi %eps %inf %nan %e %i %z %s',\n      built_in: // Scilab has more than 2000 functions. Just list the most commons\n       'abs and acos asin atan ceil cd chdir clearglobal cosh cos cumprod deff disp error'+\n       'exec execstr exists exp eye gettext floor fprintf fread fsolve imag isdef isempty'+\n       'isinfisnan isvector lasterror length load linspace list listfiles log10 log2 log'+\n       'max min msprintf mclose mopen ones or pathconvert poly printf prod pwd rand real'+\n       'round sinh sin size gsort sprintf sqrt strcat strcmps tring sum system tanh tan'+\n       'type typename warning zeros matrix'\n    },\n    illegal: '(\"|#|/\\\\*|\\\\s+/\\\\w+)',\n    contains: [\n      {\n        className: 'function',\n        beginKeywords: 'function endfunction', end: '$',\n        keywords: 'function endfunction|10',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)'\n          }\n        ]\n      },\n      {\n        className: 'transposed_variable',\n        begin: '[a-zA-Z_][a-zA-Z_0-9]*(\\'+[\\\\.\\']*|[\\\\.\\']+)', end: '',\n        relevance: 0\n      },\n      {\n        className: 'matrix',\n        begin: '\\\\[', end: '\\\\]\\'*[\\\\.\\']*',\n        relevance: 0,\n        contains: COMMON_CONTAINS\n      },\n      {\n        className: 'comment',\n        begin: '//', end: '$'\n      }\n    ].concat(COMMON_CONTAINS)\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/scss.js",
    "content": "/*\nLanguage: SCSS\nAuthor: Kurt Emch <kurt@kurtemch.com>\n*/\nfunction(hljs) {\n  var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';\n  var VARIABLE = {\n    className: 'variable',\n    begin: '(\\\\$' + IDENT_RE + ')\\\\b'\n  };\n  var FUNCTION = {\n    className: 'function',\n    begin: IDENT_RE + '\\\\(', \n    returnBegin: true,\n    excludeEnd: true,\n    end: '\\\\('\n  };\n  var HEXCOLOR = {\n    className: 'hexcolor', begin: '#[0-9A-Fa-f]+'\n  };\n  var DEF_INTERNALS = {\n    className: 'attribute',\n    begin: '[A-Z\\\\_\\\\.\\\\-]+', end: ':',\n    excludeEnd: true,\n    illegal: '[^\\\\s]',\n    starts: {\n      className: 'value',\n      endsWithParent: true, excludeEnd: true,\n      contains: [\n        FUNCTION,\n        HEXCOLOR,\n        hljs.CSS_NUMBER_MODE,\n        hljs.QUOTE_STRING_MODE,\n        hljs.APOS_STRING_MODE,\n        hljs.C_BLOCK_COMMENT_MODE,\n        {\n          className: 'important', begin: '!important'\n        }\n      ]\n    }\n  };\n  return {\n    case_insensitive: true,\n    illegal: '[=/|\\']',\n    contains: [\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      FUNCTION,\n      {\n        className: 'id', begin: '\\\\#[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'class', begin: '\\\\.[A-Za-z0-9_-]+',\n        relevance: 0\n      },\n      {\n        className: 'attr_selector',\n        begin: '\\\\[', end: '\\\\]',\n        illegal: '$'\n      },\n      {\n        className: 'tag', // begin: IDENT_RE, end: '[,|\\\\s]'\n        begin: '\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b',\n        relevance: 0\n      },\n      {\n        className: 'pseudo',\n        begin: ':(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)'\n      },\n      {\n        className: 'pseudo',\n        begin: '::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)'\n      },\n      VARIABLE,\n      {\n        className: 'attribute',\n        begin: '\\\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b',\n        illegal: '[^\\\\s]'\n      },\n      {\n        className: 'value',\n        begin: '\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b'\n      },\n      {\n        className: 'value',\n        begin: ':', end: ';',\n        contains: [\n          FUNCTION,\n          VARIABLE,\n          HEXCOLOR,\n          hljs.CSS_NUMBER_MODE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          {\n            className: 'important', begin: '!important'\n          }\n        ]\n      },\n      {\n        className: 'at_rule',\n        begin: '@', end: '[{;]',\n        keywords: 'mixin include extend for if else each while charset import debug media page content font-face namespace warn',\n        contains: [\n          FUNCTION,\n          VARIABLE,\n          hljs.QUOTE_STRING_MODE,\n          hljs.APOS_STRING_MODE,\n          HEXCOLOR,\n          hljs.CSS_NUMBER_MODE,\n          {\n            className: 'preprocessor',\n            begin: '\\\\s[A-Za-z0-9_.-]+',\n            relevance: 0\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/smalltalk.js",
    "content": "/*\nLanguage: Smalltalk\nAuthor: Vladimir Gubarkov <xonixx@gmail.com>\n*/\n\nfunction(hljs) {\n  var VAR_IDENT_RE = '[a-z][a-zA-Z0-9_]*';\n  var CHAR = {\n    className: 'char',\n    begin: '\\\\$.{1}'\n  };\n  var SYMBOL = {\n    className: 'symbol',\n    begin: '#' + hljs.UNDERSCORE_IDENT_RE\n  };\n  return {\n    aliases: ['st'],\n    keywords: 'self super nil true false thisContext', // only 6\n    contains: [\n      {\n        className: 'comment',\n        begin: '\"', end: '\"'\n      },\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'class',\n        begin: '\\\\b[A-Z][A-Za-z0-9_]*',\n        relevance: 0\n      },\n      {\n        className: 'method',\n        begin: VAR_IDENT_RE + ':',\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE,\n      SYMBOL,\n      CHAR,\n      {\n        className: 'localvars',\n        // This looks more complicated than needed to avoid combinatorial\n        // explosion under V8. It effectively means `| var1 var2 ... |` with\n        // whitespace adjacent to `|` being optional.\n        begin: '\\\\|[ ]*' + VAR_IDENT_RE + '([ ]+' + VAR_IDENT_RE + ')*[ ]*\\\\|',\n        returnBegin: true, end: /\\|/,\n        illegal: /\\S/,\n        contains: [{begin: '(\\\\|[ ]*)?' + VAR_IDENT_RE}]\n      },\n      {\n        className: 'array',\n        begin: '\\\\#\\\\(', end: '\\\\)',\n        contains: [\n          hljs.APOS_STRING_MODE,\n          CHAR,\n          hljs.C_NUMBER_MODE,\n          SYMBOL\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/sql.js",
    "content": "/*\n Language: SQL\n Contributors: Nikolay Lisienko <info@neor.ru>, Heiko August <post@auge8472.de>, Travis Odom <travis.a.odom@gmail.com>\n */\n\nfunction(hljs) {\n  var COMMENT_MODE = {\n    className: 'comment',\n    begin: '--', end: '$'\n  };\n  return {\n    case_insensitive: true,\n    illegal: /[<>]/,\n    contains: [\n      {\n        className: 'operator',\n        beginKeywords:\n          'begin end start commit rollback savepoint lock alter create drop rename call '+\n          'delete do handler insert load replace select truncate update set show pragma grant '+\n          'merge describe use explain help declare prepare execute deallocate savepoint release '+\n          'unlock purge reset change stop analyze cache flush optimize repair kill '+\n          'install uninstall checksum restore check backup',\n        end: /;/, endsWithParent: true,\n        keywords: {\n          keyword:\n            'abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter ' +\n            'analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup ' +\n            'before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by ' +\n            'cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length ' +\n            'character_length charindex charset check checksum checksum_agg choose close coalesce ' +\n            'coercibility collate collation collationproperty column columns columns_updated commit compress concat ' +\n            'concat_ws concurrent connect connection connection_id consistent constraint constraints continue ' +\n            'contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist ' +\n            'curdate current current_date current_time current_timestamp current_user cursor curtime data database ' +\n            'databases datalength date_add date_format date_sub dateadd datediff datefromparts datename ' +\n            'datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear ' +\n            'deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt ' +\n            'des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct ' +\n            'distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec ' +\n            'engine engines eomonth errors escape escaped event eventdata events except exception exec execute ' +\n            'exists exp explain export_set extended external extract fast fetch field fields find_in_set ' +\n            'first first_value floor flush for force foreign format found found_rows from from_base64 ' +\n            'from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant ' +\n            'grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help ' +\n            'hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore ' +\n            'iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner ' +\n            'innodb input insert install instr intersect into is is_free_lock is_ipv4 ' +\n            'is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill ' +\n            'language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level ' +\n            'like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile ' +\n            'logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max ' +\n            'md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names ' +\n            'national natural nchar next no no_write_to_binlog not now nullif nvarchar oct ' +\n            'octet_length of old_password on only open optimize option optionally or ord order outer outfile output ' +\n            'pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add ' +\n            'period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges ' +\n            'procedure procedure_analyze processlist profile profiles public publishingservername purge quarter ' +\n            'query quick quote quotename radians rand read references regexp relative relaylog release ' +\n            'release_lock rename repair repeat replace replicate reset restore restrict return returns reverse ' +\n            'revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll ' +\n            'sec_to_time second section select serializable server session session_user set sha sha1 sha2 share ' +\n            'show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex ' +\n            'sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache ' +\n            'sql_small_result sql_variant_property sqlstate sqrt square start starting status std ' +\n            'stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff ' +\n            'subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset ' +\n            'system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time ' +\n            'time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour ' +\n            'timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation ' +\n            'trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress ' +\n            'uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade ' +\n            'upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short ' +\n            'validate_password_strength value values var var_pop var_samp variables variance varp ' +\n            'version view warnings week weekday weekofyear weight_string when whenever where with work write xml ' +\n            'xor year yearweek zon',\n          literal:\n            'true false null',\n          built_in:\n            'array bigint binary bit blob boolean char character date dec decimal float int integer interval number ' +\n            'numeric real serial smallint varchar varying int8 serial8 text'\n        },\n        contains: [\n          {\n            className: 'string',\n            begin: '\\'', end: '\\'',\n            contains: [hljs.BACKSLASH_ESCAPE, {begin: '\\'\\''}]\n          },\n          {\n            className: 'string',\n            begin: '\"', end: '\"',\n            contains: [hljs.BACKSLASH_ESCAPE, {begin: '\"\"'}]\n          },\n          {\n            className: 'string',\n            begin: '`', end: '`',\n            contains: [hljs.BACKSLASH_ESCAPE]\n          },\n          hljs.C_NUMBER_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          COMMENT_MODE\n        ]\n      },\n      hljs.C_BLOCK_COMMENT_MODE,\n      COMMENT_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/swift.js",
    "content": "/*\nLanguage: Swift\nAuthor: Chris Eidhof <chris@eidhof.nl>\n*/\n\n\nfunction(hljs) {\n  var SWIFT_KEYWORDS = {\n      keyword: 'class deinit enum extension func import init let protocol static ' +\n        'struct subscript typealias var break case continue default do ' +\n        'else fallthrough if in for return switch where while as dynamicType ' +\n        'is new super self Self Type __COLUMN__ __FILE__ __FUNCTION__ ' +\n        '__LINE__ associativity didSet get infix inout left mutating none ' +\n        'nonmutating operator override postfix precedence prefix right set '+\n        'unowned unowned safe unsafe weak willSet',\n      literal: 'true false nil',\n      built_in: 'abs advance alignof alignofValue assert bridgeFromObjectiveC ' +\n        'bridgeFromObjectiveCUnconditional bridgeToObjectiveC ' +\n        'bridgeToObjectiveCUnconditional c contains count countElements ' +\n        'countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump ' +\n        'encodeBitsAsWords enumerate equal false filter find getBridgedObjectiveCType ' +\n        'getVaList indices insertionSort isBridgedToObjectiveC ' +\n        'isBridgedVerbatimToObjectiveC isUniquelyReferenced join ' +\n        'lexicographicalCompare map max maxElement min minElement nil numericCast ' +\n        'partition posix print println quickSort reduce reflect reinterpretCast ' +\n        'reverse roundUpToAlignment sizeof sizeofValue sort split startsWith strideof ' +\n        'strideofValue swap swift toString transcode true underestimateCount ' +\n        'unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer ' +\n        'withUnsafePointerToObject withUnsafePointers withVaList'\n    };\n\n  var TYPE = {\n    className: 'type',\n    begin: '\\\\b[A-Z][\\\\w\\']*',\n    relevance: 0\n  };\n  var BLOCK_COMMENT = {\n    className: 'comment',\n    begin: '/\\\\*', end: '\\\\*/',\n    contains: [hljs.PHRASAL_WORDS_MODE, 'self']\n  };\n  var SUBST = {\n    className: 'subst',\n    begin: /\\\\\\(/, end: '\\\\)',\n    keywords: SWIFT_KEYWORDS,\n    contains: [] // assigned later\n  };\n  var NUMBERS = {\n      className: 'number',\n      begin: '\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b',\n      relevance: 0\n  };\n  var QUOTE_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, {\n    contains: [SUBST, hljs.BACKSLASH_ESCAPE]\n  });\n  SUBST.contains = [NUMBERS];\n\n  return {\n    keywords: SWIFT_KEYWORDS,\n    contains: [\n      QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      BLOCK_COMMENT,\n      TYPE,\n      NUMBERS,\n      {\n        className: 'func',\n        beginKeywords: 'func', excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            begin: /[A-Za-z$_][0-9A-Za-z$_]*/,\n            illegal: /\\(/\n          }),\n          {\n            className: 'generics',\n            begin: /\\</, end: /\\>/,\n            illegal: /\\>/\n          },\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"']/\n          }\n        ],\n        illegal: /\\[|%/\n      },\n      {\n        className: 'class',\n        keywords: 'struct protocol class extension enum',\n        begin: '(struct|protocol|class(?! (func|var))|extension|enum)', \n        end: '\\\\{',\n        excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/})\n        ]\n      },\n      {\n        className: 'preprocessor', // @attributes\n        begin: '(@assignment|@class_protocol|@exported|@final|@lazy|@noreturn|' +\n                  '@NSCopying|@NSManaged|@objc|@optional|@required|@auto_closure|' +\n                  '@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|' +\n                  '@infix|@prefix|@postfix)'\n      },\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/tex.js",
    "content": "/*\nLanguage: TeX\nAuthor: Vladimir Moskva <vladmos@gmail.com>\nWebsite: http://fulc.ru/\n*/\n\nfunction(hljs) {\n  var COMMAND1 = {\n    className: 'command',\n    begin: '\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]?'\n  };\n  var COMMAND2 = {\n    className: 'command',\n    begin: '\\\\\\\\[^a-zA-Zа-яА-я0-9]'\n  };\n  var SPECIAL = {\n    className: 'special',\n    begin: '[{}\\\\[\\\\]\\\\&#~]',\n    relevance: 0\n  };\n\n  return {\n    contains: [\n      { // parameter\n        begin: '\\\\\\\\[a-zA-Zа-яА-я]+[\\\\*]? *= *-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?',\n        returnBegin: true,\n        contains: [\n          COMMAND1, COMMAND2,\n          {\n            className: 'number',\n            begin: ' *=', end: '-?\\\\d*\\\\.?\\\\d+(pt|pc|mm|cm|in|dd|cc|ex|em)?',\n            excludeBegin: true\n          }\n        ],\n        relevance: 10\n      },\n      COMMAND1, COMMAND2,\n      SPECIAL,\n      {\n        className: 'formula',\n        begin: '\\\\$\\\\$', end: '\\\\$\\\\$',\n        contains: [COMMAND1, COMMAND2, SPECIAL],\n        relevance: 0\n      },\n      {\n        className: 'formula',\n        begin: '\\\\$', end: '\\\\$',\n        contains: [COMMAND1, COMMAND2, SPECIAL],\n        relevance: 0\n      },\n      {\n        className: 'comment',\n        begin: '%', end: '$',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/thrift.js",
    "content": "/*\nLanguage: Thrift\nAuthor: Oleg Efimov <efimovov@gmail.com>\nDescription: Thrift message definition format\n*/\n\nfunction(hljs) {\n  var BUILT_IN_TYPES = 'bool byte i16 i32 i64 double string binary';\n  return {\n    keywords: {\n      keyword:\n        'namespace const typedef struct enum service exception void oneway set list map required optional',\n      built_in:\n        BUILT_IN_TYPES,\n      literal:\n        'true false'\n    },\n    contains: [\n      hljs.QUOTE_STRING_MODE,\n      hljs.NUMBER_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'class',\n        beginKeywords: 'struct enum service exception', end: /\\{/,\n        illegal: /\\n/,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {\n            starts: {endsWithParent: true, excludeEnd: true} // hack: eating everything after the first title\n          })\n        ]\n      },\n      {\n        className: 'stl_container',\n        begin: '\\\\b(set|list|map)\\\\s*<', end: '>',\n        keywords: BUILT_IN_TYPES,\n        contains: ['self']\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/typescript.js",
    "content": "/*\nLanguage: TypeScript\nAuthor: Panu Horsmalahti <panu.horsmalahti@iki.fi>\nDescription: TypeScript is a strict superset of JavaScript\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['ts'],\n    keywords: {\n      keyword:\n        'in if for while finally var new function|0 do return void else break catch ' +\n        'instanceof with throw case default try this switch continue typeof delete ' +\n        'let yield const class public private get set super interface extends' +\n        'static constructor implements enum export import declare',\n      literal:\n        'true false null undefined NaN Infinity',\n      built_in:\n        'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +\n        'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +\n        'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +\n        'TypeError URIError Number Math Date String RegExp Array Float32Array ' +\n        'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +\n        'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +\n        'module console window document any number boolean string void',\n    },\n    contains: [\n      {\n        className: 'pi',\n        begin: /^\\s*('|\")use strict('|\")/,\n        relevance: 0\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      hljs.C_NUMBER_MODE,\n      { // \"value\" container\n        begin: '(' + hljs.RE_STARTERS_RE + '|\\\\b(case|return|throw)\\\\b)\\\\s*',\n        keywords: 'return throw case',\n        contains: [\n          hljs.C_LINE_COMMENT_MODE,\n          hljs.C_BLOCK_COMMENT_MODE,\n          hljs.REGEXP_MODE,\n          { // E4X\n            begin: /</, end: />;/,\n            relevance: 0,\n            subLanguage: 'xml'\n          }\n        ],\n        relevance: 0\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function', end: /\\{/, excludeEnd: true,\n        contains: [\n          hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/}),\n          {\n            className: 'params',\n            begin: /\\(/, end: /\\)/,\n            contains: [\n              hljs.C_LINE_COMMENT_MODE,\n              hljs.C_BLOCK_COMMENT_MODE\n            ],\n            illegal: /[\"'\\(]/\n          }\n        ],\n        illegal: /\\[|%/,\n        relevance: 0 // () => {} is more typical in TypeScript\n      },\n      {\n        className: 'constructor',\n        beginKeywords: 'constructor', end: /\\{/, excludeEnd: true,\n        relevance: 10\n      },\n      {\n        className: 'module',\n        beginKeywords: 'module', end: /\\{/, excludeEnd: true,\n      },\n      {\n        className: 'interface',\n        beginKeywords: 'interface', end: /\\{/, excludeEnd: true,\n      },\n      {\n        begin: /\\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`\n      },\n      {\n        begin: '\\\\.' + hljs.IDENT_RE, relevance: 0 // hack: prevents detection of keywords after dots\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/vala.js",
    "content": "/*\nLanguage: Vala\nAuthor: Antono Vasiljev <antono.vasiljev@gmail.com>\nDescription: Vala is a new programming language that aims to bring modern programming language features to GNOME developers without imposing any additional runtime requirements and without using a different ABI compared to applications and libraries written in C.\n*/\n\nfunction(hljs) {\n  return {\n    keywords: {\n      keyword:\n        // Value types\n        'char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 ' +\n        'uint16 uint32 uint64 float double bool struct enum string void ' +\n        // Reference types\n        'weak unowned owned ' +\n        // Modifiers\n        'async signal static abstract interface override ' +\n        // Control Structures\n        'while do for foreach else switch case break default return try catch ' +\n        // Visibility\n        'public private protected internal ' +\n        // Other\n        'using new this get set const stdout stdin stderr var',\n      built_in:\n        'DBus GLib CCode Gee Object',\n      literal:\n        'false true null'\n    },\n    contains: [\n      {\n        className: 'class',\n        beginKeywords: 'class interface delegate namespace', end: '{', excludeEnd: true,\n        illegal: '[^,:\\\\n\\\\s\\\\.]',\n        contains: [\n          hljs.UNDERSCORE_TITLE_MODE\n        ]\n      },\n      hljs.C_LINE_COMMENT_MODE,\n      hljs.C_BLOCK_COMMENT_MODE,\n      {\n        className: 'string',\n        begin: '\"\"\"', end: '\"\"\"',\n        relevance: 5\n      },\n      hljs.APOS_STRING_MODE,\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '^#', end: '$',\n        relevance: 2\n      },\n      {\n        className: 'constant',\n        begin: ' [A-Z_]+ ',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/vbnet.js",
    "content": "/*\nLanguage: VB.NET\nAuthor: Poren Chiang <ren.chiang@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['vb'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'addhandler addressof alias and andalso aggregate ansi as assembly auto binary by byref byval ' + /* a-b */\n        'call case catch class compare const continue custom declare default delegate dim distinct do ' + /* c-d */\n        'each equals else elseif end enum erase error event exit explicit finally for friend from function ' + /* e-f */\n        'get global goto group handles if implements imports in inherits interface into is isfalse isnot istrue ' + /* g-i */\n        'join key let lib like loop me mid mod module mustinherit mustoverride mybase myclass ' + /* j-m */\n        'namespace narrowing new next not notinheritable notoverridable ' + /* n */\n        'of off on operator option optional or order orelse overloads overridable overrides ' + /* o */\n        'paramarray partial preserve private property protected public ' + /* p */\n        'raiseevent readonly redim rem removehandler resume return ' + /* r */\n        'select set shadows shared skip static step stop structure strict sub synclock ' + /* s */\n        'take text then throw to try unicode until using when where while widening with withevents writeonly xor', /* t-x */\n      built_in:\n        'boolean byte cbool cbyte cchar cdate cdec cdbl char cint clng cobj csbyte cshort csng cstr ctype ' +  /* b-c */\n        'date decimal directcast double gettype getxmlnamespace iif integer long object ' + /* d-o */\n        'sbyte short single string trycast typeof uinteger ulong ushort', /* s-u */\n      literal:\n        'true false nothing'\n    },\n    illegal: '//|{|}|endif|gosub|variant|wend', /* reserved deprecated keywords */\n    contains: [\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [{begin: '\"\"'}]}),\n      {\n        className: 'comment',\n        begin: '\\'', end: '$', returnBegin: true,\n        contains: [\n          {\n            className: 'xmlDocTag',\n            begin: '\\'\\'\\'|<!--|-->'\n          },\n          {\n            className: 'xmlDocTag',\n            begin: '</?', end: '>'\n          }\n          ]\n      },\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'preprocessor',\n        begin: '#', end: '$',\n        keywords: 'if else elseif end region externalsource'\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/vbscript.js",
    "content": "/*\nLanguage: VBScript\nAuthor: Nikita Ledyaev <lenikita@yandex.ru>\nContributors: Michal Gabrukiewicz <mgabru@gmail.com>\n*/\n\nfunction(hljs) {\n  return {\n    aliases: ['vbs'],\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'call class const dim do loop erase execute executeglobal exit for each next function ' +\n        'if then else on error option explicit new private property let get public randomize ' +\n        'redim rem select case set stop sub while wend with end to elseif is or xor and not ' +\n        'class_initialize class_terminate default preserve in me byval byref step resume goto',\n      built_in:\n        'lcase month vartype instrrev ubound setlocale getobject rgb getref string ' +\n        'weekdayname rnd dateadd monthname now day minute isarray cbool round formatcurrency ' +\n        'conversions csng timevalue second year space abs clng timeserial fixs len asc ' +\n        'isempty maths dateserial atn timer isobject filter weekday datevalue ccur isdate ' +\n        'instr datediff formatdatetime replace isnull right sgn array snumeric log cdbl hex ' +\n        'chr lbound msgbox ucase getlocale cos cdate cbyte rtrim join hour oct typename trim ' +\n        'strcomp int createobject loadpicture tan formatnumber mid scriptenginebuildversion ' +\n        'scriptengine split scriptengineminorversion cint sin datepart ltrim sqr ' +\n        'scriptenginemajorversion time derived eval date formatpercent exp inputbox left ascw ' +\n        'chrw regexp server response request cstr err',\n      literal:\n        'true false null nothing empty'\n    },\n    illegal: '//',\n    contains: [\n      hljs.inherit(hljs.QUOTE_STRING_MODE, {contains: [{begin: '\"\"'}]}),\n      {\n        className: 'comment',\n        begin: /'/, end: /$/,\n        relevance: 0\n      },\n      hljs.C_NUMBER_MODE\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/vhdl.js",
    "content": "/*\nLanguage: VHDL\nAuthor: Igor Kalnitsky <igor@kalnitsky.org>\nContributors: Daniel C.K. Kho <daniel.kho@gmail.com>\nDescription: VHDL is a hardware description language used in electronic design automation to describe digital and mixed-signal systems.\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    keywords: {\n      keyword:\n        'abs access after alias all and architecture array assert attribute begin block ' +\n        'body buffer bus case component configuration constant context cover disconnect ' +\n        'downto default else elsif end entity exit fairness file for force function generate ' +\n        'generic group guarded if impure in inertial inout is label library linkage literal ' +\n        'loop map mod nand new next nor not null of on open or others out package port ' +\n        'postponed procedure process property protected pure range record register reject ' +\n        'release rem report restrict restrict_guarantee return rol ror select sequence ' +\n        'severity shared signal sla sll sra srl strong subtype then to transport type ' +\n        'unaffected units until use variable vmode vprop vunit wait when while with xnor xor',\n      typename:\n        'boolean bit character severity_level integer time delay_length natural positive ' +\n        'string bit_vector file_open_kind file_open_status std_ulogic std_ulogic_vector ' +\n        'std_logic std_logic_vector unsigned signed boolean_vector integer_vector ' +\n        'real_vector time_vector'\n    },\n    illegal: '{',\n    contains: [\n      hljs.C_BLOCK_COMMENT_MODE,        // VHDL-2008 block commenting.\n      {\n        className: 'comment',\n        begin: '--', end: '$'\n      },\n      hljs.QUOTE_STRING_MODE,\n      hljs.C_NUMBER_MODE,\n      {\n        className: 'literal',\n        begin: '\\'(U|X|0|1|Z|W|L|H|-)\\'',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      },\n      {\n        className: 'attribute',\n        begin: '\\'[A-Za-z](_?[A-Za-z0-9])*',\n        contains: [hljs.BACKSLASH_ESCAPE]\n      }\n    ]\n  }; // return\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/vim.js",
    "content": "/*\nLanguage: Vim Script\nAuthor: Jun Yang <yangjvn@126.com>\nDescription: full keyword and built-in from http://vimdoc.sourceforge.net/htmldoc/\n*/\n\nfunction(hljs) {\n  return {\n    lexemes: /[!#@\\w]+/,\n    keywords: {\n      keyword: //ex command\n        // express version except: ! & * < = > !! # @ @@\n        'N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope '+\n        'cp cpf cq cr cs cst cu cuna cunme cw d|0 delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu g|0 go gr grepa gu gv ha h|0 helpf helpg helpt hi hid his i|0 ia iabc if ij il im imapc '+\n        'ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs n|0 new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 '+\n        'profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf q|0 quita qa r|0 rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv s|0 sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor '+\n        'so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync t|0 tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew '+\n        'tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up v|0 ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ '+\n        // full version\n        'Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload '+\n        'bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap '+\n        'cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor '+\n        'endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap '+\n        'imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview '+\n        'lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap '+\n        'nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext '+\n        'ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding '+\n        'scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace '+\n        'startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious '+'trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew '+\n        'vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank',\n      built_in: //built in func\n        'abs acos add and append argc argidx argv asin atan atan2 browse browsedir bufexists buflisted bufloaded bufname bufnr bufwinnr byte2line byteidx call ceil changenr char2nr cindent clearmatches col complete complete_add complete_check confirm copy cos cosh count cscope_connection cursor '+\n        'deepcopy delete did_filetype diff_filler diff_hlID empty escape eval eventhandler executable exists exp expand extend feedkeys filereadable filewritable filter finddir findfile float2nr floor fmod fnameescape fnamemodify foldclosed foldclosedend foldlevel foldtext foldtextresult foreground function '+\n        'garbagecollect get getbufline getbufvar getchar getcharmod getcmdline getcmdpos getcmdtype getcwd getfontname getfperm getfsize getftime getftype getline getloclist getmatches getpid getpos getqflist getreg getregtype gettabvar gettabwinvar getwinposx getwinposy getwinvar glob globpath has has_key '+\n        'haslocaldir hasmapto histadd histdel histget histnr hlexists hlID hostname iconv indent index input inputdialog inputlist inputrestore inputsave inputsecret insert invert isdirectory islocked items join keys len libcall libcallnr line line2byte lispindent localtime log log10 luaeval map maparg mapcheck '+\n        'match matchadd matcharg matchdelete matchend matchlist matchstr max min mkdir mode mzeval nextnonblank nr2char or pathshorten pow prevnonblank printf pumvisible py3eval pyeval range readfile reltime reltimestr remote_expr remote_foreground remote_peek remote_read remote_send remove rename repeat '+\n        'resolve reverse round screenattr screenchar screencol screenrow search searchdecl searchpair searchpairpos searchpos server2client serverlist setbufvar setcmdpos setline setloclist setmatches setpos setqflist setreg settabvar settabwinvar setwinvar sha256 shellescape shiftwidth simplify sin '+\n        'sinh sort soundfold spellbadword spellsuggest split sqrt str2float str2nr strchars strdisplaywidth strftime stridx string strlen strpart strridx strtrans strwidth submatch substitute synconcealed synID synIDattr '+\n        'synIDtrans synstack system tabpagebuflist tabpagenr tabpagewinnr tagfiles taglist tan tanh tempname tolower toupper tr trunc type undofile undotree values virtcol visualmode wildmenumode winbufnr wincol winheight winline winnr winrestcmd winrestview winsaveview winwidth writefile xor'\n    },\n    illegal: /[{:]/,\n    contains: [\n      hljs.NUMBER_MODE,\n      hljs.APOS_STRING_MODE,\n      {\n        className: 'string',\n        // quote with escape, comment as quote\n        begin: /\"((\\\\\")|[^\"\\n])*(\"|\\n)/\n      },\n      {\n        className: 'variable',\n        begin: /[bwtglsav]:[\\w\\d_]*/\n      },\n      {\n        className: 'function',\n        beginKeywords: 'function function!', end: '$',\n        relevance: 0,\n        contains: [\n          hljs.TITLE_MODE,\n          {\n            className: 'params',\n            begin: '\\\\(', end: '\\\\)'\n          }\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/x86asm.js",
    "content": "/*\nLanguage: Intel x86 Assembly\nAuthor: innocenat <innocenat@gmail.com>\nDescription: x86 assembly language using Intel's mnemonic and NASM syntax\n*/\n\nfunction(hljs) {\n  return {\n    case_insensitive: true,\n    lexemes: '\\\\.?' + hljs.IDENT_RE,\n    keywords: {\n      keyword:\n        'lock rep repe repz repne repnz xaquire xrelease bnd nobnd ' +\n        'aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63',\n      literal:\n        // Instruction pointer\n        'ip eip rip ' +\n        // 8-bit registers\n        'al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ' +\n        // 16-bit registers\n        'ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w ' +\n        // 32-bit registers\n        'eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d ' +\n        // 64-bit registers\n        'rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 ' +\n        // Segment registers\n        'cs ds es fs gs ss ' +\n        // Floating point stack registers\n        'st st0 st1 st2 st3 st4 st5 st6 st7 ' +\n        // MMX Registers\n        'mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 ' +\n        // SSE registers\n        'xmm0  xmm1  xmm2  xmm3  xmm4  xmm5  xmm6  xmm7  xmm8  xmm9 xmm10  xmm11 xmm12 xmm13 xmm14 xmm15 ' +\n        'xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ' +\n        // AVX registers\n        'ymm0  ymm1  ymm2  ymm3  ymm4  ymm5  ymm6  ymm7  ymm8  ymm9 ymm10  ymm11 ymm12 ymm13 ymm14 ymm15 ' +\n        'ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 ' +\n        // AVX-512F registers\n        'zmm0  zmm1  zmm2  zmm3  zmm4  zmm5  zmm6  zmm7  zmm8  zmm9 zmm10  zmm11 zmm12 zmm13 zmm14 zmm15 ' +\n        'zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 ' +\n        // AVX-512F mask registers\n        'k0 k1 k2 k3 k4 k5 k6 k7 ' +\n        // Bound (MPX) register\n        'bnd0 bnd1 bnd2 bnd3 ' +\n        // Special register\n        'cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 ' +\n        // NASM altreg package\n        'r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b ' +\n        'r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d ' +\n        'r0h r1h r2h r3h ' +\n        'r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l',\n\n      pseudo:\n        'db dw dd dq dt ddq do dy dz ' +\n        'resb resw resd resq rest resdq reso resy resz ' +\n        'incbin equ times',\n\n      preprocessor:\n        '%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif ' +\n        '%ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep ' +\n        '%endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment ' +\n        '.nolist ' +\n        'byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr ' +\n        '__FILE__ __LINE__ __SECT__  __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ ' +\n        '__UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__  __PASS__ struc endstruc istruc at iend ' +\n        'align alignb sectalign daz nodaz up down zero default option assume public ',\n\n      built_in:\n        'bits use16 use32 use64 default section segment absolute extern global common cpu float ' +\n        '__utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ ' +\n        '__float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ ' +\n        '__Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e ' +\n        'float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__'\n    },\n    contains: [\n      {\n        className: 'comment',\n        begin: ';',\n        end: '$',\n        relevance: 0\n      },\n      // Float number and x87 BCD\n      {\n        className: 'number',\n        begin: '\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b',\n        relevance: 0\n      },\n      // Hex number in $\n      {\n        className: 'number',\n        begin: '\\\\$[0-9][0-9A-Fa-f]*',\n        relevance: 0\n      },\n      // Number in H,X,D,T,Q,O,B,Y suffix\n      {\n        className: 'number',\n        begin: '\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[HhXx]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b'\n      },\n      // Number in H,X,D,T,Q,O,B,Y prefix\n      {\n        className: 'number',\n        begin: '\\\\b(?:0[HhXx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b'\n      },\n      // Double quote string\n      hljs.QUOTE_STRING_MODE,\n      // Single-quoted string\n      {\n        className: 'string',\n        begin: '\\'',\n        end: '[^\\\\\\\\]\\'',\n        relevance: 0\n      },\n      // Backquoted string\n      {\n        className: 'string',\n        begin: '`',\n        end: '[^\\\\\\\\]`',\n        relevance: 0\n      },\n      // Section name\n      {\n        className: 'string',\n        begin: '\\\\.[A-Za-z0-9]+',\n        relevance: 0\n      },\n      // Global label and local label\n      {\n        className: 'label',\n        begin: '^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)',\n        relevance: 0\n      },\n      // Macro-local label\n      {\n        className: 'label',\n        begin: '^\\\\s*%%[A-Za-z0-9_$#@~.?]*:',\n        relevance: 0\n      },\n      // Macro parameter\n      {\n        className: 'argument',\n        begin: '%[0-9]+',\n        relevance: 0\n      },\n      // Macro parameter\n      {\n        className: 'built_in',\n        begin: '%!\\S+',\n        relevance: 0\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/languages/xml.js",
    "content": "/*\nLanguage: HTML, XML\n*/\n\nfunction(hljs) {\n  var XML_IDENT_RE = '[A-Za-z0-9\\\\._:-]+';\n  var PHP = {\n    begin: /<\\?(php)?(?!\\w)/, end: /\\?>/,\n    subLanguage: 'php', subLanguageMode: 'continuous'\n  };\n  var TAG_INTERNALS = {\n    endsWithParent: true,\n    illegal: /</,\n    relevance: 0,\n    contains: [\n      PHP,\n      {\n        className: 'attribute',\n        begin: XML_IDENT_RE,\n        relevance: 0\n      },\n      {\n        begin: '=',\n        relevance: 0,\n        contains: [\n          {\n            className: 'value',\n            variants: [\n              {begin: /\"/, end: /\"/},\n              {begin: /'/, end: /'/},\n              {begin: /[^\\s\\/>]+/}\n            ]\n          }\n        ]\n      }\n    ]\n  };\n  return {\n    aliases: ['html', 'xhtml', 'rss', 'atom', 'xsl', 'plist'],\n    case_insensitive: true,\n    contains: [\n      {\n        className: 'doctype',\n        begin: '<!DOCTYPE', end: '>',\n        relevance: 10,\n        contains: [{begin: '\\\\[', end: '\\\\]'}]\n      },\n      {\n        className: 'comment',\n        begin: '<!--', end: '-->',\n        relevance: 10\n      },\n      {\n        className: 'cdata',\n        begin: '<\\\\!\\\\[CDATA\\\\[', end: '\\\\]\\\\]>',\n        relevance: 10\n      },\n      {\n        className: 'tag',\n        /*\n        The lookahead pattern (?=...) ensures that 'begin' only matches\n        '<style' as a single word, followed by a whitespace or an\n        ending braket. The '$' is needed for the lexeme to be recognized\n        by hljs.subMode() that tests lexemes outside the stream.\n        */\n        begin: '<style(?=\\\\s|>|$)', end: '>',\n        keywords: {title: 'style'},\n        contains: [TAG_INTERNALS],\n        starts: {\n          end: '</style>', returnEnd: true,\n          subLanguage: 'css'\n        }\n      },\n      {\n        className: 'tag',\n        // See the comment in the <style tag about the lookahead pattern\n        begin: '<script(?=\\\\s|>|$)', end: '>',\n        keywords: {title: 'script'},\n        contains: [TAG_INTERNALS],\n        starts: {\n          end: '</script>', returnEnd: true,\n          subLanguage: 'javascript'\n        }\n      },\n      {\n        begin: '<%', end: '%>',\n        subLanguage: 'vbscript'\n      },\n      PHP,\n      {\n        className: 'pi',\n        begin: /<\\?\\w+/, end: /\\?>/,\n        relevance: 10\n      },\n      {\n        className: 'tag',\n        begin: '</?', end: '/?>',\n        contains: [\n          {\n            className: 'title', begin: '[^ /><]+', relevance: 0\n          },\n          TAG_INTERNALS\n        ]\n      }\n    ]\n  };\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/arta.css",
    "content": "/*\nDate: 17.V.2011\nAuthor: pumbur <pumbur@pumbur.net>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n}\n\n.profile .hljs-header *,\n.ini .hljs-title,\n.nginx .hljs-title {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-javadoc,\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-title,\n.hljs-pragma,\n.hljs-shebang,\n.profile .hljs-summary,\n.diff,\n.hljs-pi,\n.hljs-doctype,\n.hljs-tag,\n.hljs-template_comment,\n.css .hljs-rules,\n.tex .hljs-special {\n  color: #444;\n}\n\n.hljs-string,\n.hljs-symbol,\n.diff .hljs-change,\n.hljs-regexp,\n.xml .hljs-attribute,\n.smalltalk .hljs-char,\n.xml .hljs-value,\n.ini .hljs-value,\n.clojure .hljs-attribute,\n.coffeescript .hljs-attribute {\n  color: #ffcc33;\n}\n\n.hljs-number,\n.hljs-addition {\n  color: #00cc66;\n}\n\n.hljs-built_in,\n.hljs-literal,\n.vhdl .hljs-typename,\n.go .hljs-constant,\n.go .hljs-typename,\n.ini .hljs-keyword,\n.lua .hljs-title,\n.perl .hljs-variable,\n.php .hljs-variable,\n.mel .hljs-variable,\n.django .hljs-variable,\n.css .funtion,\n.smalltalk .method,\n.hljs-hexcolor,\n.hljs-important,\n.hljs-flow,\n.hljs-inheritance,\n.parser3 .hljs-variable {\n  color: #32aaee;\n}\n\n.hljs-keyword,\n.hljs-tag .hljs-title,\n.css .hljs-tag,\n.css .hljs-class,\n.css .hljs-id,\n.css .hljs-pseudo,\n.css .hljs-attr_selector,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.hljs-winutils,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  color: #6644aa;\n}\n\n.hljs-title,\n.ruby .hljs-constant,\n.vala .hljs-constant,\n.hljs-parent,\n.hljs-deletion,\n.hljs-template_tag,\n.css .hljs-keyword,\n.objectivec .hljs-class .hljs-id,\n.smalltalk .hljs-class,\n.lisp .hljs-keyword,\n.apache .hljs-tag,\n.nginx .hljs-variable,\n.hljs-envvar,\n.bash .hljs-variable,\n.go .hljs-built_in,\n.vbscript .hljs-built_in,\n.lua .hljs-built_in,\n.rsl .hljs-built_in,\n.tail,\n.avrasm .hljs-label,\n.tex .hljs-formula,\n.tex .hljs-formula * {\n  color: #bb1166;\n}\n\n.hljs-yardoctag,\n.hljs-phpdoc,\n.profile .hljs-header,\n.ini .hljs-title,\n.apache .hljs-tag,\n.parser3 .hljs-title {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.6;\n}\n\n.hljs,\n.hljs-subst,\n.diff .hljs-chunk,\n.css .hljs-value,\n.css .hljs-attribute {\n  color: #aaa;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/ascetic.css",
    "content": "﻿/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-filter .hljs-argument,\n.hljs-addition,\n.hljs-change,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula {\n  color: #888;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-shebang,\n.hljs-doctype,\n.hljs-pi,\n.hljs-javadoc,\n.hljs-deletion,\n.apache .hljs-sqbracket {\n  color: #ccc;\n}\n\n.hljs-keyword,\n.hljs-tag .hljs-title,\n.ini .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-title,\n.http .hljs-title,\n.nginx .hljs-title,\n.css .hljs-tag,\n.hljs-winutils,\n.hljs-flow,\n.apache .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-dune.dark.css",
    "content": "/* Base16 Atelier Dune Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Dune Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #999580;\n}\n\n/* Atelier Dune Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d73737;\n}\n\n/* Atelier Dune Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #b65611;\n}\n\n/* Atelier Dune Dark Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #cfb017;\n}\n\n/* Atelier Dune Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #60ac39;\n}\n\n/* Atelier Dune Dark Aqua */\n.css .hljs-hexcolor {\n  color: #1fad83;\n}\n\n/* Atelier Dune Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6684e1;\n}\n\n/* Atelier Dune Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #292824;\n  color: #a6a28c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-dune.light.css",
    "content": "/* Base16 Atelier Dune Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Dune Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7d7a68;\n}\n\n/* Atelier Dune Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d73737;\n}\n\n/* Atelier Dune Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #b65611;\n}\n\n/* Atelier Dune Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #cfb017;\n}\n\n/* Atelier Dune Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #60ac39;\n}\n\n/* Atelier Dune Light Aqua */\n.css .hljs-hexcolor {\n  color: #1fad83;\n}\n\n/* Atelier Dune Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6684e1;\n}\n\n/* Atelier Dune Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b854d4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fefbec;\n  color: #6e6b5e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-forest.dark.css",
    "content": "/* Base16 Atelier Forest Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Forest Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #9c9491;\n}\n\n/* Atelier Forest Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f22c40;\n}\n\n/* Atelier Forest Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #df5320;\n}\n\n/* Atelier Forest Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #d5911a;\n}\n\n/* Atelier Forest Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #5ab738;\n}\n\n/* Atelier Forest Dark Aqua */\n.css .hljs-hexcolor {\n  color: #00ad9c;\n}\n\n/* Atelier Forest Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #407ee7;\n}\n\n/* Atelier Forest Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2c2421;\n  color: #a8a19f;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-forest.light.css",
    "content": "/* Base16 Atelier Forest Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/forest) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Forest Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #766e6b;\n}\n\n/* Atelier Forest Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f22c40;\n}\n\n/* Atelier Forest Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #df5320;\n}\n\n/* Atelier Forest Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #d5911a;\n}\n\n/* Atelier Forest Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #5ab738;\n}\n\n/* Atelier Forest Light Aqua */\n.css .hljs-hexcolor {\n  color: #00ad9c;\n}\n\n/* Atelier Forest Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #407ee7;\n}\n\n/* Atelier Forest Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #6666ea;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f1efee;\n  color: #68615e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-heath.dark.css",
    "content": "/* Base16 Atelier Heath Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Heath Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #9e8f9e;\n}\n\n/* Atelier Heath Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ca402b;\n}\n\n/* Atelier Heath Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #a65926;\n}\n\n/* Atelier Heath Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #bb8a35;\n}\n\n/* Atelier Heath Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #379a37;\n}\n\n/* Atelier Heath Dark Aqua */\n.css .hljs-hexcolor {\n  color: #159393;\n}\n\n/* Atelier Heath Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #516aec;\n}\n\n/* Atelier Heath Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #292329;\n  color: #ab9bab;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-heath.light.css",
    "content": "/* Base16 Atelier Heath Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/heath) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Heath Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #776977;\n}\n\n/* Atelier Heath Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ca402b;\n}\n\n/* Atelier Heath Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #a65926;\n}\n\n/* Atelier Heath Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #bb8a35;\n}\n\n/* Atelier Heath Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #379a37;\n}\n\n/* Atelier Heath Light Aqua */\n.css .hljs-hexcolor {\n  color: #159393;\n}\n\n/* Atelier Heath Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #516aec;\n}\n\n/* Atelier Heath Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #7b59c0;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f7f3f7;\n  color: #695d69;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-lakeside.dark.css",
    "content": "/* Base16 Atelier Lakeside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Lakeside Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7195a8;\n}\n\n/* Atelier Lakeside Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d22d72;\n}\n\n/* Atelier Lakeside Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #935c25;\n}\n\n/* Atelier Lakeside Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #8a8a0f;\n}\n\n/* Atelier Lakeside Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #568c3b;\n}\n\n/* Atelier Lakeside Dark Aqua */\n.css .hljs-hexcolor {\n  color: #2d8f6f;\n}\n\n/* Atelier Lakeside Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #257fad;\n}\n\n/* Atelier Lakeside Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #5d5db1;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1f292e;\n  color: #7ea2b4;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-lakeside.light.css",
    "content": "/* Base16 Atelier Lakeside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/lakeside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Lakeside Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #5a7b8c;\n}\n\n/* Atelier Lakeside Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d22d72;\n}\n\n/* Atelier Lakeside Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #935c25;\n}\n\n/* Atelier Lakeside Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #8a8a0f;\n}\n\n/* Atelier Lakeside Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #568c3b;\n}\n\n/* Atelier Lakeside Light Aqua */\n.css .hljs-hexcolor {\n  color: #2d8f6f;\n}\n\n/* Atelier Lakeside Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #257fad;\n}\n\n/* Atelier Lakeside Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #5d5db1;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #ebf8ff;\n  color: #516d7b;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-seaside.dark.css",
    "content": "/* Base16 Atelier Seaside Dark - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Seaside Dark Comment */\n.hljs-comment,\n.hljs-title {\n  color: #809980;\n}\n\n/* Atelier Seaside Dark Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #e6193c;\n}\n\n/* Atelier Seaside Dark Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #87711d;\n}\n\n/* Atelier Seaside Dark Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #c3c322;\n}\n\n/* Atelier Seaside Dark Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #29a329;\n}\n\n/* Atelier Seaside Dark Aqua */\n.css .hljs-hexcolor {\n  color: #1999b3;\n}\n\n/* Atelier Seaside Dark Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #3d62f5;\n}\n\n/* Atelier Seaside Dark Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #242924;\n  color: #8ca68c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/atelier-seaside.light.css",
    "content": "/* Base16 Atelier Seaside Light - Theme */\n/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/seaside/) */\n/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */\n/* https://github.com/jmblog/color-themes-for-highlightjs */\n\n/* Atelier Seaside Light Comment */\n.hljs-comment,\n.hljs-title {\n  color: #687d68;\n}\n\n/* Atelier Seaside Light Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #e6193c;\n}\n\n/* Atelier Seaside Light Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #87711d;\n}\n\n/* Atelier Seaside Light Yellow */\n.hljs-ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #c3c322;\n}\n\n/* Atelier Seaside Light Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #29a329;\n}\n\n/* Atelier Seaside Light Aqua */\n.css .hljs-hexcolor {\n  color: #1999b3;\n}\n\n/* Atelier Seaside Light Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #3d62f5;\n}\n\n/* Atelier Seaside Light Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ad2bee;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #f0fff0;\n  color: #5e6e5e;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/brown_paper.css",
    "content": "/*\n\nBrown Paper style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background:#b7a68e url(./brown_papersq.png);\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  color:#005599;\n  font-weight:bold;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-keyword {\n  color: #363c69;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-number {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula {\n  color: #802022;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-command {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.8;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/codepen-embed.css",
    "content": "/*\n  codepen.io Embed Theme\n  Author: Justin Perry <http://github.com/ourmaninamsterdam>\n  Original theme - https://github.com/chriskempson/tomorrow-theme\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #222;\n  color: #fff;\n  font-family: Menlo, Monaco, 'Andale Mono', 'Lucida Console', 'Courier New', monospace;\n}\n\n.hljs-comment,\n.hljs-title {\n  color: #777;\n}\n\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .constant,\n.xml .tag .title,\n.xml .pi,\n.xml .doctype,\n.html .doctype {\n  color: #ab875d;\n}\n\n.css .value {\n  color: #cd6a51;\n}\n\n.css .value .function,\n.css .value .string {\n  color: #a67f59;\n}\n\n.css .value .number {\n  color: #9b869c;\n}\n\n.css .id,\n.css .class,\n.css-pseudo,\n.css .selector,\n.css .tag {\n  color: #dfc48c;\n}\n\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #ab875d;\n}\n\n.ruby .class .title,\n.css .rules .attribute {\n  color: #9b869b;\n}\n\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .symbol,\n.xml .cdata {\n  color: #8f9c6c;\n}\n\n.css .hexcolor {\n  color: #cd6a51;\n}\n\n.function,\n.python .decorator,\n.python .title,\n.ruby .function .title,\n.ruby .title .keyword,\n.perl .sub,\n.javascript .title,\n.coffeescript .title {\n  color: #fff;\n}\n\n.hljs-keyword,\n.javascript .function {\n  color: #8f9c6c;\n}\n\n.coffeescript .javascript,\n.javascript,\n.javascript .xml,\n.tex .formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .cdata {\n    background: transparent;\n    opacity: 1;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/color-brewer.css",
    "content": "/*\n\nColorbrewer theme\nOriginal: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock <mike@ocks.org>\nPorted by Fabrício Tavares de Oliveira\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title {\n  color: #000;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute {\n  color: #756bb1;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #636363;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #31a354;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #88f;\n}\n\n\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-javadoctag,\n.hljs-phpdoc,\n.hljs-yardoctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.go .hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status {\n  color: #3182bd;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n.css .hljs-attribute,\n.html .hljs-attribute {\n  color: #e6550d;\n}\n\n.css .hljs-class,\n.html .hljs-tag,\n.html .hljs-title {\n  color: #3182bd;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/dark.css",
    "content": "﻿/*\n\nDark style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #444;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color: white;\n}\n\n.hljs,\n.hljs-subst {\n  color: #ddd;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.ini .hljs-title,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt,\n.coffeescript .hljs-attribute {\n  color: #d88;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #777;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-title,\n.css .hljs-id,\n.hljs-phpdoc,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/default.css",
    "content": "/*\n\nOriginal style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #f0f0f0;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-constant,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.haml .hljs-symbol,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.tex .hljs-special,\n.erlang_repl .hljs-function_or_atom,\n.asciidoc .hljs-header,\n.markdown .hljs-header,\n.coffeescript .hljs-attribute {\n  color: #800;\n}\n\n.smartquote,\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.asciidoc .hljs-blockquote,\n.markdown .hljs-blockquote {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.hljs-hexcolor,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.go .hljs-constant,\n.hljs-change,\n.lasso .hljs-variable,\n.makefile .hljs-variable,\n.asciidoc .hljs-bullet,\n.markdown .hljs-bullet,\n.asciidoc .hljs-link_url,\n.markdown .hljs-link_url {\n  color: #080;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-pseudo,\n.hljs-pi,\n.haml .hljs-bullet,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.erlang_repl .hljs-reserved,\n.hljs-prompt,\n.asciidoc .hljs-link_label,\n.markdown .hljs-link_label,\n.vhdl .hljs-attribute,\n.clojure .hljs-attribute,\n.asciidoc .hljs-attribute,\n.lasso .hljs-attribute,\n.coffeescript .hljs-property,\n.hljs-phony {\n  color: #88f;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-title,\n.hljs-built_in,\n.css .hljs-tag,\n.hljs-javadoctag,\n.hljs-phpdoc,\n.hljs-yardoctag,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.go .hljs-typename,\n.tex .hljs-command,\n.asciidoc .hljs-strong,\n.markdown .hljs-strong,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.asciidoc .hljs-emphasis,\n.markdown .hljs-emphasis {\n  font-style: italic;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.lasso .markup,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/docco.css",
    "content": "/*\nDocco style used in http://jashkenas.github.com/docco/ converted by Simon Madine (@thingsinjars)\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #f8f8ff;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n  color: #408080;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.assignment,\n.hljs-literal,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.lisp .hljs-title,\n.hljs-subst {\n  color: #954121;\n}\n\n.hljs-number,\n.hljs-hexcolor {\n  color: #40a070;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula {\n  color: #219161;\n}\n\n.hljs-title,\n.hljs-id {\n  color: #19469d;\n}\n.hljs-params {\n  color: #00f;\n}\n\n.javascript .hljs-title,\n.lisp .hljs-title,\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-label,\n.tex .hljs-command {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.instancevar,\n.lisp .hljs-body {\n  color: #008080;\n}\n\n.hljs-regexp {\n  color: #b68;\n}\n\n.hljs-class {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-symbol .hljs-keyword,\n.ruby .hljs-symbol .keymethods,\n.lisp .hljs-keyword,\n.tex .hljs-special,\n.input_number {\n  color: #990073;\n}\n\n.builtin,\n.constructor,\n.hljs-built_in,\n.lisp .hljs-title {\n  color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.diff .hljs-change {\n  background: #0086b3;\n}\n\n.hljs-chunk {\n  color: #aaa;\n}\n\n.tex .hljs-formula {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/far.css",
    "content": "/*\n\nFAR Style (c) MajestiC <majestic2k@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000080;\n}\n\n.hljs,\n.hljs-subst {\n  color: #0ff;\n}\n\n.hljs-string,\n.ruby .hljs-string,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-rules .hljs-value .hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.clojure .hljs-title,\n.coffeescript .hljs-attribute {\n  color: #ff0;\n}\n\n.hljs-keyword,\n.css .hljs-id,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.xml .hljs-tag .hljs-title,\n.hljs-winutils,\n.hljs-flow,\n.hljs-change,\n.hljs-envvar,\n.bash .hljs-variable,\n.tex .hljs-special,\n.clojure .hljs-built_in {\n  color: #fff;\n}\n\n.hljs-comment,\n.hljs-phpdoc,\n.hljs-javadoc,\n.java .hljs-annotation,\n.hljs-template_comment,\n.hljs-deletion,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #888;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.clojure .hljs-attribute {\n  color: #0f0;\n}\n\n.python .hljs-decorator,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.xml .hljs-pi,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-shebang,\n.nginx .hljs-built_in,\n.hljs-prompt {\n  color: #008080;\n}\n\n.hljs-keyword,\n.css .hljs-id,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.hljs-flow,\n.apache .hljs-tag,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/foundation.css",
    "content": "/*\nDescription: Foundation 4 docs style for highlight.js\nAuthor: Dan Allen <dan.j.allen@gmail.com>\nWebsite: http://foundation.zurb.com/docs/\nVersion: 1.0\nDate: 2013-04-02\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eee;\n}\n\n.hljs-header,\n.hljs-decorator,\n.hljs-annotation {\n  color: #000077;\n}\n\n.hljs-horizontal_rule,\n.hljs-link_url,\n.hljs-emphasis,\n.hljs-attribute {\n  color: #070;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-link_label,\n.hljs-strong,\n.hljs-value,\n.hljs-string,\n.scss .hljs-value .hljs-string {\n  color: #d14;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n\n.hljs-blockquote,\n.hljs-comment {\n  color: #998;\n  font-style: italic;\n}\n\n.asciidoc .hljs-title,\n.hljs-function .hljs-title {\n  color: #900;\n}\n\n.hljs-class {\n  color: #458;\n}\n\n.hljs-id,\n.hljs-pseudo,\n.hljs-constant,\n.hljs-hexcolor {\n  color: teal;\n}\n\n.hljs-variable {\n  color: #336699;\n}\n\n.hljs-bullet,\n.hljs-javadoc {\n  color: #997700;\n}\n\n.hljs-pi,\n.hljs-doctype {\n  color: #3344bb;\n}\n\n.hljs-code,\n.hljs-number {\n  color: #099;\n}\n\n.hljs-important {\n  color: #f00;\n}\n\n.smartquote,\n.hljs-label {\n  color: #970;\n}\n\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #579;\n}\n\n.hljs-reserved,\n.hljs-keyword,\n.scss .hljs-value {\n  color: #000;\n}\n\n.hljs-regexp {\n  background-color: #fff0ff;\n  color: #880088;\n}\n\n.hljs-symbol {\n  color: #990073;\n}\n\n.hljs-symbol .hljs-string {\n  color: #a60;\n}\n\n.hljs-tag {\n  color: #007700;\n}\n\n.hljs-at_rule,\n.hljs-at_rule .hljs-keyword {\n  color: #088;\n}\n\n.hljs-at_rule .hljs-preprocessor {\n  color: #808;\n}\n\n.scss .hljs-tag,\n.scss .hljs-attribute {\n  color: #339;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/github.css",
    "content": "/*\n\ngithub.com style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #333;\n  background: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-javadoc {\n  color: #998;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.nginx .hljs-title,\n.hljs-subst,\n.hljs-request,\n.hljs-status {\n  color: #333;\n  font-weight: bold;\n}\n\n.hljs-number,\n.hljs-hexcolor,\n.ruby .hljs-constant {\n  color: #099;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula {\n  color: #d14;\n}\n\n.hljs-title,\n.hljs-id,\n.coffeescript .hljs-params,\n.scss .hljs-preprocessor {\n  color: #900;\n  font-weight: bold;\n}\n\n.javascript .hljs-title,\n.lisp .hljs-title,\n.clojure .hljs-title,\n.hljs-subst {\n  font-weight: normal;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.vhdl .hljs-literal,\n.tex .hljs-command {\n  color: #458;\n  font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword {\n  color: #000080;\n  font-weight: normal;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body {\n  color: #008080;\n}\n\n.hljs-regexp {\n  color: #009926;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.lisp .hljs-keyword,\n.tex .hljs-special,\n.hljs-prompt {\n  color: #990073;\n}\n\n.hljs-built_in,\n.lisp .hljs-title,\n.clojure .hljs-built_in {\n  color: #0086b3;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n  color: #999;\n  font-weight: bold;\n}\n\n.hljs-deletion {\n  background: #fdd;\n}\n\n.hljs-addition {\n  background: #dfd;\n}\n\n.diff .hljs-change {\n  background: #0086b3;\n}\n\n.hljs-chunk {\n  color: #aaa;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/googlecode.css",
    "content": "/*\n\nGoogle Code style (c) Aahan Krish <geekpanth3r@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #800;\n}\n\n.hljs-keyword,\n.method,\n.hljs-list .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.hljs-tag .hljs-title,\n.setting .hljs-value,\n.hljs-winutils,\n.tex .hljs-command,\n.http .hljs-title,\n.hljs-request,\n.hljs-status {\n  color: #008;\n}\n\n.hljs-envvar,\n.tex .hljs-special {\n  color: #660;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.hljs-regexp,\n.coffeescript .hljs-attribute {\n  color: #080;\n}\n\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.ini .hljs-title,\n.hljs-shebang,\n.hljs-prompt,\n.hljs-hexcolor,\n.hljs-rules .hljs-value,\n.hljs-literal,\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number,\n.css .hljs-function,\n.clojure .hljs-attribute {\n  color: #066;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.hljs-typename,\n.hljs-tag .hljs-attribute,\n.hljs-doctype,\n.hljs-class .hljs-id,\n.hljs-built_in,\n.setting,\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-title {\n  color: #606;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.hljs-subst {\n  color: #000;\n}\n\n.css .hljs-class,\n.css .hljs-id {\n  color: #9b703f;\n}\n\n.hljs-value .hljs-important {\n  color: #ff7700;\n  font-weight: bold;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #444;\n}\n\n.tex .hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  color: #808080;\n  font-weight: bold;\n}\n\n.diff .hljs-change {\n  background-color: #bccff9;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-comment .hljs-yardoctag {\n  font-weight: bold;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/hybrid.css",
    "content": "/*\n\nvim-hybrid theme by w0ng (https://github.com/w0ng/vim-hybrid)\n\n*/\n\n/*background color*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #1d1f21;\n}\n\n/*selection color*/\n.hljs::selection,\n.hljs span::selection {\n\tbackground: #373b41;\n}\n.hljs::-moz-selection,\n.hljs span::-moz-selection {\n\tbackground: #373b41;\n}\n\n/*foreground color*/\n.hljs,\n.hljs-setting .hljs-value,\n.hljs-expression .hljs-variable,\n.hljs-expression .hljs-begin-block,\n.hljs-expression .hljs-end-block,\n.hljs-class .hljs-params,\n.hljs-function .hljs-params,\n.hljs-at_rule .hljs-preprocessor {\n  color: #c5c8c6;\n}\n\n/*color: fg_yellow*/\n.hljs-title,\n.hljs-function .hljs-title,\n.hljs-keyword .hljs-common,\n.hljs-class .hljs-title,\n.hljs-decorator,\n.hljs-tag .hljs-title,\n.hljs-header,\n.hljs-sub,\n.hljs-function {\n  color: #f0c674;\n}\n\n/*color: fg_comment*/\n.hljs-comment,\n.hljs-javadoc,\n.hljs-output .hljs-value,\n.hljs-pi,\n.hljs-shebang,\n.hljs-template_comment,\n.hljs-doctype {\n  color: #707880;\n}\n\n/*color: fg_red*/\n.hljs-number,\n.hljs-symbol,\n.hljs-literal,\n.hljs-deletion,\n.hljs-link_url,\n.hljs-symbol .hljs-string,\n.hljs-argument,\n.hljs-hexcolor,\n.hljs-input .hljs-prompt,\n.hljs-char {\n color: #cc6666\n}\n\n/*color: fg_green*/\n.hljs-string,\n.hljs-special,\n.hljs-javadoctag,\n.hljs-addition,\n.hljs-important,\n.hljs-tag .hljs-value,\n.hljs-at.rule .hljs-keyword,\n.hljs-regexp,\n.hljs-attr_selector {\n  color: #b5bd68;\n}\n\n/*color: fg_purple*/\n.hljs-variable,\n.hljs-property,\n.hljs-envar,\n.hljs-code,\n.hljs-expression,\n.hljs-localvars,\n.hljs-id,\n.hljs-variable .hljs-filter,\n.hljs-variable .hljs-filter .hljs-keyword,\n.hljs-template_tag .hljs-filter .hljs-keyword {\n color: #b294bb;\n}\n\n/*color: fg_blue*/\n.hljs-statement,\n.hljs-label,\n.hljs-keyword,\n.hljs-xmlDocTag,\n.hljs-function .hljs-keyword,\n.hljs-chunk,\n.hljs-cdata,\n.hljs-link_label,\n.hljs-bullet,\n.hljs-class .hljs-keyword,\n.hljs-smartquote,\n.hljs-method,\n.hljs-list .hljs-title,\n.hljs-tag {\n color: #81a2be;\n}\n\n/*color: fg_aqua*/\n.hljs-pseudo,\n.hljs-exception,\n.hljs-annotation,\n.hljs-subst,\n.hljs-change,\n.hljs-cbracket,\n.hljs-operator,\n.hljs-horizontal_rule,\n.hljs-preprocessor .hljs-keyword,\n.hljs-typedef,\n.hljs-template_tag,\n.hljs-variable,\n.hljs-variable .hljs-filter .hljs-argument,\n.hljs-at_rule,\n.hljs-at_rule .hljs-string,\n.hljs-at_rule .hljs-keyword {\n  color: #8abeb7;\n}\n\n\n/*color: fg_orange*/\n.hljs-typename ,\n.hljs-inheritance .hljs-parent,\n.hljs-constant,\n.hljs-built_in,\n.hljs-setting,\n.hljs-structure,\n.hljs-link_reference,\n.hljs-attribute,\n.hljs-blockquote,\n.hljs-quoted,\n.hljs-class,\n.hljs-header {\n  color: #de935f;\n}\n\n.hljs-emphasis\n{\n  font-style: italic;\n}\n\n.hljs-strong\n{\n  font-weight: bold;\n}\n\n\n\n\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/idea.css",
    "content": "/*\n\nIntellij Idea-like styling (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #000;\n  background: #fff;\n}\n\n.hljs-subst,\n.hljs-title,\n.json .hljs-value {\n  font-weight: normal;\n  color: #000;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc,\n.diff .hljs-header {\n  color: #808080;\n  font-style: italic;\n}\n\n.hljs-annotation,\n.hljs-decorator,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-doctype,\n.hljs-pi,\n.hljs-chunk,\n.hljs-shebang,\n.apache .hljs-cbracket,\n.hljs-prompt,\n.http .hljs-title {\n  color: #808000;\n}\n\n.hljs-tag,\n.hljs-pi {\n  background: #efefef;\n}\n\n.hljs-tag .hljs-title,\n.hljs-id,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-literal,\n.hljs-keyword,\n.hljs-hexcolor,\n.css .hljs-function,\n.ini .hljs-title,\n.css .hljs-class,\n.hljs-list .hljs-title,\n.clojure .hljs-title,\n.nginx .hljs-title,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n  color: #000080;\n}\n\n.hljs-attribute,\n.hljs-rules .hljs-keyword,\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.tex .hljs-special {\n  font-weight: bold;\n  color: #0000ff;\n}\n\n.hljs-number,\n.hljs-regexp {\n  font-weight: normal;\n}\n\n.hljs-string,\n.hljs-value,\n.hljs-filter .hljs-argument,\n.css .hljs-function .hljs-params,\n.apache .hljs-tag {\n  color: #008000;\n  font-weight: bold;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-char,\n.tex .hljs-formula {\n  color: #000;\n  background: #d0eded;\n  font-style: italic;\n}\n\n.hljs-phpdoc,\n.hljs-yardoctag,\n.hljs-javadoctag {\n  text-decoration: underline;\n}\n\n.hljs-variable,\n.hljs-envvar,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #660e7a;\n}\n\n.hljs-addition {\n  background: #baeeba;\n}\n\n.hljs-deletion {\n  background: #ffc8bd;\n}\n\n.diff .hljs-change {\n  background: #bccff9;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/ir_black.css",
    "content": "/*\n  IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-shebang,\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #7c7c7c;\n}\n\n.hljs-keyword,\n.hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status,\n.clojure .hljs-attribute {\n  color: #96cbfe;\n}\n\n.hljs-sub .hljs-keyword,\n.method,\n.hljs-list .hljs-title,\n.nginx .hljs-title {\n  color: #ffffb6;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.coffeescript .hljs-attribute {\n  color: #a8ff60;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-decorator,\n.tex .hljs-special,\n.haskell .hljs-type,\n.hljs-constant,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.nginx .hljs-built_in {\n  color: #ffffb6;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number,\n.hljs-variable,\n.vbscript,\n.hljs-literal {\n  color: #c6c5fe;\n}\n\n.css .hljs-tag {\n  color: #96cbfe;\n}\n\n.css .hljs-rules .hljs-property,\n.css .hljs-id {\n  color: #ffffb6;\n}\n\n.css .hljs-class {\n  color: #fff;\n}\n\n.hljs-hexcolor {\n  color: #c6c5fe;\n}\n\n.hljs-number {\n  color:#ff73fd;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.7;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/kimbie.dark.css",
    "content": "/*\n    Name:     Kimbie (dark)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-title {\n  color: #d6baad;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #889b4a;\n}\n\n/* Kimbie Aqua */\n.css .hljs-hexcolor {\n  color:: #088649;\n}\n\n/* Kimbie Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #8ab1b0;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #221a0f;\n  color: #d3af86;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/kimbie.light.css",
    "content": "/*\n    Name:     Kimbie (light)\n    Author:   Jan T. Sott\n    License:  Creative Commons Attribution-ShareAlike 4.0 Unported License\n    URL:      https://github.com/idleberg/Kimbie-highlight.js\n*/\n\n/* Kimbie Comment */\n.hljs-comment,\n.hljs-title {\n  color: #a57a4c;\n}\n\n/* Kimbie Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #dc3958;\n}\n\n/* Kimbie Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f79a32;\n}\n\n/* Kimbie Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f06431;\n}\n\n/* Kimbie Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #889b4a;\n}\n\n/* Kimbie Aqua */\n.css .hljs-hexcolor {\n  color: #088649;\n}\n\n/* Kimbie Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #8ab1b0;\n}\n\n/* Kimbie Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #98676a;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #fbebd4;\n  color: #84613d;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/magula.css",
    "content": "﻿/*\nDescription: Magula style for highligh.js\nAuthor: Ruslan Keba <rukeba@gmail.com>\nWebsite: http://rukeba.com/\nVersion: 1.0\nDate: 2009-01-03\nMusic: Aphex Twin / Xtal\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background-color: #f4f4f4;\n}\n\n.hljs,\n.hljs-subst,\n.lisp .hljs-title,\n.clojure .hljs-built_in {\n  color: black;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.bash .hljs-variable,\n.apache .hljs-cbracket,\n.coffeescript .hljs-attribute {\n  color: #050;\n}\n\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk {\n  color: #777;\n}\n\n.hljs-number,\n.hljs-date,\n.hljs-regexp,\n.hljs-literal,\n.smalltalk .hljs-symbol,\n.smalltalk .hljs-char,\n.hljs-change,\n.tex .hljs-special {\n  color: #800;\n}\n\n.hljs-label,\n.hljs-javadoc,\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-formula,\n.hljs-prompt,\n.clojure .hljs-attribute {\n  color: #00e;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-built_in,\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.xml .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n  color: navy;\n}\n\n.nginx .hljs-built_in {\n  font-weight: normal;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n/* --- */\n.apache .hljs-tag {\n  font-weight: bold;\n  color: blue;\n}\n\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/mono-blue.css",
    "content": "/*\n  Five-color theme from a single blue hue.\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #eaeef3;\n  color: #00193a;\n}\n\n.hljs-keyword,\n.hljs-title,\n.hljs-important,\n.hljs-request,\n.hljs-header,\n.hljs-javadoctag {\n  font-weight: bold;\n}\n\n.hljs-comment,\n.hljs-chunk,\n.hljs-template_comment {\n  color: #738191;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-built_in,\n.hljs-literal,\n.hljs-filename,\n.hljs-value,\n.hljs-addition,\n.hljs-tag,\n.hljs-argument,\n.hljs-link_label,\n.hljs-blockquote,\n.hljs-header {\n  color: #0048ab;\n}\n\n.hljs-decorator,\n.hljs-prompt,\n.hljs-yardoctag,\n.hljs-subst,\n.hljs-symbol,\n.hljs-doctype,\n.hljs-regexp,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-attribute,\n.hljs-attr_selector,\n.hljs-javadoc,\n.hljs-xmlDocTag,\n.hljs-deletion,\n.hljs-shebang,\n.hljs-string .hljs-variable,\n.hljs-link_url,\n.hljs-bullet,\n.hljs-sqbracket,\n.hljs-phony {\n  color: #4c81c9;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/monokai.css",
    "content": "/*\nMonokai style - ported by Luigi Maselli - http://grigio.org\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #272822;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-keyword,\n.hljs-literal,\n.hljs-strong,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color: #f92672;\n}\n\n.hljs {\n  color: #ddd;\n}\n\n.hljs .hljs-constant,\n.asciidoc .hljs-code {\n\tcolor: #66d9ef;\n}\n\n.hljs-code,\n.hljs-class .hljs-title,\n.hljs-header {\n\tcolor: white;\n}\n\n.hljs-link_label,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-value,\n.hljs-regexp {\n\tcolor: #bf79db;\n}\n\n.hljs-link_url,\n.hljs-tag .hljs-value,\n.hljs-string,\n.hljs-bullet,\n.hljs-subst,\n.hljs-title,\n.hljs-emphasis,\n.haskell .hljs-type,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #a6e22e;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.smartquote,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #75715e;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-header,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/monokai_sublime.css",
    "content": "/*\n\nMonokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #23241f;\n}\n\n.hljs,\n.hljs-tag,\n.css .hljs-rules,\n.css .hljs-value,\n.css .hljs-function\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #f8f8f2;\n}\n\n.hljs-strongemphasis,\n.hljs-strong,\n.hljs-emphasis {\n  color: #a8a8a2;\n}\n\n.hljs-bullet,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.hljs-number,\n.hljs-regexp,\n.alias .hljs-keyword,\n.hljs-literal,\n.hljs-hexcolor {\n  color: #ae81ff;\n}\n\n.hljs-tag .hljs-value,\n.hljs-code,\n.hljs-title,\n.css .hljs-class,\n.hljs-class .hljs-title:last-child {\n  color: #a6e22e;\n}\n\n.hljs-link_url {\n  font-size: 80%;\n}\n\n.hljs-strong,\n.hljs-strongemphasis {\n  font-weight: bold;\n}\n\n.hljs-emphasis,\n.hljs-strongemphasis,\n.hljs-class .hljs-title:last-child {\n  font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-function,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special,\n.hljs-header,\n.hljs-attribute,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-tag .hljs-title,\n.hljs-value,\n.alias .hljs-keyword:first-child,\n.css .hljs-tag,\n.css .unit,\n.css .hljs-important {\n  color: #f92672;\n}\n\n.hljs-function .hljs-keyword,\n.hljs-class .hljs-keyword:first-child,\n.hljs-constant,\n.css .hljs-attribute {\n  color: #66d9ef;\n}\n\n.hljs-variable,\n.hljs-params,\n.hljs-class .hljs-title {\n  color: #f8f8f2;\n}\n\n.hljs-string,\n.css .hljs-id,\n.hljs-subst,\n.haskell .hljs-type,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt,\n.hljs-link_label,\n.hljs-link_url {\n  color: #e6db74;\n}\n\n.hljs-comment,\n.hljs-javadoc,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #75715e;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata,\n.xml .php,\n.php .xml {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/obsidian.css",
    "content": "/**\n * Obsidian style\n * ported by Alexander Marenin (http://github.com/ioncreature)\n */\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #282b2e;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.css .hljs-id,\n.tex .hljs-special {\n  color: #93c763;\n}\n\n.hljs-number {\n  color: #ffcd22;\n}\n\n.hljs {\n  color: #e0e2e4;\n}\n\n.css .hljs-tag,\n.css .hljs-pseudo {\n  color: #d0d2b5;\n}\n\n.hljs-attribute,\n.hljs .hljs-constant {\n  color: #668bb0;\n}\n\n.xml .hljs-attribute {\n  color: #b3b689;\n}\n\n.xml .hljs-tag .hljs-value {\n  color: #e8e2b7;\n}\n\n.hljs-code,\n.hljs-class .hljs-title,\n.hljs-header {\n  color: white;\n}\n\n.hljs-class,\n.hljs-hexcolor {\n  color: #93c763;\n}\n\n.hljs-regexp {\n  color: #d39745;\n}\n\n.hljs-at_rule,\n.hljs-at_rule .hljs-keyword {\n  color: #a082bd;\n}\n\n.hljs-doctype {\n  color: #557182;\n}\n\n.hljs-link_url,\n.hljs-tag,\n.hljs-tag .hljs-title,\n.hljs-bullet,\n.hljs-subst,\n.hljs-emphasis,\n.haskell .hljs-type,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #8cbbad;\n}\n\n.hljs-string {\n  color: #ec7600;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.hljs-blockquote,\n.hljs-horizontal_rule,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket,\n.tex .hljs-formula {\n  color: #818e96;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.hljs-header,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-special,\n.hljs-request,\n.hljs-at_rule .hljs-keyword,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/paraiso.dark.css",
    "content": "/*\n    Paraíso (dark)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-title {\n  color: #8d8687;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #48b685;\n}\n\n/* Paraíso Aqua */\n.css .hljs-hexcolor {\n  color: #5bc4bf;\n}\n\n/* Paraíso Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #06b6ef;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2f1e2e;\n  color: #a39e9b;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/paraiso.light.css",
    "content": "/*\n    Paraíso (light)\n    Created by Jan T. Sott (http://github.com/idleberg)\n    Inspired by the art of Rubens LP (http://www.rubenslp.com.br)\n*/\n\n/* Paraíso Comment */\n.hljs-comment,\n.hljs-title {\n  color: #776e71;\n}\n\n/* Paraíso Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ef6155;\n}\n\n/* Paraíso Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99b15;\n}\n\n/* Paraíso Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #fec418;\n}\n\n/* Paraíso Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #48b685;\n}\n\n/* Paraíso Aqua */\n.css .hljs-hexcolor {\n  color: #5bc4bf;\n}\n\n/* Paraíso Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #06b6ef;\n}\n\n/* Paraíso Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #815ba4;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #e7e9db;\n  color: #4f424c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/pojoaque.css",
    "content": "/*\n\nPojoaque Style by Jason Tate\nhttp://web-cms-designs.com/ftopict-10-pojoaque-style-for-highlight-js-code-highlighter.html\nBased on Solarized Style from http://ethanschoonover.com/solarized\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  color: #dccf8f;\n  background: url(./pojoaque.jpg) repeat scroll left top #181914;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #586e75;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.css .rule .hljs-keyword,\n.hljs-winutils,\n.javascript .hljs-title,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.clojure .hljs-title,\n.nginx .hljs-title {\n  color: #b64926;\n}\n\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor {\n  color: #468966;\n}\n\n.hljs-title,\n.hljs-localvars,\n.hljs-function .hljs-title,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.hljs-identifier,\n.hljs-id {\n  color: #ffb03b;\n}\n\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type {\n  color: #b58900;\n}\n\n.css .hljs-attribute {\n  color: #b89859;\n}\n\n.css .hljs-number,\n.css .hljs-hexcolor {\n  color: #dccf8f;\n}\n\n.css .hljs-class {\n  color: #d3a60c;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-subst,\n.hljs-cdata {\n  color: #cb4b16;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.tex .hljs-formula {\n  background: #073642;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/railscasts.css",
    "content": "/*\n\nRailscasts-like style (c) Visoft, Inc. (Damien White)\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #232323;\n  color: #e6e1dc;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc,\n.hljs-shebang {\n  color: #bc9458;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.ruby .hljs-function .hljs-keyword,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title,\n.method,\n.hljs-list .hljs-title {\n  color: #c26230;\n}\n\n.hljs-string,\n.hljs-number,\n.hljs-regexp,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.tex .hljs-command,\n.markdown .hljs-link_label {\n  color: #a5c261;\n}\n\n.hljs-subst {\n  color: #519f50;\n}\n\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-tag .hljs-title,\n.hljs-doctype,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.input_number {\n  color: #e8bf6a;\n}\n\n.hljs-identifier {\n  color: #d0d0ff;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc {\n  text-decoration: none;\n}\n\n.hljs-constant {\n  color: #da4939;\n}\n\n\n.hljs-symbol,\n.hljs-built_in,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-symbol .hljs-identifier,\n.markdown .hljs-link_url,\n.hljs-attribute {\n  color: #6d9cbe;\n}\n\n.markdown .hljs-link_url {\n  text-decoration: underline;\n}\n\n\n\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-attribute {\n  color: #d0d0ff;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.tex .hljs-special {\n  color: #cda869;\n}\n\n.css .hljs-class {\n  color: #9b703f;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-rules .hljs-value {\n  color: #cf6a4c;\n}\n\n.css .hljs-id {\n  color: #8b98ab;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #8996a8 !important;\n}\n\n.hljs-hexcolor,\n.css .hljs-value .hljs-number {\n  color: #a5c261;\n}\n\n.hljs-title,\n.hljs-decorator,\n.css .hljs-function {\n  color: #ffc66d;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  background-color: #2f33ab;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.diff .hljs-change {\n  background-color: #4a410d;\n  color: #f8f8f8;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-addition {\n  background-color: #144212;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.hljs-deletion {\n  background-color: #600;\n  color: #e6e1dc;\n  display: inline-block;\n  width: 100%;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.7;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/rainbow.css",
    "content": "/*\n\nStyle with support for rainbow parens\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #474949;\n  color: #d1d9e1;\n}\n\n\n.hljs-body,\n.hljs-collection {\n   color: #d1d9e1;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #969896;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.clojure .hljs-attribute,\n.hljs-winutils,\n.javascript .hljs-title,\n.hljs-addition,\n.css .hljs-tag {\n  color: #cc99cc;\n}\n\n.hljs-number { color: #f99157; }\n\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor {\n  color: #8abeb7;\n}\n\n.hljs-title,\n.hljs-localvars,\n.hljs-function .hljs-title,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.lisp .hljs-title,\n.hljs-identifier {\n  color: #b5bd68;\n}\n\n.hljs-class .hljs-keyword {\n  color: #f2777a;\n}\n\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-label,\n.hljs-id,\n.lisp .hljs-title,\n.clojure .hljs-title .hljs-built_in {\n   color: #ffcc66;\n}\n\n.hljs-tag .hljs-title,\n.hljs-rules .hljs-property,\n.django .hljs-tag .hljs-keyword,\n.clojure .hljs-title .hljs-built_in {\n  font-weight: bold;\n}\n\n.hljs-attribute,\n.clojure .hljs-title {\n  color: #81a2be;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-important,\n.hljs-subst,\n.hljs-cdata {\n  color: #f99157;\n}\n\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.tex .hljs-formula {\n  background: #eee8d5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/school_book.css",
    "content": "/*\n\nSchool Book style from goldblog.com.ua (c) Zaripov Yura <yur4ik7@ukr.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 15px 0.5em 0.5em 30px;\n  font-size: 11px !important;\n  line-height:16px !important;\n}\n\npre{\n  background:#f6f6ae url(./school_book.png);\n  border-top: solid 2px #d2e8b9;\n  border-bottom: solid 1px #d2e8b9;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.hljs-change,\n.hljs-winutils,\n.hljs-flow,\n.lisp .hljs-title,\n.clojure .hljs-built_in,\n.nginx .hljs-title,\n.tex .hljs-special {\n  color:#005599;\n  font-weight:bold;\n}\n\n.hljs,\n.hljs-subst,\n.hljs-tag .hljs-keyword {\n  color: #3e5915;\n}\n\n.hljs-string,\n.hljs-title,\n.haskell .hljs-type,\n.hljs-tag .hljs-value,\n.css .hljs-rules .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-class .hljs-parent,\n.hljs-built_in,\n.django .hljs-template_tag,\n.django .hljs-variable,\n.smalltalk .hljs-class,\n.hljs-javadoc,\n.ruby .hljs-string,\n.django .hljs-filter .hljs-argument,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-addition,\n.hljs-stream,\n.hljs-envvar,\n.apache .hljs-tag,\n.apache .hljs-cbracket,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.coffeescript .hljs-attribute {\n  color: #2c009f;\n}\n\n.hljs-comment,\n.java .hljs-annotation,\n.python .hljs-decorator,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-shebang,\n.apache .hljs-sqbracket {\n  color: #e60415;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.css .hljs-id,\n.hljs-phpdoc,\n.hljs-title,\n.haskell .hljs-type,\n.vbscript .hljs-built_in,\n.rsl .hljs-built_in,\n.smalltalk .hljs-class,\n.xml .hljs-tag .hljs-title,\n.diff .hljs-header,\n.hljs-chunk,\n.hljs-winutils,\n.bash .hljs-variable,\n.apache .hljs-tag,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status {\n  font-weight: bold;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/solarized_dark.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #002b36;\n  color: #839496;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.hljs-pi,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #586e75;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-winutils,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor,\n.hljs-link_url {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-localvars,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.hljs-identifier,\n.vhdl .hljs-literal,\n.hljs-id,\n.css .hljs-function {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type,\n.hljs-link_reference {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-keyword,\n.hljs-pragma,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-subst,\n.hljs-cdata,\n.clojure .hljs-title,\n.css .hljs-pseudo,\n.hljs-header {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-deletion,\n.hljs-important {\n  color: #dc322f;\n}\n\n/* Solarized Violet */\n.hljs-link_label {\n  color: #6c71c4;\n}\n\n.tex .hljs-formula {\n  background: #073642;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/solarized_light.css",
    "content": "/*\n\nOrginal Style from ethanschoonover.com/solarized (c) Jeremy Hull <sourdrums@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fdf6e3;\n  color: #657b83;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-doctype,\n.hljs-pi,\n.lisp .hljs-string,\n.hljs-javadoc {\n  color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-winutils,\n.method,\n.hljs-addition,\n.css .hljs-tag,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-command,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.hljs-phpdoc,\n.tex .hljs-formula,\n.hljs-regexp,\n.hljs-hexcolor,\n.hljs-link_url {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-localvars,\n.hljs-chunk,\n.hljs-decorator,\n.hljs-built_in,\n.hljs-identifier,\n.vhdl .hljs-literal,\n.hljs-id,\n.css .hljs-function {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-variable,\n.lisp .hljs-body,\n.smalltalk .hljs-number,\n.hljs-constant,\n.hljs-class .hljs-title,\n.hljs-parent,\n.haskell .hljs-type,\n.hljs-link_reference {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-preprocessor,\n.hljs-preprocessor .hljs-keyword,\n.hljs-pragma,\n.hljs-shebang,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.diff .hljs-change,\n.hljs-special,\n.hljs-attr_selector,\n.hljs-subst,\n.hljs-cdata,\n.clojure .hljs-title,\n.css .hljs-pseudo,\n.hljs-header {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-deletion,\n.hljs-important {\n  color: #dc322f;\n}\n\n/* Solarized Violet */\n.hljs-link_label {\n  color: #6c71c4;\n}\n\n.tex .hljs-formula {\n  background: #eee8d5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/sunburst.css",
    "content": "/*\n\nSunburst-like style (c) Vasily Polovnyov <vast@whiteants.net>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #000;\n  color: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #aeaeae;\n  font-style: italic;\n}\n\n.hljs-keyword,\n.ruby .hljs-function .hljs-keyword,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title {\n  color: #e28964;\n}\n\n.hljs-function .hljs-keyword,\n.hljs-sub .hljs-keyword,\n.method,\n.hljs-list .hljs-title {\n  color: #99cf50;\n}\n\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.tex .hljs-command,\n.coffeescript .hljs-attribute {\n  color: #65b042;\n}\n\n.hljs-subst {\n  color: #daefa3;\n}\n\n.hljs-regexp {\n  color: #e9c062;\n}\n\n.hljs-title,\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.hljs-shebang,\n.hljs-prompt {\n  color: #89bdff;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc {\n  text-decoration: underline;\n}\n\n.hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-number {\n  color: #3387cc;\n}\n\n.hljs-params,\n.hljs-variable,\n.clojure .hljs-attribute {\n  color: #3e87e3;\n}\n\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.tex .hljs-special {\n  color: #cda869;\n}\n\n.css .hljs-class {\n  color: #9b703f;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-rules .hljs-value {\n  color: #cf6a4c;\n}\n\n.css .hljs-id {\n  color: #8b98ab;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-pragma {\n  color: #8996a8;\n}\n\n.hljs-hexcolor,\n.css .hljs-value .hljs-number {\n  color: #dd7b3b;\n}\n\n.css .hljs-function {\n  color: #dad085;\n}\n\n.diff .hljs-header,\n.hljs-chunk,\n.tex .hljs-formula {\n  background-color: #0e2231;\n  color: #f8f8f8;\n  font-style: italic;\n}\n\n.diff .hljs-change {\n  background-color: #4a410d;\n  color: #f8f8f8;\n}\n\n.hljs-addition {\n  background-color: #253b22;\n  color: #f8f8f8;\n}\n\n.hljs-deletion {\n  background-color: #420e09;\n  color: #f8f8f8;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/tomorrow-night-blue.css",
    "content": "/* Tomorrow Night Blue Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #7285b7;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #ff9da4;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #ffc58f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #ffeead;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #d1f1a9;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #99ffff;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #bbdaff;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #ebbbff;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #002451;\n  color: white;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/tomorrow-night-bright.css",
    "content": "/* Tomorrow Night Bright Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #d54e53;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #e78c45;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #e7c547;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #b9ca4a;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #70c0b1;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #7aa6da;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #c397d8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: black;\n  color: #eaeaea;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/tomorrow-night-eighties.css",
    "content": "/* Tomorrow Night Eighties Theme */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #999999;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #f2777a;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f99157;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #ffcc66;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #99cc99;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #66cccc;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #6699cc;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #cc99cc;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #2d2d2d;\n  color: #cccccc;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/tomorrow-night.css",
    "content": "/* Tomorrow Night Theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n/* Original theme - https://github.com/chriskempson/tomorrow-theme */\n/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #969896;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #cc6666;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #de935f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #f0c674;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #b5bd68;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #8abeb7;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #81a2be;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #b294bb;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: #1d1f21;\n  color: #c5c8c6;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/tomorrow.css",
    "content": "/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */\n\n/* Tomorrow Comment */\n.hljs-comment,\n.hljs-title {\n  color: #8e908c;\n}\n\n/* Tomorrow Red */\n.hljs-variable,\n.hljs-attribute,\n.hljs-tag,\n.hljs-regexp,\n.ruby .hljs-constant,\n.xml .hljs-tag .hljs-title,\n.xml .hljs-pi,\n.xml .hljs-doctype,\n.html .hljs-doctype,\n.css .hljs-id,\n.css .hljs-class,\n.css .hljs-pseudo {\n  color: #c82829;\n}\n\n/* Tomorrow Orange */\n.hljs-number,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-literal,\n.hljs-params,\n.hljs-constant {\n  color: #f5871f;\n}\n\n/* Tomorrow Yellow */\n.ruby .hljs-class .hljs-title,\n.css .hljs-rules .hljs-attribute {\n  color: #eab700;\n}\n\n/* Tomorrow Green */\n.hljs-string,\n.hljs-value,\n.hljs-inheritance,\n.hljs-header,\n.ruby .hljs-symbol,\n.xml .hljs-cdata {\n  color: #718c00;\n}\n\n/* Tomorrow Aqua */\n.css .hljs-hexcolor {\n  color: #3e999f;\n}\n\n/* Tomorrow Blue */\n.hljs-function,\n.python .hljs-decorator,\n.python .hljs-title,\n.ruby .hljs-function .hljs-title,\n.ruby .hljs-title .hljs-keyword,\n.perl .hljs-sub,\n.javascript .hljs-title,\n.coffeescript .hljs-title {\n  color: #4271ae;\n}\n\n/* Tomorrow Purple */\n.hljs-keyword,\n.javascript .hljs-function {\n  color: #8959a8;\n}\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  background: white;\n  color: #4d4d4c;\n  padding: 0.5em;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/vs.css",
    "content": "/*\n\nVisual Studio-like style based on original C# coloring by Jason Diamond <jason@diamond.name>\n\n*/\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: white;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-annotation,\n.hljs-template_comment,\n.diff .hljs-header,\n.hljs-chunk,\n.apache .hljs-cbracket {\n  color: #008000;\n}\n\n.hljs-keyword,\n.hljs-id,\n.hljs-built_in,.css\n.smalltalk .hljs-class,\n.hljs-winutils,\n.bash .hljs-variable,\n.tex .hljs-command,\n.hljs-request,\n.hljs-status,\n.nginx .hljs-title,\n.xml .hljs-tag,\n.xml .hljs-tag .hljs-value {\n  color: #00f;\n}\n\n.hljs-string,\n.hljs-title,\n.hljs-parent,\n.hljs-tag .hljs-value,\n.hljs-rules .hljs-value,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.hljs-template_tag,\n.django .hljs-variable,\n.hljs-addition,\n.hljs-flow,\n.hljs-stream,\n.apache .hljs-tag,\n.hljs-date,\n.tex .hljs-formula,\n.coffeescript .hljs-attribute {\n  color: #a31515;\n}\n\n.ruby .hljs-string,\n.hljs-decorator,\n.hljs-filter .hljs-argument,\n.hljs-localvars,\n.hljs-array,\n.hljs-attr_selector,\n.hljs-pseudo,\n.hljs-pi,\n.hljs-doctype,\n.hljs-deletion,\n.hljs-envvar,\n.hljs-shebang,\n.hljs-preprocessor,\n.hljs-pragma,\n.userType,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in,\n.tex .hljs-special,\n.hljs-prompt {\n  color: #2b91af;\n}\n\n.hljs-phpdoc,\n.hljs-javadoc,\n.hljs-xmlDocTag {\n  color: #808080;\n}\n\n.vhdl .hljs-typename { font-weight: bold; }\n.vhdl .hljs-string { color: #666666; }\n.vhdl .hljs-literal { color: #a31515; }\n.vhdl .hljs-attribute { color: #00b0e8; }\n\n.xml .hljs-attribute { color: #f00; }\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/xcode.css",
    "content": "/*\n\nXCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #fff;\n  color: black;\n}\n\n.hljs-comment,\n.hljs-template_comment,\n.hljs-javadoc {\n  color: #006a00;\n}\n\n.hljs-keyword,\n.hljs-literal,\n.nginx .hljs-title {\n  color: #aa0d91;\n}\n.method,\n.hljs-list .hljs-title,\n.hljs-tag .hljs-title,\n.setting .hljs-value,\n.hljs-winutils,\n.tex .hljs-command,\n.http .hljs-title,\n.hljs-request,\n.hljs-status {\n  color: #008;\n}\n\n.hljs-envvar,\n.tex .hljs-special {\n  color: #660;\n}\n\n.hljs-string {\n  color: #c41a16;\n}\n.hljs-tag .hljs-value,\n.hljs-cdata,\n.hljs-filter .hljs-argument,\n.hljs-attr_selector,\n.apache .hljs-cbracket,\n.hljs-date,\n.hljs-regexp {\n  color: #080;\n}\n\n.hljs-sub .hljs-identifier,\n.hljs-pi,\n.hljs-tag,\n.hljs-tag .hljs-keyword,\n.hljs-decorator,\n.ini .hljs-title,\n.hljs-shebang,\n.hljs-prompt,\n.hljs-hexcolor,\n.hljs-rules .hljs-value,\n.hljs-symbol,\n.hljs-symbol .hljs-string,\n.hljs-number,\n.css .hljs-function,\n.clojure .hljs-title,\n.clojure .hljs-built_in,\n.hljs-function .hljs-title,\n.coffeescript .hljs-attribute {\n  color: #1c00cf;\n}\n\n.hljs-class .hljs-title,\n.haskell .hljs-type,\n.smalltalk .hljs-class,\n.hljs-javadoctag,\n.hljs-yardoctag,\n.hljs-phpdoc,\n.hljs-typename,\n.hljs-tag .hljs-attribute,\n.hljs-doctype,\n.hljs-class .hljs-id,\n.hljs-built_in,\n.setting,\n.hljs-params,\n.clojure .hljs-attribute {\n  color: #5c2699;\n}\n\n.hljs-variable {\n color: #3f6e74;\n}\n.css .hljs-tag,\n.hljs-rules .hljs-property,\n.hljs-pseudo,\n.hljs-subst {\n  color: #000;\n}\n\n.css .hljs-class,\n.css .hljs-id {\n  color: #9b703f;\n}\n\n.hljs-value .hljs-important {\n  color: #ff7700;\n  font-weight: bold;\n}\n\n.hljs-rules .hljs-keyword {\n  color: #c5af75;\n}\n\n.hljs-annotation,\n.apache .hljs-sqbracket,\n.nginx .hljs-built_in {\n  color: #9b859d;\n}\n\n.hljs-preprocessor,\n.hljs-preprocessor *,\n.hljs-pragma {\n  color: #643820;\n}\n\n.tex .hljs-formula {\n  background-color: #eee;\n  font-style: italic;\n}\n\n.diff .hljs-header,\n.hljs-chunk {\n  color: #808080;\n  font-weight: bold;\n}\n\n.diff .hljs-change {\n  background-color: #bccff9;\n}\n\n.hljs-addition {\n  background-color: #baeeba;\n}\n\n.hljs-deletion {\n  background-color: #ffc8bd;\n}\n\n.hljs-comment .hljs-yardoctag {\n  font-weight: bold;\n}\n\n.method .hljs-id {\n  color: #000;\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/highlight/styles/zenburn.css",
    "content": "/*\n\nZenburn style from voldmar.ru (c) Vladimir Epifanov <voldmar@voldmar.ru>\nbased on dark.css by Ivan Sagalaev\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #3f3f3f;\n  color: #dcdcdc;\n}\n\n.hljs-keyword,\n.hljs-tag,\n.css .hljs-class,\n.css .hljs-id,\n.lisp .hljs-title,\n.nginx .hljs-title,\n.hljs-request,\n.hljs-status,\n.clojure .hljs-attribute {\n  color: #e3ceab;\n}\n\n.django .hljs-template_tag,\n.django .hljs-variable,\n.django .hljs-filter .hljs-argument {\n  color: #dcdcdc;\n}\n\n.hljs-number,\n.hljs-date {\n  color: #8cd0d3;\n}\n\n.dos .hljs-envvar,\n.dos .hljs-stream,\n.hljs-variable,\n.apache .hljs-sqbracket {\n  color: #efdcbc;\n}\n\n.dos .hljs-flow,\n.diff .hljs-change,\n.python .exception,\n.python .hljs-built_in,\n.hljs-literal,\n.tex .hljs-special {\n  color: #efefaf;\n}\n\n.diff .hljs-chunk,\n.hljs-subst {\n  color: #8f8f8f;\n}\n\n.dos .hljs-keyword,\n.python .hljs-decorator,\n.hljs-title,\n.haskell .hljs-type,\n.diff .hljs-header,\n.ruby .hljs-class .hljs-parent,\n.apache .hljs-tag,\n.nginx .hljs-built_in,\n.tex .hljs-command,\n.hljs-prompt {\n  color: #efef8f;\n}\n\n.dos .hljs-winutils,\n.ruby .hljs-symbol,\n.ruby .hljs-symbol .hljs-string,\n.ruby .hljs-string {\n  color: #dca3a3;\n}\n\n.diff .hljs-deletion,\n.hljs-string,\n.hljs-tag .hljs-value,\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-built_in,\n.hljs-javadoc,\n.smalltalk .hljs-class,\n.smalltalk .hljs-localvars,\n.smalltalk .hljs-array,\n.css .hljs-rules .hljs-value,\n.hljs-attr_selector,\n.hljs-pseudo,\n.apache .hljs-cbracket,\n.tex .hljs-formula,\n.coffeescript .hljs-attribute {\n  color: #cc9393;\n}\n\n.hljs-shebang,\n.diff .hljs-addition,\n.hljs-comment,\n.java .hljs-annotation,\n.hljs-template_comment,\n.hljs-pi,\n.hljs-doctype {\n  color: #7f9f7f;\n}\n\n.coffeescript .javascript,\n.javascript .xml,\n.tex .hljs-formula,\n.xml .javascript,\n.xml .vbscript,\n.xml .css,\n.xml .hljs-cdata {\n  opacity: 0.5;\n}\n\n"
  },
  {
    "path": "ppt/think-in-css/js/img.screenfull.js",
    "content": "(function(window, document) {\n    var sf = function($imgs) {\n        $imgs.forEach(function($img) {\n            $img.addEventListener('click', function() {\n                show(this);\n            }, false);\n        });\n    };\n\n    function show(t) {\n        var img = document.createElement('img');\n        img.src = t.src;\n        img.className = 'transparent';\n        $layer.innerHTML = '';\n        img.onload = function() {\n            img.style.height = this.height + 'px';\n            var top = this.height > $body.clientHeight ? 0 : ($body.clientHeight - this.height) / 2;\n            img.style.top = top + 'px';\n            img.style.marginLeft = -this.width / 2 + 'px';\n            img.classList.remove('transparent');\n            img.onload = null;\n        }\n        img.style.cssText = 'max-height:' + $body.clientHeight + 'px;max-width:' + $body.clientWidth + 'px;';\n        $layer.appendChild(img);\n        $layer.style.display = 'block';\n        setTimeout(function() {\n            $layer.classList.remove('transparent');\n        }, 0);\n\n    };\n    var $layer = document.createElement('div');\n    $layer.className = 'img-full transparent';\n    // $layer.innerHTML = '<img src=\"http://paulmason.name/media/demos/full-screen-background-image/background.jpg\" />';\n    $layer.addEventListener('click', function() {\n        $layer.style.display = 'none';\n        $layer.classList.add('transparent');\n    }, false);\n    var $body = document.body || document.getElementsByTagName('body')[0];\n    $body.appendChild($layer);\n    window.screenfull = sf;\n}(window, document));\n"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/.npmignore",
    "content": "/node_modules\n/.sass-cache\n/tmp\n"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/Gruntfile.js",
    "content": "var concatArr = [\n\t'src/intro.js',\n\t'src/getCurrentScript.js',\n\t'src/vars.js',\n\t'src/typeof.js',\n\t'src/browser.js',\n\t'src/Module.js',\n\t'src/Promise.js',\n\t'src/getPath.js',\n\t'src/loadjs.js',\n\t'src/loadcss-img.js',\n\t'src/core.js',\n\t'src/outro.js'];\nmodule.exports = function(grunt) {\n\tgrunt.initConfig({\n\t\tpkg: grunt.file.readJSON('package.json'),\n\t\tjshint: {\n\t\t\toptions: {\n\t\t\t\tnoarg: true,\n\t\t\t\tnoempty: true,\n\t\t\t\tcurly: true,\n\t\t\t\tasi: true,\n\t\t\t\texpr: true,\n\t\t\t\tbrowser: true,\n\t\t\t\tstrict: true,\n\t\t\t\tunused: true,\n\t\t\t\tundef: true,\n\t\t\t\tloopfunc: false,\n\t\t\t\tsub: true,\n\t\t\t\tboss: true,\n\t\t\t\teqnull: true\n\t\t\t},\n\t\t\tfiles: ['tmp/<%= pkg.name %>.js']\n\t\t},\n\t\twatch: {\n\t\t\tfiles: ['src/*.js'],\n\t\t\ttasks: 'dev'\n\t\t},\n\t\tconcat: {\n\t\t\tMixJS: {\n\t\t\t\toptions: {\n\t\t\t\t\tseparator: '\\n'\n\t\t\t\t},\n\t\t\t\tsrc: concatArr,\n\t\t\t\tdest: 'lib/<%= pkg.name %>.<%= pkg.version %>.js'\n\t\t\t},\n\t\t\tdev: {\n\t\t\t\toptions: {\n\t\t\t\t\tseparator: '\\n'\n\t\t\t\t},\n\t\t\t\tsrc: concatArr,\n\t\t\t\tdest: 'tmp/<%= pkg.name %>.js'\n\t\t\t}\n\t\t},\n\t\tuglify: {\n\t\t\toptions: {\n\t\t\t\tsourceMap: 'lib/<%= pkg.name %>.<%= pkg.version %>.map',\n\t\t\t\tbanner: '/*! <%= pkg.name %> <%= pkg.version %> <%= grunt.template.today(\"yyyy-mm-dd\") %> by <%= pkg.author %> */\\n'\n\t\t\t},\n\t\t\tdist: {\n\t\t\t\tsrc: '<%= concat.MixJS.dest %>',\n\t\t\t\tdest: 'lib/<%= pkg.name %>.<%= pkg.version %>.min.js'\n\t\t\t}\n\t\t},\n\t\tcompress: {\n\t\t\tmain: {\n\t\t\t\toptions: {\n\t\t\t\t\tarchive: '<%= pkg.name %>.zip'\n\t\t\t\t},\n\t\t\t\tfiles: [{\n\t\t\t\t\texpand: true,\n\t\t\t\t\tcwd: 'lib',\n\t\t\t\t\tsrc: ['**'],\n\t\t\t\t\tfilter: 'isFile'\n\t\t\t\t}]\n\t\t\t}\n\t\t}\n\t});\n\n\t// grunt.loadNpmTasks('grunt-regarde');\n\tgrunt.loadNpmTasks('grunt-contrib-uglify');\n\tgrunt.loadNpmTasks('grunt-contrib-jshint');\n\tgrunt.loadNpmTasks('grunt-contrib-watch');\n\tgrunt.loadNpmTasks('grunt-contrib-concat');\n\tgrunt.loadNpmTasks('grunt-contrib-compress');\n\t\n\tgrunt.registerTask('build', ['concat:MixJS', 'uglify']);\n\tgrunt.registerTask('dev', ['concat:dev', 'jshint']);\n\t\n};"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/MIT-LICENSE.txt",
    "content": "Copyright 2013 Theowang http://js8.in\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "ppt/think-in-css/js/mixjs/README.md",
    "content": "MixJS - Just Another Javascript Module Loader\n=============    \n                                                                                                \n    MMMMMMMM               MMMMMMMM  iiii                             JJJJJJJJJJJ   SSSSSSSSSSSSSSS \n    M:::::::M             M:::::::M i::::i                            J:::::::::J SS:::::::::::::::S\n    M::::::::M           M::::::::M  iiii                             J:::::::::JS:::::SSSSSS::::::S\n    M:::::::::M         M:::::::::M                                   JJ:::::::JJS:::::S     SSSSSSS\n    M::::::::::M       M::::::::::Miiiiiii xxxxxxx      xxxxxxx         J:::::J  S:::::S            \n    M:::::::::::M     M:::::::::::Mi:::::i  x:::::x    x:::::x          J:::::J  S:::::S            \n    M:::::::M::::M   M::::M:::::::M i::::i   x:::::x  x:::::x           J:::::J   S::::SSSS         \n    M::::::M M::::M M::::M M::::::M i::::i    x:::::xx:::::x            J:::::j    SS::::::SSSSS    \n    M::::::M  M::::M::::M  M::::::M i::::i     x::::::::::x             J:::::J      SSS::::::::SS  \n    M::::::M   M:::::::M   M::::::M i::::i      x::::::::x  JJJJJJJ     J:::::J         SSSSSS::::S \n    M::::::M    M:::::M    M::::::M i::::i      x::::::::x  J:::::J     J:::::J              S:::::S\n    M::::::M     MMMMM     M::::::M i::::i     x::::::::::x J::::::J   J::::::J              S:::::S\n    M::::::M               M::::::Mi::::::i   x:::::xx:::::xJ:::::::JJJ:::::::J  SSSSSSS     S:::::S\n    M::::::M               M::::::Mi::::::i  x:::::x  x:::::xJJ:::::::::::::JJ   S::::::SSSSSS:::::S\n    M::::::M               M::::::Mi::::::i x:::::x    x:::::x JJ:::::::::JJ     S:::::::::::::::SS \n    MMMMMMMM               MMMMMMMMiiiiiiiixxxxxxx      xxxxxxx  JJJJJJJJJ        SSSSSSSSSSSSSSS   \n\nversion: 0.3.0 butterfly\n\nCome back soon!!\n"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/lib/event/broadcast.js",
    "content": "/**\n * 广播事件处理\n * 状态：稳定\n * \n * 目标: 为了尽可能的减少模块之间业务逻辑的耦合度, 而开发了这个eventbus, 主要用于业务逻辑的事件传递\n * 使用规范: 每个js模块尽可能通过事件去通信, 减少模块之间的直接调用和依赖(耦合)\n * 使用示例：\n *     //触发\n *     MixJS.event.broadcast.fire('abc',{abc:1}) \n *     //订阅\n *     MixJS.event.broadcast.on('abc',function(a){\n *         console.log(a);\n *     }, scope);\n    \n * @return {[type]} \n * @author  theowang\n * $Id: broadcast.js 65871 2012-11-05 01:51:42Z theowang $\n */\nMixJS.define('event/broadcast',function($){\n    var _cache = {};\n    var broadcast = {\n        \n        /**\n         * 派发         \n         * @param  {[type]} type 事件类型\n         * @param  {[type]} data 回调数据\n         * @return {[type]}      [description]\n         */\n        fire:function(type, data){\n            var listeners = _cache[type],len = 0;\n            if(!$.isUndefined(listeners)){\n                var args = [].slice.call(arguments, 0);\n                args = args.length > 2 ? args.splice(2, args.length-1) : [];\n                args = [data].concat(args);\n\n                len = listeners.length;\n                for(var i = 0; i<len;i++){\n                    var listener = listeners[i];\n                    if(listener && listener.callback) {\n                        args = args.concat(listener.args);\n                        listener.callback.apply(listener.scope, args);\n                    }\n                }\n            }\n            return this;\n        },\n        /**\n         * 订阅广播事件\n         * @param  {[type]}   types     事件类型，支持,分隔符\n         * @param  {Function} callback 回调函数\n         * @param  {[type]}   scope    回调函数上下文\n         * @return {[type]}            this\n         */\n        on:function(types, callback, scope){\n            types = types || [];\n            var args = [].slice.call(arguments);\n\n            if($.isString(types)){\n                types = types.split(',');\n            }\n            var len = types.length;\n            if(len===0){\n                return this;\n            }\n            args = args.length > 3 ? args.splice(3, args.length-1) : [];\n            for(var i = 0;i<len;i++){\n                var type = types[i];\n                _cache[type] = _cache[type] || [];\n                _cache[type].push({callback:callback,scope:scope,args:args});\n            }\n            return this;\n        },\n        /**\n         * 退订\n         * @param  {[type]}   type     [description]\n         * @param  {Function} callback 假如传入则移出传入的监控事件，否则移出全部\n         * @return {[type]}            [description]\n         */\n        un:function(type, callback, scope){\n            var listeners = _cache[type];\n            if (!listeners) {\n                return this;\n            }\n            if(callback){\n                var len = listeners.length,\n                    tmp = [];\n                \n                for(var i=0; i<len; i++) {\n                    var listener = listeners[i];\n                    if(listener.callback == callback && listener.scope == scope) {\n                    } else {\n                        tmp.push(listener);\n                    }\n                }\n                listeners = tmp;\n            }else{\n                listeners.length = 0;\n            }\n            return this;\n        },\n        \n        \n        removeAll:function(){\n            _cache = {};\n            return this;\n        }\n    };\n    return broadcast;\n});"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/lib/event/wait.js",
    "content": "/**\n * 一个简单的事件流处理\n * 状态：稳定\n * 支持多投事件，支持异步回调处理\n * 使用示例：\n * \t\tvar a = MixJS.event.wait();\n *   \ta.on('a,b,c', function(a,b,c){\n *   \t\talert('success');\n *   \t});\n *   \t$.post(url,data, function(res){\n *   \t\ta.fire('a', res);\n *   \t});\n *   \t$.get(url, function(json){\n *   \t\ta.fire('b', json)\n *   \t})\n *   \tsetTimeout(function(){\n *   \t\ta.fire('c')\n *   \t},1000);\n */\nMixJS.define('event/wait', function($) {\n\tvar _emptyFn = function() {};\n\tvar now = +new Date;\n\n\tfunction getUUid() {\n\t\treturn 'Theo' + (now++);\n\t}\n\t// var _emptyArr = [];\n\n\n\tfunction Wait() {\n\t\t// 强制使用new操作符\n\t\tif(!(this instanceof Wait)) {\n\t\t\treturn new Wait();\n\t\t}\n\t\tthis.init();\n\t}\n\n\tWait.prototype = {\n\t\tconstructor: Wait,\n\t\tinit:function(){\n\t\t\tthis.list = {}; //evt=>uuid array\n\t\t\tthis.cbMap = {}; //uuid=>callback\n\t\t\tthis.uuid2Evts = {}; //uuid=>evt array\n\t\t\tthis._cbMap = {}; //callback=>uuid\n\t\t},\n\t\t/**\n\t\t * 绑定事件\n\t\t * @param  {Array}   evts     事件数组\n\t\t * @param  {Function} callback 回调函数\n\t\t * @param  {Object}   scope    函数作用域\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\ton: function(evts, callback, scope) {\n\t\t\tif(!$.isFunction(callback) || !evts) {\n\t\t\t\t//如果不是函数，或者evts为空，则直接返回\n\t\t\t\t//不抛出异常\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tscope = scope || null; //回调作用域\n\t\t\t\n\t\t\tevts = $.isArray(evts) ? evts : evts.split(',');\n\n\t\t\tvar uuid = getUUid();\n\t\t\tthis.cbMap[uuid] = {\n\t\t\t\tfn: callback,\n\t\t\t\tscope: scope\n\t\t\t};\n\t\t\tthis._cbMap[callback] = uuid;\n\n\t\t\t$.each(evts, function(e, i) {\n\t\t\t\tthis.list[e] = this.list[e] || {\n\t\t\t\t\thandlers: [],\n\t\t\t\t\t//待处理的uuid\n\t\t\t\t\tdata: '',\n\t\t\t\t\tstate: 0\n\t\t\t\t};\n\n\t\t\t\t(this.uuid2Evts[uuid] = this.uuid2Evts[uuid] || []).push(e);\n\n\t\t\t\tthis.list[e].handlers.push(uuid); //使用uuid记录\n\t\t\t}, this)\n\n\n\t\t\treturn this;\n\t\t},\n\t\t_findCanCallbacks: function(arr) {\n\t\t\tvar back = [];\n\t\t\tfor(var i = 0, len = arr.length; i < len; i++) {\n\t\t\t\tvar uuid = arr[i];\n\t\t\t\tvar evts = this.uuid2Evts[uuid];\n\t\t\t\tvar doit = true;\n\t\t\t\tvar args = [];\n\t\t\t\tfor(var j = 0, l = evts.length; j < l; j++) {\n\t\t\t\t\tvar tmp = this.list[evts[j]];\n\t\t\t\t\tif(tmp.state === 0) {\n\t\t\t\t\t\tdoit = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\targs.push(tmp.data);\n\t\t\t\t}\n\t\t\t\tif(doit) {\n\t\t\t\t\tthis.cbMap[uuid].args = args;\n\t\t\t\t\tback.push(this.cbMap[uuid]);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn back;\n\t\t},\n\t\t/**\n\t\t * 触发事件\n\t\t * @param  {String} evt  事件类型\n\t\t * @param  {[type]} data 事件数据\n\t\t * @return {[type]}      this\n\t\t */\n\t\tfire: function(evt, data) {\n\t\t\tvar list = this.list[evt];\n\t\t\tif(!list) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tlist.state = 1; //标注为可以fire\n\t\t\tlist.data = data || '';\n\t\t\tvar handlers = list.handlers;\n\t\t\thandlers = this._findCanCallbacks(handlers);\n\t\t\twhile(handlers[0]) {\n\t\t\t\tvar cb = handlers.shift();\n\n\t\t\t\tvar scope = cb.scope;\n\t\t\t\tvar args = cb.args;\n\n\t\t\t\tcb.fn.apply(scope, args)\n\t\t\t}\n\n\t\t\treturn this;\n\t\t},\n\t\t/**\n\t\t * 移出绑定事件\n\t\t * @param  {String}   evt      事件名称\n\t\t * @param  {Function} callback 回调函数\n\t\t * @return {[type]}            [description]\n\t\t */\n\t\tun: function(evt, callback) {\n\t\t\tif($.isUndefined(evt) || !$.isFunction(callback)) {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tvar list = this.list[evt];\n\t\t\tif(!list) {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t\tvar uuid = this._cbMap[callback];\n\t\t\tvar handlers = list.handlers;\n\t\t\tvar len = handlers.length;\n\n\t\t\twhile(len--) {\n\t\t\t\tif(uuid === handlers[len]) {\n\t\t\t\t\thandlers.splice(len, 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdelete this._cbMap[callback];\n\n\t\t\treturn this;\n\t\t},\n\t\t/**\n\t\t * 移出所有事件，重新初始化\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tremoveAll:function(){\n\t\t\tthis.destroy();\n\n\t\t\tthis.init();\n\t\t},\n\t\t/**\n\t\t * 销毁！\n\t\t * @return {[type]} [description]\n\t\t */\n\t\tdestroy: function() {\n\t\t\tdestroy(this);\n\t\t}\n\t}\n\n\tfunction destroy(obj) {\n\t\tvar selfFn = arguments.callee;\n\t\tfor(var a in obj) {\n\t\t\tif(obj.hasOwnProperty(a)) {\n\t\t\t\tif($.isArray(obj[a])) {\n\t\t\t\t\tobj[a].length = 0;\n\t\t\t\t} else if(typeof obj[a] === 'object') {\n\t\t\t\t\tselfFn(obj[a]);\n\t\t\t\t}\n\t\t\t\tdelete obj[a];\n\t\t\t}\n\t\t}\n\t}\n\treturn function() {\n\t\treturn new Wait;\n\t}\n})"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/lib/mix-0.2.js",
    "content": ";(function(global, DOC, undefined) {\n    var VERSION = '0.2',\n        curScriptNode = (function(scripts, node) {\n            scripts = DOC.getElementsByTagName('script');\n            node = scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n            return node;\n        })(),\n        isDebug = !! curScriptNode.getAttribute('debug'),\n        MixJSName = curScriptNode.getAttribute('name') || 'MixJS',\n        CHARSET = curScriptNode.getAttribute('charset') || 'utf-8',\n\n        //获取当前文件父路径\n        PATH = (function(node) {\n            var url = node.hasAttribute ? // non-IE6/7\n            node.src :\n            // see http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx\n            node.getAttribute('src', 4);\n            return url.substr(0, url.lastIndexOf('/')) + '/';\n        })(curScriptNode),\n        HEAD = DOC.head || DOC.getElementsByTagName('head')[0] || DOC.documentElement,\n        BASEELEMENT = HEAD.getElementsByTagName('base')[0] || null,\n        UA = navigator.userAgent,\n        isWebKit = ~UA.indexOf('AppleWebKit'),\n\n        reg = /[^, ]+/g,\n\n        _cleanObj = {},\n        _emptyArr = [],\n        _emptyFn = function() {},\n        _arrSlice = _emptyArr.slice,\n        /**\n         * 数组遍历\n         * @param  {[type]}   arr      [description]\n         * @param  {Function} callback [description] arrvalue index arr\n         * @param  {[type]}   scope    [description]\n         * @return {[type]}            [description]\n         */\n        each = [].forEach ?\n            function(arr, callback, scope) {\n                [].forEach.call(arr, callback, scope);\n            } : function(arr, callback, scope) {\n                for(var i = 0, len = arr.length; i < len; i++) {\n                    if(i in arr) {\n                        callback.call(scope, arr[i], i, arr);\n                    }\n                }\n            };\n\n    var config = {\n            path: PATH,\n            perload: _emptyArr,\n            //预先加载库\n            debug: isDebug,\n            charset: CHARSET\n        },\n        alias = {},\n        regAlias = /^[-\\w\\d_$]{2,}$/i,\n        _moduleDepsMap = {},\n        _filesMap = {},\n        //1:加载之前，2:加载中，3:加载完成\n        _modulesMap = {}; //1：定义之前 2：等待依赖关系中 3：定义完成\n    var $ = {\n        VERSION: VERSION,\n        path:PATH,\n        /**\n         * 别名机制\n         * @param  {String} name 名字\n         * @param  {String} realpath  别名真实url\n         * @return {[type]}      [description]\n         */\n        alias: function(name,arr){\n            if(regAlias.test(name)){\n                if($.isUndefined(arr)){\n                    return alias[name];\n                }else{\n                    arr = String(arr);\n                    alias[name] = arr;\n                    return this;\n                }\n\n            }else{\n                throw new Error('MixJS.alias name 格式错误');\n            }\n            return this;\n        },\n        use: function(names, callback) {\n            names = dealArr(names);\n            if(names.length === 0) {\n                $.isFunction(callback) && callback();\n                return this;\n            }\n            var temp = [], self = this;\n            each(names, function(v) {\n                var arr = getPath(v),\n                    ext = arr[1],\n                    moduleId = arr[2],\n                    url = arr[0];\n                    \n                if(!defined(moduleId) || (ext==='css' && _filesMap[url]===3)) {\n                    temp.push(moduleId);\n                    \n                   \n                    var cb = function() {\n                        //_modulesMap[v] = 3;\n                        _filesMap[url] = 3;\n                        temp.pop();\n\n                        if(temp.length === 0) {\n                            var t = function() {\n                                    \n                                    if(defined(moduleId) || ext==='css') {\n\n                                        $.isFunction(callback) && callback(self);\n\n                                    } else {\n                                        var q = Queue.useCallback[moduleId];\n                                        q = q ? q : (Queue.useCallback[moduleId] = new Queue(moduleId));\n                                        // console.log(q);\n                                        q.push(arguments.callee);\n\n                                    }\n                                }\n                            t();\n                            temp = null;\n                        }\n                    };\n                    // console.log(arr);\n                    ext==='css'?loadCSS(url,cb):loadJS(url, cb);\n                }\n\n            });\n            return this;\n        },\n        define: function(name, deps, factory) {\n            if(!$.isString(name)) {\n                throw new Error('MixJS.define: name 必须为字符串');\n            }\n            if($.isFunction(deps)) {\n                factory = deps;\n                deps = _emptyArr;\n            } else {\n                deps = dealArr(deps, 'define', name);\n            }\n\n            _moduleDepsMap[name] = deps;\n\n            new Module(name, deps, factory)\n            return this;\n        },\n        config: function(cfg) {\n\n            config = mix(config, cfg);\n            return this;\n        },\n        loadJS:loadJS,\n        loadCSS:loadCSS,\n        defined: defined,\n        loaded: function(file) {\n            var url = getPath(file)[0];\n            return loaded(url);\n        },\n        mix: mix,\n        each: each,\n        noConflict:function(){\n            return this;\n        }\n    };\n\n\n\n    //基本类型判断\n    'Function,String,Array,Number'.replace(reg, function(t) {\n        $['is' + t] = function(s) {\n            return isType(s, t)\n        }\n    });\n\n    if(typeof(/./) !== 'function') {\n        $.isFunction = function(obj) {\n            return typeof obj === 'function';\n        };\n    }   \n\n\n    $.isBoolean = function(obj) {\n        return obj === true || obj === false || isType(obj,'Boolean')\n    };\n\n    $.isUndefined = function(obj) {\n        return obj === undefined;\n        //return obj === void 0;\n    };\n\n\n    //释放到window\n    global[MixJSName] = $;\n    MixJSName !== 'MixJS' && (global.MixJS = $);\n\n    /**\n     * 判断模块是否定义\n     * @param  {[type]} module [description]\n     * @return {[type]}        [description]\n     */\n\n    function defined(module) {\n\n        return _modulesMap[module] === 3;\n    }\n    /**\n     * 判断文件是否加载\n     * @param  {[type]} file [description]\n     * @return {[type]}      [description]\n     */\n\n    function loaded(file) {\n\n        return _filesMap[file] === 3;\n    }\n\n\n    /**\n     * 数组去重复项和去除空项\n     * @param  {[type]} arr [description]\n     * @return {[type]}     [description]\n     */\n\n    function dealArr(arr, isFromDefine, mName) {\n        arr = String(arr).split(',');\n        var len = arr.length;\n        if(len === 0) {\n            return arr[0] === '' ? _emptyArr : arr;\n        }\n        var back = [],\n            obj = {},\n            val;\n        for(var i = 0; i < len; i++) {\n            val = arr[i];\n\n            if(val !== '' && !obj[val]) {\n                obj[val] = 1;\n                back.push(val);\n\n                isFromDefine === 'define' && (Module.parentModule[val] = mName); //定义父模块               \n            }\n        }\n        obj = null;\n        return back;\n    }\n\n\n    /**\n     * 检测依赖关系是否都加载完成\n     * _moduleDepsMap = {\n     *     test.a:[a,b,c]\n     *     a:[d,e]\n     * }\n     * @return {[type]} [description]\n     */\n\n    function checkDeps(module) {\n        var arr = _moduleDepsMap[module];\n        \n        if(!arr || arr.length===0) {\n            return true;\n        }\n        var obj = {},\n            back = true;\n\n        for(var i = 0, len = arr.length; i < len; i++) {\n            var m = arr[i];\n            \n            if(m===module){\n                throw new Error(module + '： 发现循环依赖');\n            }\n            if(obj[m] === 1) {\n                //简单去重，不能保证二次依赖去重复\n                continue;\n            }\n            \n            if(regAlias.test(m) && alias[m]){\n                //如果是alias模块\n                if(loaded(alias[m])){\n                    obj[m] = 1;\n                    continue;\n                }\n                back = false;\n                break;\n            }\n            \n            if(regISCSS.test(m)){\n                //如果是css文件\n                if(loaded(getPath(m)[0])){\n                    obj[m] = 1;\n                    continue;\n                }\n                back = false;\n                break;             \n            }\n\n            var temp = _moduleDepsMap[m];\n\n            if(temp && !(back = checkDeps(m))) {\n\n                break;\n\n            } else if(!defined(m)) {\n                back = false;\n                break;\n            } else {\n                obj[m] = 1;\n            }\n        }\n        obj = null;\n        return back;\n    }\n\n    var _waitModule = {}; //等待转正的module实例\n    /**\n     * 模块类\n     * @param {[type]} id    模块名称\n     * @param {Array} deps  依赖模块\n     * @param {[type]} maker 制造函数\n     * @param {[type]} root  父模块，默认是MixJS\n     */\n\n    function Module(id, deps, maker, root) {\n\n        this.id = id;\n        this.deps = deps; //必须是数组\n        this.maker = maker;\n        this.root = root || $;\n        // _modulesMap[id] = 1;//定义之前\n        // this.queue = new Queue();\n        if(checkDeps(id)) {\n\n            this.namespace();\n\n        } else {\n\n            this.init();\n        }\n    }\n    Module.parentModule = {};\n    Module.prototype.init = function() {\n        _waitModule[this.id] = this;\n        var self = this;\n        $.use(this.deps, function() {\n            self.namespace();\n        })\n    }\n    Module.prototype.destroy = function() {\n        for(var a in this) {\n            if(this.hasOwnProperty(a)) {\n                delete this[a];\n            }\n        }\n    }\n    Module.prototype.namespace = function() {\n        if(!this.id) {\n            return;\n        }\n        // _modulesMap[this.id] = 2;//定义等待中，可能因为依赖关系没有加载而处于等待中\n        if(!checkDeps(this.id)) {\n\n            return;\n        }\n\n        var names = this.id.split('/'),\n            root = this.root;\n\n        var name;\n        while(name = names.shift()) {\n            if(names.length) {\n                // console.log(root);            \n                root = (root[name] = root[name] || {});\n            } else {\n                if($.isUndefined(root[name])) {\n\n                    try {\n                        var f = $.isFunction(this.maker) && this.maker(this.root);\n                        if(f) {\n\n                            f['@GOD'] = 'THEO'; //加个尾巴~\n                            root[name] = f;\n                            _modulesMap[this.id] = 3;\n\n                        }\n                    } catch(e) {\n                        // Module._definedModulesMap[this.id] = 2;//模块定义可能出错了\n                        throw new Error('Module.namespace error:id=>' + this.id + ',info=>' + e.message);\n                    }\n                }\n            }\n        }\n        var parent = Module.parentModule[this.id];\n        if(parent && _waitModule[parent]) {\n            _waitModule[parent].namespace();\n        }\n        var q = Queue.useCallback[this.id];\n        if(q) {\n            q.fire();\n        }\n\n        delete _waitModule[this.id];\n        this.destroy();\n    }\n\n    var regProtocol = /^(\\w+)(\\d)?:.*/,\n        //协议\n        regISJS = /\\.js$/i,\n        //是否为js\n        regISCSS = /\\.css$/i,\n        //是否为css\n        regRelative = /\\.\\.\\//g,\n        //相对路径处理\n        regEXT = /\\.(\\w+)$/; //后缀2~4\n    /**\n     * 获取真实url\n     * 来自massframework\n     * @param  {[type]} url [description]\n     * @return {[type]}     [description]\n     */\n\n    function getPath(url, root) {\n        var ret;\n\n        root = root || config.path;\n        root = root.substr(0, root.lastIndexOf('/'));\n        id = url;//模块id\n\n        if(regAlias.test(url) && alias[url]){\n            ret = alias[url];\n\n        }else if(regProtocol.test(url)) { //如果用户路径包含协议\n            ret = url;\n        } else {\n            var tmp = url.charAt(0),\n                _2 = url.slice(0, 2);\n\n            if(tmp !== '.' && tmp !== '/') { //相对于根路径\n                ret = root + '/' + url;\n            } else if(_2 === './') { //相对于兄弟路径\n                id = url.substr(2);\n                ret = root + '/' + id;\n            } else if(_2 === '..') { //相对于父路径\n                // var arr = root.replace(/\\/$/, '').split('/');\n                var arr = root.split('/');\n                regRelative.lastIndex = 0;\n                tmp = url.replace(regRelative, function() {\n                    arr.pop();\n                    return '';\n                });\n                id = tmp;\n                ret = arr.join('/') + '/' + tmp;\n            }\n        }\n\n        var ext = 'js'; //默认是js文件\n        tmp = ret.replace(/[?#].*/, '');\n        if(regEXT.test(tmp)) {\n            ext = RegExp.$1;\n        }\n        if(ext !== 'css' && tmp === ret && !regISJS.test(ret)) { //如果没有后缀名会补上.js\n            ret += '.js';\n        }\n        return [ret, ext, id];\n    }\n\n    /**\n     * 一个简单队列\n     * @param {[type]} id [description]\n     */\n\n    function Queue(id) {\n        this.id = id;\n        this.taskList = [];\n    }\n    Queue.useCallback = {}; //放置use使用的callback\n    /**\n     * 从后部推入\n     * @param  {Function} fn    [description]\n     * @param  {[type]}   args  [description]\n     * @param  {[type]}   scope [description]\n     * @return {[type]}         [description]\n     */\n    Queue.prototype.push = function(fn, args, scope) {\n        return this._add(fn, args, scope, 'push');\n    }\n    Queue.prototype.unshift = function(fn, args, scope) {\n        return this._add(fn, args, scope, 'unshift');\n    }\n    Queue.prototype._add = function(fn, args, scope, type) {\n        if(!type) {\n            return this;\n        }\n        args = _arrSlice.call(arguments, 0, -1);\n        if(args.length === 0) {\n            return this;\n        }\n\n        this.taskList[type](args);\n        return this;\n    }\n    /**\n     * 从后部弹出\n     * @return {[type]} [description]\n     */\n    Queue.prototype.fire = function() {\n        if(this._canIDo()) {\n            var fn = this.taskList.pop();\n\n            var args = $.isArray(fn[1]) ? fn[1] : [],\n                scope = fn[2] || null;\n            fn = fn[0];\n\n            // argsFromCall = $.isArray(argsFromCall)?argsFromCall:[argsFromCall];\n            // args = args.concat(argsFromCall);\n            $.isFunction(fn) && fn.apply(scope, args);\n            this.destroy();\n        }\n        return this;\n    }\n    Queue.prototype.destroy = function() {\n\n\n        this.taskList.length = 0;\n        delete this.taskList;\n        delete Queue.useCallback[this.id]; //记得用完要销毁罪证哦~\n        delete this.id;\n        // delete Queue.modules[this.moduleName];\n    }\n    Queue.prototype._canIDo = function() {\n        return this.taskList.length !== 0;\n    }\n\n\n\n    /**\n     * 加载js\n     * @param  {[type]}   url      [description]\n     * @param  {Function} callback [description]\n     * @param  {[type]}   fail     [description]\n     * @param  {[type]}   charset  [description]\n     * @return {[type]}            [description]\n     */\n\n    function loadJS(url, callback, fail, charset) {\n        var node = DOC.createElement('script');\n        var args = _arrSlice.call(arguments, 0);\n        if($.isString(fail) && args.length === 3) {\n            //如果fail为字符串，认为是charset\n            charset = fail;\n        } else if(args.length === 4 && $.isString(charset)) {\n\n        } else {\n            charset = config.charset;\n        }\n        $.isFunction(callback) && jsCallback(node, callback, fail);\n\n        node.charset = charset;\n        node.async = true;\n        node.src = url;\n        HEAD.insertBefore(node, BASEELEMENT);\n        return $;\n    }\n\n    //jscallback检测\n    var regJSLOAD = /loaded|complete|undefined/;\n\n    function jsCallback(node, callback, fail) {\n\n        if($.isFunction(fail)) {\n            node.onerror = jsGetCallback(node, fail);\n            node.onload = node.onreadystatechange = jsGetCallback(node, callback);\n        } else {\n            node.onload = node.onerror = node.onreadystatechange = jsGetCallback(node, callback);\n        }\n\n    }\n    //js可以检测error，所以加上了这个函数\n\n    function jsGetCallback(node, cb) {\n        return function(e) {\n            e = e || global.event;\n            \n            if(e.type === 'load' || regJSLOAD.test(node.readyState)) {\n                \n                //确保执行一次+内存回收\n                node.onload = node.onerror = node.onreadystatechange = null\n\n                if(node.parentNode && !config.debug) {\n                    HEAD.removeChild(node)\n                }\n            \n                node = undefined\n\n                cb()\n            }\n        }\n\n    }\n    /**\n     * 加载css文件\n     * @param  {[type]}   url      [description]\n     * @param  {Function} callback [description]\n     * @return {[type]}            [description]\n     */\n\n    function loadCSS(url, callback, fail) {\n        var node = DOC.createElement('link');\n        node.rel = 'stylesheet';\n        node.type = \"text/css\";\n\n        cssCallback(node, callback, fail);\n\n        node.href = url;\n        HEAD.insertBefore(node, BASEELEMENT);\n        return $;\n    }\n    ///===============>css load检测来自seajs\n    // `onload` event is supported in WebKit since 535.23\n    // Ref:\n    //  - https://bugs.webkit.org/show_activity.cgi?id=38995\n    var isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n\n    // `onload/onerror` event is supported since Firefox 9.0\n    // Ref:\n    //  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n    //  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\n    var isOldFirefox = UA.indexOf('Firefox') > 0 && !('onload' in DOC.createElement('link'));\n    var cssCallback = (isOldWebKit || isOldFirefox) ?\n    function(node, callback, fail) {\n        $.isFunction(callback) && \n        setTimeout(function() {\n            poll(node, callback)\n        }, 1) // Begin after node insertion\n    } : function(node, callback, fail) {\n        $.isFunction(callback) && (node.onload = function() {\n            node.onload = node.onerror = null\n            node = undefined\n            callback()\n        });\n        $.isFunction(fail) && (node.onerror = function(){\n            node.onload = node.onerror = null\n            node = undefined\n            fail()\n        });\n    }\n\n    function poll(node, callback) {\n        var isLoaded\n\n        // for WebKit < 536\n        if(isOldWebKit) {\n            if(node.sheet) {\n                isLoaded = true\n            }\n        }\n        // for Firefox < 9.0\n        else if(node.sheet) {\n            try {\n                if(node.sheet.cssRules) {\n                    isLoaded = true\n                }\n            } catch(ex) {\n                // The value of `ex.name` is changed from\n                // 'NS_ERROR_DOM_SECURITY_ERR' to 'SecurityError' since Firefox 13.0\n                // But Firefox is less than 9.0 in here, So it is ok to just rely on\n                // 'NS_ERROR_DOM_SECURITY_ERR'\n                if(ex.name === 'NS_ERROR_DOM_SECURITY_ERR') {\n                    isLoaded = true\n                }\n            }\n        }\n\n        setTimeout(function() {\n            if(isLoaded) {\n                // Place callback in here due to giving time for style rendering.\n                callback()\n            } else {\n                poll(node, callback)\n            }\n        }, 1)\n    }\n\n    /**\n     * 获取类型\n     * @param  {[type]} obj 要判断的对象\n     * @return {String}     返回类型\n     */\n\n    function isType(obj, type) {\n        return _cleanObj.toString.call(obj).slice(8, -1) === type;\n    }\n\n    /**\n     * 糅杂\n     * @param {Object} target 原有的默认\n     * @param {Object} source 第三方来源\n     */\n\n    function mix(target, source) {\n        var args = _arrSlice.call(arguments),\n            i = 1,\n            key, self = arguments.callee,\n            //如果最后参数是布尔，判定是否覆写同名属性\n            ride = $.isBoolean(args[args.length - 1]) ? args.pop() : true;\n        if(args.length === 1) {\n            target = !this.window ? this : _cleanObj;\n            i = 0;\n        }\n\n        while((source = args[i++])) {\n            //source = [{a:1},{b:3}];\n            if($.isArray(source)) {\n                for(var n = 0, len = source.length; n < len; n++) {\n                    self(target, source[n], ride);\n                }\n\n                continue;\n            }\n            //杂糅只允许对象\n            for(key in source) {\n                if(ride || !(key in target)) {\n                    target[key] = source[key];\n                }\n            }\n        }\n        return target;\n    }\n}(window, document));"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/lib/mix.0.3.0.js",
    "content": "(function(window, undefined) {\n'use strict';\nvar document = window.document;\nvar setTimeout = window.setTimeout;\n//本js文件不支持defer等属性，否则计算当前路径会错误\n//模块加载的东西，基础js肯定不能defer掉……\nvar curScriptNode = (function() {\n    var scripts = document.getElementsByTagName('script');\n    return scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n})();\nvar VERSION = 'MixJS 0.3 butterfly';\nvar emptyFn = function() {};\nvar cleanObj = {};\nvar emptyArr = [];\nvar head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;\nvar base = head.getElementsByTagName('base')[0] || null;\nvar arrSlice = emptyArr.slice;\n\n//获取当前文件父路径\nvar PATH = (function(node) {\n    var url = node.hasAttribute ? node.src : node.getAttribute('src', 4);\n    return url.substr(0, url.lastIndexOf('/')) + '/';\n})(curScriptNode);\n\n//是否为js\nvar regIsJS = /\\.js$/i;\n//是否为css\nvar regIsCSS = /\\.css$/i;\n//alias\nvar regAlias = /^[-\\w\\d_$]{2,}$/i;\nvar $ = {};\n\nvar defaultConfig = {\n    timeout: 2E4, //超时时间二十秒\n    baseURL: PATH,\n    charset: 'utf-8'\n};\n\n//=============>maps\n//别名列表\nvar mapAlias = {};\n//加载完的文件列表\nvar mapLoaded = {};\n//已经定义模块的状态表：undefined|pending|defined\nvar mapDefined = {};\n//通过依赖找上一级模块的promise\nvar mapDeps2ModulePromise = {};\n//基本类型判断\n'Function,String,Array,Number'.replace(/[^, ]+/g, function(t) {\n    $['is' + t] = function(s) {\n        return isType(s, t);\n    }\n});\nif (typeof(/./) !== 'function') {\n    $.isFunction = function(obj) {\n        return typeof obj === 'function';\n    };\n}\n$.isObject = function(obj) {\n    return typeof obj === 'object';\n}\n\n$.isBoolean = function(obj) {\n    return obj === true || obj === false || isType(obj, 'Boolean');\n};\n\n$.isUndefined = function(obj) {\n    return obj === undefined;\n};\n\n/**\n * 获取类型\n * @param  {Object} obj 要判断的对象\n * @return {String}     返回类型\n */\n\nfunction isType(obj, type) {\n    return cleanObj.toString.call(obj).slice(8, -1) === type;\n}\nvar UA = window.navigator.userAgent;\n\n/**\n * Module类\n * @param {String} id      moduleID\n * @param {Array} deps    依赖模块\n * @param {Function} factory 工厂函数\n * @param {Object} root    相对定义的root\n */\n\nfunction Module(id, deps, factory, root) {\n    if (arguments.length === 0) {\n        throw new Error('Module: I need a agrument');\n    }\n    if ($.isFunction(id)) {\n        factory = id;\n        id = undefined;\n        deps = emptyArr;\n    } else if ($.isArray(id)) {\n        deps = emptyArr;\n        id = undefined;\n    } else if ($.isFunction(deps)) {\n        factory = deps;\n        deps = emptyArr;\n    }\n    this.id = id ? getPath(id)[2] : id;\n    this.status = 'uninitialized';\n    if ($.isString(deps)) {\n        deps = deps.split(',');\n    }\n    this.dependencies = deps;\n    this.factory = factory;\n    this.root = root || _; //默认挂靠在window全局，使用_，默认挂靠到MixJS上\n    this.undef = []; //没有定义的模块\n    this.id && (mapDefined[this.id] = 'uninitialized');\n    this.checkDependencies(deps);\n    this.define();\n}\nModule.prototype = {\n    constructor: Module,\n    //定义\n    define: function() {\n        if (this.canDefine()) {\n            this.namespace();\n        } else if (this.status !== 'pending') {\n            this.status = 'pending';\n            this.id && (mapDefined[this.id] = this.status);\n            this.loadDeps();\n        }\n    },\n    //命名空间\n    namespace: function() {\n        var names = $.isString(this.id) ? this.id.split('/') : emptyArr;\n        var root = this.root;\n        var name, lastName;\n        while (name = names.shift()) {\n            lastName = name;\n            if (names.length) {\n                root = (root[name] = root[name] || {});\n            }\n        }\n        try {\n            var f = $.isFunction(this.factory) && this.factory.apply(window, this.getArgs());\n            if (f) {\n                f.amd = 'THEO'; //加个尾巴~\n                root[lastName] = f;\n                this.id && (mapDefined[this.id] = 'defined');\n            }\n        } catch (e) {\n            if (this.id) {\n                mapDefined[this.id] = 'error';\n            }\n            throw new Error('Module.namespace error:id=>' + this.id + ';undef=>' + this.undef.join(',') + ';info=>' + e.message);\n        }\n        //解决掉触发调用模块的promise\n        if (this.id && $.isArray(mapDeps2ModulePromise[this.id])) {\n            _.each(mapDeps2ModulePromise[this.id], function(v) {\n                if (isPromise(v)) {\n                    v.resolve();\n                }\n            });\n        }\n        this.destroy();\n    },\n    //根据模块名称，获取模块\n    getFn: function(names) {\n        names = names.split('/');\n        var root = this.root;\n        var name;\n        while (name = names.shift()) {\n            root = root[name];\n        }\n        return root;\n    },\n    //获取factory函数参数数组\n    getArgs: function() {\n        var arr = this.dependencies;\n        var v;\n        var fns = [this.root];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            v = arr[i];\n            fns.push(this.getFn(v));\n        }\n        return fns;\n    },\n    //判断是否符合转正标准\n    canDefine: function() {\n        var arr = this.undef;\n        var len = arr.length;\n        var temp;\n        while (len--) {\n            temp = arr[len];\n            if (!defined(temp)) {\n                if ((regIsCSS.test(temp) || regIsJS.test(temp)) && _.loaded(temp)) {\n                    continue;\n                }\n                return false;\n            }\n        }\n        return true;\n    },\n    //加载依赖\n    loadDeps: function() {\n        var self = this;\n        var promise;\n        var modules = self.undef;\n        _.each(modules, function(v) {\n            promise = new Promise();\n            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n            mapDeps2ModulePromise[v].push(promise.done(function() {\n                self.define();\n            }));\n            if (mapDefined[v] !== 'pending') {\n                var alias = _.alias(v);\n\n                if (alias && alias.length) {\n                    //如果存在alias\n                    var p = new Promise();\n\n                    p.done(function() {\n                        self.define()\n                    });\n                    //如果是普通js和css\n                    //不支持有依赖关系的alias模块类型的js\n                    var len = alias.length;\n                    var cb = function() {\n                        len--;\n                        if (len === 0) {\n                            mapDefined[v] = 'defined'; //标注alias被定义过了~\n                            p.resolve();\n                        }\n                    };\n                    _.each(alias, function(v) {\n                        if (regIsCSS.test(v)) {\n                            _.loadCSS(v, cb);\n                        } else if (regIsJS.test(v)) {\n                            _.loadJS(v, cb);\n                        } else {\n                            var tempPromise = new Promise();\n                            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n                            mapDeps2ModulePromise[v].push(tempPromise.done(cb));\n                            _.loadJS(v);\n                        }\n                    });\n                } else if (regIsCSS.test(v)) {\n                    //css文件\n                    _.loadCSS(v, function() {\n                        self.define();\n                    });\n                } else if (regIsJS.test(v)) {\n                    //js文件\n                    _.loadJS(v, function() {\n                        self.define();\n                    });\n                } else {\n                    //模块\n                    _.loadJS(v);\n                }\n            }\n        });\n    },\n    //首次检测依赖关系，对已经定义和未定义的模块进行分组\n    checkDependencies: function(deps) {\n        var self = this;\n        _.each(deps, function(v) {\n            v = getPath(v)[2];\n            if (!defined(v)) {\n                self.undef.push(v);\n            }\n        });\n    },\n    //销毁函数\n    destroy: function() {\n        destroy(this);\n    }\n};\n\n/**\n * 判断是否为amd模块\n * @param  {Object}  obj 要判断的对象\n * @return {Boolean}     判断结果\n */\n\nfunction isAMD(obj) {\n    return obj.amd === 'THEO';\n}\n\n/**\n * 判断一个module是否被定义过\n * @param  {String} moduleID 被检测的module对象id\n * @return {Boolean}        判断结果\n */\n\nfunction defined(moduleID) {\n    return mapDefined[moduleID] === 'defined';\n}\n/**\n * Promise类\n */\n\nfunction Promise() {\n    this.status = 'unfulfilled'; //fulfilled|failed\n    this.fulfilledHandlers = [];\n    this.errorHandlers = [];\n    this.reason = '';\n}\nPromise.prototype = {\n    constructor: Promise,\n    reject: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'failed';\n        return this.fire(this.errorHandlers, arg);\n    },\n    isResolved: function() {\n        return this.status === 'fulfilled';\n    },\n    resolve: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'fulfilled';\n        return this.fire(this.fulfilledHandlers, arg);\n    },\n    fail: function(handler) {\n        return this.then(undefined, handler);\n    },\n    always: function(handler) {\n        return this.then(handler, handler);\n    },\n    then: function(fulfilledHandler, errorHandler) {\n        switch (this.status) {\n        case 'unfulfilled':\n            this.add(fulfilledHandler, 'fulfilled')\n                .add(errorHandler, 'error');\n            break;\n        case 'fulfilled':\n            this.fire(fulfilledHandler, this.reason);\n            break;\n        case 'failed':\n            this.fire(errorHandler, this.reason);\n        }\n        return this;\n    },\n    done: function(handler) {\n        return this.then(handler);\n    },\n    fire: function(fns, arg) {\n        if ($.isArray(fns)) {\n            var fn;\n            while (fn = fns.shift()) {\n                if ($.isFunction(fn)) {\n                    fn(arg);\n                }\n            }\n            this.clear();\n        } else if ($.isFunction(fns)) {\n            fns(arg);\n        }\n        return this;\n    },\n    add: function(handler, which) {\n        which = which + 'Handlers';\n        if ($.isFunction(handler) && this[which]) {\n            this[which].push(handler);\n        }\n        return this;\n    },\n    clear: function() {\n        this.fulfilledHandlers.length = 0;\n        this.errorHandlers.length = 0;\n    }\n};\n\n/**\n * 是否是Promise实例\n * @param  {Object}  o 被检验的对象\n * @return {Boolean}   是否为实例\n */\n\nfunction isPromise(o) {\n    return o instanceof Promise;\n}\n/**\n * 获取真实url\n * 来自massframework\n * @param  {[type]} url [description]\n * @return {[type]}     [description]\n */\n\nfunction getPath(url, root) {\n    var ret = url;\n    var tmp;\n    var _2;\n    var alias = _.alias;\n    var id;\n    root = root || defaultConfig.baseURL;\n    root = root.substr(0, root.lastIndexOf('/'));\n    id = url; //模块id\n\n    if (regAlias.test(url) && alias[url]) {\n        ret = alias[url];\n\n    } else if (/^(\\w+)(\\d)?:.*/.test(url)) { //如果用户路径包含协议\n        ret = url;\n    } else {\n        tmp = url.charAt(0);\n        _2 = url.slice(0, 2);\n\n        if (tmp !== '.' && tmp !== '/') { //相对于根路径\n            ret = root + '/' + url;\n        } else if (_2 === './') { //相对于兄弟路径\n            id = url.substr(2);\n            ret = root + '/' + id;\n        } else if (_2 === '..') { //相对于父路径\n            // var arr = root.replace(/\\/$/, '').split('/');\n            var arr = root.split('/');\n            tmp = url.replace(/\\.\\.\\//g, function() {\n                arr.pop();\n                return '';\n            });\n            id = tmp;\n            ret = arr.join('/') + '/' + tmp;\n        }\n    }\n\n    var ext = 'js'; //默认是js文件\n    tmp = ret.replace(/[?#].*/, '');\n    if (/\\.(\\w+)$/.test(tmp)) {\n        ext = RegExp.$1;\n    }\n    if (ext !== 'css' && tmp === ret && !regIsJS.test(ret)) { //如果没有后缀名会补上.js\n        ret += '.js';\n    }\n    return [ret, ext, id];\n}\n/**\n * 加载js\n * @param  {String}   src      路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\nfunction loadJS(src, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(src)) {\n        callback = src.callback;\n        attrs = src.attrs;\n        timeout = src.timeout;\n        fail = src.fail;\n        complete = src.complete;\n        src = src.src;\n        return loadJS(src, callback, attrs, timeout, fail, complete);\n    }\n    var script = document.createElement('script');\n    var done = false;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            script.setAttribute(i, attrs[i]);\n        }\n    }\n    var urls = getPath(src);\n    src = script.src = urls[0];\n    script.async = true;\n    script.type = 'text/javascript';\n    script.charset = defaultConfig.charset;\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    script.onload = script.onreadystatechange = function(e) {\n        e = e || cleanObj\n        if (!done && (e.type === 'load' || /loaded|complete|undefined/.test(script.readyState))) {\n            done = true;\n            removeNode(script);\n            mapLoaded[src] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    };\n    script.onerror = function() {\n        done = true;\n        mapLoaded[src] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    };\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[src] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[src] = 'pending';\n    head.insertBefore(script, base);\n    return _;\n}\n/**\n * 移出node节点，释放内存\n * @param  {Element} node 节点\n */\nfunction removeNode(node) {\n    //确保执行一次+内存回收\n    node.onload = node.onerror = node.onreadystatechange = null;\n    if (node.parentNode) {\n        setTimeout(function() {\n            node.parentNode.removeChild(node);\n            node = null;\n        }, 0);\n    }\n}\n//放弃轮询方法，改用img的方法，对于不支持的古老级别浏览器自动屏蔽\n/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n    \n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n\n    \n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    //弱化css 错误处理，只有callback的时候才处理\n    if($.isFunction(callback)){\n        complete = $.isFunction(complete) ? complete : emptyFn;\n        var cb,err;\n        cb = function() {\n            if (!done) {\n                done = true;\n                link.onload = link.onerror = link.onreadystatechange = null;\n                mapLoaded[href] = 'loaded';\n                $.isFunction(callback) && callback();\n                complete('load');\n            }\n        }\n        if($.isFunction(fail)){\n            err = function() {\n                if (!done) {\n                    done = true;\n                    link.onload = link.onerror = link.onreadystatechange = null;\n                    mapLoaded[href] = 'error';\n                    fail();\n                    complete('error');\n                }\n            }\n        }\n\n        cssCallback(link, cb, err);\n        if (timeout) {\n            setTimeout(function() {\n                if (!done) {\n                    done = true;\n                    mapLoaded[href] = 'timeout';\n                    complete('timeout');\n                }\n            }, timeout);\n        }\n    }\n    \n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\n\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        if ($.isFunction(callback)) {\n            var img = new Image();\n            img.src = node.href;\n            img.error = callback;            \n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n\nvar _ = {\n    version: VERSION,\n    mix: mix,\n    indexOf: function(array, item, isSorted) {\n        if (array == null) {\n            return -1;\n        }\n        var i = 0;\n        var l = array.length;\n        if (isSorted) {\n            i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n        }\n        if (emptyArr.indexOf && array.indexOf === emptyArr.indexOf) {\n            return array.indexOf(item, isSorted);\n        }\n        for (; i < l; i++) {\n            if (array[i] === item) {\n                return i;\n            }\n        }\n        return -1;\n    },\n    /**\n     * 数组遍历\n     * @param  {Array}   arr      数组\n     * @param  {Function} callback 处理函数\n     * @param  {Object}   scope    处理上下文\n     */\n    each: emptyArr.forEach ? function(arr, callback, scope) {\n        emptyArr.forEach.call(arr, callback, scope);\n    } : function(arr, callback, scope) {\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (i in arr) {\n                callback.call(scope, arr[i], i, arr);\n            }\n        }\n    },\n    defined: defined,\n    define: function(mid, dependencies, factory) {\n        new Module(mid, dependencies, factory);\n        return this;\n    },\n    /**\n     * use方法\n     * @param  {Array}   mid      模块数组\n     * @param  {Function} callback 回调函数\n     * @return {Object}            返回promise对象\n     */\n    use: function(mid, callback) {\n        new Module(undefined, mid, callback);\n        return this;\n    },\n    /**\n     * 基本设置\n     * @param  {Object|undefined} cfg 设置，为空则返回\n     * @return {Object}\n     */\n    config: function(cfg) {\n        if ($.isObject(cfg)) {\n\n            mix(defaultConfig, cfg);\n            return this;\n        }\n        return defaultConfig;\n    },\n    /**\n     * 判断path是否加载\n     * @param  {String} path 路径\n     * @return {Boolean}     是否加载完成\n     */\n    loaded: function(path) {\n        path = getPath(path)[0];\n        return _.status(path) === 'loaded';\n    },\n    /**\n     * 查询路径的加载状态\n     * @param  {String} path 查询的路径\n     * @return {String}      返回状态：pending|error|loaded|timeout\n     */\n    status: function(path) {\n        return mapLoaded[path];\n    },\n    /**\n     * 别名机制\n     * @param  {String} name 名字\n     * @param  {String} realpath  别名真实url\n     * @return {[type]}      [description]\n     */\n    alias: function(name, realpath) {\n        if (regAlias.test(name)) {\n            if ($.isUndefined(realpath)) {\n                return mapAlias[name];\n            }\n            mapAlias[name] = String(realpath).split(',');\n        } else if ($.isObject(name)) {\n            realpath = name.path;\n            name = name;\n            _.alias(name, realpath);\n        }\n    },\n    loadJS: loadJS,\n    loadCSS: loadCSS,\n    Promise: Promise,\n    isAMD: isAMD\n};\n\n/**\n * 销毁函数\n * @param  {[type]} obj [description]\n * @return {[type]}     [description]\n */\n\nfunction destroy(obj) {\n    for (var i in obj) {\n        if (obj.hasOwnProperty(i) && obj[i]) {\n            if ($.isArray(obj[i])) {\n                obj[i].length = 0;\n            }\n            if ($.isFunction(obj[i].destroy)) {\n                obj[i].destroy();\n            }\n            delete obj[i];\n        }\n    }\n}\n\n/**\n * 混合杂糅\n * @param  {Object} target 目标对象，以此为基础的对象\n * @param  {Object} source 来源对象\n * @param  {Boolean} ride  是否覆盖同名属性\n * @return {Object}        处理完的对象\n */\n\nfunction mix(target, source, ride) {\n    var args = arrSlice.call(arguments);\n    var i = 1;\n    var key;\n    //如果最后参数是布尔，判定是否覆写同名属性\n    ride = $.isBoolean(ride) ? ride : true;\n\n    while ((source = args[i++])) {\n        //source = [{a:1},{b:3}];\n        if ($.isArray(source)) {\n            for (var n = 0, len = source.length; n < len; n++) {\n                mix(target, source[n], ride);\n            }\n            continue;\n        }\n        //杂糅只允许对象\n        for (key in source) {\n            if (ride || !(key in target)) {\n                target[key] = source[key];\n            }\n        }\n    }\n    return target;\n}\n\n\n\nif ($.isUndefined(window.define)) {\n    window.define = _.define;\n}\nwindow.MixJS = mix(_, $);\n}(this));"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/package.json",
    "content": "{\n  \"name\": \"mix\",\n  \"title\": \"MixJS\",\n  \"description\": \"Just Another Javascript Module Loader\",\n  \"version\": \"0.3.0\",\n  \"author\": \"Theowang\",\n  \"email\": \"ksky521@gmail.com\",\n  \"licenses\": [\n    {\n      \"type\": \"MIT\",\n      \"url\": \"https://github.com/ksky521/MixJS/blob/master/MIT-LICENSE.txt\"\n    }\n  ],\n  \"devDependencies\": {\n    \"grunt\": \"~0.4.1\",\n    \"grunt-contrib-jshint\": \"~0.2.0\",\n    \"grunt-contrib-uglify\": \"~0.1.2\",\n    \"grunt-contrib\": \"~0.5.0\",\n    \"grunt-contrib-concat\": \"~0.1.3\",\n    \"grunt-contrib-watch\": \"~0.3.1\",\n    \"grunt-contrib-compress\": \"~0.5.0\"\n  }\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/research/js.php",
    "content": "<?php\n  header('Content-type: text/javascript; charset=utf-8');\n  sleep(2);\n?>\nif(typeof console!=='undefined'){\n    console.log && console.log('i am wake up');\n}\n"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/research/load-test.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Load Test</title>\n    <style>\n    .green{\n        color:green;\n    }\n    .red{\n        color:red;\n    }\n    .bold{\n        font-weight:bold;\n    }\n    </style>\n</head>\n<body>\n    <ul id=\"result\">\n        <li class=\"green\">-------------start--------------</li>\n    </ul>\n<script>\n    var dom = document.getElementById('result');\n    var head = document.getElementsByTagName('head')[0];\n    var jsin = false;\n    var cssin = false;\n    function loadJS(url, str) {\n        var js = document.createElement('script');\n        if(!jsin){\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onreadystatechange in jsdom:【<span class=\"red\">'+('onreadystatechange' in js)+'</span>】</li>';\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onerror in jsdom:【<span class=\"red\">'+('onerror' in js)+'</span>】</li>';\n            dom.innerHTML += '<li>+++<span class=\"red\">js</span>-onload in jsdom:【<span class=\"red\">'+('onload' in js)+'</span>】</li>';\n            jsin = true;\n        }\n        js.onreadystatechange = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> readystatechange:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.onload = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> load:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.onerror = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li><span class=\"bold\"><span class=\"red\">js</span>:</span> error:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '</span>】;' + str + '</li>';\n        }\n        js.src = url;\n        head.appendChild(js);\n    }\n    function loadCSS(url, str){\n        var link = document.createElement('link');\n        link.rel = 'stylesheet';\n        link.type = 'text/css';\n        if(!cssin){\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onerror in cssdom:【<span class=\"red\">'+('onerror' in link)+'</span>】</li>';\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onload in cssdom:【<span class=\"red\">'+('onload' in link)+'</span>】</li>';\n            dom.innerHTML += '<li>------<span class=\"red\">css</span>-onreadystatechange in cssdom:【<span class=\"red\">'+('onreadystatechange' in link)+'</span>】</li>';\n            cssin = true;\n        }\n        \n        link.onreadystatechange = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> readystatechange:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【<span class=\"red\">' + e.type + '】</span>;' + str + '</li>';\n        }\n        link.onerror = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> error:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【' + e.type + '】;' + str + '</li>';\n        }\n        link.onload = function(e) {\n            e = e || {};\n            dom.innerHTML += '<li>=====<span class=\"bold\"><span class=\"red\">css</span>:</span> load:【<span class=\"red\">' + this.readyState + '</span>】; e.type 【' + e.type + '】;' + str + '</li>';\n        }\n\n        var img = new Image();\n        img.onerror = function(e){\n            e = e || {};\n            dom.innerHTML += '<li>=======img=======<span class=\"bold\"><span class=\"red\">css</span>:</span> new Image-error:【<span class=\"red\">' + e.type + '</span>】; ' + str + '</li>';\n        }\n        img.src = url;\n        var img2  = document.createElement('img');\n        img2.onerror = function(e){\n            e = e || {};\n            dom.innerHTML += '<li>=======img=======<span class=\"bold\"><span class=\"red\">css</span>:</span> createElement img-error:【<span class=\"red\">' + e.type + '</span>】; ' + str + '</li>';\n        }\n        img2.src = url;\n        link.href = url;\n        head.appendChild(link);\n    }\n    dom.innerHTML+='<li>Browser Info:'+window.navigator.userAgent+'</li>';\n    loadJS('http://code.jquery.com/jquery-1.9.1.js','200');\n    loadJS('http://code.jquery.com/121211212.js','404');\n    loadCSS('http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css','200');\n    loadCSS('http://code.jquery.com/121211212.css','404');\n</script>\n</body>\n</html>"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/research/loadjs.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>动态加载js状态测试</title>\n</head>\n<body>\n    <ul id=\"log\">\n        \n    </ul>\n    <button onclick=\"loadJS('js.php')\">加载js</button>\n    <button onclick=\"loadJS('js.php?t='+(+new Date()))\">加载不缓存的js</button>\n    <script>\n    var loadJS = function(url){\n        var js = document.createElement('script');\n        js.src = url;\n        js.onload = js.onreadystatechange = function(e){\n            e = e || {};\n            var li = document.createElement('li');\n            li.innerHTML = 'type:'+e.type+';readyState:'+js.readyState;\n            document.getElementById('log').appendChild(li);\n        }\n        var head = document.getElementsByTagName('head')[0];\n        head.appendChild(js);\n    }\n    \n    </script>\n</body>\n</html>"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/research/userAgent.html",
    "content": "<!doctype html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>判断UA</title>\n</head>\n<body>\n    <script>\nvar UA = window.navigator.userAgent;\nvar ua = UA.toLowerCase();\nvar browserRegExp = {\n    ie:/msie\\s*(\\d+(?:\\.\\d+)?)+/,\n    chrome:/chrome\\/(\\d+(?:\\.\\d+)?)+/,\n    firefox:/firefox\\/(\\d+(?:\\.\\d+)?)+/,\n    safari:/version\\/(\\d+(?:\\.\\d+)?)\\s*safari/,\n    opera:/opera[ |\\/](\\d+(?:\\.\\d+)?)/\n};\n$ = {};\n$.browser = 'unknow';\n$.browserVersion = 0;\n\nfunction checkUA(ua,browser,version){\n    ua = ua.toLowerCase();\n    for(var i in browserRegExp){\n        var match = browserRegExp[i].exec(ua);\n        if(match){\n            $.browser = i;\n            if(browser===i && version==match[1]){\n            }else{\n                console.log(browser+'|'+version+'|'+match[1]+':'+ua);\n            }\n\n            break;\n        }else{\n            // console.log(ua);\n        }\n    }\n}\nvar arr = [\n    ['chrome',19.0,'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3'],\n    ['chrome',24.0,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.14 (KHTML, like Gecko) Chrome/24.0.1292.0 Safari/537.14'],\n    ['chrome',15.0,'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.861.0 Safari/535.2'],\n    ['chrome',4.0,'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.211.2 Safari/532.0'],\n    ['chrome',0.2,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13(KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13'],\n\n\n    ['safari',6.0,'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25'],\n    ['safari',5.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'],\n    ['safari',5.1,'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3'],\n    ['safari',5.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; th-th) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8'],\n    ['safari',4.0,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_4; en-gb) AppleWebKit/528.4+ (KHTML, like Gecko) Version/4.0dp1 Safari/526.11.2'],\n    ['safari',4.0,'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_1 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8B117 Safari/6531.22.7'],\n    ['safari',4.0,'Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10gin_lib.cc'],\n    ['safari',4.0,'Mozilla/5.0 (Windows; U; Windows NT 5.1; fi-FI) AppleWebKit/528.16 (KHTML, like Gecko) Version/4.0 Safari/528.16'],\n    ['safari',3.2,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; de-de) AppleWebKit/525.28.3 (KHTML, like Gecko) Version/3.2.3 Safari/525.28.3'],\n    ['safari',3.2,'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; fr-fr) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/3.2.1 Safari/525.27.1'],\n    ['safari',3.0,'Mozilla/5.0 (Windows; U; Windows NT 6.0; en) AppleWebKit/525+ (KHTML, like Gecko) Version/3.0.4 Safari/523.11'],\n    ['safari',2.0,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2'],\n    ['safari',1.3,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/312.8 (KHTML, like Gecko) Safari/312.5_Adobe'],\n    ['safari',1.0,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5'],\n    ['firefox',23.0,'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0'],\n    ['firefox',16.0,'Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0.1) Gecko/20121011 Firefox/16.0.1'],\n    ['firefox',6.0,'Mozilla/5.0 (Windows NT 5.0; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'],\n    ['firefox',6.0,'Mozilla/5.0 (Windows NT 5.1; rv:6.0) Gecko/20100101 Firefox/6.0 FirePHP/0.6'],\n    ['firefox',5.0,'Mozilla/5.0 (X11; Linux i686 on x86_64; rv:5.0a2) Gecko/20110524 Firefox/5.0a2'],\n    ['firefox',4.0,'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)'],\n    ['firefox',4.0,'Mozilla/5.0 (Windows NT 6.1; rv:1.9) Gecko/20100101 Firefox/4.0'],\n    ['firefox',3.5,'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9 GTB7.0 (.NET CLR 3.0.30618)'],\n    ['firefox',2.1,'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.15) Gecko/2009101601 Firefox 2.1 (.NET CLR 3.5.30729)'],\n    ['firefox',2.0,'Mozilla/5.0 (X11; U; SunOS sun4v; en-US; rv:1.8.1.3) Gecko/20070321 Firefox/2.0.0.3'],\n    ['firefox',1.6,'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9a1) Gecko/20060112 Firefox/1.6a1'],\n    ['firefox',1.0,'Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.7.6) Gecko/20050317 Firefox/1.0.2 (ax)'],\n    ['firefox',0.1,'Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; rv:1.7.3) Gecko/20040913 Firefox/0.10'],\n    ['ie',10.6,'Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0'],\n    ['ie',10.0,'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)'],\n    ['ie',9.0,'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))'],\n    ['ie',9.0,'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)'],\n    ['ie',8.0,'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MS-RTC LM 8; InfoPath.3; .NET4.0C; .NET4.0E) chromeframe/8.0.552.224'],\n    ['ie',7.0,'Mozilla/4.0(compatible; MSIE 7.0b; Windows NT 6.0)'],\n    ['ie',7.0,'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)'],\n    ['ie',6.0,'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)'],\n    ['ie',6.1,'Mozilla/4.0 (compatible; MSIE 6.1; Windows XP; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'],\n    ['opera',12.14,'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14'],\n    ['opera',12.02,'Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02'],\n    ['opera',12.0,'Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0'],\n    ['opera',12.00,'Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00'],\n    ['opera',11.62,'Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62'],\n    ['opera',11.50,'Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50'],\n    ['opera',11.11,'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11'],\n    ['opera',11.11,'Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11'],\n    ['opera',11.10,'Opera/9.80 (Windows NT 6.1; U; zh-tw) Presto/2.7.62 Version/11.01'],\n    ['opera',11.00,'Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00'],\n    ['opera',11.00,'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; en) Opera 11.00'],\n    ['opera',10.70,'Opera/9.80 (Windows NT 6.1; U; pl) Presto/2.6.31 Version/10.70'],\n    ['opera',10.70,'Mozilla/5.0 (Windows NT 5.1; U; zh-cn; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.70'],\n    ['opera',10.63,'Opera/9.80 (Windows NT 5.2; U; zh-cn) Presto/2.6.30 Version/10.63'],\n    ['opera',9.80,'Opera/9.80 (J2ME/MIDP; Opera Mini/5.0 (Windows; U; Windows NT 5.1; en) AppleWebKit/886; U; en) Presto/2.4.15'],\n];\n\nfor(var i=0,len = arr.length;i<len;i++){\n    checkUA(arr[i][2],arr[i][0],arr[i][1]);\n}\n</script>\n</body>\n</html>"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/Module.js",
    "content": "/**\n * Module类\n * @param {String} id      moduleID\n * @param {Array} deps    依赖模块\n * @param {Function} factory 工厂函数\n * @param {Object} root    相对定义的root\n */\n\nfunction Module(id, deps, factory, root) {\n    if (arguments.length === 0) {\n        throw new Error('Module: I need a agrument');\n    }\n    if ($.isFunction(id)) {\n        factory = id;\n        id = undefined;\n        deps = emptyArr;\n    } else if ($.isArray(id)) {\n        deps = emptyArr;\n        id = undefined;\n    } else if ($.isFunction(deps)) {\n        factory = deps;\n        deps = emptyArr;\n    }\n    this.id = id ? getPath(id)[2] : id;\n    this.status = 'uninitialized';\n    if ($.isString(deps)) {\n        deps = deps.split(',');\n    }\n    this.dependencies = deps;\n    this.factory = factory;\n    this.root = root || _; //默认挂靠在window全局，使用_，默认挂靠到MixJS上\n    this.undef = []; //没有定义的模块\n    this.id && (mapDefined[this.id] = 'uninitialized');\n    this.checkDependencies(deps);\n    this.define();\n}\nModule.prototype = {\n    constructor: Module,\n    //定义\n    define: function() {\n        if (this.canDefine()) {\n            this.namespace();\n        } else if (this.status !== 'pending') {\n            this.status = 'pending';\n            this.id && (mapDefined[this.id] = this.status);\n            this.loadDeps();\n        }\n    },\n    //命名空间\n    namespace: function() {\n        var names = $.isString(this.id) ? this.id.split('/') : emptyArr;\n        var root = this.root;\n        var name, lastName;\n        while (name = names.shift()) {\n            lastName = name;\n            if (names.length) {\n                root = (root[name] = root[name] || {});\n            }\n        }\n        try {\n            var f = $.isFunction(this.factory) && this.factory.apply(window, this.getArgs());\n            if (f) {\n                f.amd = 'THEO'; //加个尾巴~\n                root[lastName] = f;\n                this.id && (mapDefined[this.id] = 'defined');\n            }\n        } catch (e) {\n            if (this.id) {\n                mapDefined[this.id] = 'error';\n            }\n            throw new Error('Module.namespace error:id=>' + this.id + ';undef=>' + this.undef.join(',') + ';info=>' + e.message);\n        }\n        //解决掉触发调用模块的promise\n        if (this.id && $.isArray(mapDeps2ModulePromise[this.id])) {\n            _.each(mapDeps2ModulePromise[this.id], function(v) {\n                if (isPromise(v)) {\n                    v.resolve();\n                }\n            });\n        }\n        this.destroy();\n    },\n    //根据模块名称，获取模块\n    getFn: function(names) {\n        names = names.split('/');\n        var root = this.root;\n        var name;\n        while (name = names.shift()) {\n            root = root[name];\n        }\n        return root;\n    },\n    //获取factory函数参数数组\n    getArgs: function() {\n        var arr = this.dependencies;\n        var v;\n        var fns = [this.root];\n        for (var i = 0, len = arr.length; i < len; i++) {\n            v = arr[i];\n            fns.push(this.getFn(v));\n        }\n        return fns;\n    },\n    //判断是否符合转正标准\n    canDefine: function() {\n        var arr = this.undef;\n        var len = arr.length;\n        var temp;\n        while (len--) {\n            temp = arr[len];\n            if (!defined(temp)) {\n                if ((regIsCSS.test(temp) || regIsJS.test(temp)) && _.loaded(temp)) {\n                    continue;\n                }\n                return false;\n            }\n        }\n        return true;\n    },\n    //加载依赖\n    loadDeps: function() {\n        var self = this;\n        var promise;\n        var modules = self.undef;\n        _.each(modules, function(v) {\n            promise = new Promise();\n            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n            mapDeps2ModulePromise[v].push(promise.done(function() {\n                self.define();\n            }));\n            if (mapDefined[v] !== 'pending') {\n                var alias = _.alias(v);\n\n                if (alias && alias.length) {\n                    //如果存在alias\n                    var p = new Promise();\n\n                    p.done(function() {\n                        self.define()\n                    });\n                    //如果是普通js和css\n                    //不支持有依赖关系的alias模块类型的js\n                    var len = alias.length;\n                    var cb = function() {\n                        len--;\n                        if (len === 0) {\n                            mapDefined[v] = 'defined'; //标注alias被定义过了~\n                            p.resolve();\n                        }\n                    };\n                    _.each(alias, function(v) {\n                        if (regIsCSS.test(v)) {\n                            _.loadCSS(v, cb);\n                        } else if (regIsJS.test(v)) {\n                            _.loadJS(v, cb);\n                        } else {\n                            var tempPromise = new Promise();\n                            mapDeps2ModulePromise[v] = mapDeps2ModulePromise[v] ? mapDeps2ModulePromise[v] : [];\n                            mapDeps2ModulePromise[v].push(tempPromise.done(cb));\n                            _.loadJS(v);\n                        }\n                    });\n                } else if (regIsCSS.test(v)) {\n                    //css文件\n                    _.loadCSS(v, function() {\n                        self.define();\n                    });\n                } else if (regIsJS.test(v)) {\n                    //js文件\n                    _.loadJS(v, function() {\n                        self.define();\n                    });\n                } else {\n                    //模块\n                    _.loadJS(v);\n                }\n            }\n        });\n    },\n    //首次检测依赖关系，对已经定义和未定义的模块进行分组\n    checkDependencies: function(deps) {\n        var self = this;\n        _.each(deps, function(v) {\n            v = getPath(v)[2];\n            if (!defined(v)) {\n                self.undef.push(v);\n            }\n        });\n    },\n    //销毁函数\n    destroy: function() {\n        destroy(this);\n    }\n};\n\n/**\n * 判断是否为amd模块\n * @param  {Object}  obj 要判断的对象\n * @return {Boolean}     判断结果\n */\n\nfunction isAMD(obj) {\n    return obj.amd === 'THEO';\n}\n\n/**\n * 判断一个module是否被定义过\n * @param  {String} moduleID 被检测的module对象id\n * @return {Boolean}        判断结果\n */\n\nfunction defined(moduleID) {\n    return mapDefined[moduleID] === 'defined';\n}"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/Promise.js",
    "content": "/**\n * Promise类\n */\n\nfunction Promise() {\n    this.status = 'unfulfilled'; //fulfilled|failed\n    this.fulfilledHandlers = [];\n    this.errorHandlers = [];\n    this.reason = '';\n}\nPromise.prototype = {\n    constructor: Promise,\n    reject: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'failed';\n        return this.fire(this.errorHandlers, arg);\n    },\n    isResolved: function() {\n        return this.status === 'fulfilled';\n    },\n    resolve: function(arg) {\n        if (this.status !== 'unfulfilled') {\n            return this;\n        }\n        this.reason = arg;\n        this.status = 'fulfilled';\n        return this.fire(this.fulfilledHandlers, arg);\n    },\n    fail: function(handler) {\n        return this.then(undefined, handler);\n    },\n    always: function(handler) {\n        return this.then(handler, handler);\n    },\n    then: function(fulfilledHandler, errorHandler) {\n        switch (this.status) {\n        case 'unfulfilled':\n            this.add(fulfilledHandler, 'fulfilled')\n                .add(errorHandler, 'error');\n            break;\n        case 'fulfilled':\n            this.fire(fulfilledHandler, this.reason);\n            break;\n        case 'failed':\n            this.fire(errorHandler, this.reason);\n        }\n        return this;\n    },\n    done: function(handler) {\n        return this.then(handler);\n    },\n    fire: function(fns, arg) {\n        if ($.isArray(fns)) {\n            var fn;\n            while (fn = fns.shift()) {\n                if ($.isFunction(fn)) {\n                    fn(arg);\n                }\n            }\n            this.clear();\n        } else if ($.isFunction(fns)) {\n            fns(arg);\n        }\n        return this;\n    },\n    add: function(handler, which) {\n        which = which + 'Handlers';\n        if ($.isFunction(handler) && this[which]) {\n            this[which].push(handler);\n        }\n        return this;\n    },\n    clear: function() {\n        this.fulfilledHandlers.length = 0;\n        this.errorHandlers.length = 0;\n    }\n};\n\n/**\n * 是否是Promise实例\n * @param  {Object}  o 被检验的对象\n * @return {Boolean}   是否为实例\n */\n\nfunction isPromise(o) {\n    return o instanceof Promise;\n}"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/browser.js",
    "content": "var UA = window.navigator.userAgent;\n"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/core.js",
    "content": "var _ = {\n    version: VERSION,\n    mix: mix,\n    indexOf: function(array, item, isSorted) {\n        if (array == null) {\n            return -1;\n        }\n        var i = 0;\n        var l = array.length;\n        if (isSorted) {\n            i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);\n        }\n        if (emptyArr.indexOf && array.indexOf === emptyArr.indexOf) {\n            return array.indexOf(item, isSorted);\n        }\n        for (; i < l; i++) {\n            if (array[i] === item) {\n                return i;\n            }\n        }\n        return -1;\n    },\n    /**\n     * 数组遍历\n     * @param  {Array}   arr      数组\n     * @param  {Function} callback 处理函数\n     * @param  {Object}   scope    处理上下文\n     */\n    each: emptyArr.forEach ? function(arr, callback, scope) {\n        emptyArr.forEach.call(arr, callback, scope);\n    } : function(arr, callback, scope) {\n        for (var i = 0, len = arr.length; i < len; i++) {\n            if (i in arr) {\n                callback.call(scope, arr[i], i, arr);\n            }\n        }\n    },\n    defined: defined,\n    define: function(mid, dependencies, factory) {\n        new Module(mid, dependencies, factory);\n        return this;\n    },\n    /**\n     * use方法\n     * @param  {Array}   mid      模块数组\n     * @param  {Function} callback 回调函数\n     * @return {Object}            返回promise对象\n     */\n    use: function(mid, callback) {\n        new Module(undefined, mid, callback);\n        return this;\n    },\n    /**\n     * 基本设置\n     * @param  {Object|undefined} cfg 设置，为空则返回\n     * @return {Object}\n     */\n    config: function(cfg) {\n        if ($.isObject(cfg)) {\n\n            mix(defaultConfig, cfg);\n            return this;\n        }\n        return defaultConfig;\n    },\n    /**\n     * 判断path是否加载\n     * @param  {String} path 路径\n     * @return {Boolean}     是否加载完成\n     */\n    loaded: function(path) {\n        path = getPath(path)[0];\n        return _.status(path) === 'loaded';\n    },\n    /**\n     * 查询路径的加载状态\n     * @param  {String} path 查询的路径\n     * @return {String}      返回状态：pending|error|loaded|timeout\n     */\n    status: function(path) {\n        return mapLoaded[path];\n    },\n    /**\n     * 别名机制\n     * @param  {String} name 名字\n     * @param  {String} realpath  别名真实url\n     * @return {[type]}      [description]\n     */\n    alias: function(name, realpath) {\n        if (regAlias.test(name)) {\n            if ($.isUndefined(realpath)) {\n                return mapAlias[name];\n            }\n            mapAlias[name] = String(realpath).split(',');\n        } else if ($.isObject(name)) {\n            realpath = name.path;\n            name = name;\n            _.alias(name, realpath);\n        }\n    },\n    loadJS: loadJS,\n    loadCSS: loadCSS,\n    Promise: Promise,\n    isAMD: isAMD\n};\n\n/**\n * 销毁函数\n * @param  {[type]} obj [description]\n * @return {[type]}     [description]\n */\n\nfunction destroy(obj) {\n    for (var i in obj) {\n        if (obj.hasOwnProperty(i) && obj[i]) {\n            if ($.isArray(obj[i])) {\n                obj[i].length = 0;\n            }\n            if ($.isFunction(obj[i].destroy)) {\n                obj[i].destroy();\n            }\n            delete obj[i];\n        }\n    }\n}\n\n/**\n * 混合杂糅\n * @param  {Object} target 目标对象，以此为基础的对象\n * @param  {Object} source 来源对象\n * @param  {Boolean} ride  是否覆盖同名属性\n * @return {Object}        处理完的对象\n */\n\nfunction mix(target, source, ride) {\n    var args = arrSlice.call(arguments);\n    var i = 1;\n    var key;\n    //如果最后参数是布尔，判定是否覆写同名属性\n    ride = $.isBoolean(ride) ? ride : true;\n\n    while ((source = args[i++])) {\n        //source = [{a:1},{b:3}];\n        if ($.isArray(source)) {\n            for (var n = 0, len = source.length; n < len; n++) {\n                mix(target, source[n], ride);\n            }\n            continue;\n        }\n        //杂糅只允许对象\n        for (key in source) {\n            if (ride || !(key in target)) {\n                target[key] = source[key];\n            }\n        }\n    }\n    return target;\n}\n\n\n\nif ($.isUndefined(window.define)) {\n    window.define = _.define;\n}\nwindow.MixJS = mix(_, $);"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/getCurrentScript.js",
    "content": "//本js文件不支持defer等属性，否则计算当前路径会错误\n//模块加载的东西，基础js肯定不能defer掉……\nvar curScriptNode = (function() {\n    var scripts = document.getElementsByTagName('script');\n    return scripts[scripts.length - 1]; //FF下可以使用DOC.currentScript\n})();"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/getPath.js",
    "content": "/**\n * 获取真实url\n * 来自massframework\n * @param  {[type]} url [description]\n * @return {[type]}     [description]\n */\n\nfunction getPath(url, root) {\n    var ret = url;\n    var tmp;\n    var _2;\n    var alias = _.alias;\n    var id;\n    root = root || defaultConfig.baseURL;\n    root = root.substr(0, root.lastIndexOf('/'));\n    id = url; //模块id\n\n    if (regAlias.test(url) && alias[url]) {\n        ret = alias[url];\n\n    } else if (/^(\\w+)(\\d)?:.*/.test(url)) { //如果用户路径包含协议\n        ret = url;\n    } else {\n        tmp = url.charAt(0);\n        _2 = url.slice(0, 2);\n\n        if (tmp !== '.' && tmp !== '/') { //相对于根路径\n            ret = root + '/' + url;\n        } else if (_2 === './') { //相对于兄弟路径\n            id = url.substr(2);\n            ret = root + '/' + id;\n        } else if (_2 === '..') { //相对于父路径\n            // var arr = root.replace(/\\/$/, '').split('/');\n            var arr = root.split('/');\n            tmp = url.replace(/\\.\\.\\//g, function() {\n                arr.pop();\n                return '';\n            });\n            id = tmp;\n            ret = arr.join('/') + '/' + tmp;\n        }\n    }\n\n    var ext = 'js'; //默认是js文件\n    tmp = ret.replace(/[?#].*/, '');\n    if (/\\.(\\w+)$/.test(tmp)) {\n        ext = RegExp.$1;\n    }\n    if (ext !== 'css' && tmp === ret && !regIsJS.test(ret)) { //如果没有后缀名会补上.js\n        ret += '.js';\n    }\n    return [ret, ext, id];\n}"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/intro.js",
    "content": "(function(window, undefined) {\n'use strict';\nvar document = window.document;\nvar setTimeout = window.setTimeout;"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/loadcss-img.js",
    "content": "//放弃轮询方法，改用img的方法，对于不支持的古老级别浏览器自动屏蔽\n/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n    \n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n\n    \n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    //弱化css 错误处理，只有callback的时候才处理\n    if($.isFunction(callback)){\n        complete = $.isFunction(complete) ? complete : emptyFn;\n        var cb,err;\n        cb = function() {\n            if (!done) {\n                done = true;\n                link.onload = link.onerror = link.onreadystatechange = null;\n                mapLoaded[href] = 'loaded';\n                $.isFunction(callback) && callback();\n                complete('load');\n            }\n        }\n        if($.isFunction(fail)){\n            err = function() {\n                if (!done) {\n                    done = true;\n                    link.onload = link.onerror = link.onreadystatechange = null;\n                    mapLoaded[href] = 'error';\n                    fail();\n                    complete('error');\n                }\n            }\n        }\n\n        cssCallback(link, cb, err);\n        if (timeout) {\n            setTimeout(function() {\n                if (!done) {\n                    done = true;\n                    mapLoaded[href] = 'timeout';\n                    complete('timeout');\n                }\n            }, timeout);\n        }\n    }\n    \n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\n\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        if ($.isFunction(callback)) {\n            var img = new Image();\n            img.src = node.href;\n            img.error = callback;            \n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/loadcss.js",
    "content": "/**\n * 加载css\n * @param  {String}   href     路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\n\nfunction loadCSS(href, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(href)) {\n        callback = href.callback;\n        attrs = href.attrs;\n        timeout = href.timeout;\n        fail = href.fail;\n        complete = href.complete;\n        href = href.href;\n        return loadCSS(href, callback, attrs, timeout, fail, complete);\n    }\n    var link = document.createElement('link');\n    var done = false;\n\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    var url = getPath(href);\n    href = link.href = url[0];\n    link.rel = 'stylesheet';\n    link.type = 'text/css';\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            link.setAttribute(i, attrs[i]);\n        }\n    }\n    var cb = function() {\n        if (!done) {\n            done = true;\n            link.onload = link.onerror = link.onreadystatechange = null;\n            mapLoaded[href] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    }\n    var err = function() {\n        done = true;\n        link.onload = link.onerror = link.onreadystatechange = null;\n        mapLoaded[href] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    }\n\n    cssCallback(link, cb, err);\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[href] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[href] = 'pending';\n    head.insertBefore(link, base);\n    return _;\n}\n\n//为了保证每个poll的重试次数为300\nvar pollTimers = {};\n///css load检测来自seajs\n// `onload` event is supported in WebKit since 535.23\n// Ref:\n//  - https://bugs.webkit.org/show_activity.cgi?id=38995\nvar isOldWebKit = Number(UA.replace(/.*AppleWebKit\\/(\\d+)\\..*/, '$1')) < 536;\n\n// `onload/onerror` event is supported since Firefox 9.0\n// Ref:\n//  - https://bugzilla.mozilla.org/show_bug.cgi?id=185236\n//  - https://developer.mozilla.org/en/HTML/Element/link#Stylesheet_load_events\nvar isOldFirefox = ~UA.indexOf('Firefox') && !('onload' in document.createElement('link'));\nvar cssCallback = (isOldWebKit || isOldFirefox) ? function(node, callback) {\n        // Begin after node insertion\n        if ($.isFunction(callback)) {\n            //设置timer\n            pollTimers[node.href] = 0;\n            setTimeout(function() {\n                poll(node, callback);\n            }, 50);\n        }\n    } : function(node, callback, fail) {\n        if ($.isFunction(callback)) {\n            node.onload = function() {\n                callback();\n            }\n        }\n        if ($.isFunction(fail)) {\n            node.onerror = function() {\n                fail();\n            }\n        }\n    };\n\nfunction poll(node, callback) {\n    var done = false;\n    var count = pollTimers[node.href]++;\n    if (count > 300) {\n        callback();\n        done = true;\n        return;\n    }\n    // for WebKit < 536\n    if (isOldWebKit) {\n        if (node.sheet) {\n            done = true;\n        }\n    }\n    // for Firefox < 9.0\n    else if (node.sheet) {\n        try {\n            if (node.sheet.cssRules) {\n                done = true;\n            }\n        } catch (ex) {\n            // The value of `ex.name` is changed from\n            // 'NS_ERROR_DOM_SECURITY_ERR' to 'SecurityError' since Firefox 13.0\n            // But Firefox is less than 9.0 in here, So it is ok to just rely on\n            // 'NS_ERROR_DOM_SECURITY_ERR'\n            if (ex.name === 'NS_ERROR_DOM_SECURITY_ERR') {\n                done = true;\n            }\n        }\n    }\n    setTimeout(function() {\n        if (done) {\n            // Place callback in here due to giving time for style rendering.\n            callback();\n        } else {\n            poll(node, callback);\n        }\n    }, 50)\n}"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/loadjs.js",
    "content": "/**\n * 加载js\n * @param  {String}   src      路径\n * @param  {Function} callback 回调函数\n * @param  {Object}   attrs    attribute对象\n * @param  {Number}   timeout  超时时间\n * @param  {Function}   error  出错函数\n * @param  {Function}   complete  完成函数，出错和load都执行的\n * @return {Object}            this\n */\nfunction loadJS(src, callback, attrs, timeout, fail, complete) {\n    if ($.isObject(src)) {\n        callback = src.callback;\n        attrs = src.attrs;\n        timeout = src.timeout;\n        fail = src.fail;\n        complete = src.complete;\n        src = src.src;\n        return loadJS(src, callback, attrs, timeout, fail, complete);\n    }\n    var script = document.createElement('script');\n    var done = false;\n    if ($.isObject(attrs)) {\n        for (var i in attrs) {\n            script.setAttribute(i, attrs[i]);\n        }\n    }\n    var urls = getPath(src);\n    src = script.src = urls[0];\n    script.async = true;\n    script.type = 'text/javascript';\n    script.charset = defaultConfig.charset;\n    complete = $.isFunction(complete) ? complete : emptyFn;\n    script.onload = script.onreadystatechange = function(e) {\n        e = e || cleanObj\n        if (!done && (e.type === 'load' || /loaded|complete|undefined/.test(script.readyState))) {\n            done = true;\n            removeNode(script);\n            mapLoaded[src] = 'loaded';\n            $.isFunction(callback) && callback();\n            complete('load');\n        }\n    };\n    script.onerror = function() {\n        done = true;\n        mapLoaded[src] = 'error';\n        $.isFunction(fail) && fail();\n        complete('error');\n    };\n    timeout = $.isNumber(timeout) ? timeout : defaultConfig.timeout;\n    if (timeout) {\n        setTimeout(function() {\n            if (!done) {\n                done = true;\n                mapLoaded[src] = 'timeout';\n                complete('timeout');\n            }\n        }, timeout);\n    }\n    mapLoaded[src] = 'pending';\n    head.insertBefore(script, base);\n    return _;\n}\n/**\n * 移出node节点，释放内存\n * @param  {Element} node 节点\n */\nfunction removeNode(node) {\n    //确保执行一次+内存回收\n    node.onload = node.onerror = node.onreadystatechange = null;\n    if (node.parentNode) {\n        setTimeout(function() {\n            node.parentNode.removeChild(node);\n            node = null;\n        }, 0);\n    }\n}"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/outro.js",
    "content": "}(this));"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/typeof.js",
    "content": "//基本类型判断\n'Function,String,Array,Number'.replace(/[^, ]+/g, function(t) {\n    $['is' + t] = function(s) {\n        return isType(s, t);\n    }\n});\nif (typeof(/./) !== 'function') {\n    $.isFunction = function(obj) {\n        return typeof obj === 'function';\n    };\n}\n$.isObject = function(obj) {\n    return typeof obj === 'object';\n}\n\n$.isBoolean = function(obj) {\n    return obj === true || obj === false || isType(obj, 'Boolean');\n};\n\n$.isUndefined = function(obj) {\n    return obj === undefined;\n};\n\n/**\n * 获取类型\n * @param  {Object} obj 要判断的对象\n * @return {String}     返回类型\n */\n\nfunction isType(obj, type) {\n    return cleanObj.toString.call(obj).slice(8, -1) === type;\n}"
  },
  {
    "path": "ppt/think-in-css/js/mixjs/src/vars.js",
    "content": "var VERSION = 'MixJS 0.3 butterfly';\nvar emptyFn = function() {};\nvar cleanObj = {};\nvar emptyArr = [];\nvar head = document.head || document.getElementsByTagName('head')[0] || document.documentElement;\nvar base = head.getElementsByTagName('base')[0] || null;\nvar arrSlice = emptyArr.slice;\n\n//获取当前文件父路径\nvar PATH = (function(node) {\n    var url = node.hasAttribute ? node.src : node.getAttribute('src', 4);\n    return url.substr(0, url.lastIndexOf('/')) + '/';\n})(curScriptNode);\n\n//是否为js\nvar regIsJS = /\\.js$/i;\n//是否为css\nvar regIsCSS = /\\.css$/i;\n//alias\nvar regAlias = /^[-\\w\\d_$]{2,}$/i;\nvar $ = {};\n\nvar defaultConfig = {\n    timeout: 2E4, //超时时间二十秒\n    baseURL: PATH,\n    charset: 'utf-8'\n};\n\n//=============>maps\n//别名列表\nvar mapAlias = {};\n//加载完的文件列表\nvar mapLoaded = {};\n//已经定义模块的状态表：undefined|pending|defined\nvar mapDefined = {};\n//通过依赖找上一级模块的promise\nvar mapDeps2ModulePromise = {};"
  },
  {
    "path": "ppt/think-in-css/js/nodeppt.control.js",
    "content": "/**\n * 控制端函数\n */\n(function($win, $doc, $B, Slide, loadJS, undefined) {\n    var $slides = Slide.$slides;\n\n    // function doItem(direction) {\n    //     return Slide[direction === 'prev' ? 'buildPrevItem' : 'buildNextItem'](true);\n    // }\n\n    function getType(obj) {\n        return ({}).toString.call(obj).slice(8, -1)\n    }\n\n    var Control = {\n        state: 'unbind',\n        methods: {},\n        init: function() {\n            this.bindListener();\n        },\n        bindListener: function() {\n            var t = this;\n            //监听用户端发出的广播\n            $B.on('slide change ID', function(json) {\n                    var slideID = json.slideID;\n                    //发送请求\n                    t.sendUpdate(slideID, json.direction);\n\n                }).on('slide do build', function(json) {\n                    var slideID = json.slideID;\n                    var buildItem = json.build;\n                    var direction = json.direction;\n                    //发送请求\n                    t.sendUpdateItem(slideID, buildItem, direction);\n                }).on('slide event keyup', function(e) {\n                    t.sendKeyEvent(e.keyCode);\n                }).on('show paint', function(e) {\n                    t.sendKeyEvent(80);\n                }).on('remove paint', function() {\n                    t.sendKeyEvent(67);\n                }).on('paint points', function(points) {\n                    var data = {\n                        points: points,\n                        screen: {\n                            width: $doc.body.offsetWidth,\n                            height: $doc.body.offsetHeight\n                        }\n                    };\n                    t.send_('broadcast', ['paint points', data]);\n                })\n                //监听控制来的广播\n                .on('from control order', function(json) {\n                    var fnName = json.fnName;\n                    var args = json.args;\n                    Slide.proxyFn(fnName, args);\n                }).on('from control update', function(json) {\n                    Slide[json.direction](true);\n                    // doSlide(json.direction, json.id, false);\n                }).on('from control updateItem', function(json) {\n                    Slide[json.direction](true);\n                    //doItem(json.direction) && doSlide(json.id, false);\n                }).on('from control key event', function(json) {\n                    t.createKeyEvent_(json.keyCode);\n                })\n        },\n        createKeyEvent_: function(keyCode) {\n            var evt = document.createEvent('Event');\n            evt.initEvent('keyup', true, true);\n            evt.keyCode = keyCode;\n            evt.isFromControl = true;\n\n            document.dispatchEvent(evt);\n        },\n        send_: function(fnName, args) {\n            var methods = this.methods;\n            var method;\n            args = getType(args) === 'Array' ? args : [args];\n            for (var i in methods) {\n                method = methods[i];\n                method = method[fnName];\n                typeof method === 'function' && method.apply(Slide, args);\n            }\n        },\n        sendUpdate: function(slideID, direction) {\n            this.send_('update', [slideID, direction]);\n        },\n        sendUpdateItem: function(id, buildItem, direction) {\n            this.send_('updateItem', [id, buildItem, direction]);\n        },\n        sendKeyEvent: function(keycode) {\n            this.send_('keyEvent', [keycode]);\n        },\n\n        //添加一个新的监控\n        add: function(name, factory, override) {\n            var methods = this.methods;\n\n            if (override || !methods[name]) {\n                methods[name] = factory(Slide, $B);\n                //必须包括4个函数一个是监控翻页的update\n                //另外一个是updateItem\n                //一个是init\n                //keyEvent;\n            }\n        },\n        load: function(type, args) {\n            var url = Slide.dir + 'nodeppt.control.' + type + '.js';\n            loadJS(url, function() {\n                Slide.Control.methods[type].init(args);\n            });\n        }\n    };\n    Control.init();\n    Slide.Control = Control;\n}(window, document, MixJS.event.broadcast, Slide, MixJS.loadJS));\n"
  },
  {
    "path": "ppt/think-in-css/js/nodeppt.control.postMessage.js",
    "content": "/**\n * postMessage 只能单方面控制\n *\n */\nSlide.Control.add('postMessage', function(S, broadcast) {\n    function parseQuery(url) {\n        var back = {};\n        (url || location.search.substring(1)).split('&').forEach(function(v) {\n            v = v.split('=');\n            back[v[0].toLowerCase()] = v[1];\n        });\n        return back;\n    }\n\n    var postWin, popup, timer;\n    var postMSG = {\n        role: '', //角色\n        broadcast: function(evtName, data) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: evtName,\n                    data: data\n                }, '*');\n            }\n        },\n        update: function(id, direction) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'update',\n                    id: id,\n                    direction: direction\n                }, '*');\n            }\n\n        },\n        updateItem: function(id, item, direction) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'updateItem',\n                    id: id,\n                    item: item,\n                    direction: direction\n                }, '*');\n            }\n\n        },\n        keyEvent: function(keyCode) {\n            if (postWin) {\n                window.opener.postMessage({\n                    action: 'keyEvent',\n                    keyCode: keyCode\n                }, '*');\n            }\n        },\n        // evtControl: function(e) {\n        //     console.log('client 发来贺电', arguments);\n        // },\n        evtClient: function(e) {\n            var data = e.data;\n            switch (data.action) {\n                case 'update':\n                    broadcast.fire('from control update', data);\n                    break;\n                case 'updateItem':\n                    broadcast.fire('from control updateItem', data);\n                    break;\n                case 'keyEvent':\n                    broadcast.fire('from control key event', data);\n                    break;\n                case 'userOrder':\n                    var fnName = data.fn;\n                    var args = data.args;\n                    try {\n                        args = JSON.parse(args);\n                    } catch (e) {}\n                    Slide.proxyFn(fnName, args);\n                    break;\n                default:\n                    broadcast.fire('from control ' + data.action, data.data);\n            }\n\n        },\n        closeClient: function() {\n            if (popup) {\n                popup.close();\n            }\n            timer && clearInterval(timer);\n        },\n        init: function(args) {\n            var t = this;\n            var params = parseQuery();\n\n            if (params._multiscreen === '1') {\n                this.role = 'client';\n                var url = location.href.replace('_multiscreen=1', '_multiscreen=control');\n\n                var sWidth = screen.width,\n                    sHeight = screen.height,\n                    tWidth = sWidth * 0.8,\n                    tHeight = sHeight * 0.8;\n\n                var temp = 'height=' + tHeight + ',width=' + tWidth + ',top=' + 10 + ',left=' + (sWidth - tWidth) / 2 + ',toolbar=no,menubar=no,location=yes,resizable=yes,scrollbars=no,status=no';\n                popup = window.open(url, 'ppt', temp);\n                window.addEventListener('message', this.evtClient, false);\n                window.addEventListener('beforeunload', this.closeClient, false);\n            } else if (params._multiscreen === 'control') {\n                this.role = 'control';\n                //如果是控制端，则重写proxyFn函数\n                Slide.proxyFn = function(fnName, args) {\n                    args = JSON.stringify(args);\n                    window.opener.postMessage({\n                        action: 'userOrder',\n                        fn: fnName,\n                        args: args\n                    }, '*');\n                }\n                var $body = document.body;\n                $body.classList.add('popup');\n                $body.classList.add('with-notes');\n                var $timer = document.createElement('time');\n                $timer.id = '_timer_';\n                $body.appendChild($timer);\n                var hour = 0,\n                    sec = 0,\n                    min = 0;\n                timer = setInterval(function() {\n                    sec++;\n                    if (sec === 60) {\n                        sec = 0;\n                        min++;\n                    }\n                    if (min === 60) {\n                        hour++;\n                    }\n                    $timer.innerHTML = ['时间：' + time2str(hour), time2str(min), time2str(sec) + ' 幻灯片：' + Slide.current + '/' + Slide.count].join(':');\n                }, 1000);\n                postWin = window.opener;\n            }\n        }\n    };\n\n    function time2str(time) {\n        time = '00' + time;\n        return time.substr(-2);\n    }\n    return postMSG;\n});\n"
  },
  {
    "path": "ppt/think-in-css/js/nodeppt.control.socket.js",
    "content": "var socketIOURL = '//' + location.host + '/socket.io/socket.io.js';\n\nSlide.Control.add('socket', function(S, broadcast) {\n    S.clientUID = 0;\n\n    function time2str(time) {\n        time = '00' + time;\n        return time.substr(-2);\n    }\n    var showQrcode;\n    var qrcodeLink = function() {\n        //按 q显示控制区域二维码\n        document.addEventListener('keydown', function(e) {\n            if (e.keyCode === 81) {\n                showQrcode(e);\n            }\n        }, true);\n        var $layer = document.createElement('div');\n        $layer.className = 'qrcode';\n        $layer.id = 'qrcodeBox';\n        $layer.innerHTML = '<div id=\"qrcode\"></div><p><a id=\"ctrlLink\" href=\"#\" target=\"_blank\">打开控制端</a></p>';\n        var $body = document.getElementsByTagName('body')[0];\n        $body.appendChild($layer);\n        var $container = document.getElementById('container');\n\n        showQrcode = function(e) {\n            if (showQrcode.isShow) {\n                // $container.style.display = 'block';\n                $layer.style.display = 'none';\n                showQrcode.isShow = false;\n            } else {\n                // $container.style.display = 'none';\n                $layer.style.display = 'block';\n                showQrcode.isShow = true;\n            }\n        };\n    };\n\n    var webSocket;\n\n    var Socket = {\n        host: '',\n        role: '', //角色\n        clientConnect: function() {\n            //角色是client，即被控制端，则连控制端服务器\n            webSocket.on('data from another client', function(data) {\n                var action = data.action;\n                switch (action) {\n                    case 'from control order':\n                        var fnName = data.fn;\n                        var args = data.args;\n                        try {\n                            args = JSON.parse(args);\n                        } catch (e) {}\n                        Slide.proxyFn(fnName, args);\n                        break;\n                    case 'from control updateItem':\n                    case 'from control update':\n                    case 'from control key event':\n                        broadcast.fire(action, data);\n                        break;\n                    default:\n                        broadcast.fire(action, data.data);\n                }\n            });\n\n        },\n        controlConnect: function() {\n            webSocket.emit('add client', {\n                targetUid: this.clientUID\n            });\n\n            //控制端不在直接运行函数，而是变成发送socket给client\n            //注意参数，进行了json处理哦~\n            Slide.proxyFn = function(fnName, args) {\n                args = JSON.stringify(args);\n                webSocket.emit('repost data', {\n                    action: 'from control order',\n                    fn: fnName,\n                    args: args\n                });\n            };\n            //角色是控制端，则连被控制端（client）服务器\n\n            webSocket.on('data from another client', function(data) {\n                var action = data.action;\n                if (action.indexOf('client') !== -1) {\n                    return;\n                }\n                action = action.replace('client', 'control');\n\n                broadcast.fire(action, data);\n            });\n\n        },\n        connect: function() {\n            webSocket = io.connect(location.host + '/ppt');\n            // console.log(io);\n            webSocket.on('UUID', function(uid) {\n                webSocket.uid = uid;\n                if (Socket.role === 'client') {\n                    MixJS.loadJS('/js/qrcode.js', function() {\n                        qrcodeLink();\n                        var url = location.href.split('#')[0];\n                        url += (!~url.indexOf('?')) ? '?' : '&';\n                        url += 'iscontroller=1&clientid=' + encodeURIComponent(uid);\n                        var qrcode = new QRCode('qrcode', {\n                            text: url,\n                            width: 256,\n                            height: 256\n                        });\n                        document.getElementById('ctrlLink').href = url;\n                    });\n                }\n            });\n            webSocket.on('system', function(data) {\n                // console.log(data);\n                if (showQrcode && showQrcode.isShow) {\n                    showQrcode();\n                }\n            });\n\n            this[this.role + 'Connect']();\n        },\n        broadcast: function(evtName, data) {\n            webSocket.emit('repost data', {\n                action: 'from control ' + evtName,\n                data: data\n            });\n        },\n        update: function(id, direction) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' update',\n                id: id,\n                direction: direction\n            });\n        },\n        updateItem: function(id, item, direction) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' updateItem',\n                id: id,\n                item: item,\n                direction: direction\n            });\n        },\n        keyEvent: function(keyCode) {\n            webSocket.emit('repost data', {\n                action: 'from ' + Socket.role + ' key event',\n                keyCode: keyCode\n            });\n        },\n\n        init: function(args) {\n            this.host = args.host || location.href;\n            this.clientUID = args.clientId;\n            // console.log(this.clientUID);\n            //角色，是否为控制端\n            if (args.isControl) {\n                this.role = 'control';\n                var $body = document.body;\n                $body.classList.add('popup');\n                $body.classList.add('with-notes');\n                var $timer = document.createElement('time');\n                $timer.id = '_timer_';\n                $body.appendChild($timer);\n                var hour = 0,\n                    sec = 0,\n                    min = 0;\n                timer = setInterval(function() {\n                    sec++;\n                    if (sec === 60) {\n                        sec = 0;\n                        min++;\n                    }\n                    if (min === 60) {\n                        hour++;\n                    }\n                    $timer.innerHTML = ['时间：' + time2str(hour), time2str(min), time2str(sec) + ' 幻灯片：' + Slide.current + '/' + Slide.count].join(':');\n                }, 1000);\n            } else {\n                this.role = 'client';\n            }\n            if (args.shake) {\n                //添加shake\n                MixJS.loadJS(Slide.dir + 'shake.js', function() {\n                    var lastTime = Date.now();\n                    window.addEventListener('shake', function() {\n                        var now = Date.now();\n                        if (now - lastTime > 3000) {\n                            lastTime = now;\n                            Slide.next();\n                        }\n                    }, true);\n\n                });\n            }\n\n            if (window.io && io.connect) {\n                //已经存在\n                Socket.connect();\n            } else {\n                MixJS.loadJS(socketIOURL, function() {\n                    Socket.connect();\n                });\n            }\n\n        }\n    };\n    return Socket;\n});\n"
  },
  {
    "path": "ppt/think-in-css/js/nodeppt.js",
    "content": "(function($win, $doc, $B, loadJS, loadCSS, undefined) {\n    //用于单页ppt预加载资源\n    var preloadFn = {\n        loadJS: loadJS,\n        loadCSS: loadCSS\n    };\n\n    var $body = $doc.body;\n    var emptyFn = function() {};\n    var emptyArr = [];\n\n    var touchDX = 0; //touch事件x数据\n    var touchDY = 0; //touch事件y数据\n    var touchStartX = 0;\n    var touchStartY = 0;\n    var ISSYNC = false;\n\n    var ctrlType = 'bind';\n    var doHash = true;\n    var lockSlide = false;\n    var slideWidth; //单页宽度\n    var slideHeight;\n    var curIndex = 0; //当前幻灯片索引\n    var pastIndex = 0; //上一个幻灯片索引\n    var $progress; //进度条\n    var $container; //幻灯片容器\n    var $slides; //幻灯片集合\n    var $drawBoard; //画板\n    var $slideTip;\n    var slideCount; //幻灯片总页数-1\n    var QUERY = queryToJson(location.search);\n\n    function queryToJson(url) {\n        url = !!url ? decodeURIComponent(url) : '';\n\n        var locse = url.split('?'),\n            search = locse[1] ? locse[1] : locse[0],\n            pairs = search.split('&'),\n            result = {};\n\n        pairs.forEach(function(pair) {\n            pair = pair.split('=');\n            if (pair[0].length > 0) {\n                result[pair[0]] = pair[1] || '';\n            }\n        });\n\n        return result;\n    }\n\n    //设置底部进度条\n    function setProgress() {\n        //添加dataset\n        Slide.current = curIndex + 1;\n        if ($progress) {\n            $progress.style.width = ((curIndex + 1) / (slideCount + 1)) * 100 + '%';\n        }\n    }\n\n    //泛数组转换为数组\n    function toArray(arrayLike) {\n        return emptyArr.slice.call(arrayLike);\n    }\n\n    //封装选择器\n    function $(selector, context) {\n        context = (context && context.nodeType === 1) ? context : $doc;\n        return context.querySelectorAll(selector);\n    }\n\n    //getID方法\n    function $$(id) {\n        return $doc.getElementById(id);\n    }\n\n\n    //上一页\n    function prevSlide(isControl) {\n        if (buildPrevItem()) {\n            return;\n        }\n        slideOutCallBack($slides[curIndex]);\n        pastIndex = curIndex;\n        --curIndex < 0 && (curIndex = 0);\n        doSlide('prev', isControl ? false : true);\n    }\n\n    //下一页\n    function nextSlide(isControl) {\n        if (buildNextItem()) {\n            // $B.fire('slide change ID',{\n            //    slideID:curIndex\n            // })\n            return;\n        }\n        slideOutCallBack($slides[curIndex]);\n        pastIndex = curIndex;\n        ++curIndex > slideCount && (curIndex = slideCount);\n        doSlide('next', isControl ? false : true);\n        preload($slides[curIndex])($slides[curIndex + 1]);\n    }\n\n\n    //slide切入回调incallback\n    //<slide data-incallback=\"\"\n    var slideInTimer;\n\n    function slideInCallBack() {\n        if (slideInTimer) {\n            clearTimeout(slideInTimer);\n        }\n        slideInTimer = setTimeout(slideInCallBack_, 1500);\n    }\n\n    function slideInCallBack_() {\n        var $cur = $slides[curIndex];\n        if (!$cur || ($cur && $cur.nodeType !== 1)) {\n            return;\n        }\n        var cb = $cur.dataset.incallback;\n        //如果有data-incallback那么就执行callback\n        cb && typeof $win[cb] === 'function' && proxyFn(cb);\n        //检测iframe\n        var $iframe = toArray($('iframe[data-src]', $cur));\n        if ($iframe.length) {\n            $iframe.forEach(function(v) {\n                var src = v.dataset.src;\n                v.src = src;\n            });\n\n        }\n    }\n\n    //slide切出回调outcallback\n    //<slide data-outcallback=\"\"\n    var slideOutTimer;\n\n    function slideOutCallBack(prev) {\n        if (!prev || (prev && prev.nodeType !== 1)) {\n            return;\n        }\n        if (slideOutTimer) {\n            clearTimeout(slideOutTimer);\n        }\n        slideOutTimer = setTimeout(function() {\n            slideOutCallBack_(prev);\n        }, 1500);\n    }\n\n    function slideOutCallBack_(prev) {\n        var cb = prev.dataset.outcallback;\n        //如果有data-outcallback那么就执行callback\n        cb && typeof $win[cb] === 'function' && proxyFn(cb);\n    }\n\n    //预加载资源\n    //<preload data-type=\"js||css\" data-url=\"\">\n    function preload(node) {\n        var self = arguments.callee;\n        if (node && node.nodeType === 1) {\n            var $preload = $('preload', node),\n                len = $preload.length;\n            while (len--) {\n                var tmpNode = $preload[len],\n                    dataset = tmpNode.dataset,\n                    type = dataset.type,\n                    url = dataset.url;\n                var fn = preloadFn['load' + type.toUpperCase()];\n                typeof fn === 'function' && fn(url, function(tmpNode) {\n                    return function() {\n                        //将该标签删除，释放内存\n                        tmpNode.parentNode && tmpNode.parentNode.removeChild(tmpNode);\n                        tmpNode = null;\n                    };\n                }(tmpNode));\n            }\n        }\n        return self;\n    }\n\n\n    //单行前进\n    function buildNextItem(iscontrol) {\n        if ($body.classList.contains('overview')) {\n            return false;\n        }\n        $curSlide = $slides[curIndex];\n        var subBuilded = toArray($('.building'), $curSlide);\n        var list;\n        if (subBuilded.length) {\n\n            while (list = subBuilded.shift()) {\n                list = list.classList\n                list.remove('building');\n                list.add('builded');\n            }\n        }\n        var toBuild = $('.tobuild', $curSlide);\n\n        if (!toBuild.length) {\n            return false;\n        }\n\n        var item = toBuild.item(0);\n        !iscontrol && $B.fire('slide do build', {\n            slideID: curIndex,\n            direction: 'next',\n            build: item.dataset.index\n        })\n        list = item.classList;\n\n        $B.fire('slide.update', curIndex | 0, (item.dataset.index | 0) + 1, 'next');\n        list.remove('tobuild');\n\n        if (list.contains('subSlide')) {\n            toArray($('.subSlide.builded', $curSlide)).forEach(function($item) {\n                $item.classList.add('subBuilded');\n            });\n        }\n\n        list.add('building');\n        return true;\n    }\n\n    //单条往后走\n    function buildPrevItem() {\n        if ($body.classList.contains('overview')) {\n            return false;\n        }\n        $curSlide = $slides[curIndex];\n        var subBuilded = toArray($('.building'), $curSlide);\n        var list;\n        var buildingLen = subBuilded.length;\n        var curList;\n\n        if (buildingLen) {\n            while (list = subBuilded.shift()) {\n                var clist = list.classList\n                clist.remove('building');\n                clist.add('tobuild');\n                curList = list;\n                if (clist.contains('subSlide')) {\n                    var $item = toArray($('.subSlide.builded.subBuilded', $curSlide)).pop();\n                    $item && $item.classList.remove('subBuilded');\n                }\n            }\n        }\n        var builded = toArray($('.builded', $curSlide));\n        if (!builded.length && !buildingLen) {\n            return false;\n        }\n\n        var item = builded.pop();\n        if (item) {\n            if (!curList) {\n                curList = item;\n            }\n            list = item.classList;\n            list.remove('builded');\n            if (buildingLen === 0) {\n                list.add('tobuild');\n                item = builded.pop();\n                item.classList.remove('builded');\n                item.classList.add('building');\n            } else {\n                list.add('building');\n            }\n\n        }\n\n        $B.fire('slide do build', {\n            slideID: curIndex,\n            direction: 'prev',\n            build: curList.dataset.index\n        });\n        $B.fire('slide.update', curIndex | 0, (curList.dataset.index | 0) + 1, 'prev');\n        return true;\n    }\n\n    //设置单行页面添加\n    function makeBuildLists() {\n        var i = slideCount;\n        var slide;\n        var transition = defaultOptions.transition;\n        var buildClass = '.build > *,.fadeIn > *,.rollIn > *,.moveIn > *,.bounceIn > *,.zoomIn > *,.fade > *,.subSlide';\n        while (slide = $slides[i--]) {\n\n            var $items = toArray($(buildClass, slide));\n            var dataset = slide.dataset;\n            $items.forEach(function($v, i) {\n                $v.classList.add('tobuild');\n                if(!('index' in $v.dataset)){\n                    $v.dataset.index = i;\n                }\n            });\n\n\n            if (!dataset.transition) {\n                dataset.transition = transition;\n            }\n        }\n\n    }\n\n    //切换动画\n    function doSlide(direction, isSync) {\n        ISSYNC = typeof isSync === 'boolean' ? isSync : true;\n\n        // $container.style.marginLeft = -(slideID * slideWidth) + 'px';\n        updateSlideClass();\n        setProgress();\n        //发布slide切换状态广播\n        ISSYNC && $B.fire('slide change ID', {\n            slideID: curIndex,\n            direction: direction\n        });\n        if (doHash) {\n            lockSlide = true;\n            $win.location.hash = \"#\" + curIndex;\n        }\n        slideInCallBack();\n        removePaint();\n\n        if ($doc.body.classList.contains('overview')) {\n            focusOverview_();\n            return;\n        } else if (!$doc.body.classList.contains('popup')) {\n            $doc.body.classList.remove('with-notes');\n        }\n\n    }\n\n    function updateSlideClass() {\n        var curSlide = curIndex;\n        var pageClass = 'pagedown';\n        if (pastIndex === curIndex) {\n            $cur = $slides[curIndex];\n            if ($cur.classList.contains('pageup')) {\n                return;\n            }\n        }\n        if (pastIndex > curIndex) {\n            //往前翻页\n            pageClass = 'pageup';\n        } else {\n            //往后翻页\n        }\n        for (var i = 0, len = $slides.length; i < len; ++i) {\n            switch (i) {\n                case curSlide - 2:\n                    updateSlideClass_(i, 'far-past', pageClass);\n                    break;\n                case curSlide - 1:\n                    updateSlideClass_(i, 'past', pageClass);\n                    break;\n                case curSlide:\n                    updateSlideClass_(i, 'current', pageClass);\n                    break;\n                case curSlide + 1:\n                    updateSlideClass_(i, 'next', pageClass);\n                    break;\n                case curSlide + 2:\n                    updateSlideClass_(i, 'far-next', pageClass);\n                    break;\n                default:\n                    updateSlideClass_(i);\n                    break;\n            }\n        }\n        $B.fire('slide.update', curIndex, 0, pageClass);\n\n    }\n\n    function overview(isFromControl) {\n        $body.classList.toggle('overview');\n        focusOverview_();\n        if (!isFromControl) {\n            $B.fire('overview');\n        }\n    }\n\n    function focusOverview_() {\n        var isOV = $doc.body.classList.contains('overview');\n        for (var i = 0, slide; slide = $slides[i]; i++) {\n            slide.style.transform = slide.style.webkitTransform = slide.style.msTransform = slide.style.mozTransform = isOV ?\n                'translateZ(-2500px) translate(' + ((i - curIndex) * 105) +\n                '%, 0%)' : '';\n            slide.style.animation = slide.style.webkitAnimation = slide.style.msAnimation = slide.style.mozAnimation = isOV ?\n                'none' : '';\n            Slide.fire(isOV ? 'overviewshown' : 'overviewhidden');\n        }\n    }\n\n    function updateSlideClass_(slideNo, className, pageClass) {\n        var el = $slides[slideNo];\n\n        if (!el) {\n            return;\n        }\n        if (className) {\n            el.classList.add(className);\n        }\n        if (pageClass && location.href.indexOf('_multiscreen=control') === -1 && location.href.indexOf('iscontroller=1') === -1) {\n            el.classList.add(pageClass);\n        }\n\n        var arr = ['next', 'past', 'far-next', 'far-past', 'current', 'pagedown', 'pageup'];\n        arr.forEach(function(v) {\n            if (className !== v && pageClass !== v) {\n                el.classList.remove(v);\n            }\n        });\n\n    }\n\n    //显示tips\n    function showTips(msg) {\n        if (!$slideTip) {\n            return;\n        }\n        $slideTip.innerHTML = msg;\n        $slideTip.style.display = 'block';\n        setTimeout(function() {\n            $slideTip.style.display = 'none';\n        }, 3E3);\n    }\n\n\n    /*************************events***************/\n\n    //pc键盘翻页事件逻辑\n    function evtDocUp(e) {\n        var key = e.keyCode;\n        var target = e.target;\n        //防止input和textarea，和可以编辑tag\n        if (/^(input|textarea)$/i.test(target.nodeName) || target.isContentEditable) {\n            return;\n        }\n        if (!e.isFromControl) {\n            switch (key) {\n                case 13:\n                case 72:\n                case 87:\n                case 79:\n                case 78:\n                case 80:\n                case 67:\n                    $B.fire('slide event keyup', e);\n                    break;\n            }\n        }\n        switch (key) {\n            case 13:\n                // Enter\n                if ($doc.body.classList.contains('overview')) {\n                    overview(e.isFromControl);\n                }\n\n                break;\n            case 72:\n                // H: Toggle code highlighting\n                $doc.body.classList.toggle('highlight-code');\n                setTimeout(function() {\n                    $doc.body.classList.toggle('highlight-code');\n                }, 2000);\n                break;\n                // 下掉宽屏模式，默认width：100%\n            case 87:\n                // W: Toggle widescreen\n                // Only respect 'w' on body. Don't want to capture keys from an <input>.\n                if (!(e.shiftKey && e.metaKey)) {\n                    if (!$body.classList.contains('popup'))\n                        $container.classList.toggle('layout-widescreen');\n                }\n                break;\n            case 79:\n                // O: Toggle overview\n                overview(e.isFromControl);\n\n                break;\n            case 78:\n                // N\n                if (!$body.classList.contains('popup'))\n                    $doc.body.classList.toggle('with-notes');\n                break;\n            case 80:\n                //P\n                if (!$body.classList.contains('popup')) {\n                    showPaint(e.isFromControl);\n                }\n                break;\n            case 67:\n                //c\n                if (!$body.classList.contains('popup')) {\n                    removePaint(e.isFromControl);\n                }\n                break;\n                //上一页\n            case 33:\n                // pg up\n            case 37:\n                // left\n            case 38:\n                // up\n                prevSlide();\n                break;\n                //下一页\n                // case 9:\n                // tab\n            case 32:\n                // space\n            case 34:\n                // pg down\n            case 39:\n                // right\n            case 40:\n                // down\n                nextSlide()\n                break;\n        }\n\n        //        $container.style.marginLeft = -(curIndex * slideWidth) + 'px';\n        //        setProgress();\n        //        setHistory();\n    }\n\n    /******************************** Touch events *********************/\n    var isStopTouchEvent = false;\n\n    function evtTouchStart(event) {\n        if (!isStopTouchEvent && event.touches.length === 1) {\n            touchDX = 0;\n            touchDY = 0;\n            var touch = event.touches[0];\n            touchStartX = touch.pageX;\n            touchStartY = touch.pageY;\n            //捕获，尽早发现事件\n            $body.addEventListener('touchmove', evtTouchMove, true);\n            $body.addEventListener('touchend', evtTouchEnd, true);\n        }\n    }\n\n    //touch事件\n    function evtTouchMove(event) {\n        if (event.touches.length > 1) {\n            cancelTouch();\n        } else {\n            var touch = event.touches[0];\n\n            touchDX = touch.pageX - touchStartX;\n            touchDY = touch.pageY - touchStartY;\n        }\n        event.preventDefault();\n\n    }\n\n    //touchend事件\n    function evtTouchEnd(event) {\n        var dx = Math.abs(touchDX);\n        var dy = Math.abs(touchDY);\n\n        if ((dx > 15) && (dy < (dx * 2 / 3))) {\n            if (touchDX > 0) {\n                prevSlide();\n            } else {\n                nextSlide();\n            }\n        }\n        cancelTouch();\n    }\n\n    //取消绑定\n    function cancelTouch() {\n        $body.removeEventListener('touchmove', evtTouchMove, true);\n        $body.removeEventListener('touchend', evtTouchEnd, true);\n    }\n\n    //绑定事件\n    function bindEvent() {\n        $doc.addEventListener('keyup', evtDocUp, false);\n        $body.addEventListener('touchstart', evtTouchStart, false);\n        $$('_btn-bar').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n                if (!isOpen) {\n                    this.classList.remove('fa-bars');\n                    this.classList.add('fa-close');\n                    $$('_btn-box').style.display = 'inline-block';\n                } else {\n                    this.classList.remove('fa-close');\n                    this.classList.add('fa-bars');\n                    $$('_btn-box').style.display = 'none';\n\n                }\n                isOpen = !isOpen;\n            };\n        }(), false);\n        $$('_btn-prev').addEventListener('click', prevSlide, false);\n        $$('_btn-next').addEventListener('click', nextSlide, false);\n        $$('_btn-overview').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n\n                if (isOpen) {\n                    this.classList.add('fa-compress');\n                    this.classList.remove('fa-expand');\n                } else {\n                    this.classList.add('fa-expand');\n                    this.classList.remove('fa-compress');\n                }\n\n                overview();\n                isOpen = !isOpen;\n            };\n        }(), false);\n        $$('_btn-brush').addEventListener('click', function() {\n            var isOpen = false;\n            return function() {\n                if (isOpen) {\n                    this.classList.add('fa-paint-brush');\n                    this.classList.remove('fa-eraser');\n                    removePaint();\n                } else {\n                    showPaint();\n                    this.classList.add('fa-eraser');\n                    this.classList.remove('fa-paint-brush');\n                }\n                isOpen = !isOpen;\n            }\n        }(), false);\n\n        $win.addEventListener('hashchange', function() {\n            if (location.hash && !lockSlide) {\n                doHash = false;\n                slideOutCallBack($slides[curIndex]);\n                pastIndex = curIndex;\n                curIndex = location.hash.substr(1) | 0;\n\n                doSlide();\n                doHash = true;\n            }\n            lockSlide = false;\n        }, true);\n    }\n\n\n    /***********画图部分事件处理函数************/\n    //画图前准备\n\n    function drawCanvasReady() {\n            $drawBoard.context = $drawBoard.getContext('2d');\n            var context = $drawBoard.context;\n            context.lineWidth = 3;\n            context.lineCap = 'round';\n            context.strokeStyle = \"red\";\n        }\n        //显示画板\n    var isControl = 0;\n\n    function showPaint(isFromControl) {\n            if (!$drawBoard) {\n                return;\n            }\n\n            //1、将翻页停止\n            isStopTouchEvent = true;\n            //2、将管理模式去掉\n            if ($body.classList.contains('with-notes')) {\n                isControl = 1;\n                $body.classList.remove('with-notes');\n                $body.classList.remove('popup');\n            }\n            $drawBoard.width = $body.clientWidth;\n            $drawBoard.height = $body.clientHeight;\n            drawCanvasReady();\n\n            $drawBoard.style.display = '';\n            $container.style.overflow = 'hidden';\n\n            $drawBoard.addEventListener('mousedown', pMouseDown, true);\n            $drawBoard.addEventListener('mouseup', pMouseUp, true);\n            $drawBoard.addEventListener('mousemove', pMouseMove, true);\n            //滑动\n            $drawBoard.addEventListener('touchmove', pMouseMove, true);\n            $drawBoard.addEventListener('touchend', pMouseUp, true);\n            $drawBoard.addEventListener('touchcancel', pMouseUp, true);\n            $drawBoard.addEventListener('touchstart', pMouseDown, true);\n\n            $doc.addEventListener('selectstart', stopSelect, true);\n            if (!isFromControl) {\n                $B.fire('show paint');\n            }\n        }\n        //禁止选中\n\n    function stopSelect() {\n            return false;\n        }\n        //清除画板内容\n\n    function clearPaint() {\n            $container.style.overflow = '';\n            $drawBoard.context && $drawBoard.context.clearRect(0, 0, slideWidth, slideHeight);\n            $drawBoard.style.display = 'none';\n        }\n        //删除画板\n    var removePaint = function(isFromControl) {\n        clearPaint();\n        if (isControl) {\n            $body.classList.add('with-notes');\n            $body.classList.add('popup');\n        }\n        isStopTouchEvent = false;\n        $drawBoard.removeEventListener('mousedown', pMouseDown);\n        $drawBoard.removeEventListener('mouseup', pMouseUp);\n        $drawBoard.removeEventListener('mousemove', pMouseMove);\n        //滑动\n        $drawBoard.removeEventListener('touchstart', pMouseDown);\n        $drawBoard.removeEventListener('touchmove', pMouseMove);\n        $drawBoard.removeEventListener('touchend', pMouseUp);\n        $drawBoard.removeEventListener('touchcancel', pMouseUp);\n\n\n        $doc.removeEventListener('selectstart', stopSelect, true);\n        if (!isFromControl) {\n            $B.fire('remove paint');\n        }\n    };\n    var pMouseDown = function(e) {\n        $drawBoard.isMouseDown = true;\n        //        $drawBoard.iLastX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);\n        //        $drawBoard.iLastY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);\n        var x = $drawBoard.iLastX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));\n        var y = $drawBoard.iLastY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));\n        pPoints.push({\n            x: x,\n            y: y\n        });\n    };\n    var pPoints = [];\n    var pMouseUp = function(e) {\n        $drawBoard.isMouseDown = false;\n        $drawBoard.iLastX = -1;\n        $drawBoard.iLastY = -1;\n        if (!e.isFromControl) {\n            $B.fire('paint points', pPoints);\n        }\n        pPoints.length = 0;\n    };\n    $B.on('from control paint points', function(data) {\n        // console.log(data);\n        var points = data.points;\n        //远程来的屏幕\n        var wh = data.screen;\n        var tOX = wh.width / 2,\n            tOY = wh.height / 2;\n\n        var width = $body.offsetWidth;\n        var height = $body.offsetHeight;\n        var cOX = width / 2,\n            cOY = height / 2;\n\n        var iw = width / wh.width;\n        var ih = height / wh.height;\n\n        var context = $drawBoard.context;\n        context.beginPath();\n        var startX = cOX - (tOX - points[0].x) * iw;\n        var startY = cOY - (tOY - points[0].y) * ih;\n        // console.log(startX, points[0].x, startY, iw, wh);\n        context.moveTo(startX, startY);\n        for (var i = 0, len = points.length; i < len; i++) {\n            context.lineTo(cOX - (tOX - points[i].x) * iw, cOY - (tOY - points[i].y) * ih);\n        }\n        context.stroke();\n    });\n    var pMouseMove = function(e) {\n        if ($drawBoard.isMouseDown) {\n            //            var iX = e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft);\n            //            var iY = e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop);\n            var iX = e.layerX || e.offsetX || (e.clientX - $drawBoard.offsetLeft + ($win.pageXOffset || $doc.body.scrollLeft || $doc.documentElement.scrollLeft));\n            var iY = e.layerY || e.offsetY || (e.clientY - $drawBoard.offsetTop + ($win.pageYOffset || $doc.body.scrollTop || $doc.documentElement.scrollTop));\n            var context = $drawBoard.context;\n            context.beginPath();\n            context.moveTo($drawBoard.iLastX, $drawBoard.iLastY);\n            context.lineTo(iX, iY);\n            context.stroke();\n            $drawBoard.iLastX = iX;\n            $drawBoard.iLastY = iY;\n            pPoints.push({\n                x: iX,\n                y: iY\n            });\n            e.preventDefault();\n        }\n    };\n    //代理函数，用于函数控制\n\n    function proxyFn(fnName, args) {\n        $win[fnName](args);\n    }\n\n    /**\n     * 默认配置\n     * @type {Object}\n     */\n    var defaultOptions = {\n        containerID: 'container',\n        isControlDevice: false,\n        drawBoardID: 'drawBoard',\n        slideClass: '.slide',\n        buildClass: '.build',\n        progressID: 'progress',\n        transition: '',\n        tipID: 'tip',\n        webSocketHost: '',\n        width: 900,\n        dir: './',\n        height: 700,\n        control: false\n    };\n\n    //初始化变量\n    function initVar() {\n\n        $slideTip = $$(defaultOptions.tipID);\n        $container = $$(defaultOptions.containerID);\n        slideWidth = defaultOptions.width;\n        slideHeight = defaultOptions.height;\n        $progress = $$(defaultOptions.progressID);\n        Slide.$slides = $slides = toArray($(defaultOptions.slideClass, $container));\n\n        slideCount = $slides.length; //幻灯片总页数-1\n        Slide.count = slideCount;\n\n        // $container.style.width = slideCount*slideWidth + 'px';//设置容器总宽度\n        slideCount--;\n        $drawBoard = $$(defaultOptions.drawBoardID);\n        if ($drawBoard) {\n            $drawBoard.style.display = 'none';\n        }\n    }\n\n    function fullImg() {\n\n        loadJS(defaultOptions.dir + 'img.screenfull.js', function() {\n            //图片处理\n            var $imgs = toArray($(defaultOptions.slideClass + ' img', $container));\n            screenfull($imgs);\n        });\n    }\n\n    function loadTheme() {\n        if (defaultOptions.theme) {\n            loadCSS('/css/theme.' + defaultOptions.theme + '.css')\n        }\n    }\n\n    //初始化\n    function init(options) {\n        options = options || {};\n\n        for (var key in defaultOptions) {\n            if (!!(key in options)) {\n                defaultOptions[key] = options[key];\n            }\n        }\n        ['theme', 'transition'].forEach(function(v) {\n            if (QUERY && QUERY[v]) {\n                defaultOptions[v] = QUERY[v];\n            }\n        });\n\n        Slide.dir = defaultOptions.dir;\n        if (defaultOptions.control) {\n            var control = defaultOptions.control;\n            loadJS(defaultOptions.dir + 'nodeppt.control.js', function() {\n                Slide.Control.load(control.type, control.args);\n            });\n        }\n\n\n        initVar(); //初始化变量\n        loadTheme();\n        makeBuildLists();\n        fullImg(); //图片全屏\n        bindEvent();\n        pastIndex = curIndex;\n        if (location.hash && (curIndex = (location.hash.substr(1) | 0))) {\n            doSlide();\n        } else {\n            updateSlideClass();\n            setProgress();\n            slideInCallBack();\n        }\n        preload($slides[curIndex])($slides[curIndex + 1]);\n        $body.style.opacity = 1;\n    }\n    var Slide = {\n        init: init,\n        next: nextSlide,\n        prev: prevSlide,\n        doSlide: doSlide,\n        proxyFn: proxyFn,\n        showPaint: showPaint,\n        removePaint: removePaint,\n        buildNextItem: buildNextItem,\n        buildPrevItem: buildPrevItem\n    };\n    ['on', 'un', 'fire'].forEach(function(v) {\n        Slide[v] = function() {\n            var args = toArray(arguments);\n            args[0] = 'slide.' + args[0];\n            $B[v].apply(null, args);\n        }\n    });\n\n    $win.Slide = Slide;\n\n}(window, document, MixJS.event.broadcast, MixJS.loadJS, MixJS.loadCSS));\n"
  },
  {
    "path": "ppt/think-in-css/js/prettify.js",
    "content": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:\"0\"<=b&&b<=\"7\"?parseInt(a.substring(1),8):b===\"u\"||b===\"x\"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?\"\\\\x0\":\"\\\\x\")+a.toString(16);a=String.fromCharCode(a);if(a===\"\\\\\"||a===\"-\"||a===\"[\"||a===\"]\")a=\"\\\\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\S\\s]|[^\\\\]/g),a=\n[],b=[],o=f[0]===\"^\",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&\"-\"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=[\"[\"];o&&b.push(\"^\");b.push.apply(b,a);for(c=0;c<\nf.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push(\"-\"),b.push(e(i[1])));b.push(\"]\");return b.join(\"\")}function y(a){for(var f=a.source.match(/\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*]|\\\\u[\\dA-Fa-f]{4}|\\\\x[\\dA-Fa-f]{2}|\\\\\\d+|\\\\[^\\dux]|\\(\\?[!:=]|[()^]|[^()[\\\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j===\"(\"?++i:\"\\\\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j===\"(\"?(++i,d[i]===void 0&&(f[c]=\"(?:\")):\"\\\\\"===j.charAt(0)&&\n(j=+j.substring(1))&&j<=i&&(f[c]=\"\\\\\"+d[i]);for(i=c=0;c<b;++c)\"^\"===f[c]&&\"^\"!==f[c+1]&&(f[c]=\"\");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a===\"[\"?f[c]=h(j):a!==\"\\\\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return\"[\"+String.fromCharCode(a&-33,a|32)+\"]\"}));return f.join(\"\")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\\\u[\\da-f]{4}|\\\\x[\\da-f]{2}|\\\\[^UXux]/gi,\"\"))){s=!0;l=!1;break}}for(var r=\n{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(\"\"+g);n.push(\"(?:\"+y(g)+\")\")}return RegExp(n.join(\"|\"),l?\"gi\":\"g\")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if(\"BR\"===g||\"LI\"===g)h[s]=\"\\n\",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\\r\\n?/g,\"\\n\"):g.replace(/[\\t\\n\\r ]+/g,\" \"),h[s]=g,t[s<<1]=y,y+=g.length,\nt[s++<<1|1]=a)}}var e=/(?:^|\\s)nocode(?:\\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);m(a);return{a:h.join(\"\").replace(/\\n$/,\"\"),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,\"pln\"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===\n\"string\")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b=\"pln\")}if((c=b.length>=5&&\"lang-\"===b.substring(0,5))&&!(o&&typeof o[1]===\"string\"))c=!1,b=\"src\";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),\nl=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=\"\"+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\\S\\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push([\"str\",/^(?:'''(?:[^'\\\\]|\\\\[\\S\\s]|''?(?=[^']))*(?:'''|$)|\"\"\"(?:[^\"\\\\]|\\\\[\\S\\s]|\"\"?(?=[^\"]))*(?:\"\"\"|$)|'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$))/,q,\"'\\\"\"]):a.multiLineStrings?m.push([\"str\",/^(?:'(?:[^'\\\\]|\\\\[\\S\\s])*(?:'|$)|\"(?:[^\"\\\\]|\\\\[\\S\\s])*(?:\"|$)|`(?:[^\\\\`]|\\\\[\\S\\s])*(?:`|$))/,\nq,\"'\\\"`\"]):m.push([\"str\",/^(?:'(?:[^\\n\\r'\\\\]|\\\\.)*(?:'|$)|\"(?:[^\\n\\r\"\\\\]|\\\\.)*(?:\"|$))/,q,\"\\\"'\"]);a.verbatimStrings&&e.push([\"str\",/^@\"(?:[^\"]|\"\")*(?:\"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push([\"com\",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,\"#\"]):m.push([\"com\",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\\b|[^\\n\\r]*)/,q,\"#\"]),e.push([\"str\",/^<(?:(?:(?:\\.\\.\\/)*|\\/?)(?:[\\w-]+(?:\\/[\\w-]+)+)?[\\w-]+\\.h|[a-z]\\w*)>/,q])):m.push([\"com\",/^#[^\\n\\r]*/,\nq,\"#\"]));a.cStyleComments&&(e.push([\"com\",/^\\/\\/[^\\n\\r]*/,q]),e.push([\"com\",/^\\/\\*[\\S\\s]*?(?:\\*\\/|$)/,q]));a.regexLiterals&&e.push([\"lang-regex\",/^(?:^^\\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|,|-=|->|\\/|\\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\\^=|\\^\\^|\\^\\^=|{|\\||\\|=|\\|\\||\\|\\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*(\\/(?=[^*/])(?:[^/[\\\\]|\\\\[\\S\\s]|\\[(?:[^\\\\\\]]|\\\\[\\S\\s])*(?:]|$))+\\/)/]);(h=a.types)&&e.push([\"typ\",h]);a=(\"\"+a.keywords).replace(/^ | $/g,\n\"\");a.length&&e.push([\"kwd\",RegExp(\"^(?:\"+a.replace(/[\\s,]+/g,\"|\")+\")\\\\b\"),q]);m.push([\"pln\",/^\\s+/,q,\" \\r\\n\\t\\xa0\"]);e.push([\"lit\",/^@[$_a-z][\\w$@]*/i,q],[\"typ\",/^(?:[@_]?[A-Z]+[a-z][\\w$@]*|\\w+_t\\b)/,q],[\"pln\",/^[$_a-z][\\w$@]*/i,q],[\"lit\",/^(?:0x[\\da-f]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+-]?\\d+)?)[a-z]*/i,q,\"0123456789\"],[\"pln\",/^\\\\[\\S\\s]?/,q],[\"pun\",/^.[^\\s\\w\"-$'./@\\\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if(\"BR\"===a.nodeName)h(a),\na.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}\nfor(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\\s)nocode(?:\\s|$)/,t=/\\r\\n?|\\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue(\"white-space\"));var p=l&&\"pre\"===l.substring(0,3);for(l=s.createElement(\"LI\");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute(\"value\",\nm);var r=s.createElement(\"OL\");r.className=\"linenums\";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className=\"L\"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode(\"\\xa0\")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn(\"cannot override language handler %s\",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\\s*</.test(m)?\"default-markup\":\"default-code\";return A[a]}function E(a){var m=\na.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\\bMSIE\\b/.test(navigator.userAgent),m=/\\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,\"\\r\"));i.nodeValue=\nj;var u=i.ownerDocument,v=u.createElement(\"SPAN\");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){\"console\"in window&&console.log(w&&w.stack?w.stack:w)}}var v=[\"break,continue,do,else,for,if,return,while\"],w=[[v,\"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile\"],\n\"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof\"],F=[w,\"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where\"],G=[w,\"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient\"],\nH=[G,\"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var\"],w=[w,\"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN\"],I=[v,\"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None\"],\nJ=[v,\"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END\"],v=[v,\"case,done,elif,esac,eval,fi,function,in,local,set,then,until\"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\\d*)/,N=/\\S/,O=u({keywords:[F,H,w,\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\"+\nI,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,[\"default-code\"]);k(x([],[[\"pln\",/^[^<?]+/],[\"dec\",/^<!\\w[^>]*(?:>|$)/],[\"com\",/^<\\!--[\\S\\s]*?(?:--\\>|$)/],[\"lang-\",/^<\\?([\\S\\s]+?)(?:\\?>|$)/],[\"lang-\",/^<%([\\S\\s]+?)(?:%>|$)/],[\"pun\",/^(?:<[%?]|[%?]>)/],[\"lang-\",/^<xmp\\b[^>]*>([\\S\\s]+?)<\\/xmp\\b[^>]*>/i],[\"lang-js\",/^<script\\b[^>]*>([\\S\\s]*?)(<\\/script\\b[^>]*>)/i],[\"lang-css\",/^<style\\b[^>]*>([\\S\\s]*?)(<\\/style\\b[^>]*>)/i],[\"lang-in.tag\",/^(<\\/?[a-z][^<>]*>)/i]]),\n[\"default-markup\",\"htm\",\"html\",\"mxml\",\"xhtml\",\"xml\",\"xsl\"]);k(x([[\"pln\",/^\\s+/,q,\" \\t\\r\\n\"],[\"atv\",/^(?:\"[^\"]*\"?|'[^']*'?)/,q,\"\\\"'\"]],[[\"tag\",/^^<\\/?[a-z](?:[\\w-.:]*\\w)?|\\/?>$/i],[\"atn\",/^(?!style[\\s=]|on)[a-z](?:[\\w:-]*\\w)?/i],[\"lang-uq.val\",/^=\\s*([^\\s\"'>]*(?:[^\\s\"'/>]|\\/(?=\\s)))/],[\"pun\",/^[/<->]+/],[\"lang-js\",/^on\\w+\\s*=\\s*\"([^\"]+)\"/i],[\"lang-js\",/^on\\w+\\s*=\\s*'([^']+)'/i],[\"lang-js\",/^on\\w+\\s*=\\s*([^\\s\"'>]+)/i],[\"lang-css\",/^style\\s*=\\s*\"([^\"]+)\"/i],[\"lang-css\",/^style\\s*=\\s*'([^']+)'/i],[\"lang-css\",\n/^style\\s*=\\s*([^\\s\"'>]+)/i]]),[\"in.tag\"]);k(x([],[[\"atv\",/^[\\S\\s]+/]]),[\"uq.val\"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),[\"c\",\"cc\",\"cpp\",\"cxx\",\"cyc\",\"m\"]);k(u({keywords:\"null,true,false\"}),[\"json\"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),[\"cs\"]);k(u({keywords:G,cStyleComments:!0}),[\"java\"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),[\"bsh\",\"csh\",\"sh\"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),\n[\"cv\",\"py\"]);k(u({keywords:\"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END\",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"perl\",\"pl\",\"pm\"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),[\"rb\"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),[\"js\"]);k(u({keywords:\"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes\",\nhashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),[\"coffee\"]);k(x([],[[\"str\",/^[\\S\\s]+/]]),[\"regex\"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement(\"PRE\");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf(\"prettyprint\")>=0){var k=k.match(g),f,b;if(b=\n!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&\"CODE\"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName===\"pre\"||o.tagName===\"code\"||o.tagName===\"xmp\")&&o.className&&o.className.indexOf(\"prettyprint\")>=0){b=!0;break}b||((b=(b=n.className.match(/\\blinenums\\b(?::(\\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,\n250):a&&a()}for(var e=[document.getElementsByTagName(\"pre\"),document.getElementsByTagName(\"code\"),document.getElementsByTagName(\"xmp\")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\\blang(?:uage)?-([\\w.]+)(?!\\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:\"atn\",PR_ATTRIB_VALUE:\"atv\",PR_COMMENT:\"com\",PR_DECLARATION:\"dec\",PR_KEYWORD:\"kwd\",PR_LITERAL:\"lit\",\nPR_NOCODE:\"nocode\",PR_PLAIN:\"pln\",PR_PUNCTUATION:\"pun\",PR_SOURCE:\"src\",PR_STRING:\"str\",PR_TAG:\"tag\",PR_TYPE:\"typ\"}})();\n"
  },
  {
    "path": "ppt/think-in-css/js/qrcode.js",
    "content": "/**\n * @fileoverview\n * - Using the 'QRCode for Javascript library'\n * - Fixed dataset of 'QRCode for Javascript library' for support full-spec.\n * - this library has no dependencies.\n * \n * @author davidshimjs\n * @see <a href=\"http://www.d-project.com/\" target=\"_blank\">http://www.d-project.com/</a>\n * @see <a href=\"http://jeromeetienne.github.com/jquery-qrcode/\" target=\"_blank\">http://jeromeetienne.github.com/jquery-qrcode/</a>\n */\nvar QRCode;\n\n(function () {\n\t//---------------------------------------------------------------------\n\t// QRCode for JavaScript\n\t//\n\t// Copyright (c) 2009 Kazuhiko Arase\n\t//\n\t// URL: http://www.d-project.com/\n\t//\n\t// Licensed under the MIT license:\n\t//   http://www.opensource.org/licenses/mit-license.php\n\t//\n\t// The word \"QR Code\" is registered trademark of \n\t// DENSO WAVE INCORPORATED\n\t//   http://www.denso-wave.com/qrcode/faqpatent-e.html\n\t//\n\t//---------------------------------------------------------------------\n\tfunction QR8bitByte(data){this.mode=QRMode.MODE_8BIT_BYTE;this.data=data;}\n\tQR8bitByte.prototype={getLength:function(buffer){return this.data.length;},write:function(buffer){for(var i=0;i<this.data.length;i++){buffer.put(this.data.charCodeAt(i),8);}}};function QRCodeModel(typeNumber,errorCorrectLevel){this.typeNumber=typeNumber;this.errorCorrectLevel=errorCorrectLevel;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[];}\n\tQRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+\",\"+col);}\n\treturn this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}\n\tthis.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}\n\tif(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}\n\tthis.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}\n\treturn pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}\n\treturn qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}\n\tthis.modules[r][6]=(r%2==0);}\n\tfor(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}\n\tthis.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}\n\tfor(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}\n\tfor(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}\n\tfor(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}\n\tthis.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}\n\tvar mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}\n\tthis.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}\n\trow+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}\n\tvar totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}\n\tif(buffer.getLengthInBits()>totalDataCount*8){throw new Error(\"code length overflow. (\"\n\t+buffer.getLengthInBits()\n\t+\">\"\n\t+totalDataCount*8\n\t+\")\");}\n\tif(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}\n\twhile(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}\n\twhile(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}\n\tbuffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}\n\tbuffer.put(QRCodeModel.PAD1,8);}\n\treturn QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}\n\toffset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}\n\tvar totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}\n\tvar data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}\n\tfor(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}\n\treturn data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}\n\treturn((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}\n\treturn(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}\n\treturn digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error(\"bad maskPattern:\"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}\n\treturn a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error(\"mode:\"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error(\"mode:\"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error(\"mode:\"+mode);}}else{throw new Error(\"type:\"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}\n\tfor(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}\n\tif(r==0&&c==0){continue;}\n\tif(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}\n\tif(sameCount>5){lostPoint+=(3+sameCount-5);}}}\n\tfor(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}\n\tfor(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}\n\tfor(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}\n\tvar darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}\n\tvar ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error(\"glog(\"+n+\")\");}\n\treturn QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}\n\twhile(n>=256){n-=255;}\n\treturn QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}\n\tfor(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}\n\tfor(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}\n\tfunction QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+\"/\"+shift);}\n\tvar offset=0;while(offset<num.length&&num[offset]==0){offset++;}\n\tthis.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}\n\tQRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}\n\treturn new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}\n\tvar ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}\n\tfor(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}\n\treturn new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}\n\tQRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error(\"bad rs block @ typeNumber:\"+typeNumber+\"/errorCorrectLevel:\"+errorCorrectLevel);}\n\tvar length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}\n\treturn list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}\n\tQRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}\n\tif(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}\n\tthis.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];\n\t\n\tfunction _isSupportCanvas() {\n\t\treturn typeof CanvasRenderingContext2D != \"undefined\";\n\t}\n\t\n\t// android 2.x doesn't support Data-URI spec\n\tfunction _getAndroid() {\n\t\tvar android = false;\n\t\tvar sAgent = navigator.userAgent;\n\t\t\n\t\tif (/android/i.test(sAgent)) { // android\n\t\t\tandroid = true;\n\t\t\taMat = sAgent.toString().match(/android ([0-9]\\.[0-9])/i);\n\t\t\t\n\t\t\tif (aMat && aMat[1]) {\n\t\t\t\tandroid = parseFloat(aMat[1]);\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn android;\n\t}\n\t\n\t// Drawing in DOM by using Table tag\n\tvar Drawing = !_isSupportCanvas() ? (function () {\n\t\tvar _el = null;\n\t\tvar _htOption = null;\n\t\t\n\t\tvar Drawing = function (el, htOption) {\n\t\t\t_el = el;\n\t\t\t_htOption = htOption;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Draw the QRCode\n\t\t * \n\t\t * @param {QRCode} oQRCode\n\t\t */\n\t\tDrawing.prototype.draw = function (oQRCode) {\n\t\t\tvar nCount = oQRCode.getModuleCount();\n\t\t\tvar nWidth = Math.floor(_htOption.width / nCount);\n\t\t\tvar nHeight = Math.floor(_htOption.height / nCount);\n\t\t\tvar aHTML = ['<table style=\"border:0;border-collapse:collapse;\">'];\n\t\t\t\n\t\t\tfor (var row = 0; row < nCount; row++) {\n\t\t\t\taHTML.push('<tr>');\n\t\t\t\t\n\t\t\t\tfor (var col = 0; col < nCount; col++) {\n\t\t\t\t\taHTML.push('<td style=\"border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';\"></td>');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\taHTML.push('</tr>');\n\t\t\t}\n\t\t\t\n\t\t\taHTML.push('</table>');\n\t\t\t_el.innerHTML = aHTML.join('');\n\t\t\t\n\t\t\t// Fix the margin values as real size.\n\t\t\tvar elTable = _el.childNodes[0];\n\t\t\tvar nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;\n\t\t\tvar nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;\n\t\t\t\n\t\t\tif (nLeftMarginTable > 0 && nTopMarginTable > 0) {\n\t\t\t\telTable.style.margin = nTopMarginTable + \"px \" + nLeftMarginTable + \"px\";\t\n\t\t\t}\n\t\t};\n\t\t\n\t\t/**\n\t\t * Clear the QRCode\n\t\t */\n\t\tDrawing.prototype.clear = function () {\n\t\t\t_el.innerHTML = '';\n\t\t};\n\t\t\n\t\treturn Drawing;\n\t})() : (function () { // Drawing in Canvas\n\t\tvar _el = null;\n\t\tvar _elCanvas = null;\n\t\tvar _elImage = null;\n\t\tvar _fFail = null;\n\t\tvar _fSuccess = null;\n\t\tvar _htOption = null;\n\t\tvar _bSupportDataURI = null;\n\t\tvar _oContext = null;\n\t\tvar _bIsPainted = false;\n\t\tvar _android = _getAndroid();\n\t\t\n\t\tfunction _onMakeImage() {\n\t\t\t_elImage.src = _elCanvas.toDataURL(\"image/png\");\n\t\t\t_elImage.style.display = \"block\";\n\t\t\t_elCanvas.style.display = \"none\";\t\t\t\n\t\t}\n\t\t\n\t\t// Android 2.1 bug workaround\n\t\t// http://code.google.com/p/android/issues/detail?id=5141\n\t\tif (_android && _android <= 2.1) {\n\t    \tvar factor = 1 / window.devicePixelRatio;\n\t        var drawImage = CanvasRenderingContext2D.prototype.drawImage; \n\t    \tCanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {\n\t    \t\tif ((\"nodeName\" in image) && /img/i.test(image.nodeName)) {\n\t\t        \tfor (var i = arguments.length - 1; i >= 1; i--) {\n\t\t            \targuments[i] = arguments[i] * factor;\n\t\t        \t}\n\t    \t\t} else if (typeof dw == \"undefined\") {\n\t    \t\t\targuments[1] *= factor;\n\t    \t\t\targuments[2] *= factor;\n\t    \t\t\targuments[3] *= factor;\n\t    \t\t\targuments[4] *= factor;\n\t    \t\t}\n\t    \t\t\n\t        \tdrawImage.apply(this, arguments); \n\t    \t};\n\t\t}\n\t\t\n\t\t/**\n\t\t * Check whether the user's browser supports Data URI or not\n\t\t * \n\t\t * @private\n\t\t * @param {Function} fSuccess Occurs if it supports Data URI\n\t\t * @param {Function} fFail Occurs if it doesn't support Data URI\n\t\t */\n\t\tfunction _safeSetDataURI(fSuccess, fFail) {\n\t\t\t_fFail = fFail;\n\t\t\t_fSuccess = fSuccess;\n\t\n\t\t\t// Check it just once\n\t\t\tif (_bSupportDataURI === null) {\n\t\t\t\tvar el = document.createElement(\"img\");\n\t\t\t\tvar fOnError = function () {\n\t\t\t\t\t_bSupportDataURI = false;\n\t\t\t\t\t\n\t\t\t\t\tif (_fFail) {\n\t\t\t\t\t\t_fFail();\t\n\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t};\n\t\t\t\tvar fOnSuccess = function () {\n\t\t\t\t\t_bSupportDataURI = true;\n\t\t\t\t\t\n\t\t\t\t\tif (_fSuccess) {\n\t\t\t\t\t\t_fSuccess();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tel.onabort = fOnError;\n\t\t\t\tel.onerror = fOnError;\n\t\t\t\tel.onload = fOnSuccess;\n\t\t\t\tel.src = \"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\"; // the Image contains 1px data.\n\t\t\t\treturn;\n\t\t\t} else if (_bSupportDataURI === true && _fSuccess) {\n\t\t\t\t_fSuccess();\n\t\t\t} else if (_bSupportDataURI === false && _fFail) {\n\t\t\t\t_fFail();\n\t\t\t}\n\t\t};\n\t\t\n\t\t/**\n\t\t * Drawing QRCode by using canvas\n\t\t * \n\t\t * @constructor\n\t\t * @param {HTMLElement} el\n\t\t * @param {Object} htOption QRCode Options \n\t\t */\n\t\tvar Drawing = function (el, htOption) {\n\t\t\t_htOption = htOption;\n\t\t\t_elCanvas = document.createElement(\"canvas\");\n\t\t\t_elCanvas.width = htOption.width;\n\t\t\t_elCanvas.height = htOption.height;\n\t\t\tel.appendChild(_elCanvas);\n\t\t\t_el = el;\n\t\t\t_oContext = _elCanvas.getContext(\"2d\");\n\t\t\t_bIsPainted = false;\n\t\t\t_elImage = document.createElement(\"img\");\n\t\t\t_elImage.style.display = \"none\";\n\t\t\t_el.appendChild(_elImage);\n\t\t\t_bSupportDataURI = null;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Draw the QRCode\n\t\t * \n\t\t * @param {QRCode} oQRCode \n\t\t */\n\t\tDrawing.prototype.draw = function (oQRCode) {\n\t\t\t_elImage.style.display = \"none\";\n\t\t\tvar nCount = oQRCode.getModuleCount();\n\t\t\tvar nWidth = _htOption.width / nCount;\n\t\t\tvar nHeight = _htOption.height / nCount;\n\t\t\tvar nRoundedWidth = Math.round(nWidth);\n\t\t\tvar nRoundedHeight = Math.round(nHeight);\n\t\t\tthis.clear();\n\t\t\t\n\t\t\tfor (var row = 0; row < nCount; row++) {\n\t\t\t\tfor (var col = 0; col < nCount; col++) {\n\t\t\t\t\tvar bIsDark = oQRCode.isDark(row, col);\n\t\t\t\t\tvar nLeft = col * nWidth;\n\t\t\t\t\tvar nTop = row * nHeight;\n\t\t\t\t\t_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;\n\t\t\t\t\t_oContext.lineWidth = 1;\n\t\t\t\t\t_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;\t\t\t\t\t\n\t\t\t\t\t_oContext.fillRect(nLeft, nTop, nWidth, nHeight);\n\t\t\t\t\t\n\t\t\t\t\t// 안티 앨리어싱 방지 처리\n\t\t\t\t\t_oContext.strokeRect(\n\t\t\t\t\t\tMath.floor(nLeft) + 0.5,\n\t\t\t\t\t\tMath.floor(nTop) + 0.5,\n\t\t\t\t\t\tnRoundedWidth,\n\t\t\t\t\t\tnRoundedHeight\n\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\t_oContext.strokeRect(\n\t\t\t\t\t\tMath.ceil(nLeft) - 0.5,\n\t\t\t\t\t\tMath.ceil(nTop) - 0.5,\n\t\t\t\t\t\tnRoundedWidth,\n\t\t\t\t\t\tnRoundedHeight\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t_bIsPainted = true;\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Make the image from Canvas if the browser supports Data URI.\n\t\t */\n\t\tDrawing.prototype.makeImage = function () {\n\t\t\tif (_bIsPainted) {\n\t\t\t\t_safeSetDataURI(_onMakeImage);\n\t\t\t}\n\t\t};\n\t\t\t\n\t\t/**\n\t\t * Return whether the QRCode is painted or not\n\t\t * \n\t\t * @return {Boolean}\n\t\t */\n\t\tDrawing.prototype.isPainted = function () {\n\t\t\treturn _bIsPainted;\n\t\t};\n\t\t\n\t\t/**\n\t\t * Clear the QRCode\n\t\t */\n\t\tDrawing.prototype.clear = function () {\n\t\t\t_oContext.clearRect(0, 0, _elCanvas.width, _elCanvas.height);\n\t\t\t_bIsPainted = false;\n\t\t};\n\t\t\n\t\t/**\n\t\t * @private\n\t\t * @param {Number} nNumber\n\t\t */\n\t\tDrawing.prototype.round = function (nNumber) {\n\t\t\tif (!nNumber) {\n\t\t\t\treturn nNumber;\n\t\t\t}\n\t\t\t\n\t\t\treturn Math.floor(nNumber * 1000) / 1000;\n\t\t};\n\t\t\n\t\treturn Drawing;\n\t})();\n\t\n\t/**\n\t * Get the type by string length\n\t * \n\t * @private\n\t * @param {String} sText\n\t * @param {Number} nCorrectLevel\n\t * @return {Number} type\n\t */\n\tfunction _getTypeNumber(sText, nCorrectLevel) {\t\t\t\n\t\tvar nType = 1;\n\t\t\n\t\tfor (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {\n\t\t\tvar nLimit = 0;\n\t\t\t\n\t\t\tswitch (nCorrectLevel) {\n\t\t\t\tcase QRErrorCorrectLevel.L :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][0];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.M :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.Q :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][2];\n\t\t\t\t\tbreak;\n\t\t\t\tcase QRErrorCorrectLevel.H :\n\t\t\t\t\tnLimit = QRCodeLimitLength[i][3];\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tif (sText.length <= nLimit) {\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tnType++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (nType > QRCodeLimitLength.length) {\n\t\t\tthrow new Error(\"Too long data\");\n\t\t}\n\t\t\n\t\treturn nType;\n\t}\n\t\n\t/**\n\t * @class QRCode\n\t * @constructor\n\t * @example \n\t * new QRCode(document.getElementById(\"test\"), \"http://jindo.dev.naver.com/collie\");\n\t *\n\t * @example\n\t * var oQRCode = new QRCode(\"test\", {\n\t *    text : \"http://naver.com\",\n\t *    width : 128,\n\t *    height : 128\n\t * });\n\t * \n\t * oQRCode.clear(); // Clear the QRCode.\n\t * oQRCode.makeCode(\"http://map.naver.com\"); // Re-create the QRCode.\n\t *\n\t * @param {HTMLElement|String} el target element or 'id' attribute of element.\n\t * @param {Object|String} vOption\n\t * @param {String} vOption.text QRCode link data\n\t * @param {Number} [vOption.width=256]\n\t * @param {Number} [vOption.height=256]\n\t * @param {String} [vOption.colorDark=\"#000000\"]\n\t * @param {String} [vOption.colorLight=\"#ffffff\"]\n\t * @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H] \n\t */\n\tQRCode = function (el, vOption) {\n\t\tthis._htOption = {\n\t\t\twidth : 256, \n\t\t\theight : 256,\n\t\t\ttypeNumber : 4,\n\t\t\tcolorDark : \"#000000\",\n\t\t\tcolorLight : \"#ffffff\",\n\t\t\tcorrectLevel : QRErrorCorrectLevel.H\n\t\t};\n\t\t\n\t\tif (typeof vOption === 'string') {\n\t\t\tvOption\t= {\n\t\t\t\ttext : vOption\n\t\t\t};\n\t\t}\n\t\t\n\t\t// Overwrites options\n\t\tif (vOption) {\n\t\t\tfor (var i in vOption) {\n\t\t\t\tthis._htOption[i] = vOption[i];\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (typeof el == \"string\") {\n\t\t\tel = document.getElementById(el);\n\t\t}\n\t\t\n\t\tthis._android = _getAndroid();\n\t\tthis._el = el;\n\t\tthis._oQRCode = null;\n\t\tthis._oDrawing = new Drawing(this._el, this._htOption);\n\t\t\n\t\tif (this._htOption.text) {\n\t\t\tthis.makeCode(this._htOption.text);\t\n\t\t}\n\t};\n\t\n\t/**\n\t * Make the QRCode\n\t * \n\t * @param {String} sText link data\n\t */\n\tQRCode.prototype.makeCode = function (sText) {\n\t\tthis._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);\n\t\tthis._oQRCode.addData(sText);\n\t\tthis._oQRCode.make();\n\t\tthis._el.title = sText;\n\t\tthis._oDrawing.draw(this._oQRCode);\t\t\t\n\t\tthis.makeImage();\n\t};\n\t\n\t/**\n\t * Make the Image from Canvas element\n\t * - It occurs automatically\n\t * - Android below 3 doesn't support Data-URI spec.\n\t * \n\t * @private\n\t */\n\tQRCode.prototype.makeImage = function () {\n\t\tif (typeof this._oDrawing.makeImage == \"function\" && (!this._android || this._android >= 3)) {\n\t\t\tthis._oDrawing.makeImage();\n\t\t}\n\t};\n\t\n\t/**\n\t * Clear the QRCode\n\t */\n\tQRCode.prototype.clear = function () {\n\t\tthis._oDrawing.clear();\n\t};\n\t\n\t/**\n\t * @name QRCode.CorrectLevel\n\t */\n\tQRCode.CorrectLevel = QRErrorCorrectLevel;\n})();"
  },
  {
    "path": "ppt/think-in-css/js/shake.js",
    "content": "(function (window, document) {\n\n/**\n * from :https://github.com/alexgibson/shake.js/blob/master/shake.js\n *\n */\n    /**\n     * 摇一摇实现-抽奖游戏\n     * @global\n     * @class Shake\n     *\n     * @example\n     * ```html\n     * <script src=\"../output/template/common/bdbox/game/shake.js\"></script>\n     * <script>\n     * window.addEventListener('shake', shakeEventDidOccur, false);\n     * function shakeEventDidOccur () {\n     *     alert('被摇了');\n     * }\n     * </script>\n     * ```\n     */\n    function Shake() {\n\n        //feature detect\n        this.hasDeviceMotion = 'ondevicemotion' in window;\n\n        //default velocity threshold for shake to register\n        this.threshold = 15;\n\n        //use date to prevent multiple shakes firing\n        this.lastTime = new Date();\n\n        //accelerometer values\n        this.lastX = null;\n        this.lastY = null;\n        this.lastZ = null;\n\n        //create custom event\n        if (typeof document.CustomEvent === \"function\") {\n            this.event = new document.CustomEvent('shake', {\n                bubbles: true,\n                cancelable: true\n            });\n        } else if (typeof document.createEvent === \"function\") {\n            this.event = document.createEvent('Event');\n            this.event.initEvent('shake', true, true);\n        } else {\n          return false;\n        }\n    }\n\n    //reset timer values\n    Shake.prototype.reset = function () {\n        this.lastTime = new Date();\n        this.lastX = null;\n        this.lastY = null;\n        this.lastZ = null;\n    };\n\n    //start listening for devicemotion\n    Shake.prototype.start = function () {\n        this.reset();\n        if (this.hasDeviceMotion) { window.addEventListener('devicemotion', this, false); }\n    };\n\n    //stop listening for devicemotion\n    Shake.prototype.stop = function () {\n\n        if (this.hasDeviceMotion) { window.removeEventListener('devicemotion', this, false); }\n        this.reset();\n    };\n\n    //calculates if shake did occur\n    Shake.prototype.devicemotion = function (e) {\n\n        var current = e.accelerationIncludingGravity,\n            currentTime,\n            timeDifference,\n            deltaX = 0,\n            deltaY = 0,\n            deltaZ = 0;\n\n        if ((this.lastX === null) && (this.lastY === null) && (this.lastZ === null)) {\n            this.lastX = current.x;\n            this.lastY = current.y;\n            this.lastZ = current.z;\n            return;\n        }\n\n        deltaX = Math.abs(this.lastX - current.x);\n        deltaY = Math.abs(this.lastY - current.y);\n        deltaZ = Math.abs(this.lastZ - current.z);\n\n        if (((deltaX > this.threshold) && (deltaY > this.threshold)) || ((deltaX > this.threshold) && (deltaZ > this.threshold)) || ((deltaY > this.threshold) && (deltaZ > this.threshold))) {\n            //calculate time in milliseconds since last shake registered\n            currentTime = new Date();\n            timeDifference = currentTime.getTime() - this.lastTime.getTime();\n\n            if (timeDifference > 1000) {\n                window.dispatchEvent(this.event);\n                this.lastTime = new Date();\n            }\n        }\n\n        this.lastX = current.x;\n        this.lastY = current.y;\n        this.lastZ = current.z;\n\n    };\n\n    //event handler\n    Shake.prototype.handleEvent = function (e) {\n\n        if (typeof (this[e.type]) === 'function') {\n            return this[e.type](e);\n        }\n    };\n\n    //create a new instance of shake.js.\n    var myShakeEvent = new Shake();\n    myShakeEvent.start();\n\n}(window, document));\n"
  },
  {
    "path": "ppt/think-in-css/js/socket.io.js",
    "content": "/*! Socket.IO.js build:0.9.6, development. Copyright(c) 2011 LearnBoost <dev@learnboost.com> MIT Licensed */\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n  /**\n   * IO namespace.\n   *\n   * @namespace\n   */\n\n  var io = exports;\n\n  /**\n   * Socket.IO version\n   *\n   * @api public\n   */\n\n  io.version = '0.9.6';\n\n  /**\n   * Protocol implemented.\n   *\n   * @api public\n   */\n\n  io.protocol = 1;\n\n  /**\n   * Available transports, these will be populated with the available transports\n   *\n   * @api public\n   */\n\n  io.transports = [];\n\n  /**\n   * Keep track of jsonp callbacks.\n   *\n   * @api private\n   */\n\n  io.j = [];\n\n  /**\n   * Keep track of our io.Sockets\n   *\n   * @api private\n   */\n  io.sockets = {};\n\n\n  /**\n   * Manages connections to hosts.\n   *\n   * @param {String} uri\n   * @Param {Boolean} force creation of new socket (defaults to false)\n   * @api public\n   */\n\n  io.connect = function (host, details) {\n    var uri = io.util.parseUri(host)\n      , uuri\n      , socket;\n\n    if (global && global.location) {\n      uri.protocol = uri.protocol || global.location.protocol.slice(0, -1);\n      uri.host = uri.host || (global.document\n        ? global.document.domain : global.location.hostname);\n      uri.port = uri.port || global.location.port;\n    }\n\n    uuri = io.util.uniqueUri(uri);\n\n    var options = {\n        host: uri.host\n      , secure: 'https' == uri.protocol\n      , port: uri.port || ('https' == uri.protocol ? 443 : 80)\n      , query: uri.query || ''\n    };\n\n    io.util.merge(options, details);\n\n    if (options['force new connection'] || !io.sockets[uuri]) {\n      socket = new io.Socket(options);\n    }\n\n    if (!options['force new connection'] && socket) {\n      io.sockets[uuri] = socket;\n    }\n\n    socket = socket || io.sockets[uuri];\n\n    // if path is different from '' or /\n    return socket.of(uri.path.length > 1 ? uri.path : '');\n  };\n\n})('object' === typeof module ? module.exports : (this.io = {}), this);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, global) {\n\n  /**\n   * Utilities namespace.\n   *\n   * @namespace\n   */\n\n  var util = exports.util = {};\n\n  /**\n   * Parses an URI\n   *\n   * @author Steven Levithan <stevenlevithan.com> (MIT license)\n   * @api public\n   */\n\n  var re = /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\n\n  var parts = ['source', 'protocol', 'authority', 'userInfo', 'user', 'password',\n               'host', 'port', 'relative', 'path', 'directory', 'file', 'query',\n               'anchor'];\n\n  util.parseUri = function (str) {\n    var m = re.exec(str || '')\n      , uri = {}\n      , i = 14;\n\n    while (i--) {\n      uri[parts[i]] = m[i] || '';\n    }\n\n    return uri;\n  };\n\n  /**\n   * Produces a unique url that identifies a Socket.IO connection.\n   *\n   * @param {Object} uri\n   * @api public\n   */\n\n  util.uniqueUri = function (uri) {\n    var protocol = uri.protocol\n      , host = uri.host\n      , port = uri.port;\n\n    if ('document' in global) {\n      host = host || document.domain;\n      port = port || (protocol == 'https'\n        && document.location.protocol !== 'https:' ? 443 : document.location.port);\n    } else {\n      host = host || 'localhost';\n\n      if (!port && protocol == 'https') {\n        port = 443;\n      }\n    }\n\n    return (protocol || 'http') + '://' + host + ':' + (port || 80);\n  };\n\n  /**\n   * Mergest 2 query strings in to once unique query string\n   *\n   * @param {String} base\n   * @param {String} addition\n   * @api public\n   */\n\n  util.query = function (base, addition) {\n    var query = util.chunkQuery(base || '')\n      , components = [];\n\n    util.merge(query, util.chunkQuery(addition || ''));\n    for (var part in query) {\n      if (query.hasOwnProperty(part)) {\n        components.push(part + '=' + query[part]);\n      }\n    }\n\n    return components.length ? '?' + components.join('&') : '';\n  };\n\n  /**\n   * Transforms a querystring in to an object\n   *\n   * @param {String} qs\n   * @api public\n   */\n\n  util.chunkQuery = function (qs) {\n    var query = {}\n      , params = qs.split('&')\n      , i = 0\n      , l = params.length\n      , kv;\n\n    for (; i < l; ++i) {\n      kv = params[i].split('=');\n      if (kv[0]) {\n        query[kv[0]] = kv[1];\n      }\n    }\n\n    return query;\n  };\n\n  /**\n   * Executes the given function when the page is loaded.\n   *\n   *     io.util.load(function () { console.log('page loaded'); });\n   *\n   * @param {Function} fn\n   * @api public\n   */\n\n  var pageLoaded = false;\n\n  util.load = function (fn) {\n    if ('document' in global && document.readyState === 'complete' || pageLoaded) {\n      return fn();\n    }\n\n    util.on(global, 'load', fn, false);\n  };\n\n  /**\n   * Adds an event.\n   *\n   * @api private\n   */\n\n  util.on = function (element, event, fn, capture) {\n    if (element.attachEvent) {\n      element.attachEvent('on' + event, fn);\n    } else if (element.addEventListener) {\n      element.addEventListener(event, fn, capture);\n    }\n  };\n\n  /**\n   * Generates the correct `XMLHttpRequest` for regular and cross domain requests.\n   *\n   * @param {Boolean} [xdomain] Create a request that can be used cross domain.\n   * @returns {XMLHttpRequest|false} If we can create a XMLHttpRequest.\n   * @api private\n   */\n\n  util.request = function (xdomain) {\n\n    if (xdomain && 'undefined' != typeof XDomainRequest) {\n      return new XDomainRequest();\n    }\n\n    if ('undefined' != typeof XMLHttpRequest && (!xdomain || util.ua.hasCORS)) {\n      return new XMLHttpRequest();\n    }\n\n    if (!xdomain) {\n      try {\n        return new window[(['Active'].concat('Object').join('X'))]('Microsoft.XMLHTTP');\n      } catch(e) { }\n    }\n\n    return null;\n  };\n\n  /**\n   * XHR based transport constructor.\n   *\n   * @constructor\n   * @api public\n   */\n\n  /**\n   * Change the internal pageLoaded value.\n   */\n\n  if ('undefined' != typeof window) {\n    util.load(function () {\n      pageLoaded = true;\n    });\n  }\n\n  /**\n   * Defers a function to ensure a spinner is not displayed by the browser\n   *\n   * @param {Function} fn\n   * @api public\n   */\n\n  util.defer = function (fn) {\n    if (!util.ua.webkit || 'undefined' != typeof importScripts) {\n      return fn();\n    }\n\n    util.load(function () {\n      setTimeout(fn, 100);\n    });\n  };\n\n  /**\n   * Merges two objects.\n   *\n   * @api public\n   */\n  \n  util.merge = function merge (target, additional, deep, lastseen) {\n    var seen = lastseen || []\n      , depth = typeof deep == 'undefined' ? 2 : deep\n      , prop;\n\n    for (prop in additional) {\n      if (additional.hasOwnProperty(prop) && util.indexOf(seen, prop) < 0) {\n        if (typeof target[prop] !== 'object' || !depth) {\n          target[prop] = additional[prop];\n          seen.push(additional[prop]);\n        } else {\n          util.merge(target[prop], additional[prop], depth - 1, seen);\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Merges prototypes from objects\n   *\n   * @api public\n   */\n  \n  util.mixin = function (ctor, ctor2) {\n    util.merge(ctor.prototype, ctor2.prototype);\n  };\n\n  /**\n   * Shortcut for prototypical and static inheritance.\n   *\n   * @api private\n   */\n\n  util.inherit = function (ctor, ctor2) {\n    function f() {};\n    f.prototype = ctor2.prototype;\n    ctor.prototype = new f;\n  };\n\n  /**\n   * Checks if the given object is an Array.\n   *\n   *     io.util.isArray([]); // true\n   *     io.util.isArray({}); // false\n   *\n   * @param Object obj\n   * @api public\n   */\n\n  util.isArray = Array.isArray || function (obj) {\n    return Object.prototype.toString.call(obj) === '[object Array]';\n  };\n\n  /**\n   * Intersects values of two arrays into a third\n   *\n   * @api public\n   */\n\n  util.intersect = function (arr, arr2) {\n    var ret = []\n      , longest = arr.length > arr2.length ? arr : arr2\n      , shortest = arr.length > arr2.length ? arr2 : arr;\n\n    for (var i = 0, l = shortest.length; i < l; i++) {\n      if (~util.indexOf(longest, shortest[i]))\n        ret.push(shortest[i]);\n    }\n\n    return ret;\n  }\n\n  /**\n   * Array indexOf compatibility.\n   *\n   * @see bit.ly/a5Dxa2\n   * @api public\n   */\n\n  util.indexOf = function (arr, o, i) {\n    \n    for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0; \n         i < j && arr[i] !== o; i++) {}\n\n    return j <= i ? -1 : i;\n  };\n\n  /**\n   * Converts enumerables to array.\n   *\n   * @api public\n   */\n\n  util.toArray = function (enu) {\n    var arr = [];\n\n    for (var i = 0, l = enu.length; i < l; i++)\n      arr.push(enu[i]);\n\n    return arr;\n  };\n\n  /**\n   * UA / engines detection namespace.\n   *\n   * @namespace\n   */\n\n  util.ua = {};\n\n  /**\n   * Whether the UA supports CORS for XHR.\n   *\n   * @api public\n   */\n\n  util.ua.hasCORS = 'undefined' != typeof XMLHttpRequest && (function () {\n    try {\n      var a = new XMLHttpRequest();\n    } catch (e) {\n      return false;\n    }\n\n    return a.withCredentials != undefined;\n  })();\n\n  /**\n   * Detect webkit.\n   *\n   * @api public\n   */\n\n  util.ua.webkit = 'undefined' != typeof navigator\n    && /webkit/i.test(navigator.userAgent);\n\n})('undefined' != typeof io ? io : module.exports, this);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.EventEmitter = EventEmitter;\n\n  /**\n   * Event emitter constructor.\n   *\n   * @api public.\n   */\n\n  function EventEmitter () {};\n\n  /**\n   * Adds a listener\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.on = function (name, fn) {\n    if (!this.$events) {\n      this.$events = {};\n    }\n\n    if (!this.$events[name]) {\n      this.$events[name] = fn;\n    } else if (io.util.isArray(this.$events[name])) {\n      this.$events[name].push(fn);\n    } else {\n      this.$events[name] = [this.$events[name], fn];\n    }\n\n    return this;\n  };\n\n  EventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n  /**\n   * Adds a volatile listener.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.once = function (name, fn) {\n    var self = this;\n\n    function on () {\n      self.removeListener(name, on);\n      fn.apply(this, arguments);\n    };\n\n    on.listener = fn;\n    this.on(name, on);\n\n    return this;\n  };\n\n  /**\n   * Removes a listener.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.removeListener = function (name, fn) {\n    if (this.$events && this.$events[name]) {\n      var list = this.$events[name];\n\n      if (io.util.isArray(list)) {\n        var pos = -1;\n\n        for (var i = 0, l = list.length; i < l; i++) {\n          if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {\n            pos = i;\n            break;\n          }\n        }\n\n        if (pos < 0) {\n          return this;\n        }\n\n        list.splice(pos, 1);\n\n        if (!list.length) {\n          delete this.$events[name];\n        }\n      } else if (list === fn || (list.listener && list.listener === fn)) {\n        delete this.$events[name];\n      }\n    }\n\n    return this;\n  };\n\n  /**\n   * Removes all listeners for an event.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.removeAllListeners = function (name) {\n    // TODO: enable this when node 0.5 is stable\n    //if (name === undefined) {\n      //this.$events = {};\n      //return this;\n    //}\n\n    if (this.$events && this.$events[name]) {\n      this.$events[name] = null;\n    }\n\n    return this;\n  };\n\n  /**\n   * Gets all listeners for a certain event.\n   *\n   * @api publci\n   */\n\n  EventEmitter.prototype.listeners = function (name) {\n    if (!this.$events) {\n      this.$events = {};\n    }\n\n    if (!this.$events[name]) {\n      this.$events[name] = [];\n    }\n\n    if (!io.util.isArray(this.$events[name])) {\n      this.$events[name] = [this.$events[name]];\n    }\n\n    return this.$events[name];\n  };\n\n  /**\n   * Emits an event.\n   *\n   * @api public\n   */\n\n  EventEmitter.prototype.emit = function (name) {\n    if (!this.$events) {\n      return false;\n    }\n\n    var handler = this.$events[name];\n\n    if (!handler) {\n      return false;\n    }\n\n    var args = Array.prototype.slice.call(arguments, 1);\n\n    if ('function' == typeof handler) {\n      handler.apply(this, args);\n    } else if (io.util.isArray(handler)) {\n      var listeners = handler.slice();\n\n      for (var i = 0, l = listeners.length; i < l; i++) {\n        listeners[i].apply(this, args);\n      }\n    } else {\n      return false;\n    }\n\n    return true;\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n/**\n * Based on JSON2 (http://www.JSON.org/js.html).\n */\n\n(function (exports, nativeJSON) {\n  \"use strict\";\n\n  // use native JSON if it's available\n  if (nativeJSON && nativeJSON.parse){\n    return exports.JSON = {\n      parse: nativeJSON.parse\n    , stringify: nativeJSON.stringify\n    }\n  }\n\n  var JSON = exports.JSON = {};\n\n  function f(n) {\n      // Format integers to have at least two digits.\n      return n < 10 ? '0' + n : n;\n  }\n\n  function date(d, key) {\n    return isFinite(d.valueOf()) ?\n        d.getUTCFullYear()     + '-' +\n        f(d.getUTCMonth() + 1) + '-' +\n        f(d.getUTCDate())      + 'T' +\n        f(d.getUTCHours())     + ':' +\n        f(d.getUTCMinutes())   + ':' +\n        f(d.getUTCSeconds())   + 'Z' : null;\n  };\n\n  var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n      escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n      gap,\n      indent,\n      meta = {    // table of character substitutions\n          '\\b': '\\\\b',\n          '\\t': '\\\\t',\n          '\\n': '\\\\n',\n          '\\f': '\\\\f',\n          '\\r': '\\\\r',\n          '\"' : '\\\\\"',\n          '\\\\': '\\\\\\\\'\n      },\n      rep;\n\n\n  function quote(string) {\n\n// If the string contains no control characters, no quote characters, and no\n// backslash characters, then we can safely slap some quotes around it.\n// Otherwise we must also replace the offending characters with safe escape\n// sequences.\n\n      escapable.lastIndex = 0;\n      return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n          var c = meta[a];\n          return typeof c === 'string' ? c :\n              '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n      }) + '\"' : '\"' + string + '\"';\n  }\n\n\n  function str(key, holder) {\n\n// Produce a string from holder[key].\n\n      var i,          // The loop counter.\n          k,          // The member key.\n          v,          // The member value.\n          length,\n          mind = gap,\n          partial,\n          value = holder[key];\n\n// If the value has a toJSON method, call it to obtain a replacement value.\n\n      if (value instanceof Date) {\n          value = date(key);\n      }\n\n// If we were called with a replacer function, then call the replacer to\n// obtain a replacement value.\n\n      if (typeof rep === 'function') {\n          value = rep.call(holder, key, value);\n      }\n\n// What happens next depends on the value's type.\n\n      switch (typeof value) {\n      case 'string':\n          return quote(value);\n\n      case 'number':\n\n// JSON numbers must be finite. Encode non-finite numbers as null.\n\n          return isFinite(value) ? String(value) : 'null';\n\n      case 'boolean':\n      case 'null':\n\n// If the value is a boolean or null, convert it to a string. Note:\n// typeof null does not produce 'null'. The case is included here in\n// the remote chance that this gets fixed someday.\n\n          return String(value);\n\n// If the type is 'object', we might be dealing with an object or an array or\n// null.\n\n      case 'object':\n\n// Due to a specification blunder in ECMAScript, typeof null is 'object',\n// so watch out for that case.\n\n          if (!value) {\n              return 'null';\n          }\n\n// Make an array to hold the partial results of stringifying this object value.\n\n          gap += indent;\n          partial = [];\n\n// Is the value an array?\n\n          if (Object.prototype.toString.apply(value) === '[object Array]') {\n\n// The value is an array. Stringify every element. Use null as a placeholder\n// for non-JSON values.\n\n              length = value.length;\n              for (i = 0; i < length; i += 1) {\n                  partial[i] = str(i, value) || 'null';\n              }\n\n// Join all of the elements together, separated with commas, and wrap them in\n// brackets.\n\n              v = partial.length === 0 ? '[]' : gap ?\n                  '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n                  '[' + partial.join(',') + ']';\n              gap = mind;\n              return v;\n          }\n\n// If the replacer is an array, use it to select the members to be stringified.\n\n          if (rep && typeof rep === 'object') {\n              length = rep.length;\n              for (i = 0; i < length; i += 1) {\n                  if (typeof rep[i] === 'string') {\n                      k = rep[i];\n                      v = str(k, value);\n                      if (v) {\n                          partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                      }\n                  }\n              }\n          } else {\n\n// Otherwise, iterate through all of the keys in the object.\n\n              for (k in value) {\n                  if (Object.prototype.hasOwnProperty.call(value, k)) {\n                      v = str(k, value);\n                      if (v) {\n                          partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                      }\n                  }\n              }\n          }\n\n// Join all of the member texts together, separated with commas,\n// and wrap them in braces.\n\n          v = partial.length === 0 ? '{}' : gap ?\n              '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n              '{' + partial.join(',') + '}';\n          gap = mind;\n          return v;\n      }\n  }\n\n// If the JSON object does not yet have a stringify method, give it one.\n\n  JSON.stringify = function (value, replacer, space) {\n\n// The stringify method takes a value and an optional replacer, and an optional\n// space parameter, and returns a JSON text. The replacer can be a function\n// that can replace values, or an array of strings that will select the keys.\n// A default replacer method can be provided. Use of the space parameter can\n// produce text that is more easily readable.\n\n      var i;\n      gap = '';\n      indent = '';\n\n// If the space parameter is a number, make an indent string containing that\n// many spaces.\n\n      if (typeof space === 'number') {\n          for (i = 0; i < space; i += 1) {\n              indent += ' ';\n          }\n\n// If the space parameter is a string, it will be used as the indent string.\n\n      } else if (typeof space === 'string') {\n          indent = space;\n      }\n\n// If there is a replacer, it must be a function or an array.\n// Otherwise, throw an error.\n\n      rep = replacer;\n      if (replacer && typeof replacer !== 'function' &&\n              (typeof replacer !== 'object' ||\n              typeof replacer.length !== 'number')) {\n          throw new Error('JSON.stringify');\n      }\n\n// Make a fake root object containing our value under the key of ''.\n// Return the result of stringifying the value.\n\n      return str('', {'': value});\n  };\n\n// If the JSON object does not yet have a parse method, give it one.\n\n  JSON.parse = function (text, reviver) {\n  // The parse method takes a text and an optional reviver function, and returns\n  // a JavaScript value if the text is a valid JSON text.\n\n      var j;\n\n      function walk(holder, key) {\n\n  // The walk method is used to recursively walk the resulting structure so\n  // that modifications can be made.\n\n          var k, v, value = holder[key];\n          if (value && typeof value === 'object') {\n              for (k in value) {\n                  if (Object.prototype.hasOwnProperty.call(value, k)) {\n                      v = walk(value, k);\n                      if (v !== undefined) {\n                          value[k] = v;\n                      } else {\n                          delete value[k];\n                      }\n                  }\n              }\n          }\n          return reviver.call(holder, key, value);\n      }\n\n\n  // Parsing happens in four stages. In the first stage, we replace certain\n  // Unicode characters with escape sequences. JavaScript handles many characters\n  // incorrectly, either silently deleting them, or treating them as line endings.\n\n      text = String(text);\n      cx.lastIndex = 0;\n      if (cx.test(text)) {\n          text = text.replace(cx, function (a) {\n              return '\\\\u' +\n                  ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n          });\n      }\n\n  // In the second stage, we run the text against regular expressions that look\n  // for non-JSON patterns. We are especially concerned with '()' and 'new'\n  // because they can cause invocation, and '=' because it can cause mutation.\n  // But just to be safe, we want to reject all unexpected forms.\n\n  // We split the second stage into 4 regexp operations in order to work around\n  // crippling inefficiencies in IE's and Safari's regexp engines. First we\n  // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we\n  // replace all simple value tokens with ']' characters. Third, we delete all\n  // open brackets that follow a colon or comma or that begin the text. Finally,\n  // we look to see that the remaining characters are only whitespace or ']' or\n  // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n      if (/^[\\],:{}\\s]*$/\n              .test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')\n                  .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n                  .replace(/(?:^|:|,)(?:\\s*\\[)+/g, ''))) {\n\n  // In the third stage we use the eval function to compile the text into a\n  // JavaScript structure. The '{' operator is subject to a syntactic ambiguity\n  // in JavaScript: it can begin a block or an object literal. We wrap the text\n  // in parens to eliminate the ambiguity.\n\n          j = eval('(' + text + ')');\n\n  // In the optional fourth stage, we recursively walk the new structure, passing\n  // each name/value pair to a reviver function for possible transformation.\n\n          return typeof reviver === 'function' ?\n              walk({'': j}, '') : j;\n      }\n\n  // If the text is not JSON parseable, then a SyntaxError is thrown.\n\n      throw new SyntaxError('JSON.parse');\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , typeof JSON !== 'undefined' ? JSON : undefined\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Parser namespace.\n   *\n   * @namespace\n   */\n\n  var parser = exports.parser = {};\n\n  /**\n   * Packet types.\n   */\n\n  var packets = parser.packets = [\n      'disconnect'\n    , 'connect'\n    , 'heartbeat'\n    , 'message'\n    , 'json'\n    , 'event'\n    , 'ack'\n    , 'error'\n    , 'noop'\n  ];\n\n  /**\n   * Errors reasons.\n   */\n\n  var reasons = parser.reasons = [\n      'transport not supported'\n    , 'client not handshaken'\n    , 'unauthorized'\n  ];\n\n  /**\n   * Errors advice.\n   */\n\n  var advice = parser.advice = [\n      'reconnect'\n  ];\n\n  /**\n   * Shortcuts.\n   */\n\n  var JSON = io.JSON\n    , indexOf = io.util.indexOf;\n\n  /**\n   * Encodes a packet.\n   *\n   * @api private\n   */\n\n  parser.encodePacket = function (packet) {\n    var type = indexOf(packets, packet.type)\n      , id = packet.id || ''\n      , endpoint = packet.endpoint || ''\n      , ack = packet.ack\n      , data = null;\n\n    switch (packet.type) {\n      case 'error':\n        var reason = packet.reason ? indexOf(reasons, packet.reason) : ''\n          , adv = packet.advice ? indexOf(advice, packet.advice) : '';\n\n        if (reason !== '' || adv !== '')\n          data = reason + (adv !== '' ? ('+' + adv) : '');\n\n        break;\n\n      case 'message':\n        if (packet.data !== '')\n          data = packet.data;\n        break;\n\n      case 'event':\n        var ev = { name: packet.name };\n\n        if (packet.args && packet.args.length) {\n          ev.args = packet.args;\n        }\n\n        data = JSON.stringify(ev);\n        break;\n\n      case 'json':\n        data = JSON.stringify(packet.data);\n        break;\n\n      case 'connect':\n        if (packet.qs)\n          data = packet.qs;\n        break;\n\n      case 'ack':\n        data = packet.ackId\n          + (packet.args && packet.args.length\n              ? '+' + JSON.stringify(packet.args) : '');\n        break;\n    }\n\n    // construct packet with required fragments\n    var encoded = [\n        type\n      , id + (ack == 'data' ? '+' : '')\n      , endpoint\n    ];\n\n    // data fragment is optional\n    if (data !== null && data !== undefined)\n      encoded.push(data);\n\n    return encoded.join(':');\n  };\n\n  /**\n   * Encodes multiple messages (payload).\n   *\n   * @param {Array} messages\n   * @api private\n   */\n\n  parser.encodePayload = function (packets) {\n    var decoded = '';\n\n    if (packets.length == 1)\n      return packets[0];\n\n    for (var i = 0, l = packets.length; i < l; i++) {\n      var packet = packets[i];\n      decoded += '\\ufffd' + packet.length + '\\ufffd' + packets[i];\n    }\n\n    return decoded;\n  };\n\n  /**\n   * Decodes a packet\n   *\n   * @api private\n   */\n\n  var regexp = /([^:]+):([0-9]+)?(\\+)?:([^:]+)?:?([\\s\\S]*)?/;\n\n  parser.decodePacket = function (data) {\n    var pieces = data.match(regexp);\n\n    if (!pieces) return {};\n\n    var id = pieces[2] || ''\n      , data = pieces[5] || ''\n      , packet = {\n            type: packets[pieces[1]]\n          , endpoint: pieces[4] || ''\n        };\n\n    // whether we need to acknowledge the packet\n    if (id) {\n      packet.id = id;\n      if (pieces[3])\n        packet.ack = 'data';\n      else\n        packet.ack = true;\n    }\n\n    // handle different packet types\n    switch (packet.type) {\n      case 'error':\n        var pieces = data.split('+');\n        packet.reason = reasons[pieces[0]] || '';\n        packet.advice = advice[pieces[1]] || '';\n        break;\n\n      case 'message':\n        packet.data = data || '';\n        break;\n\n      case 'event':\n        try {\n          var opts = JSON.parse(data);\n          packet.name = opts.name;\n          packet.args = opts.args;\n        } catch (e) { }\n\n        packet.args = packet.args || [];\n        break;\n\n      case 'json':\n        try {\n          packet.data = JSON.parse(data);\n        } catch (e) { }\n        break;\n\n      case 'connect':\n        packet.qs = data || '';\n        break;\n\n      case 'ack':\n        var pieces = data.match(/^([0-9]+)(\\+)?(.*)/);\n        if (pieces) {\n          packet.ackId = pieces[1];\n          packet.args = [];\n\n          if (pieces[3]) {\n            try {\n              packet.args = pieces[3] ? JSON.parse(pieces[3]) : [];\n            } catch (e) { }\n          }\n        }\n        break;\n\n      case 'disconnect':\n      case 'heartbeat':\n        break;\n    };\n\n    return packet;\n  };\n\n  /**\n   * Decodes data payload. Detects multiple messages\n   *\n   * @return {Array} messages\n   * @api public\n   */\n\n  parser.decodePayload = function (data) {\n    // IE doesn't like data[i] for unicode chars, charAt works fine\n    if (data.charAt(0) == '\\ufffd') {\n      var ret = [];\n\n      for (var i = 1, length = ''; i < data.length; i++) {\n        if (data.charAt(i) == '\\ufffd') {\n          ret.push(parser.decodePacket(data.substr(i + 1).substr(0, length)));\n          i += Number(length) + 1;\n          length = '';\n        } else {\n          length += data.charAt(i);\n        }\n      }\n\n      return ret;\n    } else {\n      return [parser.decodePacket(data)];\n    }\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.Transport = Transport;\n\n  /**\n   * This is the transport template for all supported transport methods.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function Transport (socket, sessid) {\n    this.socket = socket;\n    this.sessid = sessid;\n  };\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(Transport, io.EventEmitter);\n\n  /**\n   * Handles the response from the server. When a new response is received\n   * it will automatically update the timeout, decode the message and\n   * forwards the response to the onMessage function for further processing.\n   *\n   * @param {String} data Response from the server.\n   * @api private\n   */\n\n  Transport.prototype.onData = function (data) {\n    this.clearCloseTimeout();\n    \n    // If the connection in currently open (or in a reopening state) reset the close \n    // timeout since we have just received data. This check is necessary so\n    // that we don't reset the timeout on an explicitly disconnected connection.\n    if (this.socket.connected || this.socket.connecting || this.socket.reconnecting) {\n      this.setCloseTimeout();\n    }\n\n    if (data !== '') {\n      // todo: we should only do decodePayload for xhr transports\n      var msgs = io.parser.decodePayload(data);\n\n      if (msgs && msgs.length) {\n        for (var i = 0, l = msgs.length; i < l; i++) {\n          this.onPacket(msgs[i]);\n        }\n      }\n    }\n\n    return this;\n  };\n\n  /**\n   * Handles packets.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onPacket = function (packet) {\n    this.socket.setHeartbeatTimeout();\n\n    if (packet.type == 'heartbeat') {\n      return this.onHeartbeat();\n    }\n\n    if (packet.type == 'connect' && packet.endpoint == '') {\n      this.onConnect();\n    }\n\n    if (packet.type == 'error' && packet.advice == 'reconnect') {\n      this.open = false;\n    }\n\n    this.socket.onPacket(packet);\n\n    return this;\n  };\n\n  /**\n   * Sets close timeout\n   *\n   * @api private\n   */\n  \n  Transport.prototype.setCloseTimeout = function () {\n    if (!this.closeTimeout) {\n      var self = this;\n\n      this.closeTimeout = setTimeout(function () {\n        self.onDisconnect();\n      }, this.socket.closeTimeout);\n    }\n  };\n\n  /**\n   * Called when transport disconnects.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onDisconnect = function () {\n    if (this.close && this.open) this.close();\n    this.clearTimeouts();\n    this.socket.onDisconnect();\n    return this;\n  };\n\n  /**\n   * Called when transport connects\n   *\n   * @api private\n   */\n\n  Transport.prototype.onConnect = function () {\n    this.socket.onConnect();\n    return this;\n  }\n\n  /**\n   * Clears close timeout\n   *\n   * @api private\n   */\n\n  Transport.prototype.clearCloseTimeout = function () {\n    if (this.closeTimeout) {\n      clearTimeout(this.closeTimeout);\n      this.closeTimeout = null;\n    }\n  };\n\n  /**\n   * Clear timeouts\n   *\n   * @api private\n   */\n\n  Transport.prototype.clearTimeouts = function () {\n    this.clearCloseTimeout();\n\n    if (this.reopenTimeout) {\n      clearTimeout(this.reopenTimeout);\n    }\n  };\n\n  /**\n   * Sends a packet\n   *\n   * @param {Object} packet object.\n   * @api private\n   */\n\n  Transport.prototype.packet = function (packet) {\n    this.send(io.parser.encodePacket(packet));\n  };\n\n  /**\n   * Send the received heartbeat message back to server. So the server\n   * knows we are still connected.\n   *\n   * @param {String} heartbeat Heartbeat response from the server.\n   * @api private\n   */\n\n  Transport.prototype.onHeartbeat = function (heartbeat) {\n    this.packet({ type: 'heartbeat' });\n  };\n \n  /**\n   * Called when the transport opens.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onOpen = function () {\n    this.open = true;\n    this.clearCloseTimeout();\n    this.socket.onOpen();\n  };\n\n  /**\n   * Notifies the base when the connection with the Socket.IO server\n   * has been disconnected.\n   *\n   * @api private\n   */\n\n  Transport.prototype.onClose = function () {\n    var self = this;\n\n    /* FIXME: reopen delay causing a infinit loop\n    this.reopenTimeout = setTimeout(function () {\n      self.open();\n    }, this.socket.options['reopen delay']);*/\n\n    this.open = false;\n    this.socket.onClose();\n    this.onDisconnect();\n  };\n\n  /**\n   * Generates a connection url based on the Socket.IO URL Protocol.\n   * See <https://github.com/learnboost/socket.io-node/> for more details.\n   *\n   * @returns {String} Connection url\n   * @api private\n   */\n\n  Transport.prototype.prepareUrl = function () {\n    var options = this.socket.options;\n\n    return this.scheme() + '://'\n      + options.host + ':' + options.port + '/'\n      + options.resource + '/' + io.protocol\n      + '/' + this.name + '/' + this.sessid;\n  };\n\n  /**\n   * Checks if the transport is ready to start a connection.\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  Transport.prototype.ready = function (socket, fn) {\n    fn.call(this);\n  };\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.Socket = Socket;\n\n  /**\n   * Create a new `Socket.IO client` which can establish a persistent\n   * connection with a Socket.IO enabled server.\n   *\n   * @api public\n   */\n\n  function Socket (options) {\n    this.options = {\n        port: 80\n      , secure: false\n      , document: 'document' in global ? document : false\n      , resource: 'socket.io'\n      , transports: io.transports\n      , 'connect timeout': 10000\n      , 'try multiple transports': true\n      , 'reconnect': true\n      , 'reconnection delay': 500\n      , 'reconnection limit': Infinity\n      , 'reopen delay': 3000\n      , 'max reconnection attempts': 10\n      , 'sync disconnect on unload': true\n      , 'auto connect': true\n      , 'flash policy port': 10843\n    };\n\n    io.util.merge(this.options, options);\n\n    this.connected = false;\n    this.open = false;\n    this.connecting = false;\n    this.reconnecting = false;\n    this.namespaces = {};\n    this.buffer = [];\n    this.doBuffer = false;\n\n    if (this.options['sync disconnect on unload'] &&\n        (!this.isXDomain() || io.util.ua.hasCORS)) {\n      var self = this;\n\n      io.util.on(global, 'unload', function () {\n        self.disconnectSync();\n      }, false);\n    }\n\n    if (this.options['auto connect']) {\n      this.connect();\n    }\n};\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(Socket, io.EventEmitter);\n\n  /**\n   * Returns a namespace listener/emitter for this socket\n   *\n   * @api public\n   */\n\n  Socket.prototype.of = function (name) {\n    if (!this.namespaces[name]) {\n      this.namespaces[name] = new io.SocketNamespace(this, name);\n\n      if (name !== '') {\n        this.namespaces[name].packet({ type: 'connect' });\n      }\n    }\n\n    return this.namespaces[name];\n  };\n\n  /**\n   * Emits the given event to the Socket and all namespaces\n   *\n   * @api private\n   */\n\n  Socket.prototype.publish = function () {\n    this.emit.apply(this, arguments);\n\n    var nsp;\n\n    for (var i in this.namespaces) {\n      if (this.namespaces.hasOwnProperty(i)) {\n        nsp = this.of(i);\n        nsp.$emit.apply(nsp, arguments);\n      }\n    }\n  };\n\n  /**\n   * Performs the handshake\n   *\n   * @api private\n   */\n\n  function empty () { };\n\n  Socket.prototype.handshake = function (fn) {\n    var self = this\n      , options = this.options;\n\n    function complete (data) {\n      if (data instanceof Error) {\n        self.onError(data.message);\n      } else {\n        fn.apply(null, data.split(':'));\n      }\n    };\n\n    var url = [\n          'http' + (options.secure ? 's' : '') + ':/'\n        , options.host + ':' + options.port\n        , options.resource\n        , io.protocol\n        , io.util.query(this.options.query, 't=' + +new Date)\n      ].join('/');\n\n    if (this.isXDomain() && !io.util.ua.hasCORS) {\n      var insertAt = document.getElementsByTagName('script')[0]\n        , script = document.createElement('script');\n\n      script.src = url + '&jsonp=' + io.j.length;\n      insertAt.parentNode.insertBefore(script, insertAt);\n\n      io.j.push(function (data) {\n        complete(data);\n        script.parentNode.removeChild(script);\n      });\n    } else {\n      var xhr = io.util.request();\n\n      xhr.open('GET', url, true);\n      xhr.withCredentials = true;\n      xhr.onreadystatechange = function () {\n        if (xhr.readyState == 4) {\n          xhr.onreadystatechange = empty;\n\n          if (xhr.status == 200) {\n            complete(xhr.responseText);\n          } else {\n            !self.reconnecting && self.onError(xhr.responseText);\n          }\n        }\n      };\n      xhr.send(null);\n    }\n  };\n\n  /**\n   * Find an available transport based on the options supplied in the constructor.\n   *\n   * @api private\n   */\n\n  Socket.prototype.getTransport = function (override) {\n    var transports = override || this.transports, match;\n\n    for (var i = 0, transport; transport = transports[i]; i++) {\n      if (io.Transport[transport]\n        && io.Transport[transport].check(this)\n        && (!this.isXDomain() || io.Transport[transport].xdomainCheck())) {\n        return new io.Transport[transport](this, this.sessionid);\n      }\n    }\n\n    return null;\n  };\n\n  /**\n   * Connects to the server.\n   *\n   * @param {Function} [fn] Callback.\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.connect = function (fn) {\n    if (this.connecting) {\n      return this;\n    }\n\n    var self = this;\n\n    this.handshake(function (sid, heartbeat, close, transports) {\n      self.sessionid = sid;\n      self.closeTimeout = close * 1000;\n      self.heartbeatTimeout = heartbeat * 1000;\n      self.transports = transports ? io.util.intersect(\n          transports.split(',')\n        , self.options.transports\n      ) : self.options.transports;\n\n      self.setHeartbeatTimeout();\n\n      function connect (transports){\n        if (self.transport) self.transport.clearTimeouts();\n\n        self.transport = self.getTransport(transports);\n        if (!self.transport) return self.publish('connect_failed');\n\n        // once the transport is ready\n        self.transport.ready(self, function () {\n          self.connecting = true;\n          self.publish('connecting', self.transport.name);\n          self.transport.open();\n\n          if (self.options['connect timeout']) {\n            self.connectTimeoutTimer = setTimeout(function () {\n              if (!self.connected) {\n                self.connecting = false;\n\n                if (self.options['try multiple transports']) {\n                  if (!self.remainingTransports) {\n                    self.remainingTransports = self.transports.slice(0);\n                  }\n\n                  var remaining = self.remainingTransports;\n\n                  while (remaining.length > 0 && remaining.splice(0,1)[0] !=\n                         self.transport.name) {}\n\n                    if (remaining.length){\n                      connect(remaining);\n                    } else {\n                      self.publish('connect_failed');\n                    }\n                }\n              }\n            }, self.options['connect timeout']);\n          }\n        });\n      }\n\n      connect(self.transports);\n\n      self.once('connect', function (){\n        clearTimeout(self.connectTimeoutTimer);\n\n        fn && typeof fn == 'function' && fn();\n      });\n    });\n\n    return this;\n  };\n\n  /**\n   * Clears and sets a new heartbeat timeout using the value given by the\n   * server during the handshake.\n   *\n   * @api private\n   */\n\n  Socket.prototype.setHeartbeatTimeout = function () {\n    clearTimeout(this.heartbeatTimeoutTimer);\n\n    var self = this;\n    this.heartbeatTimeoutTimer = setTimeout(function () {\n      self.transport.onClose();\n    }, this.heartbeatTimeout);\n  };\n\n  /**\n   * Sends a message.\n   *\n   * @param {Object} data packet.\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.packet = function (data) {\n    if (this.connected && !this.doBuffer) {\n      this.transport.packet(data);\n    } else {\n      this.buffer.push(data);\n    }\n\n    return this;\n  };\n\n  /**\n   * Sets buffer state\n   *\n   * @api private\n   */\n\n  Socket.prototype.setBuffer = function (v) {\n    this.doBuffer = v;\n\n    if (!v && this.connected && this.buffer.length) {\n      this.transport.payload(this.buffer);\n      this.buffer = [];\n    }\n  };\n\n  /**\n   * Disconnect the established connect.\n   *\n   * @returns {io.Socket}\n   * @api public\n   */\n\n  Socket.prototype.disconnect = function () {\n    if (this.connected || this.connecting) {\n      if (this.open) {\n        this.of('').packet({ type: 'disconnect' });\n      }\n\n      // handle disconnection immediately\n      this.onDisconnect('booted');\n    }\n\n    return this;\n  };\n\n  /**\n   * Disconnects the socket with a sync XHR.\n   *\n   * @api private\n   */\n\n  Socket.prototype.disconnectSync = function () {\n    // ensure disconnection\n    var xhr = io.util.request()\n      , uri = this.resource + '/' + io.protocol + '/' + this.sessionid;\n\n    xhr.open('GET', uri, true);\n\n    // handle disconnection immediately\n    this.onDisconnect('booted');\n  };\n\n  /**\n   * Check if we need to use cross domain enabled transports. Cross domain would\n   * be a different port or different domain name.\n   *\n   * @returns {Boolean}\n   * @api private\n   */\n\n  Socket.prototype.isXDomain = function () {\n\n    var port = global.location.port ||\n      ('https:' == global.location.protocol ? 443 : 80);\n\n    return this.options.host !== global.location.hostname \n      || this.options.port != port;\n  };\n\n  /**\n   * Called upon handshake.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onConnect = function () {\n    if (!this.connected) {\n      this.connected = true;\n      this.connecting = false;\n      if (!this.doBuffer) {\n        // make sure to flush the buffer\n        this.setBuffer(false);\n      }\n      this.emit('connect');\n    }\n  };\n\n  /**\n   * Called when the transport opens\n   *\n   * @api private\n   */\n\n  Socket.prototype.onOpen = function () {\n    this.open = true;\n  };\n\n  /**\n   * Called when the transport closes.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onClose = function () {\n    this.open = false;\n    clearTimeout(this.heartbeatTimeoutTimer);\n  };\n\n  /**\n   * Called when the transport first opens a connection\n   *\n   * @param text\n   */\n\n  Socket.prototype.onPacket = function (packet) {\n    this.of(packet.endpoint).onPacket(packet);\n  };\n\n  /**\n   * Handles an error.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onError = function (err) {\n    if (err && err.advice) {\n      if (err.advice === 'reconnect' && (this.connected || this.connecting)) {\n        this.disconnect();\n        if (this.options.reconnect) {\n          this.reconnect();\n        }\n      }\n    }\n\n    this.publish('error', err && err.reason ? err.reason : err);\n  };\n\n  /**\n   * Called when the transport disconnects.\n   *\n   * @api private\n   */\n\n  Socket.prototype.onDisconnect = function (reason) {\n    var wasConnected = this.connected\n      , wasConnecting = this.connecting;\n\n    this.connected = false;\n    this.connecting = false;\n    this.open = false;\n\n    if (wasConnected || wasConnecting) {\n      this.transport.close();\n      this.transport.clearTimeouts();\n      if (wasConnected) {\n        this.publish('disconnect', reason);\n\n        if ('booted' != reason && this.options.reconnect && !this.reconnecting) {\n          this.reconnect();\n        }\n      }\n    }\n  };\n\n  /**\n   * Called upon reconnection.\n   *\n   * @api private\n   */\n\n  Socket.prototype.reconnect = function () {\n    this.reconnecting = true;\n    this.reconnectionAttempts = 0;\n    this.reconnectionDelay = this.options['reconnection delay'];\n\n    var self = this\n      , maxAttempts = this.options['max reconnection attempts']\n      , tryMultiple = this.options['try multiple transports']\n      , limit = this.options['reconnection limit'];\n\n    function reset () {\n      if (self.connected) {\n        for (var i in self.namespaces) {\n          if (self.namespaces.hasOwnProperty(i) && '' !== i) {\n              self.namespaces[i].packet({ type: 'connect' });\n          }\n        }\n        self.publish('reconnect', self.transport.name, self.reconnectionAttempts);\n      }\n\n      clearTimeout(self.reconnectionTimer);\n\n      self.removeListener('connect_failed', maybeReconnect);\n      self.removeListener('connect', maybeReconnect);\n\n      self.reconnecting = false;\n\n      delete self.reconnectionAttempts;\n      delete self.reconnectionDelay;\n      delete self.reconnectionTimer;\n      delete self.redoTransports;\n\n      self.options['try multiple transports'] = tryMultiple;\n    };\n\n    function maybeReconnect () {\n      if (!self.reconnecting) {\n        return;\n      }\n\n      if (self.connected) {\n        return reset();\n      };\n\n      if (self.connecting && self.reconnecting) {\n        return self.reconnectionTimer = setTimeout(maybeReconnect, 1000);\n      }\n\n      if (self.reconnectionAttempts++ >= maxAttempts) {\n        if (!self.redoTransports) {\n          self.on('connect_failed', maybeReconnect);\n          self.options['try multiple transports'] = true;\n          self.transport = self.getTransport();\n          self.redoTransports = true;\n          self.connect();\n        } else {\n          self.publish('reconnect_failed');\n          reset();\n        }\n      } else {\n        if (self.reconnectionDelay < limit) {\n          self.reconnectionDelay *= 2; // exponential back off\n        }\n\n        self.connect();\n        self.publish('reconnecting', self.reconnectionDelay, self.reconnectionAttempts);\n        self.reconnectionTimer = setTimeout(maybeReconnect, self.reconnectionDelay);\n      }\n    };\n\n    this.options['try multiple transports'] = false;\n    this.reconnectionTimer = setTimeout(maybeReconnect, this.reconnectionDelay);\n\n    this.on('connect', maybeReconnect);\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.SocketNamespace = SocketNamespace;\n\n  /**\n   * Socket namespace constructor.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function SocketNamespace (socket, name) {\n    this.socket = socket;\n    this.name = name || '';\n    this.flags = {};\n    this.json = new Flag(this, 'json');\n    this.ackPackets = 0;\n    this.acks = {};\n  };\n\n  /**\n   * Apply EventEmitter mixin.\n   */\n\n  io.util.mixin(SocketNamespace, io.EventEmitter);\n\n  /**\n   * Copies emit since we override it\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.$emit = io.EventEmitter.prototype.emit;\n\n  /**\n   * Creates a new namespace, by proxying the request to the socket. This\n   * allows us to use the synax as we do on the server.\n   *\n   * @api public\n   */\n\n  SocketNamespace.prototype.of = function () {\n    return this.socket.of.apply(this.socket, arguments);\n  };\n\n  /**\n   * Sends a packet.\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.packet = function (packet) {\n    packet.endpoint = this.name;\n    this.socket.packet(packet);\n    this.flags = {};\n    return this;\n  };\n\n  /**\n   * Sends a message\n   *\n   * @api public\n   */\n\n  SocketNamespace.prototype.send = function (data, fn) {\n    var packet = {\n        type: this.flags.json ? 'json' : 'message'\n      , data: data\n    };\n\n    if ('function' == typeof fn) {\n      packet.id = ++this.ackPackets;\n      packet.ack = true;\n      this.acks[packet.id] = fn;\n    }\n\n    return this.packet(packet);\n  };\n\n  /**\n   * Emits an event\n   *\n   * @api public\n   */\n  \n  SocketNamespace.prototype.emit = function (name) {\n    var args = Array.prototype.slice.call(arguments, 1)\n      , lastArg = args[args.length - 1]\n      , packet = {\n            type: 'event'\n          , name: name\n        };\n\n    if ('function' == typeof lastArg) {\n      packet.id = ++this.ackPackets;\n      packet.ack = 'data';\n      this.acks[packet.id] = lastArg;\n      args = args.slice(0, args.length - 1);\n    }\n\n    packet.args = args;\n\n    return this.packet(packet);\n  };\n\n  /**\n   * Disconnects the namespace\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.disconnect = function () {\n    if (this.name === '') {\n      this.socket.disconnect();\n    } else {\n      this.packet({ type: 'disconnect' });\n      this.$emit('disconnect');\n    }\n\n    return this;\n  };\n\n  /**\n   * Handles a packet\n   *\n   * @api private\n   */\n\n  SocketNamespace.prototype.onPacket = function (packet) {\n    var self = this;\n\n    function ack () {\n      self.packet({\n          type: 'ack'\n        , args: io.util.toArray(arguments)\n        , ackId: packet.id\n      });\n    };\n\n    switch (packet.type) {\n      case 'connect':\n        this.$emit('connect');\n        break;\n\n      case 'disconnect':\n        if (this.name === '') {\n          this.socket.onDisconnect(packet.reason || 'booted');\n        } else {\n          this.$emit('disconnect', packet.reason);\n        }\n        break;\n\n      case 'message':\n      case 'json':\n        var params = ['message', packet.data];\n\n        if (packet.ack == 'data') {\n          params.push(ack);\n        } else if (packet.ack) {\n          this.packet({ type: 'ack', ackId: packet.id });\n        }\n\n        this.$emit.apply(this, params);\n        break;\n\n      case 'event':\n        var params = [packet.name].concat(packet.args);\n\n        if (packet.ack == 'data')\n          params.push(ack);\n\n        this.$emit.apply(this, params);\n        break;\n\n      case 'ack':\n        if (this.acks[packet.ackId]) {\n          this.acks[packet.ackId].apply(this, packet.args);\n          delete this.acks[packet.ackId];\n        }\n        break;\n\n      case 'error':\n        if (packet.advice){\n          this.socket.onError(packet);\n        } else {\n          if (packet.reason == 'unauthorized') {\n            this.$emit('connect_failed', packet.reason);\n          } else {\n            this.$emit('error', packet.reason);\n          }\n        }\n        break;\n    }\n  };\n\n  /**\n   * Flag interface.\n   *\n   * @api private\n   */\n\n  function Flag (nsp, name) {\n    this.namespace = nsp;\n    this.name = name;\n  };\n\n  /**\n   * Send a message\n   *\n   * @api public\n   */\n\n  Flag.prototype.send = function () {\n    this.namespace.flags[this.name] = true;\n    this.namespace.send.apply(this.namespace, arguments);\n  };\n\n  /**\n   * Emit an event\n   *\n   * @api public\n   */\n\n  Flag.prototype.emit = function () {\n    this.namespace.flags[this.name] = true;\n    this.namespace.emit.apply(this.namespace, arguments);\n  };\n\n})(\n    'undefined' != typeof io ? io : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.websocket = WS;\n\n  /**\n   * The WebSocket transport uses the HTML5 WebSocket API to establish an\n   * persistent connection with the Socket.IO server. This transport will also\n   * be inherited by the FlashSocket fallback as it provides a API compatible\n   * polyfill for the WebSockets.\n   *\n   * @constructor\n   * @extends {io.Transport}\n   * @api public\n   */\n\n  function WS (socket) {\n    io.Transport.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from Transport.\n   */\n\n  io.util.inherit(WS, io.Transport);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  WS.prototype.name = 'websocket';\n\n  /**\n   * Initializes a new `WebSocket` connection with the Socket.IO server. We attach\n   * all the appropriate listeners to handle the responses from the server.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.open = function () {\n    var query = io.util.query(this.socket.options.query)\n      , self = this\n      , Socket\n\n\n    if (!Socket) {\n      Socket = global.MozWebSocket || global.WebSocket;\n    }\n\n    this.websocket = new Socket(this.prepareUrl() + query);\n\n    this.websocket.onopen = function () {\n      self.onOpen();\n      self.socket.setBuffer(false);\n    };\n    this.websocket.onmessage = function (ev) {\n      self.onData(ev.data);\n    };\n    this.websocket.onclose = function () {\n      self.onClose();\n      self.socket.setBuffer(true);\n    };\n    this.websocket.onerror = function (e) {\n      self.onError(e);\n    };\n\n    return this;\n  };\n\n  /**\n   * Send a message to the Socket.IO server. The message will automatically be\n   * encoded in the correct message format.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.send = function (data) {\n    this.websocket.send(data);\n    return this;\n  };\n\n  /**\n   * Payload\n   *\n   * @api private\n   */\n\n  WS.prototype.payload = function (arr) {\n    for (var i = 0, l = arr.length; i < l; i++) {\n      this.packet(arr[i]);\n    }\n    return this;\n  };\n\n  /**\n   * Disconnect the established `WebSocket` connection.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  WS.prototype.close = function () {\n    this.websocket.close();\n    return this;\n  };\n\n  /**\n   * Handle the errors that `WebSocket` might be giving when we\n   * are attempting to connect or send messages.\n   *\n   * @param {Error} e The error.\n   * @api private\n   */\n\n  WS.prototype.onError = function (e) {\n    this.socket.onError(e);\n  };\n\n  /**\n   * Returns the appropriate scheme for the URI generation.\n   *\n   * @api private\n   */\n  WS.prototype.scheme = function () {\n    return this.socket.options.secure ? 'wss' : 'ws';\n  };\n\n  /**\n   * Checks if the browser has support for native `WebSockets` and that\n   * it's not the polyfill created for the FlashSocket transport.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  WS.check = function () {\n    return ('WebSocket' in global && !('__addTask' in WebSocket))\n          || 'MozWebSocket' in global;\n  };\n\n  /**\n   * Check if the `WebSocket` transport support cross domain communications.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  WS.xdomainCheck = function () {\n    return true;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('websocket');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   *\n   * @api public\n   */\n\n  exports.XHR = XHR;\n\n  /**\n   * XHR constructor\n   *\n   * @costructor\n   * @api public\n   */\n\n  function XHR (socket) {\n    if (!socket) return;\n\n    io.Transport.apply(this, arguments);\n    this.sendBuffer = [];\n  };\n\n  /**\n   * Inherits from Transport.\n   */\n\n  io.util.inherit(XHR, io.Transport);\n\n  /**\n   * Establish a connection\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.open = function () {\n    this.socket.setBuffer(false);\n    this.onOpen();\n    this.get();\n\n    // we need to make sure the request succeeds since we have no indication\n    // whether the request opened or not until it succeeded.\n    this.setCloseTimeout();\n\n    return this;\n  };\n\n  /**\n   * Check if we need to send data to the Socket.IO server, if we have data in our\n   * buffer we encode it and forward it to the `post` method.\n   *\n   * @api private\n   */\n\n  XHR.prototype.payload = function (payload) {\n    var msgs = [];\n\n    for (var i = 0, l = payload.length; i < l; i++) {\n      msgs.push(io.parser.encodePacket(payload[i]));\n    }\n\n    this.send(io.parser.encodePayload(msgs));\n  };\n\n  /**\n   * Send data to the Socket.IO server.\n   *\n   * @param data The message\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.send = function (data) {\n    this.post(data);\n    return this;\n  };\n\n  /**\n   * Posts a encoded message to the Socket.IO server.\n   *\n   * @param {String} data A encoded message.\n   * @api private\n   */\n\n  function empty () { };\n\n  XHR.prototype.post = function (data) {\n    var self = this;\n    this.socket.setBuffer(true);\n\n    function stateChange () {\n      if (this.readyState == 4) {\n        this.onreadystatechange = empty;\n        self.posting = false;\n\n        if (this.status == 200){\n          self.socket.setBuffer(false);\n        } else {\n          self.onClose();\n        }\n      }\n    }\n\n    function onload () {\n      this.onload = empty;\n      self.socket.setBuffer(false);\n    };\n\n    this.sendXHR = this.request('POST');\n\n    if (global.XDomainRequest && this.sendXHR instanceof XDomainRequest) {\n      this.sendXHR.onload = this.sendXHR.onerror = onload;\n    } else {\n      this.sendXHR.onreadystatechange = stateChange;\n    }\n\n    this.sendXHR.send(data);\n  };\n\n  /**\n   * Disconnects the established `XHR` connection.\n   *\n   * @returns {Transport}\n   * @api public\n   */\n\n  XHR.prototype.close = function () {\n    this.onClose();\n    return this;\n  };\n\n  /**\n   * Generates a configured XHR request\n   *\n   * @param {String} url The url that needs to be requested.\n   * @param {String} method The method the request should use.\n   * @returns {XMLHttpRequest}\n   * @api private\n   */\n\n  XHR.prototype.request = function (method) {\n    var req = io.util.request(this.socket.isXDomain())\n      , query = io.util.query(this.socket.options.query, 't=' + +new Date);\n\n    req.open(method || 'GET', this.prepareUrl() + query, true);\n\n    if (method == 'POST') {\n      try {\n        if (req.setRequestHeader) {\n          req.setRequestHeader('Content-type', 'text/plain;charset=UTF-8');\n        } else {\n          // XDomainRequest\n          req.contentType = 'text/plain';\n        }\n      } catch (e) {}\n    }\n\n    return req;\n  };\n\n  /**\n   * Returns the scheme to use for the transport URLs.\n   *\n   * @api private\n   */\n\n  XHR.prototype.scheme = function () {\n    return this.socket.options.secure ? 'https' : 'http';\n  };\n\n  /**\n   * Check if the XHR transports are supported\n   *\n   * @param {Boolean} xdomain Check if we support cross domain requests.\n   * @returns {Boolean}\n   * @api public\n   */\n\n  XHR.check = function (socket, xdomain) {\n    try {\n      var request = io.util.request(xdomain),\n          usesXDomReq = (global.XDomainRequest && request instanceof XDomainRequest),\n          socketProtocol = (socket && socket.options && socket.options.secure ? 'https:' : 'http:'),\n          isXProtocol = (socketProtocol != global.location.protocol);\n      if (request && !(usesXDomReq && isXProtocol)) {\n        return true;\n      }\n    } catch(e) {}\n\n    return false;\n  };\n\n  /**\n   * Check if the XHR transport supports cross domain requests.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  XHR.xdomainCheck = function () {\n    return XHR.check(null, true);\n  };\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports.htmlfile = HTMLFile;\n\n  /**\n   * The HTMLFile transport creates a `forever iframe` based transport\n   * for Internet Explorer. Regular forever iframe implementations will \n   * continuously trigger the browsers buzy indicators. If the forever iframe\n   * is created inside a `htmlfile` these indicators will not be trigged.\n   *\n   * @constructor\n   * @extends {io.Transport.XHR}\n   * @api public\n   */\n\n  function HTMLFile (socket) {\n    io.Transport.XHR.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from XHR transport.\n   */\n\n  io.util.inherit(HTMLFile, io.Transport.XHR);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  HTMLFile.prototype.name = 'htmlfile';\n\n  /**\n   * Creates a new Ac...eX `htmlfile` with a forever loading iframe\n   * that can be used to listen to messages. Inside the generated\n   * `htmlfile` a reference will be made to the HTMLFile transport.\n   *\n   * @api private\n   */\n\n  HTMLFile.prototype.get = function () {\n    this.doc = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n    this.doc.open();\n    this.doc.write('<html></html>');\n    this.doc.close();\n    this.doc.parentWindow.s = this;\n\n    var iframeC = this.doc.createElement('div');\n    iframeC.className = 'socketio';\n\n    this.doc.body.appendChild(iframeC);\n    this.iframe = this.doc.createElement('iframe');\n\n    iframeC.appendChild(this.iframe);\n\n    var self = this\n      , query = io.util.query(this.socket.options.query, 't='+ +new Date);\n\n    this.iframe.src = this.prepareUrl() + query;\n\n    io.util.on(window, 'unload', function () {\n      self.destroy();\n    });\n  };\n\n  /**\n   * The Socket.IO server will write script tags inside the forever\n   * iframe, this function will be used as callback for the incoming\n   * information.\n   *\n   * @param {String} data The message\n   * @param {document} doc Reference to the context\n   * @api private\n   */\n\n  HTMLFile.prototype._ = function (data, doc) {\n    this.onData(data);\n    try {\n      var script = doc.getElementsByTagName('script')[0];\n      script.parentNode.removeChild(script);\n    } catch (e) { }\n  };\n\n  /**\n   * Destroy the established connection, iframe and `htmlfile`.\n   * And calls the `CollectGarbage` function of Internet Explorer\n   * to release the memory.\n   *\n   * @api private\n   */\n\n  HTMLFile.prototype.destroy = function () {\n    if (this.iframe){\n      try {\n        this.iframe.src = 'about:blank';\n      } catch(e){}\n\n      this.doc = null;\n      this.iframe.parentNode.removeChild(this.iframe);\n      this.iframe = null;\n\n      CollectGarbage();\n    }\n  };\n\n  /**\n   * Disconnects the established connection.\n   *\n   * @returns {Transport} Chaining.\n   * @api public\n   */\n\n  HTMLFile.prototype.close = function () {\n    this.destroy();\n    return io.Transport.XHR.prototype.close.call(this);\n  };\n\n  /**\n   * Checks if the browser supports this transport. The browser\n   * must have an `Ac...eXObject` implementation.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  HTMLFile.check = function () {\n    if (typeof window != \"undefined\" && (['Active'].concat('Object').join('X')) in window){\n      try {\n        var a = new window[(['Active'].concat('Object').join('X'))]('htmlfile');\n        return a && io.Transport.XHR.check();\n      } catch(e){}\n    }\n    return false;\n  };\n\n  /**\n   * Check if cross domain requests are supported.\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  HTMLFile.xdomainCheck = function () {\n    // we can probably do handling for sub-domains, we should\n    // test that it's cross domain but a subdomain here\n    return false;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('htmlfile');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n\n  /**\n   * Expose constructor.\n   */\n\n  exports['xhr-polling'] = XHRPolling;\n\n  /**\n   * The XHR-polling transport uses long polling XHR requests to create a\n   * \"persistent\" connection with the server.\n   *\n   * @constructor\n   * @api public\n   */\n\n  function XHRPolling () {\n    io.Transport.XHR.apply(this, arguments);\n  };\n\n  /**\n   * Inherits from XHR transport.\n   */\n\n  io.util.inherit(XHRPolling, io.Transport.XHR);\n\n  /**\n   * Merge the properties from XHR transport\n   */\n\n  io.util.merge(XHRPolling, io.Transport.XHR);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  XHRPolling.prototype.name = 'xhr-polling';\n\n  /** \n   * Establish a connection, for iPhone and Android this will be done once the page\n   * is loaded.\n   *\n   * @returns {Transport} Chaining.\n   * @api public\n   */\n\n  XHRPolling.prototype.open = function () {\n    var self = this;\n\n    io.Transport.XHR.prototype.open.call(self);\n    return false;\n  };\n\n  /**\n   * Starts a XHR request to wait for incoming messages.\n   *\n   * @api private\n   */\n\n  function empty () {};\n\n  XHRPolling.prototype.get = function () {\n    if (!this.open) return;\n\n    var self = this;\n\n    function stateChange () {\n      if (this.readyState == 4) {\n        this.onreadystatechange = empty;\n\n        if (this.status == 200) {\n          self.onData(this.responseText);\n          self.get();\n        } else {\n          self.onClose();\n        }\n      }\n    };\n\n    function onload () {\n      this.onload = empty;\n      this.onerror = empty;\n      self.onData(this.responseText);\n      self.get();\n    };\n\n    function onerror () {\n      self.onClose();\n    };\n\n    this.xhr = this.request();\n\n    if (global.XDomainRequest && this.xhr instanceof XDomainRequest) {\n      this.xhr.onload = onload;\n      this.xhr.onerror = onerror;\n    } else {\n      this.xhr.onreadystatechange = stateChange;\n    }\n\n    this.xhr.send(null);\n  };\n\n  /**\n   * Handle the unclean close behavior.\n   *\n   * @api private\n   */\n\n  XHRPolling.prototype.onClose = function () {\n    io.Transport.XHR.prototype.onClose.call(this);\n\n    if (this.xhr) {\n      this.xhr.onreadystatechange = this.xhr.onload = this.xhr.onerror = empty;\n      try {\n        this.xhr.abort();\n      } catch(e){}\n      this.xhr = null;\n    }\n  };\n\n  /**\n   * Webkit based browsers show a infinit spinner when you start a XHR request\n   * before the browsers onload event is called so we need to defer opening of\n   * the transport until the onload event is called. Wrapping the cb in our\n   * defer method solve this.\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  XHRPolling.prototype.ready = function (socket, fn) {\n    var self = this;\n\n    io.util.defer(function () {\n      fn.call(self);\n    });\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('xhr-polling');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n\n/**\n * socket.io\n * Copyright(c) 2011 LearnBoost <dev@learnboost.com>\n * MIT Licensed\n */\n\n(function (exports, io, global) {\n  /**\n   * There is a way to hide the loading indicator in Firefox. If you create and\n   * remove a iframe it will stop showing the current loading indicator.\n   * Unfortunately we can't feature detect that and UA sniffing is evil.\n   *\n   * @api private\n   */\n\n  var indicator = global.document && \"MozAppearance\" in\n    global.document.documentElement.style;\n\n  /**\n   * Expose constructor.\n   */\n\n  exports['jsonp-polling'] = JSONPPolling;\n\n  /**\n   * The JSONP transport creates an persistent connection by dynamically\n   * inserting a script tag in the page. This script tag will receive the\n   * information of the Socket.IO server. When new information is received\n   * it creates a new script tag for the new data stream.\n   *\n   * @constructor\n   * @extends {io.Transport.xhr-polling}\n   * @api public\n   */\n\n  function JSONPPolling (socket) {\n    io.Transport['xhr-polling'].apply(this, arguments);\n\n    this.index = io.j.length;\n\n    var self = this;\n\n    io.j.push(function (msg) {\n      self._(msg);\n    });\n  };\n\n  /**\n   * Inherits from XHR polling transport.\n   */\n\n  io.util.inherit(JSONPPolling, io.Transport['xhr-polling']);\n\n  /**\n   * Transport name\n   *\n   * @api public\n   */\n\n  JSONPPolling.prototype.name = 'jsonp-polling';\n\n  /**\n   * Posts a encoded message to the Socket.IO server using an iframe.\n   * The iframe is used because script tags can create POST based requests.\n   * The iframe is positioned outside of the view so the user does not\n   * notice it's existence.\n   *\n   * @param {String} data A encoded message.\n   * @api private\n   */\n\n  JSONPPolling.prototype.post = function (data) {\n    var self = this\n      , query = io.util.query(\n             this.socket.options.query\n          , 't='+ (+new Date) + '&i=' + this.index\n        );\n\n    if (!this.form) {\n      var form = document.createElement('form')\n        , area = document.createElement('textarea')\n        , id = this.iframeId = 'socketio_iframe_' + this.index\n        , iframe;\n\n      form.className = 'socketio';\n      form.style.position = 'absolute';\n      form.style.top = '0px';\n      form.style.left = '0px';\n      form.style.display = 'none';\n      form.target = id;\n      form.method = 'POST';\n      form.setAttribute('accept-charset', 'utf-8');\n      area.name = 'd';\n      form.appendChild(area);\n      document.body.appendChild(form);\n\n      this.form = form;\n      this.area = area;\n    }\n\n    this.form.action = this.prepareUrl() + query;\n\n    function complete () {\n      initIframe();\n      self.socket.setBuffer(false);\n    };\n\n    function initIframe () {\n      if (self.iframe) {\n        self.form.removeChild(self.iframe);\n      }\n\n      try {\n        // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n        iframe = document.createElement('<iframe name=\"'+ self.iframeId +'\">');\n      } catch (e) {\n        iframe = document.createElement('iframe');\n        iframe.name = self.iframeId;\n      }\n\n      iframe.id = self.iframeId;\n\n      self.form.appendChild(iframe);\n      self.iframe = iframe;\n    };\n\n    initIframe();\n\n    // we temporarily stringify until we figure out how to prevent\n    // browsers from turning `\\n` into `\\r\\n` in form inputs\n    this.area.value = io.JSON.stringify(data);\n\n    try {\n      this.form.submit();\n    } catch(e) {}\n\n    if (this.iframe.attachEvent) {\n      iframe.onreadystatechange = function () {\n        if (self.iframe.readyState == 'complete') {\n          complete();\n        }\n      };\n    } else {\n      this.iframe.onload = complete;\n    }\n\n    this.socket.setBuffer(true);\n  };\n  \n  /**\n   * Creates a new JSONP poll that can be used to listen\n   * for messages from the Socket.IO server.\n   *\n   * @api private\n   */\n\n  JSONPPolling.prototype.get = function () {\n    var self = this\n      , script = document.createElement('script')\n      , query = io.util.query(\n             this.socket.options.query\n          , 't='+ (+new Date) + '&i=' + this.index\n        );\n\n    if (this.script) {\n      this.script.parentNode.removeChild(this.script);\n      this.script = null;\n    }\n\n    script.async = true;\n    script.src = this.prepareUrl() + query;\n    script.onerror = function () {\n      self.onClose();\n    };\n\n    var insertAt = document.getElementsByTagName('script')[0]\n    insertAt.parentNode.insertBefore(script, insertAt);\n    this.script = script;\n\n    if (indicator) {\n      setTimeout(function () {\n        var iframe = document.createElement('iframe');\n        document.body.appendChild(iframe);\n        document.body.removeChild(iframe);\n      }, 100);\n    }\n  };\n\n  /**\n   * Callback function for the incoming message stream from the Socket.IO server.\n   *\n   * @param {String} data The message\n   * @api private\n   */\n\n  JSONPPolling.prototype._ = function (msg) {\n    this.onData(msg);\n    if (this.open) {\n      this.get();\n    }\n    return this;\n  };\n\n  /**\n   * The indicator hack only works after onload\n   *\n   * @param {Socket} socket The socket instance that needs a transport\n   * @param {Function} fn The callback\n   * @api private\n   */\n\n  JSONPPolling.prototype.ready = function (socket, fn) {\n    var self = this;\n    if (!indicator) return fn.call(this);\n\n    io.util.load(function () {\n      fn.call(self);\n    });\n  };\n\n  /**\n   * Checks if browser supports this transport.\n   *\n   * @return {Boolean}\n   * @api public\n   */\n\n  JSONPPolling.check = function () {\n    return 'document' in global;\n  };\n\n  /**\n   * Check if cross domain requests are supported\n   *\n   * @returns {Boolean}\n   * @api public\n   */\n\n  JSONPPolling.xdomainCheck = function () {\n    return true;\n  };\n\n  /**\n   * Add the transport to your public io.transports array.\n   *\n   * @api private\n   */\n\n  io.transports.push('jsonp-polling');\n\n})(\n    'undefined' != typeof io ? io.Transport : module.exports\n  , 'undefined' != typeof io ? io : module.parent.exports\n  , this\n);\n"
  },
  {
    "path": "ppt/think-in-css/js/zoom.js",
    "content": "// Custom reveal.js integration\n(function() {\n    var isEnabled = true;\n\n    document.querySelector('slides').addEventListener('mousedown', function(event) {\n        var modifier = 'altKey';\n\n        var zoomPadding = 20;\n\n        if (event[modifier] && isEnabled) {\n            event.preventDefault();\n\n            var bounds = event.target.getBoundingClientRect();\n\n            zoom.to({\n                x: bounds.left - zoomPadding,\n                y: bounds.top - zoomPadding,\n                width: bounds.width + (zoomPadding * 2),\n                height: bounds.height + (zoomPadding * 2),\n                pan: false\n            });\n        }\n    });\n\n    Slide.on('overviewshown', function() {\n        isEnabled = false;\n    });\n    Slide.on('overviewhidden', function() {\n        isEnabled = true;\n    });\n})();\n\n/*!\n * zoom.js 0.3 (modified for use with reveal.js)\n * http://lab.hakim.se/zoom-js\n * MIT licensed\n *\n * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se\n */\nvar zoom = (function() {\n\n    // The current zoom level (scale)\n    var level = 1;\n\n    // The current mouse position, used for panning\n    var mouseX = 0,\n        mouseY = 0;\n\n    // Timeout before pan is activated\n    var panEngageTimeout = -1,\n        panUpdateInterval = -1;\n\n    // Check for transform support so that we can fallback otherwise\n    var supportsTransforms = 'WebkitTransform' in document.body.style || 'MozTransform' in document.body.style || 'msTransform' in document.body.style || 'OTransform' in document.body.style || 'transform' in document.body.style;\n\n    if (supportsTransforms) {\n        // The easing that will be applied when we zoom in/out\n        document.body.style.transition = 'transform 0.8s ease';\n        document.body.style.OTransition = '-o-transform 0.8s ease';\n        document.body.style.msTransition = '-ms-transform 0.8s ease';\n        document.body.style.MozTransition = '-moz-transform 0.8s ease';\n        document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';\n    }\n\n    // Zoom out if the user hits escape\n    document.addEventListener('keyup', function(event) {\n        if (level !== 1 && event.keyCode === 27) {\n            zoom.out();\n        }\n    });\n\n    // Monitor mouse movement for panning\n    document.addEventListener('mousemove', function(event) {\n        if (level !== 1) {\n            mouseX = event.clientX;\n            mouseY = event.clientY;\n        }\n    });\n\n    /**\n     * Applies the CSS required to zoom in, prefers the use of CSS3\n     * transforms but falls back on zoom for IE.\n     *\n     * @param {Object} rect\n     * @param {Number} scale\n     */\n    function magnify(rect, scale) {\n\n        var scrollOffset = getScrollOffset();\n\n        // Ensure a width/height is set\n        rect.width = rect.width || 1;\n        rect.height = rect.height || 1;\n\n        // Center the rect within the zoomed viewport\n        rect.x -= (window.innerWidth - (rect.width * scale)) / 2;\n        rect.y -= (window.innerHeight - (rect.height * scale)) / 2;\n\n        if (supportsTransforms) {\n            // Reset\n            if (scale === 1) {\n                document.body.style.transform = '';\n                document.body.style.OTransform = '';\n                document.body.style.msTransform = '';\n                document.body.style.MozTransform = '';\n                document.body.style.WebkitTransform = '';\n            }\n            // Scale\n            else {\n                var origin = scrollOffset.x + 'px ' + scrollOffset.y + 'px',\n                    transform = 'translate(' + -rect.x + 'px,' + -rect.y + 'px) scale(' + scale + ')';\n\n                document.body.style.transformOrigin = origin;\n                document.body.style.OTransformOrigin = origin;\n                document.body.style.msTransformOrigin = origin;\n                document.body.style.MozTransformOrigin = origin;\n                document.body.style.WebkitTransformOrigin = origin;\n\n                document.body.style.transform = transform;\n                document.body.style.OTransform = transform;\n                document.body.style.msTransform = transform;\n                document.body.style.MozTransform = transform;\n                document.body.style.WebkitTransform = transform;\n            }\n        } else {\n            // Reset\n            if (scale === 1) {\n                document.body.style.position = '';\n                document.body.style.left = '';\n                document.body.style.top = '';\n                document.body.style.width = '';\n                document.body.style.height = '';\n                document.body.style.zoom = '';\n            }\n            // Scale\n            else {\n                document.body.style.position = 'relative';\n                document.body.style.left = (-(scrollOffset.x + rect.x) / scale) + 'px';\n                document.body.style.top = (-(scrollOffset.y + rect.y) / scale) + 'px';\n                document.body.style.width = (scale * 100) + '%';\n                document.body.style.height = (scale * 100) + '%';\n                document.body.style.zoom = scale;\n            }\n        }\n\n        level = scale;\n\n        if (document.documentElement.classList) {\n            if (level !== 1) {\n                document.documentElement.classList.add('zoomed');\n            } else {\n                document.documentElement.classList.remove('zoomed');\n            }\n        }\n    }\n\n    /**\n     * Pan the document when the mosue cursor approaches the edges\n     * of the window.\n     */\n    function pan() {\n        var range = 0.12,\n            rangeX = window.innerWidth * range,\n            rangeY = window.innerHeight * range,\n            scrollOffset = getScrollOffset();\n\n        // Up\n        if (mouseY < rangeY) {\n            window.scroll(scrollOffset.x, scrollOffset.y - (1 - (mouseY / rangeY)) * (14 / level));\n        }\n        // Down\n        else if (mouseY > window.innerHeight - rangeY) {\n            window.scroll(scrollOffset.x, scrollOffset.y + (1 - (window.innerHeight - mouseY) / rangeY) * (14 / level));\n        }\n\n        // Left\n        if (mouseX < rangeX) {\n            window.scroll(scrollOffset.x - (1 - (mouseX / rangeX)) * (14 / level), scrollOffset.y);\n        }\n        // Right\n        else if (mouseX > window.innerWidth - rangeX) {\n            window.scroll(scrollOffset.x + (1 - (window.innerWidth - mouseX) / rangeX) * (14 / level), scrollOffset.y);\n        }\n    }\n\n    function getScrollOffset() {\n        return {\n            x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,\n            y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset\n        }\n    }\n\n    return {\n        /**\n         * Zooms in on either a rectangle or HTML element.\n         *\n         * @param {Object} options\n         *   - element: HTML element to zoom in on\n         *   OR\n         *   - x/y: coordinates in non-transformed space to zoom in on\n         *   - width/height: the portion of the screen to zoom in on\n         *   - scale: can be used instead of width/height to explicitly set scale\n         */\n        to: function(options) {\n\n            // Due to an implementation limitation we can't zoom in\n            // to another element without zooming out first\n            if (level !== 1) {\n                zoom.out();\n            } else {\n                options.x = options.x || 0;\n                options.y = options.y || 0;\n\n                // If an element is set, that takes precedence\n                if (!!options.element) {\n                    // Space around the zoomed in element to leave on screen\n                    var padding = 20;\n                    var bounds = options.element.getBoundingClientRect();\n\n                    options.x = bounds.left - padding;\n                    options.y = bounds.top - padding;\n                    options.width = bounds.width + (padding * 2);\n                    options.height = bounds.height + (padding * 2);\n                }\n\n                // If width/height values are set, calculate scale from those values\n                if (options.width !== undefined && options.height !== undefined) {\n                    options.scale = Math.max(Math.min(window.innerWidth / options.width, window.innerHeight / options.height), 1);\n                }\n\n                if (options.scale > 1) {\n                    options.x *= options.scale;\n                    options.y *= options.scale;\n\n                    magnify(options, options.scale);\n\n                    if (options.pan !== false) {\n\n                        // Wait with engaging panning as it may conflict with the\n                        // zoom transition\n                        panEngageTimeout = setTimeout(function() {\n                            panUpdateInterval = setInterval(pan, 1000 / 60);\n                        }, 800);\n\n                    }\n                }\n            }\n        },\n\n        /**\n         * Resets the document zoom state to its default.\n         */\n        out: function() {\n            clearTimeout(panEngageTimeout);\n            clearInterval(panUpdateInterval);\n\n            magnify({\n                x: 0,\n                y: 0\n            }, 1);\n\n            level = 1;\n        },\n\n        // Alias\n        magnify: function(options) {\n            this.to(options)\n        },\n        reset: function() {\n            this.out()\n        },\n\n        zoomLevel: function() {\n            return level;\n        }\n    }\n\n})();\n"
  },
  {
    "path": "ppt/think-in-css/sm.htm",
    "content": "<!--\n    Powered By nodePPT - This is probably the best web presentation tool so far!\n    version: 1.2.3\n    site: https://github.com/ksky521/nodePPT\n-->\n<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>神马产品体验报告 - By 简单</title>\n    <link rel=\"stylesheet\" media=\"all\" href=\"./css/nodeppt.css\">\n    <link rel=\"stylesheet\" media=\"only screen and (max-device-width: 480px)\" href=\"./css/phone.css\">\n    <link rel=\"stylesheet\" media=\"print\" href=\"./css/pdf.css\">\n    <link rel=\"stylesheet\" href=\"./js/highlight/styles/monokai_sublime.css\">\n    <link rel=\"stylesheet\" href=\"./css/font-awesome.css\">\n</head>\n<body>\n<div class=\"slides\">\n    <slides id=\"container\">\n        <slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<style>\n\nul {\n    margin:0 auto;\n}\n\n</style><p><img src=\"./img/sm.png\" alt=\"sm\"></p>\n<h1>神马产品体验报告</h1>\n<p><small>大五训练营----简单小组</small></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>神马是神马</h1>\n<ul class=\"rollIn\">\n<li>专注移动搜索</li>\n<li>由<code>UC优视</code>和<code>阿里巴巴</code>共同发起</li>\n<li>08年开始沉淀，14年6月18日对外宣布，厚积薄发</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>2015年上半年中国移动搜索市场研究报告</h1>\n<p><img src=\"./img/渗透率.jpg\" alt=\"sm\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>2015年上半年中国移动搜索市场研究报告</h1>\n<p><img src=\"./img/原因.png\" alt=\"sm\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>移动搜索多元化</h1>\n<p><img src=\"./img/hot.jpg\" alt=\"hot\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>神马特色</h1>\n<blockquote>\n<p>基于淘宝、书旗、九游等兄弟产品的搜索生态圈</p>\n</blockquote>\n<p><br />\n<br /></p>\n<style type=\"text/css\">\n    .flex {\n        display:box;\n        display: -webkit-box;\n    }\n\n    .auto-flex {\n        box-flex:1;\n        flex:1;\n        width: 33%;\n        margin-right: 20px;\n    }\n\n    .last-fixed {\n        margin-right: 0px;\n    }\n\n    .auto-flex img{\n        width:130px;\n        height:130px;\n    }\n\n</style><div class=\"flex\">\n<div class=\"auto-flex\">\n<img src=\"./img/taobao.jpg\" alt=\"个人版\">\n<hgroup>\n<h2>网络购物-淘宝</h2>\n</hgroup>\n</div><div class=\"auto-flex\">\n<img src=\"./img/shuqi.jpg\" alt=\"个人版\">\n<hgroup>\n<h2>小说—书旗</h2>\n</hgroup>\n</div><div class=\"auto-flex last-fixed\">\n<img src=\"./img/jiuyou.jpg\" alt=\"集群版\">\n<hgroup>\n<h2>游戏-九游</h2>\n</hgroup>\n</div><p></div></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<style>\niframe {\n    width:320px;\n\n}\n\n.mr-35 {\nmargin-right:30px;\n}\n</style><h1>差异化分析</h1>\n<div class=\"flex\">\n<div class=\"auto-flex mr-35\">\n<iframe src=\"./img/baidu.png\"></iframe>\n</div><div class=\"auto-flex mr-35\">\n<iframe src=\"./img/shenma.png\"> </iframe>\n</div><div class=\"auto-flex mr-35 last-fixed\">\n<iframe src=\"./img/sogou.png\"></iframe>\n</div><p></div></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>差异化分析:内容</h1>\n<div class=\"flex\">\n<div class=\"auto-flex mr-35\">\n<iframe src=\"./img/neirong.jpg\"></iframe>\n</div><div class=\"auto-flex mr-35\">\n<iframe src=\"./img/neirong-2.jpg\"> </iframe>\n</div><p></div></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>差异化分析:生活服务</h1>\n<div class=\"flex\">\n<div class=\"auto-flex mr-35\">\n<iframe src=\"./img/meishi.jpg\"></iframe>\n</div><div class=\"auto-flex mr-35\">\n<iframe src=\"./img/meishi-2.jpg\"> </iframe>\n</div><p></div></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>差异化分析:商业化</h1>\n<div class=\"flex\">\n<div class=\"auto-flex mr-35\">\n<iframe src=\"./img/shangyehua.png\"></iframe>\n</div><div class=\"auto-flex mr-35\">\n<iframe src=\"./img/shangyehua-2.jpg\"> </iframe>\n</div><p></div></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>如果我是PM</h1>\n<h2>创新建议</h2>\n<ul class=\"rollIn\">\n<li>账号</li>\n<li>进入路径</li>\n<li>语音搜索</li>\n<li>输入智能容错</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>THANKS</h1>\n\n</article></section></slide>\n        <!--slide class=\"slide thank-you-slide segue nobackground\">\n            <article class=\"flexbox vleft auto-fadein\">\n                <h2>Q &amp; A</h2>\n                <h3>&lt;Thank You!&gt;</h3>\n            </article>\n        </slide-->\n        <slide class=\"slide logoslide dark nobackground\">\n            <article class=\"flexbox vcenter\">\n              <h2 style=\"color: white;\">Powered By nodePPT v1.2.3</h2>\n            </article>\n          </slide>\n        <div class=\"slideTip\" id=\"tip\"></div>\n    </slides>\n</div>\n<canvas id=\"drawBoard\" class=\"draw-board\" width=\"900\" height=\"700\"></canvas>\n<div class=\"progress\"><span id=\"progress\"></span></div>\n<div id=\"_buttons\">\n    <div class=\"_btn-box\" id=\"_btn-box\" style=\"display:none;\">\n        <button class=\"fa fa-arrow-circle-left\" id=\"_btn-prev\"></button>\n        <button class=\"fa fa-arrow-circle-right\" id=\"_btn-next\"></button>\n        <button class=\"fa fa-paint-brush\" id=\"_btn-brush\"></button>\n        <button class=\"fa fa-compress\" id=\"_btn-overview\" data-toggle=\"fa fa-expand\"></button>\n    </div>\n    <button class=\"fa fa-bars\" id=\"_btn-bar\"  data-toggle=\"fa fa-close\"></button>\n</div>\n<script src=\"./js/mixjs/lib/mix.0.3.0.min.js\"></script>\n<script>\nvar base = location.protocol + '//' + location.host;\n\nvar path = location.pathname.split('/').filter(function(v){\n    return !!v;\n});\npath.pop();\npath = path.join('/');\nMixJS.config({\n    baseURL: [ base, path, 'js'].join('/')+'/'\n});\n\n</script>\n<script src=\"./js/mixjs/lib/event/broadcast.js\"></script>\n<script src=\"./js/nodeppt.js\"></script>\n<script>\nSlide.init({\n    containerID: 'container',\n    drawBoardID: 'drawBoard',\n    slideClass: '.slide',\n    buildClass: '.build',\n    progressID: 'progress',\n    transition: 'move',\n    width: 1100,\n    dir: './',\n    \n    //打开下面的注释就开启postMessage方式\n    //访问网址127.0.0.1:8080/ppt/demo#client\n    control:{\n        type: 'postMessage',\n        args:{\n            isControl:  false\n        }\n    },\n    \n    tipID: 'tip'\n});\nMixJS.loadJS('highlight/hljs-0.8.js',function(){\n    hljs.tabReplace = '  ';\n    hljs.initHighlightingOnLoad();\n});\n</script>\n<script src=\"./js/demo.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/demo.css\">\n<script src=\"./js/zoom.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/theme.moon.css\">\n<!--placeholder-->\n</body>\n</html>\n"
  },
  {
    "path": "ppt/think-in-css/think-in-css.html",
    "content": "<!--\n    Powered By nodePPT - This is probably the best web presentation tool so far!\n    version: 1.2.3\n    site: https://github.com/ksky521/nodePPT\n-->\n<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>你需要知道的CSS实用技巧 - By 兴龙</title>\n    <link rel=\"stylesheet\" media=\"all\" href=\"./css/nodeppt.css\">\n    <link rel=\"stylesheet\" media=\"only screen and (max-device-width: 480px)\" href=\"./css/phone.css\">\n    <link rel=\"stylesheet\" media=\"print\" href=\"./css/pdf.css\">\n    <link rel=\"stylesheet\" href=\"./js/highlight/styles/monokai_sublime.css\">\n    <link rel=\"stylesheet\" href=\"./css/font-awesome.css\">\n</head>\n<body>\n<div class=\"slides\">\n    <slides id=\"container\">\n        <slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>你需要知道的CSS实用技巧</h1>\n<p><small>2015年08月18日 王兴龙</small></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>Topic</h1>\n<ul class=\"rollIn\">\n<li>单位</li>\n<li>BFC</li>\n<li>字体</li>\n<li>Blur</li>\n<li>动画</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>单位</h1>\n<h2><code>px</code>, <code>em</code>, <code>vw</code>, <code>vh</code>, <code>rem</code></h2>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>问题</h1>\n<h2>一张banner图片，当你面对不同的屏幕时你希望它的行为是怎样的？</h2>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article>\n<p><img src=\"http://ww1.sinaimg.cn/large/8ae515a4jw1ev4hagrectj20jp0gowf9.jpg\" alt=\"sm\"></p>\n<blockquote>\n<p>我们希望在屏幕扩大时，让其内容的高度也等比放大</p>\n</blockquote>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>目前的方法</h1>\n<ul class=\"rollIn\">\n<li>使用img自己的特性，只设置宽度让其自己下载</li>\n<li>作为背景图使用padding-butttom撑开</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>另一种方法：rem</h1>\n<ul class=\"rollIn\">\n<li>基于HTML根元素字体</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>兼容性</h1>\n<p><img src=\"http://ww3.sinaimg.cn/large/8ae515a4gw1ev4hmg0ss1j21kw0stdoz.jpg\" alt=\"rem\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>使用rem</h1>\n<pre><code class=\"css\">html{font-size:62.5%;}      /* font-size 62.5% = 10px =1rem */\nbody{font-size:100%;}       /* font-size 100% = 10px = 1rem */\n.rem-1{font-size:1.2rem;}\n.rem-2{font-size:1.4rem;}\n.rem-3{font-size:1.6rem;}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>什么是BFC</h1>\n<ul class=\"rollIn\">\n<li>Block formatting context</li>\n<li>block-level box</li>\n<li>BFC就是页面上的一个隔离的独立容器</li>\n<li>它规定了内部的Block-level Box如何布局，并且与这个区域外部毫不相</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>触发BFC的方法</h1>\n<ul class=\"rollIn\">\n<li>根元素</li>\n<li>float属性不为none</li>\n<li>position为absolute或fixed</li>\n<li>display为inline-block, table-cell, table-caption, flex, inline-flex</li>\n<li>overflow不为visible</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>BFC有哪些特性呢？</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>1.BFC的区域不会与float box重叠。</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>实例：两栏布局</h1>\n<p><a class=\"jsbin-embed\" href=\"http://jsbin.com/qutufu/embed?html,css,output\">JS Bin on jsbin.com</a><script src=\"http://static.jsbin.com/js/embed.min.js?3.34.2\"></script></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>2.计算BFC的高度时，浮动元素也参与计算</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>实例：清除浮动</h1>\n<p><a class=\"jsbin-embed\" href=\"http://jsbin.com/poveva/embed?html,css,output\">JS Bin on jsbin.com</a><script src=\"http://static.jsbin.com/js/embed.min.js?3.34.2\"></script></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>3.Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>实例：清除浮动</h1>\n<p><a class=\"jsbin-embed\" href=\"http://jsbin.com/juzena/embed?html,css,output\">JS Bin on jsbin.com</a><script src=\"http://static.jsbin.com/js/embed.min.js?3.34.2\"></script></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>字体</h1>\n<ul class=\"rollIn\">\n<li>CSS3 之前，web 设计师必须使用已在用户计算机上安装好的字体。</li>\n<li>通过 CSS3，web 设计师可以使用他们喜欢的任意字体。</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>瓶颈</h1>\n<h1>体积太大！！！</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>实例：情人节运营活动</h1>\n<p><img src=\"http://ww3.sinaimg.cn/large/8ae515a4jw1ev4k43j533j20xs0wqtf4.jpg\" alt=\"情人节\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>解决方案：字蛛</h1>\n<p><a href=\"http://font-spider.org/\" target=\"_blank\">http://font-spider.org/</a></p>\n<ul class=\"rollIn\">\n<li>扫描HTML和CSS文件中的文字</li>\n<li>剔出字体并压缩</li>\n<li>生成跨浏览器使用的格式</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>在CSS设置字体</h1>\n<pre><code class=\"css\">/*声明 WebFont*/\n@font-face {\n  font-family: &#39;pinghei&#39;;\n  src: url(&#39;../font/pinghei.eot&#39;);\n  src:\n    url(&#39;../font/pinghei.eot?#font-spider&#39;) format(&#39;embedded-opentype&#39;),\n    url(&#39;../font/pinghei.woff&#39;) format(&#39;woff&#39;),\n    url(&#39;../font/pinghei.ttf&#39;) format(&#39;truetype&#39;),\n    url(&#39;../font/pinghei.svg&#39;) format(&#39;svg&#39;);\n  font-weight: normal;\n  font-style: normal;\n}\n\n/*使用选择器指定字体*/\n.home h1, .demo &gt; .test {\n    font-family: &#39;pinghei&#39;;\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>运行</h1>\n<p><img src=\"http://ww2.sinaimg.cn/large/8ae515a4gw1ev4kmsdzxvj20ku096juq.jpg\" alt=\"zizhu\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>效果</h1>\n<!-- <iframe src=\"http://localhost:8080/demo/font/font.html\"></iframe> -->\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>使用非阻塞 CSS 加载字体</h1>\n<p>利用media属性</p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>一个 base64 编码的 WOFF 版本的字体</h1>\n<pre><code class=\"css\">@font-face {\n  font-family: Merriweather;\n  font-style: normal;\n  font-weight: 400;\n  src: local(&#39;Merriweather&#39;), url(&#39;data:application/x-font-woff;charset=utf-8;base64,...&#39;)\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>懒加载CSS</h1>\n<pre><code class=\"html\">&lt;link rel=&quot;stylesheet&quot; href=&quot;main.css&quot;&gt;\n&lt;link rel=&quot;stylesheet&quot; href=&quot;font.css&quot; media=&quot;none&quot; onload=&quot;if(media!=&#39;all&#39;)media=&#39;all&#39;&quot;&gt;\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>Blur</h1>\n<p>图片毛玻璃效果已经广泛用于蓝光项目，出了用JS高斯模糊，使用CSS3和SVG也能实现</p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>CSS3</h1>\n<pre><code class=\"css\">.blur {    \n    -webkit-filter: blur(10px); /* Chrome, Opera */\n       -moz-filter: blur(10px);\n        -ms-filter: blur(10px);    \n            filter: blur(10px);\n\n    filter: progid:DXImageTransform.Microsoft.Blur(PixelRadius=10, MakeShadow=false); /* IE6~IE9 */\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>SVG</h1>\n<pre><code class=\"xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;!DOCTYPE svg PUBLIC &quot;-//W3C//DTD SVG 1.1//EN&quot; &quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&quot;&gt;\n&lt;svg version=&quot;1.1&quot; \n     xmlns=&quot;http://www.w3.org/2000/svg&quot;\n     xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;\n     xmlns:ev=&quot;http://www.w3.org/2001/xml-events&quot;     \n     baseProfile=&quot;full&quot;&gt;     \n    &lt;defs&gt;\n        &lt;filter id=&quot;blur&quot;&gt;\n            &lt;feGaussianBlur stdDeviation=&quot;10&quot; /&gt;\n        &lt;/filter&gt;\n    &lt;/defs&gt;\n    &lt;image xlink:href=&quot;sm.jpg&quot; x=&quot;0&quot; y=&quot;0&quot; height=&quot;191&quot; width=&quot;265&quot; filter=&quot;url(#blur)&quot; /&gt;\n&lt;/svg&gt;\n</code></pre>\n<pre><code class=\"css\">.blur {\n    filter: url(blur.svg#blur); /* FireFox, Chrome, Opera */\n}\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>效果</h1>\n<!-- <iframe src=\"http://localhost:8080/demo/demo-1.html\"></iframe> -->\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>不足</h1>\n<h2>安卓下严重缺乏支持，弃用！</h2>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>动画</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>逐帧动画</h1>\n<ul>\n<li>由于使用gif，我们不能将其控制（播放、暂停、播放次数），所以逐帧动画一般使用代码实现</li>\n<li>原理就是时时刻刻改变他的position</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>常见的两种逐帧写法：</h1>\n<ul class=\"rollIn\">\n<li>JS</li>\n<li>CSS</li>\n</ul>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>JS实现方式</h1>\n<p><a class=\"jsbin-embed\" href=\"http://jsbin.com/milopu/1/embed?html,css,js,output\">JS Bin</a><script src=\"http://static.jsbin.com/js/embed.js\"></script></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>JS实现方式的封装</h1>\n<pre><code class=\"javascript\">;(function($) {\n    &#39;use strict&#39;;\n    $.extend($.fn, {\n        requestAnimFrame: function(opt){\n            var defined = {\n                top:0,\n                left:0,\n                position:&#39;absolute&#39;\n            },\n            option = $.extend(defined, opt),\n            i = 0,\n            flag = false,\n            curAnim = null,\n            self = this,\n            width = 0,\n            isRunning = false,\n            maybeAddPx = function (value) {\n                return (typeof value == &quot;number&quot;) ? value + &quot;px&quot; : value;\n            },\n            /**\n             * 标准化requestAnimFrame\n             * @param  {[type]} ){                         return  window.requestAnimationFrame       ||                    window.webkitRequestAnimationFrame ||                    window.mozRequestAnimationFrame    ||                    function( callback ){                    window.setTimeout(callback, 1000 / 60);                    };        })( [description]\n             * @return {[type]}     [description]\n             */\n            requestAnimationFrame = (function(){\n                if(option.time) {\n                    return  function( callback ){\n                            window.setTimeout(option.time);\n                        };\n                }\n                return  window.requestAnimationFrame       ||\n                        window.webkitRequestAnimationFrame ||\n                        window.mozRequestAnimationFrame    ||\n                        function( callback ){\n                            window.setTimeout(callback, 1000 / 60);\n                        };\n            })(),\n            //添加两张图，解决一轮动画结束闪屏问题\n            anim_1 = $(&#39;&lt;div&gt;&#39;, {\n                css :  {\n                     background : &#39;url(&#39; + option.url + &#39;) no-repeat scroll 0px 0px transparent&#39;\n\n                }\n\n            }),\n            anim_2 = anim_1.clone(),\n            init = function() {\n                self.append(anim_1).append(anim_2).css(&#39;position&#39;, &#39;relative&#39;);\n            },\n            width = option.length / option.step,\n            go = function() {\n                    if (i &gt; step) { i = 0; }\n                    flag ? (curAnim = anim_1) : (curAnim = anim_2);\n\n                    flag = !flag;\n                    curAnim[0].style.backgroundPosition = &quot;-&quot; + i * width + &quot;px 0px&quot;;\n                    //使用Zepto方法会闪动，具体看博文：http://www.hacke2.cn/anmi-strange-problem/\n                    //curAnim.css(&#39;background-position&#39; , &#39;-&#39; + i * 75 + &#39;px 0px&#39;)\n                    self.append(curAnim);\n\n                    i++;\n                    console.log(isRunning)\n                    isRunning &amp;&amp; requestAnimationFrame(go)      \n            };\n\n            init();\n\n            return {\n                run : function() {\n                    isRunning = true;\n\n                    requestAnimationFrame(go);\n\n                },\n                stop : function() {\n                    isRunning = false;\n                },\n                isRunning : function() {\n                    return isRunning;\n                }\n            };\n        }\n    })\n\n\n})(Zepto);\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>调用</h1>\n<pre><code class=\"javascript\">var ra = scope.find(&#39;#divParent&#39;).requestAnimFrame({\n        step : 80,\n        url : &#39;img/1-slow.png&#39;,\n        length : 6000,\n        time : 12\n    });\nra.run();\n</code></pre>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>CSS3逐帧动画</h1>\n<p>CSS3方式实现当时比用JS效率高很多，许多优化在浏览器底层完成。之前为什么不用有两点考虑：</p>\n<p>1.兼容性</p>\n<p>2.每一帧都要手动去写</p>\n<p>而现在可以使用CSS3的阶跃函数</p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>CSS3逐帧动画 DEMO</h1>\n<p><a class=\"jsbin-embed\" href=\"http://jsbin.com/qejavi/4/embed?html,output\">JS Bin</a><script src=\"http://static.jsbin.com/js/embed.js\"></script></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>CSS3 timing-function: steps() 详解</h1>\n<p><a href=\"https://idiotwu.me/understanding-css3-timing-function-steps/\" target=\"_blank\">https://idiotwu.me/understanding-css3-timing-function-steps/</a></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>动画的调试</h1>\n<h2>chrome canary（金丝雀）</h2>\n<p><img src=\"http://ico.ooopic.com/iconset01/NewChrome-icons/gif/109215.gif\" alt=\"金丝雀\"></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>调试演示</h1>\n<p><a href=\"http://tympanus.net/Development/3DEffectMobileShowcase/index2.html\" target=\"_blank\">http://tympanus.net/Development/3DEffectMobileShowcase/index2.html</a></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>动画性能</h1>\n<p><a href=\"http://dwz.cn/1iOqE3\" target=\"_blank\">http://dwz.cn/1iOqE3</a></p>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h2>送大家一句话</h2>\n<h1>你不能决定生命的长度，但是你能决定生命的宽度</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"rollIn\">\n<h2>上句话的意思是</h2>\n<h1>你现在不能长高但可以长胖:)</h1>\n\n</article></section></slide>\n<slide class=\"slide\"><section class=\"slide-wrapper\"><article class=\"flexbox vcenter\">\n<h1>The End</h1>\n<h1>Thanks</h1>\n\n</article></section></slide>\n        <!--slide class=\"slide thank-you-slide segue nobackground\">\n            <article class=\"flexbox vleft auto-fadein\">\n                <h2>Q &amp; A</h2>\n                <h3>&lt;Thank You!&gt;</h3>\n            </article>\n        </slide-->\n        <slide class=\"slide logoslide dark nobackground\">\n            <article class=\"flexbox vcenter\">\n              <h2 style=\"color: white;\">Powered By nodePPT v1.2.3</h2>\n            </article>\n          </slide>\n        <div class=\"slideTip\" id=\"tip\"></div>\n    </slides>\n</div>\n<canvas id=\"drawBoard\" class=\"draw-board\" width=\"900\" height=\"700\"></canvas>\n<div class=\"progress\"><span id=\"progress\"></span></div>\n<div id=\"_buttons\">\n    <div class=\"_btn-box\" id=\"_btn-box\" style=\"display:none;\">\n        <button class=\"fa fa-arrow-circle-left\" id=\"_btn-prev\"></button>\n        <button class=\"fa fa-arrow-circle-right\" id=\"_btn-next\"></button>\n        <button class=\"fa fa-paint-brush\" id=\"_btn-brush\"></button>\n        <button class=\"fa fa-compress\" id=\"_btn-overview\" data-toggle=\"fa fa-expand\"></button>\n    </div>\n    <button class=\"fa fa-bars\" id=\"_btn-bar\"  data-toggle=\"fa fa-close\"></button>\n</div>\n<script src=\"./js/mixjs/lib/mix.0.3.0.min.js\"></script>\n<script>\nvar base = location.protocol + '//' + location.host;\n\nvar path = location.pathname.split('/').filter(function(v){\n    return !!v;\n});\npath.pop();\npath = path.join('/');\nMixJS.config({\n    baseURL: [ base, path, 'js'].join('/')+'/'\n});\n\n</script>\n<script src=\"./js/mixjs/lib/event/broadcast.js\"></script>\n<script src=\"./js/nodeppt.js\"></script>\n<script>\nSlide.init({\n    containerID: 'container',\n    drawBoardID: 'drawBoard',\n    slideClass: '.slide',\n    buildClass: '.build',\n    progressID: 'progress',\n    transition: 'move',\n    width: 1100,\n    dir: './',\n    \n    //打开下面的注释就开启postMessage方式\n    //访问网址127.0.0.1:8080/ppt/demo#client\n    control:{\n        type: 'postMessage',\n        args:{\n            isControl:  false\n        }\n    },\n    \n    tipID: 'tip'\n});\nMixJS.loadJS('highlight/hljs-0.8.js',function(){\n    hljs.tabReplace = '  ';\n    hljs.initHighlightingOnLoad();\n});\n</script>\n<script src=\"./js/zoom.js\"></script>\n<link rel=\"stylesheet\" href=\"./css/theme.moon.css\">\n<!--placeholder-->\n</body>\n</html>\n"
  },
  {
    "path": "project-school/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<projectDescription>\r\n\t<name>前端展示</name>\r\n\t<comment></comment>\r\n\t<projects>\r\n\t</projects>\r\n\t<buildSpec>\r\n\t\t<buildCommand>\r\n\t\t\t<name>com.aptana.ide.core.unifiedBuilder</name>\r\n\t\t\t<arguments>\r\n\t\t\t</arguments>\r\n\t\t</buildCommand>\r\n\t</buildSpec>\r\n\t<natures>\r\n\t\t<nature>com.aptana.projects.webnature</nature>\r\n\t</natures>\r\n</projectDescription>\r\n"
  },
  {
    "path": "project-school/html/resume.html",
    "content": "我的简历"
  },
  {
    "path": "project-school/html/template.html",
    "content": "<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\" ng-app>\r\n<head>\r\n\t<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\">\r\n\t<title>王兴龙-简历&项目展示</title>\r\n\t<script type=\"text/javascript\" src=\"../js/angular.js\"></script>\r\n\t<script type=\"text/javascript\" src=\"../js/controllers.js\"></script>\r\n\t<script type=\"text/javascript\" src=\"../js/tool.js\"></script>\r\n\t<script type=\"text/javascript\">\r\n\t\tvar hash = window.location.hash;\r\n\t\tvar product = hash.substring (1);\r\n\t\tvar doc = (document.compatMode != \"CSS1Compat\") ? document.body : document.documentElement;\r\n\t\t\r\n\t\tvar w = Math.max(doc.scrollWidth, doc.clientWidth) - 80;// 获取浏览器内容宽度\r\n\t\tvar h = Math.max(doc.scrollHeight, doc.clientHeight);// 获取浏览器内容高度\r\n\t\twindow.onload = function() {\r\n\t\t\tvar images = document.images;\r\n\t\t\tif(images) {\r\n\t\t\t\tfor (var i = images.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tAutoResizeImage(w, h, images[i]);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t</script>\r\n</head>\r\n<body>\r\n\t<header>\r\n\t\t<h1>{{project.name}}</h1>\r\n\t\t<h3>{{project.introduction}}</h3>\r\n\t\t<h3>项目地址:<a style=\"color:#000;text-decoration : none;\" target=\"_blank\" href=\"http://{{project.address}}\">{{project.address}}</a></h3>\r\n\t</header>\r\n\t<hr />\r\n\t<section>\r\n\t\t<article ng-repeat=\"productDetails in project.details\">\r\n\t\t\t<img src=\"{{productDetails.img}}\"><br />\r\n\t\t\t<i>{{productDetails.description}}</i>\r\n\t\t\t<br /><br />\r\n\t\t</article>\r\n\t</section>\r\n\t<script type=\"text/javascript\">\r\n\t\tvar body = document.getElementsByTagName('body')[0];\r\n\t\tbody.setAttribute('ng-controller', product || 'Kewei');\r\n\t</script>\r\n</body>\r\n</html>"
  },
  {
    "path": "project-school/html/test.txt",
    "content": ""
  },
  {
    "path": "project-school/index.gtml",
    "content": "hellow World\n"
  },
  {
    "path": "project-school/index.html",
    "content": "﻿<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n<head>\r\n    <title>王兴龙-简历&项目展示</title>\r\n    <link href=\"themes/default/easyui.css\" rel=\"stylesheet\" type=\"text/css\" />\r\n    <link href=\"themes/icon.css\" rel=\"stylesheet\" type=\"text/css\" />\r\n    <style>\r\n        .footer {\r\n            width: 100%;\r\n            text-align: center;\r\n            line-height: 35px;\r\n        }\r\n\r\n        .top-bg {\r\n            background-color: #d8e4fe;\r\n            height: 80px;\r\n        }\r\n\r\n        a {\r\n            font-size:12px;\r\n            text-decoration : none;\r\n            color: #0E2D5F;\r\n        }\r\n    </style>\r\n    <script src=\"js/jquery.min.js\" type=\"text/javascript\"></script>\r\n    <script src=\"js/jquery.easyui.min.js\" type=\"text/javascript\"></script>\r\n</head>\r\n<body class=\"easyui-layout\">\r\n    <div region=\"west\" split=\"true\" title=\"王兴龙-重庆理工大学-WEB前端\" style=\"width: 250px;\">\r\n        <div id=\"aa\" class=\"easyui-accordion\" style=\"position: absolute; top: 27px; left: 0px; right: 0px; bottom: 0px;\">\r\n            <div title=\"项目展示\"   selected=\"true\" style=\"padding: 10px;overflow:hidden\">\r\n                <ul class=\"easyui-tree\" >\r\n                    <li iconCls=\"icon-ok\">\r\n                        <span><a to=\"html/template.html#Kewei\" href=\"javascript:;\">科技奖励</a></span>\r\n                    </li>\r\n                    <li iconCls=\"icon-ok\">\r\n                        <span><a to=\"html/template.html#Gaotan\" href=\"javascript:;\">高滩川渝合作示范园</a></span>\r\n                    </li>\r\n                    <li iconCls=\"icon-ok\">\r\n                        <span><a to=\"html/template.html#Guanli\" href=\"javascript:;\" >重庆理工大学管理学院门户网站</a></span>\r\n                    </li>\r\n                    <li iconCls=\"icon-ok\">\r\n                        <span><a to=\"html/template.html#RoadsideAssistance\" href=\"javascript:;\" >道路救援系统</a></span>\r\n                    </li>\r\n                    <li iconCls=\"icon-ok\">\r\n                        <span><a to=\"html/template.html#OSTM\" href=\"javascript:;\">重庆理工大学留学生教务管理系统</a></span>\r\n                    </li>\r\n                    <li iconCls=\"icon-ok\">\r\n                        <span><a to=\"html/template.html#Westom\" href=\"javascript:;\">维斯顿智能家居管理系统</a></span>\r\n                    </li>\r\n                </ul>\r\n            </div>\r\n            \r\n        </div>\r\n    </div>\r\n    <div id=\"mainPanle\" region=\"center\" style=\"overflow: hidden;\">\r\n        <div id=\"tabs\" class=\"easyui-tabs\" fit=\"true\" border=\"false\">\r\n            <div title=\"简历\" style=\"overflow-x:hidden; \" id=\"home\">\r\n                <iframe src=\"html/resume.html\" style=\"width:100%;height:100%;border:none;\"></iframe>\r\n            </div>\r\n        </div>\r\n    </div>\r\n     <div region=\"south\" border=\"true\" split=\"true\" style=\"overflow: hidden; height: 40px;\">\r\n        <div class=\"footer\">版权所有：<a href=\"http://www.kwstu.com\">重庆理工大学软件工程创新实验室---王兴龙</a></div>\r\n    </div>\r\n    <script type=\"text/javascript\" src=\"js/index.js\"></script>\r\n</body>\r\n</html>"
  },
  {
    "path": "project-school/js/angular.js",
    "content": "/*\n AngularJS v1.0.3\n (c) 2010-2012 Google, Inc. http://angularjs.org\n License: MIT\n*/\n(function(U,ca,p){'use strict';function m(b,a,c){var d;if(b)if(N(b))for(d in b)d!=\"prototype\"&&d!=\"length\"&&d!=\"name\"&&b.hasOwnProperty(d)&&a.call(c,b[d],d);else if(b.forEach&&b.forEach!==m)b.forEach(a,c);else if(L(b)&&wa(b.length))for(d=0;d<b.length;d++)a.call(c,b[d],d);else for(d in b)b.hasOwnProperty(d)&&a.call(c,b[d],d);return b}function lb(b){var a=[],c;for(c in b)b.hasOwnProperty(c)&&a.push(c);return a.sort()}function ec(b,a,c){for(var d=lb(b),e=0;e<d.length;e++)a.call(c,b[d[e]],d[e]);return d}\nfunction mb(b){return function(a,c){b(c,a)}}function xa(){for(var b=Z.length,a;b;){b--;a=Z[b].charCodeAt(0);if(a==57)return Z[b]=\"A\",Z.join(\"\");if(a==90)Z[b]=\"0\";else return Z[b]=String.fromCharCode(a+1),Z.join(\"\")}Z.unshift(\"0\");return Z.join(\"\")}function x(b){m(arguments,function(a){a!==b&&m(a,function(a,d){b[d]=a})});return b}function G(b){return parseInt(b,10)}function ya(b,a){return x(new (x(function(){},{prototype:b})),a)}function D(){}function ma(b){return b}function I(b){return function(){return b}}\nfunction t(b){return typeof b==\"undefined\"}function v(b){return typeof b!=\"undefined\"}function L(b){return b!=null&&typeof b==\"object\"}function F(b){return typeof b==\"string\"}function wa(b){return typeof b==\"number\"}function na(b){return Sa.apply(b)==\"[object Date]\"}function J(b){return Sa.apply(b)==\"[object Array]\"}function N(b){return typeof b==\"function\"}function oa(b){return b&&b.document&&b.location&&b.alert&&b.setInterval}function R(b){return F(b)?b.replace(/^\\s*/,\"\").replace(/\\s*$/,\"\"):b}function fc(b){return b&&\n(b.nodeName||b.bind&&b.find)}function Ta(b,a,c){var d=[];m(b,function(b,g,i){d.push(a.call(c,b,g,i))});return d}function gc(b,a){var c=0,d;if(J(b)||F(b))return b.length;else if(L(b))for(d in b)(!a||b.hasOwnProperty(d))&&c++;return c}function za(b,a){if(b.indexOf)return b.indexOf(a);for(var c=0;c<b.length;c++)if(a===b[c])return c;return-1}function Ua(b,a){var c=za(b,a);c>=0&&b.splice(c,1);return a}function V(b,a){if(oa(b)||b&&b.$evalAsync&&b.$watch)throw B(\"Can't copy Window or Scope\");if(a){if(b===\na)throw B(\"Can't copy equivalent objects or arrays\");if(J(b)){for(;a.length;)a.pop();for(var c=0;c<b.length;c++)a.push(V(b[c]))}else for(c in m(a,function(b,c){delete a[c]}),b)a[c]=V(b[c])}else(a=b)&&(J(b)?a=V(b,[]):na(b)?a=new Date(b.getTime()):L(b)&&(a=V(b,{})));return a}function hc(b,a){var a=a||{},c;for(c in b)b.hasOwnProperty(c)&&c.substr(0,2)!==\"$$\"&&(a[c]=b[c]);return a}function ha(b,a){if(b===a)return!0;if(b===null||a===null)return!1;if(b!==b&&a!==a)return!0;var c=typeof b,d;if(c==typeof a&&\nc==\"object\")if(J(b)){if((c=b.length)==a.length){for(d=0;d<c;d++)if(!ha(b[d],a[d]))return!1;return!0}}else if(na(b))return na(a)&&b.getTime()==a.getTime();else{if(b&&b.$evalAsync&&b.$watch||a&&a.$evalAsync&&a.$watch||oa(b)||oa(a))return!1;c={};for(d in b){if(d.charAt(0)!==\"$\"&&!N(b[d])&&!ha(b[d],a[d]))return!1;c[d]=!0}for(d in a)if(!c[d]&&d.charAt(0)!==\"$\"&&!N(a[d]))return!1;return!0}return!1}function Va(b,a){var c=arguments.length>2?ia.call(arguments,2):[];return N(a)&&!(a instanceof RegExp)?c.length?\nfunction(){return arguments.length?a.apply(b,c.concat(ia.call(arguments,0))):a.apply(b,c)}:function(){return arguments.length?a.apply(b,arguments):a.call(b)}:a}function ic(b,a){var c=a;/^\\$+/.test(b)?c=p:oa(a)?c=\"$WINDOW\":a&&ca===a?c=\"$DOCUMENT\":a&&a.$evalAsync&&a.$watch&&(c=\"$SCOPE\");return c}function da(b,a){return JSON.stringify(b,ic,a?\"  \":null)}function nb(b){return F(b)?JSON.parse(b):b}function Wa(b){b&&b.length!==0?(b=E(\"\"+b),b=!(b==\"f\"||b==\"0\"||b==\"false\"||b==\"no\"||b==\"n\"||b==\"[]\")):b=!1;\nreturn b}function pa(b){b=u(b).clone();try{b.html(\"\")}catch(a){}return u(\"<div>\").append(b).html().match(/^(<[^>]+>)/)[1].replace(/^<([\\w\\-]+)/,function(a,b){return\"<\"+E(b)})}function Xa(b){var a={},c,d;m((b||\"\").split(\"&\"),function(b){b&&(c=b.split(\"=\"),d=decodeURIComponent(c[0]),a[d]=v(c[1])?decodeURIComponent(c[1]):!0)});return a}function ob(b){var a=[];m(b,function(b,d){a.push(Ya(d,!0)+(b===!0?\"\":\"=\"+Ya(b,!0)))});return a.length?a.join(\"&\"):\"\"}function Za(b){return Ya(b,!0).replace(/%26/gi,\"&\").replace(/%3D/gi,\n\"=\").replace(/%2B/gi,\"+\")}function Ya(b,a){return encodeURIComponent(b).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(a?null:/%20/g,\"+\")}function jc(b,a){function c(a){a&&d.push(a)}var d=[b],e,g,i=[\"ng:app\",\"ng-app\",\"x-ng-app\",\"data-ng-app\"],f=/\\sng[:\\-]app(:\\s*([\\w\\d_]+);?)?\\s/;m(i,function(a){i[a]=!0;c(ca.getElementById(a));a=a.replace(\":\",\"\\\\:\");b.querySelectorAll&&(m(b.querySelectorAll(\".\"+a),c),m(b.querySelectorAll(\".\"+a+\"\\\\:\"),c),m(b.querySelectorAll(\"[\"+\na+\"]\"),c))});m(d,function(a){if(!e){var b=f.exec(\" \"+a.className+\" \");b?(e=a,g=(b[2]||\"\").replace(/\\s+/g,\",\")):m(a.attributes,function(b){if(!e&&i[b.name])e=a,g=b.value})}});e&&a(e,g?[g]:[])}function pb(b,a){b=u(b);a=a||[];a.unshift([\"$provide\",function(a){a.value(\"$rootElement\",b)}]);a.unshift(\"ng\");var c=qb(a);c.invoke([\"$rootScope\",\"$rootElement\",\"$compile\",\"$injector\",function(a,b,c,i){a.$apply(function(){b.data(\"$injector\",i);c(b)(a)})}]);return c}function $a(b,a){a=a||\"_\";return b.replace(kc,\nfunction(b,d){return(d?a:\"\")+b.toLowerCase()})}function qa(b,a,c){if(!b)throw new B(\"Argument '\"+(a||\"?\")+\"' is \"+(c||\"required\"));return b}function ra(b,a,c){c&&J(b)&&(b=b[b.length-1]);qa(N(b),a,\"not a function, got \"+(b&&typeof b==\"object\"?b.constructor.name||\"Object\":typeof b));return b}function lc(b){function a(a,b,e){return a[b]||(a[b]=e())}return a(a(b,\"angular\",Object),\"module\",function(){var b={};return function(d,e,g){e&&b.hasOwnProperty(d)&&(b[d]=null);return a(b,d,function(){function a(c,\nd,e){return function(){b[e||\"push\"]([c,d,arguments]);return j}}if(!e)throw B(\"No module: \"+d);var b=[],c=[],k=a(\"$injector\",\"invoke\"),j={_invokeQueue:b,_runBlocks:c,requires:e,name:d,provider:a(\"$provide\",\"provider\"),factory:a(\"$provide\",\"factory\"),service:a(\"$provide\",\"service\"),value:a(\"$provide\",\"value\"),constant:a(\"$provide\",\"constant\",\"unshift\"),filter:a(\"$filterProvider\",\"register\"),controller:a(\"$controllerProvider\",\"register\"),directive:a(\"$compileProvider\",\"directive\"),config:k,run:function(a){c.push(a);\nreturn this}};g&&k(g);return j})}})}function rb(b){return b.replace(mc,function(a,b,d,e){return e?d.toUpperCase():d}).replace(nc,\"Moz$1\")}function ab(b,a){function c(){var e;for(var b=[this],c=a,i,f,h,k,j,l;b.length;){i=b.shift();f=0;for(h=i.length;f<h;f++){k=u(i[f]);c?k.triggerHandler(\"$destroy\"):c=!c;j=0;for(e=(l=k.children()).length,k=e;j<k;j++)b.push(ja(l[j]))}}return d.apply(this,arguments)}var d=ja.fn[b],d=d.$original||d;c.$original=d;ja.fn[b]=c}function Q(b){if(b instanceof Q)return b;if(!(this instanceof\nQ)){if(F(b)&&b.charAt(0)!=\"<\")throw B(\"selectors not implemented\");return new Q(b)}if(F(b)){var a=ca.createElement(\"div\");a.innerHTML=\"<div>&#160;</div>\"+b;a.removeChild(a.firstChild);bb(this,a.childNodes);this.remove()}else bb(this,b)}function cb(b){return b.cloneNode(!0)}function sa(b){sb(b);for(var a=0,b=b.childNodes||[];a<b.length;a++)sa(b[a])}function tb(b,a,c){var d=$(b,\"events\");$(b,\"handle\")&&(t(a)?m(d,function(a,c){db(b,c,a);delete d[c]}):t(c)?(db(b,a,d[a]),delete d[a]):Ua(d[a],c))}function sb(b){var a=\nb[Aa],c=Ba[a];c&&(c.handle&&(c.events.$destroy&&c.handle({},\"$destroy\"),tb(b)),delete Ba[a],b[Aa]=p)}function $(b,a,c){var d=b[Aa],d=Ba[d||-1];if(v(c))d||(b[Aa]=d=++oc,d=Ba[d]={}),d[a]=c;else return d&&d[a]}function ub(b,a,c){var d=$(b,\"data\"),e=v(c),g=!e&&v(a),i=g&&!L(a);!d&&!i&&$(b,\"data\",d={});if(e)d[a]=c;else if(g)if(i)return d&&d[a];else x(d,a);else return d}function Ca(b,a){return(\" \"+b.className+\" \").replace(/[\\n\\t]/g,\" \").indexOf(\" \"+a+\" \")>-1}function vb(b,a){a&&m(a.split(\" \"),function(a){b.className=\nR((\" \"+b.className+\" \").replace(/[\\n\\t]/g,\" \").replace(\" \"+R(a)+\" \",\" \"))})}function wb(b,a){a&&m(a.split(\" \"),function(a){if(!Ca(b,a))b.className=R(b.className+\" \"+R(a))})}function bb(b,a){if(a)for(var a=!a.nodeName&&v(a.length)&&!oa(a)?a:[a],c=0;c<a.length;c++)b.push(a[c])}function xb(b,a){return Da(b,\"$\"+(a||\"ngController\")+\"Controller\")}function Da(b,a,c){b=u(b);for(b[0].nodeType==9&&(b=b.find(\"html\"));b.length;){if(c=b.data(a))return c;b=b.parent()}}function yb(b,a){var c=Ea[a.toLowerCase()];\nreturn c&&zb[b.nodeName]&&c}function pc(b,a){var c=function(c,e){if(!c.preventDefault)c.preventDefault=function(){c.returnValue=!1};if(!c.stopPropagation)c.stopPropagation=function(){c.cancelBubble=!0};if(!c.target)c.target=c.srcElement||ca;if(t(c.defaultPrevented)){var g=c.preventDefault;c.preventDefault=function(){c.defaultPrevented=!0;g.call(c)};c.defaultPrevented=!1}c.isDefaultPrevented=function(){return c.defaultPrevented};m(a[e||c.type],function(a){a.call(b,c)});aa<=8?(c.preventDefault=null,\nc.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function ga(b){var a=typeof b,c;if(a==\"object\"&&b!==null)if(typeof(c=b.$$hashKey)==\"function\")c=b.$$hashKey();else{if(c===p)c=b.$$hashKey=xa()}else c=b;return a+\":\"+c}function Fa(b){m(b,this.put,this)}function eb(){}function Ab(b){var a,c;if(typeof b==\"function\"){if(!(a=b.$inject))a=[],c=b.toString().replace(qc,\"\"),c=c.match(rc),m(c[1].split(sc),function(b){b.replace(tc,\nfunction(b,c,d){a.push(d)})}),b.$inject=a}else J(b)?(c=b.length-1,ra(b[c],\"fn\"),a=b.slice(0,c)):ra(b,\"fn\",!0);return a}function qb(b){function a(a){return function(b,c){if(L(b))m(b,mb(a));else return a(b,c)}}function c(a,b){N(b)&&(b=l.instantiate(b));if(!b.$get)throw B(\"Provider \"+a+\" must define $get factory method.\");return j[a+f]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[];m(a,function(a){if(!k.get(a))if(k.put(a,!0),F(a)){var c=ta(a);b=b.concat(e(c.requires)).concat(c._runBlocks);\ntry{for(var d=c._invokeQueue,c=0,f=d.length;c<f;c++){var h=d[c],g=h[0]==\"$injector\"?l:l.get(h[0]);g[h[1]].apply(g,h[2])}}catch(n){throw n.message&&(n.message+=\" from \"+a),n;}}else if(N(a))try{b.push(l.invoke(a))}catch(i){throw i.message&&(i.message+=\" from \"+a),i;}else if(J(a))try{b.push(l.invoke(a))}catch(j){throw j.message&&(j.message+=\" from \"+String(a[a.length-1])),j;}else ra(a,\"module\")});return b}function g(a,b){function c(d){if(typeof d!==\"string\")throw B(\"Service name expected\");if(a.hasOwnProperty(d)){if(a[d]===\ni)throw B(\"Circular dependency: \"+h.join(\" <- \"));return a[d]}else try{return h.unshift(d),a[d]=i,a[d]=b(d)}finally{h.shift()}}function d(a,b,e){var f=[],k=Ab(a),g,n,i;n=0;for(g=k.length;n<g;n++)i=k[n],f.push(e&&e.hasOwnProperty(i)?e[i]:c(i,h));a.$inject||(a=a[g]);switch(b?-1:f.length){case 0:return a();case 1:return a(f[0]);case 2:return a(f[0],f[1]);case 3:return a(f[0],f[1],f[2]);case 4:return a(f[0],f[1],f[2],f[3]);case 5:return a(f[0],f[1],f[2],f[3],f[4]);case 6:return a(f[0],f[1],f[2],f[3],\nf[4],f[5]);case 7:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6]);case 8:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7]);case 9:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]);case 10:return a(f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8],f[9]);default:return a.apply(b,f)}}return{invoke:d,instantiate:function(a,b){var c=function(){},e;c.prototype=(J(a)?a[a.length-1]:a).prototype;c=new c;e=d(a,c,b);return L(e)?e:c},get:c,annotate:Ab}}var i={},f=\"Provider\",h=[],k=new Fa,j={$provide:{provider:a(c),\nfactory:a(d),service:a(function(a,b){return d(a,[\"$injector\",function(a){return a.instantiate(b)}])}),value:a(function(a,b){return d(a,I(b))}),constant:a(function(a,b){j[a]=b;o[a]=b}),decorator:function(a,b){var c=l.get(a+f),d=c.$get;c.$get=function(){var a=r.invoke(d,c);return r.invoke(b,null,{$delegate:a})}}}},l=g(j,function(){throw B(\"Unknown provider: \"+h.join(\" <- \"));}),o={},r=o.$injector=g(o,function(a){a=l.get(a+f);return r.invoke(a.$get,a)});m(e(b),function(a){r.invoke(a||D)});return r}function uc(){var b=\n!0;this.disableAutoScrolling=function(){b=!1};this.$get=[\"$window\",\"$location\",\"$rootScope\",function(a,c,d){function e(a){var b=null;m(a,function(a){!b&&E(a.nodeName)===\"a\"&&(b=a)});return b}function g(){var b=c.hash(),d;b?(d=i.getElementById(b))?d.scrollIntoView():(d=e(i.getElementsByName(b)))?d.scrollIntoView():b===\"top\"&&a.scrollTo(0,0):a.scrollTo(0,0)}var i=a.document;b&&d.$watch(function(){return c.hash()},function(){d.$evalAsync(g)});return g}]}function vc(b,a,c,d){function e(a){try{a.apply(null,\nia.call(arguments,1))}finally{if(n--,n===0)for(;w.length;)try{w.pop()()}catch(b){c.error(b)}}}function g(a,b){(function ea(){m(q,function(a){a()});s=b(ea,a)})()}function i(){O!=f.url()&&(O=f.url(),m(A,function(a){a(f.url())}))}var f=this,h=a[0],k=b.location,j=b.history,l=b.setTimeout,o=b.clearTimeout,r={};f.isMock=!1;var n=0,w=[];f.$$completeOutstandingRequest=e;f.$$incOutstandingRequestCount=function(){n++};f.notifyWhenNoOutstandingRequests=function(a){m(q,function(a){a()});n===0?a():w.push(a)};\nvar q=[],s;f.addPollFn=function(a){t(s)&&g(100,l);q.push(a);return a};var O=k.href,C=a.find(\"base\");f.url=function(a,b){if(a){if(O!=a)return O=a,d.history?b?j.replaceState(null,\"\",a):(j.pushState(null,\"\",a),C.attr(\"href\",C.attr(\"href\"))):b?k.replace(a):k.href=a,f}else return k.href.replace(/%27/g,\"'\")};var A=[],K=!1;f.onUrlChange=function(a){K||(d.history&&u(b).bind(\"popstate\",i),d.hashchange?u(b).bind(\"hashchange\",i):f.addPollFn(i),K=!0);A.push(a);return a};f.baseHref=function(){var a=C.attr(\"href\");\nreturn a?a.replace(/^https?\\:\\/\\/[^\\/]*/,\"\"):a};var W={},y=\"\",M=f.baseHref();f.cookies=function(a,b){var d,e,f,k;if(a)if(b===p)h.cookie=escape(a)+\"=;path=\"+M+\";expires=Thu, 01 Jan 1970 00:00:00 GMT\";else{if(F(b))d=(h.cookie=escape(a)+\"=\"+escape(b)+\";path=\"+M).length+1,d>4096&&c.warn(\"Cookie '\"+a+\"' possibly not set or overflowed because it was too large (\"+d+\" > 4096 bytes)!\"),W.length>20&&c.warn(\"Cookie '\"+a+\"' possibly not set or overflowed because too many cookies were already set (\"+W.length+\n\" > 20 )\")}else{if(h.cookie!==y){y=h.cookie;d=y.split(\"; \");W={};for(f=0;f<d.length;f++)e=d[f],k=e.indexOf(\"=\"),k>0&&(W[unescape(e.substring(0,k))]=unescape(e.substring(k+1)))}return W}};f.defer=function(a,b){var c;n++;c=l(function(){delete r[c];e(a)},b||0);r[c]=!0;return c};f.defer.cancel=function(a){return r[a]?(delete r[a],o(a),e(D),!0):!1}}function wc(){this.$get=[\"$window\",\"$log\",\"$sniffer\",\"$document\",function(b,a,c,d){return new vc(b,d,a,c)}]}function xc(){this.$get=function(){function b(b,\nd){function e(a){if(a!=l){if(o){if(o==a)o=a.n}else o=a;g(a.n,a.p);g(a,l);l=a;l.n=null}}function g(a,b){if(a!=b){if(a)a.p=b;if(b)b.n=a}}if(b in a)throw B(\"cacheId \"+b+\" taken\");var i=0,f=x({},d,{id:b}),h={},k=d&&d.capacity||Number.MAX_VALUE,j={},l=null,o=null;return a[b]={put:function(a,b){var c=j[a]||(j[a]={key:a});e(c);t(b)||(a in h||i++,h[a]=b,i>k&&this.remove(o.key))},get:function(a){var b=j[a];if(b)return e(b),h[a]},remove:function(a){var b=j[a];if(b){if(b==l)l=b.p;if(b==o)o=b.n;g(b.n,b.p);delete j[a];\ndelete h[a];i--}},removeAll:function(){h={};i=0;j={};l=o=null},destroy:function(){j=f=h=null;delete a[b]},info:function(){return x({},f,{size:i})}}}var a={};b.info=function(){var b={};m(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]};return b}}function yc(){this.$get=[\"$cacheFactory\",function(b){return b(\"templates\")}]}function Bb(b){var a={},c=\"Directive\",d=/^\\s*directive\\:\\s*([\\d\\w\\-_]+)\\s+(.*)$/,e=/(([\\d\\w\\-_]+)(?:\\:([^;]+))?;?)/,g=\"Template must have exactly one root element. was: \";\nthis.directive=function f(d,e){F(d)?(qa(e,\"directive\"),a.hasOwnProperty(d)||(a[d]=[],b.factory(d+c,[\"$injector\",\"$exceptionHandler\",function(b,c){var e=[];m(a[d],function(a){try{var f=b.invoke(a);if(N(f))f={compile:I(f)};else if(!f.compile&&f.link)f.compile=I(f.link);f.priority=f.priority||0;f.name=f.name||d;f.require=f.require||f.controller&&f.name;f.restrict=f.restrict||\"A\";e.push(f)}catch(k){c(k)}});return e}])),a[d].push(e)):m(d,mb(f));return this};this.$get=[\"$injector\",\"$interpolate\",\"$exceptionHandler\",\n\"$http\",\"$templateCache\",\"$parse\",\"$controller\",\"$rootScope\",function(b,h,k,j,l,o,r,n){function w(a,b,c){a instanceof u||(a=u(a));m(a,function(b,c){b.nodeType==3&&(a[c]=u(b).wrap(\"<span></span>\").parent()[0])});var d=s(a,b,a,c);return function(b,c){qa(b,\"scope\");var e=c?ua.clone.call(a):a;e.data(\"$scope\",b);q(e,\"ng-scope\");c&&c(e,b);d&&d(b,e,e);return e}}function q(a,b){try{a.addClass(b)}catch(c){}}function s(a,b,c,d){function e(a,c,d,k){for(var g,h,j,n,o,l=0,r=0,q=f.length;l<q;r++)j=c[r],g=f[l++],\nh=f[l++],g?(g.scope?(n=a.$new(L(g.scope)),u(j).data(\"$scope\",n)):n=a,(o=g.transclude)||!k&&b?g(h,n,j,d,function(b){return function(c){var d=a.$new();return b(d,c).bind(\"$destroy\",Va(d,d.$destroy))}}(o||b)):g(h,n,j,p,k)):h&&h(a,j.childNodes,p,k)}for(var f=[],k,g,h,j=0;j<a.length;j++)g=new ea,k=O(a[j],[],g,d),g=(k=k.length?C(k,a[j],g,b,c):null)&&k.terminal||!a[j].childNodes.length?null:s(a[j].childNodes,k?k.transclude:b),f.push(k),f.push(g),h=h||k||g;return h?e:null}function O(a,b,c,f){var k=c.$attr,\ng;switch(a.nodeType){case 1:A(b,fa(Cb(a).toLowerCase()),\"E\",f);var h,j,n;g=a.attributes;for(var o=0,l=g&&g.length;o<l;o++)if(h=g[o],h.specified)j=h.name,n=fa(j.toLowerCase()),k[n]=j,c[n]=h=R(aa&&j==\"href\"?decodeURIComponent(a.getAttribute(j,2)):h.value),yb(a,n)&&(c[n]=!0),X(a,b,h,n),A(b,n,\"A\",f);a=a.className;if(F(a)&&a!==\"\")for(;g=e.exec(a);)n=fa(g[2]),A(b,n,\"C\",f)&&(c[n]=R(g[3])),a=a.substr(g.index+g[0].length);break;case 3:H(b,a.nodeValue);break;case 8:try{if(g=d.exec(a.nodeValue))n=fa(g[1]),A(b,\nn,\"M\",f)&&(c[n]=R(g[2]))}catch(r){}}b.sort(y);return b}function C(a,b,c,d,e){function f(a,b){if(a)a.require=z.require,l.push(a);if(b)b.require=z.require,ba.push(b)}function h(a,b){var c,d=\"data\",e=!1;if(F(a)){for(;(c=a.charAt(0))==\"^\"||c==\"?\";)a=a.substr(1),c==\"^\"&&(d=\"inheritedData\"),e=e||c==\"?\";c=b[d](\"$\"+a+\"Controller\");if(!c&&!e)throw B(\"No controller: \"+a);}else J(a)&&(c=[],m(a,function(a){c.push(h(a,b))}));return c}function j(a,d,e,f,g){var n,q,w,K,s;n=b===e?c:hc(c,new ea(u(e),c.$attr));q=n.$$element;\nif(C){var zc=/^\\s*([@=&])\\s*(\\w*)\\s*$/,O=d.$parent||d;m(C.scope,function(a,b){var c=a.match(zc)||[],e=c[2]||b,f,g,k;switch(c[1]){case \"@\":n.$observe(e,function(a){d[b]=a});n.$$observers[e].$$scope=O;break;case \"=\":g=o(n[e]);k=g.assign||function(){f=d[b]=g(O);throw B(Db+n[e]+\" (directive: \"+C.name+\")\");};f=d[b]=g(O);d.$watch(function(){var a=g(O);a!==d[b]&&(a!==f?f=d[b]=a:k(O,a=f=d[b]));return a});break;case \"&\":g=o(n[e]);d[b]=function(a){return g(O,a)};break;default:throw B(\"Invalid isolate scope definition for directive \"+\nC.name+\": \"+a);}})}t&&m(t,function(a){var b={$scope:d,$element:q,$attrs:n,$transclude:g};s=a.controller;s==\"@\"&&(s=n[a.name]);q.data(\"$\"+a.name+\"Controller\",r(s,b))});f=0;for(w=l.length;f<w;f++)try{K=l[f],K(d,q,n,K.require&&h(K.require,q))}catch(y){k(y,pa(q))}a&&a(d,e.childNodes,p,g);f=0;for(w=ba.length;f<w;f++)try{K=ba[f],K(d,q,n,K.require&&h(K.require,q))}catch(Ha){k(Ha,pa(q))}}for(var n=-Number.MAX_VALUE,l=[],ba=[],s=null,C=null,A=null,y=c.$$element=u(b),z,H,X,D,v=d,t,x,Y,E=0,G=a.length;E<G;E++){z=\na[E];X=p;if(n>z.priority)break;if(Y=z.scope)M(\"isolated scope\",C,z,y),L(Y)&&(q(y,\"ng-isolate-scope\"),C=z),q(y,\"ng-scope\"),s=s||z;H=z.name;if(Y=z.controller)t=t||{},M(\"'\"+H+\"' controller\",t[H],z,y),t[H]=z;if(Y=z.transclude)M(\"transclusion\",D,z,y),D=z,n=z.priority,Y==\"element\"?(X=u(b),y=c.$$element=u(\"<\\!-- \"+H+\": \"+c[H]+\" --\\>\"),b=y[0],Ga(e,u(X[0]),b),v=w(X,d,n)):(X=u(cb(b)).contents(),y.html(\"\"),v=w(X,d));if(Y=z.template)if(M(\"template\",A,z,y),A=z,Y=Ha(Y),z.replace){X=u(\"<div>\"+R(Y)+\"</div>\").contents();\nb=X[0];if(X.length!=1||b.nodeType!==1)throw new B(g+Y);Ga(e,y,b);H={$attr:{}};a=a.concat(O(b,a.splice(E+1,a.length-(E+1)),H));K(c,H);G=a.length}else y.html(Y);if(z.templateUrl)M(\"template\",A,z,y),A=z,j=W(a.splice(E,a.length-E),j,y,c,e,z.replace,v),G=a.length;else if(z.compile)try{x=z.compile(y,c,v),N(x)?f(null,x):x&&f(x.pre,x.post)}catch(I){k(I,pa(y))}if(z.terminal)j.terminal=!0,n=Math.max(n,z.priority)}j.scope=s&&s.scope;j.transclude=D&&v;return j}function A(d,e,g,h){var j=!1;if(a.hasOwnProperty(e))for(var n,\ne=b.get(e+c),o=0,l=e.length;o<l;o++)try{if(n=e[o],(h===p||h>n.priority)&&n.restrict.indexOf(g)!=-1)d.push(n),j=!0}catch(r){k(r)}return j}function K(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;m(a,function(d,e){e.charAt(0)!=\"$\"&&(b[e]&&(d+=(e===\"style\"?\";\":\" \")+b[e]),a.$set(e,d,!0,c[e]))});m(b,function(b,f){f==\"class\"?(q(e,b),a[\"class\"]=(a[\"class\"]?a[\"class\"]+\" \":\"\")+b):f==\"style\"?e.attr(\"style\",e.attr(\"style\")+\";\"+b):f.charAt(0)!=\"$\"&&!a.hasOwnProperty(f)&&(a[f]=b,d[f]=c[f])})}function W(a,b,c,d,e,\nf,k){var h=[],n,o,r=c[0],q=a.shift(),w=x({},q,{controller:null,templateUrl:null,transclude:null,scope:null});c.html(\"\");j.get(q.templateUrl,{cache:l}).success(function(j){var l,q,j=Ha(j);if(f){q=u(\"<div>\"+R(j)+\"</div>\").contents();l=q[0];if(q.length!=1||l.nodeType!==1)throw new B(g+j);j={$attr:{}};Ga(e,c,l);O(l,a,j);K(d,j)}else l=r,c.html(j);a.unshift(w);n=C(a,c,d,k);for(o=s(c.contents(),k);h.length;){var ba=h.pop(),j=h.pop();q=h.pop();var y=h.pop(),m=l;q!==r&&(m=cb(l),Ga(j,u(q),m));n(function(){b(o,\ny,m,e,ba)},y,m,e,ba)}h=null}).error(function(a,b,c,d){throw B(\"Failed to load template: \"+d.url);});return function(a,c,d,e,f){h?(h.push(c),h.push(d),h.push(e),h.push(f)):n(function(){b(o,c,d,e,f)},c,d,e,f)}}function y(a,b){return b.priority-a.priority}function M(a,b,c,d){if(b)throw B(\"Multiple directives [\"+b.name+\", \"+c.name+\"] asking for \"+a+\" on: \"+pa(d));}function H(a,b){var c=h(b,!0);c&&a.push({priority:0,compile:I(function(a,b){var d=b.parent(),e=d.data(\"$binding\")||[];e.push(c);q(d.data(\"$binding\",\ne),\"ng-binding\");a.$watch(c,function(a){b[0].nodeValue=a})})})}function X(a,b,c,d){var e=h(c,!0);e&&b.push({priority:100,compile:I(function(a,b,c){b=c.$$observers||(c.$$observers={});d===\"class\"&&(e=h(c[d],!0));c[d]=p;(b[d]||(b[d]=[])).$$inter=!0;(c.$$observers&&c.$$observers[d].$$scope||a).$watch(e,function(a){c.$set(d,a)})})})}function Ga(a,b,c){var d=b[0],e=d.parentNode,f,g;if(a){f=0;for(g=a.length;f<g;f++)if(a[f]==d){a[f]=c;break}}e&&e.replaceChild(c,d);c[u.expando]=d[u.expando];b[0]=c}var ea=\nfunction(a,b){this.$$element=a;this.$attr=b||{}};ea.prototype={$normalize:fa,$set:function(a,b,c,d){var e=yb(this.$$element[0],a),f=this.$$observers;e&&(this.$$element.prop(a,b),d=e);this[a]=b;d?this.$attr[a]=d:(d=this.$attr[a])||(this.$attr[a]=d=$a(a,\"-\"));c!==!1&&(b===null||b===p?this.$$element.removeAttr(d):this.$$element.attr(d,b));f&&m(f[a],function(a){try{a(b)}catch(c){k(c)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers={}),e=d[a]||(d[a]=[]);e.push(b);n.$evalAsync(function(){e.$$inter||\nb(c[a])});return b}};var D=h.startSymbol(),ba=h.endSymbol(),Ha=D==\"{{\"||ba==\"}}\"?ma:function(a){return a.replace(/\\{\\{/g,D).replace(/}}/g,ba)};return w}]}function fa(b){return rb(b.replace(Ac,\"\"))}function Bc(){var b={};this.register=function(a,c){L(a)?x(b,a):b[a]=c};this.$get=[\"$injector\",\"$window\",function(a,c){return function(d,e){if(F(d)){var g=d,d=b.hasOwnProperty(g)?b[g]:fb(e.$scope,g,!0)||fb(c,g,!0);ra(d,g,!0)}return a.instantiate(d,e)}}]}function Cc(){this.$get=[\"$window\",function(b){return u(b.document)}]}\nfunction Dc(){this.$get=[\"$log\",function(b){return function(a,c){b.error.apply(b,arguments)}}]}function Ec(){var b=\"{{\",a=\"}}\";this.startSymbol=function(a){return a?(b=a,this):b};this.endSymbol=function(b){return b?(a=b,this):a};this.$get=[\"$parse\",function(c){function d(d,f){for(var h,k,j=0,l=[],o=d.length,r=!1,n=[];j<o;)(h=d.indexOf(b,j))!=-1&&(k=d.indexOf(a,h+e))!=-1?(j!=h&&l.push(d.substring(j,h)),l.push(j=c(r=d.substring(h+e,k))),j.exp=r,j=k+g,r=!0):(j!=o&&l.push(d.substring(j)),j=o);if(!(o=\nl.length))l.push(\"\"),o=1;if(!f||r)return n.length=o,j=function(a){for(var b=0,c=o,d;b<c;b++){if(typeof(d=l[b])==\"function\")d=d(a),d==null||d==p?d=\"\":typeof d!=\"string\"&&(d=da(d));n[b]=d}return n.join(\"\")},j.exp=d,j.parts=l,j}var e=b.length,g=a.length;d.startSymbol=function(){return b};d.endSymbol=function(){return a};return d}]}function Eb(b){for(var b=b.split(\"/\"),a=b.length;a--;)b[a]=Za(b[a]);return b.join(\"/\")}function va(b,a){var c=Fb.exec(b),c={protocol:c[1],host:c[3],port:G(c[5])||Gb[c[1]]||\nnull,path:c[6]||\"/\",search:c[8],hash:c[10]};if(a)a.$$protocol=c.protocol,a.$$host=c.host,a.$$port=c.port;return c}function ka(b,a,c){return b+\"://\"+a+(c==Gb[b]?\"\":\":\"+c)}function Fc(b,a,c){var d=va(b);return decodeURIComponent(d.path)!=a||t(d.hash)||d.hash.indexOf(c)!==0?b:ka(d.protocol,d.host,d.port)+a.substr(0,a.lastIndexOf(\"/\"))+d.hash.substr(c.length)}function Gc(b,a,c){var d=va(b);if(decodeURIComponent(d.path)==a)return b;else{var e=d.search&&\"?\"+d.search||\"\",g=d.hash&&\"#\"+d.hash||\"\",i=a.substr(0,\na.lastIndexOf(\"/\")),f=d.path.substr(i.length);if(d.path.indexOf(i)!==0)throw B('Invalid url \"'+b+'\", missing path prefix \"'+i+'\" !');return ka(d.protocol,d.host,d.port)+a+\"#\"+c+f+e+g}}function gb(b,a,c){a=a||\"\";this.$$parse=function(b){var c=va(b,this);if(c.path.indexOf(a)!==0)throw B('Invalid url \"'+b+'\", missing path prefix \"'+a+'\" !');this.$$path=decodeURIComponent(c.path.substr(a.length));this.$$search=Xa(c.search);this.$$hash=c.hash&&decodeURIComponent(c.hash)||\"\";this.$$compose()};this.$$compose=\nfunction(){var b=ob(this.$$search),c=this.$$hash?\"#\"+Za(this.$$hash):\"\";this.$$url=Eb(this.$$path)+(b?\"?\"+b:\"\")+c;this.$$absUrl=ka(this.$$protocol,this.$$host,this.$$port)+a+this.$$url};this.$$rewriteAppUrl=function(a){if(a.indexOf(c)==0)return a};this.$$parse(b)}function Ia(b,a,c){var d;this.$$parse=function(b){var c=va(b,this);if(c.hash&&c.hash.indexOf(a)!==0)throw B('Invalid url \"'+b+'\", missing hash prefix \"'+a+'\" !');d=c.path+(c.search?\"?\"+c.search:\"\");c=Hc.exec((c.hash||\"\").substr(a.length));\nthis.$$path=c[1]?(c[1].charAt(0)==\"/\"?\"\":\"/\")+decodeURIComponent(c[1]):\"\";this.$$search=Xa(c[3]);this.$$hash=c[5]&&decodeURIComponent(c[5])||\"\";this.$$compose()};this.$$compose=function(){var b=ob(this.$$search),c=this.$$hash?\"#\"+Za(this.$$hash):\"\";this.$$url=Eb(this.$$path)+(b?\"?\"+b:\"\")+c;this.$$absUrl=ka(this.$$protocol,this.$$host,this.$$port)+d+(this.$$url?\"#\"+a+this.$$url:\"\")};this.$$rewriteAppUrl=function(a){if(a.indexOf(c)==0)return a};this.$$parse(b)}function Hb(b,a,c,d){Ia.apply(this,arguments);\nthis.$$rewriteAppUrl=function(b){if(b.indexOf(c)==0)return c+d+\"#\"+a+b.substr(c.length)}}function Ja(b){return function(){return this[b]}}function Ib(b,a){return function(c){if(t(c))return this[b];this[b]=a(c);this.$$compose();return this}}function Ic(){var b=\"\",a=!1;this.hashPrefix=function(a){return v(a)?(b=a,this):b};this.html5Mode=function(b){return v(b)?(a=b,this):a};this.$get=[\"$rootScope\",\"$browser\",\"$sniffer\",\"$rootElement\",function(c,d,e,g){function i(a){c.$broadcast(\"$locationChangeSuccess\",\nf.absUrl(),a)}var f,h,k,j=d.url(),l=va(j);a?(h=d.baseHref()||\"/\",k=h.substr(0,h.lastIndexOf(\"/\")),l=ka(l.protocol,l.host,l.port)+k+\"/\",f=e.history?new gb(Fc(j,h,b),k,l):new Hb(Gc(j,h,b),b,l,h.substr(k.length+1))):(l=ka(l.protocol,l.host,l.port)+(l.path||\"\")+(l.search?\"?\"+l.search:\"\")+\"#\"+b+\"/\",f=new Ia(j,b,l));g.bind(\"click\",function(a){if(!a.ctrlKey&&!(a.metaKey||a.which==2)){for(var b=u(a.target);E(b[0].nodeName)!==\"a\";)if(b[0]===g[0]||!(b=b.parent())[0])return;var d=b.prop(\"href\"),e=f.$$rewriteAppUrl(d);\nd&&!b.attr(\"target\")&&e&&(f.$$parse(e),c.$apply(),a.preventDefault(),U.angular[\"ff-684208-preventDefault\"]=!0)}});f.absUrl()!=j&&d.url(f.absUrl(),!0);d.onUrlChange(function(a){f.absUrl()!=a&&(c.$evalAsync(function(){var b=f.absUrl();f.$$parse(a);i(b)}),c.$$phase||c.$digest())});var o=0;c.$watch(function(){var a=d.url(),b=f.$$replace;if(!o||a!=f.absUrl())o++,c.$evalAsync(function(){c.$broadcast(\"$locationChangeStart\",f.absUrl(),a).defaultPrevented?f.$$parse(a):(d.url(f.absUrl(),b),i(a))});f.$$replace=\n!1;return o});return f}]}function Jc(){this.$get=[\"$window\",function(b){function a(a){a instanceof B&&(a.stack?a=a.message&&a.stack.indexOf(a.message)===-1?\"Error: \"+a.message+\"\\n\"+a.stack:a.stack:a.sourceURL&&(a=a.message+\"\\n\"+a.sourceURL+\":\"+a.line));return a}function c(c){var e=b.console||{},g=e[c]||e.log||D;return g.apply?function(){var b=[];m(arguments,function(c){b.push(a(c))});return g.apply(e,b)}:function(a,b){g(a,b)}}return{log:c(\"log\"),warn:c(\"warn\"),info:c(\"info\"),error:c(\"error\")}}]}function Kc(b,\na){function c(a){return a.indexOf(q)!=-1}function d(){return n+1<b.length?b.charAt(n+1):!1}function e(a){return\"0\"<=a&&a<=\"9\"}function g(a){return a==\" \"||a==\"\\r\"||a==\"\\t\"||a==\"\\n\"||a==\"\\u000b\"||a==\"\\u00a0\"}function i(a){return\"a\"<=a&&a<=\"z\"||\"A\"<=a&&a<=\"Z\"||\"_\"==a||a==\"$\"}function f(a){return a==\"-\"||a==\"+\"||e(a)}function h(a,c,d){d=d||n;throw B(\"Lexer Error: \"+a+\" at column\"+(v(c)?\"s \"+c+\"-\"+n+\" [\"+b.substring(c,d)+\"]\":\" \"+d)+\" in expression [\"+b+\"].\");}function k(){for(var a=\"\",c=n;n<b.length;){var k=\nE(b.charAt(n));if(k==\".\"||e(k))a+=k;else{var g=d();if(k==\"e\"&&f(g))a+=k;else if(f(k)&&g&&e(g)&&a.charAt(a.length-1)==\"e\")a+=k;else if(f(k)&&(!g||!e(g))&&a.charAt(a.length-1)==\"e\")h(\"Invalid exponent\");else break}n++}a*=1;o.push({index:c,text:a,json:!0,fn:function(){return a}})}function j(){for(var c=\"\",d=n,f,k,h;n<b.length;){var j=b.charAt(n);if(j==\".\"||i(j)||e(j))j==\".\"&&(f=n),c+=j;else break;n++}if(f)for(k=n;k<b.length;){j=b.charAt(k);if(j==\"(\"){h=c.substr(f-d+1);c=c.substr(0,f-d);n=k;break}if(g(j))k++;\nelse break}d={index:d,text:c};if(Ka.hasOwnProperty(c))d.fn=d.json=Ka[c];else{var l=Jb(c,a);d.fn=x(function(a,b){return l(a,b)},{assign:function(a,b){return Kb(a,c,b)}})}o.push(d);h&&(o.push({index:f,text:\".\",json:!1}),o.push({index:f+1,text:h,json:!1}))}function l(a){var c=n;n++;for(var d=\"\",e=a,f=!1;n<b.length;){var k=b.charAt(n);e+=k;if(f)k==\"u\"?(k=b.substring(n+1,n+5),k.match(/[\\da-f]{4}/i)||h(\"Invalid unicode escape [\\\\u\"+k+\"]\"),n+=4,d+=String.fromCharCode(parseInt(k,16))):(f=Lc[k],d+=f?f:k),\nf=!1;else if(k==\"\\\\\")f=!0;else if(k==a){n++;o.push({index:c,text:e,string:d,json:!0,fn:function(){return d}});return}else d+=k;n++}h(\"Unterminated quote\",c)}for(var o=[],r,n=0,w=[],q,s=\":\";n<b.length;){q=b.charAt(n);if(c(\"\\\"'\"))l(q);else if(e(q)||c(\".\")&&e(d()))k();else if(i(q)){if(j(),\"{,\".indexOf(s)!=-1&&w[0]==\"{\"&&(r=o[o.length-1]))r.json=r.text.indexOf(\".\")==-1}else if(c(\"(){}[].,;:\"))o.push({index:n,text:q,json:\":[,\".indexOf(s)!=-1&&c(\"{[\")||c(\"}]:,\")}),c(\"{[\")&&w.unshift(q),c(\"}]\")&&w.shift(),\nn++;else if(g(q)){n++;continue}else{var m=q+d(),C=Ka[q],A=Ka[m];A?(o.push({index:n,text:m,fn:A}),n+=2):C?(o.push({index:n,text:q,fn:C,json:\"[,:\".indexOf(s)!=-1&&c(\"+-\")}),n+=1):h(\"Unexpected next character \",n,n+1)}s=q}return o}function Mc(b,a,c,d){function e(a,c){throw B(\"Syntax Error: Token '\"+c.text+\"' \"+a+\" at column \"+(c.index+1)+\" of the expression [\"+b+\"] starting at [\"+b.substring(c.index)+\"].\");}function g(){if(M.length===0)throw B(\"Unexpected end of expression: \"+b);return M[0]}function i(a,\nb,c,d){if(M.length>0){var e=M[0],f=e.text;if(f==a||f==b||f==c||f==d||!a&&!b&&!c&&!d)return e}return!1}function f(b,c,d,f){return(b=i(b,c,d,f))?(a&&!b.json&&e(\"is not valid json\",b),M.shift(),b):!1}function h(a){f(a)||e(\"is unexpected, expecting [\"+a+\"]\",i())}function k(a,b){return function(c,d){return a(c,d,b)}}function j(a,b,c){return function(d,e){return b(d,e,a,c)}}function l(){for(var a=[];;)if(M.length>0&&!i(\"}\",\")\",\";\",\"]\")&&a.push(v()),!f(\";\"))return a.length==1?a[0]:function(b,c){for(var d,\ne=0;e<a.length;e++){var f=a[e];f&&(d=f(b,c))}return d}}function o(){for(var a=f(),b=c(a.text),d=[];;)if(a=f(\":\"))d.push(H());else{var e=function(a,c,e){for(var e=[e],f=0;f<d.length;f++)e.push(d[f](a,c));return b.apply(a,e)};return function(){return e}}}function r(){for(var a=n(),b;;)if(b=f(\"||\"))a=j(a,b.fn,n());else return a}function n(){var a=w(),b;if(b=f(\"&&\"))a=j(a,b.fn,n());return a}function w(){var a=q(),b;if(b=f(\"==\",\"!=\"))a=j(a,b.fn,w());return a}function q(){var a;a=s();for(var b;b=f(\"+\",\n\"-\");)a=j(a,b.fn,s());if(b=f(\"<\",\">\",\"<=\",\">=\"))a=j(a,b.fn,q());return a}function s(){for(var a=m(),b;b=f(\"*\",\"/\",\"%\");)a=j(a,b.fn,m());return a}function m(){var a;return f(\"+\")?C():(a=f(\"-\"))?j(W,a.fn,m()):(a=f(\"!\"))?k(a.fn,m()):C()}function C(){var a;if(f(\"(\"))a=v(),h(\")\");else if(f(\"[\"))a=A();else if(f(\"{\"))a=K();else{var b=f();(a=b.fn)||e(\"not a primary expression\",b)}for(var c;b=f(\"(\",\"[\",\".\");)b.text===\"(\"?(a=u(a,c),c=null):b.text===\"[\"?(c=a,a=ea(a)):b.text===\".\"?(c=a,a=t(a)):e(\"IMPOSSIBLE\");\nreturn a}function A(){var a=[];if(g().text!=\"]\"){do a.push(H());while(f(\",\"))}h(\"]\");return function(b,c){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}}function K(){var a=[];if(g().text!=\"}\"){do{var b=f(),b=b.string||b.text;h(\":\");var c=H();a.push({key:b,value:c})}while(f(\",\"))}h(\"}\");return function(b,c){for(var d={},e=0;e<a.length;e++){var f=a[e],k=f.value(b,c);d[f.key]=k}return d}}var W=I(0),y,M=Kc(b,d),H=function(){var a=r(),c,d;return(d=f(\"=\"))?(a.assign||e(\"implies assignment but [\"+\nb.substring(0,d.index)+\"] can not be assigned to\",d),c=r(),function(b,d){return a.assign(b,c(b,d),d)}):a},u=function(a,b){var c=[];if(g().text!=\")\"){do c.push(H());while(f(\",\"))}h(\")\");return function(d,e){for(var f=[],k=b?b(d,e):d,h=0;h<c.length;h++)f.push(c[h](d,e));h=a(d,e)||D;return h.apply?h.apply(k,f):h(f[0],f[1],f[2],f[3],f[4])}},t=function(a){var b=f().text,c=Jb(b,d);return x(function(b,d){return c(a(b,d),d)},{assign:function(c,d,e){return Kb(a(c,e),b,d)}})},ea=function(a){var b=H();h(\"]\");\nreturn x(function(c,d){var e=a(c,d),f=b(c,d),k;if(!e)return p;if((e=e[f])&&e.then){k=e;if(!(\"$$v\"in e))k.$$v=p,k.then(function(a){k.$$v=a});e=e.$$v}return e},{assign:function(c,d,e){return a(c,e)[b(c,e)]=d}})},v=function(){for(var a=H(),b;;)if(b=f(\"|\"))a=j(a,b.fn,o());else return a};a?(H=r,u=t=ea=v=function(){e(\"is not valid json\",{text:b,index:0})},y=C()):y=l();M.length!==0&&e(\"is an unexpected token\",M[0]);return y}function Kb(b,a,c){for(var a=a.split(\".\"),d=0;a.length>1;d++){var e=a.shift(),g=\nb[e];g||(g={},b[e]=g);b=g}return b[a.shift()]=c}function fb(b,a,c){if(!a)return b;for(var a=a.split(\".\"),d,e=b,g=a.length,i=0;i<g;i++)d=a[i],b&&(b=(e=b)[d]);return!c&&N(b)?Va(e,b):b}function Lb(b,a,c,d,e){return function(g,i){var f=i&&i.hasOwnProperty(b)?i:g,h;if(f===null||f===p)return f;if((f=f[b])&&f.then){if(!(\"$$v\"in f))h=f,h.$$v=p,h.then(function(a){h.$$v=a});f=f.$$v}if(!a||f===null||f===p)return f;if((f=f[a])&&f.then){if(!(\"$$v\"in f))h=f,h.$$v=p,h.then(function(a){h.$$v=a});f=f.$$v}if(!c||f===\nnull||f===p)return f;if((f=f[c])&&f.then){if(!(\"$$v\"in f))h=f,h.$$v=p,h.then(function(a){h.$$v=a});f=f.$$v}if(!d||f===null||f===p)return f;if((f=f[d])&&f.then){if(!(\"$$v\"in f))h=f,h.$$v=p,h.then(function(a){h.$$v=a});f=f.$$v}if(!e||f===null||f===p)return f;if((f=f[e])&&f.then){if(!(\"$$v\"in f))h=f,h.$$v=p,h.then(function(a){h.$$v=a});f=f.$$v}return f}}function Jb(b,a){if(hb.hasOwnProperty(b))return hb[b];var c=b.split(\".\"),d=c.length,e;if(a)e=d<6?Lb(c[0],c[1],c[2],c[3],c[4]):function(a,b){var e=0,\nk;do k=Lb(c[e++],c[e++],c[e++],c[e++],c[e++])(a,b),b=p,a=k;while(e<d);return k};else{var g=\"var l, fn, p;\\n\";m(c,function(a,b){g+=\"if(s === null || s === undefined) return s;\\nl=s;\\ns=\"+(b?\"s\":'((k&&k.hasOwnProperty(\"'+a+'\"))?k:s)')+'[\"'+a+'\"];\\nif (s && s.then) {\\n if (!(\"$$v\" in s)) {\\n p=s;\\n p.$$v = undefined;\\n p.then(function(v) {p.$$v=v;});\\n}\\n s=s.$$v\\n}\\n'});g+=\"return s;\";e=Function(\"s\",\"k\",g);e.toString=function(){return g}}return hb[b]=e}function Nc(){var b={};this.$get=[\"$filter\",\"$sniffer\",\nfunction(a,c){return function(d){switch(typeof d){case \"string\":return b.hasOwnProperty(d)?b[d]:b[d]=Mc(d,!1,a,c.csp);case \"function\":return d;default:return D}}}]}function Oc(){this.$get=[\"$rootScope\",\"$exceptionHandler\",function(b,a){return Pc(function(a){b.$evalAsync(a)},a)}]}function Pc(b,a){function c(a){return a}function d(a){return i(a)}var e=function(){var f=[],h,k;return k={resolve:function(a){if(f){var c=f;f=p;h=g(a);c.length&&b(function(){for(var a,b=0,d=c.length;b<d;b++)a=c[b],h.then(a[0],\na[1])})}},reject:function(a){k.resolve(i(a))},promise:{then:function(b,k){var g=e(),i=function(d){try{g.resolve((b||c)(d))}catch(e){a(e),g.reject(e)}},n=function(b){try{g.resolve((k||d)(b))}catch(c){a(c),g.reject(c)}};f?f.push([i,n]):h.then(i,n);return g.promise}}}},g=function(a){return a&&a.then?a:{then:function(c){var d=e();b(function(){d.resolve(c(a))});return d.promise}}},i=function(a){return{then:function(c,k){var g=e();b(function(){g.resolve((k||d)(a))});return g.promise}}};return{defer:e,reject:i,\nwhen:function(f,h,k){var j=e(),l,o=function(b){try{return(h||c)(b)}catch(d){return a(d),i(d)}},r=function(b){try{return(k||d)(b)}catch(c){return a(c),i(c)}};b(function(){g(f).then(function(a){l||(l=!0,j.resolve(g(a).then(o,r)))},function(a){l||(l=!0,j.resolve(r(a)))})});return j.promise},all:function(a){var b=e(),c=a.length,d=[];c?m(a,function(a,e){g(a).then(function(a){e in d||(d[e]=a,--c||b.resolve(d))},function(a){e in d||b.reject(a)})}):b.resolve(d);return b.promise}}}function Qc(){var b={};this.when=\nfunction(a,c){b[a]=x({reloadOnSearch:!0},c);if(a){var d=a[a.length-1]==\"/\"?a.substr(0,a.length-1):a+\"/\";b[d]={redirectTo:a}}return this};this.otherwise=function(a){this.when(null,a);return this};this.$get=[\"$rootScope\",\"$location\",\"$routeParams\",\"$q\",\"$injector\",\"$http\",\"$templateCache\",function(a,c,d,e,g,i,f){function h(){var b=k(),h=r.current;if(b&&h&&b.$route===h.$route&&ha(b.pathParams,h.pathParams)&&!b.reloadOnSearch&&!o)h.params=b.params,V(h.params,d),a.$broadcast(\"$routeUpdate\",h);else if(b||\nh)o=!1,a.$broadcast(\"$routeChangeStart\",b,h),(r.current=b)&&b.redirectTo&&(F(b.redirectTo)?c.path(j(b.redirectTo,b.params)).search(b.params).replace():c.url(b.redirectTo(b.pathParams,c.path(),c.search())).replace()),e.when(b).then(function(){if(b){var a=[],c=[],d;m(b.resolve||{},function(b,d){a.push(d);c.push(F(b)?g.get(b):g.invoke(b))});if(!v(d=b.template))if(v(d=b.templateUrl))d=i.get(d,{cache:f}).then(function(a){return a.data});v(d)&&(a.push(\"$template\"),c.push(d));return e.all(c).then(function(b){var c=\n{};m(b,function(b,d){c[a[d]]=b});return c})}}).then(function(c){if(b==r.current){if(b)b.locals=c,V(b.params,d);a.$broadcast(\"$routeChangeSuccess\",b,h)}},function(c){b==r.current&&a.$broadcast(\"$routeChangeError\",b,h,c)})}function k(){var a,d;m(b,function(b,e){if(!d&&(a=l(c.path(),e)))d=ya(b,{params:x({},c.search(),a),pathParams:a}),d.$route=b});return d||b[null]&&ya(b[null],{params:{},pathParams:{}})}function j(a,b){var c=[];m((a||\"\").split(\":\"),function(a,d){if(d==0)c.push(a);else{var e=a.match(/(\\w+)(.*)/),\nf=e[1];c.push(b[f]);c.push(e[2]||\"\");delete b[f]}});return c.join(\"\")}var l=function(a,b){var c=\"^\"+b.replace(/([\\.\\\\\\(\\)\\^\\$])/g,\"\\\\$1\")+\"$\",d=[],e={};m(b.split(/\\W/),function(a){if(a){var b=RegExp(\":\"+a+\"([\\\\W])\");c.match(b)&&(c=c.replace(b,\"([^\\\\/]*)$1\"),d.push(a))}});var f=a.match(RegExp(c));f&&m(d,function(a,b){e[a]=f[b+1]});return f?e:null},o=!1,r={routes:b,reload:function(){o=!0;a.$evalAsync(h)}};a.$on(\"$locationChangeSuccess\",h);return r}]}function Rc(){this.$get=I({})}function Sc(){var b=\n10;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=[\"$injector\",\"$exceptionHandler\",\"$parse\",function(a,c,d){function e(){this.$id=xa();this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this[\"this\"]=this.$root=this;this.$$asyncQueue=[];this.$$listeners={}}function g(a){if(h.$$phase)throw B(h.$$phase+\" already in progress\");h.$$phase=a}function i(a,b){var c=d(a);ra(c,b);return c}function f(){}e.prototype={$new:function(a){if(N(a))throw B(\"API-CHANGE: Use $controller to instantiate controllers.\");\na?(a=new e,a.$root=this.$root):(a=function(){},a.prototype=this,a=new a,a.$id=xa());a[\"this\"]=a;a.$$listeners={};a.$parent=this;a.$$asyncQueue=[];a.$$watchers=a.$$nextSibling=a.$$childHead=a.$$childTail=null;a.$$prevSibling=this.$$childTail;this.$$childHead?this.$$childTail=this.$$childTail.$$nextSibling=a:this.$$childHead=this.$$childTail=a;return a},$watch:function(a,b,c){var d=i(a,\"watch\"),e=this.$$watchers,g={fn:b,last:f,get:d,exp:a,eq:!!c};if(!N(b)){var h=i(b||D,\"listener\");g.fn=function(a,b,\nc){h(c)}}if(!e)e=this.$$watchers=[];e.unshift(g);return function(){Ua(e,g)}},$digest:function(){var a,d,e,i,r,n,m,q=b,s,p=[],C,A;g(\"$digest\");do{m=!1;s=this;do{for(r=s.$$asyncQueue;r.length;)try{s.$eval(r.shift())}catch(K){c(K)}if(i=s.$$watchers)for(n=i.length;n--;)try{if(a=i[n],(d=a.get(s))!==(e=a.last)&&!(a.eq?ha(d,e):typeof d==\"number\"&&typeof e==\"number\"&&isNaN(d)&&isNaN(e)))m=!0,a.last=a.eq?V(d):d,a.fn(d,e===f?d:e,s),q<5&&(C=4-q,p[C]||(p[C]=[]),A=N(a.exp)?\"fn: \"+(a.exp.name||a.exp.toString()):\na.exp,A+=\"; newVal: \"+da(d)+\"; oldVal: \"+da(e),p[C].push(A))}catch(W){c(W)}if(!(i=s.$$childHead||s!==this&&s.$$nextSibling))for(;s!==this&&!(i=s.$$nextSibling);)s=s.$parent}while(s=i);if(m&&!q--)throw h.$$phase=null,B(b+\" $digest() iterations reached. Aborting!\\nWatchers fired in the last 5 iterations: \"+da(p));}while(m||r.length);h.$$phase=null},$destroy:function(){if(h!=this){var a=this.$parent;this.$broadcast(\"$destroy\");if(a.$$childHead==this)a.$$childHead=this.$$nextSibling;if(a.$$childTail==\nthis)a.$$childTail=this.$$prevSibling;if(this.$$prevSibling)this.$$prevSibling.$$nextSibling=this.$$nextSibling;if(this.$$nextSibling)this.$$nextSibling.$$prevSibling=this.$$prevSibling;this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null}},$eval:function(a,b){return d(a)(this,b)},$evalAsync:function(a){this.$$asyncQueue.push(a)},$apply:function(a){try{return g(\"$apply\"),this.$eval(a)}catch(b){c(b)}finally{h.$$phase=null;try{h.$digest()}catch(d){throw c(d),d;}}},\n$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);return function(){c[za(c,b)]=null}},$emit:function(a,b){var d=[],e,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},i=[h].concat(ia.call(arguments,1)),m,p;do{e=f.$$listeners[a]||d;h.currentScope=f;m=0;for(p=e.length;m<p;m++)if(e[m])try{if(e[m].apply(null,i),g)return h}catch(C){c(C)}else e.splice(m,1),m--,p--;f=f.$parent}while(f);\nreturn h},$broadcast:function(a,b){var d=this,e=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1},g=[f].concat(ia.call(arguments,1)),h,i;do{d=e;f.currentScope=d;e=d.$$listeners[a]||[];h=0;for(i=e.length;h<i;h++)if(e[h])try{e[h].apply(null,g)}catch(m){c(m)}else e.splice(h,1),h--,i--;if(!(e=d.$$childHead||d!==this&&d.$$nextSibling))for(;d!==this&&!(e=d.$$nextSibling);)d=d.$parent}while(d=e);return f}};var h=new e;return h}]}function Tc(){this.$get=\n[\"$window\",function(b){var a={},c=G((/android (\\d+)/.exec(E(b.navigator.userAgent))||[])[1]);return{history:!(!b.history||!b.history.pushState||c<4),hashchange:\"onhashchange\"in b&&(!b.document.documentMode||b.document.documentMode>7),hasEvent:function(c){if(c==\"input\"&&aa==9)return!1;if(t(a[c])){var e=b.document.createElement(\"div\");a[c]=\"on\"+c in e}return a[c]},csp:!1}}]}function Uc(){this.$get=I(U)}function Mb(b){var a={},c,d,e;if(!b)return a;m(b.split(\"\\n\"),function(b){e=b.indexOf(\":\");c=E(R(b.substr(0,\ne)));d=R(b.substr(e+1));c&&(a[c]?a[c]+=\", \"+d:a[c]=d)});return a}function Nb(b){var a=L(b)?b:p;return function(c){a||(a=Mb(b));return c?a[E(c)]||null:a}}function Ob(b,a,c){if(N(c))return c(b,a);m(c,function(c){b=c(b,a)});return b}function Vc(){var b=/^\\s*(\\[|\\{[^\\{])/,a=/[\\}\\]]\\s*$/,c=/^\\)\\]\\}',?\\n/,d=this.defaults={transformResponse:[function(d){F(d)&&(d=d.replace(c,\"\"),b.test(d)&&a.test(d)&&(d=nb(d,!0)));return d}],transformRequest:[function(a){return L(a)&&Sa.apply(a)!==\"[object File]\"?da(a):a}],\nheaders:{common:{Accept:\"application/json, text/plain, */*\",\"X-Requested-With\":\"XMLHttpRequest\"},post:{\"Content-Type\":\"application/json;charset=utf-8\"},put:{\"Content-Type\":\"application/json;charset=utf-8\"}}},e=this.responseInterceptors=[];this.$get=[\"$httpBackend\",\"$browser\",\"$cacheFactory\",\"$rootScope\",\"$q\",\"$injector\",function(a,b,c,h,k,j){function l(a){function c(a){var b=x({},a,{data:Ob(a.data,a.headers,f)});return 200<=a.status&&a.status<300?b:k.reject(b)}a.method=la(a.method);var e=a.transformRequest||\nd.transformRequest,f=a.transformResponse||d.transformResponse,h=d.headers,h=x({\"X-XSRF-TOKEN\":b.cookies()[\"XSRF-TOKEN\"]},h.common,h[E(a.method)],a.headers),e=Ob(a.data,Nb(h),e),g;t(a.data)&&delete h[\"Content-Type\"];g=o(a,e,h);g=g.then(c,c);m(w,function(a){g=a(g)});g.success=function(b){g.then(function(c){b(c.data,c.status,c.headers,a)});return g};g.error=function(b){g.then(null,function(c){b(c.data,c.status,c.headers,a)});return g};return g}function o(b,c,d){function e(a,b,c){m&&(200<=a&&a<300?m.put(w,\n[a,b,Mb(c)]):m.remove(w));f(b,a,c);h.$apply()}function f(a,c,d){c=Math.max(c,0);(200<=c&&c<300?j.resolve:j.reject)({data:a,status:c,headers:Nb(d),config:b})}function i(){var a=za(l.pendingRequests,b);a!==-1&&l.pendingRequests.splice(a,1)}var j=k.defer(),o=j.promise,m,p,w=r(b.url,b.params);l.pendingRequests.push(b);o.then(i,i);b.cache&&b.method==\"GET\"&&(m=L(b.cache)?b.cache:n);if(m)if(p=m.get(w))if(p.then)return p.then(i,i),p;else J(p)?f(p[1],p[0],V(p[2])):f(p,200,{});else m.put(w,o);p||a(b.method,\nw,c,e,d,b.timeout,b.withCredentials);return o}function r(a,b){if(!b)return a;var c=[];ec(b,function(a,b){a==null||a==p||(L(a)&&(a=da(a)),c.push(encodeURIComponent(b)+\"=\"+encodeURIComponent(a)))});return a+(a.indexOf(\"?\")==-1?\"?\":\"&\")+c.join(\"&\")}var n=c(\"$http\"),w=[];m(e,function(a){w.push(F(a)?j.get(a):j.invoke(a))});l.pendingRequests=[];(function(a){m(arguments,function(a){l[a]=function(b,c){return l(x(c||{},{method:a,url:b}))}})})(\"get\",\"delete\",\"head\",\"jsonp\");(function(a){m(arguments,function(a){l[a]=\nfunction(b,c,d){return l(x(d||{},{method:a,url:b,data:c}))}})})(\"post\",\"put\");l.defaults=d;return l}]}function Wc(){this.$get=[\"$browser\",\"$window\",\"$document\",function(b,a,c){return Xc(b,Yc,b.defer,a.angular.callbacks,c[0],a.location.protocol.replace(\":\",\"\"))}]}function Xc(b,a,c,d,e,g){function i(a,b){var c=e.createElement(\"script\"),d=function(){e.body.removeChild(c);b&&b()};c.type=\"text/javascript\";c.src=a;aa?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=\nd;e.body.appendChild(c)}return function(e,h,k,j,l,o,r){function n(a,c,d,e){c=(h.match(Fb)||[\"\",g])[1]==\"file\"?d?200:404:c;a(c==1223?204:c,d,e);b.$$completeOutstandingRequest(D)}b.$$incOutstandingRequestCount();h=h||b.url();if(E(e)==\"jsonp\"){var p=\"_\"+(d.counter++).toString(36);d[p]=function(a){d[p].data=a};i(h.replace(\"JSON_CALLBACK\",\"angular.callbacks.\"+p),function(){d[p].data?n(j,200,d[p].data):n(j,-2);delete d[p]})}else{var q=new a;q.open(e,h,!0);m(l,function(a,b){a&&q.setRequestHeader(b,a)});\nvar s;q.onreadystatechange=function(){q.readyState==4&&n(j,s||q.status,q.responseText,q.getAllResponseHeaders())};if(r)q.withCredentials=!0;q.send(k||\"\");o>0&&c(function(){s=-1;q.abort()},o)}}}function Zc(){this.$get=function(){return{id:\"en-us\",NUMBER_FORMATS:{DECIMAL_SEP:\".\",GROUP_SEP:\",\",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:\"\",posSuf:\"\",negPre:\"-\",negSuf:\"\",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:\"\\u00a4\",posSuf:\"\",negPre:\"(\\u00a4\",negSuf:\")\",gSize:3,lgSize:3}],CURRENCY_SYM:\"$\"},\nDATETIME_FORMATS:{MONTH:\"January,February,March,April,May,June,July,August,September,October,November,December\".split(\",\"),SHORTMONTH:\"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec\".split(\",\"),DAY:\"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday\".split(\",\"),SHORTDAY:\"Sun,Mon,Tue,Wed,Thu,Fri,Sat\".split(\",\"),AMPMS:[\"AM\",\"PM\"],medium:\"MMM d, y h:mm:ss a\",\"short\":\"M/d/yy h:mm a\",fullDate:\"EEEE, MMMM d, y\",longDate:\"MMMM d, y\",mediumDate:\"MMM d, y\",shortDate:\"M/d/yy\",mediumTime:\"h:mm:ss a\",\nshortTime:\"h:mm a\"},pluralCat:function(b){return b===1?\"one\":\"other\"}}}}function $c(){this.$get=[\"$rootScope\",\"$browser\",\"$q\",\"$exceptionHandler\",function(b,a,c,d){function e(e,f,h){var k=c.defer(),j=k.promise,l=v(h)&&!h,f=a.defer(function(){try{k.resolve(e())}catch(a){k.reject(a),d(a)}l||b.$apply()},f),h=function(){delete g[j.$$timeoutId]};j.$$timeoutId=f;g[f]=k;j.then(h,h);return j}var g={};e.cancel=function(b){return b&&b.$$timeoutId in g?(g[b.$$timeoutId].reject(\"canceled\"),a.defer.cancel(b.$$timeoutId)):\n!1};return e}]}function Pb(b){function a(a,e){return b.factory(a+c,e)}var c=\"Filter\";this.register=a;this.$get=[\"$injector\",function(a){return function(b){return a.get(b+c)}}];a(\"currency\",Qb);a(\"date\",Rb);a(\"filter\",ad);a(\"json\",bd);a(\"limitTo\",cd);a(\"lowercase\",dd);a(\"number\",Sb);a(\"orderBy\",Tb);a(\"uppercase\",ed)}function ad(){return function(b,a){if(!(b instanceof Array))return b;var c=[];c.check=function(a){for(var b=0;b<c.length;b++)if(!c[b](a))return!1;return!0};var d=function(a,b){if(b.charAt(0)===\n\"!\")return!d(a,b.substr(1));switch(typeof a){case \"boolean\":case \"number\":case \"string\":return(\"\"+a).toLowerCase().indexOf(b)>-1;case \"object\":for(var c in a)if(c.charAt(0)!==\"$\"&&d(a[c],b))return!0;return!1;case \"array\":for(c=0;c<a.length;c++)if(d(a[c],b))return!0;return!1;default:return!1}};switch(typeof a){case \"boolean\":case \"number\":case \"string\":a={$:a};case \"object\":for(var e in a)e==\"$\"?function(){var b=(\"\"+a[e]).toLowerCase();b&&c.push(function(a){return d(a,b)})}():function(){var b=e,f=\n(\"\"+a[e]).toLowerCase();f&&c.push(function(a){return d(fb(a,b),f)})}();break;case \"function\":c.push(a);break;default:return b}for(var g=[],i=0;i<b.length;i++){var f=b[i];c.check(f)&&g.push(f)}return g}}function Qb(b){var a=b.NUMBER_FORMATS;return function(b,d){if(t(d))d=a.CURRENCY_SYM;return Ub(b,a.PATTERNS[1],a.GROUP_SEP,a.DECIMAL_SEP,2).replace(/\\u00A4/g,d)}}function Sb(b){var a=b.NUMBER_FORMATS;return function(b,d){return Ub(b,a.PATTERNS[0],a.GROUP_SEP,a.DECIMAL_SEP,d)}}function Ub(b,a,c,d,e){if(isNaN(b)||\n!isFinite(b))return\"\";var g=b<0,b=Math.abs(b),i=b+\"\",f=\"\",h=[],k=!1;if(i.indexOf(\"e\")!==-1){var j=i.match(/([\\d\\.]+)e(-?)(\\d+)/);j&&j[2]==\"-\"&&j[3]>e+1?i=\"0\":(f=i,k=!0)}if(!k){i=(i.split(Vb)[1]||\"\").length;t(e)&&(e=Math.min(Math.max(a.minFrac,i),a.maxFrac));var i=Math.pow(10,e),b=Math.round(b*i)/i,b=(\"\"+b).split(Vb),i=b[0],b=b[1]||\"\",k=0,j=a.lgSize,l=a.gSize;if(i.length>=j+l)for(var k=i.length-j,o=0;o<k;o++)(k-o)%l===0&&o!==0&&(f+=c),f+=i.charAt(o);for(o=k;o<i.length;o++)(i.length-o)%j===0&&o!==0&&\n(f+=c),f+=i.charAt(o);for(;b.length<e;)b+=\"0\";e&&(f+=d+b.substr(0,e))}h.push(g?a.negPre:a.posPre);h.push(f);h.push(g?a.negSuf:a.posSuf);return h.join(\"\")}function ib(b,a,c){var d=\"\";b<0&&(d=\"-\",b=-b);for(b=\"\"+b;b.length<a;)b=\"0\"+b;c&&(b=b.substr(b.length-a));return d+b}function P(b,a,c,d){return function(e){e=e[\"get\"+b]();if(c>0||e>-c)e+=c;e===0&&c==-12&&(e=12);return ib(e,a,d)}}function La(b,a){return function(c,d){var e=c[\"get\"+b](),g=la(a?\"SHORT\"+b:b);return d[g][e]}}function Rb(b){function a(a){var b;\nif(b=a.match(c)){var a=new Date(0),g=0,i=0;b[9]&&(g=G(b[9]+b[10]),i=G(b[9]+b[11]));a.setUTCFullYear(G(b[1]),G(b[2])-1,G(b[3]));a.setUTCHours(G(b[4]||0)-g,G(b[5]||0)-i,G(b[6]||0),G(b[7]||0))}return a}var c=/^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;return function(c,e){var g=\"\",i=[],f,h,e=e||\"mediumDate\",e=b.DATETIME_FORMATS[e]||e;F(c)&&(c=fd.test(c)?G(c):a(c));wa(c)&&(c=new Date(c));if(!na(c))return c;for(;e;)(h=gd.exec(e))?(i=i.concat(ia.call(h,\n1)),e=i.pop()):(i.push(e),e=null);m(i,function(a){f=hd[a];g+=f?f(c,b.DATETIME_FORMATS):a.replace(/(^'|'$)/g,\"\").replace(/''/g,\"'\")});return g}}function bd(){return function(b){return da(b,!0)}}function cd(){return function(b,a){if(!(b instanceof Array))return b;var a=G(a),c=[],d,e;if(!b||!(b instanceof Array))return c;a>b.length?a=b.length:a<-b.length&&(a=-b.length);a>0?(d=0,e=a):(d=b.length+a,e=b.length);for(;d<e;d++)c.push(b[d]);return c}}function Tb(b){return function(a,c,d){function e(a,b){return Wa(b)?\nfunction(b,c){return a(c,b)}:a}if(!(a instanceof Array))return a;if(!c)return a;for(var c=J(c)?c:[c],c=Ta(c,function(a){var c=!1,d=a||ma;if(F(a)){if(a.charAt(0)==\"+\"||a.charAt(0)==\"-\")c=a.charAt(0)==\"-\",a=a.substring(1);d=b(a)}return e(function(a,b){var c;c=d(a);var e=d(b),f=typeof c,g=typeof e;f==g?(f==\"string\"&&(c=c.toLowerCase()),f==\"string\"&&(e=e.toLowerCase()),c=c===e?0:c<e?-1:1):c=f<g?-1:1;return c},c)}),g=[],i=0;i<a.length;i++)g.push(a[i]);return g.sort(e(function(a,b){for(var d=0;d<c.length;d++){var e=\nc[d](a,b);if(e!==0)return e}return 0},d))}}function S(b){N(b)&&(b={link:b});b.restrict=b.restrict||\"AC\";return I(b)}function Wb(b,a){function c(a,c){c=c?\"-\"+$a(c,\"-\"):\"\";b.removeClass((a?Ma:Na)+c).addClass((a?Na:Ma)+c)}var d=this,e=b.parent().controller(\"form\")||Oa,g=0,i=d.$error={};d.$name=a.name;d.$dirty=!1;d.$pristine=!0;d.$valid=!0;d.$invalid=!1;e.$addControl(d);b.addClass(Pa);c(!0);d.$addControl=function(a){a.$name&&!d.hasOwnProperty(a.$name)&&(d[a.$name]=a)};d.$removeControl=function(a){a.$name&&\nd[a.$name]===a&&delete d[a.$name];m(i,function(b,c){d.$setValidity(c,!0,a)})};d.$setValidity=function(a,b,k){var j=i[a];if(b){if(j&&(Ua(j,k),!j.length)){g--;if(!g)c(b),d.$valid=!0,d.$invalid=!1;i[a]=!1;c(!0,a);e.$setValidity(a,!0,d)}}else{g||c(b);if(j){if(za(j,k)!=-1)return}else i[a]=j=[],g++,c(!1,a),e.$setValidity(a,!1,d);j.push(k);d.$valid=!1;d.$invalid=!0}};d.$setDirty=function(){b.removeClass(Pa).addClass(Xb);d.$dirty=!0;d.$pristine=!1;e.$setDirty()}}function T(b){return t(b)||b===\"\"||b===null||\nb!==b}function Qa(b,a,c,d,e,g){var i=function(){var c=R(a.val());d.$viewValue!==c&&b.$apply(function(){d.$setViewValue(c)})};if(e.hasEvent(\"input\"))a.bind(\"input\",i);else{var f;a.bind(\"keydown\",function(a){a=a.keyCode;a===91||15<a&&a<19||37<=a&&a<=40||f||(f=g.defer(function(){i();f=null}))});a.bind(\"change\",i)}d.$render=function(){a.val(T(d.$viewValue)?\"\":d.$viewValue)};var h=c.ngPattern,k=function(a,b){return T(b)||a.test(b)?(d.$setValidity(\"pattern\",!0),b):(d.$setValidity(\"pattern\",!1),p)};h&&(h.match(/^\\/(.*)\\/$/)?\n(h=RegExp(h.substr(1,h.length-2)),e=function(a){return k(h,a)}):e=function(a){var c=b.$eval(h);if(!c||!c.test)throw new B(\"Expected \"+h+\" to be a RegExp but was \"+c);return k(c,a)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var j=G(c.ngMinlength),e=function(a){return!T(a)&&a.length<j?(d.$setValidity(\"minlength\",!1),p):(d.$setValidity(\"minlength\",!0),a)};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var l=G(c.ngMaxlength),c=function(a){return!T(a)&&a.length>l?(d.$setValidity(\"maxlength\",\n!1),p):(d.$setValidity(\"maxlength\",!0),a)};d.$parsers.push(c);d.$formatters.push(c)}}function jb(b,a){b=\"ngClass\"+b;return S(function(c,d,e){function g(b,d){if(a===!0||c.$index%2===a)d&&b!==d&&i(d),f(b)}function i(a){L(a)&&!J(a)&&(a=Ta(a,function(a,b){if(a)return b}));d.removeClass(J(a)?a.join(\" \"):a)}function f(a){L(a)&&!J(a)&&(a=Ta(a,function(a,b){if(a)return b}));a&&d.addClass(J(a)?a.join(\" \"):a)}c.$watch(e[b],g,!0);e.$observe(\"class\",function(){var a=c.$eval(e[b]);g(a,a)});b!==\"ngClass\"&&c.$watch(\"$index\",\nfunction(d,g){var j=d%2;j!==g%2&&(j==a?f(c.$eval(e[b])):i(c.$eval(e[b])))})})}var E=function(b){return F(b)?b.toLowerCase():b},la=function(b){return F(b)?b.toUpperCase():b},B=U.Error,aa=G((/msie (\\d+)/.exec(E(navigator.userAgent))||[])[1]),u,ja,ia=[].slice,Ra=[].push,Sa=Object.prototype.toString,Yb=U.angular||(U.angular={}),ta,Cb,Z=[\"0\",\"0\",\"0\"];D.$inject=[];ma.$inject=[];Cb=aa<9?function(b){b=b.nodeName?b:b[0];return b.scopeName&&b.scopeName!=\"HTML\"?la(b.scopeName+\":\"+b.nodeName):b.nodeName}:function(b){return b.nodeName?\nb.nodeName:b[0].nodeName};var kc=/[A-Z]/g,id={full:\"1.0.3\",major:1,minor:0,dot:3,codeName:\"bouncy-thunder\"},Ba=Q.cache={},Aa=Q.expando=\"ng-\"+(new Date).getTime(),oc=1,Zb=U.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent(\"on\"+a,c)},db=U.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent(\"on\"+a,c)},mc=/([\\:\\-\\_]+(.))/g,nc=/^moz([A-Z])/,ua=Q.prototype={ready:function(b){function a(){c||(c=!0,b())}\nvar c=!1;this.bind(\"DOMContentLoaded\",a);Q(U).bind(\"load\",a)},toString:function(){var b=[];m(this,function(a){b.push(\"\"+a)});return\"[\"+b.join(\", \")+\"]\"},eq:function(b){return b>=0?u(this[b]):u(this[this.length+b])},length:0,push:Ra,sort:[].sort,splice:[].splice},Ea={};m(\"multiple,selected,checked,disabled,readOnly,required\".split(\",\"),function(b){Ea[E(b)]=b});var zb={};m(\"input,select,option,textarea,button,form\".split(\",\"),function(b){zb[la(b)]=!0});m({data:ub,inheritedData:Da,scope:function(b){return Da(b,\n\"$scope\")},controller:xb,injector:function(b){return Da(b,\"$injector\")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Ca,css:function(b,a,c){a=rb(a);if(v(c))b.style[a]=c;else{var d;aa<=8&&(d=b.currentStyle&&b.currentStyle[a],d===\"\"&&(d=\"auto\"));d=d||b.style[a];aa<=8&&(d=d===\"\"?p:d);return d}},attr:function(b,a,c){var d=E(a);if(Ea[d])if(v(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||D).specified?d:p;else if(v(c))b.setAttribute(a,\nc);else if(b.getAttribute)return b=b.getAttribute(a,2),b===null?p:b},prop:function(b,a,c){if(v(c))b[a]=c;else return b[a]},text:x(aa<9?function(b,a){if(b.nodeType==1){if(t(a))return b.innerText;b.innerText=a}else{if(t(a))return b.nodeValue;b.nodeValue=a}}:function(b,a){if(t(a))return b.textContent;b.textContent=a},{$dv:\"\"}),val:function(b,a){if(t(a))return b.value;b.value=a},html:function(b,a){if(t(a))return b.innerHTML;for(var c=0,d=b.childNodes;c<d.length;c++)sa(d[c]);b.innerHTML=a}},function(b,\na){Q.prototype[a]=function(a,d){var e,g;if((b.length==2&&b!==Ca&&b!==xb?a:d)===p)if(L(a)){for(e=0;e<this.length;e++)if(b===ub)b(this[e],a);else for(g in a)b(this[e],g,a[g]);return this}else{if(this.length)return b(this[0],a,d)}else{for(e=0;e<this.length;e++)b(this[e],a,d);return this}return b.$dv}});m({removeData:sb,dealoc:sa,bind:function a(c,d,e){var g=$(c,\"events\"),i=$(c,\"handle\");g||$(c,\"events\",g={});i||$(c,\"handle\",i=pc(c,g));m(d.split(\" \"),function(d){var h=g[d];if(!h){if(d==\"mouseenter\"||\nd==\"mouseleave\"){var k=0;g.mouseenter=[];g.mouseleave=[];a(c,\"mouseover\",function(a){k++;k==1&&i(a,\"mouseenter\")});a(c,\"mouseout\",function(a){k--;k==0&&i(a,\"mouseleave\")})}else Zb(c,d,i),g[d]=[];h=g[d]}h.push(e)})},unbind:tb,replaceWith:function(a,c){var d,e=a.parentNode;sa(a);m(new Q(c),function(c){d?e.insertBefore(c,d.nextSibling):e.replaceChild(c,a);d=c})},children:function(a){var c=[];m(a.childNodes,function(a){a.nodeName!=\"#text\"&&c.push(a)});return c},contents:function(a){return a.childNodes},\nappend:function(a,c){m(new Q(c),function(c){a.nodeType===1&&a.appendChild(c)})},prepend:function(a,c){if(a.nodeType===1){var d=a.firstChild;m(new Q(c),function(c){d?a.insertBefore(c,d):(a.appendChild(c),d=c)})}},wrap:function(a,c){var c=u(c)[0],d=a.parentNode;d&&d.replaceChild(c,a);c.appendChild(a)},remove:function(a){sa(a);var c=a.parentNode;c&&c.removeChild(a)},after:function(a,c){var d=a,e=a.parentNode;m(new Q(c),function(a){e.insertBefore(a,d.nextSibling);d=a})},addClass:wb,removeClass:vb,toggleClass:function(a,\nc,d){t(d)&&(d=!Ca(a,c));(d?wb:vb)(a,c)},parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},next:function(a){return a.nextSibling},find:function(a,c){return a.getElementsByTagName(c)},clone:cb,triggerHandler:function(a,c){var d=($(a,\"events\")||{})[c];m(d,function(c){c.call(a,null)})}},function(a,c){Q.prototype[c]=function(c,e){for(var g,i=0;i<this.length;i++)g==p?(g=a(this[i],c,e),g!==p&&(g=u(g))):bb(g,a(this[i],c,e));return g==p?this:g}});Fa.prototype={put:function(a,c){this[ga(a)]=\nc},get:function(a){return this[ga(a)]},remove:function(a){var c=this[a=ga(a)];delete this[a];return c}};eb.prototype={push:function(a,c){var d=this[a=ga(a)];d?d.push(c):this[a]=[c]},shift:function(a){var c=this[a=ga(a)];if(c)return c.length==1?(delete this[a],c[0]):c.shift()},peek:function(a){if(a=this[ga(a)])return a[0]}};var rc=/^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m,sc=/,/,tc=/^\\s*(_?)(\\S+?)\\1\\s*$/,qc=/((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg,Db=\"Non-assignable model expression: \";Bb.$inject=[\"$provide\"];\nvar Ac=/^(x[\\:\\-_]|data[\\:\\-_])/i,Fb=/^([^:]+):\\/\\/(\\w+:{0,1}\\w*@)?([\\w\\.-]*)(:([0-9]+))?(\\/[^\\?#]*)?(\\?([^#]*))?(#(.*))?$/,$b=/^([^\\?#]*)?(\\?([^#]*))?(#(.*))?$/,Hc=$b,Gb={http:80,https:443,ftp:21};gb.prototype={$$replace:!1,absUrl:Ja(\"$$absUrl\"),url:function(a,c){if(t(a))return this.$$url;var d=$b.exec(a);d[1]&&this.path(decodeURIComponent(d[1]));if(d[2]||d[1])this.search(d[3]||\"\");this.hash(d[5]||\"\",c);return this},protocol:Ja(\"$$protocol\"),host:Ja(\"$$host\"),port:Ja(\"$$port\"),path:Ib(\"$$path\",function(a){return a.charAt(0)==\n\"/\"?a:\"/\"+a}),search:function(a,c){if(t(a))return this.$$search;v(c)?c===null?delete this.$$search[a]:this.$$search[a]=c:this.$$search=F(a)?Xa(a):a;this.$$compose();return this},hash:Ib(\"$$hash\",ma),replace:function(){this.$$replace=!0;return this}};Ia.prototype=ya(gb.prototype);Hb.prototype=ya(Ia.prototype);var Ka={\"null\":function(){return null},\"true\":function(){return!0},\"false\":function(){return!1},undefined:D,\"+\":function(a,c,d,e){d=d(a,c);e=e(a,c);return v(d)?v(e)?d+e:d:v(e)?e:p},\"-\":function(a,\nc,d,e){d=d(a,c);e=e(a,c);return(v(d)?d:0)-(v(e)?e:0)},\"*\":function(a,c,d,e){return d(a,c)*e(a,c)},\"/\":function(a,c,d,e){return d(a,c)/e(a,c)},\"%\":function(a,c,d,e){return d(a,c)%e(a,c)},\"^\":function(a,c,d,e){return d(a,c)^e(a,c)},\"=\":D,\"==\":function(a,c,d,e){return d(a,c)==e(a,c)},\"!=\":function(a,c,d,e){return d(a,c)!=e(a,c)},\"<\":function(a,c,d,e){return d(a,c)<e(a,c)},\">\":function(a,c,d,e){return d(a,c)>e(a,c)},\"<=\":function(a,c,d,e){return d(a,c)<=e(a,c)},\">=\":function(a,c,d,e){return d(a,c)>=e(a,\nc)},\"&&\":function(a,c,d,e){return d(a,c)&&e(a,c)},\"||\":function(a,c,d,e){return d(a,c)||e(a,c)},\"&\":function(a,c,d,e){return d(a,c)&e(a,c)},\"|\":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},\"!\":function(a,c,d){return!d(a,c)}},Lc={n:\"\\n\",f:\"\\u000c\",r:\"\\r\",t:\"\\t\",v:\"\\u000b\",\"'\":\"'\",'\"':'\"'},hb={},Yc=U.XMLHttpRequest||function(){try{return new ActiveXObject(\"Msxml2.XMLHTTP.6.0\")}catch(a){}try{return new ActiveXObject(\"Msxml2.XMLHTTP.3.0\")}catch(c){}try{return new ActiveXObject(\"Msxml2.XMLHTTP\")}catch(d){}throw new B(\"This browser does not support XMLHttpRequest.\");\n};Pb.$inject=[\"$provide\"];Qb.$inject=[\"$locale\"];Sb.$inject=[\"$locale\"];var Vb=\".\",hd={yyyy:P(\"FullYear\",4),yy:P(\"FullYear\",2,0,!0),y:P(\"FullYear\",1),MMMM:La(\"Month\"),MMM:La(\"Month\",!0),MM:P(\"Month\",2,1),M:P(\"Month\",1,1),dd:P(\"Date\",2),d:P(\"Date\",1),HH:P(\"Hours\",2),H:P(\"Hours\",1),hh:P(\"Hours\",2,-12),h:P(\"Hours\",1,-12),mm:P(\"Minutes\",2),m:P(\"Minutes\",1),ss:P(\"Seconds\",2),s:P(\"Seconds\",1),EEEE:La(\"Day\"),EEE:La(\"Day\",!0),a:function(a,c){return a.getHours()<12?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=a.getTimezoneOffset();\nreturn ib(a/60,2)+ib(Math.abs(a%60),2)}},gd=/((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,fd=/^\\d+$/;Rb.$inject=[\"$locale\"];var dd=I(E),ed=I(la);Tb.$inject=[\"$parse\"];var jd=I({restrict:\"E\",compile:function(a,c){c.href||c.$set(\"href\",\"\");return function(a,c){c.bind(\"click\",function(a){if(!c.attr(\"href\"))return a.preventDefault(),!1})}}}),kb={};m(Ea,function(a,c){var d=fa(\"ng-\"+c);kb[d]=function(){return{priority:100,compile:function(){return function(a,g,i){a.$watch(i[d],\nfunction(a){i.$set(c,!!a)})}}}}});m([\"src\",\"href\"],function(a){var c=fa(\"ng-\"+a);kb[c]=function(){return{priority:99,link:function(d,e,g){g.$observe(c,function(c){c&&(g.$set(a,c),aa&&e.prop(a,c))})}}}});var Oa={$addControl:D,$removeControl:D,$setValidity:D,$setDirty:D};Wb.$inject=[\"$element\",\"$attrs\",\"$scope\"];var Ra=function(a){return[\"$timeout\",function(c){var d={name:\"form\",restrict:\"E\",controller:Wb,compile:function(){return{pre:function(a,d,i,f){if(!i.action){var h=function(a){a.preventDefault?\na.preventDefault():a.returnValue=!1};Zb(d[0],\"submit\",h);d.bind(\"$destroy\",function(){c(function(){db(d[0],\"submit\",h)},0,!1)})}var k=d.parent().controller(\"form\"),j=i.name||i.ngForm;j&&(a[j]=f);k&&d.bind(\"$destroy\",function(){k.$removeControl(f);j&&(a[j]=p);x(f,Oa)})}}}};return a?x(V(d),{restrict:\"EAC\"}):d}]},kd=Ra(),ld=Ra(!0),md=/^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/,nd=/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$/,od=/^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/,\nac={text:Qa,number:function(a,c,d,e,g,i){Qa(a,c,d,e,g,i);e.$parsers.push(function(a){var c=T(a);return c||od.test(a)?(e.$setValidity(\"number\",!0),a===\"\"?null:c?a:parseFloat(a)):(e.$setValidity(\"number\",!1),p)});e.$formatters.push(function(a){return T(a)?\"\":\"\"+a});if(d.min){var f=parseFloat(d.min),a=function(a){return!T(a)&&a<f?(e.$setValidity(\"min\",!1),p):(e.$setValidity(\"min\",!0),a)};e.$parsers.push(a);e.$formatters.push(a)}if(d.max){var h=parseFloat(d.max),d=function(a){return!T(a)&&a>h?(e.$setValidity(\"max\",\n!1),p):(e.$setValidity(\"max\",!0),a)};e.$parsers.push(d);e.$formatters.push(d)}e.$formatters.push(function(a){return T(a)||wa(a)?(e.$setValidity(\"number\",!0),a):(e.$setValidity(\"number\",!1),p)})},url:function(a,c,d,e,g,i){Qa(a,c,d,e,g,i);a=function(a){return T(a)||md.test(a)?(e.$setValidity(\"url\",!0),a):(e.$setValidity(\"url\",!1),p)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,g,i){Qa(a,c,d,e,g,i);a=function(a){return T(a)||nd.test(a)?(e.$setValidity(\"email\",!0),a):(e.$setValidity(\"email\",\n!1),p)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){t(d.name)&&c.attr(\"name\",xa());c.bind(\"click\",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked=d.value==e.$viewValue};d.$observe(\"value\",e.$render)},checkbox:function(a,c,d,e){var g=d.ngTrueValue,i=d.ngFalseValue;F(g)||(g=!0);F(i)||(i=!1);c.bind(\"click\",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$formatters.push(function(a){return a===\ng});e.$parsers.push(function(a){return a?g:i})},hidden:D,button:D,submit:D,reset:D},bc=[\"$browser\",\"$sniffer\",function(a,c){return{restrict:\"E\",require:\"?ngModel\",link:function(d,e,g,i){i&&(ac[E(g.type)]||ac.text)(d,e,g,i,c,a)}}}],Na=\"ng-valid\",Ma=\"ng-invalid\",Pa=\"ng-pristine\",Xb=\"ng-dirty\",pd=[\"$scope\",\"$exceptionHandler\",\"$attrs\",\"$element\",\"$parse\",function(a,c,d,e,g){function i(a,c){c=c?\"-\"+$a(c,\"-\"):\"\";e.removeClass((a?Ma:Na)+c).addClass((a?Na:Ma)+c)}this.$modelValue=this.$viewValue=Number.NaN;\nthis.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var f=g(d.ngModel),h=f.assign;if(!h)throw B(Db+d.ngModel+\" (\"+pa(e)+\")\");this.$render=D;var k=e.inheritedData(\"$formController\")||Oa,j=0,l=this.$error={};e.addClass(Pa);i(!0);this.$setValidity=function(a,c){if(l[a]!==!c){if(c){if(l[a]&&j--,!j)i(!0),this.$valid=!0,this.$invalid=!1}else i(!1),this.$invalid=!0,this.$valid=!1,j++;l[a]=!c;i(c,a);k.$setValidity(a,\nc,this)}};this.$setViewValue=function(d){this.$viewValue=d;if(this.$pristine)this.$dirty=!0,this.$pristine=!1,e.removeClass(Pa).addClass(Xb),k.$setDirty();m(this.$parsers,function(a){d=a(d)});if(this.$modelValue!==d)this.$modelValue=d,h(a,d),m(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}})};var o=this;a.$watch(function(){var c=f(a);if(o.$modelValue!==c){var d=o.$formatters,e=d.length;for(o.$modelValue=c;e--;)c=d[e](c);if(o.$viewValue!==c)o.$viewValue=c,o.$render()}})}],qd=function(){return{require:[\"ngModel\",\n\"^?form\"],controller:pd,link:function(a,c,d,e){var g=e[0],i=e[1]||Oa;i.$addControl(g);c.bind(\"$destroy\",function(){i.$removeControl(g)})}}},rd=I({require:\"ngModel\",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),cc=function(){return{require:\"?ngModel\",link:function(a,c,d,e){if(e){d.required=!0;var g=function(a){if(d.required&&(T(a)||a===!1))e.$setValidity(\"required\",!1);else return e.$setValidity(\"required\",!0),a};e.$formatters.push(g);e.$parsers.unshift(g);\nd.$observe(\"required\",function(){g(e.$viewValue)})}}}},sd=function(){return{require:\"ngModel\",link:function(a,c,d,e){var g=(a=/\\/(.*)\\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||\",\";e.$parsers.push(function(a){var c=[];a&&m(a.split(g),function(a){a&&c.push(R(a))});return c});e.$formatters.push(function(a){return J(a)?a.join(\", \"):p})}}},td=/^(true|false|\\d+)$/,ud=function(){return{priority:100,compile:function(a,c){return td.test(c.ngValue)?function(a,c,g){g.$set(\"value\",a.$eval(g.ngValue))}:function(a,\nc,g){a.$watch(g.ngValue,function(a){g.$set(\"value\",a,!1)})}}}},vd=S(function(a,c,d){c.addClass(\"ng-binding\").data(\"$binding\",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==p?\"\":a)})}),wd=[\"$interpolate\",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass(\"ng-binding\").data(\"$binding\",c);e.$observe(\"ngBindTemplate\",function(a){d.text(a)})}}],xd=[function(){return function(a,c,d){c.addClass(\"ng-binding\").data(\"$binding\",d.ngBindHtmlUnsafe);a.$watch(d.ngBindHtmlUnsafe,\nfunction(a){c.html(a||\"\")})}}],yd=jb(\"\",!0),zd=jb(\"Odd\",0),Ad=jb(\"Even\",1),Bd=S({compile:function(a,c){c.$set(\"ngCloak\",p);a.removeClass(\"ng-cloak\")}}),Cd=[function(){return{scope:!0,controller:\"@\"}}],Dd=[\"$sniffer\",function(a){return{priority:1E3,compile:function(){a.csp=!0}}}],dc={};m(\"click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave\".split(\" \"),function(a){var c=fa(\"ng-\"+a);dc[c]=[\"$parse\",function(d){return function(e,g,i){var f=d(i[c]);g.bind(E(a),function(a){e.$apply(function(){f(e,\n{$event:a})})})}}]});var Ed=S(function(a,c,d){c.bind(\"submit\",function(){a.$apply(d.ngSubmit)})}),Fd=[\"$http\",\"$templateCache\",\"$anchorScroll\",\"$compile\",function(a,c,d,e){return{restrict:\"ECA\",terminal:!0,compile:function(g,i){var f=i.ngInclude||i.src,h=i.onload||\"\",k=i.autoscroll;return function(g,i){var o=0,m,n=function(){m&&(m.$destroy(),m=null);i.html(\"\")};g.$watch(f,function(f){var p=++o;f?a.get(f,{cache:c}).success(function(a){p===o&&(m&&m.$destroy(),m=g.$new(),i.html(a),e(i.contents())(m),\nv(k)&&(!k||g.$eval(k))&&d(),m.$emit(\"$includeContentLoaded\"),g.$eval(h))}).error(function(){p===o&&n()}):n()})}}}}],Gd=S({compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),Hd=S({terminal:!0,priority:1E3}),Id=[\"$locale\",\"$interpolate\",function(a,c){var d=/{}/g;return{restrict:\"EA\",link:function(e,g,i){var f=i.count,h=g.attr(i.$attr.when),k=i.offset||0,j=e.$eval(h),l={},o=c.startSymbol(),r=c.endSymbol();m(j,function(a,e){l[e]=c(a.replace(d,o+f+\"-\"+k+r))});e.$watch(function(){var c=\nparseFloat(e.$eval(f));return isNaN(c)?\"\":(j[c]||(c=a.pluralCat(c-k)),l[c](e,g,!0))},function(a){g.text(a)})}}}],Jd=S({transclude:\"element\",priority:1E3,terminal:!0,compile:function(a,c,d){return function(a,c,i){var f=i.ngRepeat,i=f.match(/^\\s*(.+)\\s+in\\s+(.*)\\s*$/),h,k,j;if(!i)throw B(\"Expected ngRepeat in form of '_item_ in _collection_' but got '\"+f+\"'.\");f=i[1];h=i[2];i=f.match(/^(?:([\\$\\w]+)|\\(([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\))$/);if(!i)throw B(\"'item' in 'item in collection' should be identifier or (key, value) but got '\"+\nf+\"'.\");k=i[3]||i[1];j=i[2];var l=new eb;a.$watch(function(a){var e,f,i=a.$eval(h),m=gc(i,!0),p,u=new eb,C,A,v,t,y=c;if(J(i))v=i||[];else{v=[];for(C in i)i.hasOwnProperty(C)&&C.charAt(0)!=\"$\"&&v.push(C);v.sort()}e=0;for(f=v.length;e<f;e++){C=i===v?e:v[e];A=i[C];if(t=l.shift(A)){p=t.scope;u.push(A,t);if(e!==t.index)t.index=e,y.after(t.element);y=t.element}else p=a.$new();p[k]=A;j&&(p[j]=C);p.$index=e;p.$first=e===0;p.$last=e===m-1;p.$middle=!(p.$first||p.$last);t||d(p,function(a){y.after(a);t={scope:p,\nelement:y=a,index:e};u.push(A,t)})}for(C in l)if(l.hasOwnProperty(C))for(v=l[C];v.length;)A=v.pop(),A.element.remove(),A.scope.$destroy();l=u})}}}),Kd=S(function(a,c,d){a.$watch(d.ngShow,function(a){c.css(\"display\",Wa(a)?\"\":\"none\")})}),Ld=S(function(a,c,d){a.$watch(d.ngHide,function(a){c.css(\"display\",Wa(a)?\"none\":\"\")})}),Md=S(function(a,c,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&m(d,function(a,d){c.css(d,\"\")});a&&c.css(a)},!0)}),Nd=I({restrict:\"EA\",compile:function(a,c){var d=c.ngSwitch||c.on,\ne={};a.data(\"ng-switch\",e);return function(a,i){var f,h,k;a.$watch(d,function(d){h&&(k.$destroy(),h.remove(),h=k=null);if(f=e[\"!\"+d]||e[\"?\"])a.$eval(c.change),k=a.$new(),f(k,function(a){h=a;i.append(a)})})}}}),Od=S({transclude:\"element\",priority:500,compile:function(a,c,d){a=a.inheritedData(\"ng-switch\");qa(a);a[\"!\"+c.ngSwitchWhen]=d}}),Pd=S({transclude:\"element\",priority:500,compile:function(a,c,d){a=a.inheritedData(\"ng-switch\");qa(a);a[\"?\"]=d}}),Qd=S({controller:[\"$transclude\",\"$element\",function(a,\nc){a(function(a){c.append(a)})}]}),Rd=[\"$http\",\"$templateCache\",\"$route\",\"$anchorScroll\",\"$compile\",\"$controller\",function(a,c,d,e,g,i){return{restrict:\"ECA\",terminal:!0,link:function(a,c,k){function j(){var j=d.current&&d.current.locals,k=j&&j.$template;if(k){c.html(k);l&&(l.$destroy(),l=null);var k=g(c.contents()),p=d.current;l=p.scope=a.$new();if(p.controller)j.$scope=l,j=i(p.controller,j),c.contents().data(\"$ngControllerController\",j);k(l);l.$emit(\"$viewContentLoaded\");l.$eval(m);e()}else c.html(\"\"),\nl&&(l.$destroy(),l=null)}var l,m=k.onload||\"\";a.$on(\"$routeChangeSuccess\",j);j()}}}],Sd=[\"$templateCache\",function(a){return{restrict:\"E\",terminal:!0,compile:function(c,d){d.type==\"text/ng-template\"&&a.put(d.id,c[0].text)}}}],Td=I({terminal:!0}),Ud=[\"$compile\",\"$parse\",function(a,c){var d=/^\\s*(.*?)(?:\\s+as\\s+(.*?))?(?:\\s+group\\s+by\\s+(.*))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*)|(?:\\(\\s*([\\$\\w][\\$\\w\\d]*)\\s*,\\s*([\\$\\w][\\$\\w\\d]*)\\s*\\)))\\s+in\\s+(.*)$/,e={$setViewValue:D};return{restrict:\"E\",require:[\"select\",\n\"?ngModel\"],controller:[\"$element\",\"$scope\",\"$attrs\",function(a,c,d){var h=this,k={},j=e,l;h.databound=d.ngModel;h.init=function(a,c,d){j=a;l=d};h.addOption=function(c){k[c]=!0;j.$viewValue==c&&(a.val(c),l.parent()&&l.remove())};h.removeOption=function(a){this.hasOption(a)&&(delete k[a],j.$viewValue==a&&this.renderUnknownOption(a))};h.renderUnknownOption=function(c){c=\"? \"+ga(c)+\" ?\";l.val(c);a.prepend(l);a.val(c);l.prop(\"selected\",!0)};h.hasOption=function(a){return k.hasOwnProperty(a)};c.$on(\"$destroy\",\nfunction(){h.renderUnknownOption=D})}],link:function(e,i,f,h){function k(a,c,d,e){d.$render=function(){var a=d.$viewValue;e.hasOption(a)?(A.parent()&&A.remove(),c.val(a),a===\"\"&&s.prop(\"selected\",!0)):t(a)&&s?c.val(\"\"):e.renderUnknownOption(a)};c.bind(\"change\",function(){a.$apply(function(){A.parent()&&A.remove();d.$setViewValue(c.val())})})}function j(a,c,d){var e;d.$render=function(){var a=new Fa(d.$viewValue);m(c.children(),function(c){c.selected=v(a.get(c.value))})};a.$watch(function(){ha(e,d.$viewValue)||\n(e=V(d.$viewValue),d.$render())});c.bind(\"change\",function(){a.$apply(function(){var a=[];m(c.children(),function(c){c.selected&&a.push(c.value)});d.$setViewValue(a)})})}function l(e,f,g){function h(){var a={\"\":[]},c=[\"\"],d,i,s,t,u;s=g.$modelValue;t=r(e)||[];var y=l?lb(t):t,A,w,x;w={};u=!1;var z,B;if(n)u=new Fa(s);else if(s===null||q)a[\"\"].push({selected:s===null,id:\"\",label:\"\"}),u=!0;for(x=0;A=y.length,x<A;x++){w[k]=t[l?w[l]=y[x]:x];d=m(e,w)||\"\";if(!(i=a[d]))i=a[d]=[],c.push(d);n?d=u.remove(o(e,\nw))!=p:(d=s===o(e,w),u=u||d);z=j(e,w);z=z===p?\"\":z;i.push({id:l?y[x]:x,label:z,selected:d})}!n&&!u&&a[\"\"].unshift({id:\"?\",label:\"\",selected:!0});w=0;for(y=c.length;w<y;w++){d=c[w];i=a[d];if(v.length<=w)s={element:C.clone().attr(\"label\",d),label:i.label},t=[s],v.push(t),f.append(s.element);else if(t=v[w],s=t[0],s.label!=d)s.element.attr(\"label\",s.label=d);z=null;x=0;for(A=i.length;x<A;x++)if(d=i[x],u=t[x+1]){z=u.element;if(u.label!==d.label)z.text(u.label=d.label);if(u.id!==d.id)z.val(u.id=d.id);if(u.element.selected!==\nd.selected)z.prop(\"selected\",u.selected=d.selected)}else d.id===\"\"&&q?B=q:(B=D.clone()).val(d.id).attr(\"selected\",d.selected).text(d.label),t.push({element:B,label:d.label,id:d.id,selected:d.selected}),z?z.after(B):s.element.append(B),z=B;for(x++;t.length>x;)t.pop().element.remove()}for(;v.length>w;)v.pop()[0].element.remove()}var i;if(!(i=w.match(d)))throw B(\"Expected ngOptions in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '\"+w+\"'.\");var j=c(i[2]||i[1]),k=i[4]||\ni[6],l=i[5],m=c(i[3]||\"\"),o=c(i[2]?i[1]:k),r=c(i[7]),v=[[{element:f,label:\"\"}]];q&&(a(q)(e),q.removeClass(\"ng-scope\"),q.remove());f.html(\"\");f.bind(\"change\",function(){e.$apply(function(){var a,c=r(e)||[],d={},h,i,j,m,q,s;if(n){i=[];m=0;for(s=v.length;m<s;m++){a=v[m];j=1;for(q=a.length;j<q;j++)if((h=a[j].element)[0].selected)h=h.val(),l&&(d[l]=h),d[k]=c[h],i.push(o(e,d))}}else h=f.val(),h==\"?\"?i=p:h==\"\"?i=null:(d[k]=c[h],l&&(d[l]=h),i=o(e,d));g.$setViewValue(i)})});g.$render=h;e.$watch(h)}if(h[1]){for(var o=\nh[0],r=h[1],n=f.multiple,w=f.ngOptions,q=!1,s,D=u(ca.createElement(\"option\")),C=u(ca.createElement(\"optgroup\")),A=D.clone(),h=0,x=i.children(),E=x.length;h<E;h++)if(x[h].value==\"\"){s=q=x.eq(h);break}o.init(r,q,A);if(n&&(f.required||f.ngRequired)){var y=function(a){r.$setValidity(\"required\",!f.required||a&&a.length);return a};r.$parsers.push(y);r.$formatters.unshift(y);f.$observe(\"required\",function(){y(r.$viewValue)})}w?l(e,i,r):n?j(e,i,r):k(e,i,r,o)}}}}],Vd=[\"$interpolate\",function(a){var c={addOption:D,\nremoveOption:D};return{restrict:\"E\",priority:100,compile:function(d,e){if(t(e.value)){var g=a(d.text(),!0);g||e.$set(\"value\",d.text())}return function(a,d,e){var k=d.parent(),j=k.data(\"$selectController\")||k.parent().data(\"$selectController\");j&&j.databound?d.prop(\"selected\",!1):j=c;g?a.$watch(g,function(a,c){e.$set(\"value\",a);a!==c&&j.removeOption(c);j.addOption(a)}):j.addOption(e.value);d.bind(\"$destroy\",function(){j.removeOption(e.value)})}}}}],Wd=I({restrict:\"E\",terminal:!0});(ja=U.jQuery)?(u=\nja,x(ja.fn,{scope:ua.scope,controller:ua.controller,injector:ua.injector,inheritedData:ua.inheritedData}),ab(\"remove\",!0),ab(\"empty\"),ab(\"html\")):u=Q;Yb.element=u;(function(a){x(a,{bootstrap:pb,copy:V,extend:x,equals:ha,element:u,forEach:m,injector:qb,noop:D,bind:Va,toJson:da,fromJson:nb,identity:ma,isUndefined:t,isDefined:v,isString:F,isFunction:N,isObject:L,isNumber:wa,isElement:fc,isArray:J,version:id,isDate:na,lowercase:E,uppercase:la,callbacks:{counter:0}});ta=lc(U);try{ta(\"ngLocale\")}catch(c){ta(\"ngLocale\",\n[]).provider(\"$locale\",Zc)}ta(\"ng\",[\"ngLocale\"],[\"$provide\",function(a){a.provider(\"$compile\",Bb).directive({a:jd,input:bc,textarea:bc,form:kd,script:Sd,select:Ud,style:Wd,option:Vd,ngBind:vd,ngBindHtmlUnsafe:xd,ngBindTemplate:wd,ngClass:yd,ngClassEven:Ad,ngClassOdd:zd,ngCsp:Dd,ngCloak:Bd,ngController:Cd,ngForm:ld,ngHide:Ld,ngInclude:Fd,ngInit:Gd,ngNonBindable:Hd,ngPluralize:Id,ngRepeat:Jd,ngShow:Kd,ngSubmit:Ed,ngStyle:Md,ngSwitch:Nd,ngSwitchWhen:Od,ngSwitchDefault:Pd,ngOptions:Td,ngView:Rd,ngTransclude:Qd,\nngModel:qd,ngList:sd,ngChange:rd,required:cc,ngRequired:cc,ngValue:ud}).directive(kb).directive(dc);a.provider({$anchorScroll:uc,$browser:wc,$cacheFactory:xc,$controller:Bc,$document:Cc,$exceptionHandler:Dc,$filter:Pb,$interpolate:Ec,$http:Vc,$httpBackend:Wc,$location:Ic,$log:Jc,$parse:Nc,$route:Qc,$routeParams:Rc,$rootScope:Sc,$q:Oc,$sniffer:Tc,$templateCache:yc,$timeout:$c,$window:Uc})}])})(Yb);u(ca).ready(function(){jc(ca,pb)})})(window,document);angular.element(document).find(\"head\").append('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak{display:none;}ng\\\\:form{display:block;}</style>');\n"
  },
  {
    "path": "project-school/js/controllers.js",
    "content": "\r\n\r\nfunction Kewei($scope) {\r\n\r\n  $scope.project = {\r\n  \tname : '科技奖励',\r\n  \taddress : 'www.cqnetwork-sp.com:8070',\r\n  \tintroduction : '科委工作人员从大量的事务性、重复性工作中解放出来。将科技成果的申报、审核、评审、合同、管理、咨询、统计、信用等事务性过程，纳入信息化管理以提高工作效率',\r\n  \tdetails : [\r\n  \t\t{\r\n  \t\t\timg : \"../img/kewei_2.jpg\",\r\n  \t\t\tdescription : \"仿WORD在线填写奖励申报书\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/kewei_1.jpg\",\r\n  \t\t\tdescription : \"通过奖励批次查看当前申请奖励的申报书、单位申报历史，执行撤回，通过等功能\"\r\n  \t\t}\r\n  \t]\r\n  }\r\n}\r\n\r\n\r\nfunction Gaotan($scope) {\r\n\r\n  $scope.project = {\r\n  \tname : '高滩川渝合作示范园',\r\n  \tintroduction : '四川省广安邻水高滩川渝合作示范园宣传门户网站',\r\n  \taddress : 'www.gtcyhzsfy.com',\r\n  \tdetails : [\r\n  \t\t{\r\n  \t\t\timg : \"../img/linshui_2.jpg\",\r\n  \t\t\tdescription : \"高滩川渝合作示范园首页，使用图片压缩技术、数据缓存技术\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/linshui_1.jpg\",\r\n  \t\t\tdescription : \"高滩川渝合作示范园园区动态，使用数据缓存技术展示新闻标题\"\r\n  \t\t}\r\n  \t]\r\n  }\r\n}\r\n\r\nfunction Guanli($scope) {\r\n\r\n  $scope.project = {\r\n  \tname : '重庆理工大学管理学院门户网站',\r\n  \tintroduction : '重庆理工大学管理学院门户网站门户网站，负责通知、新闻的发布，涵盖校友通讯录、留言板等附属功能',\r\n  \taddress : 'gl.cqut.edu.cn',\r\n  \tdetails : [\r\n  \t\t{\r\n  \t\t\timg : \"../img/glxy_1.jpg\",\r\n  \t\t\tdescription : \"管理学院首页，使用局部页面缓存技术，提高网站访问速度\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/glxy_2.jpg\",\r\n  \t\t\tdescription : \"管理学院校友名录页面，使用JQGrid显示校友信息\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/glxy_3.jpg\",\r\n  \t\t\tdescription : \"管理学院学生学习发展与指导中心，是学生活动、学生学习的良好平台\"\r\n  \t\t}\r\n  \t]\r\n  }\r\n}\r\n\r\n\r\nfunction RoadsideAssistance($scope) {\r\n\r\n  $scope.project = {\r\n  \tname : '道路救援系统',\r\n  \tintroduction : '融入了快捷报案、综合调度、行业决择、财务管理的车辆救援系统。',\r\n  \taddress : 'gl.cqut.edu.cn',\r\n  \tdetails : [\r\n  \t\t{\r\n  \t\t\timg : \"../img/dljy_1.png\",\r\n  \t\t\tdescription : \"新增报案栏目，使用了语音卡服务、百度地图等\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/dljy_2.png\",\r\n  \t\t\tdescription : \"调度模块，使用调度算法推荐指派最适合的司机\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/dljy_4.png\",\r\n  \t\t\tdescription : \"道路救援手机端\"\r\n  \t\t},\r\n      {\r\n        img : \"../img/dljy_3.png\",\r\n        description : \"道路救援手机端，实时查看客户、司机位置\"\r\n      }\r\n  \t]\r\n  }\r\n}\r\n\r\n\r\nfunction OSTM($scope) {\r\n\r\n  $scope.project = {\r\n  \tname : '重庆理工大学留学生教务系统',\r\n  \tintroduction : '重庆理工大学留学生教务的一个管理系统，主要包含培养计划制定，学生选课，教学管理者排课，毕业资格审核，学生、教师信息管理。',\r\n  \taddress : '暂未上线',\r\n  \tdetails : [\r\n  \t\t{\r\n  \t\t\timg : \"../img/ostm_1.jpg\",\r\n  \t\t\tdescription : \"留学生教务系统首页\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/ostm_2.jpg\",\r\n  \t\t\tdescription : \"留学生教务系统教师排课\"\r\n  \t\t},\r\n      {\r\n        img : \"../img/ostm_3.jpg\",\r\n        description : \"留学生教务系统人员选择器组件\"\r\n      }\r\n  \t]\r\n  }\r\n}\r\n\r\n\r\nfunction Westom($scope) {\r\n\r\n  $scope.project = {\r\n  \tname : '智能家居管理系统',\r\n  \tintroduction : '智能家居服务器性能监控、智能家居集群管理、智能家居CRM系统。',\r\n  \taddress : '218.70.16.198:9090/WestManager',\r\n  \tdetails : [\r\n  \t\t{\r\n  \t\t\timg : \"../img/znjj_1.jpg\",\r\n  \t\t\tdescription : \"设备监控，使用WEB端控制设备，比如台灯、空调、窗帘等\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/znjj_2.jpg\",\r\n  \t\t\tdescription : \"实景监控，使用Modeler系统绘制后在WEB端控制手机系统\"\r\n  \t\t},\r\n  \t\t{\r\n  \t\t\timg : \"../img/znjj_3.jpg\",\r\n  \t\t\tdescription : \"Modeler图形绘制系统，在线绘制用户界面生成XML供用户手机端来解析\"\r\n  \t\t},\r\n      {\r\n        img : \"../img/znjj_4.jpg\",\r\n        description : \"报警监控报表\"\r\n      },\r\n      {\r\n        img : \"../img/znjj_5.jpg\",\r\n        description : \"CRM系统客户地区分布\"\r\n      }\r\n  \t]\r\n  }\r\n}"
  },
  {
    "path": "project-school/js/index.js",
    "content": "$(document).ready(function () {\n        $('.easyui-accordion li a').click(function (event) {\n            var tabTitle = $(this).text();\n            var url = $(this).attr(\"to\");\n            addTab(tabTitle, url);\n            $('.easyui-accordion li div').removeClass(\"selected\");\n            $(this).parent().addClass(\"selected\");\n        }).hover(function () {\n            $(this).parent().addClass(\"hover\");\n        }, function () {\n            $(this).parent().removeClass(\"hover\");\n        });\n\n        function addTab(subtitle, url) {\n            if (!$('#tabs').tabs('exists', subtitle)) {\n                $('#tabs').tabs('add', {\n                    title: subtitle,\n                    content: createFrame(url),\n                    closable: true,\n                    width: $('#mainPanle').width() - 10,\n                    height: $('#mainPanle').height() - 26\n                });\n            } else {\n                $('#tabs').tabs('select', subtitle);\n            }\n            tabClose();\n        }\n\n        function createFrame(url) {\n            var s = '<iframe name=\"mainFrame\" scrolling=\"auto\" frameborder=\"0\"  src=\"' + url + '\" style=\"width:100%;height:100%;\"></iframe>';\n            return s;\n        }\n\n        function tabClose() {\n            /*双击关闭TAB选项卡*/\n            $(\".tabs-inner\").dblclick(function () {\n                var subtitle = $(this).children(\"span\").text();\n                $('#tabs').tabs('close', subtitle);\n            })\n\n            $(\".tabs-inner\").bind('contextmenu', function (e) {\n                $('#mm').menu('show', {\n                    left: e.pageX,\n                    top: e.pageY,\n                });\n\n                var subtitle = $(this).children(\"span\").text();\n                $('#mm').data(\"currtab\", subtitle);\n\n                return false;\n            });\n        }\n        //绑定右键菜单事件\n        function tabCloseEven() {\n            //关闭当前\n            $('#mm-tabclose').click(function () {\n                var currtab_title = $('#mm').data(\"currtab\");\n                $('#tabs').tabs('close', currtab_title);\n            })\n            //全部关闭\n            $('#mm-tabcloseall').click(function () {\n                $('.tabs-inner span').each(function (i, n) {\n                    var t = $(n).text();\n                    $('#tabs').tabs('close', t);\n                });\n            });\n            //关闭除当前之外的TAB\n            $('#mm-tabcloseother').click(function () {\n                var currtab_title = $('#mm').data(\"currtab\");\n                $('.tabs-inner span').each(function (i, n) {\n                    var t = $(n).text();\n                    if (t != currtab_title)\n                        $('#tabs').tabs('close', t);\n                });\n            });\n            //关闭当前右侧的TAB\n            $('#mm-tabcloseright').click(function () {\n                var nextall = $('.tabs-selected').nextAll();\n                if (nextall.length == 0) {\n                    //msgShow('系统提示','后边没有啦~~','error');\n                    alert('后边没有啦~~');\n                    return false;\n                }\n                nextall.each(function (i, n) {\n                    var t = $('a:eq(0) span', $(n)).text();\n                    $('#tabs').tabs('close', t);\n                });\n                return false;\n            });\n            //关闭当前左侧的TAB\n            $('#mm-tabcloseleft').click(function () {\n                var prevall = $('.tabs-selected').prevAll();\n                if (prevall.length == 0) {\n                    alert('到头了，前边没有啦~~');\n                    return false;\n                }\n                prevall.each(function (i, n) {\n                    var t = $('a:eq(0) span', $(n)).text();\n                    $('#tabs').tabs('close', t);\n                });\n                return false;\n            });\n\n            //退出\n            $(\"#mm-exit\").click(function () {\n                $('#mm').menu('hide');\n            })\n        }\n            \n\n    });"
  },
  {
    "path": "project-school/js/tool.js",
    "content": "function AutoResizeImage(maxWidth,maxHeight,objImg){\r\n\tvar img = new Image();\r\n\timg.src = objImg.src;\r\n\tvar hRatio;\r\n\tvar wRatio;\r\n\tvar Ratio = 1;\r\n\tvar w = img.width;\r\n\tvar h = img.height;\r\n\twRatio = maxWidth / w;\r\n\thRatio = maxHeight / h;\r\n\tif (maxWidth ==0 && maxHeight==0){\r\n\t\tRatio = 1;\r\n\t}else if (maxWidth==0){//\r\n\t\tif (hRatio<1) Ratio = hRatio;\r\n\t}else if (maxHeight==0){\r\n\t\tif (wRatio<1) Ratio = wRatio;\r\n\t}else if (wRatio<1 || hRatio<1){\r\n\t\tRatio = (wRatio<=hRatio?wRatio:hRatio);\r\n\t}\r\n\tif (Ratio<1){\r\n\t\tw = w * Ratio;\r\n\t\th = h * Ratio;\r\n\t}\r\n\tobjImg.height = h;\r\n\tobjImg.width = w;\r\n}"
  },
  {
    "path": "project-school/themes/default/accordion.css",
    "content": ".accordion {\n  overflow: hidden;\n  border-width: 1px;\n  border-style: solid;\n}\n.accordion .accordion-header {\n  border-width: 0 0 1px;\n  cursor: pointer;\n}\n.accordion .accordion-body {\n  border-width: 0 0 1px;\n}\n.accordion-noborder {\n  border-width: 0;\n}\n.accordion-noborder .accordion-header {\n  border-width: 0 0 1px;\n}\n.accordion-noborder .accordion-body {\n  border-width: 0 0 1px;\n}\n.accordion-collapse {\n  background: url('images/accordion_arrows.png') no-repeat 0 0;\n}\n.accordion-expand {\n  background: url('images/accordion_arrows.png') no-repeat -16px 0;\n}\n.accordion {\n  background: #ffffff;\n  border-color: #95B8E7;\n}\n.accordion .accordion-header {\n  background: #E0ECFF;\n  filter: none;\n}\n.accordion .accordion-header-selected {\n  background: #FBEC88;\n}\n.accordion .accordion-header-selected .panel-title {\n  color: #000000;\n}\n"
  },
  {
    "path": "project-school/themes/default/calendar.css",
    "content": ".calendar {\n  border-width: 1px;\n  border-style: solid;\n  padding: 1px;\n  overflow: hidden;\n}\n.calendar table {\n  border-collapse: separate;\n  font-size: 12px;\n  width: 100%;\n  height: 100%;\n}\n.calendar table td,\n.calendar table th {\n  font-size: 12px;\n}\n.calendar-noborder {\n  border: 0;\n}\n.calendar-header {\n  position: relative;\n  height: 22px;\n}\n.calendar-title {\n  text-align: center;\n  height: 22px;\n}\n.calendar-title span {\n  position: relative;\n  display: inline-block;\n  top: 2px;\n  padding: 0 3px;\n  height: 18px;\n  line-height: 18px;\n  font-size: 12px;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-prevmonth,\n.calendar-nextmonth,\n.calendar-prevyear,\n.calendar-nextyear {\n  position: absolute;\n  top: 50%;\n  margin-top: -7px;\n  width: 14px;\n  height: 14px;\n  cursor: pointer;\n  font-size: 1px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-prevmonth {\n  left: 20px;\n  background: url('images/calendar_arrows.png') no-repeat -18px -2px;\n}\n.calendar-nextmonth {\n  right: 20px;\n  background: url('images/calendar_arrows.png') no-repeat -34px -2px;\n}\n.calendar-prevyear {\n  left: 3px;\n  background: url('images/calendar_arrows.png') no-repeat -1px -2px;\n}\n.calendar-nextyear {\n  right: 3px;\n  background: url('images/calendar_arrows.png') no-repeat -49px -2px;\n}\n.calendar-body {\n  position: relative;\n}\n.calendar-body th,\n.calendar-body td {\n  text-align: center;\n}\n.calendar-day {\n  border: 0;\n  padding: 1px;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-other-month {\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n}\n.calendar-menu {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 180px;\n  height: 150px;\n  padding: 5px;\n  font-size: 12px;\n  display: none;\n  overflow: hidden;\n}\n.calendar-menu-year-inner {\n  text-align: center;\n  padding-bottom: 5px;\n}\n.calendar-menu-year {\n  width: 40px;\n  text-align: center;\n  border-width: 1px;\n  border-style: solid;\n  margin: 0;\n  padding: 2px;\n  font-weight: bold;\n  font-size: 12px;\n}\n.calendar-menu-prev,\n.calendar-menu-next {\n  display: inline-block;\n  width: 21px;\n  height: 21px;\n  vertical-align: top;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-menu-prev {\n  margin-right: 10px;\n  background: url('images/calendar_arrows.png') no-repeat 2px 2px;\n}\n.calendar-menu-next {\n  margin-left: 10px;\n  background: url('images/calendar_arrows.png') no-repeat -45px 2px;\n}\n.calendar-menu-month {\n  text-align: center;\n  cursor: pointer;\n  font-weight: bold;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-body th,\n.calendar-menu-month {\n  color: #4d4d4d;\n}\n.calendar-day {\n  color: #000000;\n}\n.calendar-sunday {\n  color: #CC2222;\n}\n.calendar-saturday {\n  color: #00ee00;\n}\n.calendar-today {\n  color: #0000ff;\n}\n.calendar-menu-year {\n  border-color: #95B8E7;\n}\n.calendar {\n  border-color: #95B8E7;\n}\n.calendar-header {\n  background: #E0ECFF;\n}\n.calendar-body,\n.calendar-menu {\n  background: #ffffff;\n}\n.calendar-body th {\n  background: #F4F4F4;\n}\n.calendar-hover,\n.calendar-nav-hover,\n.calendar-menu-hover {\n  background-color: #eaf2ff;\n  color: #000000;\n}\n.calendar-hover {\n  border: 1px solid #b7d2ff;\n  padding: 0;\n}\n.calendar-selected {\n  background-color: #FBEC88;\n  color: #000000;\n  border: 1px solid #E2C608;\n  padding: 0;\n}\n"
  },
  {
    "path": "project-school/themes/default/combo.css",
    "content": ".combo {\n  display: inline-block;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n  vertical-align: middle;\n}\n.combo .combo-text {\n  font-size: 12px;\n  border: 0px;\n  line-height: 20px;\n  height: 20px;\n  margin: 0;\n  padding: 0px 2px;\n  *margin-top: -1px;\n  *height: 18px;\n  *line-height: 18px;\n  _height: 18px;\n  _line-height: 18px;\n  vertical-align: baseline;\n}\n.combo-arrow {\n  width: 18px;\n  height: 20px;\n  overflow: hidden;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.combo-arrow-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.combo-panel {\n  overflow: auto;\n}\n.combo-arrow {\n  background: url('images/combo_arrow.png') no-repeat center center;\n}\n.combo,\n.combo-panel {\n  background-color: #ffffff;\n}\n.combo {\n  border-color: #95B8E7;\n  background-color: #ffffff;\n}\n.combo-arrow {\n  background-color: #E0ECFF;\n}\n.combo-arrow-hover {\n  background-color: #eaf2ff;\n}\n"
  },
  {
    "path": "project-school/themes/default/combobox.css",
    "content": ".combobox-item,\n.combobox-group {\n  font-size: 12px;\n  padding: 3px;\n  padding-right: 0px;\n}\n.combobox-gitem {\n  padding-left: 10px;\n}\n.combobox-group {\n  font-weight: bold;\n}\n.combobox-item-hover {\n  background-color: #eaf2ff;\n  color: #000000;\n}\n.combobox-item-selected {\n  background-color: #FBEC88;\n  color: #000000;\n}\n"
  },
  {
    "path": "project-school/themes/default/datagrid.css",
    "content": ".datagrid .panel-body {\n  overflow: hidden;\n  position: relative;\n}\n.datagrid-view {\n  position: relative;\n  overflow: hidden;\n}\n.datagrid-view1,\n.datagrid-view2 {\n  position: absolute;\n  overflow: hidden;\n  top: 0;\n}\n.datagrid-view1 {\n  left: 0;\n}\n.datagrid-view2 {\n  right: 0;\n}\n.datagrid-mask {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n  display: none;\n}\n.datagrid-mask-msg {\n  position: absolute;\n  top: 50%;\n  margin-top: -20px;\n  padding: 12px 5px 10px 30px;\n  width: auto;\n  height: 16px;\n  border-width: 2px;\n  border-style: solid;\n  display: none;\n}\n.datagrid-sort-icon {\n  padding: 0;\n}\n.datagrid-toolbar {\n  height: auto;\n  padding: 1px 2px;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.datagrid-btn-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n  margin: 2px 1px;\n}\n.datagrid .datagrid-pager {\n  margin: 0;\n  border-width: 1px 0 0 0;\n  border-style: solid;\n}\n.datagrid .datagrid-pager-top {\n  border-width: 0 0 1px 0;\n}\n.datagrid-header {\n  overflow: hidden;\n  cursor: default;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.datagrid-header-inner {\n  float: left;\n  width: 10000px;\n}\n.datagrid-header-row,\n.datagrid-row {\n  height: 25px;\n}\n.datagrid-header td,\n.datagrid-body td,\n.datagrid-footer td {\n  border-width: 0 1px 1px 0;\n  border-style: dotted;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-cell,\n.datagrid-cell-group,\n.datagrid-header-rownumber,\n.datagrid-cell-rownumber {\n  margin: 0;\n  padding: 0 4px;\n  white-space: nowrap;\n  word-wrap: normal;\n  overflow: hidden;\n  height: 18px;\n  line-height: 18px;\n  font-size: 12px;\n}\n.datagrid-header .datagrid-cell {\n  height: auto;\n}\n.datagrid-header .datagrid-cell span {\n  font-size: 12px;\n}\n.datagrid-cell-group {\n  text-align: center;\n}\n.datagrid-header-rownumber,\n.datagrid-cell-rownumber {\n  width: 25px;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body {\n  margin: 0;\n  padding: 0;\n  overflow: auto;\n  zoom: 1;\n}\n.datagrid-view1 .datagrid-body-inner {\n  padding-bottom: 20px;\n}\n.datagrid-view1 .datagrid-body {\n  overflow: hidden;\n}\n.datagrid-footer {\n  overflow: hidden;\n}\n.datagrid-footer-inner {\n  border-width: 1px 0 0 0;\n  border-style: solid;\n  width: 10000px;\n  float: left;\n}\n.datagrid-row-editing .datagrid-cell {\n  height: auto;\n}\n.datagrid-header-check,\n.datagrid-cell-check {\n  padding: 0;\n  width: 27px;\n  height: 18px;\n  font-size: 1px;\n  text-align: center;\n  overflow: hidden;\n}\n.datagrid-header-check input,\n.datagrid-cell-check input {\n  margin: 0;\n  padding: 0;\n  width: 15px;\n  height: 18px;\n}\n.datagrid-resize-proxy {\n  position: absolute;\n  width: 1px;\n  height: 10000px;\n  top: 0;\n  cursor: e-resize;\n  display: none;\n}\n.datagrid-body .datagrid-editable {\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body .datagrid-editable table {\n  width: 100%;\n  height: 100%;\n}\n.datagrid-body .datagrid-editable td {\n  border: 0;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body .datagrid-editable .datagrid-editable-input {\n  margin: 0;\n  padding: 2px;\n  border-width: 1px;\n  border-style: solid;\n}\n.datagrid-sort-desc .datagrid-sort-icon {\n  padding: 0 13px 0 0;\n  background: url('images/datagrid_icons.png') no-repeat -16px center;\n}\n.datagrid-sort-asc .datagrid-sort-icon {\n  padding: 0 13px 0 0;\n  background: url('images/datagrid_icons.png') no-repeat 0px center;\n}\n.datagrid-row-collapse {\n  background: url('images/datagrid_icons.png') no-repeat -48px center;\n}\n.datagrid-row-expand {\n  background: url('images/datagrid_icons.png') no-repeat -32px center;\n}\n.datagrid-mask-msg {\n  background: #ffffff url('images/loading.gif') no-repeat scroll 5px center;\n}\n.datagrid-header,\n.datagrid-td-rownumber {\n  background-color: #efefef;\n  background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%);\n  background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%);\n  background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%);\n  background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0);\n}\n.datagrid-cell-rownumber {\n  color: #000000;\n}\n.datagrid-resize-proxy {\n  background: #aac5e7;\n}\n.datagrid-mask {\n  background: #ccc;\n}\n.datagrid-mask-msg {\n  border-color: #95B8E7;\n}\n.datagrid-toolbar,\n.datagrid-pager {\n  background: #F4F4F4;\n}\n.datagrid-header,\n.datagrid-toolbar,\n.datagrid-pager,\n.datagrid-footer-inner {\n  border-color: #dddddd;\n}\n.datagrid-header td,\n.datagrid-body td,\n.datagrid-footer td {\n  border-color: #ccc;\n}\n.datagrid-htable,\n.datagrid-btable,\n.datagrid-ftable {\n  color: #000000;\n}\n.datagrid-row-alt {\n  background: #fafafa;\n}\n.datagrid-row-over,\n.datagrid-header td.datagrid-header-over {\n  background: #eaf2ff;\n  color: #000000;\n  cursor: default;\n}\n.datagrid-row-selected {\n  background: #FBEC88;\n  color: #000000;\n}\n.datagrid-body .datagrid-editable .datagrid-editable-input {\n  border-color: #95B8E7;\n}\n"
  },
  {
    "path": "project-school/themes/default/datebox.css",
    "content": ".datebox-calendar-inner {\n  height: 180px;\n}\n.datebox-button {\n  height: 18px;\n  padding: 2px 5px;\n  text-align: center;\n}\n.datebox-button a {\n  font-size: 12px;\n  font-weight: bold;\n  text-decoration: none;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.datebox-button a:hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.datebox-current,\n.datebox-close {\n  float: left;\n}\n.datebox-close {\n  float: right;\n}\n.datebox .combo-arrow {\n  background-image: url('images/datebox_arrow.png');\n  background-position: center center;\n}\n.datebox-button {\n  background-color: #F4F4F4;\n}\n.datebox-button a {\n  color: #444;\n}\n"
  },
  {
    "path": "project-school/themes/default/dialog.css",
    "content": ".dialog-content {\n  overflow: auto;\n}\n.dialog-toolbar {\n  padding: 2px 5px;\n}\n.dialog-tool-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n  margin: 2px 1px;\n}\n.dialog-button {\n  padding: 5px;\n  text-align: right;\n}\n.dialog-button .l-btn {\n  margin-left: 5px;\n}\n.dialog-toolbar,\n.dialog-button {\n  background: #F4F4F4;\n}\n.dialog-toolbar {\n  border-bottom: 1px solid #dddddd;\n}\n.dialog-button {\n  border-top: 1px solid #dddddd;\n}\n"
  },
  {
    "path": "project-school/themes/default/easyui.css",
    "content": ".panel {\n  overflow: hidden;\n  text-align: left;\n}\n.panel-header,\n.panel-body {\n  border-width: 1px;\n  border-style: solid;\n}\n.panel-header {\n  padding: 5px;\n  position: relative;\n}\n.panel-title {\n  background: url('images/blank.gif') no-repeat;\n}\n.panel-header-noborder {\n  border-width: 0 0 1px 0;\n}\n.panel-body {\n  overflow: auto;\n  border-top-width: 0px;\n}\n.panel-body-noheader {\n  border-top-width: 1px;\n}\n.panel-body-noborder {\n  border-width: 0px;\n}\n.panel-with-icon {\n  padding-left: 18px;\n}\n.panel-icon,\n.panel-tool {\n  position: absolute;\n  top: 50%;\n  margin-top: -8px;\n  height: 16px;\n  overflow: hidden;\n}\n.panel-icon {\n  left: 5px;\n  width: 16px;\n}\n.panel-tool {\n  right: 5px;\n  width: auto;\n}\n.panel-tool a {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  margin: 0 0 0 2px;\n  vertical-align: top;\n}\n.panel-tool a:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n  background-color: #eaf2ff;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n}\n.panel-loading {\n  padding: 11px 0px 10px 30px;\n}\n.panel-noscroll {\n  overflow: hidden;\n}\n.panel-fit,\n.panel-fit body {\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  overflow: hidden;\n}\n.panel-loading {\n  background: url('images/loading.gif') no-repeat 10px 10px;\n}\n.panel-tool-close {\n  background: url('images/panel_tools.png') no-repeat -16px 0px;\n}\n.panel-tool-min {\n  background: url('images/panel_tools.png') no-repeat 0px 0px;\n}\n.panel-tool-max {\n  background: url('images/panel_tools.png') no-repeat 0px -16px;\n}\n.panel-tool-restore {\n  background: url('images/panel_tools.png') no-repeat -16px -16px;\n}\n.panel-tool-collapse {\n  background: url('images/panel_tools.png') no-repeat -32px 0;\n}\n.panel-tool-expand {\n  background: url('images/panel_tools.png') no-repeat -32px -16px;\n}\n.panel-header,\n.panel-body {\n  border-color: #95B8E7;\n}\n.panel-header {\n  background-color: #E0ECFF;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);\n}\n.panel-body {\n  background-color: #ffffff;\n  color: #000000;\n  font-size: 12px;\n}\n.panel-title {\n  font-size: 12px;\n  font-weight: bold;\n  color: #0E2D5F;\n  height: 16px;\n  line-height: 16px;\n}\n.accordion {\n  overflow: hidden;\n  border-width: 1px;\n  border-style: solid;\n}\n.accordion .accordion-header {\n  border-width: 0 0 1px;\n  cursor: pointer;\n}\n.accordion .accordion-body {\n  border-width: 0 0 1px;\n}\n.accordion-noborder {\n  border-width: 0;\n}\n.accordion-noborder .accordion-header {\n  border-width: 0 0 1px;\n}\n.accordion-noborder .accordion-body {\n  border-width: 0 0 1px;\n}\n.accordion-collapse {\n  background: url('images/accordion_arrows.png') no-repeat 0 0;\n}\n.accordion-expand {\n  background: url('images/accordion_arrows.png') no-repeat -16px 0;\n}\n.accordion {\n  background: #ffffff;\n  border-color: #95B8E7;\n}\n.accordion .accordion-header {\n  background: #E0ECFF;\n  filter: none;\n}\n.accordion .accordion-header-selected {\n  background: #FBEC88;\n}\n.accordion .accordion-header-selected .panel-title {\n  color: #000000;\n}\n.window {\n  overflow: hidden;\n  padding: 5px;\n  border-width: 1px;\n  border-style: solid;\n}\n.window .window-header {\n  background: transparent;\n  padding: 0px 0px 6px 0px;\n}\n.window .window-body {\n  border-width: 1px;\n  border-style: solid;\n  border-top-width: 0px;\n}\n.window .window-body-noheader {\n  border-top-width: 1px;\n}\n.window .window-header .panel-icon,\n.window .window-header .panel-tool {\n  top: 50%;\n  margin-top: -11px;\n}\n.window .window-header .panel-icon {\n  left: 1px;\n}\n.window .window-header .panel-tool {\n  right: 1px;\n}\n.window .window-header .panel-with-icon {\n  padding-left: 18px;\n}\n.window-proxy {\n  position: absolute;\n  overflow: hidden;\n}\n.window-proxy-mask {\n  position: absolute;\n  filter: alpha(opacity=5);\n  opacity: 0.05;\n}\n.window-mask {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  filter: alpha(opacity=40);\n  opacity: 0.40;\n  font-size: 1px;\n  *zoom: 1;\n  overflow: hidden;\n}\n.window,\n.window-shadow {\n  position: absolute;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.window-shadow {\n  background: #ccc;\n  -moz-box-shadow: 2px 2px 3px #cccccc;\n  -webkit-box-shadow: 2px 2px 3px #cccccc;\n  box-shadow: 2px 2px 3px #cccccc;\n  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);\n}\n.window,\n.window .window-body {\n  border-color: #95B8E7;\n}\n.window {\n  background-color: #E0ECFF;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);\n}\n.window-proxy {\n  border: 1px dashed #95B8E7;\n}\n.window-proxy-mask,\n.window-mask {\n  background: #ccc;\n}\n.dialog-content {\n  overflow: auto;\n}\n.dialog-toolbar {\n  padding: 2px 5px;\n}\n.dialog-tool-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n  margin: 2px 1px;\n}\n.dialog-button {\n  padding: 5px;\n  text-align: right;\n}\n.dialog-button .l-btn {\n  margin-left: 5px;\n}\n.dialog-toolbar,\n.dialog-button {\n  background: #F4F4F4;\n}\n.dialog-toolbar {\n  border-bottom: 1px solid #dddddd;\n}\n.dialog-button {\n  border-top: 1px solid #dddddd;\n}\n.combo {\n  display: inline-block;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n  vertical-align: middle;\n}\n.combo .combo-text {\n  font-size: 12px;\n  border: 0px;\n  line-height: 20px;\n  height: 20px;\n  margin: 0;\n  padding: 0px 2px;\n  *margin-top: -1px;\n  *height: 18px;\n  *line-height: 18px;\n  _height: 18px;\n  _line-height: 18px;\n  vertical-align: baseline;\n}\n.combo-arrow {\n  width: 18px;\n  height: 20px;\n  overflow: hidden;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.combo-arrow-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.combo-panel {\n  overflow: auto;\n}\n.combo-arrow {\n  background: url('images/combo_arrow.png') no-repeat center center;\n}\n.combo,\n.combo-panel {\n  background-color: #ffffff;\n}\n.combo {\n  border-color: #95B8E7;\n  background-color: #ffffff;\n}\n.combo-arrow {\n  background-color: #E0ECFF;\n}\n.combo-arrow-hover {\n  background-color: #eaf2ff;\n}\n.combobox-item,\n.combobox-group {\n  font-size: 12px;\n  padding: 3px;\n  padding-right: 0px;\n}\n.combobox-gitem {\n  padding-left: 10px;\n}\n.combobox-group {\n  font-weight: bold;\n}\n.combobox-item-hover {\n  background-color: #eaf2ff;\n  color: #000000;\n}\n.combobox-item-selected {\n  background-color: #FBEC88;\n  color: #000000;\n}\n.layout {\n  position: relative;\n  overflow: hidden;\n  margin: 0;\n  padding: 0;\n  z-index: 0;\n}\n.layout-panel {\n  position: absolute;\n  overflow: hidden;\n}\n.layout-panel-east,\n.layout-panel-west {\n  z-index: 2;\n}\n.layout-panel-north,\n.layout-panel-south {\n  z-index: 3;\n}\n.layout-expand {\n  position: absolute;\n  padding: 0px;\n  font-size: 1px;\n  cursor: pointer;\n  z-index: 1;\n}\n.layout-expand .panel-header,\n.layout-expand .panel-body {\n  background: transparent;\n  filter: none;\n  overflow: hidden;\n}\n.layout-expand .panel-header {\n  border-bottom-width: 0px;\n}\n.layout-split-proxy-h,\n.layout-split-proxy-v {\n  position: absolute;\n  font-size: 1px;\n  display: none;\n  z-index: 5;\n}\n.layout-split-proxy-h {\n  width: 5px;\n  cursor: e-resize;\n}\n.layout-split-proxy-v {\n  height: 5px;\n  cursor: n-resize;\n}\n.layout-mask {\n  position: absolute;\n  background: #fafafa;\n  filter: alpha(opacity=10);\n  opacity: 0.10;\n  z-index: 4;\n}\n.layout-button-up {\n  background: url('images/layout_arrows.png') no-repeat -16px -16px;\n}\n.layout-button-down {\n  background: url('images/layout_arrows.png') no-repeat -16px 0;\n}\n.layout-button-left {\n  background: url('images/layout_arrows.png') no-repeat 0 0;\n}\n.layout-button-right {\n  background: url('images/layout_arrows.png') no-repeat 0 -16px;\n}\n.layout-split-proxy-h,\n.layout-split-proxy-v {\n  background-color: #aac5e7;\n}\n.layout-split-north {\n  border-bottom: 5px solid #E6EEF8;\n}\n.layout-split-south {\n  border-top: 5px solid #E6EEF8;\n}\n.layout-split-east {\n  border-left: 5px solid #E6EEF8;\n}\n.layout-split-west {\n  border-right: 5px solid #E6EEF8;\n}\n.layout-expand {\n  background-color: #E0ECFF;\n}\n.layout-expand-over {\n  background-color: #E0ECFF;\n}\n.tabs-container {\n  overflow: hidden;\n}\n.tabs-header {\n  border-width: 1px;\n  border-style: solid;\n  border-bottom-width: 0;\n  position: relative;\n  padding: 0;\n  padding-top: 2px;\n  overflow: hidden;\n}\n.tabs-header-plain {\n  border: 0;\n  background: transparent;\n}\n.tabs-scroller-left,\n.tabs-scroller-right {\n  position: absolute;\n  top: auto;\n  bottom: 0;\n  width: 18px;\n  font-size: 1px;\n  display: none;\n  cursor: pointer;\n  border-width: 1px;\n  border-style: solid;\n}\n.tabs-scroller-left {\n  left: 0;\n}\n.tabs-scroller-right {\n  right: 0;\n}\n.tabs-tool {\n  position: absolute;\n  bottom: 0;\n  padding: 1px;\n  overflow: hidden;\n  border-width: 1px;\n  border-style: solid;\n}\n.tabs-header-plain .tabs-tool {\n  padding: 0 1px;\n}\n.tabs-wrap {\n  position: relative;\n  left: 0;\n  overflow: hidden;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n}\n.tabs-scrolling {\n  margin-left: 18px;\n  margin-right: 18px;\n}\n.tabs-disabled {\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n}\n.tabs {\n  list-style-type: none;\n  height: 26px;\n  margin: 0px;\n  padding: 0px;\n  padding-left: 4px;\n  width: 5000px;\n  border-style: solid;\n  border-width: 0 0 1px 0;\n}\n.tabs li {\n  float: left;\n  display: inline-block;\n  margin: 0 4px -1px 0;\n  padding: 0;\n  position: relative;\n  border: 0;\n}\n.tabs li a.tabs-inner {\n  display: inline-block;\n  text-decoration: none;\n  margin: 0;\n  padding: 0 10px;\n  height: 25px;\n  line-height: 25px;\n  text-align: center;\n  white-space: nowrap;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 0 0;\n  -webkit-border-radius: 5px 5px 0 0;\n  border-radius: 5px 5px 0 0;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  font-weight: bold;\n  outline: none;\n}\n.tabs li.tabs-selected a:hover.tabs-inner {\n  cursor: default;\n  pointer: default;\n}\n.tabs li a.tabs-close,\n.tabs-p-tool {\n  position: absolute;\n  font-size: 1px;\n  display: block;\n  height: 12px;\n  padding: 0;\n  top: 50%;\n  margin-top: -6px;\n  overflow: hidden;\n}\n.tabs li a.tabs-close {\n  width: 12px;\n  right: 5px;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.tabs-p-tool {\n  right: 16px;\n}\n.tabs-p-tool a {\n  display: inline-block;\n  font-size: 1px;\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.tabs li a:hover.tabs-close,\n.tabs-p-tool a:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n  cursor: hand;\n  cursor: pointer;\n}\n.tabs-with-icon {\n  padding-left: 18px;\n}\n.tabs-icon {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  left: 10px;\n  top: 50%;\n  margin-top: -8px;\n}\n.tabs-title {\n  font-size: 12px;\n}\n.tabs-closable {\n  padding-right: 8px;\n}\n.tabs-panels {\n  margin: 0px;\n  padding: 0px;\n  border-width: 1px;\n  border-style: solid;\n  border-top-width: 0;\n  overflow: hidden;\n}\n.tabs-header-bottom {\n  border-width: 0 1px 1px 1px;\n  padding: 0 0 2px 0;\n}\n.tabs-header-bottom .tabs {\n  border-width: 1px 0 0 0;\n}\n.tabs-header-bottom .tabs li {\n  margin: -1px 4px 0 0;\n}\n.tabs-header-bottom .tabs li a.tabs-inner {\n  -moz-border-radius: 0 0 5px 5px;\n  -webkit-border-radius: 0 0 5px 5px;\n  border-radius: 0 0 5px 5px;\n}\n.tabs-header-bottom .tabs-tool {\n  top: 0;\n}\n.tabs-header-bottom .tabs-scroller-left,\n.tabs-header-bottom .tabs-scroller-right {\n  top: 0;\n  bottom: auto;\n}\n.tabs-panels-top {\n  border-width: 1px 1px 0 1px;\n}\n.tabs-header-left {\n  float: left;\n  border-width: 1px 0 1px 1px;\n  padding: 0;\n}\n.tabs-header-right {\n  float: right;\n  border-width: 1px 1px 1px 0;\n  padding: 0;\n}\n.tabs-header-left .tabs-wrap,\n.tabs-header-right .tabs-wrap {\n  height: 100%;\n}\n.tabs-header-left .tabs {\n  height: 100%;\n  padding: 4px 0 0 4px;\n  border-width: 0 1px 0 0;\n}\n.tabs-header-right .tabs {\n  height: 100%;\n  padding: 4px 4px 0 0;\n  border-width: 0 0 0 1px;\n}\n.tabs-header-left .tabs li,\n.tabs-header-right .tabs li {\n  display: block;\n  width: 100%;\n  position: relative;\n}\n.tabs-header-left .tabs li {\n  left: auto;\n  right: 0;\n  margin: 0 -1px 4px 0;\n  float: right;\n}\n.tabs-header-right .tabs li {\n  left: 0;\n  right: auto;\n  margin: 0 0 4px -1px;\n  float: left;\n}\n.tabs-header-left .tabs li a.tabs-inner {\n  display: block;\n  text-align: left;\n  -moz-border-radius: 5px 0 0 5px;\n  -webkit-border-radius: 5px 0 0 5px;\n  border-radius: 5px 0 0 5px;\n}\n.tabs-header-right .tabs li a.tabs-inner {\n  display: block;\n  text-align: left;\n  -moz-border-radius: 0 5px 5px 0;\n  -webkit-border-radius: 0 5px 5px 0;\n  border-radius: 0 5px 5px 0;\n}\n.tabs-panels-right {\n  float: right;\n  border-width: 1px 1px 1px 0;\n}\n.tabs-panels-left {\n  float: left;\n  border-width: 1px 0 1px 1px;\n}\n.tabs-header-noborder,\n.tabs-panels-noborder {\n  border: 0px;\n}\n.tabs-header-plain {\n  border: 0px;\n  background: transparent;\n}\n.tabs-scroller-left {\n  background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center;\n}\n.tabs-scroller-right {\n  background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center;\n}\n.tabs li a.tabs-close {\n  background: url('images/tabs_icons.png') no-repeat -34px center;\n}\n.tabs li a.tabs-inner:hover {\n  background: #eaf2ff;\n  color: #000000;\n  filter: none;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  background-color: #ffffff;\n  color: #0E2D5F;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0);\n}\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%);\n  background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%);\n  background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%);\n  background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0);\n}\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%);\n  background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%);\n  background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%);\n  background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%);\n  background-repeat: repeat-y;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1);\n}\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%);\n  background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%);\n  background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%);\n  background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%);\n  background-repeat: repeat-y;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1);\n}\n.tabs li a.tabs-inner {\n  color: #0E2D5F;\n  background-color: #E0ECFF;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);\n}\n.tabs-header,\n.tabs-tool {\n  background-color: #E0ECFF;\n}\n.tabs-header-plain {\n  background: transparent;\n}\n.tabs-header,\n.tabs-scroller-left,\n.tabs-scroller-right,\n.tabs-tool,\n.tabs,\n.tabs-panels,\n.tabs li a.tabs-inner,\n.tabs li.tabs-selected a.tabs-inner,\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner,\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  border-color: #95B8E7;\n}\n.tabs-p-tool a:hover,\n.tabs li a:hover.tabs-close,\n.tabs-scroller-over {\n  background-color: #eaf2ff;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  border-bottom: 1px solid #ffffff;\n}\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {\n  border-top: 1px solid #ffffff;\n}\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner {\n  border-right: 1px solid #ffffff;\n}\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  border-left: 1px solid #ffffff;\n}\na.l-btn {\n  background-position: right 0;\n  text-decoration: none;\n  display: inline-block;\n  zoom: 1;\n  height: 24px;\n  padding-right: 18px;\n  cursor: pointer;\n  outline: none;\n}\na.l-btn-plain {\n  padding-right: 5px;\n  border: 0;\n  padding: 1px 6px 1px 1px;\n}\na.l-btn-disabled {\n  color: #ccc;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  cursor: default;\n}\na.l-btn span.l-btn-left {\n  display: inline-block;\n  background-position: 0 -48px;\n  padding: 4px 0px 4px 18px;\n  line-height: 16px;\n  height: 16px;\n}\na.l-btn-plain span.l-btn-left {\n  padding-left: 5px;\n}\na.l-btn span span.l-btn-text {\n  display: inline-block;\n  vertical-align: baseline;\n  width: auto;\n  height: 16px;\n  line-height: 16px;\n  font-size: 12px;\n  padding: 0;\n  margin: 0;\n}\na.l-btn span span.l-btn-icon-left {\n  padding: 0 0 0 20px;\n  background-position: left center;\n}\na.l-btn span span.l-btn-icon-right {\n  padding: 0 20px 0 0;\n  background-position: right center;\n}\na.l-btn span span span.l-btn-empty {\n  display: inline-block;\n  margin: 0;\n  padding: 0;\n  width: 16px;\n}\na:hover.l-btn {\n  background-position: right -24px;\n  outline: none;\n  text-decoration: none;\n}\na:hover.l-btn span.l-btn-left {\n  background-position: 0 bottom;\n}\na:hover.l-btn-plain {\n  padding: 0 5px 0 0;\n}\na:hover.l-btn-disabled {\n  background-position: right 0;\n}\na:hover.l-btn-disabled span.l-btn-left {\n  background-position: 0 -48px;\n}\na.l-btn .l-btn-focus {\n  outline: #0000FF dotted thin;\n}\na.l-btn {\n  color: #444;\n  background-image: url('images/linkbutton_bg.png');\n  background-repeat: no-repeat;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\na.l-btn span.l-btn-left {\n  background-image: url('images/linkbutton_bg.png');\n  background-repeat: no-repeat;\n}\na.l-btn-plain,\na.l-btn-plain span.l-btn-left {\n  background: transparent;\n  border: 0;\n  filter: none;\n}\na:hover.l-btn-plain {\n  background: #eaf2ff;\n  color: #000000;\n  border: 1px solid #b7d2ff;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\na.l-btn-disabled,\na:hover.l-btn-disabled {\n  color: #444;\n  filter: alpha(opacity=50);\n}\na.l-btn-plain-disabled,\na:hover.l-btn-plain-disabled {\n  background: transparent;\n  filter: alpha(opacity=50);\n}\na.l-btn-selected,\na:hover.l-btn-selected {\n  background-position: right -24px;\n}\na.l-btn-selected span.l-btn-left,\na:hover.l-btn-selected span.l-btn-left {\n  background-position: 0 bottom;\n}\na.l-btn-plain-selected,\na:hover.l-btn-plain-selected {\n  background: #ddd;\n}\n.datagrid .panel-body {\n  overflow: hidden;\n  position: relative;\n}\n.datagrid-view {\n  position: relative;\n  overflow: hidden;\n}\n.datagrid-view1,\n.datagrid-view2 {\n  position: absolute;\n  overflow: hidden;\n  top: 0;\n}\n.datagrid-view1 {\n  left: 0;\n}\n.datagrid-view2 {\n  right: 0;\n}\n.datagrid-mask {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n  display: none;\n}\n.datagrid-mask-msg {\n  position: absolute;\n  top: 50%;\n  margin-top: -20px;\n  padding: 12px 5px 10px 30px;\n  width: auto;\n  height: 16px;\n  border-width: 2px;\n  border-style: solid;\n  display: none;\n}\n.datagrid-sort-icon {\n  padding: 0;\n}\n.datagrid-toolbar {\n  height: auto;\n  padding: 1px 2px;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.datagrid-btn-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n  margin: 2px 1px;\n}\n.datagrid .datagrid-pager {\n  margin: 0;\n  border-width: 1px 0 0 0;\n  border-style: solid;\n}\n.datagrid .datagrid-pager-top {\n  border-width: 0 0 1px 0;\n}\n.datagrid-header {\n  overflow: hidden;\n  cursor: default;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.datagrid-header-inner {\n  float: left;\n  width: 10000px;\n}\n.datagrid-header-row,\n.datagrid-row {\n  height: 25px;\n}\n.datagrid-header td,\n.datagrid-body td,\n.datagrid-footer td {\n  border-width: 0 1px 1px 0;\n  border-style: dotted;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-cell,\n.datagrid-cell-group,\n.datagrid-header-rownumber,\n.datagrid-cell-rownumber {\n  margin: 0;\n  padding: 0 4px;\n  white-space: nowrap;\n  word-wrap: normal;\n  overflow: hidden;\n  height: 18px;\n  line-height: 18px;\n  font-size: 12px;\n}\n.datagrid-header .datagrid-cell {\n  height: auto;\n}\n.datagrid-header .datagrid-cell span {\n  font-size: 12px;\n}\n.datagrid-cell-group {\n  text-align: center;\n}\n.datagrid-header-rownumber,\n.datagrid-cell-rownumber {\n  width: 25px;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body {\n  margin: 0;\n  padding: 0;\n  overflow: auto;\n  zoom: 1;\n}\n.datagrid-view1 .datagrid-body-inner {\n  padding-bottom: 20px;\n}\n.datagrid-view1 .datagrid-body {\n  overflow: hidden;\n}\n.datagrid-footer {\n  overflow: hidden;\n}\n.datagrid-footer-inner {\n  border-width: 1px 0 0 0;\n  border-style: solid;\n  width: 10000px;\n  float: left;\n}\n.datagrid-row-editing .datagrid-cell {\n  height: auto;\n}\n.datagrid-header-check,\n.datagrid-cell-check {\n  padding: 0;\n  width: 27px;\n  height: 18px;\n  font-size: 1px;\n  text-align: center;\n  overflow: hidden;\n}\n.datagrid-header-check input,\n.datagrid-cell-check input {\n  margin: 0;\n  padding: 0;\n  width: 15px;\n  height: 18px;\n}\n.datagrid-resize-proxy {\n  position: absolute;\n  width: 1px;\n  height: 10000px;\n  top: 0;\n  cursor: e-resize;\n  display: none;\n}\n.datagrid-body .datagrid-editable {\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body .datagrid-editable table {\n  width: 100%;\n  height: 100%;\n}\n.datagrid-body .datagrid-editable td {\n  border: 0;\n  margin: 0;\n  padding: 0;\n}\n.datagrid-body .datagrid-editable .datagrid-editable-input {\n  margin: 0;\n  padding: 2px;\n  border-width: 1px;\n  border-style: solid;\n}\n.datagrid-sort-desc .datagrid-sort-icon {\n  padding: 0 13px 0 0;\n  background: url('images/datagrid_icons.png') no-repeat -16px center;\n}\n.datagrid-sort-asc .datagrid-sort-icon {\n  padding: 0 13px 0 0;\n  background: url('images/datagrid_icons.png') no-repeat 0px center;\n}\n.datagrid-row-collapse {\n  background: url('images/datagrid_icons.png') no-repeat -48px center;\n}\n.datagrid-row-expand {\n  background: url('images/datagrid_icons.png') no-repeat -32px center;\n}\n.datagrid-mask-msg {\n  background: #ffffff url('images/loading.gif') no-repeat scroll 5px center;\n}\n.datagrid-header,\n.datagrid-td-rownumber {\n  background-color: #efefef;\n  background: -webkit-linear-gradient(top,#F9F9F9 0,#efefef 100%);\n  background: -moz-linear-gradient(top,#F9F9F9 0,#efefef 100%);\n  background: -o-linear-gradient(top,#F9F9F9 0,#efefef 100%);\n  background: linear-gradient(to bottom,#F9F9F9 0,#efefef 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#F9F9F9,endColorstr=#efefef,GradientType=0);\n}\n.datagrid-cell-rownumber {\n  color: #000000;\n}\n.datagrid-resize-proxy {\n  background: #aac5e7;\n}\n.datagrid-mask {\n  background: #ccc;\n}\n.datagrid-mask-msg {\n  border-color: #95B8E7;\n}\n.datagrid-toolbar,\n.datagrid-pager {\n  background: #F4F4F4;\n}\n.datagrid-header,\n.datagrid-toolbar,\n.datagrid-pager,\n.datagrid-footer-inner {\n  border-color: #dddddd;\n}\n.datagrid-header td,\n.datagrid-body td,\n.datagrid-footer td {\n  border-color: #ccc;\n}\n.datagrid-htable,\n.datagrid-btable,\n.datagrid-ftable {\n  color: #000000;\n}\n.datagrid-row-alt {\n  background: #fafafa;\n}\n.datagrid-row-over,\n.datagrid-header td.datagrid-header-over {\n  background: #eaf2ff;\n  color: #000000;\n  cursor: default;\n}\n.datagrid-row-selected {\n  background: #FBEC88;\n  color: #000000;\n}\n.datagrid-body .datagrid-editable .datagrid-editable-input {\n  border-color: #95B8E7;\n}\n.propertygrid .datagrid-view1 .datagrid-body td {\n  padding-bottom: 1px;\n  border-width: 0 1px 0 0;\n}\n.propertygrid .datagrid-group {\n  height: 21px;\n  overflow: hidden;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.propertygrid .datagrid-group span {\n  font-weight: bold;\n}\n.propertygrid .datagrid-view1 .datagrid-body td {\n  border-color: #dddddd;\n}\n.propertygrid .datagrid-view1 .datagrid-group {\n  border-color: #E0ECFF;\n}\n.propertygrid .datagrid-view2 .datagrid-group {\n  border-color: #dddddd;\n}\n.propertygrid .datagrid-group,\n.propertygrid .datagrid-view1 .datagrid-body,\n.propertygrid .datagrid-view1 .datagrid-row-over,\n.propertygrid .datagrid-view1 .datagrid-row-selected {\n  background: #E0ECFF;\n}\n.pagination {\n  zoom: 1;\n}\n.pagination table {\n  float: left;\n  height: 30px;\n}\n.pagination td {\n  border: 0;\n}\n.pagination-btn-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n  margin: 3px 1px;\n}\n.pagination .pagination-num {\n  border-width: 1px;\n  border-style: solid;\n  margin: 0 2px;\n  padding: 2px;\n  width: 2em;\n  height: auto;\n}\n.pagination-page-list {\n  margin: 0px 6px;\n  padding: 1px 2px;\n  width: auto;\n  height: auto;\n  border-width: 1px;\n  border-style: solid;\n}\n.pagination-info {\n  float: right;\n  margin: 0 6px 0 0;\n  padding: 0;\n  height: 30px;\n  line-height: 30px;\n  font-size: 12px;\n}\n.pagination span {\n  font-size: 12px;\n}\n.pagination-first {\n  background: url('images/pagination_icons.png') no-repeat 0 0;\n}\n.pagination-prev {\n  background: url('images/pagination_icons.png') no-repeat -16px 0;\n}\n.pagination-next {\n  background: url('images/pagination_icons.png') no-repeat -32px 0;\n}\n.pagination-last {\n  background: url('images/pagination_icons.png') no-repeat -48px 0;\n}\n.pagination-load {\n  background: url('images/pagination_icons.png') no-repeat -64px 0;\n}\n.pagination-loading {\n  background: url('images/loading.gif') no-repeat;\n}\n.pagination-page-list,\n.pagination .pagination-num {\n  border-color: #95B8E7;\n}\n.calendar {\n  border-width: 1px;\n  border-style: solid;\n  padding: 1px;\n  overflow: hidden;\n}\n.calendar table {\n  border-collapse: separate;\n  font-size: 12px;\n  width: 100%;\n  height: 100%;\n}\n.calendar table td,\n.calendar table th {\n  font-size: 12px;\n}\n.calendar-noborder {\n  border: 0;\n}\n.calendar-header {\n  position: relative;\n  height: 22px;\n}\n.calendar-title {\n  text-align: center;\n  height: 22px;\n}\n.calendar-title span {\n  position: relative;\n  display: inline-block;\n  top: 2px;\n  padding: 0 3px;\n  height: 18px;\n  line-height: 18px;\n  font-size: 12px;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-prevmonth,\n.calendar-nextmonth,\n.calendar-prevyear,\n.calendar-nextyear {\n  position: absolute;\n  top: 50%;\n  margin-top: -7px;\n  width: 14px;\n  height: 14px;\n  cursor: pointer;\n  font-size: 1px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-prevmonth {\n  left: 20px;\n  background: url('images/calendar_arrows.png') no-repeat -18px -2px;\n}\n.calendar-nextmonth {\n  right: 20px;\n  background: url('images/calendar_arrows.png') no-repeat -34px -2px;\n}\n.calendar-prevyear {\n  left: 3px;\n  background: url('images/calendar_arrows.png') no-repeat -1px -2px;\n}\n.calendar-nextyear {\n  right: 3px;\n  background: url('images/calendar_arrows.png') no-repeat -49px -2px;\n}\n.calendar-body {\n  position: relative;\n}\n.calendar-body th,\n.calendar-body td {\n  text-align: center;\n}\n.calendar-day {\n  border: 0;\n  padding: 1px;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-other-month {\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n}\n.calendar-menu {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 180px;\n  height: 150px;\n  padding: 5px;\n  font-size: 12px;\n  display: none;\n  overflow: hidden;\n}\n.calendar-menu-year-inner {\n  text-align: center;\n  padding-bottom: 5px;\n}\n.calendar-menu-year {\n  width: 40px;\n  text-align: center;\n  border-width: 1px;\n  border-style: solid;\n  margin: 0;\n  padding: 2px;\n  font-weight: bold;\n  font-size: 12px;\n}\n.calendar-menu-prev,\n.calendar-menu-next {\n  display: inline-block;\n  width: 21px;\n  height: 21px;\n  vertical-align: top;\n  cursor: pointer;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-menu-prev {\n  margin-right: 10px;\n  background: url('images/calendar_arrows.png') no-repeat 2px 2px;\n}\n.calendar-menu-next {\n  margin-left: 10px;\n  background: url('images/calendar_arrows.png') no-repeat -45px 2px;\n}\n.calendar-menu-month {\n  text-align: center;\n  cursor: pointer;\n  font-weight: bold;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.calendar-body th,\n.calendar-menu-month {\n  color: #4d4d4d;\n}\n.calendar-day {\n  color: #000000;\n}\n.calendar-sunday {\n  color: #CC2222;\n}\n.calendar-saturday {\n  color: #00ee00;\n}\n.calendar-today {\n  color: #0000ff;\n}\n.calendar-menu-year {\n  border-color: #95B8E7;\n}\n.calendar {\n  border-color: #95B8E7;\n}\n.calendar-header {\n  background: #E0ECFF;\n}\n.calendar-body,\n.calendar-menu {\n  background: #ffffff;\n}\n.calendar-body th {\n  background: #F4F4F4;\n}\n.calendar-hover,\n.calendar-nav-hover,\n.calendar-menu-hover {\n  background-color: #eaf2ff;\n  color: #000000;\n}\n.calendar-hover {\n  border: 1px solid #b7d2ff;\n  padding: 0;\n}\n.calendar-selected {\n  background-color: #FBEC88;\n  color: #000000;\n  border: 1px solid #E2C608;\n  padding: 0;\n}\n.datebox-calendar-inner {\n  height: 180px;\n}\n.datebox-button {\n  height: 18px;\n  padding: 2px 5px;\n  text-align: center;\n}\n.datebox-button a {\n  font-size: 12px;\n  font-weight: bold;\n  text-decoration: none;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.datebox-button a:hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.datebox-current,\n.datebox-close {\n  float: left;\n}\n.datebox-close {\n  float: right;\n}\n.datebox .combo-arrow {\n  background-image: url('images/datebox_arrow.png');\n  background-position: center center;\n}\n.datebox-button {\n  background-color: #F4F4F4;\n}\n.datebox-button a {\n  color: #444;\n}\n.spinner {\n  display: inline-block;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n  vertical-align: middle;\n}\n.spinner .spinner-text {\n  font-size: 12px;\n  border: 0px;\n  line-height: 20px;\n  height: 20px;\n  margin: 0;\n  padding: 0 2px;\n  *margin-top: -1px;\n  *height: 18px;\n  *line-height: 18px;\n  _height: 18px;\n  _line-height: 18px;\n  vertical-align: baseline;\n}\n.spinner-arrow {\n  display: inline-block;\n  overflow: hidden;\n  vertical-align: top;\n  margin: 0;\n  padding: 0;\n}\n.spinner-arrow-up,\n.spinner-arrow-down {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  display: block;\n  font-size: 1px;\n  width: 18px;\n  height: 10px;\n}\n.spinner-arrow-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.spinner-arrow-up {\n  background: url('images/spinner_arrows.png') no-repeat 1px center;\n}\n.spinner-arrow-down {\n  background: url('images/spinner_arrows.png') no-repeat -15px center;\n}\n.spinner {\n  border-color: #95B8E7;\n}\n.spinner-arrow {\n  background-color: #E0ECFF;\n}\n.spinner-arrow-hover {\n  background-color: #eaf2ff;\n}\n.progressbar {\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  overflow: hidden;\n  position: relative;\n}\n.progressbar-text {\n  text-align: center;\n  position: absolute;\n}\n.progressbar-value {\n  position: relative;\n  overflow: hidden;\n  width: 0;\n  -moz-border-radius: 5px 0 0 5px;\n  -webkit-border-radius: 5px 0 0 5px;\n  border-radius: 5px 0 0 5px;\n}\n.progressbar {\n  border-color: #95B8E7;\n}\n.progressbar-text {\n  color: #000000;\n  font-size: 12px;\n}\n.progressbar-value .progressbar-text {\n  background-color: #FBEC88;\n  color: #000000;\n}\n.searchbox {\n  display: inline-block;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n}\n.searchbox .searchbox-text {\n  font-size: 12px;\n  border: 0;\n  margin: 0;\n  padding: 0;\n  line-height: 20px;\n  height: 20px;\n  *margin-top: -1px;\n  *height: 18px;\n  *line-height: 18px;\n  _height: 18px;\n  _line-height: 18px;\n  vertical-align: baseline;\n}\n.searchbox .searchbox-prompt {\n  font-size: 12px;\n  color: #ccc;\n}\n.searchbox-button {\n  width: 18px;\n  height: 20px;\n  overflow: hidden;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.searchbox-button-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.searchbox a.l-btn-plain {\n  height: 20px;\n  border: 0;\n  padding: 0 6px 0 0;\n  vertical-align: top;\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.searchbox a.l-btn .l-btn-left {\n  padding: 2px 0 2px 4px;\n}\n.searchbox a.l-btn-plain:hover {\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  border: 0;\n  padding: 0 6px 0 0;\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.searchbox a.m-btn-plain-active {\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n}\n.searchbox-button {\n  background: url('images/searchbox_button.png') no-repeat center center;\n}\n.searchbox {\n  border-color: #95B8E7;\n  background-color: #fff;\n}\n.searchbox a.l-btn-plain {\n  background: #E0ECFF;\n}\n.slider-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.slider-h {\n  height: 22px;\n}\n.slider-v {\n  width: 22px;\n}\n.slider-inner {\n  position: relative;\n  height: 6px;\n  top: 7px;\n  border-width: 1px;\n  border-style: solid;\n  border-radius: 5px;\n}\n.slider-handle {\n  position: absolute;\n  display: block;\n  outline: none;\n  width: 20px;\n  height: 20px;\n  top: -7px;\n  margin-left: -10px;\n}\n.slider-tip {\n  position: absolute;\n  display: inline-block;\n  line-height: 12px;\n  font-size: 12px;\n  white-space: nowrap;\n  top: -22px;\n}\n.slider-rule {\n  position: relative;\n  top: 15px;\n}\n.slider-rule span {\n  position: absolute;\n  display: inline-block;\n  font-size: 0;\n  height: 5px;\n  border-width: 0 0 0 1px;\n  border-style: solid;\n}\n.slider-rulelabel {\n  position: relative;\n  top: 20px;\n}\n.slider-rulelabel span {\n  position: absolute;\n  display: inline-block;\n  font-size: 12px;\n}\n.slider-v .slider-inner {\n  width: 6px;\n  left: 7px;\n  top: 0;\n  float: left;\n}\n.slider-v .slider-handle {\n  left: 3px;\n  margin-top: -10px;\n}\n.slider-v .slider-tip {\n  left: -10px;\n  margin-top: -6px;\n}\n.slider-v .slider-rule {\n  float: left;\n  top: 0;\n  left: 16px;\n}\n.slider-v .slider-rule span {\n  width: 5px;\n  height: 'auto';\n  border-left: 0;\n  border-width: 1px 0 0 0;\n  border-style: solid;\n}\n.slider-v .slider-rulelabel {\n  float: left;\n  top: 0;\n  left: 23px;\n}\n.slider-handle {\n  background: url('images/slider_handle.png') no-repeat;\n}\n.slider-inner {\n  border-color: #95B8E7;\n  background: #E0ECFF;\n}\n.slider-rule span {\n  border-color: #95B8E7;\n}\n.slider-rulelabel span {\n  color: #000000;\n}\n.menu {\n  position: absolute;\n  margin: 0;\n  padding: 2px;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n}\n.menu-item {\n  position: relative;\n  margin: 0;\n  padding: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  cursor: pointer;\n  border-width: 1px;\n  border-style: solid;\n}\n.menu-text {\n  height: 20px;\n  line-height: 20px;\n  float: left;\n  padding-left: 28px;\n}\n.menu-icon {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  left: 2px;\n  top: 50%;\n  margin-top: -8px;\n}\n.menu-rightarrow {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  right: 0;\n  top: 50%;\n  margin-top: -8px;\n}\n.menu-line {\n  position: absolute;\n  left: 26px;\n  top: 0;\n  height: 2000px;\n  font-size: 1px;\n}\n.menu-sep {\n  margin: 3px 0px 3px 25px;\n  font-size: 1px;\n}\n.menu-active {\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.menu-item-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  cursor: default;\n}\n.menu-text,\n.menu-text span {\n  font-size: 12px;\n}\n.menu-shadow {\n  position: absolute;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  background: #ccc;\n  -moz-box-shadow: 2px 2px 3px #cccccc;\n  -webkit-box-shadow: 2px 2px 3px #cccccc;\n  box-shadow: 2px 2px 3px #cccccc;\n  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);\n}\n.menu-rightarrow {\n  background: url('images/menu_arrows.png') no-repeat -32px center;\n}\n.menu-line {\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n}\n.menu-sep {\n  border-top: 1px solid #ccc;\n  border-bottom: 1px solid #fff;\n}\n.menu {\n  background-color: #fafafa;\n  border-color: #ddd;\n  color: #444;\n}\n.menu-content {\n  background: #ffffff;\n}\n.menu-item {\n  border-color: transparent;\n  _border-color: #fafafa;\n}\n.menu-active {\n  border-color: #b7d2ff;\n  color: #000000;\n  background: #eaf2ff;\n}\n.menu-active-disabled {\n  border-color: transparent;\n  background: transparent;\n  color: #444;\n}\n.m-btn-downarrow {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n  line-height: 16px;\n  font-size: 12px;\n  _vertical-align: middle;\n}\na.m-btn-active {\n  background-position: bottom right;\n}\na.m-btn-active span.l-btn-left {\n  background-position: bottom left;\n}\na.m-btn-plain-active {\n  background: transparent;\n  padding: 0 5px 0 0;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.m-btn-downarrow {\n  background: url('images/menu_arrows.png') no-repeat 2px center;\n}\na.m-btn-plain-active {\n  border-color: #b7d2ff;\n  background-color: #eaf2ff;\n  color: #000000;\n}\n.s-btn-downarrow {\n  display: inline-block;\n  margin: 0 0 0 4px;\n  padding: 0 0 0 1px;\n  width: 14px;\n  height: 16px;\n  line-height: 16px;\n  border-width: 0;\n  border-style: solid;\n  font-size: 12px;\n  _vertical-align: middle;\n}\na.s-btn-active {\n  background-position: bottom right;\n}\na.s-btn-active span.l-btn-left {\n  background-position: bottom left;\n}\na.s-btn-plain-active {\n  background: transparent;\n  padding: 0 5px 0 0;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.s-btn-downarrow {\n  background: url('images/menu_arrows.png') no-repeat 2px center;\n  border-color: #aac5e7;\n}\na:hover.l-btn .s-btn-downarrow,\na.s-btn-active .s-btn-downarrow,\na.s-btn-plain-active .s-btn-downarrow {\n  background-position: 1px center;\n  padding: 0;\n  border-width: 0 0 0 1px;\n}\na.s-btn-plain-active {\n  border-color: #b7d2ff;\n  background-color: #eaf2ff;\n  color: #000000;\n}\n.messager-body {\n  padding: 10px;\n  overflow: hidden;\n}\n.messager-button {\n  text-align: center;\n  padding-top: 10px;\n}\n.messager-icon {\n  float: left;\n  width: 32px;\n  height: 32px;\n  margin: 0 10px 10px 0;\n}\n.messager-error {\n  background: url('images/messager_icons.png') no-repeat scroll -64px 0;\n}\n.messager-info {\n  background: url('images/messager_icons.png') no-repeat scroll 0 0;\n}\n.messager-question {\n  background: url('images/messager_icons.png') no-repeat scroll -32px 0;\n}\n.messager-warning {\n  background: url('images/messager_icons.png') no-repeat scroll -96px 0;\n}\n.messager-progress {\n  padding: 10px;\n}\n.messager-p-msg {\n  margin-bottom: 5px;\n}\n.messager-body .messager-input {\n  width: 100%;\n  padding: 1px 0;\n  border: 1px solid #95B8E7;\n}\n.tree {\n  margin: 0;\n  padding: 0;\n  list-style-type: none;\n}\n.tree li {\n  white-space: nowrap;\n}\n.tree li ul {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n}\n.tree-node {\n  height: 18px;\n  white-space: nowrap;\n  cursor: pointer;\n}\n.tree-hit {\n  cursor: pointer;\n}\n.tree-expanded,\n.tree-collapsed,\n.tree-folder,\n.tree-file,\n.tree-checkbox,\n.tree-indent {\n  display: inline-block;\n  width: 16px;\n  height: 18px;\n  vertical-align: top;\n  overflow: hidden;\n}\n.tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -18px 0px;\n}\n.tree-expanded-hover {\n  background: url('images/tree_icons.png') no-repeat -50px 0px;\n}\n.tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat 0px 0px;\n}\n.tree-collapsed-hover {\n  background: url('images/tree_icons.png') no-repeat -32px 0px;\n}\n.tree-lines .tree-expanded,\n.tree-lines .tree-root-first .tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -144px 0;\n}\n.tree-lines .tree-collapsed,\n.tree-lines .tree-root-first .tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat -128px 0;\n}\n.tree-lines .tree-node-last .tree-expanded,\n.tree-lines .tree-root-one .tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -80px 0;\n}\n.tree-lines .tree-node-last .tree-collapsed,\n.tree-lines .tree-root-one .tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat -64px 0;\n}\n.tree-line {\n  background: url('images/tree_icons.png') no-repeat -176px 0;\n}\n.tree-join {\n  background: url('images/tree_icons.png') no-repeat -192px 0;\n}\n.tree-joinbottom {\n  background: url('images/tree_icons.png') no-repeat -160px 0;\n}\n.tree-folder {\n  background: url('images/tree_icons.png') no-repeat -208px 0;\n}\n.tree-folder-open {\n  background: url('images/tree_icons.png') no-repeat -224px 0;\n}\n.tree-file {\n  background: url('images/tree_icons.png') no-repeat -240px 0;\n}\n.tree-loading {\n  background: url('images/loading.gif') no-repeat center center;\n}\n.tree-checkbox0 {\n  background: url('images/tree_icons.png') no-repeat -208px -18px;\n}\n.tree-checkbox1 {\n  background: url('images/tree_icons.png') no-repeat -224px -18px;\n}\n.tree-checkbox2 {\n  background: url('images/tree_icons.png') no-repeat -240px -18px;\n}\n.tree-title {\n  font-size: 12px;\n  display: inline-block;\n  text-decoration: none;\n  vertical-align: top;\n  white-space: nowrap;\n  padding: 0 2px;\n  height: 18px;\n  line-height: 18px;\n}\n.tree-node-proxy {\n  font-size: 12px;\n  line-height: 20px;\n  padding: 0 2px 0 20px;\n  border-width: 1px;\n  border-style: solid;\n  z-index: 9900000;\n}\n.tree-dnd-icon {\n  display: inline-block;\n  position: absolute;\n  width: 16px;\n  height: 18px;\n  left: 2px;\n  top: 50%;\n  margin-top: -9px;\n}\n.tree-dnd-yes {\n  background: url('images/tree_icons.png') no-repeat -256px 0;\n}\n.tree-dnd-no {\n  background: url('images/tree_icons.png') no-repeat -256px -18px;\n}\n.tree-node-top {\n  border-top: 1px dotted red;\n}\n.tree-node-bottom {\n  border-bottom: 1px dotted red;\n}\n.tree-node-append .tree-title {\n  border: 1px dotted red;\n}\n.tree-editor {\n  border: 1px solid #ccc;\n  font-size: 12px;\n  height: 14px !important;\n  height: 18px;\n  line-height: 14px;\n  padding: 1px 2px;\n  width: 80px;\n  position: absolute;\n  top: 0;\n}\n.tree-node-proxy {\n  background-color: #ffffff;\n  color: #000000;\n  border-color: #95B8E7;\n}\n.tree-node-hover {\n  background: #eaf2ff;\n  color: #000000;\n}\n.tree-node-selected {\n  background: #FBEC88;\n  color: #000000;\n}\n.validatebox-invalid {\n  background-image: url('images/validatebox_warning.png');\n  background-repeat: no-repeat;\n  background-position: right center;\n  border-color: #ffa8a8;\n  background-color: #fff3f3;\n  color: #000;\n}\n.tooltip {\n  position: absolute;\n  display: none;\n  z-index: 9900000;\n  outline: none;\n  opacity: 1;\n  filter: alpha(opacity=100);\n  padding: 5px;\n  border-width: 1px;\n  border-style: solid;\n  border-radius: 5px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.tooltip-content {\n  font-size: 12px;\n}\n.tooltip-arrow-outer,\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  line-height: 0;\n  font-size: 0;\n  border-style: solid;\n  border-width: 6px;\n  border-color: transparent;\n  _border-color: tomato;\n  _filter: chroma(color=tomato);\n}\n.tooltip-right .tooltip-arrow-outer {\n  left: 0;\n  top: 50%;\n  margin: -6px 0 0 -13px;\n}\n.tooltip-right .tooltip-arrow {\n  left: 0;\n  top: 50%;\n  margin: -6px 0 0 -12px;\n}\n.tooltip-left .tooltip-arrow-outer {\n  right: 0;\n  top: 50%;\n  margin: -6px -13px 0 0;\n}\n.tooltip-left .tooltip-arrow {\n  right: 0;\n  top: 50%;\n  margin: -6px -12px 0 0;\n}\n.tooltip-top .tooltip-arrow-outer {\n  bottom: 0;\n  left: 50%;\n  margin: 0 0 -13px -6px;\n}\n.tooltip-top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin: 0 0 -12px -6px;\n}\n.tooltip-bottom .tooltip-arrow-outer {\n  top: 0;\n  left: 50%;\n  margin: -13px 0 0 -6px;\n}\n.tooltip-bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin: -12px 0 0 -6px;\n}\n.tooltip {\n  background-color: #ffffff;\n  border-color: #95B8E7;\n  color: #000000;\n}\n.tooltip-right .tooltip-arrow-outer {\n  border-right-color: #95B8E7;\n}\n.tooltip-right .tooltip-arrow {\n  border-right-color: #ffffff;\n}\n.tooltip-left .tooltip-arrow-outer {\n  border-left-color: #95B8E7;\n}\n.tooltip-left .tooltip-arrow {\n  border-left-color: #ffffff;\n}\n.tooltip-top .tooltip-arrow-outer {\n  border-top-color: #95B8E7;\n}\n.tooltip-top .tooltip-arrow {\n  border-top-color: #ffffff;\n}\n.tooltip-bottom .tooltip-arrow-outer {\n  border-bottom-color: #95B8E7;\n}\n.tooltip-bottom .tooltip-arrow {\n  border-bottom-color: #ffffff;\n}\n"
  },
  {
    "path": "project-school/themes/default/layout.css",
    "content": ".layout {\n  position: relative;\n  overflow: hidden;\n  margin: 0;\n  padding: 0;\n  z-index: 0;\n}\n.layout-panel {\n  position: absolute;\n  overflow: hidden;\n}\n.layout-panel-east,\n.layout-panel-west {\n  z-index: 2;\n}\n.layout-panel-north,\n.layout-panel-south {\n  z-index: 3;\n}\n.layout-expand {\n  position: absolute;\n  padding: 0px;\n  font-size: 1px;\n  cursor: pointer;\n  z-index: 1;\n}\n.layout-expand .panel-header,\n.layout-expand .panel-body {\n  background: transparent;\n  filter: none;\n  overflow: hidden;\n}\n.layout-expand .panel-header {\n  border-bottom-width: 0px;\n}\n.layout-split-proxy-h,\n.layout-split-proxy-v {\n  position: absolute;\n  font-size: 1px;\n  display: none;\n  z-index: 5;\n}\n.layout-split-proxy-h {\n  width: 5px;\n  cursor: e-resize;\n}\n.layout-split-proxy-v {\n  height: 5px;\n  cursor: n-resize;\n}\n.layout-mask {\n  position: absolute;\n  background: #fafafa;\n  filter: alpha(opacity=10);\n  opacity: 0.10;\n  z-index: 4;\n}\n.layout-button-up {\n  background: url('images/layout_arrows.png') no-repeat -16px -16px;\n}\n.layout-button-down {\n  background: url('images/layout_arrows.png') no-repeat -16px 0;\n}\n.layout-button-left {\n  background: url('images/layout_arrows.png') no-repeat 0 0;\n}\n.layout-button-right {\n  background: url('images/layout_arrows.png') no-repeat 0 -16px;\n}\n.layout-split-proxy-h,\n.layout-split-proxy-v {\n  background-color: #aac5e7;\n}\n.layout-split-north {\n  border-bottom: 5px solid #E6EEF8;\n}\n.layout-split-south {\n  border-top: 5px solid #E6EEF8;\n}\n.layout-split-east {\n  border-left: 5px solid #E6EEF8;\n}\n.layout-split-west {\n  border-right: 5px solid #E6EEF8;\n}\n.layout-expand {\n  background-color: #E0ECFF;\n}\n.layout-expand-over {\n  background-color: #E0ECFF;\n}\n"
  },
  {
    "path": "project-school/themes/default/linkbutton.css",
    "content": "a.l-btn {\n  background-position: right 0;\n  text-decoration: none;\n  display: inline-block;\n  zoom: 1;\n  height: 24px;\n  padding-right: 18px;\n  cursor: pointer;\n  outline: none;\n}\na.l-btn-plain {\n  padding-right: 5px;\n  border: 0;\n  padding: 1px 6px 1px 1px;\n}\na.l-btn-disabled {\n  color: #ccc;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  cursor: default;\n}\na.l-btn span.l-btn-left {\n  display: inline-block;\n  background-position: 0 -48px;\n  padding: 4px 0px 4px 18px;\n  line-height: 16px;\n  height: 16px;\n}\na.l-btn-plain span.l-btn-left {\n  padding-left: 5px;\n}\na.l-btn span span.l-btn-text {\n  display: inline-block;\n  vertical-align: baseline;\n  width: auto;\n  height: 16px;\n  line-height: 16px;\n  font-size: 12px;\n  padding: 0;\n  margin: 0;\n}\na.l-btn span span.l-btn-icon-left {\n  padding: 0 0 0 20px;\n  background-position: left center;\n}\na.l-btn span span.l-btn-icon-right {\n  padding: 0 20px 0 0;\n  background-position: right center;\n}\na.l-btn span span span.l-btn-empty {\n  display: inline-block;\n  margin: 0;\n  padding: 0;\n  width: 16px;\n}\na:hover.l-btn {\n  background-position: right -24px;\n  outline: none;\n  text-decoration: none;\n}\na:hover.l-btn span.l-btn-left {\n  background-position: 0 bottom;\n}\na:hover.l-btn-plain {\n  padding: 0 5px 0 0;\n}\na:hover.l-btn-disabled {\n  background-position: right 0;\n}\na:hover.l-btn-disabled span.l-btn-left {\n  background-position: 0 -48px;\n}\na.l-btn .l-btn-focus {\n  outline: #0000FF dotted thin;\n}\na.l-btn {\n  color: #444;\n  background-image: url('images/linkbutton_bg.png');\n  background-repeat: no-repeat;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\na.l-btn span.l-btn-left {\n  background-image: url('images/linkbutton_bg.png');\n  background-repeat: no-repeat;\n}\na.l-btn-plain,\na.l-btn-plain span.l-btn-left {\n  background: transparent;\n  border: 0;\n  filter: none;\n}\na:hover.l-btn-plain {\n  background: #eaf2ff;\n  color: #000000;\n  border: 1px solid #b7d2ff;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\na.l-btn-disabled,\na:hover.l-btn-disabled {\n  color: #444;\n  filter: alpha(opacity=50);\n}\na.l-btn-plain-disabled,\na:hover.l-btn-plain-disabled {\n  background: transparent;\n  filter: alpha(opacity=50);\n}\na.l-btn-selected,\na:hover.l-btn-selected {\n  background-position: right -24px;\n}\na.l-btn-selected span.l-btn-left,\na:hover.l-btn-selected span.l-btn-left {\n  background-position: 0 bottom;\n}\na.l-btn-plain-selected,\na:hover.l-btn-plain-selected {\n  background: #ddd;\n}\n"
  },
  {
    "path": "project-school/themes/default/menu.css",
    "content": ".menu {\n  position: absolute;\n  margin: 0;\n  padding: 2px;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n}\n.menu-item {\n  position: relative;\n  margin: 0;\n  padding: 0;\n  overflow: hidden;\n  white-space: nowrap;\n  cursor: pointer;\n  border-width: 1px;\n  border-style: solid;\n}\n.menu-text {\n  height: 20px;\n  line-height: 20px;\n  float: left;\n  padding-left: 28px;\n}\n.menu-icon {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  left: 2px;\n  top: 50%;\n  margin-top: -8px;\n}\n.menu-rightarrow {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  right: 0;\n  top: 50%;\n  margin-top: -8px;\n}\n.menu-line {\n  position: absolute;\n  left: 26px;\n  top: 0;\n  height: 2000px;\n  font-size: 1px;\n}\n.menu-sep {\n  margin: 3px 0px 3px 25px;\n  font-size: 1px;\n}\n.menu-active {\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.menu-item-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  cursor: default;\n}\n.menu-text,\n.menu-text span {\n  font-size: 12px;\n}\n.menu-shadow {\n  position: absolute;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  background: #ccc;\n  -moz-box-shadow: 2px 2px 3px #cccccc;\n  -webkit-box-shadow: 2px 2px 3px #cccccc;\n  box-shadow: 2px 2px 3px #cccccc;\n  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);\n}\n.menu-rightarrow {\n  background: url('images/menu_arrows.png') no-repeat -32px center;\n}\n.menu-line {\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n}\n.menu-sep {\n  border-top: 1px solid #ccc;\n  border-bottom: 1px solid #fff;\n}\n.menu {\n  background-color: #fafafa;\n  border-color: #ddd;\n  color: #444;\n}\n.menu-content {\n  background: #ffffff;\n}\n.menu-item {\n  border-color: transparent;\n  _border-color: #fafafa;\n}\n.menu-active {\n  border-color: #b7d2ff;\n  color: #000000;\n  background: #eaf2ff;\n}\n.menu-active-disabled {\n  border-color: transparent;\n  background: transparent;\n  color: #444;\n}\n"
  },
  {
    "path": "project-school/themes/default/menubutton.css",
    "content": ".m-btn-downarrow {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n  line-height: 16px;\n  font-size: 12px;\n  _vertical-align: middle;\n}\na.m-btn-active {\n  background-position: bottom right;\n}\na.m-btn-active span.l-btn-left {\n  background-position: bottom left;\n}\na.m-btn-plain-active {\n  background: transparent;\n  padding: 0 5px 0 0;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.m-btn-downarrow {\n  background: url('images/menu_arrows.png') no-repeat 2px center;\n}\na.m-btn-plain-active {\n  border-color: #b7d2ff;\n  background-color: #eaf2ff;\n  color: #000000;\n}\n"
  },
  {
    "path": "project-school/themes/default/messager.css",
    "content": ".messager-body {\n  padding: 10px;\n  overflow: hidden;\n}\n.messager-button {\n  text-align: center;\n  padding-top: 10px;\n}\n.messager-icon {\n  float: left;\n  width: 32px;\n  height: 32px;\n  margin: 0 10px 10px 0;\n}\n.messager-error {\n  background: url('images/messager_icons.png') no-repeat scroll -64px 0;\n}\n.messager-info {\n  background: url('images/messager_icons.png') no-repeat scroll 0 0;\n}\n.messager-question {\n  background: url('images/messager_icons.png') no-repeat scroll -32px 0;\n}\n.messager-warning {\n  background: url('images/messager_icons.png') no-repeat scroll -96px 0;\n}\n.messager-progress {\n  padding: 10px;\n}\n.messager-p-msg {\n  margin-bottom: 5px;\n}\n.messager-body .messager-input {\n  width: 100%;\n  padding: 1px 0;\n  border: 1px solid #95B8E7;\n}\n"
  },
  {
    "path": "project-school/themes/default/pagination.css",
    "content": ".pagination {\n  zoom: 1;\n}\n.pagination table {\n  float: left;\n  height: 30px;\n}\n.pagination td {\n  border: 0;\n}\n.pagination-btn-separator {\n  float: left;\n  height: 24px;\n  border-left: 1px solid #ccc;\n  border-right: 1px solid #fff;\n  margin: 3px 1px;\n}\n.pagination .pagination-num {\n  border-width: 1px;\n  border-style: solid;\n  margin: 0 2px;\n  padding: 2px;\n  width: 2em;\n  height: auto;\n}\n.pagination-page-list {\n  margin: 0px 6px;\n  padding: 1px 2px;\n  width: auto;\n  height: auto;\n  border-width: 1px;\n  border-style: solid;\n}\n.pagination-info {\n  float: right;\n  margin: 0 6px 0 0;\n  padding: 0;\n  height: 30px;\n  line-height: 30px;\n  font-size: 12px;\n}\n.pagination span {\n  font-size: 12px;\n}\n.pagination-first {\n  background: url('images/pagination_icons.png') no-repeat 0 0;\n}\n.pagination-prev {\n  background: url('images/pagination_icons.png') no-repeat -16px 0;\n}\n.pagination-next {\n  background: url('images/pagination_icons.png') no-repeat -32px 0;\n}\n.pagination-last {\n  background: url('images/pagination_icons.png') no-repeat -48px 0;\n}\n.pagination-load {\n  background: url('images/pagination_icons.png') no-repeat -64px 0;\n}\n.pagination-loading {\n  background: url('images/loading.gif') no-repeat;\n}\n.pagination-page-list,\n.pagination .pagination-num {\n  border-color: #95B8E7;\n}\n"
  },
  {
    "path": "project-school/themes/default/panel.css",
    "content": ".panel {\n  overflow: hidden;\n  text-align: left;\n}\n.panel-header,\n.panel-body {\n  border-width: 1px;\n  border-style: solid;\n}\n.panel-header {\n  padding: 5px;\n  position: relative;\n}\n.panel-title {\n  background: url('images/blank.gif') no-repeat;\n}\n.panel-header-noborder {\n  border-width: 0 0 1px 0;\n}\n.panel-body {\n  overflow: auto;\n  border-top-width: 0px;\n}\n.panel-body-noheader {\n  border-top-width: 1px;\n}\n.panel-body-noborder {\n  border-width: 0px;\n}\n.panel-with-icon {\n  padding-left: 18px;\n}\n.panel-icon,\n.panel-tool {\n  position: absolute;\n  top: 50%;\n  margin-top: -8px;\n  height: 16px;\n  overflow: hidden;\n}\n.panel-icon {\n  left: 5px;\n  width: 16px;\n}\n.panel-tool {\n  right: 5px;\n  width: auto;\n}\n.panel-tool a {\n  display: inline-block;\n  width: 16px;\n  height: 16px;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  margin: 0 0 0 2px;\n  vertical-align: top;\n}\n.panel-tool a:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n  background-color: #eaf2ff;\n  -moz-border-radius: 3px 3px 3px 3px;\n  -webkit-border-radius: 3px 3px 3px 3px;\n  border-radius: 3px 3px 3px 3px;\n}\n.panel-loading {\n  padding: 11px 0px 10px 30px;\n}\n.panel-noscroll {\n  overflow: hidden;\n}\n.panel-fit,\n.panel-fit body {\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  border: 0;\n  overflow: hidden;\n}\n.panel-loading {\n  background: url('images/loading.gif') no-repeat 10px 10px;\n}\n.panel-tool-close {\n  background: url('images/panel_tools.png') no-repeat -16px 0px;\n}\n.panel-tool-min {\n  background: url('images/panel_tools.png') no-repeat 0px 0px;\n}\n.panel-tool-max {\n  background: url('images/panel_tools.png') no-repeat 0px -16px;\n}\n.panel-tool-restore {\n  background: url('images/panel_tools.png') no-repeat -16px -16px;\n}\n.panel-tool-collapse {\n  background: url('images/panel_tools.png') no-repeat -32px 0;\n}\n.panel-tool-expand {\n  background: url('images/panel_tools.png') no-repeat -32px -16px;\n}\n.panel-header,\n.panel-body {\n  border-color: #95B8E7;\n}\n.panel-header {\n  background-color: #E0ECFF;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);\n}\n.panel-body {\n  background-color: #ffffff;\n  color: #000000;\n  font-size: 12px;\n}\n.panel-title {\n  font-size: 12px;\n  font-weight: bold;\n  color: #0E2D5F;\n  height: 16px;\n  line-height: 16px;\n}\n"
  },
  {
    "path": "project-school/themes/default/progressbar.css",
    "content": ".progressbar {\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n  overflow: hidden;\n  position: relative;\n}\n.progressbar-text {\n  text-align: center;\n  position: absolute;\n}\n.progressbar-value {\n  position: relative;\n  overflow: hidden;\n  width: 0;\n  -moz-border-radius: 5px 0 0 5px;\n  -webkit-border-radius: 5px 0 0 5px;\n  border-radius: 5px 0 0 5px;\n}\n.progressbar {\n  border-color: #95B8E7;\n}\n.progressbar-text {\n  color: #000000;\n  font-size: 12px;\n}\n.progressbar-value .progressbar-text {\n  background-color: #FBEC88;\n  color: #000000;\n}\n"
  },
  {
    "path": "project-school/themes/default/propertygrid.css",
    "content": ".propertygrid .datagrid-view1 .datagrid-body td {\n  padding-bottom: 1px;\n  border-width: 0 1px 0 0;\n}\n.propertygrid .datagrid-group {\n  height: 21px;\n  overflow: hidden;\n  border-width: 0 0 1px 0;\n  border-style: solid;\n}\n.propertygrid .datagrid-group span {\n  font-weight: bold;\n}\n.propertygrid .datagrid-view1 .datagrid-body td {\n  border-color: #dddddd;\n}\n.propertygrid .datagrid-view1 .datagrid-group {\n  border-color: #E0ECFF;\n}\n.propertygrid .datagrid-view2 .datagrid-group {\n  border-color: #dddddd;\n}\n.propertygrid .datagrid-group,\n.propertygrid .datagrid-view1 .datagrid-body,\n.propertygrid .datagrid-view1 .datagrid-row-over,\n.propertygrid .datagrid-view1 .datagrid-row-selected {\n  background: #E0ECFF;\n}\n"
  },
  {
    "path": "project-school/themes/default/searchbox.css",
    "content": ".searchbox {\n  display: inline-block;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n}\n.searchbox .searchbox-text {\n  font-size: 12px;\n  border: 0;\n  margin: 0;\n  padding: 0;\n  line-height: 20px;\n  height: 20px;\n  *margin-top: -1px;\n  *height: 18px;\n  *line-height: 18px;\n  _height: 18px;\n  _line-height: 18px;\n  vertical-align: baseline;\n}\n.searchbox .searchbox-prompt {\n  font-size: 12px;\n  color: #ccc;\n}\n.searchbox-button {\n  width: 18px;\n  height: 20px;\n  overflow: hidden;\n  display: inline-block;\n  vertical-align: top;\n  cursor: pointer;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.searchbox-button-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.searchbox a.l-btn-plain {\n  height: 20px;\n  border: 0;\n  padding: 0 6px 0 0;\n  vertical-align: top;\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.searchbox a.l-btn .l-btn-left {\n  padding: 2px 0 2px 4px;\n}\n.searchbox a.l-btn-plain:hover {\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  border: 0;\n  padding: 0 6px 0 0;\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.searchbox a.m-btn-plain-active {\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n}\n.searchbox-button {\n  background: url('images/searchbox_button.png') no-repeat center center;\n}\n.searchbox {\n  border-color: #95B8E7;\n  background-color: #fff;\n}\n.searchbox a.l-btn-plain {\n  background: #E0ECFF;\n}\n"
  },
  {
    "path": "project-school/themes/default/slider.css",
    "content": ".slider-disabled {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.slider-h {\n  height: 22px;\n}\n.slider-v {\n  width: 22px;\n}\n.slider-inner {\n  position: relative;\n  height: 6px;\n  top: 7px;\n  border-width: 1px;\n  border-style: solid;\n  border-radius: 5px;\n}\n.slider-handle {\n  position: absolute;\n  display: block;\n  outline: none;\n  width: 20px;\n  height: 20px;\n  top: -7px;\n  margin-left: -10px;\n}\n.slider-tip {\n  position: absolute;\n  display: inline-block;\n  line-height: 12px;\n  font-size: 12px;\n  white-space: nowrap;\n  top: -22px;\n}\n.slider-rule {\n  position: relative;\n  top: 15px;\n}\n.slider-rule span {\n  position: absolute;\n  display: inline-block;\n  font-size: 0;\n  height: 5px;\n  border-width: 0 0 0 1px;\n  border-style: solid;\n}\n.slider-rulelabel {\n  position: relative;\n  top: 20px;\n}\n.slider-rulelabel span {\n  position: absolute;\n  display: inline-block;\n  font-size: 12px;\n}\n.slider-v .slider-inner {\n  width: 6px;\n  left: 7px;\n  top: 0;\n  float: left;\n}\n.slider-v .slider-handle {\n  left: 3px;\n  margin-top: -10px;\n}\n.slider-v .slider-tip {\n  left: -10px;\n  margin-top: -6px;\n}\n.slider-v .slider-rule {\n  float: left;\n  top: 0;\n  left: 16px;\n}\n.slider-v .slider-rule span {\n  width: 5px;\n  height: 'auto';\n  border-left: 0;\n  border-width: 1px 0 0 0;\n  border-style: solid;\n}\n.slider-v .slider-rulelabel {\n  float: left;\n  top: 0;\n  left: 23px;\n}\n.slider-handle {\n  background: url('images/slider_handle.png') no-repeat;\n}\n.slider-inner {\n  border-color: #95B8E7;\n  background: #E0ECFF;\n}\n.slider-rule span {\n  border-color: #95B8E7;\n}\n.slider-rulelabel span {\n  color: #000000;\n}\n"
  },
  {
    "path": "project-school/themes/default/spinner.css",
    "content": ".spinner {\n  display: inline-block;\n  white-space: nowrap;\n  margin: 0;\n  padding: 0;\n  border-width: 1px;\n  border-style: solid;\n  overflow: hidden;\n  vertical-align: middle;\n}\n.spinner .spinner-text {\n  font-size: 12px;\n  border: 0px;\n  line-height: 20px;\n  height: 20px;\n  margin: 0;\n  padding: 0 2px;\n  *margin-top: -1px;\n  *height: 18px;\n  *line-height: 18px;\n  _height: 18px;\n  _line-height: 18px;\n  vertical-align: baseline;\n}\n.spinner-arrow {\n  display: inline-block;\n  overflow: hidden;\n  vertical-align: top;\n  margin: 0;\n  padding: 0;\n}\n.spinner-arrow-up,\n.spinner-arrow-down {\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n  display: block;\n  font-size: 1px;\n  width: 18px;\n  height: 10px;\n}\n.spinner-arrow-hover {\n  opacity: 1.0;\n  filter: alpha(opacity=100);\n}\n.spinner-arrow-up {\n  background: url('images/spinner_arrows.png') no-repeat 1px center;\n}\n.spinner-arrow-down {\n  background: url('images/spinner_arrows.png') no-repeat -15px center;\n}\n.spinner {\n  border-color: #95B8E7;\n}\n.spinner-arrow {\n  background-color: #E0ECFF;\n}\n.spinner-arrow-hover {\n  background-color: #eaf2ff;\n}\n"
  },
  {
    "path": "project-school/themes/default/splitbutton.css",
    "content": ".s-btn-downarrow {\n  display: inline-block;\n  margin: 0 0 0 4px;\n  padding: 0 0 0 1px;\n  width: 14px;\n  height: 16px;\n  line-height: 16px;\n  border-width: 0;\n  border-style: solid;\n  font-size: 12px;\n  _vertical-align: middle;\n}\na.s-btn-active {\n  background-position: bottom right;\n}\na.s-btn-active span.l-btn-left {\n  background-position: bottom left;\n}\na.s-btn-plain-active {\n  background: transparent;\n  padding: 0 5px 0 0;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.s-btn-downarrow {\n  background: url('images/menu_arrows.png') no-repeat 2px center;\n  border-color: #aac5e7;\n}\na:hover.l-btn .s-btn-downarrow,\na.s-btn-active .s-btn-downarrow,\na.s-btn-plain-active .s-btn-downarrow {\n  background-position: 1px center;\n  padding: 0;\n  border-width: 0 0 0 1px;\n}\na.s-btn-plain-active {\n  border-color: #b7d2ff;\n  background-color: #eaf2ff;\n  color: #000000;\n}\n"
  },
  {
    "path": "project-school/themes/default/tabs.css",
    "content": ".tabs-container {\n  overflow: hidden;\n}\n.tabs-header {\n  border-width: 1px;\n  border-style: solid;\n  border-bottom-width: 0;\n  position: relative;\n  padding: 0;\n  padding-top: 2px;\n  overflow: hidden;\n}\n.tabs-header-plain {\n  border: 0;\n  background: transparent;\n}\n.tabs-scroller-left,\n.tabs-scroller-right {\n  position: absolute;\n  top: auto;\n  bottom: 0;\n  width: 18px;\n  font-size: 1px;\n  display: none;\n  cursor: pointer;\n  border-width: 1px;\n  border-style: solid;\n}\n.tabs-scroller-left {\n  left: 0;\n}\n.tabs-scroller-right {\n  right: 0;\n}\n.tabs-tool {\n  position: absolute;\n  bottom: 0;\n  padding: 1px;\n  overflow: hidden;\n  border-width: 1px;\n  border-style: solid;\n}\n.tabs-header-plain .tabs-tool {\n  padding: 0 1px;\n}\n.tabs-wrap {\n  position: relative;\n  left: 0;\n  overflow: hidden;\n  width: 100%;\n  margin: 0;\n  padding: 0;\n}\n.tabs-scrolling {\n  margin-left: 18px;\n  margin-right: 18px;\n}\n.tabs-disabled {\n  opacity: 0.3;\n  filter: alpha(opacity=30);\n}\n.tabs {\n  list-style-type: none;\n  height: 26px;\n  margin: 0px;\n  padding: 0px;\n  padding-left: 4px;\n  width: 5000px;\n  border-style: solid;\n  border-width: 0 0 1px 0;\n}\n.tabs li {\n  float: left;\n  display: inline-block;\n  margin: 0 4px -1px 0;\n  padding: 0;\n  position: relative;\n  border: 0;\n}\n.tabs li a.tabs-inner {\n  display: inline-block;\n  text-decoration: none;\n  margin: 0;\n  padding: 0 10px;\n  height: 25px;\n  line-height: 25px;\n  text-align: center;\n  white-space: nowrap;\n  border-width: 1px;\n  border-style: solid;\n  -moz-border-radius: 5px 5px 0 0;\n  -webkit-border-radius: 5px 5px 0 0;\n  border-radius: 5px 5px 0 0;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  font-weight: bold;\n  outline: none;\n}\n.tabs li.tabs-selected a:hover.tabs-inner {\n  cursor: default;\n  pointer: default;\n}\n.tabs li a.tabs-close,\n.tabs-p-tool {\n  position: absolute;\n  font-size: 1px;\n  display: block;\n  height: 12px;\n  padding: 0;\n  top: 50%;\n  margin-top: -6px;\n  overflow: hidden;\n}\n.tabs li a.tabs-close {\n  width: 12px;\n  right: 5px;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.tabs-p-tool {\n  right: 16px;\n}\n.tabs-p-tool a {\n  display: inline-block;\n  font-size: 1px;\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  opacity: 0.6;\n  filter: alpha(opacity=60);\n}\n.tabs li a:hover.tabs-close,\n.tabs-p-tool a:hover {\n  opacity: 1;\n  filter: alpha(opacity=100);\n  cursor: hand;\n  cursor: pointer;\n}\n.tabs-with-icon {\n  padding-left: 18px;\n}\n.tabs-icon {\n  position: absolute;\n  width: 16px;\n  height: 16px;\n  left: 10px;\n  top: 50%;\n  margin-top: -8px;\n}\n.tabs-title {\n  font-size: 12px;\n}\n.tabs-closable {\n  padding-right: 8px;\n}\n.tabs-panels {\n  margin: 0px;\n  padding: 0px;\n  border-width: 1px;\n  border-style: solid;\n  border-top-width: 0;\n  overflow: hidden;\n}\n.tabs-header-bottom {\n  border-width: 0 1px 1px 1px;\n  padding: 0 0 2px 0;\n}\n.tabs-header-bottom .tabs {\n  border-width: 1px 0 0 0;\n}\n.tabs-header-bottom .tabs li {\n  margin: -1px 4px 0 0;\n}\n.tabs-header-bottom .tabs li a.tabs-inner {\n  -moz-border-radius: 0 0 5px 5px;\n  -webkit-border-radius: 0 0 5px 5px;\n  border-radius: 0 0 5px 5px;\n}\n.tabs-header-bottom .tabs-tool {\n  top: 0;\n}\n.tabs-header-bottom .tabs-scroller-left,\n.tabs-header-bottom .tabs-scroller-right {\n  top: 0;\n  bottom: auto;\n}\n.tabs-panels-top {\n  border-width: 1px 1px 0 1px;\n}\n.tabs-header-left {\n  float: left;\n  border-width: 1px 0 1px 1px;\n  padding: 0;\n}\n.tabs-header-right {\n  float: right;\n  border-width: 1px 1px 1px 0;\n  padding: 0;\n}\n.tabs-header-left .tabs-wrap,\n.tabs-header-right .tabs-wrap {\n  height: 100%;\n}\n.tabs-header-left .tabs {\n  height: 100%;\n  padding: 4px 0 0 4px;\n  border-width: 0 1px 0 0;\n}\n.tabs-header-right .tabs {\n  height: 100%;\n  padding: 4px 4px 0 0;\n  border-width: 0 0 0 1px;\n}\n.tabs-header-left .tabs li,\n.tabs-header-right .tabs li {\n  display: block;\n  width: 100%;\n  position: relative;\n}\n.tabs-header-left .tabs li {\n  left: auto;\n  right: 0;\n  margin: 0 -1px 4px 0;\n  float: right;\n}\n.tabs-header-right .tabs li {\n  left: 0;\n  right: auto;\n  margin: 0 0 4px -1px;\n  float: left;\n}\n.tabs-header-left .tabs li a.tabs-inner {\n  display: block;\n  text-align: left;\n  -moz-border-radius: 5px 0 0 5px;\n  -webkit-border-radius: 5px 0 0 5px;\n  border-radius: 5px 0 0 5px;\n}\n.tabs-header-right .tabs li a.tabs-inner {\n  display: block;\n  text-align: left;\n  -moz-border-radius: 0 5px 5px 0;\n  -webkit-border-radius: 0 5px 5px 0;\n  border-radius: 0 5px 5px 0;\n}\n.tabs-panels-right {\n  float: right;\n  border-width: 1px 1px 1px 0;\n}\n.tabs-panels-left {\n  float: left;\n  border-width: 1px 0 1px 1px;\n}\n.tabs-header-noborder,\n.tabs-panels-noborder {\n  border: 0px;\n}\n.tabs-header-plain {\n  border: 0px;\n  background: transparent;\n}\n.tabs-scroller-left {\n  background: #E0ECFF url('images/tabs_icons.png') no-repeat 1px center;\n}\n.tabs-scroller-right {\n  background: #E0ECFF url('images/tabs_icons.png') no-repeat -15px center;\n}\n.tabs li a.tabs-close {\n  background: url('images/tabs_icons.png') no-repeat -34px center;\n}\n.tabs li a.tabs-inner:hover {\n  background: #eaf2ff;\n  color: #000000;\n  filter: none;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  background-color: #ffffff;\n  color: #0E2D5F;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#ffffff 100%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#ffffff 100%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#ffffff 100%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#ffffff 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=0);\n}\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(top,#ffffff 0,#EFF5FF 100%);\n  background: -moz-linear-gradient(top,#ffffff 0,#EFF5FF 100%);\n  background: -o-linear-gradient(top,#ffffff 0,#EFF5FF 100%);\n  background: linear-gradient(to bottom,#ffffff 0,#EFF5FF 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=0);\n}\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(left,#EFF5FF 0,#ffffff 100%);\n  background: -moz-linear-gradient(left,#EFF5FF 0,#ffffff 100%);\n  background: -o-linear-gradient(left,#EFF5FF 0,#ffffff 100%);\n  background: linear-gradient(to right,#EFF5FF 0,#ffffff 100%);\n  background-repeat: repeat-y;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#ffffff,GradientType=1);\n}\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  background: -webkit-linear-gradient(left,#ffffff 0,#EFF5FF 100%);\n  background: -moz-linear-gradient(left,#ffffff 0,#EFF5FF 100%);\n  background: -o-linear-gradient(left,#ffffff 0,#EFF5FF 100%);\n  background: linear-gradient(to right,#ffffff 0,#EFF5FF 100%);\n  background-repeat: repeat-y;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffff,endColorstr=#EFF5FF,GradientType=1);\n}\n.tabs li a.tabs-inner {\n  color: #0E2D5F;\n  background-color: #E0ECFF;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 100%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);\n}\n.tabs-header,\n.tabs-tool {\n  background-color: #E0ECFF;\n}\n.tabs-header-plain {\n  background: transparent;\n}\n.tabs-header,\n.tabs-scroller-left,\n.tabs-scroller-right,\n.tabs-tool,\n.tabs,\n.tabs-panels,\n.tabs li a.tabs-inner,\n.tabs li.tabs-selected a.tabs-inner,\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner,\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner,\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  border-color: #95B8E7;\n}\n.tabs-p-tool a:hover,\n.tabs li a:hover.tabs-close,\n.tabs-scroller-over {\n  background-color: #eaf2ff;\n}\n.tabs li.tabs-selected a.tabs-inner {\n  border-bottom: 1px solid #ffffff;\n}\n.tabs-header-bottom .tabs li.tabs-selected a.tabs-inner {\n  border-top: 1px solid #ffffff;\n}\n.tabs-header-left .tabs li.tabs-selected a.tabs-inner {\n  border-right: 1px solid #ffffff;\n}\n.tabs-header-right .tabs li.tabs-selected a.tabs-inner {\n  border-left: 1px solid #ffffff;\n}\n"
  },
  {
    "path": "project-school/themes/default/tooltip.css",
    "content": ".tooltip {\n  position: absolute;\n  display: none;\n  z-index: 9900000;\n  outline: none;\n  opacity: 1;\n  filter: alpha(opacity=100);\n  padding: 5px;\n  border-width: 1px;\n  border-style: solid;\n  border-radius: 5px;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.tooltip-content {\n  font-size: 12px;\n}\n.tooltip-arrow-outer,\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  line-height: 0;\n  font-size: 0;\n  border-style: solid;\n  border-width: 6px;\n  border-color: transparent;\n  _border-color: tomato;\n  _filter: chroma(color=tomato);\n}\n.tooltip-right .tooltip-arrow-outer {\n  left: 0;\n  top: 50%;\n  margin: -6px 0 0 -13px;\n}\n.tooltip-right .tooltip-arrow {\n  left: 0;\n  top: 50%;\n  margin: -6px 0 0 -12px;\n}\n.tooltip-left .tooltip-arrow-outer {\n  right: 0;\n  top: 50%;\n  margin: -6px -13px 0 0;\n}\n.tooltip-left .tooltip-arrow {\n  right: 0;\n  top: 50%;\n  margin: -6px -12px 0 0;\n}\n.tooltip-top .tooltip-arrow-outer {\n  bottom: 0;\n  left: 50%;\n  margin: 0 0 -13px -6px;\n}\n.tooltip-top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin: 0 0 -12px -6px;\n}\n.tooltip-bottom .tooltip-arrow-outer {\n  top: 0;\n  left: 50%;\n  margin: -13px 0 0 -6px;\n}\n.tooltip-bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin: -12px 0 0 -6px;\n}\n.tooltip {\n  background-color: #ffffff;\n  border-color: #95B8E7;\n  color: #000000;\n}\n.tooltip-right .tooltip-arrow-outer {\n  border-right-color: #95B8E7;\n}\n.tooltip-right .tooltip-arrow {\n  border-right-color: #ffffff;\n}\n.tooltip-left .tooltip-arrow-outer {\n  border-left-color: #95B8E7;\n}\n.tooltip-left .tooltip-arrow {\n  border-left-color: #ffffff;\n}\n.tooltip-top .tooltip-arrow-outer {\n  border-top-color: #95B8E7;\n}\n.tooltip-top .tooltip-arrow {\n  border-top-color: #ffffff;\n}\n.tooltip-bottom .tooltip-arrow-outer {\n  border-bottom-color: #95B8E7;\n}\n.tooltip-bottom .tooltip-arrow {\n  border-bottom-color: #ffffff;\n}\n"
  },
  {
    "path": "project-school/themes/default/tree.css",
    "content": ".tree {\n  margin: 0;\n  padding: 0;\n  list-style-type: none;\n}\n.tree li {\n  white-space: nowrap;\n}\n.tree li ul {\n  list-style-type: none;\n  margin: 0;\n  padding: 0;\n}\n.tree-node {\n  height: 18px;\n  white-space: nowrap;\n  cursor: pointer;\n}\n.tree-hit {\n  cursor: pointer;\n}\n.tree-expanded,\n.tree-collapsed,\n.tree-folder,\n.tree-file,\n.tree-checkbox,\n.tree-indent {\n  display: inline-block;\n  width: 16px;\n  height: 18px;\n  vertical-align: top;\n  overflow: hidden;\n}\n.tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -18px 0px;\n}\n.tree-expanded-hover {\n  background: url('images/tree_icons.png') no-repeat -50px 0px;\n}\n.tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat 0px 0px;\n}\n.tree-collapsed-hover {\n  background: url('images/tree_icons.png') no-repeat -32px 0px;\n}\n.tree-lines .tree-expanded,\n.tree-lines .tree-root-first .tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -144px 0;\n}\n.tree-lines .tree-collapsed,\n.tree-lines .tree-root-first .tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat -128px 0;\n}\n.tree-lines .tree-node-last .tree-expanded,\n.tree-lines .tree-root-one .tree-expanded {\n  background: url('images/tree_icons.png') no-repeat -80px 0;\n}\n.tree-lines .tree-node-last .tree-collapsed,\n.tree-lines .tree-root-one .tree-collapsed {\n  background: url('images/tree_icons.png') no-repeat -64px 0;\n}\n.tree-line {\n  background: url('images/tree_icons.png') no-repeat -176px 0;\n}\n.tree-join {\n  background: url('images/tree_icons.png') no-repeat -192px 0;\n}\n.tree-joinbottom {\n  background: url('images/tree_icons.png') no-repeat -160px 0;\n}\n.tree-folder {\n  background: url('images/tree_icons.png') no-repeat -208px 0;\n}\n.tree-folder-open {\n  background: url('images/tree_icons.png') no-repeat -224px 0;\n}\n.tree-file {\n  background: url('images/tree_icons.png') no-repeat -240px 0;\n}\n.tree-loading {\n  background: url('images/loading.gif') no-repeat center center;\n}\n.tree-checkbox0 {\n  background: url('images/tree_icons.png') no-repeat -208px -18px;\n}\n.tree-checkbox1 {\n  background: url('images/tree_icons.png') no-repeat -224px -18px;\n}\n.tree-checkbox2 {\n  background: url('images/tree_icons.png') no-repeat -240px -18px;\n}\n.tree-title {\n  font-size: 12px;\n  display: inline-block;\n  text-decoration: none;\n  vertical-align: top;\n  white-space: nowrap;\n  padding: 0 2px;\n  height: 18px;\n  line-height: 18px;\n}\n.tree-node-proxy {\n  font-size: 12px;\n  line-height: 20px;\n  padding: 0 2px 0 20px;\n  border-width: 1px;\n  border-style: solid;\n  z-index: 9900000;\n}\n.tree-dnd-icon {\n  display: inline-block;\n  position: absolute;\n  width: 16px;\n  height: 18px;\n  left: 2px;\n  top: 50%;\n  margin-top: -9px;\n}\n.tree-dnd-yes {\n  background: url('images/tree_icons.png') no-repeat -256px 0;\n}\n.tree-dnd-no {\n  background: url('images/tree_icons.png') no-repeat -256px -18px;\n}\n.tree-node-top {\n  border-top: 1px dotted red;\n}\n.tree-node-bottom {\n  border-bottom: 1px dotted red;\n}\n.tree-node-append .tree-title {\n  border: 1px dotted red;\n}\n.tree-editor {\n  border: 1px solid #ccc;\n  font-size: 12px;\n  height: 14px !important;\n  height: 18px;\n  line-height: 14px;\n  padding: 1px 2px;\n  width: 80px;\n  position: absolute;\n  top: 0;\n}\n.tree-node-proxy {\n  background-color: #ffffff;\n  color: #000000;\n  border-color: #95B8E7;\n}\n.tree-node-hover {\n  background: #eaf2ff;\n  color: #000000;\n}\n.tree-node-selected {\n  background: #FBEC88;\n  color: #000000;\n}\n"
  },
  {
    "path": "project-school/themes/default/validatebox.css",
    "content": ".validatebox-invalid {\n  background-image: url('images/validatebox_warning.png');\n  background-repeat: no-repeat;\n  background-position: right center;\n  border-color: #ffa8a8;\n  background-color: #fff3f3;\n  color: #000;\n}\n"
  },
  {
    "path": "project-school/themes/default/window.css",
    "content": ".window {\n  overflow: hidden;\n  padding: 5px;\n  border-width: 1px;\n  border-style: solid;\n}\n.window .window-header {\n  background: transparent;\n  padding: 0px 0px 6px 0px;\n}\n.window .window-body {\n  border-width: 1px;\n  border-style: solid;\n  border-top-width: 0px;\n}\n.window .window-body-noheader {\n  border-top-width: 1px;\n}\n.window .window-header .panel-icon,\n.window .window-header .panel-tool {\n  top: 50%;\n  margin-top: -11px;\n}\n.window .window-header .panel-icon {\n  left: 1px;\n}\n.window .window-header .panel-tool {\n  right: 1px;\n}\n.window .window-header .panel-with-icon {\n  padding-left: 18px;\n}\n.window-proxy {\n  position: absolute;\n  overflow: hidden;\n}\n.window-proxy-mask {\n  position: absolute;\n  filter: alpha(opacity=5);\n  opacity: 0.05;\n}\n.window-mask {\n  position: absolute;\n  left: 0;\n  top: 0;\n  width: 100%;\n  height: 100%;\n  filter: alpha(opacity=40);\n  opacity: 0.40;\n  font-size: 1px;\n  *zoom: 1;\n  overflow: hidden;\n}\n.window,\n.window-shadow {\n  position: absolute;\n  -moz-border-radius: 5px 5px 5px 5px;\n  -webkit-border-radius: 5px 5px 5px 5px;\n  border-radius: 5px 5px 5px 5px;\n}\n.window-shadow {\n  background: #ccc;\n  -moz-box-shadow: 2px 2px 3px #cccccc;\n  -webkit-box-shadow: 2px 2px 3px #cccccc;\n  box-shadow: 2px 2px 3px #cccccc;\n  filter: progid:DXImageTransform.Microsoft.Blur(pixelRadius=2,MakeShadow=false,ShadowOpacity=0.2);\n}\n.window,\n.window .window-body {\n  border-color: #95B8E7;\n}\n.window {\n  background-color: #E0ECFF;\n  background: -webkit-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);\n  background: -moz-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);\n  background: -o-linear-gradient(top,#EFF5FF 0,#E0ECFF 20%);\n  background: linear-gradient(to bottom,#EFF5FF 0,#E0ECFF 20%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#EFF5FF,endColorstr=#E0ECFF,GradientType=0);\n}\n.window-proxy {\n  border: 1px dashed #95B8E7;\n}\n.window-proxy-mask,\n.window-mask {\n  background: #ccc;\n}\n"
  },
  {
    "path": "project-school/themes/icon.css",
    "content": ".icon-blank{\r\n\tbackground:url('icons/blank.gif') no-repeat center center;\r\n}\r\n.icon-add{\r\n\tbackground:url('icons/edit_add.png') no-repeat center center;\r\n}\r\n.icon-edit{\r\n\tbackground:url('icons/pencil.png') no-repeat center center;\r\n}\r\n.icon-remove{\r\n\tbackground:url('icons/edit_remove.png') no-repeat center center;\r\n}\r\n.icon-save{\r\n\tbackground:url('icons/filesave.png') no-repeat center center;\r\n}\r\n.icon-cut{\r\n\tbackground:url('icons/cut.png') no-repeat center center;\r\n}\r\n.icon-ok{\r\n\tbackground:url('icons/ok.png') no-repeat center center;\r\n}\r\n.icon-no{\r\n\tbackground:url('icons/no.png') no-repeat center center;\r\n}\r\n.icon-cancel{\r\n\tbackground:url('icons/cancel.png') no-repeat center center;\r\n}\r\n.icon-reload{\r\n\tbackground:url('icons/reload.png') no-repeat center center;\r\n}\r\n.icon-search{\r\n\tbackground:url('icons/search.png') no-repeat center center;\r\n}\r\n.icon-print{\r\n\tbackground:url('icons/print.png') no-repeat center center;\r\n}\r\n.icon-help{\r\n\tbackground:url('icons/help.png') no-repeat center center;\r\n}\r\n.icon-undo{\r\n\tbackground:url('icons/undo.png') no-repeat center center;\r\n}\r\n.icon-redo{\r\n\tbackground:url('icons/redo.png') no-repeat center center;\r\n}\r\n.icon-back{\r\n\tbackground:url('icons/back.png') no-repeat center center;\r\n}\r\n.icon-sum{\r\n\tbackground:url('icons/sum.png') no-repeat center center;\r\n}\r\n.icon-tip{\r\n\tbackground:url('icons/tip.png') no-repeat center center;\r\n}\r\n\r\n.icon-mini-add{\r\n\tbackground:url('icons/mini_add.png') no-repeat center center;\r\n}\r\n.icon-mini-edit{\r\n\tbackground:url('icons/mini_edit.png') no-repeat center center;\r\n}\r\n.icon-mini-refresh{\r\n\tbackground:url('icons/mini_refresh.png') no-repeat center center;\r\n}"
  },
  {
    "path": "sitemap.xml",
    "content": "---\n---\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n    <url>\n        <loc>{{ site.url }}</loc>\n    </url>\n    \n    {% for page in site.pages %}\n    <url>\n        <loc>{{ site.url }}{{ page.url }}</loc>\n    </url>\n    {% endfor %}\n\n    {% for post in site.posts %}\n    <url>\n        <loc>{{ site.url }}{{ post.url }}</loc>\n    </url>\n    {% endfor %}\n</urlset>"
  },
  {
    "path": "tags.html",
    "content": "---\nlayout: post-index\npermalink: /tags/\ntitle: Tag Archive\ndescription: \"An archive of posts sorted by tag.\"\n---\n\n{% capture site_tags %}{% for tag in site.tags %}{{ tag | first }}{% unless forloop.last %},{% endunless %}{% endfor %}{% endcapture %}\n{% assign tags_list = site_tags | split:',' | sort %}\n\n<ul class=\"entry-meta inline-list\">\n  {% for item in (0..site.tags.size) %}{% unless forloop.last %}\n    {% capture this_word %}{{ tags_list[item] | strip_newlines }}{% endcapture %}\n  \t<li><a href=\"#{{ this_word }}\" class=\"tag\">{{ this_word }} <span>{{ site.tags[this_word].size }}</span></a></li>\n  {% endunless %}{% endfor %}\n</ul>\n\n{% for item in (0..site.tags.size) %}{% unless forloop.last %}\n  {% capture this_word %}{{ tags_list[item] | strip_newlines }}{% endcapture %}\n\t<article>\n\t<h2 id=\"{{ this_word }}\">{{ this_word }}</h2>\n\t\t<ul>\n    {% for post in site.tags[this_word] %}{% if post.title != null %}\n      <li class=\"entry-title\"><a href=\"{{ site.url }}{{ post.url }}\" title=\"{{ post.title }}\">{{ post.title }}</a></li>\n    {% endif %}{% endfor %}\n\t\t</ul>\n\t</article><!-- /.hentry -->\n{% endunless %}{% endfor %}"
  },
  {
    "path": "theme-setup.md",
    "content": "---\nlayout: page\npermalink: /theme-setup/\ntitle: Theme Setup\ndescription: \"Instructions on how to install and customize the modern Jekyll theme HPSTR.\"\ntags: [Jekyll, theme, install, setup]\nimage:\n  feature: abstract-11.jpg\n  credit: dargadgetz\n  creditlink: http://www.dargadgetz.com/ios-7-abstract-wallpaper-pack-for-iphone-5-and-ipod-touch-retina/\nshare: true\n---\n\nGeneral notes and suggestions for customizing **HPSTR**.\n\n## Basic Setup for a new Jekyll site\n\n1. [Install Bundler](http://bundler.io) `gem install bundler` and then install [Jekyll](http://jekyllrb.com) and all dependencies `bundle install`.\n2. Fork the [HPSTR Jekyll Theme repo](https://github.com/mmistakes/hpstr-jekyll-theme/fork).\n3. Clone the repo you just forked and rename it.\n4. Edit `_config.yml` to personalize your site.\n5. Check out the sample posts in `_posts` to see examples for pulling in large feature images, assigning categories and tags, and other YAML data.\n6. Read the documentation below for further customization pointers and documentation.\n\n<div markdown=\"0\"><a href=\"https://github.com/mmistakes/hpstr-jekyll-theme/archive/master.zip\" class=\"btn\">Download the Theme</a></div>\n\n**Pro-tip:** Delete the `gh-pages` branch after cloning and start fresh by branching off `master`. There is a bunch of garbage in `gh-pages` used for the theme's demo site that I'm guessing you don't want on your site.\n{: .notice}\n\n---\n\n## Setup for an Existing Jekyll site\n\n1. Clone the following folders: `_includes`, `_layouts`, `assets`, and `images`.\n2. Clone the following files and personalize content as need: `about.md`, `posts.html`, `index.html`, `tags.html`, and `feed.xml`.\n3. Set the following variables in your `config.yml` file:\n\n{% highlight yaml %}\ntitle:            hacke2's blog\ndescription:      Describe your website here.\ndisqus_shortname: shortname\n# Your site's domain goes here. When working locally use localhost server leave blank\n# PS. If you set this wrong stylesheets and scripts won't load and most links will break.\n# PPS. If you leave it blank for local testing home links won't work, they'll be fine for live domains though.\nurl:             http://hacke2.github.io\n\n# Owner/author information\nowner:\n  name:           王兴龙\n  avatar:         avatar.jpg\n  bio:            \"Hi 大家好，我是hacke2，感谢您来逛我的空间，也希望你能关注他，前端之路，一起前行.\"\n  email:          hacke2@qq.com\n  # Social networking links used in footer. Update and remove as you like.\n  twitter:        \n  facebook:       \n  github:         \n  stackexchange:  \n  linkedin:       \n  instagram:      \n  flickr:         \n  tumblr:         \n  # For Google Authorship https://plus.google.com/authorship\n  # google plus id, include the '+', eg +mmistakes\n  google_plus:    +yourid\n\n# Analytics and webmaster tools stuff goes here\ngoogle_analytics:   \ngoogle_verify:      \n# https://ssl.bing.com/webmaster/configure/verify/ownership Option 2 content= goes here\nbing_verify:         \n\n# Links to include in top navigation\n# For external links add external: true\nlinks:\n  - title: Theme Setup\n    url: /theme-setup\n  - title: External Link\n    url: http://mademistakes.com\n    external: true\n\n# http://en.wikipedia.org/wiki/List_of_tz_database_time_zones\ntimezone:    America/New_York\nfuture:      true\npygments:    true\nmarkdown:    kramdown\n\n# Amount of posts to show on home page\npaginate: 5\n{% endhighlight %}\n\n---\n\n## Folder Structure\n\n{% highlight bash %}\nhpstr-jekyll-theme/\n├── _includes\n|    ├── browser-upgrade.html  # prompt to upgrade browser on < IE8\n|    ├── footer.html  # site footer\n|    ├── head.html  # site head\n|    ├── navigation.html # site navigation\n|    └── scripts.html  # jQuery, plugins, GA, etc\n├── _layouts\n|    ├── page.html  # page layout\n|    ├── page.html  # post-index layout used on home page\n|    └── post.html  # post layout\n├── _posts\n├── assets\n|    ├── css  # preprocessed less styles\n|    ├── js\n|    |   ├── _main.js  # plugin options\n|    |   ├── scripts.min.js  # concatenated and minifed site scripts\n|    |   ├── plugins  # plugin scripts\n|    |   └── vendor  # jQuery and Modernizr scripts\n|    └── less \n├── images  # images for posts and pages\n├── _config.yml  # Jekyll options\n├── about.md  # about page\n├── index.html  # home page\n├── posts.html  # all posts\n└── tags.html  # all posts grouped by tag\n{% endhighlight %}\n\n---\n\n## Customization\n\n### _config.yml\n\nMost of the variables found here are used in the .html files found in `_includes` if you need to add or remove anything. A good place to start would be to add the `title`, `description`, and `url` for your site. Links are absolute and prefixed with `{{ \"{{ site.url \" }}}}` in the various `_includes` and `_layouts`, so remember to properly set `url`[^1] to `http://localhost:4000` when developing locally.\n\n#### Disqus Comments\n\nCreate a [Disqus](http://disqus.com) account and change `disqus_shortname` in `_config.yml` to the Disqus *shortname* you just setup. To enable commenting on a post, add the following to its front matter:\n\n{% highlight yaml %}\ncomments: true\n{% endhighlight %}\n\n#### Social Share Links\n\nTo enable Facebook, Twitter, and Google+ share links on a post or page, add the following to its front matter:\n\n{% highlight yaml %}\nshare: true\n{% endhighlight %}\n\n#### Owner/Author Information\n\nChange your name, and avatar photo (200x200 pixels or larger), email, and social networking URLs. If you want to link to an external image on Gravatar or something similar you'll need to edit the path in `head.html` since it assumes it is located in `/images`.\n\nIncluding a link to your Google+ profile has the added benefit of displaying [Google Authorship](https://plus.google.com/authorship) in Google search results if you've went ahead and applied for it.\n\n#### Google Analytics and Webmaster Tools\n\nYour Google Analytics ID goes here along with meta tags for [Google Webmaster Tools](http://support.google.com/webmasters/bin/answer.py?hl=en&answer=35179) and [Bing Webmaster Tools](https://ssl.bing.com/webmaster/configure/verify/ownershi) site verification.\n\n#### Navigation Menu Links\n\nEdit page/post titles and URLs to include in the site's navigation. For external links add `external: true`.\n\n{% highlight yaml %}\n# sample top navigation links\nlinks:\n  - title: Other Page\n    url: /other-page/\n  - title: External Link\n    url: http://mademistakes.com\n    external: true \n{% endhighlight %}\n\n#### Background Images\n\nTo utilize this \"feature\" just add the following YAML to a post's front matter. ([View demo](http://mmistakes.github.io/hpstr-jekyll-theme/background-image/))\n\n{% highlight yaml %}\nimage:\n  background: filename.png\n{% endhighlight %}\n\nThis little bit of YAML makes the assumption that your background image asset is in the `/images` folder. If you place it somewhere else or are hot linking from the web, just include the full http(s):// URL. Either way you should have a background image that is tiled.\n\nIf you want to set a background image for the entire site just add `background: filename.png` to your `_config.yml` and BOOM --- background images on every page!\n\n#### Other Stuff\n\nThe rest is just your average Jekyll config settings. Nothing too crazy here...\n\n### _includes\n\nFor the most part you can leave these as is since the author/owner details are pulled from `_config.yml`. That said you'll probably want to customize the copyright stuff in `footer.html` to your liking.\n\n### Reading Time\n\nOn by default. To turn off remove `reading_time` from `_config.yml. Default words per minute is set at 200 and can changed by updating `words_per_minute` in `_config.yml`.\n\n### Adding Posts and Pages\n\nThere are two main content layouts: `post.html` (for posts) and `page.html` (for pages). Both have support for large **feature images** that span the full-width of the screen, and both are meant for text heavy blog posts (or articles).\n\nThere are two rake tasks that can be used to create a new post or page with all YAML Front Matter. Using either `rake new_post` or `rake new_page` will prompt you for a title and tags to classify them. Example below:\n\n{% highlight bash %}\nrake new_post\n\nEnter a title for your post: My Awesome Post\nEnter tags to classify your post (comma separated): web development, code\nCreating new post: _posts/2014-02-10-my-awesome-post.md\n{% endhighlight %}\n\nThere are a few configuration variables that can be changed in `Rakefile.rb`. By default posts and pages will be created in MarkDown using the `.md` extension.\n\n#### Feature Images\n\nA good rule of thumb is to keep feature images nice and wide so you don't push the body text too far down. An image cropped around around 1024 x 256 pixels will keep file size down with an acceptable resolution for most devices. If you want to serve these images responsively I'd suggest looking at the [Jekyll Picture Tag](https://github.com/scottjehl/picturefill)[^2] plugin.\n\nThe two layouts make the assumption that the feature images live in the *images* folder. To add a feature image to a post or page just include the filename in the front matter like so. \n\n{% highlight yaml %}\nimage:\n  feature: feature-image-filename.jpg\n  thumb: thumbnail-image.jpg #keep it square 200x200 px is good\n{% endhighlight %}\n\nIf you want to apply attribution to a feature image use the following YAML front matter on posts or pages. Image credits appear directly below the feature image with a link back to the original source.\n\n{% highlight yaml %}\nimage:\n  feature: feature-image-filename.jpg\n  credit: Michael Rose #name of the person or site you want to credit\n  creditlink: http://mademistakes.com #url to their site or licensing\n{% endhighlight %}\n\n#### Post/Page Thumbnails for OG and Twitter Cards\n\nPost and page thumbnails work the same way. These are used by [Open Graph](https://developers.facebook.com/docs/opengraph/) and [Twitter Cards](https://dev.twitter.com/docs/cards) meta tags found in `head.html`. If you don't assign a thumbnail the image you assigned to `site.owner.avatar` in `_config.yml` will be used.\n\nHere's an example of what a tweet to your site could look like if you activate Twitter Cards and include all the metas in your post's YAML.\n\n![Twitter Card summary large image screenshot]({{ site.url }}/images/twitter-card-summary-large-image.jpg)\n\n#### Videos\n\nVideo embeds are responsive and scale with the width of the main content block with the help of [FitVids](http://fitvidsjs.com/).\n\nNot sure if this only effects Kramdown or if it's an issue with Markdown in general. But adding YouTube video embeds causes errors when building your Jekyll site. To fix add a space between the `<iframe>` tags and remove `allowfullscreen`. Example below:\n\n{% highlight html %}\n<iframe width=\"560\" height=\"315\" src=\"http://www.youtube.com/embed/PWf4WUoMXwg\" frameborder=\"0\"> </iframe>\n{% endhighlight %}\n\n#### Twitter Cards\n\nTwitter cards make it possible to attach images and post summaries to Tweets that link to your content. Summary Card meta tags have been added to `head.html` to support this, you just need to [validate and apply your domain](https://dev.twitter.com/docs/cards) to turn it on.\n\n#### Link Post Type\n\nLink blog like a champ by adding `link: http://url-you-want-linked` to a post's YAML front matter. Arrow glyph links to the post's permalink and the the `post-title` links to the source URL. Here's an [example of a link post]({{ site.url }}/sample-link-post/) if you need a visual.\n\n---\n\n## Theme Development\n\nIf you want to easily skin the themes' colors and fonts, take a look at `variables.less` in `assets/less/` and make the necessary changes to the color and font variables. To make development easier I setup a Grunt build script to compile/minify the LESS files into `main.min.css` and lint/concatenate/minify all scripts into `scripts.min.js`. [Install Node.js](http://nodejs.org/), then [install Grunt](http://gruntjs.com/getting-started), and then install the dependencies for the theme contained in `package.json`:\n\n{% highlight bash %}\nnpm install\n{% endhighlight %}\n\nFrom the theme's root, use `grunt` to rebuild the CSS, concatenate JavaScript files, and optimize .jpg, .png, and .svg files in the `images/` folder. You can also use `grunt watch` in combination with `jekyll build --watch` to watch for updates to your LESS and JS files that Grunt will then automatically re-build as you write your code which will in turn auto-generate your Jekyll site when developing locally.\n\nAnd if the command line isn't your thing (you're using Jekyll so it probably is), [CodeKit](http://incident57.com/codekit/) for OS X and [Prepros](http://alphapixels.com/prepros/) for Windows are great alternatives.\n\n---\n\n## Questions?\n\nHaving a problem getting something to work or want to know why I setup something in a certain way? Ping me on Twitter [@mmistakes](http://twitter.com/mmistakes) or [file a GitHub Issue](https://github.com/mmistakes/hpstr-jekyll-theme/issues/new). And if you make something cool with this theme feel free to let me know.\n\n---\n\n## License\n\nThis theme is free and open source software, distributed under the [MIT License]({{ site.url }}/LICENSE) version 2 or later. So feel free to to modify this theme to suit your needs.\n\n---\n\n[^1]: Used to generate absolute urls in `sitemap.xml`, `feed.xml`, and for canonical urls in `head.html`. Don't include a trailing `/` in your base url ie: http://mademistakes.com. When developing locally I suggest using http://localhost:4000 or whatever localhost you're using to properly load all theme stylesheets, scripts, and image assets. If you leave this variable blank all links will resolve correctly except those pointing to home.\n\n[^2]: If you're using GitHub Pages to host your site be aware that plugins are disabled. So you'll need to build your site locally and then manually deploy if you want to use this sweet plugin."
  },
  {
    "path": "works/css/common.css",
    "content": "body{font:14px/1.5 '微软雅黑';word-wrap:break-word;word-break:break-all;-webkit-text-size-adjust:none;background:#fff;color:#333;}\nbody,dl,dd,h1,h2,h3,h4,h5,h6,p,form,ul,ol,blockquote{margin:0}\nimg{border:0 none;vertical-align:middle;max-width:100%;}\ninput,select,textarea{font-size:12px;color:#333;outline:none}\ninput{vertical-align:middle;padding:2px;margin:0}\ntable{border-collapse:collapse;border-spacing:0}\nselect,input,button{font:12px/20px Verdana,Simsun,Helvetica,Arial,sans-serif;}\nem,i,cite,blockquote{font-style:normal}\nul,ol{list-style:none outside;padding:0}\nh1,h2,h3,h4,h5,h6{font-size:100%}\ntextarea{overflow-y:auto;padding:3px;resize:none}\na{-webkit-tap-highlight-color:rgba(0,0,0,0);}\na{color:#428bca;text-decoration:none;outline:0}\na:hover,a:active{color:#2a6496;text-decoration:none;}\na:focus{outline:0;}\n::selection { background:#633; color:#fff; }\n::-moz-selection { background:#633; color:#fff; }\n::-webkit-selection { background:#633; color:#fff; }\nbutton::-moz-focus-inner{border:0;padding:0;}\nfigure{margin:0}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\n.ppr{position:relative;}\n.ppa{position:absolute;}\n.fl{float:left}\n.fr{float:right}\n.tl{text-align:left;}\n.tc{text-align:center;}\n.tr{text-align:right;}\n.grayc{color:#ccc}\n.gray6{color:#666}\n.gray9{color:#999}\n.emstyle{font-style:italic}\n.clear{clear:both}\n.clearfix{*zoom:1}\n.clearfix:after{content:\".\";height:0;visibility:hidden;display:block;clear:both}\n.none{display:none}\n.block{display:block;}\n.ffs{font-family:serif;}\n.anim-link,.anim-link a{transition:all linear 0.4s;}\n.anim-link:hover,.anim-link a:hover{margin-left:10px;}\n.minheight500{min-height:500px;height:auto !important;height:500px;overflow:visible;}\n.wrap-box{width:1000px;margin:0 auto;}\n.blue,.blue a:link,.blue a:visited{color:blue;}\n.blue a:hover{color:#f60;}\n.white,.white a:link,.white a:visited{color:#fff;}\n.white a:hover{color:#ff0;}\n.red,.red a:link,.red a:visited{color:#f00;}\n.red a:hover{color:#f60;}\n.orange,.orange a:link,.orange a:visited{color:#ffa500;}\n.orange a:hover{color:#f60;}\n.texta3a,.texta3a a:link,.texta3a a:visited{color:#a3a3a3;}\n.texta3a a:hover{color:#c28800;}\n.text525,.text525 a:link,.text525 a:visited{color:#525252;}\n.text525 a:hover{color:#c28800;}\n.cp{cursor:pointer;}\n@font-face{font-family:'icomoon';src:url('../fonts/icomoon.eot');src:url('../fonts/icomoon.eot?#iefix') format('embedded-opentype'),url('../fonts/icomoon.woff') format('woff'),url('../fonts/icomoon.ttf') format('truetype'),url('../fonts/icomoon.svg#icomoon') format('svg');font-weight:normal;font-style:normal;}\n.icon-font { font-family:'icomoon'; speak:none; font-weight:400; font-style:normal; font-variant:normal; text-transform:none; line-height:1; -webkit-font-smoothing:antialiased; }\n.require-red{color:#f60;font-family:serif;margin-right:3px;}\n/* gotop */\n.backToTop{display:none;width:64px;height:58px;border-radius:5px;background:url(../images/common/gotop-bg.png) center center #000 no-repeat;opacity:0.6;filter:alpha(opacity:60);position:fixed;_position:absolute;right:30px;bottom:45px;_bottom:auto;cursor:pointer;overflow:hidden;z-index:9999;}\n.backToTop:hover{opacity:0.8;filter:alpha(opacity:80);}\n.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#ffffff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ffffff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#ffffff,#e6e6e6);background-image:-o-linear-gradient(top,#ffffff,#e6e6e6);background-image:linear-gradient(to bottom,#ffffff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbbbbb;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);}\n.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;}\n.btn:active,.btn.active{background-color:#cccccc \\9;}\n.btn:first-child{*margin-left:0;}\n.btn:hover{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}\n.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}\n.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);}\n.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#0044cc;background-image:-moz-linear-gradient(top,#0088cc,#0044cc);background-image:-webkit-gradient(linear,0 0,0 100%,from(#0088cc),to(#0044cc));background-image:-webkit-linear-gradient(top,#0088cc,#0044cc);background-image:-o-linear-gradient(top,#0088cc,#0044cc);background-image:linear-gradient(to bottom,#0088cc,#0044cc);background-repeat:repeat-x;border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);}\n.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;}\n.btn-primary:active,.btn-primary.active{background-color:#003399 \\9;}\n.btn5{width:80px;}\n.input-text{height:23px;line-height:23px;padding:2px 4px;border:1px solid #ccc;background:#fff;border-radius:5px;}\ntextarea,input[type=\"text\"],input[type=\"password\"],input[type=\"datetime\"],input[type=\"datetime-local\"],input[type=\"date\"],input[type=\"month\"],input[type=\"time\"],input[type=\"week\"],input[type=\"number\"],input[type=\"email\"],input[type=\"url\"],input[type=\"search\"],input[type=\"tel\"],input[type=\"color\"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}\ntextarea:focus,input[type=\"text\"]:focus,input[type=\"password\"]:focus,input[type=\"datetime\"]:focus,input[type=\"datetime-local\"]:focus,input[type=\"date\"]:focus,input[type=\"month\"]:focus,input[type=\"time\"]:focus,input[type=\"week\"]:focus,input[type=\"number\"]:focus,input[type=\"email\"]:focus,input[type=\"url\"]:focus,input[type=\"search\"]:focus,input[type=\"tel\"]:focus,input[type=\"color\"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \\9;/* IE6-9 */\n-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);}\ntextarea{border-radius:3px;}\n/* pop */\n.pop-wrap{position:fixed;top:30px;left:30px;width:700px;height:400px;background:#fff;box-shadow:0 22px 50px -35px #000;z-index:2000;}\n.pop-close{position:absolute;top:6px;right:18px;font-family:'Microsoft YaHei';font-size:25px;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:0.2;cursor:pointer;}\n.pop-close:hover{text-decoration:none;filter:alpha(opacity=40);opacity:1;color:#000;}\n.ui-mask{position:absolute;left:0;top:0;z-index:777;background:#000;filter:alpha(opacity=50);opacity:0.5;zoom:1;}\n.pop-title{width:100%;height:60px;cursor:move;}\n.pop-main{padding:20px;text-align:center;}\n.pop-inner{padding-top:50px;margin-right:-20px;overflow:hidden;zoom:1;}\n.pop-inner img{width:130px;height:130px;}\n.weixin-list{padding-left:65px;}\n.weixin-list li{float:left;margin-right:70px;display:inline;}\n.weixin-info{padding-top:10px;font-size:16px;color:#585858;font-family:'微软雅黑';}\n.bot-weibo-wrap{padding-top:15px;}\n.bot-weibo-wrap .yh-homesns-wrap{padding-left:0;}\n.bot-weibo-wrap .yh-homesns-wrap a{margin:0 9px 0 0;}\n/* common */\n.home-container{margin:20px 20px 0;max-width:1920px;background: #fff;border-top: 1px solid #aaa;box-shadow:0 1px 2px #aaa;}\n.design-outer .wrap-box{width:auto;max-width:1920px;margin: 0 20px 40px;border-bottom: 1px solid #aaa;}\n.wroks-inner{padding:25px 25px;}\n.design-container{margin:20px 20px 0;max-width:1920px;background: #fff;box-shadow:0 1px 2px #aaa;}\n.works-more-wrap{float: right;}\n.works-more-link{padding: 1px 6px;font-size: 16px;border: 1px solid #fff;}\n.works-more-link:hover{background: #f3e8e3;border: 1px solid #d8beae;color: #8e6955;}\n.works-more-link i{font-size: 16px;font-weight: bold;vertical-align:top;}\n.no-data{color: #999;}\n.blog-txt img{margin-bottom:25px;}\n.comment-head{float: left;width: 70px;}\n.comment-userinfo{float: left;}\n.comment-wrap .require-red{margin-left: 5px;}\n.comment-wrap .input-code{width:430px;margin-right: 5px;}\n.input-after{margin-left: 5px;}\n.alipay-txt{width: 400px;margin: 0 auto;height: 37px;line-height: 37px;padding: 15px 025px;}\n.alipay-txt h1{float: left;font-weight: normal;}\n.alipay{float: left;width: 159px;height: 37px;background: url(../images/common/btn-index.png) 0 0 no-repeat;}\n.design-ali{padding-bottom:20px;}"
  },
  {
    "path": "works/css/home.css",
    "content": "/* sider */\n.sidebar{ position:fixed;top: 0;left: 0;bottom: 0;width: 189px; border-right: 1px solid #ccc;background: #f2f2f2;overflow-y:auto;}\n.main{ position:fixed;top: 0;right: 0;bottom: 0; left:190px;}\n.sider-title{text-align: left;text-indent: 1em;}\n.sider-title h1{font-size: 17px;font-weight: normal;height:60px;line-height:60px;}\n.sider-list li{border-bottom: 1px solid #e5e5e5;}\n.sider-list li a{padding: 0 16px 0 20px;height: 38px;line-height: 38px;display: block;color: #333;background: #fff;}\n.sub-menu{background: #fff;border-top: 1px solid #e5e5e5;}\n.sub-menu li{text-indent: 21px;position: relative;}\n.sub-menu li a{transition:all 0.6s;}\n.sub-menu li a:hover{color: #fff;background-color: gray;}\n.root{font-weight: bolder;}\n\n"
  },
  {
    "path": "works/demo/03/bd03.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>榜单</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" media=\"all\"/>\n</head>\n<body>\n<div id=\"container\" class=\"mp-box mp-box-tab j-tab-container mp-shouyou-billboard\">\n    <div class=\"mp-box-head j-tab\">\n        <h3 class=\"mp-box-head-tab j-tab-item active OP_LOG_LINK\"><strong>安卓</strong>风云榜</h3>\n        <h3 class=\"mp-box-head-tab j-tab-item OP_LOG_LINK\"><strong>IOS</strong>风云榜</h3>\n        <div class=\"line\"></div>\n    </div>\n    <div class=\"mp-list-wrap j-tab-cnt j-rank-box\" id=\"j-rank-android\">\n        <div class=\"mp-list-wrap\">\n            <ul class=\"mp-gamerank-list3 j-rank\">\n                <li class=\"list-item list-item-0 item-hover\">\n                    <div class=\"brief\">\n                        <span class=\"number\">1</span>\n                        <a title=\"魔力宝贝（风靡亚洲）\" class=\"name\" target=\"_blank\" href=\"#\">魔力宝贝（风靡亚洲）</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_0\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"魔力宝贝（风靡亚洲）\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">183324</strong></p>\n                            <p class=\"type\">类型 ：网络游戏</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_0_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item list-item-1\">\n                    <div class=\"brief\">\n                        <span class=\"number\">2</span>\n                        <a title=\"去吧皮卡丘\" class=\"name\" target=\"_blank\" href=\"#\">去吧皮卡丘</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_1\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"去吧皮卡丘\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">181360</strong></p>\n                            <p class=\"type\">类型 ：网络游戏</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_1_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item list-item-2\">\n                    <div class=\"brief\">\n                        <span class=\"number\">3</span>\n                        <a title=\"剑魂之刃(手操之王)\" class=\"name\" target=\"_blank\" href=\"#\">剑魂之刃(手操之王)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_2\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"剑魂之刃(手操之王)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">181348</strong></p>\n                            <p class=\"type\">类型 ：动作冒险</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_2_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">4</span>\n                        <a title=\"神之刃(神之作)\" class=\"name\" target=\"_blank\" href=\"#\">神之刃(神之作)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_3\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"神之刃(神之作)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">181234</strong></p>\n                            <p class=\"type\">类型 ：角色扮演</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_3_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">5</span>\n                        <a title=\"刀塔传奇\" class=\"name\" target=\"_blank\" href=\"#\">刀塔传奇</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_4\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"刀塔传奇\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">180971</strong></p>\n                            <p class=\"type\">类型 ：卡片棋牌</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_4_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">6</span>\n                        <a title=\"时空猎人(街机格斗)\" class=\"name\" target=\"_blank\" href=\"#\">时空猎人(街机格斗)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_5\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"时空猎人(街机格斗)\" src=\"images/1.jpg\" src=\"http://t11.baidu.com/it/u=3076963501,1407203949&amp;fm=58\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">163312</strong></p>\n                            <p class=\"type\">类型 ：网络游戏</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_5_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">7</span>\n                        <a title=\"海岛大作战-海岛奇兵\" class=\"name\" target=\"_blank\" href=\"#\">海岛大作战-海岛奇兵</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_6\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"海岛大作战-海岛奇兵\" src=\"images/1.jpg\" src=\"http://t12.baidu.com/it/u=3505125227,2166710350&amp;fm=58\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">159934</strong></p>\n                            <p class=\"type\">类型 ：网络游戏</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_6_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">8</span>\n                        <a title=\"天天世界杯-软妹最爱\" class=\"name\" target=\"_blank\" href=\"#\">天天世界杯-软妹最爱</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_7\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"天天世界杯-软妹最爱\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">150098</strong></p>\n                            <p class=\"type\">类型 ：网络游戏</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_7_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">9</span>\n                        <a title=\"暖暖环游世界\" class=\"name\" target=\"_blank\" href=\"#\">暖暖环游世界</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_8\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"暖暖环游世界\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">150098</strong></p>\n                            <p class=\"type\">类型 ：网络游戏</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_8_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">10</span>\n                        <a title=\"苍穹之剑\" class=\"name\" target=\"_blank\" href=\"#\">苍穹之剑</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_android_9\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"苍穹之剑\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">142297</strong></p>\n                            <p class=\"type\">类型 ：角色扮演</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_android_9_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n            </ul>\n        </div>\n    </div>\n    <div class=\"mp-list-wrap j-tab-cnt j-rank-box mp-hidden\" id=\"j-rank-ios\">\n        <div class=\"mp-list-wrap\">\n            <ul class=\"mp-gamerank-list3 j-rank none\">\n                <li class=\"list-item list-item-0 item-hover\">\n                    <div class=\"brief\">\n                        <span class=\"number\">1</span>\n                        <a title=\"时空猎人(街机格斗)\" class=\"name\" target=\"_blank\" href=\"#\">时空猎人(街机格斗)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_0\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"时空猎人(街机格斗)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">123453</strong></p>\n                            <p class=\"type\">类型 ：动作冒险</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_0_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item list-item-1\">\n                    <div class=\"brief\">\n                        <span class=\"number\">2</span>\n                        <a title=\"梦想海贼王(跨服战)\" class=\"name\" target=\"_blank\" href=\"#\">梦想海贼王(跨服战)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_1\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"梦想海贼王(跨服战)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">120322</strong></p>\n                            <p class=\"type\">类型 ：卡片棋牌</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_1_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item list-item-2\">\n                    <div class=\"brief\">\n                        <span class=\"number\">3</span>\n                        <a title=\"放开那三国\" class=\"name\" target=\"_blank\" href=\"#\">放开那三国</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_2\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"放开那三国\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">120100</strong></p>\n                            <p class=\"type\">类型 ：卡片棋牌</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_2_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">4</span>\n                        <a title=\"神之刃(神之作)\" class=\"name\" target=\"_blank\" href=\"#\">神之刃(神之作)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_3\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"神之刃(神之作)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">120099</strong></p>\n                            <p class=\"type\">类型 ：动作冒险</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_3_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">5</span>\n                        <a title=\"花样爷爷官方版手游\" class=\"name\" target=\"_blank\" href=\"#\">花样爷爷官方版手游</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_4\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"花样爷爷官方版手游\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">120034</strong></p>\n                            <p class=\"type\">类型 ：网络游戏</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_4_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">6</span>\n                        <a title=\"神雕侠侣(正版手游)\" class=\"name\" target=\"_blank\" href=\"#\">神雕侠侣(正版手游)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_5\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"神雕侠侣(正版手游)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">120032</strong></p>\n                            <p class=\"type\">类型 ：角色扮演</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_5_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">7</span>\n                        <a title=\"我叫MT:小小魔兽\" class=\"name\" target=\"_blank\" href=\"#\">我叫MT:小小魔兽</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_6\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"我叫MT:小小魔兽\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">110344</strong></p>\n                            <p class=\"type\">类型 ：休闲益智</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_6_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">8</span>\n                        <a title=\"忘仙\" class=\"name\" target=\"_blank\" href=\"#\">忘仙</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_7\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"忘仙\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">110003</strong></p>\n                            <p class=\"type\">类型 ：角色扮演</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_7_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">9</span>\n                        <a title=\"王者之剑(暗黑格斗)\" class=\"name\" target=\"_blank\" href=\"#\">王者之剑(暗黑格斗)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_8\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"王者之剑(暗黑格斗)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">100324</strong></p>\n                            <p class=\"type\">类型 ：动作冒险</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_8_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n                <li class=\"list-item\">\n                    <div class=\"brief\">\n                        <span class=\"number\">10</span>\n                        <a title=\"大掌门(第一武侠)\" class=\"name\" target=\"_blank\" href=\"#\">大掌门(第一武侠)</a>\n                    </div>\n                    <div class=\"detail\">\n                        <a target=\"_blank\" id=\"tj_ios_9\" href=\"#\">\n                            <img class=\"pic-shouyou\" alt=\"大掌门(第一武侠)\" src=\"images/1.jpg\">\n                        </a>\n                        <div class=\"txt-wrap txt-wrap-shouyou\">\n                            <p class=\"popular\">人气 ：<strong class=\"highlight\">100001</strong></p>\n                            <p class=\"type\">类型 ：卡片棋牌</p>\n                            <a title=\"点击下载\" class=\"mp-btn mp-btn-focus2 download-btn\" target=\"_blank\" id=\"tj_ios_9_download\" href=\"#\">下载</a>\n                        </div>\n                    </div>\n                </li>\n            </ul>\n        </div>\n    </div>\n</div>\n\n<script>\n\t(function(){\n\t\t\n\t\tvar context = document.getElementById('container'),\n\t\t\ttitles = context.getElementsByTagName('h3'),\n\t\t\tlis = context.getElementsByTagName('li'),\n\t\t\tul = context.getElementsByTagName('ul'),\n\t\t\thoverPartten = /item-hover/g\n\t\t\tactivePartten = /active/g;\n\t\n\t\tcontext.onmouseover = function() {\n\t\t\tvar e = event || window.event,\n\t\t\t\ttarget = e.target || e.srcElement;\n\t\t\t\t\n\t\t\tif(target.nodeName =='H3') {\n\t\t\t\tfor(i = 0; i < titles.length; i++){\n\t                ul[i].style.display = 'none';\n\t                titles[i].className = titles[i].className.replace(activePartten,'');\n\t                if(titles[i] == target) {\n\t                \tul[i].style.display = 'block';\n\t                }\n                }\n\t\t\t\ttarget.className += ' active';\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\tif(target.nodeName =='LI') {\n\t\t\t\tif(!hasClassName(target, hoverPartten)) {\n\t\t\t\t\tfor(var i = 0; i < lis.length; i++) {\n\t\t\t\t\t\tlis[i].className = lis[i].className.replace(hoverPartten,'');\n\t\t\t\t\t}\n\t\t\t\t\ttarget.className += ' item-hover';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\t\n\t\t\n\t\t//是否有item-hover这个类\n\t\tfunction hasClassName(obj, partten) {\n\t\t\treturn partten.test(obj.className);\n\t\t}\n\t})();\n</script>\n</body>\n</html>"
  },
  {
    "path": "works/demo/03/css/main.css",
    "content": "*{ margin:0; padding:0;}\nbody{font:12px/1.125 Arial,Helvetica,sans-serif;background:#fff;}\ntable{border-collapse:collapse;border-spacing:0;}\nli{list-style:none;}\nfieldset,img{border:0;}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\nq:before,q:after{content:'';}\na:focus,input,textarea{outline-style:none;}\ninput[type=\"text\"],input[type=\"password\"],textarea{outline-style:none;-webkit-appearance:none;}\ntextarea{resize:none}\naddress,caption,cite,code,dfn,em,i,th,var{font-style:normal;font-weight:normal;}\nlegend{color:#000;}\nabbr,acronym{border:0;font-variant:normal;}\na{color:#333;text-decoration:none;}\na:hover{ color:#f60;text-decoration:none;}\n.clearfix:after{content:\".\";display:block;height:0;clear:both;visibility:hidden;}\n.clearfix{display:inline-block;}\n.clearfix{display:block;}\n.clear{clear:both;height:0;font:0/0 Arial;visibility:hidden;}\n.none{display:none}\n/* main */\n.j-tab-container{ width:250px;margin: 0 auto; position:relative;}\n.mp-box{border:1px solid #ccc;border-bottom:0;zoom:1}\n.mp-box-foot,.mp-box-head{position:relative;padding:7px 13px 7px 8px;height:24px;line-height:24px;background:#f1f1f1;zoom:1}\n.mp-box-head{border-bottom:1px solid #ccc}\n.mp-box-tab .mp-box-head{padding:0;height:37px;line-height:37px;font-size:15px}\n.mp-box-tab .mp-box-head .line{position:absolute;top:0;left:50%;width:1px;height:100%;background:#dcdcdc}\n.mp-box-tab .mp-box-head .active{margin-top:-1px;border-top:2px solid #ff7a01;background:#fff;color:#333}\n.mp-box-tab .mp-box-head .active strong{color:#ff7a01}\n.mp-box-tab .mp-box-head-tab{_position:relative;float:left;width:50%;color:#999;text-align:center}\n.mp-box-tab .mp-box-head-tab strong{font-weight:400}\n.highlight {color: #ff7a01;font-weight: 400;}\n.mp-btn-focus2{color:#fff;background:#ff7a01;border:1px solid #ff7010}\n.mp-btn-focus2:hover{background:#fc531f;color:#fff;text-decoration:none}\n.mp-gamerank-list3{background:#fff}\n.list-item{position:relative;padding:7px 0;border-bottom:1px solid #dcdcdc;vertical-align:middle}\n.number{position:absolute;top:8px;left:8px;display:block;width:22px;height:22px;line-height:22px;background:#bdbdbd;text-align:center;color:#fff}\n.brief{padding-left:40px}\n.brief .name{height:22px;line-height:22px;font-size:14px}\n.brief .arrow{position:absolute;top:6px;right:3px}\n.brief .download-btn{position:absolute;top:8px;right:8px;width:38px;height:18px;line-height:18px;font-size:13px;text-align:center}\n.brief .time{position:absolute;top:12px;left:5px}\n.detail{position:relative;display:none;margin:10px 0 0 8px}\n.pic{float:left;width:101px;height:86px}\n.pic-shouyou{float:left;margin-left:34px;width:64px;height:64px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}\n.txt-wrap{padding:20px 0 0 10px;zoom:1;overflow:hidden}\n.txt-wrap-shouyou{padding-top:5px}\n.name{height:17px;line-height:17px;font-size:13px;color:#333}\n.platform{height:28px;line-height:28px;font-size:13px;color:#999}\n.start-btn{display:block;width:66px;height:19px;line-height:19px;font-size:13px}\n.star-wrap{margin:12px 0 3px}\n.downloads{color:#999;height:17px;line-height:17px}\n.size{margin:2px 0;color:#333;font-size:13px}\n.download-btn{width:38px;height:18px;line-height:18px;font-size:13px;text-align:center}\n.popular,.mp-gamerank-list3 .list-item .detail .type{height:19px;line-height:19px;color:#999}\n.second .number{background:#d08846}\n.third .number{background:#997c61}\n.list-item-0 .number,.mp-gamerank-list3 .list-item-1 .number{background:#d08846}\n.list-item-2 .number{background:#997c61}\n.item-hover .number{background:#ff7a01}\n.item-hover .detail{display:block}\n.mp-btn{background-image:none;border:0 none;border-radius:1px;color:#fff;cursor:pointer;display:inline-block;font-family:\"Microsoft Yahei\",\"微软雅黑\";font-size:13px;position:relative;text-align:center;text-decoration:none;vertical-align:middle;white-space:nowrap;word-wrap:normal}"
  },
  {
    "path": "works/demo/04/css/main.css",
    "content": "*{ margin:0; padding:0;}\nbody{font:14px/1.5 Arial,Helvetica,sans-serif;background:#fff;}\ntable{border-collapse:collapse;border-spacing:0;}\nli{list-style:none;}\nfieldset,img{border:0;}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\nq:before,q:after{content:'';}\na:focus,input,textarea{outline-style:none;}\ninput[type=\"text\"],input[type=\"password\"],textarea{outline-style:none;-webkit-appearance:none;}\ntextarea{resize:none}\naddress,caption,cite,code,dfn,em,i,th,var{font-style:normal;font-weight:normal;}\nlegend{color:#000;}\nabbr,acronym{border:0;font-variant:normal;}\na{color:#0a8cd2;text-decoration:none;}\na:hover{text-decoration:underline;}\n.clearfix:after{content:\".\";display:block;height:0;clear:both;visibility:hidden;}\n.clearfix{display:inline-block;}\n.clearfix{display:block;}\n.clear{clear:both;height:0;font:0/0 Arial;visibility:hidden;}\n.none{display:none}\n/* main */\n.page{width:100%;height:970px;overflow:hidden;}\n.div1200{width:1200px;height:100%;position:relative;margin:0px auto;}\n.page5{background:#282828;}\n.page5span1{margin:0px auto;cursor:pointer;margin-top:8%;display:block;width:184px;border-bottom:4px #3c3c3c solid;}\n.page5span1 img{width:100%;}\n.ullist8{width:100%;margin-top:78px;}\n.ullist8 li{width:210px;height:210px;float:left;margin:0px 0px 20px 20px;position:relative;overflow:hidden;background:#383838;cursor:pointer;}\n.ullist8 img{display:block;margin:0px auto;margin-top:10px;cursor:pointer;width:190;height:190px;\n}\n.ullist8 div{position:absolute;z-index:1;width:190px;height:190px;top:10px;left:10px;background:rgba(209,51,49,0.8);}\n.ullist8 div i{44px;height:44px;display:block;margin:0px auto;margin-top:50px;background:url(../images/y1.png) center center no-repeat;}\n.ullist8 div span{width:100%; display:inline-block;text-align:center;font-size:20px;color:#fff;margin-top:10px;}\n.ullist8 div p{padding-top:10px;font-size:12px;text-align:center;color:#fff;}\n\n.ullist2 span.transform,.ullist3 .ti.transform,.ullist8 li.transform{-webkit-transform:scale(1) translate(0px,0px);opacity:1;transform:scale(1) translate(0px,0px);\nanimation:none;-webkit-animation:none;display:block;opacity:1;}\n\n.ullist8 li{-webkit-transition:all 0.3s linear;\ntransition:all 0.3s linear;\n}\n.ullist8 div {-webkit-transition:all 0.3s linear;-webkit-transform:rotate(90deg);opacity:0;-webkit-transform-origin:100% 100%;\ntransition:all 0.3s linear;transform:rotate(90deg);transform-origin:100% 100%;\n}\n.ullist8 li:hover{background:#4c4c4c}\n.ullist8 li:hover div{-webkit-transform:rotate(0deg);opacity:1;\ntransform:rotate(0deg);\n}\n\n.job_alert,.box_ovo{-webkit-transform:translate(0px,-300%);opacity:0;-webkit-transition:all 0.3s linear;\ntransform:translate(0px,-300%);transition:all 0.3s linear;\n}\n.job_alert.current,.box_ovo.current{-webkit-transform:translate(0px,0px);opacity:1;\ntransform:translate(0px,0px);\n}\n\n.job_alert{width:940px;height:550px;position:fixed;left:50%;top:50%;margin-left:-470px;margin-top:-245px;background:#fff;z-index:100;}\n.job_alert .close,.box_ovo .close,.page7_alert .close{width:40px;height:40px;position:absolute;right:-40px;top:0px;cursor:pointer;background:#d83e40;}\n.job_alert .close i,.box_ovo .close i,.page7_alert .close i{width:40px;height:40px;background:url(../images/close.png) center center no-repeat;display:block;}\n.jog_txt_alert{padding:30px;width:880px;height:490px;overflow:auto;overflow-x:hidden;}\n.jog_txt_alert h2{font-size:180%;}\n.jog_txt_alert .p1{padding-top:10px;padding-bottom:20px;border-bottom:1px #ccc dashed;}\n.jog_txt_alert .p1 a{width:100px;height:30px;line-height:30px;text-align:center;display:block;margin-top:5px;border-radius:2px;background:#d44547;color:#fff;}\n.jog_txt_alert  h4{margin-top:20px;font-size:16px;font-weight:bold;margin-bottom:10px;}\n.job_alert .close i,.box_ovo .close i,.divlo .close img{-webkit-transition:all 0.2s linear;\ntransition:all 0.2s linear;\n}\n.job_alert .close:hover i,.box_ovo .close:hover i,.divlo .close:hover img{-webkit-transform:rotate(180deg);\ntransform:rotate(180deg);\n}\n\n.box_ovo{width:940px;height:500px;position:fixed;left:50%;top:50%;margin-left:-470px;margin-top:-250px;background:#fff;z-index:100;}\n.box_ovo .prev,.box_ovo .next{width:40px;height:40px;position:absolute;right:-40px;top:40px;cursor:pointer;background:#2a2a2a;}\n.box_ovo .next{top:81px;}\n.box_ovo .prev i{width:40px;height:40px;display:block;background:url(../images/p9_06.png) center center no-repeat;}\n.box_ovo .next i{width:40px;height:40px;display:block;background:url(../images/p9_09.png) center center no-repeat;}\n.oimg1{float:left;margin-right:44px;}\n.ovotxt{width:460px;float:left;overflow:auto;overflow-x:hidden;}\n.ovohead{width:100%;height:70px;position:relative;border-bottom:1px #ccc dashed;margin-top:30px;margin-bottom:30px;}\n.ovohead h1{position:absolute;left:0px;top:0px;font-size:220%;}\n.ovohead i{font-size:14px;color:#b4b4b4;position:absolute;left:0px;top:43px;font-style:normal;}\n.ovohead em{position:absolute;right:0px;top:10px;text-align:left;font-size:16px;font-weight:bold;}\n.ovohead span{font-size:14px;color:#b4b4b4;position:absolute;right:0px;top:33px;}\n.ovotxt p{padding-bottom:10px;font-size:120%;}\n\n.box_bg1{position:fixed;left:0px;top:0px;z-index:60;background:rgba(0,0,0,0.8);height:100%;width:100%;}\n.box_bg1{-webkit-transform:scale(0);opacity:0;-webkit-transition:all 0.2s linear;\ntransform:scale(0);transition:all 0.2s linear;\n}\n.box_bg1.current{-webkit-transform:scale(1);opacity:1;\ntransform:scale(1);\n}\n.box_bg1.current{-webkit-animation:box_bg1 0.2s ease-in-out 0.2s forwards;}\n"
  },
  {
    "path": "works/demo/04/css/r.css",
    "content": "*{margin:0;padding:0;}\n"
  },
  {
    "path": "works/demo/04/data.js",
    "content": "var data = [];\n\ndata.push({\n\t'name' : 'Dillon',\n\t'enname' : 'Dillon',\n\t'desc' : '来自哈佛的战略伙伴经理',\n\t'pic' : 'images/n8_10.png',\n\t'bigpic' : 'images/j2.jpg'\n});\n\ndata.push({\n\t'name' : '成俞晟',\n\t'enname' : 'cheng',\n\t'desc' : '技术宅服务器工程师',\n\t'pic' : 'images/n8_07.png',\n\t'bigpic' : 'images/j3.jpg'\n});\n\ndata.push({\n\t'name' : 'Said',\n\t'enname' : 'Said',\n\t'desc' : '开朗健谈的中国通',\n\t'pic' : 'images/n8_18.png',\n\t'bigpic' : 'images/j5.jpg'\n});\n\ndata.push({\n\t'name' : '段路路',\n\t'enname' : 'duan lulu',\n\t'desc' : '爱生活的百变游戏MM',\n\t'pic' : 'images/n8_13.png',\n\t'bigpic' : 'images/j4.jpg'\n});\n\ndata.push({\n\t'name' : '宋琦',\n\t'enname' : 'song qi',\n\t'desc' : '小清新专利保护女超人',\n\t'pic' : 'images/n8_15.png',\n\t'bigpic' : 'images/j1.jpg'\n});\n\ndata.push({\n\t'name' : '孙小清',\n\t'enname' : 'song xiao qing',\n\t'desc' : '懂管理的大客户销售',\n\t'pic' : 'images/n8_25.png',\n\t'bigpic' : 'images/j6.jpg'\n});\n\ndata.push({\n\t'name' : '孙玉莎',\n\t'enname' : 'song yu sha ',\n\t'desc' : '联想给了我更大的舞台',\n\t'pic' : 'images/n8_26.png',\n\t'bigpic' : 'images/j7.jpg'\n});\n\ndata.push({\n\t'name' : '田雨丰',\n\t'enname' : 'tian yu feng',\n\t'desc' : '开朗又细心的会计暖男',\n\t'pic' : 'images/n8_27.png',\n\t'bigpic' : 'images/j8.jpg'\n});\n\ndata.push({\n\t'name' : '许力诺',\n\t'enname' : 'xu li nong',\n\t'desc' : '不安于现状',\n\t'pic' : 'images/n8_28.png',\n\t'bigpic' : 'images/j10.jpg'\n});\n\ndata.push({\n\t'name' : '于乐',\n\t'enname' : 'yu le',\n\t'desc' : '与联想同龄的研发工程师',\n\t'pic' : 'images/n8_29.png',\n\t'bigpic' : 'images/j11.jpg'\n});"
  },
  {
    "path": "works/demo/04/index.html",
    "content": "<!doctype html>\n<html>\n\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<title>Ta 在联想</title>\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" media=\"all\" />\n\t</head>\n\n\t<body>\n\t\t<div id=\"container\" class=\"page page5\">\n\t\t\t<div class=\"div1200\">\n\t\t\t\t<span class=\"link page5span1 current\"><img src=\"images/n8_03.png\"></span>\n\t\t\t\t<ul class=\"ullist8\" style=\"margin-top: 30px;\">\n\t\t\t\t\t<!-- 在这里插入模板-->\n\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"bg\" class=\"box_bg1\"></div>\n\t\t<div id=\"dialog\"  class=\"box_ovo \">\n\t\t\t<span id=\"close\" class=\"close\"><i></i></span>\n\t\t\t<span class=\"prev\"><i></i></span>\n\t\t\t<span class=\"next\"><i></i></span>\n\t\t\t<div id=\"div_temp1\" data-id=\"{i}\" >\n\t\t\t\t<img class=\"oimg1\" src=\"{bigpic}\">\n\t\t\t\t<div class=\"ovotxt\">\n\t\t\t\t\t<div class=\"ovohead\">\n\t\t\t\t\t\t<h1>{name}</h1>\n\t\t\t\t\t\t<i>{enname}</i>\n\t\t\t\t\t\t<em>{desc}</em>\n\t\t\t\t\t\t<span>ECS</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<p>2013年加入联想，联想游戏中心最霸气的女商务，性格大大咧咧，柔弱的外表下有一颗强大的心。自诩内可安邦定天下，外可御敌千里外。</p>\n\t\t\t\t\t<p>联想游戏中心作为北研最靓丽的风景线，不仅有着最潮、最流行的游戏可以玩，有各种精美的游戏周边随便拿，最关键的是有这样娇(ba)媚(qi)可(shi)人(zu)的女汉子陪聊，陪工作，陪吃饭。总之一句话，联想游戏中心，你值得拥有。</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div id=\"temp_li\" style=\"display: none;\">\n\t\t\t<li data-id=\"{i}\" class=\"transform\">\n\t\t\t\t<div>\n\t\t\t\t\t<i></i>\n\t\t\t\t\t<span>{name}</span>\n\t\t\t\t\t<p>{desc}</p>\n\t\t\t\t</div>\n\t\t\t\t<img src=\"{pic}\">\n\t\t\t</li>\n\t\t</div>\n\t\t<script src=\"data.js\"></script>\n\t\t<script>\n\t\t\t(function(){\n\t\t\n\t\t\n\t\t        var bg = document.getElementById('bg');\n\t\t        var dialog = document.getElementById('dialog');\n\t\t        var close = document.getElementById('close');\n\t\t        var ul = document.getElementsByTagName('ul')[0];\n\t\t\n\t\t\n\t\t\t\t//给每一个li加事件\n\t\t\t\tul.onclick = function(event) {\n\t\t\t\t\tvar e = event || window.event;\n\t\t\t\t\tvar target = e.target || e.srcElement;\n\t\t\t\t\ttarget = getLiByChild(target);\n\t\t\t\t\tif(target) {\n\t\t\t\t\t\tvar curIndex = target.getAttribute('data-id');\n\t\t            \topenDialog(curIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t     \n\t\t\n\t\t\t\t//给弹出层加事件\n\t\t        dialog.onclick = function(){\n\t\t        \tvar e = event || window.event;\n\t\t\t\t\tvar target = e.target || e.srcElement;\n\t\t\t\t\tvar curIndex = +dialog.lastElementChild.getAttribute('data-id'); \n\t\t\t\t\t//点击关闭\n\t\t\t\t\tif(target.nodeName == 'I' && target.parentNode.className == 'close') {\n\t\t\t\t\t\tcloseDialog();\n\t\t\t\t\t}\n\t\t\t\t\t//点击上一个\n\t\t\t\t\tif(target.nodeName == 'I' && target.parentNode.className == 'prev') {\n\t\t\t\t\t\tvar preIndex= curIndex-1;\n\t\t\t\t\t\tif(preIndex > -1) {\n\t\t\t\t\t\t\tcloseDialog(function() {\n\t\t\t\t\t\t\t\topenDialog(preIndex);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else {//否则循环到最后一个\n\t\t\t\t\t\t\tcloseDialog(function() {\n\t\t\t\t\t\t\t\topenDialog(data.length-1);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t//点击下一个\n\t\t\t\t\tif(target.nodeName == 'I' && target.parentNode.className == 'next') {\n\t\t\t\t\t\tvar nextIndex= curIndex+1;\n\t\t\t\t\t\tif(nextIndex < data.length) {\n\t\t\t\t\t\t\tcloseDialog(function() {\n\t\t\t\t\t\t\t\topenDialog(nextIndex);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}else {//否则循环到最后一个\n\t\t\t\t\t\t\tcloseDialog(function() {\n\t\t\t\t\t\t\t\topenDialog(0);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t            \n\t\t        }\n\t\t        \n\t\t        //获取LI模板HTML\n\t\t        var tempLi = document.getElementById('temp_li').innerHTML;\n\t\t        \n\t\t        //HTML + 数据最后放到这个数组里\n\t\t        var liArr = [];\n\t\t\t\tfor (var i = 0; i < data.length; i++) {\n\t\t\t\t\t//替换模板里{}表达式\n\t\t\t\t\tvar itemLi = tempLi.replace(/\\{i\\}/, i)\n\t\t\t\t\t\t\t\t\t.replace(/\\{name\\}/,data[i].name)\n\t\t\t\t\t\t\t\t\t.replace(/\\{desc\\}/,data[i].desc)\n\t\t\t\t\t\t\t\t\t.replace(/\\{pic\\}/,data[i].pic);\n\t\t\t\t\tliArr.push(itemLi);\n\t\t\t\t} \n\t\t        \n\t\t        //加入到ul里\n\t\t        ul.innerHTML = liArr.join('');\n\t\t        \n\t\t        \n\t\t        //获取详细信息模板\n\t\t        var tempDialog = dialog.innerHTML;\n\t\t        \n\t\t        //打开弹出层\n\t\t        function openDialog(dataIndex) {\n\t\t        \tdialog.innerHTML = tempDialog.replace(/\\{i\\}/,dataIndex)\n\t\t        \t\t\t\t\t\t.replace(/\\{name\\}/,data[dataIndex].name)\n\t\t        \t\t\t\t\t\t.replace(/\\{enname\\}/,data[dataIndex].enname)\n\t\t        \t\t\t\t\t\t.replace(/\\{desc\\}/,data[dataIndex].desc)\n\t\t        \t\t\t\t\t\t.replace(/\\{bigpic\\}/,data[dataIndex].bigpic);\n\t\t      \t\tbg.className += ' current';\n\t\t            dialog.className += ' current';\n\t\t        }\n\t\t        \n\t\t        //找到最顶层LI\n\t\t        function getLiByChild(element) {\n\t\t        \tvar li = element;\n\t\t        \twhile(li.nodeName != 'LI') {\n\t\t        \t\tli = li.parentNode;\n\t\t        \t}\n\t\t        \treturn li;\n\t\t        }\n\t\t        \n\t\t        //关闭Dialog\n\t\t        function closeDialog(func) {\n\t\t        \tbg.className = 'box_bg1';\n\t\t\t        dialog.className = 'box_ovo';\n\t\t\t        setTimeout(function(){\n\t\t\t        \tif(dialog.className == 'box_ovo') {\n\t\t\t        \t\tfunc && func();\n\t\t\t        \t}\n\t\t\t        },300);\n\t\t        }\n\t\t       \n\t\t    }());\n\t\t</script>\n\t</body>\n\n</html>"
  },
  {
    "path": "works/demo/06/css/main.css",
    "content": "*{ margin:0; padding:0;}\nbody{font:12px/1.125 Arial,Helvetica,sans-serif;background:#fff;}\ntable{border-collapse:collapse;border-spacing:0;}\nli{list-style:none;}\nfieldset,img{border:0;}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\nq:before,q:after{content:'';}\na:focus,input,textarea{outline-style:none;}\ninput[type=\"text\"],input[type=\"password\"],textarea{outline-style:none;-webkit-appearance:none;}\ntextarea{resize:none}\naddress,caption,cite,code,dfn,em,i,th,var{font-style:normal;font-weight:normal;}\nlegend{color:#000;}\nabbr,acronym{border:0;font-variant:normal;}\na{color:#0a8cd2;text-decoration:none;}\na:hover{text-decoration:underline;}\n.clearfix:after{content:\".\";display:block;height:0;clear:both;visibility:hidden;}\n.clearfix{display:inline-block;}\n.clearfix{display:block;}\n.clear{clear:both;height:0;font:0/0 Arial;visibility:hidden;}\n.none{display:none}\n/* main */\n.mp-banner-slide{position:relative;width:980px;margin:0 auto;height:280px;*height:310px;*zoom:1;z-index:1;-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none;user-select:none}\n.mp-banner-slide .banner-next{right:0;left:auto;background-position:right 0}\n.mp-banner-slide .mp-banner-list{position:relative;width:100%;height:240px;margin:30px 0 20px;*zoom:1;z-index:1}\n.mp-banner-slide .mp-banner-list .item{position:absolute;box-shadow:0 5px 4px rgba(0,0,0,.3)}\n.mp-banner-slide .mp-banner-list .item img{width:100%;height:100%;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px}\n.mp-banner-slide .mp-banner-list .item span{position:absolute;bottom:0;left:0;height:30px;line-height:30px;font-size:16px}\n.mp-banner-slide .mp-banner-list .banner0{left:0;top:48px;height:160px;width:240px;z-index:92}\n.mp-banner-slide .mp-banner-list .banner1{top:24px;left:98px;height:200px;width:360px;z-index:96}\n.mp-banner-slide .mp-banner-list .banner2{top:0;left:235px;width:550px;height:240px;z-index:100}\n.mp-banner-slide .mp-banner-list .banner3{left:540px;top:24px;height:200px;width:360px;z-index:96}\n.mp-banner-slide .mp-banner-list .banner4{left:735px;top:48px;height:160px;width:240px;z-index:92}\n.mp-banner-slide .mp-banner-dots{text-align:center}\n.mp-banner-slide .mp-banner-dots .dot{background:#c3c3c3;width:10px;height:10px;margin:0 5px;display:inline-block;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}\n.mp-banner-slide .mp-banner-dots .dot-active{background:#FF7A01}\n\n.mp-line-opacity{width:100%;z-index:9;overflow:hidden;color:#fff;background-color:rgba(0,0,0,.5);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#80000000');text-align:center;zoom:1}\n.mp-opacity-white{background-color:rgba(255,255,255,.9);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9fffffff',endColorstr='#9fffffff')}\n:root .mp-line-opacity,:root .mp-opacity-white{filter:none\\9!important}"
  },
  {
    "path": "works/demo/06/index.html",
    "content": "<!doctype html>\n<html>\n\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<title></title>\n\t\t<link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" media=\"all\" />\n\t\t<script type=\"text/javascript\" src=\"/common/js/startmove.js\"></script>\n\t</head>\n\n\t<body>\n\t\t<div id=\"mp-banner\" class=\"mp-banner-slide\">\n\t\t\t<ul class=\"mp-banner-list\">\n\t\t\t\t<li class=\"item banner0\">\n\t\t\t\t\t<a target=\"_blank\">\n\t\t\t\t\t\t<img src=\"images/1.jpg\" alt=\"发光武器装备，限量免费放送，等你哟！\">\n\t\t\t\t\t\t<span class=\"mp-line-opacity\">发光武器装备，限量免费放送，等你哟！</span>\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t\t<li class=\"item banner1\">\n\t\t\t\t\t<a target=\"_blank\">\n\t\t\t\t\t\t<img src=\"images/2.jpg\" alt=\"暗黑战神-极速3D动作手游\">\n\t\t\t\t\t\t<span class=\"mp-line-opacity\">暗黑战神-极速3D动作手游</span>\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t\t<li class=\"item banner2\">\n\t\t\t\t\t<a target=\"_blank\">\n\t\t\t\t\t\t<img src=\"images/3.jpg\" alt=\"传奇安卓手游，不删档内侧\">\n\t\t\t\t\t\t<span class=\"mp-line-opacity\">传奇安卓手游，不删档内侧</span>\n\t\t\t\t\t</a>\n\t\t\t\t</li>\n\t\t\t\t<li class=\"item banner3\">\n\t\t\t\t\t<a target=\"_blank\">\n                <img src=\"images/4.jpg\" alt=\"本年度最热门手机游戏<<放开那三国>>\">\n                <span class=\"mp-line-opacity\">本年度最热门手机游戏&lt;&lt;放开那三国&gt;&gt;</span>\n            </a>\n\t\t\t\t</li>\n\t\t\t\t<li class=\"item banner4\">\n\t\t\t\t\t<a target=\"_blank\">\n                <img src=\"images/5.jpg\" alt=\"最受欢迎的手机游戏<<时空猎人(街机格斗)>>\">\n                <span class=\"mp-line-opacity\">最受欢迎的手机游戏&lt;&lt;时空猎人(街机格斗)&gt;&gt;</span>\n            </a>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<div id=\"dots\" class=\"mp-banner-dots\">\n\t\t\t\t<a class=\"dot\"></a>\n\t\t\t\t<a class=\"dot\"></a>\n\t\t\t\t<a class=\"dot dot-active\"></a>\n\t\t\t\t<a class=\"dot\"></a>\n\t\t\t\t<a class=\"dot\"></a>\n\t\t\t</div>\n\t\t</div>\n\t\t<script>\n\t\t\t(function() {\n\t\t\t\tvar box = document.getElementById('mp-banner'),\n\t\t\t\t\tli = document.getElementsByTagName('li'),\n\t\t\t\t\timg = document.getElementsByTagName('img'),\n\t\t\t\t\tdots = document.getElementById('mp-banner'),\n\t\t\t\t\tlinks = getElementsByClass('dot');\n\n\t\t\t\t//深克隆\n\t\t\t\tObject.prototype.clones = function() {\n\t\t\t\t\tvar o = {};\n\t\t\t\t\tfor (var i in this) {\n\t\t\t\t\t\to[i] = this[i];\n\t\t\t\t\t}\n\t\t\t\t\treturn o;\n\t\t\t\t};\n\t\t\t\tArray.prototype.clones = function() {\n\t\t\t\t\tvar arr = [];\n\t\t\t\t\tfor (var i = 0; i < this.length; i++)\n\t\t\t\t\t\tif (typeof this[i] !== 'object') {\n\t\t\t\t\t\t\tarr.push(this[i]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tarr.push(this[i].clones());\n\t\t\t\t\t\t}\n\t\t\t\t\treturn arr;\n\t\t\t\t};\n\n\t\t\t\t//封装一个循环队列\n\t\t\t\tfunction CircularQueue(arr) {\n\t\t\t\t\tthis.arr = arr || [];\n\t\t\t\t}\n\n\t\t\t\t//移除前一个，追加到最后\n\t\t\t\tCircularQueue.prototype.shift = function() {\n\t\t\t\t\t\tvar temp = this.arr.shift();\n\t\t\t\t\t\tthis.arr.push(temp);\n\t\t\t\t\t}\n\t\t\t\t\t//移除最后一个，追加到头部\n\t\t\t\tCircularQueue.prototype.unshift = function() {\n\t\t\t\t\t\tvar temp = this.arr.pop();\n\t\t\t\t\t\tthis.arr.unshift(temp);\n\t\t\t\t\t}\n\t\t\t\t\t//添加一个元素\n\t\t\t\tCircularQueue.prototype.add = function(obj) {\n\t\t\t\t\tthis.arr.push(obj);\n\t\t\t\t}\n\t\t\t\tvar queue = new CircularQueue();\n\n\t\t\t\t//初始化ARR数组\n\t\t\t\tfor (var i = 0; i < li.length; i++) {\n\n\t\t\t\t\tqueue.add({\n\t\t\t\t\t\ttop: parseInt(getStyle(li[i], 'top')),\n\t\t\t\t\t\tleft: parseInt(getStyle(li[i], 'left')),\n\t\t\t\t\t\twidth: parseInt(getStyle(li[i], 'width')),\n\t\t\t\t\t\theight: parseInt(getStyle(li[i], 'height')),\n\t\t\t\t\t\tzIndex: getStyle(li[i], 'z-index')\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//绑定事件\n\t\t\t\tfor (var j = 0; j < links.length; j++) {\n\t\t\t\t\tlinks[j].onmouseover = (function(j, len) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\t//鼠标一上去小点切换\n\t\t\t\t\t\t\tvar k = len - 1;\n\t\t\t\t\t\t\tfor (; k >= 0; k--) {\n\t\t\t\t\t\t\t\tlinks[k].className = 'dot';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlinks[j].className += ' dot-active';\n\n\t\t\t\t\t\t\t//替换大图片\n\t\t\t\t\t\t\tvar arr = getMiddleArr(j);\n\t\t\t\t\t\t\tupdateStyle(arr);\n\n\t\t\t\t\t\t}\n\t\t\t\t\t})(j, links.length);\n\t\t\t\t}\n\n\n\t\t\t\t//传递一个数，获取以该数为中心的数组，如原数组01234， 传递0 就为 34012\n\t\t\t\tfunction getMiddleArr(n) {\n\t\t\t\t\tvar len = n - 2;\n\t\t\t\t\tvar tempArr = new CircularQueue(queue.arr.clones());\n\t\t\t\t\tif (len >= 0) {\n\t\t\t\t\t\tfor (var i = 0; i < len; i++) {\n\t\t\t\t\t\t\ttempArr.shift();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfor (var i = 0; i < Math.abs(len); i++) {\n\t\t\t\t\t\t\ttempArr.unshift();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn tempArr.arr;\n\t\t\t\t}\n\n\t\t\t\t//调用动作函数绘制\n\t\t\t\tfunction updateStyle(arr) {\n\t\t\t\t\tfor (var i = 0; i < li.length; i++) {\n\t\t\t\t\t\tli[i].style.zIndex = arr[i].zIndex;\n\t\t\t\t\t\tstartMove(li[i], arr[i]);\n\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//获取CSS\n\t\t\t\tfunction getStyle(elem, name) {\n\t\t\t\t\tif (elem.style[name]) {\n\t\t\t\t\t\treturn elem.style[name];\n\t\t\t\t\t} else if (elem.currentStyle) {\n\t\t\t\t\t\treturn elem.currentStyle[name];\n\t\t\t\t\t} else if (document.defaultView && document.defaultView.getComputedStyle) {\n\t\t\t\t\t\t//W3C中为textAlign样式，转为text-align\n\t\t\t\t\t\tname = name.replace(/([A-Z])/g, \"-$1\");\n\t\t\t\t\t\tname = name.toLowerCase();\n\t\t\t\t\t\tvar s = document.defaultView.getComputedStyle(elem, \"\");\n\t\t\t\t\t\treturn s && s.getPropertyValue(name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfunction getElementsByClass(className) {\n\t\t\t\t\tif (typeof document.getElementsByClassName === 'function') {\n\t\t\t\t\t\treturn document.getElementsByClassName(className);\n\t\t\t\t\t}\n\t\t\t\t\t//如果不支持getElementsByClassName函数\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar allDoms = document.getElementsByTagName(\"*\");\n\t\t\t\t\t\tvar result = [];\n\t\t\t\t\t\tfor (var i = 0, len = allDoms.length; i < len; i++) {\n\t\t\t\t\t\t\tif (allDoms[i].className.indexOf(className) > -1) {\n\t\t\t\t\t\t\t\tresult.push(allDoms[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfunction converToArray(nodes) {\n\t\t\t\t\tvar array = null;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tarray = Array.prototype.slice.call(nodes, 0); //针对非IE浏览器         \n\t\t\t\t\t} catch (ex) {\n\t\t\t\t\t\tarray = new Array();\n\t\t\t\t\t\tfor (var i = 0, len = nodes.length; i < len; i++) {\n\t\t\t\t\t\t\tarray.push(nodes[i])\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn array;\n\t\t\t\t}\n\n\n\n\n\t\t\t})();\n\t\t</script>\n\t</body>\n\n</html>"
  },
  {
    "path": "works/demo/07/css/main.css",
    "content": "*{ margin:0; padding:0;}\nbody{font:12px/1.125 Arial,Helvetica,sans-serif;background:#fff;}\ntable{border-collapse:collapse;border-spacing:0;}\nli{list-style:none;}\nfieldset,img{border:0;}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\nq:before,q:after{content:'';}\na:focus,input,textarea{outline-style:none;}\ninput[type=\"text\"],input[type=\"password\"],textarea{outline-style:none;-webkit-appearance:none;}\ntextarea{resize:none}\naddress,caption,cite,code,dfn,em,i,th,var{font-style:normal;font-weight:normal;}\nlegend{color:#000;}\nabbr,acronym{border:0;font-variant:normal;}\na{color:#0a8cd2;text-decoration:none;}\na:hover{text-decoration:underline;}\n.clearfix:after{content:\".\";display:block;height:0;clear:both;visibility:hidden;}\n.clearfix{display:inline-block;}\n.clearfix{display:block;}\n.clear{clear:both;height:0;font:0/0 Arial;visibility:hidden;}\n.none{display:none}\n/* main */\n.main-promo{margin:50px auto;width:711px;height:342px;position:relative; overflow:hidden;}\n.main-promo .switch-items{height:36px;position:absolute;left:0;bottom:0;width:711px;overflow:hidden;z-index:1}\n.main-promo .switch-item{width:156px;height:36px;padding:0 10px;text-align:center;line-height:36px;margin-left:1px;color:white;cursor:pointer;float:left;font-size:12px;overflow:hidden;background:black;background:rgba(0,0,0,0.7);filter:alpha(opacity=70);-ms-filter:\"alpha(opacity=70)\"}\n.main-promo .first-item{margin-left:0}\n.main-promo .active-switch-item{background:red;background:rgba(255,0,0,0.7);filter:alpha(opacity=70);-ms-filter:\"alpha(opacity=70)\"}\n.main-promo .main-item{position:absolute;left:0;top:0;width:711px;height:342px}\n.main-promo .main-item img{width:711px;height:342px}\n\n\n"
  },
  {
    "path": "works/demo/07/index.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>百度微购-图片轮换</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" media=\"all\"/>\n\t<script src=\"/common/js/startmove.js\"></script>\n</head>\n<body>\n<div id=\"box\" class=\"main-promo\">\n    <div id=\"bar\" class=\"switch-items\">\n        <div class=\"switch-item active-switch-item\">聚蟹客 中秋好礼</div>\n        <div class=\"switch-item\">赚网 相思惠明月</div>\n        <div class=\"switch-item\">草莓网 彩妆大促</div>\n        <div class=\"switch-item\">中秋送礼 浓情促销</div>\n    </div>\n    <a class=\"main-item\" target=\"_blank\" href=\"#\"><img src=\"images/1.jpg\"></a>\n    <a class=\"main-item\" target=\"_blank\" href=\"#\"><img src=\"images/2.jpg\"></a>\n    <a class=\"main-item\" target=\"_blank\" href=\"#\"><img src=\"images/3.jpg\"></a>\n    <a class=\"main-item\" target=\"_blank\" href=\"#\"><img src=\"images/4.jpg\"></a>\n</div>\n<script>\n\tvar box = document.getElementById('box');\n\tvar switches = document.getElementById('bar').getElementsByTagName('div');\n\tvar items = document.getElementsByTagName('a');\n\tvar timer = null;\n\tvar flag = 1;\n\t\n\t\n\tfor(var i = 0;i < switches.length;i++) {\n\t\tswitches[i].onmouseover =(function(i){\n\t\t\treturn function() {\n\t\t\t\tshowCur(i)\n\t\t\t}\n\t\t})(i);\n\t}\n\t\n\tfunction showCur(i) {\n\t\tfor (var j = 0;j < switches.length; j++) {\n\t\t\tswitches[j].className = 'switch-item';\n\t\t\tstartMove(items[j], {opacity : 0});\n\t\t}\n\t\tstartMove(items[i], {opacity : 100})\n\t\tswitches[i].className +=  ' active-switch-item';\n\t}\n\t\n\ttimerChange();\n\t\n\tfunction timerChange() {\n\t\ttimer = setInterval(function() {\n\t\t\tif(flag > switches.length-1) flag = 0;\n\t\t\tshowCur(flag);\n\t\t\tflag++;\n\t\t},1000);\n\t}\n\t\n\tbox.onmouseover = function() {\n\t\tclearInterval(timer);\n\t}\n\t\n\tbox.onmouseout= function() {\n\t\ttimerChange();\n\t}\n</script>\n</body>\n</html>"
  },
  {
    "path": "works/demo/08/css/main.css",
    "content": "*{ margin:0; padding:0;}\nbody{font:12px/1.125 Arial,Helvetica,sans-serif;background:#fff;}\ntable{border-collapse:collapse;border-spacing:0;}\nli{list-style:none;}\nfieldset,img{border:0;}\narticle,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}\nq:before,q:after{content:'';}\na:focus,input,textarea{outline-style:none;}\ninput[type=\"text\"],input[type=\"password\"],textarea{outline-style:none;-webkit-appearance:none;}\ntextarea{resize:none}\naddress,caption,cite,code,dfn,em,i,th,var{font-style:normal;font-weight:normal;}\nlegend{color:#000;}\nabbr,acronym{border:0;font-variant:normal;}\na{color:#0a8cd2;text-decoration:none;}\na:hover{text-decoration:underline;}\n.clearfix:after{content:\".\";display:block;height:0;clear:both;visibility:hidden;}\n.clearfix{display:inline-block;}\n.clearfix{display:block;}\n.clear{clear:both;height:0;font:0/0 Arial;visibility:hidden;}\n.none{display:none}\n/* main */\n.navigator{background:#d22636;font-size:14px; margin-top:120px;height:40px;min-width:1200px;}\n.navigator-inner{margin:0 auto;width:1200px}\n.navigator-items{font-weight:bold;height:40px}\n.all-cate{background:none repeat scroll 0 0 #c2202f;font-weight:bold;height:40px;position:relative;z-index:121}\n.all-cate .navigator-item{position:absolute}\n.col-15{width:240px;box-sizing:border-box}\n.navigator-items .navigator-item{color:#fff;line-height:40px}\n\n\n.ui-menu{position:absolute;font-size:12px;color:#333;top:40px;left:0px;font-weight:normal;}\n.topic_index .ui-menu{display:block}\n.widget-menu{z-index:2000}\n.ui-menu-main{background-color:#ebebeb;border-radius:0 0 10px 10px}\n.widget-menu .ui-menu-main{background-color:#fff}\n.ui-menu-body{padding:0 1px;line-height:23px}\n.ui-menu-body ul{border:2px solid #bb0f11;border-top:none;border-radius:0 0 10px 10px}\n.widget-menu .ui-menu-body ul{width:236px;margin-left:-1px;background-color:#fff;z-index:10}\n.ui-menu-item{display:block;zoom:1;height:60px;overflow:hidden;position:relative}\n.widget-menu .ui-menu-item{height:30px;padding:2px}\n.last-ui-menu-item{border-radius:0 0 10px 10px}\n.widget-menu .ui-menu-item-expand{height:52px;background-color:#fffdfe;padding:0;border:1px solid #dadada;margin:1px}\n.ui-menu-item-expand-entrance{background:url(http://bs.baidu.com/weigou-baidu-com/8558c5fc64976a754c5015a62527935a.png) no-repeat;_background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='http://bs.baidu.com/weigou-baidu-com/8558c5fc64976a754c5015a62527935a.png',sizingMethod='scale');position:absolute;right:10px;top:13px;height:12px;width:10px;overflow:hidden}\n.widget-menu .ui-menu-item-expand-entrance{background:url('http://bs.baidu.com/weigou-baidu-com/9c1df518a67d4f1d38a3f8beb6cb00b4.gif');width:7px;height:10px}\n.widget-menu .ui-menu-item-expand .ui-menu-item-expand-entrance{background:url('http://bs.baidu.com/weigou-baidu-com/9c9bee73bb3518898ee9ce06609e3faa.gif')}\n.ui-menu-item h3{color:#333;overflow:hidden;height:20px;line-height:20px;font-size:14px;padding-left:10px;margin-top:5px}\n.ui-menu-tinysub{margin:6px 10px 0}\n.widget-menu .ui-menu-tinysub{display:none}\n.widget-menu .ui-menu-item-expand .ui-menu-tinysub{display:block;margin:2px 10px 4px}\n.ui-menu-item b{float:left;width:16px;height:16px;background:#000;margin-top:2px}\n.ui-menu-item h3 span{float:left;line-height:20px;margin-left:10px;font-weight:bold;font-size:12px}\n.ui-menu-header-wrapper{position:relative;float:left}\n.ui-menu-header-text{margin-left:0!important}\n.ui-menu-tiny-a-wrapper{position:relative;margin-right:7px}\n.ui-menu-tiny-a{display:inline-block;color:#989898;line-height:23px}\n.ui-menu-tiny-a-bold{font-weight:bold}\n.ui-menu-header-wrapper a{color:#333}\n.ui-item-hover{background:#d22636;color:#fff;margin-left:-1px;margin-right:-1px;padding-left:1px;padding-right:1px}\n.widget-menu .ui-item-hover{background:inherit;color:#333;border:1px solid #d22636;border-right:0;box-shadow:-1px 2px #e3e3e3;z-index:11}\n.widget-menu .ui-item-hover a{color:#989898}\n.widget-menu .ui-item-hover h3,.widget-menu .ui-item-hover h3 a{color:#333}\n.ui-item-hover h3,.ui-item-hover a{color:#fff}\n.ui-item-hover .ui-menu-item-expand-entrance{display:none}\n.widget-menu .ui-item-hover .ui-menu-item-expand-entrance{display:block}\n.ui-menu-sub{overflow:hidden;width:0;position:absolute;top:0;left:236px;z-index:10;background:#fff}\n.ui-sub-item{display:none;border:1px solid #d22636;zoom:1}\n.sub-item-show{display:block}\n.sub-section{overflow:hidden;border-top:1px solid #eee;margin:0 30px;width:582px}\n.sub-section-first{border-top:0}\n.sub-section-title{float:left;font-weight:bold;width:82px;line-height:20px;margin:20px 0;position:relative;text-align:center}\n.sub-section-title a{color:#d22636}\n.sub-section-body-wrapper{overflow:hidden;float:left;width:500px;padding-top:20px;margin-bottom:15px}\n.sub-section-body{float:left;line-height:20px;margin:4px 0 0 -4px;_margin-top:2px}\n.sub-link-wrapper{margin-bottom:12px;*padding-bottom:12px;*margin-bottom:0;float:left;white-space:nowrap}\n.sub-link-a-wrapper{float:left;position:relative;margin:0 6px}\n.sub-seperator{float:left;width:1px;height:12px;_height:14px;overflow:hidden;background:#ccc}\n.sub-link{color:#000;float:left;height:12px;line-height:12px;*height:14px;*line-height:14px;white-space:nowrap}\n.menu-tag{position:absolute;right:-19px;top:-12px;z-index:2}\n.menu-tag-text{color:#fff;height:12px;line-height:12px;overflow:hidden;padding:0 1px;background:#d22535;font-family:simsun}\n.menu-tag-line{height:1px;overflow:hidden}\n.menu-tag-2px{width:2px;background:#d22535}\n.menu-tag-1px{width:1px;background:#d22535}\n.ui-menu-header b{background:url('http://bs.baidu.com/weigou-baidu-com/210491fd835ab78d626611b0621fbae7.png');width:17px;height:17px}\n.ui-menu-header-0 b{background-position:-1px 0}\n.widget-menu .ui-menu-item-expand .ui-menu-header-0 b{background-position:-20px 0}\n.ui-menu-header-1 b{background-position:-1px -17px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-1 b{background-position:-20px -17px}\n.ui-menu-header-2 b{background-position:-1px -34px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-2 b{background-position:-20px -34px}\n.ui-menu-header-3 b{background-position:-1px -51px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-3 b{background-position:-20px -51px}\n.ui-menu-header-4 b{background-position:-1px -68px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-4 b{background-position:-20px -68px}\n.ui-menu-header-5 b{background-position:-1px -85px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-5 b{background-position:-20px -85px}\n.ui-menu-header-6 b{background-position:-1px -102px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-6 b{background-position:-20px -102px}\n.ui-menu-header-7 b{background-position:-1px -119px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-7 b{background-position:-20px -119px}\n.ui-menu-header-8 b{background-position:-1px -136px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-8 b{background-position:-20px -136px}\n.ui-menu-header-9 b{background-position:-1px -153px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-9 b{background-position:-20px -153px}\n.ui-menu-header-10 b{background-position:-1px -170px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-10 b{background-position:-20px -170px}\n.ui-menu-header-11 b{background-position:-1px -187px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-11 b{background-position:-20px -187px}\n.ui-menu-header-12 b{background-position:-1px -204px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-12 b{background-position:-20px -204px}\n.ui-menu-header-13 b{background-position:-1px -221px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-13 b{background-position:-20px -221px}\n.ui-menu-header-14 b{background-position:-1px -238px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-14 b{background-position:-20px -238px}\n.ui-menu-header-15 b{background-position:-1px -255px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-15 b{background-position:-20px -255px}\n.ui-menu-header-16 b{background-position:-1px -272px}\n.widget-menu .ui-menu-item-expand .ui-menu-header-16 b{background-position:-20px -272px}\n.sub-section-title .menu-tag{top:-8px}\n.menu-tag-NEW .menu-tag-text{background:#71bd63}\n.menu-tag-NEW .menu-tag-2px{background:#71bd63}\n.menu-tag-NEW .menu-tag-1px{background:#71bd63}\n.ui-item-hover .menu-tag-text{background:#FFF;color:#d22636}\n.ui-item-hover .menu-tag-2px{background:#FFF}\n.ui-item-hover .menu-tag-1px{background:#FFF}"
  },
  {
    "path": "works/demo/08/index.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>全部商品分类</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/main.css\" media=\"all\"/>\n</head>\n<body>\n<!--http://weigou.baidu.com/-->\n<div class=\"navigator topic_index\">\n    <div class=\"navigator-inner\">\n        <div class=\"navigator-items\">\n            <div class=\"all-cate col-15\">\n                <a style=\"text-indent:15px; text-align:left\" class=\"navigator-item col-15\" target=\"_blank\" href=\"/\">全部商品分类</a>\n                <div id=\"navigator-menu\" class=\"ui-menu widget-menu\">\n                    <div class=\"ui-menu-main col-15\">\n                        <div class=\"ui-menu-body\">\n                            <ul>\n                                <li class=\"ui-menu-item\" data-index=\"0\">\n                                    <span class=\"ui-menu-item-expand-entrance\"></span>\n                                    <h3 class=\"ui-menu-header ui-menu-header-0\">\n                                        <b></b>\n                                        <span>\n                                            <div class=\"ui-menu-header-wrapper\">\n                                                <span class=\"ui-menu-header-text\">\n                                                    <a href=\"/topic/food?from=nav\" target=\"_blank\">\n                                                        食品保健\n                                                    </a>\n                                                </span>\n                                            </div>\n                                        </span>\n                                    </h3>\n                                    <div class=\"ui-menu-tinysub\">\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1007861\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                巧克力\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1007468\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                酒类\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1007862\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                坚果\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1007791\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                蜜饯\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1007210\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                保健品\n                                            </a>\n                                        </span>\n                                    </div>\n                                </li>\n                                <li class=\"ui-menu-item\" data-index=\"1\">\n                                    <span class=\"ui-menu-item-expand-entrance\"></span>\n                                    <h3 class=\"ui-menu-header ui-menu-header-1\">\n                                        <b></b>\n                                        <span>\n                                            <div class=\"ui-menu-header-wrapper\">\n                                                <span class=\"ui-menu-header-text\">\n                                                    <a href=\"/category?id=1014303\" target=\"_blank\">\n                                                        文化玩乐\n                                                    </a>\n                                                </span>\n                                            </div>\n                                        </span>\n                                    </h3>\n                                    <div class=\"ui-menu-tinysub\">\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1008448\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                宠物食品用品\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1008638\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                个性定制\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1008817\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                古玩字画\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1008951\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                乐器\n                                            </a>\n                                        </span>\n                                    </div>\n                                </li>\n                                <li class=\"ui-menu-item\" data-index=\"2\">\n                                    <span class=\"ui-menu-item-expand-entrance\"></span>\n                                    <h3 class=\"ui-menu-header ui-menu-header-2\">\n                                        <b></b>\n                                        <span>\n                                            <div class=\"ui-menu-header-wrapper\">\n                                                <span class=\"ui-menu-header-text\">\n                                                    <a href=\"/category?id=1003484\" target=\"_blank\">\n                                                        家装建材\n                                                    </a>\n                                                </span>\n                                            </div>\n                                        </span>\n                                    </h3>\n                                    <div class=\"ui-menu-tinysub\">\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1004582\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                五金工具\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1003666\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                基础建材\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1003485\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                电子电工\n                                            </a>\n                                        </span>\n                                    </div>\n                                </li>\n                                <li class=\"ui-menu-item\" data-index=\"3\">\n                                    <span class=\"ui-menu-item-expand-entrance\"></span>\n                                    <h3 class=\"ui-menu-header ui-menu-header-3\">\n                                        <b></b>\n                                        <span>\n                                            <div class=\"ui-menu-header-wrapper\">\n                                                <span class=\"ui-menu-header-text\">\n                                                    <a href=\"/topic/beauty?from=nav\" target=\"_blank\">\n                                                        美妆个护\n                                                    </a>\n                                                </span>\n                                            </div>\n                                        </span>\n                                    </h3>\n                                    <div class=\"ui-menu-tinysub\">\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1001647\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                面膜\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1001632\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                洁面\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1001650\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                面霜\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1001581\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                BB霜\n                                            </a>\n                                        </span>\n                                        <span class=\"ui-menu-tiny-a-wrapper\">\n                                            <a href=\"/category?id=1001600\" target=\"_blank\" class=\"ui-menu-tiny-a ui-menu-tiny-a-\">\n                                                香水\n                                            </a>\n                                        </span>\n                                    </div>\n                                </li>\n                            </ul>\n                            <div class=\"ui-menu-sub\">\n                                <div class=\"ui-sub-item\" data-index=\"0\">\n                                    <div class=\"sub-section  sub-section-first\">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1007782\" target=\"_blank\">\n                                                    休闲零食\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007861\">\n                                                            巧克力\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007876\">\n                                                            核桃\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007882\">\n                                                            腰果\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007872\">\n                                                            花生\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007881\">\n                                                            杏仁\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007869\">\n                                                            瓜子\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007873\">\n                                                            开心果\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007877\">\n                                                            松子\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007899\">\n                                                            鱿鱼\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007896\">\n                                                            虾系列\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007897\">\n                                                            蟹系列\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007898\">\n                                                            鱼系列\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007894\">\n                                                            海苔\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007859\">\n                                                            猪肉类\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007854\">\n                                                            牛肉干\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007888\">\n                                                            糖果\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007887\">\n                                                            口香糖\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007886\">\n                                                            布丁\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007808\">\n                                                            芒果干\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007814\">\n                                                            葡萄干\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007826\">\n                                                            香蕉干\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007810\">\n                                                            梅类制品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007799\">\n                                                            哈密瓜\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007820\">\n                                                            蔬果干\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007831\">\n                                                            枣类制品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007785\">\n                                                            传统糕点\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007788\">\n                                                            西式糕点\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007786\">\n                                                            膨化食品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007784\">\n                                                            饼干\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1007210\" target=\"_blank\">\n                                                    营养保健\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007329\">\n                                                            氨基酸\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007220\">\n                                                            乳清蛋白\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007261\">\n                                                            益生菌\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007396\">\n                                                            维生素C\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007266\">\n                                                            膳食纤维\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007227\">\n                                                            蜂胶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007275\">\n                                                            铁\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007285\">\n                                                            叶酸\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007270\">\n                                                            B族维生素\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007281\">\n                                                            维生素E\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007274\">\n                                                            钙铁锌\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007533\">\n                                                            阿胶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007539\">\n                                                            人参\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007656\">\n                                                            枸杞\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007617\">\n                                                            燕窝\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007545\">\n                                                            冬虫夏草\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007638\">\n                                                            胖大海\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007621\">\n                                                            百合\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007635\">\n                                                            罗汉果\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007562\">\n                                                            鹿茸\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007555\">\n                                                            灵芝\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007549\">\n                                                            蜂胶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007552\">\n                                                            蜂王浆\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1007446\" target=\"_blank\">\n                                                    茶酒饮料\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007450\">\n                                                            红茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007454\">\n                                                            绿茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007465\">\n                                                            乌龙茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007451\">\n                                                            花草茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007449\">\n                                                            黑茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007448\">\n                                                            白茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007453\">\n                                                            黄茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007455\">\n                                                            普洱茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007464\">\n                                                            水果茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007472\">\n                                                            葡萄酒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007469\">\n                                                            白酒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007475\">\n                                                            药酒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007470\">\n                                                            黄酒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007471\">\n                                                            啤酒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007474\">\n                                                            洋酒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007518\">\n                                                            果蔬汁\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007529\">\n                                                            碳酸饮料\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007517\">\n                                                            功能饮料\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007515\">\n                                                            茶饮料\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007527\">\n                                                            酸梅汤\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007516\">\n                                                            牛奶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007480\">\n                                                            豆浆\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007483\">\n                                                            姜汤\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007485\">\n                                                            奶茶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007494\">\n                                                            芝麻糊\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007490\">\n                                                            藕粉\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007481\">\n                                                            豆奶\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007509\">\n                                                            咖啡粉\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007508\">\n                                                            咖啡豆\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1007511\">\n                                                            速溶咖啡\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"ui-sub-item\" data-index=\"1\">\n                                    <div class=\"sub-section  sub-section-first\">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1008448\" target=\"_blank\">\n                                                    宠物食品用品\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008558\">\n                                                            猫粮\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008478\">\n                                                            狗粮\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008595\">\n                                                            水族世界\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008449\">\n                                                            仓鼠及其他宠物\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008462\">\n                                                            宠物服饰及配件\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008489\">\n                                                            猫狗美容清洁\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008519\">\n                                                            猫狗日用品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008543\">\n                                                            猫狗玩具\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008571\">\n                                                            鸟类及用品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008578\">\n                                                            爬虫及用品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008627\">\n                                                            兔类及用品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1008638\" target=\"_blank\">\n                                                    个性定制\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008640\">\n                                                            服装定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008655\">\n                                                            帽子定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008661\">\n                                                            配饰定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008665\">\n                                                            箱包定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008672\">\n                                                            鞋类定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008680\">\n                                                            图案印制类\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008690\">\n                                                            杯子定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008698\">\n                                                            笔记本定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008699\">\n                                                            餐具定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008707\">\n                                                            个性台历\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008713\">\n                                                            居家装饰\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008777\">\n                                                            饰品定制\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008738\">\n                                                            设计服务\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1008817\" target=\"_blank\">\n                                                    古玩字画\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008827\">\n                                                            古瓷器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008915\">\n                                                            文房四宝\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008929\">\n                                                            邮品\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008936\">\n                                                            玉器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008941\">\n                                                            书画\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008819\">\n                                                            磁卡\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008836\">\n                                                            老紫砂\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008853\">\n                                                            连环画\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1008951\" target=\"_blank\">\n                                                    乐器\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008952\">\n                                                            MIDI乐器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008968\">\n                                                            大提琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008969\">\n                                                            低音提琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008970\">\n                                                            笛子\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008972\">\n                                                            电子琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008973\">\n                                                            儿童乐器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008983\">\n                                                            二胡\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008984\">\n                                                            风琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1008985\">\n                                                            钢琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009009\">\n                                                            古琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009010\">\n                                                            古筝\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009011\">\n                                                            葫芦丝\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009042\">\n                                                            京胡\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009043\">\n                                                            口风琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009044\">\n                                                            口琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009017\">\n                                                            吉他配件\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009064\">\n                                                            乐器配件\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009097\">\n                                                            乐器音箱\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009109\">\n                                                            锣\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009121\">\n                                                            民族吹奏乐器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009131\">\n                                                            民族弹拨乐器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009144\">\n                                                            民族拉弦乐器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009199\">\n                                                            萨克斯风\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009200\">\n                                                            手风琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009217\">\n                                                            小提琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1009218\">\n                                                            中提琴\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"ui-sub-item\" data-index=\"2\">\n                                    <div class=\"sub-section  sub-section-first\">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1004582\" target=\"_blank\">\n                                                    五金工具\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004586\">\n                                                            电动扳手\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004597\">\n                                                            电剪\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004609\">\n                                                            电钻\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004616\">\n                                                            抛光机\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004612\">\n                                                            角磨机\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004635\">\n                                                            变速机\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004660\">\n                                                            发电机\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004645\">\n                                                            电热设备\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004714\">\n                                                            阀门\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004727\">\n                                                            滚动轴承\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004769\">\n                                                            插销\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1005146\">\n                                                            剪\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004783\">\n                                                            合页\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004869\">\n                                                            锁具\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1005275\">\n                                                            仪器仪表\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1003666\" target=\"_blank\">\n                                                    基础建材\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003667\">\n                                                            板材\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003678\">\n                                                            玻璃\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003703\">\n                                                            钢材\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003716\">\n                                                            隔热材料\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003838\">\n                                                            水管管材\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003888\">\n                                                            砖\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003761\">\n                                                            防护服\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1012559\">\n                                                            防护口罩\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1010903\">\n                                                            防护手套\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1003910\" target=\"_blank\">\n                                                    家装主材\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003926\">\n                                                            厨柜\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004204\">\n                                                            淋浴房\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004271\">\n                                                            浴缸\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004276\">\n                                                            坐便器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003918\">\n                                                            厨房挂件\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003983\">\n                                                            地板\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004004\">\n                                                            暖气\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003959\">\n                                                            灯具灯饰\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004086\">\n                                                            晾衣架/晾衣杆\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004107\">\n                                                            门\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004165\">\n                                                            墙纸\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004182\">\n                                                            涂料\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004286\">\n                                                            油漆\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1003485\" target=\"_blank\">\n                                                    电子电工\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003503\">\n                                                            插座\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003533\">\n                                                            电线\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003617\">\n                                                            开关\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003639\">\n                                                            消防报警设备\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003515\">\n                                                            底盒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1003542\">\n                                                            断路器\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1004362\" target=\"_blank\">\n                                                    商业办公\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004364\">\n                                                            办公柜\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004372\">\n                                                            办公椅\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004382\">\n                                                            办公桌\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004402\">\n                                                            会客沙发茶几\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004407\">\n                                                            接待台\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004416\">\n                                                            餐饮烘焙家具\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004430\">\n                                                            超市家具\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1004530\">\n                                                            酒店家具\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"ui-sub-item\" data-index=\"3\">\n                                    <div class=\"sub-section  sub-section-first\">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1014144\" target=\"_blank\">\n                                                    面部护肤\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001632\">\n                                                            洁面\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001631\">\n                                                            化妆水/爽肤水\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001647\">\n                                                            面膜/面膜粉\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001645\">\n                                                            精华\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001650\">\n                                                            乳液/面霜\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001655\">\n                                                            眼部护理\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001629\">\n                                                            唇部护理\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001628\">\n                                                            T区护理\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1014149\">\n                                                            精油\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001644\">\n                                                            护肤套装\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1014147\" target=\"_blank\">\n                                                    彩妆\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001653\">\n                                                            卸妆\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001630\">\n                                                            防晒\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001588\">\n                                                            隔离/妆前/打底\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001581\">\n                                                            BB霜/CC霜\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001587\">\n                                                            粉底液/膏\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001604\">\n                                                            遮瑕\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001594\">\n                                                            蜜粉/散粉\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001586\">\n                                                            粉饼\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001597\">\n                                                            腮红/胭脂\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001593\">\n                                                            眉部彩妆\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001599\">\n                                                            双眼皮贴/胶水\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001603\">\n                                                            眼影\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001602\">\n                                                            眼线\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001592\">\n                                                            睫毛膏/睫毛增长液\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001584\">\n                                                            唇彩/唇蜜\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001585\">\n                                                            唇膏/口红\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001583\">\n                                                            唇笔/唇线笔\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001605\">\n                                                            美甲\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001582\">\n                                                            彩妆套装/彩妆盘\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                    <div class=\"sub-section \">\n                                        <div class=\"sub-section-title\">\n                                            <span>\n                                                <a href=\"/category?id=1014134\" target=\"_blank\">\n                                                    身体护理\n                                                </a>\n                                            </span>\n                                        </div>\n                                        <div class=\"sub-section-body-wrapper\">\n                                            <div class=\"sub-section-body\">\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1014212\">\n                                                            洗发\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000625\">\n                                                            护发素/乳\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000623\">\n                                                            发膜\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000622\">\n                                                            身体去角质\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000655\">\n                                                            沐浴液\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000640\">\n                                                            润肤\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000651\">\n                                                            牙刷/牙线\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000641\">\n                                                            漱口水\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001652\">\n                                                            手部护理\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000653\">\n                                                            足部护理\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1014137\">\n                                                            头发造型\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1014136\">\n                                                            烫发染发\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1014139\">\n                                                            假发/假发配件\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1001654\">\n                                                            美胸\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1014214\">\n                                                            纤体\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000643\">\n                                                            私密护理\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1012469\">\n                                                            脱毛护理\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                                <span class=\"sub-link-wrapper\">\n                                                    <span class=\"sub-seperator\">\n                                                    </span>\n                                                    <span class=\"sub-link-a-wrapper\">\n                                                        <a class=\"sub-link\" target=\"_blank\" href=\"/category?id=1000616\">\n                                                            卫生巾/护垫/成人尿裤\n                                                        </a>\n                                                    </span>\n                                                </span>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n<script>\n(function () {\n\tvar li = document.getElementsByTagName('li');\n    var ul = document.getElementsByTagName('ul')[0];\n    var menu = ul.parentNode.children[1];\n    var items = menu.children;\n    var pattenUL  = /ui-item-hover/g;\n     \n\tfor (var i = 0; i < li.length; i++) {\n\t\tli[i].onmouseover = (function(i) {\n            return function() {\n                menu.style.cssText = 'height: auto; width: auto; top: 0px;';\n\n                for (var j = 0; j < li.length; j++) {\n                    li[j].className = 'ui-menu-item'\n\n\n\n                    items[j].className = 'ui-sub-item';\n                }\n               \n                this.className += ' ui-item-hover ui-menu-item-expand'\n                items[i].className += '  sub-item-show';\n            }\n        })(i);\n        \n        \n         li[i].onmouseout = (function(i) {\n            return function() {\n                menu.style.cssText = 'height: auto; width: 0px; top: 0px;';\n\n                for (var j = 0; j < li.length; j++) {\n                    li[j].className = 'ui-menu-item';\n\n                    items[j].className = 'ui-sub-item';\n                }\n               \n                this.className += ' ui-menu-item-expand';\n               \n            }\n        })(i)\n    }\n\n\n    \n})();\n</script>\n</body>\n</html>"
  },
  {
    "path": "works/demo/ali/actor.html",
    "content": "<!DOCTYPE html>\n<!-- saved from url=(0023)http://awdc.aliyun.com/ -->\n<html>\n\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta name=\"viewport\" content=\"width=1024\">\n\t\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=EmulateIE7\">\n\t\t<title>AWDC - 阿里云开发者大会</title>\n\n\n\t\t<link rel=\"stylesheet\" href=\"./file/overview.css\" type=\"text/css\">\n\n\t\t<link rel=\"stylesheet\" href=\"./file/index_2.css\" type=\"text/css\">\n\t\t<link rel=\"stylesheet\" href=\"./file/index_3.css\" type=\"text/css\">\n\n\t\t<style>\n\t\t\tul {\n\t\t\t\tpadding: 0;\n\t\t\t}\n\t\t\timg {\n\t\t\t\topacity: 0.5;\n\t\t\t\tfilter: Alpha(Opacity=50);\n\t\t\t}\n\t\t\t#index_3 li {\n\t\t\t\tcursor: default;\n\t\t\t}\n\t\t\t#index_3 {\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t#index_3 .owl-controls {\n\t\t\t\tposition: absolute;\n\t\t\t\tbottom: 20px;\n\t\t\t\tmargin-top: 0;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\t#index_3 .owl-dots {\n\t\t\t\tdisplay: inline-block\n\t\t\t}\n\t\t\t.owl-stage {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t}\n\t\t</style>\n\t\t<script src=\"startmove.js\"></script>\n\t</head>\n\n\t<body class=\"overview strength\" id=\"overview\">\n\n\n\t\t<section id=\"smart\" class=\"slide page3 ac-responsive\">\n\n\t\t\t<ul id=\"index_3\" class=\"owl-carousel owl-theme owl-loaded\">\n\n\n\t\t\t\t<div class=\"owl-stage-outer\" style=\"padding-left: 0px; padding-right: 0px;\">\n\t\t\t\t\t<div class=\"owl-stage\">\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1EK1qGXXXXXXDXFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"章文嵩\">\n\t\t\t\t\t\t\t\t<h1>章文嵩</h1>\n\t\t\t\t\t\t\t\t<h2>阿里云 高级研究员</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1RymqGXXXXXcAXpXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"蔡浩宇\">\n\t\t\t\t\t\t\t\t<h1>蔡浩宇</h1>\n\t\t\t\t\t\t\t\t<h2>米哈游CEO兼《崩坏学园2》制作人</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1K2euGXXXXXcFXXXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"Peter\">\n\t\t\t\t\t\t\t\t<h1>Peter</h1>\n\t\t\t\t\t\t\t\t<h2>“愤怒的小鸟”（Rovio）CMO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1PYCqGXXXXXanXFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"樊振华\">\n\t\t\t\t\t\t\t\t<h1>樊振华</h1>\n\t\t\t\t\t\t\t\t<h2>天弘基金创新支持部总经理</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1_ByrGXXXXXbEXpXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"徐敏\">\n\t\t\t\t\t\t\t\t<h1>徐敏</h1>\n\t\t\t\t\t\t\t\t<h2>杭州安存网络科技有限公司 CEO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1zqZpFVXXXXX0XFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"王坚\">\n\t\t\t\t\t\t\t\t<h1>王坚</h1>\n\t\t\t\t\t\t\t\t<h2>阿里巴巴集团CTO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1OogrFVXXXXXZXXXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"王文彬\">\n\t\t\t\t\t\t\t\t<h1>王文彬</h1>\n\t\t\t\t\t\t\t\t<h2>阿里云计算公司总裁</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1t2csFVXXXXXLXXXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"陈宇红\">\n\t\t\t\t\t\t\t\t<h1>陈宇红</h1>\n\t\t\t\t\t\t\t\t<h2>中软国际有限公司董事长</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1SdonFVXXXXccXpXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"章苒\">\n\t\t\t\t\t\t\t\t<h1>章苒</h1>\n\t\t\t\t\t\t\t\t<h2>新华社浙江分社记者对外采访室主任</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1sGhRFVXXXXa_XFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"吕钢锋\">\n\t\t\t\t\t\t\t\t<h1>吕钢锋</h1>\n\t\t\t\t\t\t\t\t<h2>杭州云栖小镇管委会主任</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1CUo3FVXXXXaLXpXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"陈向明\">\n\t\t\t\t\t\t\t\t<h1>陈向明</h1>\n\t\t\t\t\t\t\t\t<h2>浙江银杏谷基金总裁</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB15F30FVXXXXbvXFXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"刘江\">\n\t\t\t\t\t\t\t\t<h1>刘江</h1>\n\t\t\t\t\t\t\t\t<h2>中国软件开发联盟CSDN总编</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1sKIUFVXXXXXFXVXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"杜勇\">\n\t\t\t\t\t\t\t\t<h1>杜勇</h1>\n\t\t\t\t\t\t\t\t<h2>博客园创始人</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1r6k5FVXXXXbwXpXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"蒋凡\">\n\t\t\t\t\t\t\t\t<h1>蒋凡</h1>\n\t\t\t\t\t\t\t\t<h2>友盟创始人</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1GNEYFVXXXXXWXVXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"肖榕\">\n\t\t\t\t\t\t\t\t<h1>肖榕</h1>\n\t\t\t\t\t\t\t\t<h2>浙江协同数据系统有限公司总经理</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1xt5lGXXXXXXoXVXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"余佳文\">\n\t\t\t\t\t\t\t\t<h1>余佳文</h1>\n\t\t\t\t\t\t\t\t<h2>周末网络科技有限公司 CEO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB13XOxGXXXXXa5XXXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"喻思成\">\n\t\t\t\t\t\t\t\t<h1>喻思成</h1>\n\t\t\t\t\t\t\t\t<h2>阿里云 副总裁</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1UEuuGXXXXXcaXFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"K.Guru Gowrappan\">\n\t\t\t\t\t\t\t\t<h1>K.Guru Gowrappan</h1>\n\t\t\t\t\t\t\t\t<h2>Quixey COO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1_UqqGXXXXXcsXpXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"陈广胜\">\n\t\t\t\t\t\t\t\t<h1>陈广胜</h1>\n\t\t\t\t\t\t\t\t<h2>浙江省政府副秘书长</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB12dioGXXXXXcrXFXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"马宁宇\">\n\t\t\t\t\t\t\t\t<h1>马宁宇</h1>\n\t\t\t\t\t\t\t\t<h2>贵州经济和信息化委员会 常务副主任</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1EK1qGXXXXXXDXFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"章文嵩\">\n\t\t\t\t\t\t\t\t<h1>章文嵩</h1>\n\t\t\t\t\t\t\t\t<h2>阿里云 高级研究员</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1RymqGXXXXXcAXpXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"蔡浩宇\">\n\t\t\t\t\t\t\t\t<h1>蔡浩宇</h1>\n\t\t\t\t\t\t\t\t<h2>米哈游CEO兼《崩坏学园2》制作人</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1K2euGXXXXXcFXXXXYoMdYFXX-512-1439.jpg\" id=\"background\" alt=\"Peter\">\n\t\t\t\t\t\t\t\t<h1>Peter</h1>\n\t\t\t\t\t\t\t\t<h2>“愤怒的小鸟”（Rovio）CMO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1PYCqGXXXXXanXFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"樊振华\">\n\t\t\t\t\t\t\t\t<h1>樊振华</h1>\n\t\t\t\t\t\t\t\t<h2>天弘基金创新支持部总经理</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1_ByrGXXXXXbEXpXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"徐敏\">\n\t\t\t\t\t\t\t\t<h1>徐敏</h1>\n\t\t\t\t\t\t\t\t<h2>杭州安存网络科技有限公司 CEO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1zqZpFVXXXXX0XFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"王坚\">\n\t\t\t\t\t\t\t\t<h1>王坚</h1>\n\t\t\t\t\t\t\t\t<h2>阿里巴巴集团CTO</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1OogrFVXXXXXZXXXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"王文彬\">\n\t\t\t\t\t\t\t\t<h1>王文彬</h1>\n\t\t\t\t\t\t\t\t<h2>阿里云计算公司总裁</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1t2csFVXXXXXLXXXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"陈宇红\">\n\t\t\t\t\t\t\t\t<h1>陈宇红</h1>\n\t\t\t\t\t\t\t\t<h2>中软国际有限公司董事长</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1SdonFVXXXXccXpXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"章苒\">\n\t\t\t\t\t\t\t\t<h1>章苒</h1>\n\t\t\t\t\t\t\t\t<h2>新华社浙江分社记者对外采访室主任</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"owl-item\" style=\"width: 273.2px; margin-right: 0px;\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<img src=\"./file/TB1sGhRFVXXXXa_XFXXDMAdYFXX-512-1440.jpg\" id=\"background\" alt=\"吕钢锋\">\n\t\t\t\t\t\t\t\t<h1>吕钢锋</h1>\n\t\t\t\t\t\t\t\t<h2>杭州云栖小镇管委会主任</h2>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</ul>\n\n\t\t\t<script>\n\t\t\t\tvar div1 = document.getElementById('index_3');\n\t\t\t\tvar timer = null;\n\t\t\t\tvar list = getEleByClass('owl-stage')[0];\n\t\t\t\tvar items = getEleByClass('owl-item');\n\t\t\t\tvar len = items.length;\n\t\t\t\tvar itemW = '273';\n\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tsetWith();\n\t\t        function setWith() {\n\t\t        \tlist.style.width = itemW * items.length + 'px';\n\t\t        }\n\t\t        moveItem()\n\t\t\t\tfunction moveItem() {\n\t\t\t\t\tclearInterval(timer)\n\t\t\t\t\ttimer = setInterval('dragMovePre(1)', 5000);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdrag(list)\n\t\t        function drag(obj){\n\t\t            obj.onmousedown = function(e){\n\t\t            \t\n\t\t            \tclearInterval(timer);\n\t\t            \t\n\t\t                var e = e || event;\n\t\t                var startX = e.clientX - obj.offsetLeft;\n\t\t\t\t\t\tvar moveIndex = 0;\n\t\t\t\t\t\tvar flag = true;\n\t\t\t\t\t\t\n\t\t                obj.onmousemove = function(e){\n\t\t                    e = e || event;\n\t\t                    var x = e.clientX - startX;\n\t\t                    obj.style.left = x+ 'px';\n\t\t               \t\t\n\t\t                }\n\t\t                obj.onmouseup = function(){\n\t\t                \tvar e = e || event;\n\t\t                \tvar target = e.target || e.srcElement;\n\t\t                    obj.onmousemove = null;\n\t\t                    obj.onmouseup = null;\n\t\t                    //图片超过1/2则移除，否则不变，可以放到onmouseup下，\n\t\t                    moveIndex = Math.ceil((Math.abs(obj.offsetLeft) - itemW / 2) /itemW) - moveIndex;\n\t\t                    if(obj.offsetLeft < 0) {\n\t\t                    \tdragMovePre(moveIndex);\t    \n\t\t                    }else {\n\t\t                    \tstartMove(list,{left:0});\n\t\t                    }\n\t\t                \tmoveItem();            \t\n\t\t                }\n\t\t                return false;\n\t\t            }\n\t\t        }\n\t\t\t\t\n\t\t\t\t//向前移动\n\t\t\t\tfunction dragMovePre(num) {\n\t\t\t\t\tfor(var i = 0; i < num; i++) {\n\t\t\t\t\t\t\tvar curItem = items[i].cloneNode(true);\n\t\t\t\t\t\t\tlist.appendChild(curItem);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstartMove(list,{left:-itemW * num},function(){\n\t\t\t\t\t\t\tfor(var i = 0;i < num; i++) {\n\t\t\t\t\t\t\t\tlist.removeChild(items[0]);\n\t\t\t\t\t\t\t\tlist.style.left = 0;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//向前移动\n\t\t\t\tfunction dragMoveNext(num) {\n\t\t\t\t\tfor(var i = num-1,j=0 ;i >= 0 ; i--) {\n\t\t\t\t\t\tvar curItem = items[len-(i+(++j))].cloneNode(true);\n\t\t\t\t\t\tlist.insertBefore(curItem,list.childNodes[0]);\n\t\t\t\t\t}\n\t\t\t\t\tlist.style.left = -itemW * num + 'px';\n\t\t\t\t\tstartMove(list,{left:0},function(){\n\t\t\t\t\t\tfor(var i = num-1 ;i >= 0 ; i--) {\n\t\t\t\t\t\t\tlist.removeChild(items[len-1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t//获取某一横坐标属于第几栏\n\t\t\t\tfunction getColByX(x) {\n\t\t\t\t\tvar column = -1;\n\t\t\t\t\tfor (var i = 0; i < 5; i++) {\n\t\t\t\t\t\tif(positionArr[i] < x && x <= positionArr[i+1]) {\n\t\t\t\t\t\t\tcolumn = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconsole.log(column)\n\t\t\t\t\treturn column;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdiv1.onmouseover = function() {\n\t\t\t\t\t\n\t\t\t\t\tvar e = event || window.event;\n\t\t\t\t\tvar target = e.target || e.srcElement;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tif(target.nodeName = 'IMG') {\n\t\t\t\t\t\tvar imgs = div1.getElementsByTagName('img');\n\t\t\t\t\t\tfor (var i = 0; i < imgs.length; i++) {\n\t\t\t\t\t\t\tstartMove(imgs[i], {opacity : 50});\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tstartMove(target, {opacity : 100});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdiv1.onmouseout = function() {\n\t\t\t\t\tvar imgs = div1.getElementsByTagName('img');\n\t\t\t\t\tfor (var i = 0; i < imgs.length; i++) {\n\t\t\t\t\t\t\tstartMove(imgs[i], {opacity : 50});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tfunction getEleByClass(className) {\n\t\t\t\t\t\tvar result = [];\n\t\t\t\t\t\tif(document.getElementsByClassName) {\n\t\t\t\t\t\t\tresult = document.getElementsByClassName(className);\n\t\t\t\t\t\t}else {\n\t\t\t\t\t\t\tvar htmlElement = document.getElementsByTagName('*');\n\t\t\t\t\t\t\tfor (var i = 0; i < htmlElement.length; i++) {\n\t\t\t\t\t\t\t\tvar item = htmlElement[i];\n\t\t\t\t\t\t\t\tif(/className/g.test(item.className)) {\n\t\t\t\t\t\t\t\t\tresult.push(item);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t//获取样式\n\t\t\t\t\tfunction getStyle(obj, attr) {\n\t\t\t\t\t\treturn obj.currentStyle? obj.currentStyle(attr) : getComputedStyle(obj, false)[attr];\n\t\t\t\t\t}\n\t\t\t</script>\n\t</body>\n\n</html>"
  },
  {
    "path": "works/demo/ali/file/abtest1120.css",
    "content": ".sogou-recommend {\n    background-color:#ECF7FE;\n    font:15px/40px 'microsoft yahei', serif;\n    height:40px;\n    border-top:1px solid #C2D3E4;\n    position: absolute;\n    left:0;\n    right:0;\n    bottom:0;\n    text-align: left;\n    display:-webkit-box;\n    width:100%;\n}\n.sogou-recommend-logo-box {\n    width:136px;\n    height:32px;\n    cursor:pointer;\n    background: url(/images/abtest1120/hotsearch.gif) no-repeat 107px top;\n    padding:9px 0 0 10px;\n    cursor:pointer;\n    position:absolute;\n    left:0;\n    top:-1px;\n}\n.sogou-recommend-logo {\n    cursor:pointer;\n    display:block;\n    width:88px;\n    height:23px;\n    background:url(http://logo.www.sogou.com/images/logo2014/chajian.png) no-repeat;\n    _background-image:none;\n_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=crop, src=http://logo.www.sogou.com/images/logo2014/chajian.png);\n\n}\n.sogou-recommend-list {\n    margin:0;\n    padding:0;\n    list-style:none;\n    border-left:1px solid #C2D3E4;\n    overflow:hidden;\n    height:40px;\n    position: absolute;\n    left:146px;\n    top:0;\n}\n.sogou-recommend-list li {\n    height:40px;\n    border-right:1px solid #C2D3E4;\n    float:left;\n}\n.sogou-recommend-list a {\n    color:#00c;\n    display:block;\n    padding:0 13px;\n    min-width:196px;\n}\n.sogou-recommend-list a:hover, .sogou-recommend-logo-box:hover {\n    background-color:#C8E2F4;\n}\n.sogou-recommend-config, .sogou-recommend-close {\n    width:26px;\n    height:26px;\n    background: #ECF7FE url(/images/abtest1120/btn.gif) no-repeat 8px -34px;\n    cursor:pointer;\n    position:absolute;\n    top:7px;\n    cursor:pointer;\n}\n.sogou-recommend-close {\n    background-position:-18px -34px;\n    right:7px;\n}\n.sogou-recommend-config {\n    right:34px;\n}\n.sogou-recommend-config:hover {\n    background-position:8px 8px;\n    background-color:#C8E2F4;\n}\n.sogou-recommend-close:hover {\n    background-position:-18px 8px;\n    background-color:#C8E2F4;\n}\n.sogou-recommend-jump {\n    height:40px;\n    position:absolute;\n    width:100%;\n    left:0;\n    top:0;\n    outline:none;\n}"
  },
  {
    "path": "works/demo/ali/file/ac_base.js",
    "content": "window.matchMedia=window.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement(\"body\"),f=a.createElement(\"div\");return f.id=\"mq-test-1\",f.style.cssText=\"position:absolute;top:-100em\",e.style.background=\"none\",e.appendChild(f),function(a){return f.innerHTML='&shy;<style media=\"'+a+'\"> #mq-test-1 { width:42px; }</style>',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(document),function(){for(var a=0,b=[\"ms\",\"moz\",\"webkit\",\"o\"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+\"RequestAnimationFrame\"],window.cancelAnimationFrame=window[b[c]+\"CancelAnimationFrame\"]||window[b[c]+\"CancelRequestAnimationFrame\"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),d=Math.max(0,16-(c-a)),e=window.setTimeout(function(){b(c+d)},d);return a=c+d,e}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){clearTimeout(a)})}(),Function.prototype.bind||(Function.prototype.bind=function(){if(arguments.length<1)return this;var a=this,b=AC.Array.toArray(arguments),c=b.shift();return function(){return a.apply(c,b.concat(AC.Array.toArray(arguments)))}}),Array.isArray||(Array.isArray=function(a){return a&&\"object\"==typeof a&&\"splice\"in a&&\"join\"in a}),Array.prototype.every||(Array.prototype.every=function(a,b){var c,d=Object(this),e=d.length>>>0;if(\"function\"!=typeof a)throw new TypeError(a+\" is not a function\");for(c=0;e>c;c+=1)if(c in d&&!a.call(b,d[c],c,d))return!1;return!0}),Array.prototype.filter||(Array.prototype.filter=function(a,b){var c,d=Object(this),e=d.length>>>0,f=[];if(\"function\"!=typeof a)throw new TypeError(a+\" is not a function\");for(c=0;e>c;c+=1)c in d&&a.call(b,d[c],c,d)&&f.push(d[c]);return f}),Array.prototype.forEach||(Array.prototype.forEach=function(a,b){var c,d,e=Object(this),f=this.length>>>0;if(\"function\"!=typeof a)throw new TypeError(\"No function object passed to forEach.\");for(c=0;f>c;c+=1)d=e[c],a.call(b,d,c,e)}),Array.prototype.indexOf||(Array.prototype.indexOf=function(a,b){var c=b||0,d=0;if(0>c&&(c=this.length+b-1,0>c))throw\"Wrapped past beginning of array while looking up a negative start index.\";for(d=0;d<this.length;d++)if(this[d]===a)return d;return-1}),Array.prototype.lastIndexOf||(Array.prototype.lastIndexOf=function(a,b){var c,d=Object(this),e=d.length>>>0;if(b=parseInt(b,10),0>=e)return-1;for(c=\"number\"==typeof b?Math.min(e-1,b):e-1,c=c>=0?c:e-Math.abs(c);c>=0;c-=1)if(c in d&&a===d[c])return c;return-1}),Array.prototype.map||(Array.prototype.map=function(a,b){var c,d=Object(this),e=d.length>>>0,f=new Array(e);if(\"function\"!=typeof a)throw new TypeError(a+\" is not a function\");for(c=0;e>c;c+=1)c in d&&(f[c]=a.call(b,d[c],c,d));return f}),Array.prototype.reduce||(Array.prototype.reduce=function(a,b){var c,d=Object(this),e=d.length>>>0,f=0;if(\"function\"!=typeof a)throw new TypeError(a+\" is not a function\");if(\"undefined\"==typeof b){if(!e)throw new TypeError(\"Reduce of empty array with no initial value\");c=d[0],f=1}else c=b;for(;e>f;)f in d&&(c=a.call(void 0,c,d[f],f,d),f+=1);return c}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(a,b){var c,d=Object(this),e=d.length>>>0,f=e-1;if(\"function\"!=typeof a)throw new TypeError(a+\" is not a function\");if(void 0===b){if(!e)throw new TypeError(\"Reduce of empty array with no initial value\");c=d[e-1],f=e-2}else c=b;for(;f>=0;)f in d&&(c=a.call(void 0,c,d[f],f,d),f-=1);return c}),Array.prototype.some||(Array.prototype.some=function(a,b){var c,d=Object(this),e=d.length>>>0;if(\"function\"!=typeof a)throw new TypeError(a+\" is not a function\");for(c=0;e>c;c+=1)if(c in d&&a.call(b,d[c],c,d)===!0)return!0;return!1}),Date.now||(Date.now=function(){return(new Date).getTime()}),Date.prototype.toISOString||(Date.prototype.toISOString=function(){if(!isFinite(this))throw new RangeError(\"Date.prototype.toISOString called on non-finite value.\");var a,b,c={year:this.getUTCFullYear(),month:this.getUTCMonth()+1,day:this.getUTCDate(),hours:this.getUTCHours(),minutes:this.getUTCMinutes(),seconds:this.getUTCSeconds(),mseconds:(this.getUTCMilliseconds()/1e3).toFixed(3).substr(2,3)};for(a in c)c.hasOwnProperty(a)&&\"year\"!==a&&\"mseconds\"!==a&&(c[a]=1===String(c[a]).length?\"0\"+String(c[a]):String(c[a]));return(c.year<0||c.year>9999)&&(b=c.year<0?\"-\":\"+\",c.year=b+String(Math.abs(c.year/1e6)).substr(2,6)),c.year+\"-\"+c.month+\"-\"+c.day+\"T\"+c.hours+\":\"+c.minutes+\":\"+c.seconds+\".\"+c.mseconds+\"Z\"}),Date.prototype.toJSON||(Date.prototype.toJSON=function(){var a,b=Object(this),c=function(a){var b=typeof a,c=[null,\"undefined\",\"boolean\",\"string\",\"number\"].some(function(a){return a===b});return c?!0:!1},d=function(a){var b;if(c(a))return a;if(b=\"function\"==typeof a.valueOf?a.valueOf():\"function\"==typeof a.toString?a.toString():null,b&&c(b))return b;throw new TypeError(a+\" cannot be converted to a primitive\")};if(a=d(b),\"number\"==typeof a&&!isFinite(a))return null;if(\"function\"!=typeof b.toISOString)throw new TypeError(\"toISOString is not callable\");return b.toISOString.call(b)}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\\s+|\\s+$/g,\"\")}),Object.keys||(Object.keys=function(a){var b,c=[];if(!a||\"function\"!=typeof a.hasOwnProperty)throw\"Object.keys called on non-object.\";for(b in a)a.hasOwnProperty(b)&&c.push(b);return c}),\"undefined\"!=typeof JSON&&\"stringify\"in JSON&&\"parse\"in JSON||(this.JSON||(this.JSON={}),function(){function f(a){return 10>a?\"0\"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'\"'+a.replace(escapable,function(a){var b=meta[a];return\"string\"==typeof b?b:\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})+'\"':'\"'+a+'\"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&\"object\"==typeof i&&\"function\"==typeof i.toJSON&&(i=i.toJSON(a)),\"function\"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case\"string\":return quote(i);case\"number\":return isFinite(i)?String(i):\"null\";case\"boolean\":case\"null\":return String(i);case\"object\":if(!i)return\"null\";if(gap+=indent,g=[],\"[object Array]\"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||\"null\";return e=0===g.length?\"[]\":gap?\"[\\n\"+gap+g.join(\",\\n\"+gap)+\"\\n\"+h+\"]\":\"[\"+g.join(\",\")+\"]\",gap=h,e}if(rep&&\"object\"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)d=rep[c],\"string\"==typeof d&&(e=str(d,i),e&&g.push(quote(d)+(gap?\": \":\":\")+e));else for(d in i)Object.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?\": \":\":\")+e));return e=0===g.length?\"{}\":gap?\"{\\n\"+gap+g.join(\",\\n\"+gap)+\"\\n\"+h+\"}\":\"{\"+g.join(\",\")+\"}\",gap=h,e}}\"function\"!=typeof String.prototype.toJSON&&(String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,escapable=/[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,gap,indent,meta={\"\\b\":\"\\\\b\",\"\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\f\":\"\\\\f\",\"\\r\":\"\\\\r\",'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\"},rep;\"function\"!=typeof JSON.stringify&&(JSON.stringify=function(a,b,c){var d;if(gap=\"\",indent=\"\",\"number\"==typeof c)for(d=0;c>d;d+=1)indent+=\" \";else\"string\"==typeof c&&(indent=c);if(rep=b,b&&\"function\"!=typeof b&&(\"object\"!=typeof b||\"number\"!=typeof b.length))throw new Error(\"JSON.stringify\");return str(\"\",{\"\":a})}),\"function\"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&\"object\"==typeof e)for(c in e)Object.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\\],:{}\\s]*$/.test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\")))return j=eval(\"(\"+text+\")\"),\"function\"==typeof reviver?walk({\"\":j},\"\"):j;throw new SyntaxError(\"JSON.parse\")})}());var ac_domready=function(a){var b=!1,c=!0,d=window.document,e=d.documentElement,f=d.addEventListener?\"addEventListener\":\"attachEvent\",g=d.addEventListener?\"removeEventListener\":\"detachEvent\",h=d.addEventListener?\"\":\"on\",i=function(c){(\"readystatechange\"!=c.type||\"complete\"==d.readyState)&&((\"load\"==c.type?window:d)[g](h+c.type,i,!1),!b&&(b=!0)&&a.call(window,c.type||c))},j=function(){try{e.doScroll(\"left\")}catch(a){return void setTimeout(j,50)}i(\"poll\")};if(\"complete\"==d.readyState)a.call(window,\"lazy\");else{if(d.createEventObject&&e.doScroll){try{c=!window.frameElement}catch(k){}c&&j()}d[f](h+\"DOMContentLoaded\",i,!1),d[f](h+\"readystatechange\",i,!1),window[f](h+\"load\",i,!1)}},AC=window.AC||{};AC.Array=AC.Array||{},AC.Array.toArray=function(a){return Array.prototype.slice.call(a)},AC.Array.flatten=function(a){var b=[],c=function(a){Array.isArray(a)?a.forEach(c):b.push(a)};return a.forEach(c),b},AC.Array.without=function(a,b){var c,d=a.indexOf(b),e=a.length;return d>=0?(d===e-1?c=a.slice(0,e-1):0===d?c=a.slice(1):(c=a.slice(0,d),c=c.concat(a.slice(d+1))),c):a};var AC=window.AC||{};AC.Element=AC.Element||{},AC.Element.addEventListener=function(a,b,c,d){if(a.addEventListener)a.addEventListener(b,c,d);else if(a.attachEvent){a.attachEvent(\"on\"+b,c)}else a[\"on\"+b]=c;return a},AC.Element.removeEventListener=function(a,b,c,d){return a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent(\"on\"+b,c),a},AC.Element.getElementById=function(a){return AC.String.isString(a)&&(a=document.getElementById(a)),AC.Element.isElement(a)?a:null},AC.Element.selectAll=function(a,b){if(\"undefined\"==typeof b)b=document.body;else if(!AC.Element.isElement(b))throw\"AC.Element.selectAll: Context is not an Element\";if(\"string\"==typeof a)return Sizzle(a,b);throw\"AC.Element.selectAll: Selector must be a string\"},AC.Element.select=function(a,b){if(\"undefined\"==typeof b)b=document.body;else if(!AC.Element.isElement(b))throw\"AC.Element.select: Context is not an Element\";if(\"string\"==typeof a)return window.Element&&\"function\"==typeof Element.prototype.querySelector?b.querySelector(a):Sizzle(a,b)[0];throw\"AC.Element.select: Selector must be a string\"},AC.Element.matchesSelector=function(a,b){return Sizzle.matchesSelector(a,b)},AC.Element.filterBySelector=function(a,b){return Sizzle.matches(b,a)},function(){var a=function(a,b,c,d){return 0===c&&\"moz\"!==d.substr(1,3)?b:b.toUpperCase()};AC.Element.setStyle=function(b,c){if(\"string\"!=typeof c&&\"object\"!=typeof c||Array.isArray(c))throw new TypeError(\"styles argument must be either an object or a string\");b=AC.Element.getElementById(b);var d,e,f,g,h,i=\"object\"==typeof c?c:{};if(\"string\"==typeof c)for(d=c.split(\";\"),f=0;f<d.length;f+=1)e=d[f].indexOf(\":\"),e>0&&(i[d[f].substr(0,e).trim()]=d[f].substr(e+1).trim());for(h in i)i.hasOwnProperty(h)&&(g=h.replace(/-(\\w)/g,a),\"opacity\"===g&&AC.Element.__setOpacityIE?AC.Element.__setOpacityIE(b,i[h]):\"undefined\"!=typeof b.style[g]&&(b.style[g]=i[h]));return b},AC.Element.getStyle=function(b,c){var d,e;return c=c.replace(/-(\\w)/g,a),AC.Element.__getStyleIE?AC.Element.__getStyleIE(b,c):(b=AC.Element.getElementById(b),c=\"float\"===c?\"cssFloat\":c,d=window.getComputedStyle(b,null),e=d?d[c]:null,\"opacity\"===c?e?parseFloat(e):1:\"auto\"===e?null:e)}}(),AC.Element.getBoundingBox=function(a){a=AC.Element.getElementById(a);var b=a.getBoundingClientRect(),c=b.width||b.right-b.left,d=b.height||b.bottom-b.top;return{top:b.top,right:b.right,bottom:b.bottom,left:b.left,width:c,height:d}},AC.Element.cumulativeOffset=function(a){var b=AC.Element.getBoundingBox(a),c=AC.Viewport.scrollOffsets(),d=[b.top+c.y,b.left+c.x];return d.top=d[0],d.left=d[1],d},AC.Element.hasClassName=function(a,b){var c=AC.Element.getElementById(a);return c&&\"\"!==c.className?new RegExp(\"(\\\\s|^)\"+b+\"(\\\\s|$)\").test(c.className):!1},AC.Element.addClassName=function(a,b){var c=AC.Element.getElementById(a);AC.Element.hasClassName(c,b)||(c.className+=\" \"+b)},AC.Element.removeClassName=function(a,b){var c=AC.Element.getElementById(a);if(AC.Element.hasClassName(c,b)){var d=new RegExp(\"(\\\\s|^)\"+b+\"(\\\\s|$)\");c.className=c.className.replace(d,\"$1\").trim()}},AC.Element.toggleClassName=function(a,b){var c=AC.Element.getElementById(a);c.classList?c.classList.toggle(b):AC.Element.hasClassName(c,b)?AC.Element.removeClassName(c,b):AC.Element.addClassName(c,b)},AC.Element.isElement=function(a){return!(!a||1!==a.nodeType)},AC.Element.addVendorEventListener=function(a,b,c,d){return AC.log(\"AC.Element.addVendorEventListener is deprecated. Please use AC.Element.addVendorPrefixEventListener.\"),this.addVendorPrefixEventListener(a,b,c,d)},AC.Element.addVendorPrefixEventListener=function(a,b,c,d){return b=b.match(/^webkit/i)?b.replace(/^webkit/i,\"\"):b.match(/^moz/i)?b.replace(/^moz/i,\"\"):b.match(/^ms/i)?b.replace(/^ms/i,\"\"):b.match(/^o/i)?b.replace(/^o/i,\"\"):b.charAt(0).toUpperCase()+b.slice(1),/WebKit/i.test(window.navigator.userAgent)?AC.Element.addEventListener(a,\"webkit\"+b,c,d):/Opera/i.test(window.navigator.userAgent)?AC.Element.addEventListener(a,\"O\"+b,c,d):/Gecko/i.test(window.navigator.userAgent)?AC.Element.addEventListener(a,b.toLowerCase(),c,d):(b=b.charAt(0).toLowerCase()+b.slice(1),AC.Element.addEventListener(a,b,c,d))},AC.Element.removeVendorEventListener=function(a,b,c,d){return AC.log(\"AC.Element.removeVendorEventListener is deprecated. Please use AC.Element.removeVendorPrefixEventListener.\"),this.removeVendorPrefixEventListener(a,b,c,d)},AC.Element.removeVendorPrefixEventListener=function(a,b,c,d){return b=b.match(/^webkit/i)?b.replace(/^webkit/i,\"\"):b.match(/^moz/i)?b.replace(/^moz/i,\"\"):b.match(/^ms/i)?b.replace(/^ms/i,\"\"):b.match(/^o/i)?b.replace(/^o/i,\"\"):b.charAt(0).toUpperCase()+b.slice(1),AC.Element.removeEventListener(a,\"webkit\"+b,c,d),AC.Element.removeEventListener(a,\"O\"+b,c,d),AC.Element.removeEventListener(a,b.toLowerCase(),c,d),b=b.charAt(0).toLowerCase()+b.slice(1),AC.Element.removeEventListener(a,b,c,d)},AC.Element.setVendorPrefixStyle=function(a,b,c){if(\"string\"!=typeof b)throw new TypeError(\"AC.Element.setVendorPrefixStyle: property must be a string\");if(\"string\"!=typeof c&&\"number\"!=typeof c)throw new TypeError(\"AC.Element.setVendorPrefixStyle: value must be a string or a number\");c+=\"\",a=AC.Element.getElementById(a);var d,e,f=[\"\",\"webkit\",\"Moz\",\"ms\",\"O\"];b=b.replace(/-(webkit|moz|ms|o)-/i,\"\"),b=b.replace(/^(webkit|Moz|ms|O)/,\"\").charAt(0).toLowerCase()+b.slice(1),b=b.replace(/-(\\w)/,function(a,b){return b.toUpperCase()}),c=c.replace(/-(webkit|moz|ms|o)-/,\"-vendor-\"),f.some(function(f){return d=\"\"===f?b:f+b.charAt(0).toUpperCase()+b.slice(1),e=\"\"===f?c.replace(\"-vendor-\",\"\"):c.replace(\"-vendor-\",\"-\"+f.charAt(0).toLowerCase()+f.slice(1)+\"-\"),d in a.style?(AC.Element.setStyle(a,d+\":\"+e),!0):void 0})},AC.Element.getVendorPrefixStyle=function(a,b){if(\"string\"!=typeof b)throw new TypeError(\"AC.Element.getVendorPrefixStyle: property must be a string\");a=AC.Element.getElementById(a);var c,d=[\"\",\"webkit\",\"Moz\",\"ms\",\"O\"];return b=b.replace(/-(webkit|moz|ms|o)-/i,\"\"),b=b.replace(/^(webkit|Moz|ms|O)/,\"\").charAt(0).toLowerCase()+b.slice(1),b=b.replace(/-(\\w)/,function(a,b){return b.toUpperCase()}),d.some(function(d){var e=\"\"===d?b:d+b.charAt(0).toUpperCase()+b.slice(1);return e in a.style?(c=AC.Element.getStyle(a,e),!0):void 0}),c},AC.Element.insert=function(a,b,c){if(!a||1!==a.nodeType&&3!==a.nodeType&&11!==a.nodeType)throw\"AC.Element.insert: element must be a valid node of type element, text, or document fragment\";if(!b||1!==b.nodeType&&11!==b.nodeType)throw\"AC.Element.insert: target must be a valid node of type element or document fragment\";switch(c){case\"before\":if(11===b.nodeType)throw\"AC.Element.insert: target cannot be nodeType of documentFragment when using placement ‘before’\";b.parentNode.insertBefore(a,b);break;case\"after\":if(11===b.nodeType)throw\"AC.Element.insert: target cannot be nodeType of documentFragment when using placement ‘after’\";b.parentNode.insertBefore(a,b.nextSibling);break;case\"first\":b.insertBefore(a,b.firstChild);break;default:b.appendChild(a)}},AC.Element.remove=function(a,b){if(!AC.Element.isElement(a))throw\"AC.Element.remove: element must be a valid DOM element\";if(b===!0){var c=a.parentNode.removeChild(a);return c}a.parentNode.removeChild(a)};var AC=window.AC||{};AC.Event=AC.Event||{},AC.Event.stop=function(a){a||(a=window.event),a.stopPropagation?a.stopPropagation():a.cancelBubble=!0,a.preventDefault&&a.preventDefault(),a.stopped=!0,a.returnValue=!1},AC.Event.target=function(a){return\"undefined\"!=typeof a.target?a.target:a.srcElement},AC.Event.Keys={UP:38,DOWN:40,LEFT:37,RIGHT:39,ESC:27,SPACE:32,BACKSPACE:8,DELETE:46,END:35,HOME:36,PAGEDOWN:34,PAGEUP:33,RETURN:13,TAB:9};var AC=window.AC||{};AC.Function=AC.Function||{},AC.Function.emptyFunction=function(){},AC.Function.bindAsEventListener=function(a,b){var c=AC.Array.toArray(arguments).slice(2);return function(d){return a.apply(b,[d||window.event].concat(c))}},AC.Function.getParamNames=function(a){var b=a.toString();return b.slice(b.indexOf(\"(\")+1,b.indexOf(\")\")).match(/([^\\s,]+)/g)||[]},function(){var a=[\"abbr\",\"article\",\"aside\",\"command\",\"details\",\"figcaption\",\"figure\",\"footer\",\"header\",\"hgroup\",\"mark\",\"meter\",\"nav\",\"output\",\"progress\",\"section\",\"summary\",\"time\"];a.forEach(function(a){document.createElement(a)})}(),function(){if(window.attachEvent){var a=function(){var a,b,c=document.compatible,d=c?void 0:7,e=[];if(c&&(a=c.length,0===a&&(d=parseInt(document.documentMode,10)),a>0)){for(b=0;a>b;b+=1)e.push(parseInt(c[b].version.match(/\\d{1,2}/),10));e=e.sort(function(a,b){return a-b}),d=e.pop()}return d},b=a();8>=b&&(AC.Element.__setOpacityIE=function(a,b){return b=b>1?1:100*(1e-5>b?0:b),alphaFilter=a.filters[\"DXImageTransform.Microsoft.Alpha\"]||a.filters.Alpha,alphaFilter?alphaFilter.Opacity=b:a.style.filter+=\" progid:DXImageTransform.Microsoft.Alpha(Opacity=\"+b+\")\",a});var c=function(){if(document.body.currentStyle){var a,b,c,d,e,f=[];AC.Element.selectAll(\"a > * > img\").forEach(function(g){a=g.parentNode,b=g.parentNode.parentNode,a.currentStyle.hasLayout&&g.height>0&&g.width>0&&(AC.Element.select(\"ieclickbooster\",b)||(c=document.createElement(\"ieclickbooster\"),d=AC.Element.getStyle(b,\"position\"),\"static\"===d&&AC.Element.setStyle(b,{position:\"relative\"}),AC.Element.selectAll(\"> *\",b).forEach(function(a){var b=parseInt(a.currentStyle.zIndex,10);b>0&&f.push(b)}),f.sort(function(a,b){return b-a}),e=f[0]?f[0].toString():\"1\",AC.Element.insert(c,b),AC.Element.setStyle(c,{display:\"block\",position:\"absolute\",top:\"0\",bottom:\"0\",left:\"0\",right:\"0\",background:\"url(/global/elements/blank.gif)\",cursor:\"pointer\",zIndex:e})))})}};\"function\"!=typeof window.getComputedStyle&&(AC.Element.__getStyleIE=function(a,b){a=AC.Element.getElementById(a);var c,d,e;return a.currentStyle?(b=\"float\"===b?\"styleFloat\":b,c=a.currentStyle,\"opacity\"===b?(d=a.filters[\"DXImageTransform.Microsoft.Alpha\"]||a.filters.Alpha,d?parseFloat(d.Opacity/100):1):(e=c[b]||null,\"auto\"===e?null:e)):void 0}),ac_domready(function(){7>=b&&c()})}}();var AC=window.AC||{};AC.Object=AC.Object||{},AC.Object.extend=Object.extend?Object.extend:function(a,b){var c;for(c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a},AC.Object.clone=Object.clone?Object.clone:function(a){return AC.Object.extend({},a)},AC.Object.getPrototypeOf=Object.getPrototypeOf?Object.getPrototypeOf:\"object\"==typeof this.__proto__?function(a){return a.__proto__}:function(a){var b,c=a.constructor;if(Object.prototype.hasOwnProperty.call(a,\"constructor\")){if(b=c,!delete a.constructor)return null;c=a.constructor,a.constructor=b}return c?c.prototype:null};var AC=window.AC||{};AC.RegExp=AC.RegExp||{},AC.RegExp.isRegExp=function(a){return\"RegExp\"===a.constructor.name};var AC=window.AC||{};AC.String=AC.String||{},AC.String.isString=function(a){return\"string\"==typeof a},AC.String.toCamelCase=function(a){if(\"string\"!=typeof a)throw\"Argument must be of type String.\";return a.replace(/-+(.)?/g,function(a,b){return b?b.toUpperCase():\"\"})};var AC=window.AC||{};AC.Object.extend(AC,{uid:function(){return AC._uid||(AC._uid=0),AC._uid++},namespace:function(a){var b;if(!(a&&a.match&&a.match(/\\S/)))throw\"Attempt to create AC.namespace with no name.\";var c=a.split(/\\./),d=window;for(b=0;b<c.length;b++)d[c[b]]=d[c[b]]||{},d=d[c[b]]},bindEventListeners:function(a,b,c){var d;if(b=AC.Element.getElementById(b),!AC.Element.isElement(b))throw\"Invalid or non-existent element passed to bindEventListeners.\";for(d in c)if(c.hasOwnProperty(d)){var e=c[d];\"function\"==typeof e?AC.Element.addEventListener(b,d,AC.Function.bindAsEventListener(e,a)):\"string\"==typeof e&&AC.Element.addEventListener(b,d,AC.Function.bindAsEventListener(a[e],a))}}}),function(a,b){function c(a){return a.map(function(a){return e(a)})}var d,e,f;e=function(a,e){var f;return\"string\"==typeof a?f=d[a]:\"function\"==typeof e&&Array.isArray(a)?e.apply(b,c(a)):void 0},e.version=\"1.0.0\",e.config=function(){},f=function(a,b,e){d[a]||(e||(e=b),d[a]=\"function\"==typeof e&&Array.isArray(b)?e.apply(e,c(b)):\"function\"==typeof e?e():e)},f.amd={},e._init=function(){d={},f(\"require\",[],function(){return e})},e.getRegisteredModules=function(){return Object.getOwnPropertyNames(d).sort()},e._init(),a.require=a.require||e,a.define=a.define||f}(this.AC||this,this),AC.define(\"defer/core/Deferred\",[\"require\"],function(){function a(){}return a.prototype={resolve:function(){return this._defer.resolve.apply(this._defer,Array.prototype.slice.call(arguments)),this.promise()},reject:function(){return this._defer.reject.apply(this._defer,Array.prototype.slice.call(arguments)),this.promise()},progress:function(){return this._defer.progress.apply(this._defer,Array.prototype.slice.call(arguments)),this.promise()},then:function(){return this._defer.then.apply(this._defer,Array.prototype.slice.call(arguments)),this.promise()},promise:function(){return this._defer.promise.apply(this._defer,Array.prototype.slice.call(arguments))}},a}),AC.define(\"defer/lib/Deferred\",[],function(){var a,b,c,d,e,f;a={0:\"pending\",1:\"resolved\",2:\"rejected\"},b=function(a,b){var c,d,e,f,g;if(0!==this._status)return console&&console.warn&&console.warn(\"Trying to fulfill more than once.\"),!1;for(this.data=b,d=this.pending,e=d.length,c=0;e>c;c++)f=d[c],f[a]&&(g=f[a](b)),\"object\"==typeof g&&g.hasOwnProperty(\"then\")&&g.hasOwnProperty(\"status\")?g.then(function(a){f.deferred.resolve(a)},function(a){f.deferred.reject(a)},function(a){f.deferred.progress(a)}):f.deferred[a](g||void 0);return\"progress\"!==a&&(d=[]),!0},f=function(a,b){this.then=a,this.status=b},d=function(a){return\"function\"!=typeof a?function(){}:a},c=function(a,b,c){this.resolve=d(a),this.reject=d(b),this.progress=d(c),this.deferred=new e},e=function(){this.pending=[],this._status=0,this._promise=new f(this.then.bind(this),this.status.bind(this))},e.prototype={status:function(){return a[this._status]},promise:function(){return this._promise},progress:function(a){return b.call(this,\"progress\",a),this._promise},resolve:function(a){return b.call(this,\"resolve\",a),0===this._status&&(this._status=1),this._promise},reject:function(a){return b.call(this,\"reject\",a),0===this._status&&(this._status=2),this._promise},then:function(a,b,d){var e,f;return f=new c(a,b,d),0===this._status?this.pending.push(f):1===this._status&&\"function\"==typeof a?(e=a(this.data),\"object\"==typeof e&&e.hasOwnProperty(\"then\")&&e.hasOwnProperty(\"status\")?e.then(function(a){f.deferred.resolve(a)},function(a){f.deferred.reject(a)},function(a){f.deferred.progress(a)}):f.deferred.resolve(e)):2===this._status&&\"function\"==typeof b&&(e=b(this.data),f.deferred.reject(e)),f.deferred.promise()}};var g=function(){var a,b,c,d,f;return a=[].slice.call(arguments),b=new e,c=0,d=function(d){c--;var e=a.indexOf(this);a[e]=d,0===c&&b.resolve(a)},f=function(a){b.reject(a)},a.forEach(function(a){a.then&&(c++,a.then(d.bind(a),f))}),b.promise()};return e.when=g,e}),AC.define(\"defer/Deferred\",[\"require\",\"defer/core/Deferred\",\"defer/lib/Deferred\"],function(a){function b(){this._defer=new d}var c=new(a(\"defer/core/Deferred\")),d=a(\"defer/lib/Deferred\");return b.prototype=c,b.join=function(){return d.when.apply(null,[].slice.call(arguments))},b.all=function(a){return d.when.apply(null,a)},b}),AC.define(\"animationTimeout/AnimationTimeout\",[\"require\",\"defer/Deferred\"],function(a){function b(a,b,c){this.duration=a,b&&(this._intervalFunction=b),c&&(this._cancelFunction=c),this._update=this._update.bind(this)}var c,d=a(\"defer/Deferred\");return c=b.prototype,c._intervalFunction=window.requestAnimationFrame.bind(window),c._cancelFunction=window.cancelAnimationFrame.bind(window),c._update=function(a){this._startTime=this._startTime||a,this._progress=(a-this._startTime)/this.duration,1>this._progress?(this._defer.progress(this._progress),this._requestID=this._intervalFunction(this._update)):(this._progress=1,this._defer.progress(1),this._defer.resolve(1))},c.start=function(){return this._defer=new d,this._startTime=0,this._requestID=this._intervalFunction(this._update),this._defer.promise()},c.cancel=function(){this._cancelFunction(this._requestID),this._defer.reject()},b}),AC.define(\"assetLoader/AssetLoader\",[\"require\",\"defer/Deferred\"],function(a){function b(a,b){this._assetsToLoad=[].concat(a),this._type=b||\"img\"}var c=a(\"defer/Deferred\");return b.prototype={load:function(){return this._assetsLoaded=[],this._assetsCountLoaded=0,this._defer=new c,this._failure=!1,this._assetsToLoad.forEach(this._loadAsset.bind(this)),this._defer.promise()},_progress:function(a){this._defer.progress(this._assetsLoaded[a.target._id]=a.target),this._assetsCountLoaded+=1,this._assetsCountLoaded===this._assetsToLoad.length&&this._defer.resolve(this._assetsLoaded)},_error:function(a){this._failure=!0,this._defer.reject(a.target)},_loadAsset:function(a,b){var c;this._failure||(c=document.createElement(this._type),c._id=b,c.onload=this._progress.bind(this),c.onerror=this._error.bind(this),c.src=a)}},b}),AC.define(\"ajax/Ajax\",[\"require\",\"defer/Deferred\"],function(a){function b(){var a=!1;try{a=new XMLHttpRequest}catch(b){try{a=new ActiveXObject(\"Msxml2.XMLHTTP\")}catch(b){try{a=new ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){a=!1}}}return a}function c(a){a&&(this.timeout=a)}var d,e=a(\"defer/Deferred\");return d=c.prototype,d.timeout=5e3,d.xhrMethod=function(a,c,d,f){var g,h=b(),i=new e;f=f||{},h.open(a,c,!1),Object.keys(f).forEach(function(a){h.setRequestHeader(a,f[a])}),g=setTimeout(function(){h.abort(),i.reject()},this.timeout),h.onreadystatechange=function(){4===h.readyState&&(clearTimeout(g),h.status>=200&&300>h.status?i.resolve(h):i.reject(h))};try{h.send(d)}catch(j){clearTimeout(g),h.abort()}return i.promise()},d.post=function(a,b,c){return this.xhrMethod(\"POST\",a,b,c)},d.get=function(a,b,c){return this.xhrMethod(\"GET\",a,b,c)},c}),AC.Object.extend(AC,{onDOMReady:ac_domready}),AC.windowHasLoaded=!1,AC.Element.addEventListener(window,\"load\",function(){AC.windowHasLoaded=!0}),AC.namespace(\"AC.Synthesize\"),AC.Synthesize.synthesize=function(a){\"object\"!=typeof a&&(a=this);var b;for(b in a)a.hasOwnProperty(b)&&\"_\"===b.charAt(0)&&\"_\"!==b.charAt(1)&&\"function\"!=typeof a[b]&&(this.__synthesizeGetter(b,a),this.__synthesizeSetter(b,a))},AC.Synthesize.__synthesizeGetter=function(a,b){var c=a.slice(1,a.length);\"undefined\"==typeof b[c]&&(b[c]=function(){return b[a]})},AC.Synthesize.__synthesizeSetter=function(a,b){var c=a.slice(1,a.length);c=\"set\"+c.slice(0,1).toUpperCase()+c.slice(1,c.length),\"undefined\"==typeof b[c]&&(b[c]=function(c){b[a]=c})},AC.namespace(\"AC.Object\"),AC.Object.synthesize=function(a){if(\"object\"==typeof a)return AC.Object.extend(a,AC.Object.clone(AC.Synthesize)),a.synthesize(),a;throw\"Argument supplied was not a valid object.\"},AC.Class=function(){var a,b=AC.Array.toArray(arguments),c=\"function\"==typeof b[0]?b.shift():null,d=b.shift()||{},e=function(){var a,b;a=\"function\"==typeof this.initialize&&e.__shouldInitialize!==!1?this.initialize.apply(this,arguments):!1,a===AC.Class.Invalidate&&(b=function(){try{this&&this._parentClass&&this._parentClass._sharedInstance===this&&(this._parentClass._sharedInstance=null)}catch(a){throw a}},window.setTimeout(b.bind(this),200))};return e.__superclass=c,c?(a=c.__superclass?AC.Class(c.__superclass,c.prototype):AC.Class(c.prototype),a.__shouldInitialize=!1,e.prototype=new a,AC.Object.extend(e.prototype,d),AC.Class.__wrapSuperMethods(e)):e.prototype=d,e.sharedInstance=function(){return e._sharedInstance||(e._sharedInstance=new e,e._sharedInstance._parentClass=e),e._sharedInstance},AC.Object.synthesize(e.prototype),e.autocreate=d.__instantiateOnDOMReady||!1,delete d.__instantiateOnDOMReady,e.autocreate&&AC.onDOMReady(function(){e.autocreate&&e.sharedInstance()}),e},AC.Class.__wrapSuperMethods=function(a){var b,c=a.prototype,d=a.__superclass.prototype;for(b in c)if(c.hasOwnProperty(b)&&\"function\"==typeof c[b]){var e=c[b],f=AC.Function.getParamNames(e);\"$super\"===f[0]&&(c[b]=function(a,b){var c=d[a];return function(){var a=AC.Array.toArray(arguments);return b.apply(this,[c.bind(this)].concat(a))}}(b,e))}return this},AC.Class.Invalidate=function(){return!1},AC.namespace(\"AC.Ajax\"),AC.Ajax.getTransport=function(){var a=!1;try{a=new XMLHttpRequest}catch(b){try{a=new ActiveXObject(\"Msxml2.XMLHTTP\")}catch(b){try{a=new ActiveXObject(\"Microsoft.XMLHTTP\")}catch(b){a=!1}}}return a},AC.Ajax.AjaxTracker=AC.Class(),AC.Ajax.AjaxTracker.prototype={_responders:[],initialize:function(){},addResponder:function(a){this._responders.push(a)},removeResponder:function(a){var b=0,c=this._responders.length;for(b=0;c>b;b+=1)if(this._responders[b]===a)return a=null,this._responders.splice(b,1),!0;return!1}},AC.Ajax.AjaxRequest=AC.Class(),AC.Ajax.AjaxRequest.prototype={__defaultOptions:{method:\"get\"},initialize:function(a,b){this._transport=AC.Ajax.getTransport(),this._mimeTypeOverride=null,this._options=null,AC.Object.synthesize(this),this.setOptions(AC.Object.extend(AC.Object.clone(this.__defaultOptions),b||{})),AC.Ajax.AjaxTracker.sharedInstance().addResponder(this),this.transport().onreadystatechange=this._handleTransportStateChange.bind(this),this.transport().open(this.options().method,a,!0),this.transport().setRequestHeader(\"Content-Type\",this.options().contentType),this.transport().send(null)},_handleTransportStateChange:function(){if(4===this.transport().readyState){new AC.Ajax.AjaxResponse(this)}},overrideMimeType:function(a){this._mimeTypeOverride=a,this.transport().overrideMimeType&&this.transport().overrideMimeType(a)}},AC.Ajax.AjaxResponse=AC.Class(),AC.Ajax.AjaxResponse.prototype={_request:null,_transport:null,initialize:function(a){var b=!1,c=a.transport();this._transport=c,this._request=a,4===c.readyState&&(c.status>=200&&c.status<300&&(a.options().onSuccess?a.options().onSuccess(this):AC.Function.emptyFunction(),b=!0),c.status>=400&&c.status<500&&(a.options().onFailure?a.options().onFailure(this):AC.Function.emptyFunction(),b=!0),c.status>=300&&c.status<400&&(b=!0),(c.status>=500&&c.status<600||0===c.status)&&(a.options().onError?a.options().onError(this):AC.Function.emptyFunction(),b=!0)),b===!0&&(a.options().onComplete?a.options().onComplete(this):AC.Function.emptyFunction(),AC.Ajax.AjaxTracker.sharedInstance().removeResponder(a))},responseText:function(){return this._transport.responseText},responseXML:function(){return this._transport.responseXML},responseJSON:function(){return JSON.parse?JSON.parse(this._transport.responseText):new Function(\"return \"+this._transport.responseText)()}},AC.Ajax.checkURL=function(a,b){var c=AC.Ajax.getTransport();c.onreadystatechange=function(){4===this.readyState&&\"function\"==typeof b&&b(200===this.status)},c.open(\"HEAD\",a,!0),c.send(null)},AC.Ajax.AjaxRequest.prototype._overrideMimeType=null,AC.Ajax.AjaxRequest.prototype.overrideMimeType=function(a){this._overrideMimeType=a,this.transport.overrideMimeType&&this.transport.overrideMimeType(a)},AC.namespace(\"AC.Environment\"),AC.namespace(\"AC.Environment.Browser\"),function(a){var b,c,d,e,f,g;\nreturn b=[{string:window.navigator.userAgent,subString:\"Chrome\",identity:\"Chrome\"},{string:window.navigator.userAgent,subString:\"OmniWeb\",versionSearch:\"OmniWeb/\",identity:\"OmniWeb\"},{string:window.navigator.userAgent,subString:/mobile\\/[^\\s]*\\ssafari\\//i,identity:\"Safari Mobile\",versionSearch:\"Version\"},{string:window.navigator.vendor,subString:\"Apple\",identity:\"Safari\",versionSearch:\"Version\"},{prop:window.opera,identity:\"Opera\",versionSearch:\"Version\"},{string:window.navigator.vendor,subString:\"iCab\",identity:\"iCab\"},{string:window.navigator.vendor,subString:\"KDE\",identity:\"Konqueror\"},{string:window.navigator.userAgent,subString:\"Firefox\",identity:\"Firefox\"},{string:window.navigator.vendor,subString:\"Camino\",identity:\"Camino\"},{string:window.navigator.userAgent,subString:\"Netscape\",identity:\"Netscape\"},{string:window.navigator.userAgent,subString:\"MSIE\",identity:\"IE\",versionSearch:\"MSIE\"},{string:window.navigator.userAgent,subString:\"Gecko\",identity:\"Mozilla\",versionSearch:\"rv\"},{string:window.navigator.userAgent,subString:\"Mozilla\",identity:\"Netscape\",versionSearch:\"Mozilla\"}],c=[{string:window.navigator.platform,subString:\"Win\",identity:\"Windows\",versionSearch:\"Windows NT\"},{string:window.navigator.platform,subString:\"Mac\",identity:\"OS X\"},{string:window.navigator.userAgent,subString:\"iPhone\",identity:\"iOS\",versionSearch:\"iPhone OS\"},{string:window.navigator.userAgent,subString:\"iPad\",identity:\"iOS\",versionSearch:\"CPU OS\"},{string:window.navigator.userAgent,subString:/android/i,identity:\"Android\"},{string:window.navigator.platform,subString:\"Linux\",identity:\"Linux\"}],d=function(a){var b,c,d;for(d=0;d<a.length;d+=1)if(b=a[d].string,c=a[d].prop,g=a[d].versionSearch||a[d].identity,b){if(AC.RegExp.isRegExp(a[d].subString)&&b.match(a[d].subString))return a[d].identity;if(-1!==b.indexOf(a[d].subString))return a[d].identity}else if(c)return a[d].identity},e=function(a){var b=a.indexOf(g);if(-1!==b)return parseFloat(a.substring(b+g.length+1))},f=function(a){var b=new RegExp(g+\" ([\\\\d_\\\\.]+)\",\"i\"),c=a.match(b);return null!==c?c[1].replace(/_/g,\".\"):void 0},a.name=d(b)||void 0,a.version=e(window.navigator.userAgent)||e(window.navigator.appVersion)||void 0,a.os=d(c)||void 0,a.osVersion=f(window.navigator.userAgent)||f(window.navigator.appVersion)||void 0,a.lowerCaseUserAgent=navigator.userAgent.toLowerCase(),a}(AC.Environment.Browser),AC.Environment.Browser.isWebKit=function(){return!!this.lowerCaseUserAgent.match(/applewebkit/)},AC.namespace(\"AC.Environment.Feature\"),function(){var a=null,b=null,c=null,d=null;AC.Environment.Feature.isCSSAvailable=function(a){return AC.log(\"AC.Environment.Feature.isCSSAvailable is deprecated. Please use AC.Environment.Feature.cssPropertyAvailable instead.\"),this.cssPropertyAvailable(a)},AC.Environment.Feature.cssPropertyAvailable=function(e){switch(null===a&&(a=document.createElement(\"browserdetect\").style),null===b&&(b=[\"-webkit-\",\"-moz-\",\"-o-\",\"-ms-\",\"-khtml-\",\"\"]),null===c&&(c=[\"Webkit\",\"Moz\",\"O\",\"ms\",\"Khtml\",\"\"]),null===d&&(d={}),e=e.replace(/([A-Z]+)([A-Z][a-z])/g,\"$1\\\\-$2\").replace(/([a-z\\d])([A-Z])/g,\"$1\\\\-$2\").replace(/^(\\-*webkit|\\-*moz|\\-*o|\\-*ms|\\-*khtml)\\-/,\"\").toLowerCase()){case\"gradient\":if(void 0!==d.gradient)return d.gradient;e=\"background-image:\";var f=\"gradient(linear,left top,right bottom,from(#9f9),to(white));\",g=\"linear-gradient(left top,#9f9, white);\";return a.cssText=(e+b.join(f+e)+b.join(g+e)).slice(0,-e.length),d.gradient=-1!==a.backgroundImage.indexOf(\"gradient\"),d.gradient;case\"inset-box-shadow\":if(void 0!==d[\"inset-box-shadow\"])return d[\"inset-box-shadow\"];e=\"box-shadow:\";var h=\"#fff 0 1px 1px inset;\";return a.cssText=b.join(e+h),d[\"inset-box-shadow\"]=-1!==a.cssText.indexOf(\"inset\"),d[\"inset-box-shadow\"];default:var i,j,k,l=e.split(\"-\"),m=l.length;if(l.length>0)for(e=l[0],j=1;m>j;j+=1)e+=l[j].substr(0,1).toUpperCase()+l[j].substr(1);if(i=e.substr(0,1).toUpperCase()+e.substr(1),void 0!==d[e])return d[e];for(k=c.length-1;k>=0;k-=1)if(void 0!==a[c[k]+e]||void 0!==a[c[k]+i])return d[e]=!0,!0;return!1}}}(),AC.Environment.Feature.supportsThreeD=function(){return AC.log(\"AC.Environment.Feature.supportsThreeD is deprecated. Please use AC.Environment.Feature.threeDTransformsAvailable instead.\"),this.threeDTransformsAvailable()},AC.Environment.Feature.threeDTransformsAvailable=function(){if(\"undefined\"!=typeof this._threeDTransformsAvailable)return this._threeDTransformsAvailable;var a;try{if(this._threeDTransformsAvailable=!1,window.hasOwnProperty(\"styleMedia\")?this._threeDTransformsAvailable=window.styleMedia.matchMedium(\"(-webkit-transform-3d)\"):window.hasOwnProperty(\"media\")&&(this._threeDTransformsAvailable=window.media.matchMedium(\"(-webkit-transform-3d)\")),!this._threeDTransformsAvailable){if(!document.getElementById(\"supportsThreeDStyle\")){var b=document.createElement(\"style\");b.id=\"supportsThreeDStyle\",b.textContent=\"@media (transform-3d),(-o-transform-3d),(-moz-transform-3d),(-ms-transform-3d),(-webkit-transform-3d) { #supportsThreeD { height:3px } }\",document.querySelector(\"head\").appendChild(b)}(a=document.querySelector(\"#supportsThreeD\"))||(a=document.createElement(\"div\"),a.id=\"supportsThreeD\",document.body.appendChild(a)),this._threeDTransformsAvailable=3===a.offsetHeight}return this._threeDTransformsAvailable}catch(c){return!1}},AC.Environment.Feature.supportsCanvas=function(){return AC.log(\"AC.Environment.Feature.supportsCanvas is deprecated. Please use AC.Environment.Feature.canvasAvailable instead.\"),this.canvasAvailable()},AC.Environment.Feature.canvasAvailable=function(){if(\"undefined\"!=typeof this._canvasAvailable)return this._canvasAvailable;var a=document.createElement(\"canvas\");return this._canvasAvailable=!(\"function\"!=typeof a.getContext||!a.getContext(\"2d\")),this._canvasAvailable},AC.Environment.Feature.localStorageAvailable=function(){if(\"undefined\"!=typeof this._localStorageAvailable)return this._localStorageAvailable;try{\"undefined\"!=typeof window.localStorage&&\"function\"==typeof window.localStorage.setItem?(window.localStorage.setItem(\"ac_environment_feature\",\"test\"),this._localStorageAvailable=!0,window.localStorage.removeItem(\"ac_environment_feature\",\"test\")):this._localStorageAvailable=!1}catch(a){this._localStorageAvailable=!1}return this._localStorageAvailable},AC.Environment.Feature.sessionStorageAvailable=function(){if(\"undefined\"!=typeof this._sessionStorageAvailable)return this._sessionStorageAvailable;try{\"undefined\"!=typeof window.sessionStorage&&\"function\"==typeof window.sessionStorage.setItem?(window.sessionStorage.setItem(\"ac_browser_detect\",\"test\"),this._sessionStorageAvailable=!0,window.sessionStorage.removeItem(\"ac_browser_detect\",\"test\")):this._sessionStorageAvailable=!1}catch(a){this._sessionStorageAvailable=!1}return this._sessionStorageAvailable},AC.Environment.Feature.cookiesAvailable=function(){return\"undefined\"!=typeof this._cookiesAvailable?this._cookiesAvailable:(this._cookiesAvailable=document.hasOwnProperty(\"cookie\")&&navigator.cookieEnabled?!0:!1,this._cookiesAvailable)},AC.Environment.Feature.__normalizedScreenWidth=function(){return\"undefined\"==typeof window.orientation?window.screen.width:window.screen.width<window.screen.height?window.screen.width:window.screen.height},AC.Environment.Feature.touchAvailable=function(){return\"undefined\"!=typeof window.ontouchstart},AC.Environment.Feature.isDesktop=function(){return this.touchAvailable()||window.orientation?!1:!0},AC.Environment.Feature.isHandheld=function(){return!this.isDesktop()&&!this.isTablet()},AC.Environment.Feature.isTablet=function(){return!this.isDesktop()&&this.__normalizedScreenWidth()>480},AC.Environment.Feature.isRetina=function(){var a,b=[\"min-device-pixel-ratio:1.5\",\"-webkit-min-device-pixel-ratio:1.5\",\"min-resolution:1.5dppx\",\"min-resolution:144dpi\",\"min--moz-device-pixel-ratio:1.5\"];if(void 0!==window.devicePixelRatio){if(window.devicePixelRatio>=1.5)return!0}else for(a=0;a<b.length;a+=1)if(window.matchMedia(\"(\"+b[a]+\")\").matches===!0)return!0;return!1},AC.log=function(){var a=\"f7c9180f-5c45-47b4-8de4-428015f096c0\",b=AC.Environment.Feature.localStorageAvailable()&&!!window.localStorage.getItem(a);return function(a){window.console&&\"function\"==typeof console.log&&b&&console.log(a)}}(),AC.Registry=AC.Class(),AC.Registry.prototype={__defaultOptions:{contextInherits:[],matchCatchAll:!1},initialize:function(a,b){if(\"string\"!=typeof a)throw\"Prefix not defined for Component Registry\";\"object\"!=typeof b&&(b={}),this._options=AC.Object.extend(AC.Object.clone(this.__defaultOptions),b),this._prefix=a,this._reservedNames=[],this.__model=[],this.__lookup={},AC.Object.synthesize(this)},addComponent:function(a,b,c,d,e){var f,g=null;if(!this.__isReserved(a)&&\"string\"==typeof a){if(\"string\"==typeof d&&(g=this.lookup(d)),g||\"_base\"===a||(g=this.lookup(\"_base\")||this.addComponent(\"_base\")),this.lookup(a))throw\"Cannot overwrite existing Component: \"+a;return\"object\"!=typeof e&&(e={}),\"undefined\"==typeof e.inherits&&Array.isArray(this._options.contextInherits)&&(e.inherits=this._options.contextInherits),f=this.__lookup[a]=new AC.Registry.Component(a,b,c,g,e),this.__addToModel(f),f}return null},match:function(a){var b;if(b=this.__matchName(a))return b;if(b=this.__matchQualifier(a))return b;if(this.options().matchCatchAll===!0){if(\"undefined\"!=typeof this.__model[1]){if(\"undefined\"!=typeof this.__model[0])return this.__model[1][0];throw\"Catchall Type not defined\"}throw\"No non-_base types defined at index 1.\"}return null},__matchName:function(a){var b,c;if(!AC.Element.isElement(a))return null;for(b=this.__model.length-1;b>=0;b--)if(Array.isArray(this.__model[b]))for(c=this.__model[b].length-1;c>=0;c--)if(AC.Element.hasClassName(a,this._prefix+this.__model[b][c].name()))return this.__model[b][c];return null},__matchQualifier:function(a){var b,c;if(!AC.Element.isElement(a))return null;for(b=this.__model.length-1;b>=0;b--)if(Array.isArray(this.__model[b]))for(c=this.__model[b].length-1;c>=0;c--)if(\"function\"==typeof this.__model[b][c].qualifier&&this.__model[b][c].qualifier.apply(this.__model[b][c],[a,this._prefix])===!0)return this.__model[b][c];return null},__addToModel:function(a){AC.Registry.Component.isComponent(a)&&(\"undefined\"==typeof this.__model[a.level()]&&(this.__model[a.level()]=[]),this.__model[a.level()].push(a))},lookup:function(a){return\"string\"==typeof a&&\"undefined\"!=typeof this.__lookup[a]?this.__lookup[a]:null},hasComponent:function(a){var b;return\"object\"==typeof a&&\"function\"==typeof a.name&&(b=this.lookup(a.name()))?b===a:!1},reserveName:function(a){if(\"string\"!=typeof a)throw\"Cannot reserve name: Name must be a string\";if(!this.lookup(a))throw\"Cannot reserve name: Component with name already exists.\";this._reservedNames.push(a)},__isReserved:function(a){if(\"string\"==typeof a)return-1!==this._reservedNames.indexOf(a);throw\"Cannot check if this name is reserved because it is not a String.\"}},AC.Registry.Component=AC.Class(),AC.Registry.Component.prototype={initialize:function(a,b,c,d,e){if(\"string\"!=typeof a)throw\"Cannot create Component without a name\";this._name=a,this._properties=b||{},this.qualifier=\"function\"==typeof c?c:AC.Function.emptyFunction,this._parent=d,this._context=e||{},AC.Object.synthesize(this)},properties:function(){var a=\"undefined\"==typeof this._parent||null===this._parent?{}:this._parent.properties();return AC.Object.extend(a,this._properties)},context:function(a){return this._context[a]?this._context[a]:Array.isArray(this._context.inherits)&&-1!==this._context.inherits.indexOf[a]&&this.parent()?this.parent().context(a):null},level:function(){return\"undefined\"!=typeof this._level?this._level:\"_base\"===this._name?0:\"undefined\"==typeof this._parent||\"_base\"===this._parent.name()?1:this._parent.level()+1}},AC.Registry.Component.isComponent=function(a){return a instanceof AC.Registry.Component},AC.namespace(\"AC.NotificationCenter\"),AC.NotificationCenter=function(){var a={};return{publish:function(b,c,d){c=c||{};var e=function(){!a[b]||a[b].length<1||a[b].forEach(function(a){a.target&&c.target?a.target===c.target&&a.callback(c.data):a.callback(c.data)})};\"object\"==typeof window.testtool&&\"function\"==typeof testtool.publishMessage&&(\"object\"==typeof testtool.mDefaults&&(testtool.mDefaults.messageData=c),testtool.publishMessage(b)),d===!0?window.setTimeout(e,10):e()},subscribe:function(b,c,d){a[b]||(a[b]=[]),a[b].push({callback:c,target:d})},unsubscribe:function(b,c,d){a[b].forEach(function(e,f){d?c===e.callback&&e.target===d&&a[b].splice(f,1):c===e.callback&&a[b].splice(f,1)})},hasSubscribers:function(b,c){return!a[b]||a[b].length<1?!1:c?(a[b].forEach(function(a){return a.target&&c&&a.target===c?!0:void 0}),!1):!0}}}(),AC.namespace(\"AC.Canvas\"),AC.Canvas.imageDataFromFile=function(a,b){if(\"function\"!=typeof b)throw\"Need callback method to call when imageData is retrieved.\";if(\"string\"!=typeof a||\"\"===a)throw\"Src for imageData must be an Image Node with a src attribute or a string.\";var c=new Image;c.onload=function(){b(AC.Canvas.imageDataFromNode(c))},c.src=a},AC.Canvas.imageDataFromNode=function(a){if(!AC.Element.isElement(a)||\"null\"===a.getAttribute(\"src\")||0===a.width)throw\"Source node must be an IMG tag and must have already loaded.\";var b,c=document.createElement(\"canvas\"),d=c.getContext(\"2d\");return c.width=a.width,c.height=a.height,d.drawImage(a,0,0),b=d.getImageData(0,0,a.width,a.height)},AC.EasingFunctions={linear:function(a,b,c,d){return c*a/d+b},easeInQuad:function(a,b,c,d){return c*(a/=d)*a+b},easeOutQuad:function(a,b,c,d){return-c*(a/=d)*(a-2)+b},easeInOutQuad:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b},easeInCubic:function(a,b,c,d){return c*(a/=d)*a*a+b},easeOutCubic:function(a,b,c,d){return c*((a=a/d-1)*a*a+1)+b},easeInOutCubic:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a+b:c/2*((a-=2)*a*a+2)+b},easeInQuart:function(a,b,c,d){return c*(a/=d)*a*a*a+b},easeOutQuart:function(a,b,c,d){return-c*((a=a/d-1)*a*a*a-1)+b},easeInOutQuart:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a+b:-c/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(a,b,c,d){return c*(a/=d)*a*a*a*a+b},easeOutQuint:function(a,b,c,d){return c*((a=a/d-1)*a*a*a*a+1)+b},easeInOutQuint:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a*a+b:c/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(a,b,c,d){return-c*Math.cos(a/d*(Math.PI/2))+c+b},easeOutSine:function(a,b,c,d){return c*Math.sin(a/d*(Math.PI/2))+b},easeInOutSine:function(a,b,c,d){return-c/2*(Math.cos(Math.PI*a/d)-1)+b},easeInExpo:function(a,b,c,d){return 0==a?b:c*Math.pow(2,10*(a/d-1))+b},easeOutExpo:function(a,b,c,d){return a==d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b},easeInOutExpo:function(a,b,c,d){return 0==a?b:a==d?b+c:(a/=d/2)<1?c/2*Math.pow(2,10*(a-1))+b:c/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(a,b,c,d){return-c*(Math.sqrt(1-(a/=d)*a)-1)+b},easeOutCirc:function(a,b,c,d){return c*Math.sqrt(1-(a=a/d-1)*a)+b},easeInOutCirc:function(a,b,c,d){return(a/=d/2)<1?-c/2*(Math.sqrt(1-a*a)-1)+b:c/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(a,b,c,d){var e=1.70158,f=0,g=c;if(0==a)return b;if(1==(a/=d))return b+c;if(f||(f=.3*d),g<Math.abs(c)){g=c;var e=f/4}else var e=f/(2*Math.PI)*Math.asin(c/g);return-(g*Math.pow(2,10*(a-=1))*Math.sin(2*(a*d-e)*Math.PI/f))+b},easeOutElastic:function(a,b,c,d){var e=1.70158,f=0,g=c;if(0==a)return b;if(1==(a/=d))return b+c;if(f||(f=.3*d),g<Math.abs(c)){g=c;var e=f/4}else var e=f/(2*Math.PI)*Math.asin(c/g);return g*Math.pow(2,-10*a)*Math.sin(2*(a*d-e)*Math.PI/f)+c+b},easeInOutElastic:function(a,b,c,d){var e=1.70158,f=0,g=c;if(0==a)return b;if(2==(a/=d/2))return b+c;if(f||(f=.3*d*1.5),g<Math.abs(c)){g=c;var e=f/4}else var e=f/(2*Math.PI)*Math.asin(c/g);return 1>a?-.5*g*Math.pow(2,10*(a-=1))*Math.sin(2*(a*d-e)*Math.PI/f)+b:g*Math.pow(2,-10*(a-=1))*Math.sin(2*(a*d-e)*Math.PI/f)*.5+c+b},easeInBack:function(a,b,c,d,e){return void 0==e&&(e=1.70158),c*(a/=d)*a*((e+1)*a-e)+b},easeOutBack:function(a,b,c,d,e){return void 0==e&&(e=1.70158),c*((a=a/d-1)*a*((e+1)*a+e)+1)+b},easeInOutBack:function(a,b,c,d,e){return void 0==e&&(e=1.70158),(a/=d/2)<1?c/2*a*a*(((e*=1.525)+1)*a-e)+b:c/2*((a-=2)*a*(((e*=1.525)+1)*a+e)+2)+b},easeInBounce:function(a,b,c,d){return c-AC.EasingFunctions.easeOutBounce(d-a,0,c,d)+b},easeOutBounce:function(a,b,c,d){return(a/=d)<1/2.75?7.5625*c*a*a+b:2/2.75>a?c*(7.5625*(a-=1.5/2.75)*a+.75)+b:2.5/2.75>a?c*(7.5625*(a-=2.25/2.75)*a+.9375)+b:c*(7.5625*(a-=2.625/2.75)*a+.984375)+b},easeInOutBounce:function(a,b,c,d){return d/2>a?.5*AC.EasingFunctions.easeInBounce(2*a,0,c,d)+b:.5*AC.EasingFunctions.easeOutBounce(2*a-d,0,c,d)+.5*c+b}},AC.DeferredQueue=AC.Class({__defaultOptions:{autoplay:!1,asynchronous:!1,delay:0},initialize:function(a){\"object\"!=typeof a&&(a={}),this._options=AC.Object.extend(AC.Object.clone(this.__defaultOptions),a),this._isPlaying=!1,this._isRunningAction=!1,this._queue=[],this.didFinish=this.__didFinish.bind(this),AC.Object.synthesize(this)},add:function(a){if(\"function\"!=typeof a)throw\"Deferred Queue action must be a function.\";this.queue().push(a),this.isPlaying()||this.options().autoplay!==!0||this.start()},remove:function(a){this.setQueue(AC.Array.without(this.queue(),a))},start:function(){return this.isPlaying()?!1:(this.setIsPlaying(!0),void this.__runNextAction())},stop:function(){return this.isPlaying()?void this.setIsPlaying(!1):!1},clear:function(){this.setQueue([]),this.stop()},__didFinish:function(){this.setIsRunningAction(!1),this.__runNextAction()},__runNextAction:function(){var a=this;if(!this.isPlaying())return!1;if(this.queue().length&&!this.isRunningAction()){var b=this.queue().shift();\"function\"==typeof b?(b(),this.options().asynchronous===!0?this.setIsRunningAction(!0):\"number\"==typeof this.options().delay&&this.options().delay>0?window.setTimeout(function(){a.__runNextAction()},1e3*this.options().delay):this.__runNextAction()):this.__runNextAction()}}}),AC.namespace(\"AC.Viewport\"),AC.Viewport.scrollOffsets=function(){return{x:window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,y:window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop}},AC.version=\"1.4.1\";"
  },
  {
    "path": "works/demo/ali/file/ac_retina.js",
    "content": "AC.Retina=AC.Class(),AC.Retina.prototype={__defaultOptions:{attribute:\"data-hires\",recursive:!0,queueSize:8,publishNotifications:!0},initialize:function(a){if(this._benchmarkTimer=new Date,this._options={},this._globalBlacklist=null,this._tagNameBlacklist=null,this._images=[],this._paused=!1,this._deferredQueue=null,this.__queues=[],AC.Object.synthesize(this),\"object\"!=typeof a&&(a={}),this.setOptions(AC.Object.extend(AC.Object.clone(this.__defaultOptions),a)),this.__setupGlobalBlacklists(),!AC.Retina.Debug&&this.globalBlacklist().isBlacklisted())return this.replace=AC.Function.emptyFunction,!1;if(\"undefined\"==typeof AC.Retina.imageComponentRegistry&&(AC.Retina.imageComponentRegistry=new AC.Registry(AC.Retina.classNamePrefix())),this.__listenToMediaQueryChange(),AC.Retina.windowHasLoaded)this.__setup();else{var b=this.__setup.bind(this);AC.Element.addEventListener(window,\"load\",b)}},shouldReplace:function(a,b,c){var d,e,f=new AC.Retina.Image(null,c);if(\"undefined\"==typeof a)try{console.warn(\"AC.Retina.shouldReplace() expects an argument.\")}catch(g){}return!this.globalBlacklist().isBlacklisted()&&(d=\"string\"==typeof a?AC.Retina.imageComponentRegistry.lookup(a):AC.Element.isElement(a)?AC.Retina.imageComponentRegistry.match(a):null!==a&&\"object\"==typeof a&&AC.Retina.imageComponentRegistry.hasComponent(a)?a:AC.Retina.imageComponentRegistry.lookup(\"img-tag\"),f.setSrc(b||\"http://images.apple.com/global/elements/blank.gif\"),f.setComponent(d),null!==d&&\"object\"==typeof d&&\"function\"==typeof d.context&&(e=d.context(\"blacklist\"),e&&\"object\"==typeof e))?!e.isBlacklisted(null,f):!1},bestSrc:function(a,b,c,d){if(\"string\"!=typeof a)throw\"Need a source string to get hires src.\";var e=new AC.Retina.Image(null,d);return\"string\"==typeof b&&(b=AC.Retina.imageComponentRegistry.lookup(b)),null!==b&&\"object\"==typeof b&&AC.Retina.imageComponentRegistry.hasComponent(b)||(b=AC.Retina.imageComponentRegistry.lookup(\"img-tag\")),e.setSrc(a),e.setComponent(b),\"function\"==typeof c&&e.checkExists(c,a),e.isHires()||e.ignored()||!this.shouldReplace(b,a,b)?a:e.hiresSrc()},replace:function(a,b){\"undefined\"==typeof this.__boundAddToQueue&&(this.__boundAddToQueue=this.__addToQueue.bind(this));var c;if(a=AC.Element.getElementById(a),b=AC.Element.getElementById(b),!AC.Element.isElement(a))throw\"Cannot replace content because scopeElement is not valid\";c=this.__findDenotedElements(a,b),c.length<1||(this.__filterDenotedImages(c),this.__filterChildImages(c),this.__replaceQueues())},paused:function(){return this._paused!==!0||this.deferredQueue()||this.setDeferredQueue(new AC.DeferredQueue),this._paused},pause:function(){this.paused()||this.setPaused(!0)},resume:function(){this.paused()&&(this.setPaused(!1),this.deferredQueue()&&(this.deferredQueue().start(),this.setDeferredQueue(null)))},publishNotification:function(a,b){\"object\"==typeof AC.NotificationCenter&&this.options().publishNotifications===!0&&AC.NotificationCenter.publish(AC.Retina.classNamePrefix()+a,{target:this,data:b})},subscribeToNotification:function(a,b){\"object\"==typeof AC.NotificationCenter&&this.options().publishNotifications===!0&&AC.NotificationCenter.subscribe(AC.Retina.classNamePrefix()+a,b,this)}},AC.Retina.rasterImageFormatRegExp=function(){return AC.Retina._rasterImageFormatRegExp},AC.Retina._rasterImageFormatRegExp=/(\\.jpg($|#.*|\\?.*)|\\.png($|#.*|\\?.*)|\\.gif($|#.*|\\?.*))/,AC.Retina.devicePixelRatio=function(){if(\"undefined\"!=typeof AC.Retina._devicePixelRatio)return AC.Retina._devicePixelRatio;var a=!1,b=null;return null!==AC.Retina.minDPRMediaQuery()&&(b=window.matchMedia(\"(\"+AC.Retina.minDPRMediaQuery()+\": \"+AC.Retina.minDPR()+\")\"),a=b.matches),null===b&&(a=\"undefined\"!=typeof window.devicePixelRatio&&window.devicePixelRatio>=AC.Retina.minDPR()),AC.Retina._devicePixelRatio=AC.Retina.Debug||a===!0?2:1,AC.Retina._devicePixelRatio},AC.Retina.minDPRMediaQuery=function(){if(\"undefined\"!=typeof AC.Retina._minDPRMediaQuery)return AC.Retina._minDPRMediaQuery;var a,b,c=[\"min-device-pixel-ratio\",\"-webkit-min-device-pixel-ratio\",\"min--moz-device-pixel-ratio\",\"-o-min-device-pixel-ratio\"];if(\"undefined\"!=typeof window.matchMedia)for(a=0;a<c.length;a+=1)if(b=window.matchMedia(\"(\"+c[a]+\": 0)\"),b.matches===!0)return AC.Retina._minDPRMediaQuery=c[a],AC.Retina._minDPRMediaQuery;return AC.Retina._minDPRMediaQuery=null,AC.Retina._minDPRMediaQuery},AC.Retina.classNamePrefix=function(){return AC.Retina._classNamePrefix},AC.Retina._classNamePrefix=\"ac-retina-\",AC.Retina.minDPR=function(){return AC.Retina._minDPR},AC.Retina._minDPR=1.5,AC.Retina.windowHasLoaded=!1,AC.Element.addEventListener(window,\"load\",function(){AC.Retina.windowHasLoaded=!0}),AC.Retina.iOSHandheld=function(){return AC.log(\"AC.Retina.iOSHandheld is deprecated. For use outside of AC.Retina, use AC.Environment methods instead.\"),AC.Retina.Blacklist.Qualifiers.iOSHandheld()},AC.Object.extend(AC.Retina.prototype,{__setupGlobalBlacklists:function(){this.setGlobalBlacklist(new AC.Retina.Blacklist([AC.Retina.Blacklist.Qualifiers.iOSHandheld,AC.Retina.Blacklist.Qualifiers.antiquatedBrowser])),this.setTagNameBlacklist(new AC.Retina.Blacklist([AC.Retina.Blacklist.Qualifiers.restrictedTagName]))},__listenToMediaQueryChange:function(){var a,b=this,c=function(){a.matches===!0&&(delete AC.Retina._devicePixelRatio,AC.Retina.windowHasLoaded&&b.replace(document.body),a.removeListener(c))};AC.Retina.devicePixelRatio()<AC.Retina.minDPR()&&null!==AC.Retina.minDPRMediaQuery()&&(a=window.matchMedia(\"(\"+AC.Retina.minDPRMediaQuery()+\": \"+AC.Retina.minDPR()+\")\"),\"function\"==typeof a.addListener&&a.matches===!1&&a.addListener(c))},__setup:function(){this.replace(document.body)},__findDenotedElements:function(a,b){var c=this.__denotedElements(a);return AC.Element.isElement(b)?AC.Retina.__isRecursivelyDenoted(b,this.options().attribute)&&c.push(a):AC.Retina.__nearestAncestorHasAttribute(a,this.options().attribute,\"true\")&&c.push(a),this.publishNotification(\"foundDenotedElements\",c),c},__filterDenotedImages:function(a){var b=this.__filterElements(a);this.publishNotification(\"filteredDenotedImages\",b),b.length>0&&(b.forEach(this.__boundAddToQueue),this.publishNotification(\"queuedDenotedImages\",this.__queues[this.__queues.length-1]))},__filterChildImages:function(a){var b,c;if(this.options().recursive===!0)for(c=0;c<a.length;c+=1)b=this.__imagesWithinElement(a[c]),this.publishNotification(\"filteredChildImages\",b),b.length>0&&(this.__createQueue(),b.forEach(this.__boundAddToQueue),this.publishNotification(\"queuedChildImages\",this.__queues[this.__queues.length-1]))},__createQueue:function(){var a=new AC.Retina.Queue(this.options().queueSize);this.__queues.push(a)},__addToQueue:function(a){(0===this.__queues.length||this.__queues[this.__queues.length-1].ran()===!0)&&this.__createQueue(),this.__queues[this.__queues.length-1].add(a)},__isInQueue:function(a){var b;for(b=0;b<this.__queues.length;b+=1)if(-1!==this.__queues[b].queue().indexOf(a))return!0;return!1},__denotedElements:function(a){a=\"undefined\"==typeof a?document.body:AC.Element.getElementById(a);var b=AC.Element.selectAll(\"[\"+this.options().attribute+'=\"true\"]',a);return b},__imagesWithinElement:function(a){var b,c,d=this.__filterElement.bind(this),e=this.tagNameBlacklist(),f=[];for(a=AC.Element.getElementById(a),b=function(a){return!e.isBlacklisted(a)&&d(a)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP},b.acceptNode=b,c=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT,b,!1);c.nextNode();)AC.Retina.Image.isImage(c.currentNode.ac_retina_image)&&f.push(c.currentNode.ac_retina_image);return f},__filterElements:function(a){var b,c=[];for(b=0;b<a.length;b+=1)this.__filterElement(a[b])&&c.push(a[b].ac_retina_image);return c},__filterElement:function(a){var b,c=a.ac_retina_image;if(!AC.Retina.__isRecursivelyDenoted(a,this.options().attribute))return!1;if(AC.Retina.Image.isImage(c)===!1)b=this.__optionsFromElement(a),c=new AC.Retina.Image(a,b),a.ac_retina_image=c;else if(c.replaced())return!1;return this.__matchComponentToElement(a)===!1?!1:this.__filterImage(c)?(this.images().push(c),!0):!1},__matchComponentToElement:function(a){var b,c=a.ac_retina_image;if(AC.Retina.Image.isImage(c)===!1)throw\"Element is missing AC.Retina.Image object.\";return b=AC.Retina.imageComponentRegistry.match(a),b&&\"_base\"!==b.name()?(c.setStatus(\"is-image\"),c.setComponent(b),!0):(c.setStatus(\"not-image\"),!1)},__filterImage:function(a){var b;if(AC.Retina.Image.isImage(a)===!1)throw\"Element is missing AC.Retina.Image object.\";return a.isHires()?(a.setStatus(\"already-hires\"),!1):a.ignored()?(a.setStatus(\"ignored\"),!1):(b=a.component().context(\"blacklist\"),AC.Retina.Blacklist.isBlacklist(b)&&b.isBlacklisted(a.element(),a)?(a.setStatus(\"blacklisted\"),!1):!0)},__optionsFromElement:function(a){var b,c={},d=a.getAttribute(this.options().attribute+\"-options\");if(d)for(d=d.split(\",\"),b=0;b<d.length;b+=1){d[b]=d[b].split(\":\"),c[d[b][0]]=d[b][1];try{c[d[b][0]]=JSON.parse(c[d[b][0]])}catch(e){}c[d[b][0].camelize()]=c[d[b][0]]}return c},__replaceQueues:function(){\"function\"!=typeof this.__boundReplaceQueues&&(this.__boundReplaceQueues=this.__replaceQueues.bind(this));var a;this.__queues.length>0&&(a=this.__queues[0],this.__queues.splice(0,1),a.run(\"replace\",this.__boundReplaceQueues))}}),AC.Retina.__isRecursivelyDenoted=function(a,b){return\"true\"===a.getAttribute(b)||AC.Retina.__nearestAncestorHasAttribute(a,b,\"true\")&&\"false\"!==a.getAttribute(b)?!0:!1},AC.Retina.__nearestAncestorHasAttribute=function(a,b,c){var d,e=AC.Retina.__ancestors(a);for(d=0;d<e.length;d+=1)if(e[d].hasAttribute(b))return\"undefined\"==typeof c||e[d].getAttribute(b)===c?e[d]:null;return null},AC.Retina.__ancestors=function(a){a=AC.Element.getElementById(a);var b=[];if(AC.Element.isElement(a.parentNode))for(;a=a.parentNode;)AC.Element.isElement(a)&&b.push(a);return b},AC.Retina.Blacklist=AC.Class(),AC.Retina.Blacklist.prototype={initialize:function(a){this._qualifiers=[],AC.Object.synthesize(this),\"undefined\"!=typeof a&&this.addQualifier(a)},addQualifier:function(a){var b;if(\"function\"==typeof a)this.qualifiers().push(a);else if(Array.isArray(a)&&a.length>0)for(b=0;b<a.length;b++)this.addQualifier(a[b])},isBlacklisted:function(a,b){var c;for(c=0;c<this.qualifiers().length;c++)if(this.qualifiers()[c].call(b||this,a))return!0;return!1}},AC.Retina.Blacklist.isBlacklist=function(a){return a instanceof AC.Retina.Blacklist},AC.Retina.Blacklist.Qualifiers={},AC.Retina.Blacklist.Qualifiers.DPRLessThanMinAndNotSVG=function(){return\"svg\"!==this.options().hiresFormat&&AC.Retina.devicePixelRatio()<AC.Retina.minDPR()},AC.Retina.Blacklist.Qualifiers.iOSHandheld=function(){return AC.Environment.Feature.isHandheld()&&\"iOS\"===AC.Environment.Browser.os},AC.Retina.Blacklist.Qualifiers.antiquatedBrowser=function(){return-1!==AC.Environment.Browser.name.indexOf(\"Safari\")&&AC.Environment.Browser.version<5||\"IE\"===AC.Environment.Browser.name&&AC.Environment.Browser.version<9||\"Firefox\"===AC.Environment.Browser.name&&AC.Environment.Browser.version<5||\"Chrome\"===AC.Environment.Browser.name&&AC.Environment.Browser.version<16?!0:!1},AC.Retina.Blacklist.Qualifiers.restrictedTagName=function(a){var b=[\"object\",\"param\",\"embed\",\"source\"];return!AC.Element.isElement(a)||b.indexOf(a.tagName.toLowerCase())>=0?!0:!1},AC.Retina.Image=AC.Class(),AC.Retina.Image.prototype={initialize:function(a,b){this._options=b||{},this._element=AC.Element.getElementById(a),this._component=null,this._status=\"considered\",this._isPreloaded=!1,this._replaced=!1,this._exists=null,this._ignored=null,this._src=null,this._hiresSrc=null,this._srcFormat=null,this._isHires=null,this._width=null,this._height=null,AC.Object.synthesize(this),AC.Element.isElement(this.element())&&\"img\"===this.element().tagName.toLowerCase()&&(\"undefined\"!=typeof this.element().naturalWidth&&0!==this.element().naturalWidth&&this.setWidth(this.element().naturalWidth),\"naturalHeight\"!=typeof this.element().naturalWidth&&0!==this.element().naturalHeight&&this.setHeight(this.element().naturalHeight))},setComponent:function(a){return\"object\"==typeof a&&null===this.component()?(this._component=a,this.setOptions(AC.Object.extend(AC.Retina.Image.convertParametersToObject(this.src()),this.options())),this.setOptions(AC.Object.extend(AC.Object.clone(a.properties()),this.options())),\"undefined\"!=typeof this.options().hiResFormat&&(this.options().hiresFormat=this.options().hiResFormat),this.component()):void 0},setStatus:function(a){return\"string\"!=typeof a?!1:(\"undefined\"!=typeof AC.Retina.Debug&&(AC.Retina.Debug.sharedInstance().addStatus(a),AC.Element.isElement(this.element())&&this.element().setAttribute(\"data-hires-status\",a)),this._status=a,this._status)},__memoizedContextGetter:function(a){if(this.component()){if(\"function\"!=typeof this[\"__\"+a]){var b=this.component().context(a);this[\"__\"+a]=\"function\"==typeof b?b.bind(this):AC.Function.emptyFunction}return this[\"__\"+a]()}throw\"Component not assigned yet.\"},src:function(){return null!==this._src?this._src:(this.setSrc(this.__memoizedContextGetter(\"src\")),this._src)},hiresSrc:function(){if(null!==this._hiresSrc)return this._hiresSrc;if(this.ignored())return this.setHiresSrc(this.src()),this._hiresSrc;var a=this.__memoizedContextGetter(\"hiresSrc\");return this.options().cleanHiresSrc===!0&&(a=a.replace(/((\\?.*)|(#.*))$/,\"\")),this.setHiresSrc(a),this._hiresSrc},srcFormat:function(){if(null!==this._srcFormat)return this._srcFormat;var a=this.src().match(/^.*\\.([a-z]*)($|#.*|\\?.*)/i);return this.setSrcFormat(null===a?null:a[1]),this._srcFormat},isHires:function(){if(this._isHires===!0)return this._isHires;var a=this.src();return null===a.match(AC.Retina.rasterImageFormatRegExp())||this.replaced()===!0?(this.setIsHires(!0),this._isHires):(this.setIsHires(!1),this._isHires)},ignored:function(){return this.replaced()?(this.setIgnored(!1),this._ignored):null!==this._ignored?this._ignored:(this.setIgnored(!!this.src().match(this.options().ignoreRegex)),this._ignored)},replace:function(a){var b,c=this;return c.replaced()===!0||c.exists()===!1?a():c.options().checkExists===!0&&\"boolean\"!=typeof c.exists()?void c.checkExists.call(c,function(b){c.setExists(b),c.exists()||c.setStatus(\"404\"),c.replace(a)}):(b=function(b){var d=function(){c.__memoizedContextGetter(\"replace\"),c.setStatus(\"replaced\"),c.setReplaced(!0)};b&&(AC.Retina.sharedInstance().paused()?AC.Retina.sharedInstance().deferredQueue().add(d):d()),\"function\"==typeof a&&a()},c.setStatus(\"replacing\"),void(c.options().preload||c.options().preloadIfNoDimensions&&(!c.width()||!c.height())?c.preload(b):b(!0)))},checkExists:function(a,b){var c=this;\"undefined\"==typeof b&&(b=c.hiresSrc()),(c.options().checkAsRootRelative===!0||0===b.indexOf(window.location.origin)||0===b.indexOf(\"/\"))&&(b=c.options().checkAsRootRelative===!0?b.replace(/^https?:\\/\\/[^\\/]*\\//,\"/\"):b,\"object\"==typeof AC.Ajax&&AC.Ajax.checkURL(b,a))},preload:function(a){var b,c=this;return c.isPreloaded()===!0?a(!0):c.exists()===!1?a(!1):(c.setStatus(\"loading\"),b=new Image,AC.Element.addEventListener(b,\"load\",function(){c.setIsPreloaded(!0),c.setWidth(b.width/AC.Retina.devicePixelRatio(AC.Retina.minDPR())),c.setHeight(b.height/AC.Retina.devicePixelRatio(AC.Retina.minDPR())),c.setStatus(\"loaded\"),\"function\"==typeof a&&a(!0)}),c.options().checkExists===!0&&AC.Element.addEventListener(b,\"error\",function(){c.setStatus(\"404\"),c.setExists(!1),\"function\"==typeof a&&a(!1)}),void(b.src=c.hiresSrc()))}},AC.Retina.Image.isImage=function(a){return a instanceof AC.Retina.Image},AC.Retina.Image.removeCSSURLSyntax=function(a){var b;return\"string\"==typeof a&&\"function\"==typeof a.replace&&(b=a.match(/url\\((\\'|\\\")?([^\\\"\\'\\)]+)(\\'|\\\")?\\)/i))?b[2]:\"\"},AC.Retina.Image.replaceExtension=function(a,b){var c=a.match(/^(.*)((\\.[a-z]{3})($|#.*|\\?.*))/i);return null!==c&&c.length>1?c[1]+\".\"+b+(c[4]||\"\"):void 0},AC.Retina.Image.convertParametersToObject=function(a){if(\"string\"==typeof a&&\"function\"==typeof a.toQueryParams){var b,c={},d=a.toQueryParams();for(b in d)d.hasOwnProperty(b)&&\"undefined\"!=typeof d[b]&&(c[b.camelize()]=d[b]);return c}return{}},AC.Retina.Queue=AC.Class(),AC.Retina.Queue.prototype={initialize:function(a,b){this._threadCount=a,this._queue=[],\"undefined\"!=typeof b&&this.add(b),this._ran=!1,AC.Object.synthesize(this)},add:function(a){if(this._ran!==!0){var b;if(Array.isArray(a))for(b=0;b<a.length;b++)this.add(a[b]);else AC.Retina.Image.isImage(a)&&(this._queue.push(a),\"function\"==typeof a.setStatus&&a.setStatus(\"queued\"))}},run:function(a,b){if(this._ran!==!0){var c=this,d=c._queue.slice(0).reverse(),e=d.length<c._threadCount?d.length:c._threadCount,f=e;c._ran=!0;var g=function i(){var e=d.pop();if(\"undefined\"==typeof e){if(f--,0===f)return\"function\"==typeof b&&b(),void AC.Retina.sharedInstance().publishNotification(\"queueEmptied\",c)}else\"function\"==typeof a?a.apply(e,[e,i]):\"string\"==typeof a&&\"function\"==typeof e[a]&&e[a].apply(e,[i])},h=function(){var a;for(a=0;e>a;a++)g()};window.setTimeout(h,10)}}},AC.Retina.version=\"3.0\",\"undefined\"==typeof AC.Retina.imageComponentRegistry&&(AC.Retina.imageComponentRegistry=new AC.Registry(AC.Retina.classNamePrefix(),{contextInherits:[\"src\",\"hiresSrc\",\"replace\",\"blacklist\"]})),AC.Retina.imageComponentRegistry.addComponent(\"_base\",{ignoreRegex:/(^http:\\/\\/movies\\.apple\\.com\\/|\\/105\\/|\\/media\\/|\\/global(\\/ac_media_player)?\\/elements\\/quicktime\\/|_(([2-9]|[1-9][0-9]+)x|nohires)(\\.[a-z]+)($|#.*|\\?.*))/i,filenameRegex:/(.*)(\\.[a-z]{3}($|#.*|\\?.*))/i,filenameInsert:\"_☃x\",hiresFormat:!1,cleanHiresSrc:!0,preload:!1,checkExists:!0,checkAsRootRelative:!0},AC.Function.emptyFunction,null,{src:function(){return\"\"},hiresSrc:function(){var a,b=this.src(),c=this.options().hiresFormat,d=this.srcFormat();return\"string\"==typeof c&&c!==d?AC.Retina.Image.replaceExtension(b,c):(a=this.src().match(this.options().filenameRegex),null===a?null:a[1]+this.options().filenameInsert.replace(\"☃\",AC.Retina.devicePixelRatio(AC.Retina.minDPR()))+a[2])},replace:AC.Function.emptyFunction,blacklist:new AC.Retina.Blacklist}),AC.Retina.imageComponentRegistry.addComponent(\"background-image\",{preload:!0},function(a){var b=AC.Element.getStyle(a,\"background-image\");return\"img\"!==a.tagName.toLowerCase()&&b&&!!b.match(/^url\\(([^\\)]+)\\)$/i)},\"_base\",{src:function(){return AC.Retina.Image.removeCSSURLSyntax(AC.Element.getStyle(this.element(),\"background-image\"))},replace:function(){var a=AC.Element.getStyle(this.element(),\"background-size\");(!a||a.match(\"auto\"))&&AC.Element.setStyle(this.element(),\"background-size:\"+this.width()+\"px \"+this.height()+\"px;\"),AC.Element.setStyle(this.element(),\"background-image:url(\"+this.hiresSrc()+\");\")},blacklist:new AC.Retina.Blacklist([AC.Retina.Blacklist.Qualifiers.DPRLessThanMinAndNotSVG])}),AC.Retina.imageComponentRegistry.addComponent(\"img-tag\",{preloadIfNoDimensions:!0},function(a){return\"img\"===a.tagName.toLowerCase()&&!!a.getAttribute(\"src\")},\"_base\",{src:function(){return this.element().getAttribute(\"src\")},replace:function(){isNaN(parseInt(this.element().getAttribute(\"width\"),10))&&this.width()&&this.element().setAttribute(\"width\",this.width()),isNaN(parseInt(this.element().getAttribute(\"height\"),10))&&this.height()&&this.element().setAttribute(\"height\",this.height()),this.element().setAttribute(\"src\",this.hiresSrc())},blacklist:new AC.Retina.Blacklist([AC.Retina.Blacklist.Qualifiers.DPRLessThanMinAndNotSVG])}),AC.Retina.sharedInstance();"
  },
  {
    "path": "works/demo/ali/file/aliyun_core.js",
    "content": "\"undefined\"==typeof AC&&(AC={}),Object.extend(Event,{_domReady:function(){arguments.callee.done||(arguments.callee.done=!0,this._timer&&clearInterval(this._timer),AC.isDomReady=!0,this._readyCallbacks&&this._readyCallbacks.each(function(a){a()}),this._readyCallbacks=null)},onDOMReady:function(a){if(AC.isDomReady)a();else{if(!this._readyCallbacks){var b=this._domReady.bind(this);document.addEventListener&&document.addEventListener(\"DOMContentLoaded\",b,!1),document.all&&(document.onreadystatechange=function(){\"complete\"==this.readyState&&b()}),/WebKit/i.test(navigator.userAgent)&&(this._timer=setInterval(function(){/loaded|complete/.test(document.readyState)&&b()},10)),Event.observe(window,\"load\",b),Event._readyCallbacks=[]}Event._readyCallbacks.push(a)}}}),AC.decorateSearchInput=function(a,b){var c=$(a),d=null,e=0,f=\"\",g=\"\";if(b&&(b.results&&(e=b.results),b.placeholder&&(f=b.placeholder),b.autosave&&(g=b.autosave)),AC.Detector.isWebKit())AC.Detector.isWin()&&c.addClassName(\"not-round\"),c.setAttribute(\"type\",\"search\"),c.getAttribute(\"results\")||c.setAttribute(\"results\",e),null!=f&&(c.setAttribute(\"placeholder\",f),c.setAttribute(\"autosave\",g));else{c.setAttribute(\"autocomplete\",\"off\"),d=document.createElement(\"input\"),c.parentNode.replaceChild(d,c);var h=document.createElement(\"span\");Element.addClassName(h,\"left\");var i=document.createElement(\"span\");Element.addClassName(i,\"right\");var j=document.createElement(\"div\");Element.addClassName(j,\"reset\");var k=document.createElement(\"div\");Element.addClassName(k,\"search-wrapper\");var l=a.value==f,m=0==a.value.length;(l||m)&&(c.value=f,Element.addClassName(k,\"blurred\"),Element.addClassName(k,\"empty\")),k.appendChild(h),k.appendChild(c),k.appendChild(i),k.appendChild(j);var n=function(){var a=Element.hasClassName(k,\"blurred\");c.value==f&&a&&(c.value=\"\"),Element.removeClassName(k,\"blurred\")};Event.observe(c,\"focus\",n);var o=function(){\"\"==c.value&&(Element.addClassName(k,\"empty\"),c.value=f),Element.addClassName(k,\"blurred\")};Event.observe(c,\"blur\",o);var p=function(){c.value.length>=0&&Element.removeClassName(k,\"empty\")};Event.observe(c,\"keydown\",p);var q=function(){return function(a){var b=!1;if(\"keydown\"==a.type){if(27!=a.keyCode)return;b=!0}c.blur(),c.value=\"\",Element.addClassName(k,\"empty\"),c.focus()}};Event.observe(j,\"mousedown\",q()),Event.observe(c,\"keydown\",q()),d&&d.parentNode.replaceChild(k,d)}},Element.addMethods({getInnerDimensions:function(a){a=$(a);var b=Element.getDimensions(a),c=b.height,d=Element.getStyle;c-=d(a,\"border-top-width\")&&\"medium\"!=d(a,\"border-top-width\")?parseInt(d(a,\"border-top-width\"),10):0,c-=d(a,\"border-bottom-width\")&&\"medium\"!=d(a,\"border-bottom-width\")?parseInt(d(a,\"border-bottom-width\"),10):0,c-=d(a,\"padding-top\")?parseInt(d(a,\"padding-top\"),10):0,c-=d(a,\"padding-bottom\")?parseInt(d(a,\"padding-bottom\"),10):0;var e=b.width;return e-=d(a,\"border-left-width\")&&\"medium\"!=d(a,\"border-left-width\")?parseInt(d(a,\"border-left-width\"),10):0,e-=d(a,\"border-right-width\")&&\"medium\"!=d(a,\"border-right-width\")?parseInt(d(a,\"border-right-width\"),10):0,e-=d(a,\"padding-left\")?parseInt(d(a,\"padding-left\"),10):0,e-=d(a,\"padding-right\")?parseInt(d(a,\"padding-right\"),10):0,{width:e,height:c}},getOuterDimensions:function(a){a=$(a);var b=a.cloneNode(!0),c=a.parentNode?a.parentNode:document.body;c.appendChild(b),Element.setStyle(b,{position:\"absolute\",visibility:\"hidden\"});var d=Element.getDimensions(b),e=d.height,f=Element.getStyle;e+=f(b,\"margin-top\")?parseInt(f(b,\"margin-top\"),10):0,e+=f(b,\"margin-bottom\")?parseInt(f(b,\"margin-bottom\"),10):0;var g=d.width;return g+=f(b,\"margin-left\")?parseInt(f(b,\"margin-left\"),10):0,g+=f(b,\"margin-right\")?parseInt(f(b,\"margin-right\"),10):0,Element.remove(b),{width:g,height:e}},translateOffset:function(a){var b,c,d=null;if(b=a.getStyle(\"transform\"),b||(b=a.getStyle(\"webkitTransform\")),b||(b=a.getStyle(\"MozTransform\")),b||(b=a.getStyle(\"msTransform\")),b||(b=a.getStyle(\"oTransform\")),b)if(c=b.match(/.*(translate|translate3d|translateZ|translateX|translateY)\\(([^)]+).*/)){switch(d=[],c[1]){case\"translateX\":d[0]=parseInt(c[2]),d[1]=0;break;case\"translateY\":d[1]=parseInt(c[2]),d[0]=0;break;case\"translateZ\":d[2]=parseInt(c[2]),d[0]=0,d[1]=0;break;default:d=c[2].split(/,\\s*/),\"undefined\"!=typeof d[0]&&(d[0]=parseInt(d[0])),\"undefined\"!=typeof d[1]&&(d[1]=parseInt(d[1])),\"undefined\"!=typeof d[2]&&(d[2]=parseInt(d[2]))}d.type=c[1],d.x=d[0],d.y=d[1],d.z=d[2]}else c=b.match(/.*(matrix)\\(([^)]+).*/),null!==c&&(c=b.match(/.*(matrix)\\(([^)]+).*/)[2].split(\", \"),d=[parseFloat(c[4]),parseFloat(c[5])],d.type=\"matrix\",d.x=d[0],d.y=d[1],d.z=null);return d},removeAllChildNodes:function(a){if(a=$(a))for(;a.hasChildNodes();)a.removeChild(a.lastChild)},setVendorPrefixStyle:function(a,b,c){if(!Object.isElement(a)||\"string\"!=typeof b||\"string\"!=typeof c&&\"number\"!=typeof c)throw\"Incorrect input arguments for Element.setVendorPrefixStyle.\";if(c+=\"\",b.match(/^webkit/i))b=b.replace(/^webkit/i,\"\");else if(b.match(/^moz/i))b=b.replace(/^moz/i,\"\");else if(b.match(/^ms/i))b=b.replace(/^ms/i,\"\");else if(b.match(/^o/i))b=b.replace(/^o/i,\"\");else if(b.match(\"-\")){{var d=b.split(\"-\");d.length}b=\"\";for(var e=0;e<d.length;e++)b+=d[e].charAt(0).toUpperCase()+d[e].slice(1)}else b=b.charAt(0).toUpperCase()+b.slice(1);c.match(\"-webkit-\")?c=c.replace(\"-webkit-\",\"-vendor-\"):c.match(\"-moz-\")?c=c.replace(\"-moz-\",\"-vendor-\"):c.match(\"-ms-\")?c=c.replace(\"-ms-\",\"-vendor-\"):c.match(\"-o-\")&&(c=c.replace(\"-o-\",\"-vendor-\")),a.style[\"webkit\"+b]=c.replace(\"-vendor-\",\"-webkit-\"),a.style[\"Moz\"+b]=c.replace(\"-vendor-\",\"-moz-\"),a.style[\"ms\"+b]=c.replace(\"-vendor-\",\"-ms-\"),a.style[\"O\"+b]=c.replace(\"-vendor-\",\"-o-\"),c=c.replace(\"-vendor-\",\"\"),a.style[b]=c,b=b.charAt(0).toLowerCase()+b.slice(1),a.style[b]=c},setVendorPrefixTransform:function(a,b,c){return\"none\"==b?void a.setVendorPrefixStyle(\"transform\",\"none\"):(null==b&&(b=0),null==c&&(c=0),void(AC.Detector.supportsThreeD()?a.setVendorPrefixStyle(\"transform\",\"translate3d(\"+b+\", \"+c+\", 0)\"):a.setVendorPrefixStyle(\"transform\",\"translate(\"+b+\", \"+c+\")\")))},addVendorEventListener:function(a,b,c,d){if(\"function\"==typeof addEventListener)if(b=b.match(/^webkit/i)?b.replace(/^webkit/i,\"\"):b.match(/^moz/i)?b.replace(/^moz/i,\"\"):b.match(/^ms/i)?b.replace(/^ms/i,\"\"):b.match(/^o/i)?b.replace(/^o/i,\"\"):b.charAt(0).toUpperCase()+b.slice(1),/WebKit/i.test(navigator.userAgent))a.addEventListener(\"webkit\"+b,c,d);else if(/Opera/i.test(navigator.userAgent))a.addEventListener(\"O\"+b,c,d);else{if(!/Gecko/i.test(navigator.userAgent))return b=b.charAt(0).toLowerCase()+b.slice(1),a.addEventListener(b,c,d);a.addEventListener(b.toLowerCase(),c,d)}},removeVendorEventListener:function(a,b,c,d){return\"function\"==typeof removeEventListener?(b=b.match(/^webkit/i)?b.replace(/^webkit/i,\"\"):b.match(/^moz/i)?b.replace(/^moz/i,\"\"):b.match(/^ms/i)?b.replace(/^ms/i,\"\"):b.match(/^o/i)?b.replace(/^o/i,\"\"):b.charAt(0).toUpperCase()+b.slice(1),a.removeEventListener(\"webkit\"+b,c,d),a.removeEventListener(\"O\"+b,c,d),a.removeEventListener(b.toLowerCase(),c,d),b=b.charAt(0).toLowerCase()+b.slice(1),a.removeEventListener(b,c,d)):void 0}}),window.addVendorEventListener=function(a,b,c){Element.Methods.addVendorEventListener(window,a,b,c)},window.removeVendorEventListener=function(a,b,c){Element.Methods.removeVendorEventListener(window,a,b,c)},Element.Methods.childNodeWithNodeTypeAtIndex=function(a,b,c){var d=a.firstChild;if(!d)return null;for(var e=0;d;){if(d.nodeType===b){if(c===e)return d;e++}d=d.nextSibling}return null};var Element2={};Element2.Methods=Object.clone(Element.Methods),\"undefined\"==typeof AC.Tracking&&(AC.Tracking={}),AC.Tracking.getLinkClicked=function(a){if(!a)return null;for(;\"a\"!=a.nodeName.toLowerCase()&&\"body\"!=a.nodeName.toLowerCase();)a=a.parentNode;return a.href||(a=null),a},AC.Tracking.trackLinksWithin=function(a,b,c,d,e){$(a).observe(\"mousedown\",function(a){var f=AC.Tracking.getLinkClicked(Event.element(a));if(f&&b(f)){if(e&&e.beforeTrack){var g=e.beforeTrack(f,c,d);g&&(c=g.title,d=g.properties)}AC.Tracking.trackClick(d,this,\"o\",c)}})},AC.Tracking.tagLinksWithin=function(a,b,c,d){$(a).observe(\"mousedown\",function(a){var e=Event.element(a);if(e){for(;\"a\"!=e.nodeName.toLowerCase()&&\"body\"!=e.nodeName.toLowerCase();)e=e.parentNode;e.href&&d(e)&&AC.Tracking.tagLink(e,b,c),e=null}})},AC.Tracking.tagLink=function(a,b,c){var d=a.getAttribute(\"href\");if(d.match(/\\?/)){var e=d.toQueryParams();e[b]=c,d=d.split(/\\?/)[0]+\"?\"+$H(e).toQueryString()}else d+=\"?\"+b+\"=\"+c;a.setAttribute(\"href\",d)},AC.Tracking.s_vi=function(){for(var a,b,c=document.cookie.split(\";\"),d=null,e=0;b=c[e];e++)if(a=b.match(/^\\s*s_vi=\\[CS\\]v1\\|(.+)\\[CE\\]\\s*$/)){d=a[1];break}return d},AC.Tracking.track=function(a,b,c){if(\"undefined\"!=typeof s_gi&&s_gi){if(c=c||{},\"undefined\"!=typeof s_account)s=s_gi(s_account);else{if(!c.s_account)return;s=s_gi(c.s_account)}if(a==s.tl){var d=\"\";for(var e in b)d+=e+\",\";d=d.replace(/,$/,\"\"),s.linkTrackVars=d}else s.linkTrackVars=\"\";s.prop4=\"\",s.g_prop4=\"\",s.prop6=\"\",s.g_prop6=\"\",s.pageURL=\"\",s.g_pageURL=\"\",s.g_channel=\"\";var f=function(a){return\"string\"==typeof a?a.replace(/[\\'\\\"\\ì\\î\\ë\\í]/g,\"\"):a};for(var e in b)s[e]=f(b[e]),\"events\"==e&&(s.linkTrackEvents=f(b[e]));a==s.t?void s.t():s.tl(c.obj,c.linkType,f(c.title));for(var e in b)\"pageName\"!=e&&(s[e]=\"\"),\"events\"==e&&(s.linkTrackEvents=\"None\")}},AC.Tracking.trackClick=function(a,b,c,d,e){var e={obj:b,linkType:c,title:d};AC.Tracking.track(s.tl,a,e)},AC.Tracking.trackPage=function(a,b){AC.Tracking.track(s.t,a,b)},String.prototype.lastPathComponent=function(){var a=this.lastIndexOf(\"/\");return-1!=a?this.substring(a+1,this.length-1):null},String.prototype.stringByDeletingLastPathComponent=function(){var a=this.lastIndexOf(\"/\");return-1!=a?this.slice(0,a):null},String.prototype.stringByAppendingPathComponent=function(a){return this.lastIndexOf(\"/\")!==this.length-1?this+\"/\"+a:this+a},String.prototype.stringByRemovingPrefix=function(a){var b=this.indexOf(a);if(b>-1){var c=this.substring(b+a.length,this.length);return c}return this},String.prototype.pathExtension=function(){var a=this.lastPathComponent(),b=a.lastIndexOf(\".\");return-1!=b?a.slice(b,a.length):\"\"},Array.prototype.addObjectsFromArray=function(a){if(a.constructor===Array)this.push.apply(this,a);else for(var b,c=0;b=a[c];c++)this[this.length]=b},Array.prototype.item=function(a){return this[a]},document._importNode=function(a,b){if(a.nodeType===Node.ELEMENT_NODE){var c,d,e=document.createElement(a.nodeName);if(a.attributes&&a.attributes.length>0)var f=a.attributes;var g,h;for(c=0,d=a.attributes.length;d>c;)g=f[c].nodeName,h=a.getAttribute(f[c++].nodeName),\"class\"===g&&e.setAttribute(\"className\",h),e.setAttribute(g,h);if(b&&a.childNodes&&a.childNodes.length>0)for(c=0,d=a.childNodes.length;d>c;c++)\"NOSCRIPT\"!==e.tagName&&e.appendChild(document._importNode(a.childNodes[c],b));return e}return a.nodeType===Node.TEXT_NODE?document.createTextNode(a.nodeValue):a.nodeType===Node.COMMENT_NODE?document.createComment(a.nodeValue):a.nodeType===Node.CDATA_SECTION_NODE?document.createCDATASection(a.nodeValue):null},document.importNode||(document.importNode=document._importNode),\"undefined\"==typeof document.head&&(document.head=document.getElementsByTagName(\"head\")[0]),AC.Detector.isIEStrict()&&(Element.Methods.hasAttribute=function(a,b){\"class\"==b?b=\"className\":\"for\"==b&&(b=\"htmlFor\");var c=a.getAttribute(b);return null!=c&&\"\"!==c},document._getElementsByName=document.getElementsByName,document._HTMLElementsWithName=[\"a\",\"apple\",\"button\",\"form\",\"frame\",\"iframe\",\"img\",\"input\",\"object\",\"map\",\"meta\",\"param\",\"textarea\",\"select\"],document.getElementsByName=function(a){for(var b,c,d,e,f=this._HTMLElementsWithName,g=[],h=0;e=f[h];h++)for(b=document.getElementsByTagName(e),c=0;d=b[c];c++)d.name===a&&(g[g.length]=d);return g}),\"undefined\"!=typeof JSON&&\"stringify\"in JSON&&\"parse\"in JSON||(this.JSON||(this.JSON={}),function(){function f(a){return 10>a?\"0\"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'\"'+a.replace(escapable,function(a){var b=meta[a];return\"string\"==typeof b?b:\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})+'\"':'\"'+a+'\"'}function str(a,b){var c,d,e,f,g,h=gap,i=b[a];switch(i&&\"object\"==typeof i&&\"function\"==typeof i.toJSON&&(i=i.toJSON(a)),\"function\"==typeof rep&&(i=rep.call(b,a,i)),typeof i){case\"string\":return quote(i);case\"number\":return isFinite(i)?String(i):\"null\";case\"boolean\":case\"null\":return String(i);case\"object\":if(!i)return\"null\";if(gap+=indent,g=[],\"[object Array]\"===Object.prototype.toString.apply(i)){for(f=i.length,c=0;f>c;c+=1)g[c]=str(c,i)||\"null\";return e=0===g.length?\"[]\":gap?\"[\\n\"+gap+g.join(\",\\n\"+gap)+\"\\n\"+h+\"]\":\"[\"+g.join(\",\")+\"]\",gap=h,e}if(rep&&\"object\"==typeof rep)for(f=rep.length,c=0;f>c;c+=1)d=rep[c],\"string\"==typeof d&&(e=str(d,i),e&&g.push(quote(d)+(gap?\": \":\":\")+e));else for(d in i)Object.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&g.push(quote(d)+(gap?\": \":\":\")+e));return e=0===g.length?\"{}\":gap?\"{\\n\"+gap+g.join(\",\\n\"+gap)+\"\\n\"+h+\"}\":\"{\"+g.join(\",\")+\"}\",gap=h,e}}\"function\"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+\"-\"+f(this.getUTCMonth()+1)+\"-\"+f(this.getUTCDate())+\"T\"+f(this.getUTCHours())+\":\"+f(this.getUTCMinutes())+\":\"+f(this.getUTCSeconds())+\"Z\":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var cx=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,escapable=/[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,gap,indent,meta={\"\\b\":\"\\\\b\",\"\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\f\":\"\\\\f\",\"\\r\":\"\\\\r\",'\"':'\\\\\"',\"\\\\\":\"\\\\\\\\\"},rep;\"function\"!=typeof JSON.stringify&&(JSON.stringify=function(a,b,c){var d;if(gap=\"\",indent=\"\",\"number\"==typeof c)for(d=0;c>d;d+=1)indent+=\" \";else\"string\"==typeof c&&(indent=c);if(rep=b,b&&\"function\"!=typeof b&&(\"object\"!=typeof b||\"number\"!=typeof b.length))throw new Error(\"JSON.stringify\");return str(\"\",{\"\":a})}),\"function\"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&\"object\"==typeof e)for(c in e)Object.hasOwnProperty.call(e,c)&&(d=walk(e,c),void 0!==d?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;if(text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)})),/^[\\],:{}\\s]*$/.test(text.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\").replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\").replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\")))return j=eval(\"(\"+text+\")\"),\"function\"==typeof reviver?walk({\"\":j},\"\"):j;throw new SyntaxError(\"JSON.parse\")})}()),[\"abbr\",\"article\",\"aside\",\"command\",\"details\",\"figcaption\",\"figure\",\"footer\",\"header\",\"hgroup\",\"mark\",\"meter\",\"nav\",\"output\",\"progress\",\"section\",\"summary\",\"time\"].each(function(a){document.createElement(a)}),AC.Storage={options:{allowCookies:!1,useIEFallback:!0,daysBeforeExpiring:365,saveTypeMetadata:!1},setOption:function(a,b){return this.options[a]=b},storageType:function(a){return a=parseFloat(a),0===a&&AC.Detector.hasSessionStorage()?this.item.types.s:AC.Detector.hasLocalStorage()?this.item.types.l:this.options.useIEFallback&&this.IE.canAddBehavior()?this.item.types.u:this.options.allowCookies&&AC.Detector.hasCookies()?this.item.types.c:null},setItem:function(a,b,c,d){if(\"\"==a)return!1;switch(c=parseFloat(c),isNaN(c)&&(c=null),(\"undefined\"==typeof c||null===c)&&(c=this.options.daysBeforeExpiring),\"object\"!=typeof d&&(d={}),this.storageType(c)){case this.item.types.l:0===c&&(c=1);try{return d.days=c,this.options.saveTypeMetadata&&(d.type=\"l\"),localStorage.setItem(a,this.item.create(b,d)),b}catch(e){try{console.warn(e)}catch(f){}return!1}break;case this.item.types.s:try{return d.days=0,this.options.saveTypeMetadata&&(d.type=\"s\"),sessionStorage.setItem(a,this.item.create(b,d)),b}catch(e){try{console.warn(e)}catch(f){}return!1}break;case this.item.types.u:return this.IE.setItem(a,b,c,d);case this.item.types.c:return this.cookie.setItem(a,b,c)}},getItem:function(a){if(this.hasExpired(a))return this.removeItem(a),null;var b=this.getItemObject(a);return null===b||\"undefined\"==typeof b?null:\"object\"==typeof b&&\"value\"in b?b.value:b},getItemObject:function(a){var b,c;return AC.Detector.hasLocalStorage()&&(c=localStorage.getItem(a),b=this.item.read(c),null!==b&&\"undefined\"!=typeof b)?b:AC.Detector.hasSessionStorage()&&(c=sessionStorage.getItem(a),b=this.item.read(c),null!==b&&\"undefined\"!=typeof b)?b:this.options.useIEFallback&&this.IE.canAddBehavior()&&(b=this.IE.getItem(a),null!==b&&\"undefined\"!=typeof b)?b:this.options.allowCookies&&AC.Detector.hasCookies()&&(b=this.cookie.getItem(a),null!==b&&\"undefined\"!=typeof b)?b:null},removeItem:function(a){return AC.Detector.hasLocalStorage()&&localStorage.removeItem(a),AC.Detector.hasSessionStorage()&&sessionStorage.removeItem(a),this.options.useIEFallback&&this.IE.canAddBehavior()&&this.IE.removeItem(a),this.options.allowCookies&&AC.Detector.hasCookies()&&this.cookie.removeItem(a),a},createExpirationDate:function(a,b){return\"undefined\"!=typeof b&&\"getHours\"in b||(b=new Date),b.setTime(b.getTime()+24*a*60*60*1e3),b.getTime()},getExpirationDate:function(a){var b=this.getItemObject(a);return\"string\"==typeof b||\"number\"==typeof b?null:null!=b&&\"undefined\"!=typeof b&&\"expires\"in b?new Date(b.expires):null},hasExpired:function(a){if(\"undefined\"==typeof a||0===a.length)return!1;var b=(new Date).getTime();if(AC.Detector.hasLocalStorage()){var c=this.getExpirationDate(a);if(null!==c&&c.getTime()<b)return!0}return!1},removeExpired:function(){if(AC.Detector.hasLocalStorage()){for(i=0;i<localStorage.length;i++){var a=localStorage.key(i);this.hasExpired(a)&&this.removeItem(a)}return!0}return!1},item:{roundDatesTo:864e5,dateKey:12938688e5,codes:{v:\"value\",e:\"expires\",t:\"type\",r:\"roundsDateTo\"},types:{l:\"localStorage\",s:\"sessionStorage\",u:\"#userData\",c:\"cookies\"},create:function(a,b){b||(b={});var c={},d=this.roundDatesTo;c.v=a,\"roundsDateTo\"in b&&!isNaN(b.roundsDateTo)&&(c.r=b.roundsDateTo,d=b.roundsDateTo),\"days\"in b&&0!==b.days&&(c.e=Math.round(AC.Storage.createExpirationDate(b.days)/d)-Math.round(this.dateKey/d)),\"type\"in b&&b.type in this.types&&(c.t=b.type);for(md in b)\"days\"===md||\"value\"===md||\"expires\"===md||\"type\"===md||md in this.codes||(c[md]=b[md]);return JSON.stringify(c)},read:function(a){var b=this.parse(a);if(null==b)return null;var c={},d=this.roundDatesTo;for(k in b)k in this.codes?\"expires\"==this.codes[k]?(\"r\"in b&&(d=b.r),c[this.codes[k]]=b[k]*d+Math.round(this.dateKey/d)*d):c[this.codes[k]]=\"type\"==this.codes[k]?this.types[b[k]]:b[k]:c[k]=b[k];return c},parse:function(a){try{return JSON.parse(a,function(a,b){var c,d;if(\"string\"==typeof b){if(c||(c=/^\\\"*(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d*)?)Z\\\"*$/.exec(b)),c)return new Date(Date.UTC(+c[1],+c[2]-1,+c[3],+c[4],+c[5],+c[6]));if(d=/^\\[(.*)\\]$/.exec(b))return this.parse(b)}return b}.bind(this))}catch(b){try{console.warn(err)}catch(b){}return a}}},IE:{setItem:function(a,b,c,d){if(this.canAddBehavior()){var e=this.element();\"object\"!=typeof d&&(d={});var f=AC.Storage.item.create(b,d);e.setAttribute(this.attribute,f),c=parseFloat(c),0===c?c=1:isNaN(c)&&(c=AC.Storage.options.daysBeforeExpiring);var g=new Date(AC.Storage.createExpirationDate(c));return\"toUTCString\"in g&&(e.expires=g.toUTCString()),e.save(a),b}return!1},getItem:function(a){if(this.canAddBehavior()){var b=this.element();b.load(a);var c=b.getAttribute(this.attribute),d=AC.Storage.item.read(c);return delete c,null===d||\"\"===d.toString()||null===d.value||\"\"===d.value.toString()||\"undefined\"==typeof d||\"undefined\"==typeof d.value?null:\"object\"==typeof d&&\"value\"in d?d.value:d}return null},removeItem:function(a){if(this.canAddBehavior()){var b=this.element();return b.load(a),b.removeAttribute(this.attribute),b.save(a),!0}return!1},attribute:\"content\",canAddBehavior:function(){if(\"addBehavior\"in document.body){var a=this.element();if(\"addBehavior\"in a&&\"undefined\"!=typeof a&&\"load\"in a&&\"save\"in a)return!0}return!1},_element:null,element:function(){return null===this._element&&(this._element=document.createElement(\"meta\"),this._element.setAttribute(\"name\",\"ac-storage\"),this._element.style.behavior=\"url('#default#userData')\",document.head.appendChild(this._element)),this._element}},cookie:{setItem:function(a,b,c){if(AC.Detector.hasCookies()){(\"undefined\"==typeof c||null===c)&&(c=this.options.daysBeforeExpiring);var d=0===c?\"\":\"; expires=\"+new Date(AC.Storage.createExpirationDate(c)).toUTCString();return document.cookie=cookie=a+\"=\"+b+d+\"; path=/\",b}return!1},getItem:function(a){for(var b=a+\"=\",c=document.cookie.split(\";\"),d=0;d<c.length;d++){for(var e=c[d];\" \"==e.charAt(0);)e=e.substring(1,e.length);if(0==e.indexOf(b))return e.substring(b.length,e.length)}return null},removeItem:function(a){this.setItem(a,\"\",-1)}}},AC.Synthesize={synthesize:function(a){\"object\"!=typeof a&&(a=this);var b;for(b in a)a.hasOwnProperty(b)&&\"_\"===b.charAt(0)&&\"_\"!==b.charAt(1)&&\"function\"!=typeof a[b]&&(this.__synthesizeGetter(b,a),this.__synthesizeSetter(b,a))},__synthesizeGetter:function(a,b){var c=a.slice(1,a.length);\"undefined\"==typeof b[c]&&(b[c]=function(){return b[a]})},__synthesizeSetter:function(a,b){var c=a.slice(1,a.length);c=\"set\"+c.slice(0,1).toUpperCase()+c.slice(1,c.length),\"undefined\"==typeof b[c]&&(b[c]=function(c){b[a]=c})}},Object.synthesize=function(a){if(\"object\"==typeof a)return Object.extend(a,Object.clone(AC.Synthesize)),a.synthesize(),a;try{console.warn(\"Argument supplied was not a valid object.\")}catch(b){}return a};"
  },
  {
    "path": "works/demo/ali/file/aplus_v2.js",
    "content": "/*2014-09-10 02:06:29*/!function(){function t(t){if(Ee)return\"m\";if(xe)return e(t,\"wrating.com\")?\"k\":\"y\";var n,r,a=\"o\",o=[[\"ju.taobao.com\",\"4\"],[\"juhuasuan.com\",\"4\"],[\"alipay.com\",\"f\"],[\"china.alibaba.com\",\"6\"],[\"1688.com\",\"6\"],[\"alibaba.com\",\"7\"],[\"aliloan.com\",\"8\"],[\"cnzz.com\",\"9\"],[\"net.cn\",\"a\"],[\"hichina.com\",\"a\"],[\"phpwind.com\",\"b\"],[\"aliyun.com\",\"c\"],[\"tao123.com\",\"d\"],[\"alimama.com\",\"e\"],[\"taobao.com\",\"1\"],[\"tmall.com\",\"2\"],[\"tmall.hk\",\"2\"],[\"etao.com\",\"3\"],[\"*\",a]],i=o.length;for(n=0;i>n;n++)if(r=o[n],e(t,r[0]))return r[1];return a}function e(t,e){return t.indexOf(e)>-1}function n(t,e){return 0==t.indexOf(e)}function r(t,e){var n=t.length,r=e.length;return n>=r&&t.indexOf(e)==n-r}function a(t){return p(t)?t.replace(/^\\s+|\\s+$/g,\"\"):\"\"}function o(t,e){var n=e||\"\";if(t)try{n=decodeURIComponent(t)}catch(r){}return n}function i(t){var e,r,a=[];for(e in t)t.hasOwnProperty(e)&&(r=\"\"+t[e],a.push(n(e,qe)?r:e+\"=\"+encodeURIComponent(r)));return a.join(\"&\")}function c(t){var e,r,a,o=[],i=t.length;for(a=0;i>a;a++)e=t[a][0],r=t[a][1],o.push(n(e,qe)?r:e+\"=\"+encodeURIComponent(r));return o.join(\"&\")}function u(t){var e,n={};for(e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);return n}function s(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function m(t){for(var e,n=t.split(\"&\"),r=0,a=n.length,i={};a>r;r++)e=n[r].split(\"=\"),i[e[0]]=o(e[1]);return i}function f(t){return\"number\"==typeof t}function l(t){return\"undefined\"==typeof t}function p(t){return\"string\"==typeof t}function h(t){return\"[object Array]\"===Object.prototype.toString.call(t)}function d(t,e){return t&&t.getAttribute?t.getAttribute(e)||\"\":\"\"}function g(t){var e;try{e=a(t.getAttribute(\"href\",2))}catch(n){}return e||\"\"}function v(){var t=F.getElementById(\"tb-beacon-aplus\"),n=d(t,\"exparams\");if(!n)return n;var r,a,o=[\"taobao.com\",\"tmall.com\",\"etao.com\",\"hitao.com\",\"taohua.com\",\"juhuasuan.com\",\"alimama.com\"];if(xe){for(a=o.length,r=0;a>r;r++)if(e(Oe,o[r]))return n;n=n.replace(/\\buserid=\\w*&?/,\"\")}return n=n.replace(/\\buserid=/,\"uidaplus=\")}function b(){return ne=ne||F.getElementsByTagName(\"head\")[0],re||(ne?re=ne.getElementsByTagName(\"meta\"):[])}function y(t,e){var n,r,i=t.split(\";\"),c=i.length;for(n=0;c>n;n++)r=i[n].split(\"=\"),e[a(r[0])||qe]=o(a(r.slice(1).join(\"=\")))}function _(t){var e=F.cookie.match(new RegExp(\"(?:^|;)\\\\s*\"+t+\"=([^;]+)\"));return e?e[1]:\"\"}function w(){return Math.floor(268435456*Math.random()).toString(16)}function x(){var t,e,n,r=b(),a=r.length;for(t=0;a>t;t++)e=r[t],\"microscope-data\"==d(e,\"name\")&&(n=d(e,\"content\"),y(n,Ve),Ze=Je);ae=i(Ve),se=Ve.pageId,ce=Ve.shopId,ue=Ve.siteInstanceId,me=Ve.siteCategory,fe=Ve.prototypeId,ie=ue||ce}function j(){var t,e,n,r=b(),a=r.length;for(t=0;a>t;t++)e=r[t],\"atp-beacon\"==d(e,\"name\")&&(n=d(e,\"content\"),y(n,We));oe=i(We)}function C(){var t,e,n,r=b(),a=r.length;for(t=0;a>t;t++)if(e=r[t],\"aplus-terminal\"==d(e,\"name\")){n=d(e,\"content\");break}return n}function M(){var t,e,n,r,a=b();for(t=0,e=a.length;e>t;t++)n=a[t],r=d(n,\"name\"),r==ze&&(le=d(n,Ge))}function O(t){var e,r,a,o,i,c,u=b();if(u)for(e=0,r=u.length;r>e;e++)if(o=u[e],i=d(o,\"name\"),i==t)return he=d(o,\"content\"),he.indexOf(\":\")>=0&&(a=he.split(\":\"),le=\"i\"==a[0]?\"i\":\"u\",he=a[1]),c=d(o,Ge),c&&(le=\"i\"==c?\"i\":\"u\"),de=n(he,\"110\"),pe=de?Ce:he,Je;return $e}function E(){if(!l(pe))return pe;if(Fe&&Xe)return Fe=Fe.replace(/^{(\\w+)}$/g,\"$1\"),Xe=Xe.replace(/^{(\\w+)}$/g,\"$1\"),Ye=Je,pe=Fe+\".\"+Xe,M(),ge.spm_ab=[Fe,Xe],pe;{var t;F.getElementsByTagName(\"head\")[0]}if(O(ze)||O(\"spm-id\"),pe=pe||Ce,!pe)return pe;var e,n=F.getElementsByTagName(\"body\");return t=pe.split(\".\"),ge.spm_ab=t,n=n&&n.length?n[0]:null,n&&(e=d(n,ze),e?(pe=t[0]+\".\"+e,ge.spm_ab=[t[0],e]):1==t.length&&(pe=Ce)),pe}function k(){function t(t){var e=\"0123456789abcdefhijklmnopqrstuvwxyzABCDEFHIJKLMNOPQRSTUVWXYZ\",n=\"0123456789abcdefghijkmnopqrstuvwxyzABCDEFGHIJKMNOPQRSTUVWXYZ\";return 1==t?e.substr(Math.floor(60*Math.random()),1):2==t?n.substr(Math.floor(60*Math.random()),1):\"0\"}var e=\"g_aplus_pv_id\",n=\"\",r=\"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\",a=!1;if(!Y[e]){for(;n.length<6;){var o=r.substr(Math.floor(62*Math.random()),1);!a&&n.length<=2&&(\"g\"==o.toLowerCase()||\"l\"==o.toLowerCase())&&(0==n.length&&\"g\"==o.toLowerCase()?Math.random()<.5&&(o=t(1),a=!0):1==n.length&&\"l\"==o.toLowerCase()&&\"g\"==n.charAt(0).toLowerCase()&&(o=t(2),a=!0)),n+=o}Y[e]=n}return Y[e]}function I(t){t=(t||\"\").split(\"#\")[0].split(\"?\")[0];var e=t.length,n=function(t){var e,n=t.length,r=0;for(e=0;n>e;e++)r=31*r+t.charCodeAt(e);return r};return e?n(e+\"#\"+t.charCodeAt(e-1)):-1}function S(){var t,e=Y[Z];e.push=t=function(){for(var t,n,r=0,a=arguments.length;a>r;r++)t=arguments[r],p(t)?ge.send(Ie+t):h(t)&&\"push\"!=(n=t[0])&&(e[n]=e[n]||[]).push(t.slice(1))};for(var n;n=e.shift();)t(n)}function T(t){var e=Y.KISSY;e?e.ready(t):Y.jQuery?jQuery(F).ready(t):\"complete\"===F.readyState?t():N(Y,\"load\",t)}function A(){if(!xe){var t=Y.name||\"\",e=Be?F.referrer||Ae:Ae,n={refer_pv_id:Ke};we&&(n.wm_referrer=e),-1==t.indexOf(\"=\")?(n.wm_old_value=t,Y.name=i(n)):(Be&&t.match(/&?\\bwm_referrer=[^&]+/)&&delete n.wm_referrer,t=m(t),s(t,n),Y.name=i(t))}}function N(t,e,n){t[De]((Le?\"on\":\"\")+e,function(t){t=t||Y.event;var e=t.target||t.srcElement;n(t,e)},$e)}function R(){var t,e,n=[\"/theme/info/info\",\"/promo/co_header.php\",\"fast_buy.htm\",\"/add_collection.htm\",\"/taobao_digital_iframe\",\"/promo/co_header_taoinfo.php\",\"/list_forum\",\"/theme/info/info\"];for(t=0,e=n.length;e>t;t++)if(-1!=Me.indexOf(n[t]))return Je;var r=/^https?:\\/\\/[\\w\\.]+\\.taobao\\.com/i;return!r.test(Re)}function B(){function t(){var t,e,n,r=Y[He];if(r&&h(r)&&r.length)for(;t=r.shift();)if(t&&t.action&&p(t.action)&&t.arguments&&h(t.arguments)){for(n=t.action.split(\".\"),e=Y;n.length;)if(e=e[n.shift()],!e)return;if(\"function\"==typeof e)try{e.apply(e,t.arguments)}catch(a){}}}try{t()}catch(e){}}function L(){var t=function(){try{B(),setTimeout(t,200)}catch(e){}};t(),N(Y,\"beforeunload\",B)}function U(t,e){return e?Q()?V({url:W(t,e),js:ve,referrer:ye.href}):ge.send(t,e):void 0}function P(){return qe+Math.random()}function D(t,e){var n,r=2146271213;for(n=0;n<t.length;n++)r=(r<<5)+r+t.charCodeAt(n);return(65535&r)%e}function $(t){var e,n=t.match(new RegExp(\"\\\\?.*spm=([\\\\w\\\\.\\\\-\\\\*]+)\"));return n&&(e=n[1])&&5==e.split(\".\").length?e:null}function J(t,e){var n,r,a,o,i=e.length;for(n=0;i>n;n++)r=e[n],a=r[0],o=r[1],o&&t.push([a,o])}function q(){Math.random()<1e-4&&G(\"sample.js?v=131028\");var t=\".tbcdn.cn/s/fdc/??spm.js,spmact.js?v=140619\";z(\"http://a\"+t,\"https://s\"+t);var n=\"laiwang\",r=\"ilw/a/lwlog.js?v=140709\";e(ye.href.split(\"?\")[0],n)&&z(\"http://g.tbcdn.cn/\"+r,\"https://s.tbcdn.cn/g/\"+r);var a=\"tb/fdc/xwj_heat.js?v=140108\";Math.random()<.01&&z(\"http://g.tbcdn.cn/\"+a,\"https://s.tbcdn.cn/g/\"+a),ue&&fe&&fe.match(/^[124]$/)&&ce&&G(\"wp-beacon.js?v=131014\"),we||Ee||T(function(){setTimeout(function(){z(\"http://g.tbcdn.cn/sd/data_sufei/1.1.8/aplus/index.js\",\"https://s.tbcdn.cn/g/sd/data_sufei/1.1.8/aplus/index.js\")},1e3)})}function z(t,e){var n=F.createElement(\"script\");n.type=\"text/javascript\",n.async=!0,n.src=we?e:t,F.getElementsByTagName(\"head\")[0].appendChild(n)}function G(t){var e=\"http://a.tbcdn.cn/s/fdc/\",n=\"https://s.tbcdn.cn/s/fdc/\";z(e+t,n+t)}function H(t,e){var n=document.createElement(\"iframe\");n.style.width=\"1px\",n.style.height=\"1px\",n.style.position=\"absolute\",n.style.display=\"none\",n.src=t,e&&(n.name=e);var r=document.getElementsByTagName(\"body\")[0];return r.appendChild(n),n}function K(){var t=!1;if(\"localStorage\"in Y&&null!=Y.localStorage)try{localStorage.setItem(\"test\",\"test\"),localStorage.removeItem(\"test\"),t=!0}catch(e){}return t}function Q(){if(we)return!1;var t=navigator.userAgent,e=t.split(\" Safari/\");return 2!=e.length?!1:K()&&Y.postMessage&&e[1].match(/[\\d\\.]+/)&&t.indexOf(\"AppleWebKit\")>-1&&t.match(/\\bVersion\\/\\d+/)&&!t.match(/\\bChrome\\/\\d+/)}function V(t){var e=\"http://cdn.mmstat.com/aplus-proxy.html?v=20130115\";H(e,JSON.stringify(t)),Y.addEventListener&&Y.JSON&&Y.addEventListener(\"message\",function(t){function e(){var t=Oe.split(\".\"),e=t.length;return e>1?t[e-2]+\".\"+t[e-1]:Oe}var n=t.data;try{n=JSON.parse(n)}catch(r){return}for(var a,o,i,c=0,u=n.length;u>c;c++)a=n[c],i=a.k,o=encodeURIComponent(i)+\"=\"+(\"cna\"==i?a.v:encodeURIComponent(a.v))+\"; domain=.\"+e()+\"; path=/; expires=\"+new Date(a.t).toGMTString(),F.cookie=o})}function W(t,e){var n=-1==t.indexOf(\"?\")?\"?\":\"&\",r=e?h(e)?c(e):i(e):\"\";return r?t+n+r:t}var Y=window,F=document,X=(new Date).getTime(),Z=\"_ap\",te=\"g_tb_aplus_loaded\";if(Y[Z]||(Y[Z]=[]),!F.getElementsByTagName(\"body\").length)return void setTimeout(arguments.callee,50);if(!Y[te]){Y[te]=1;var ee,ne,re,ae,oe,ie,ce,ue,se,me,fe,le,pe,he,de,ge,ve=\"http://a.tbcdn.cn/s/fdc/lsproxy.js?v=20140709\",be=\"4\",ye=location,_e=ye.protocol,we=\"https:\"==_e,xe=parent!==self,je=we?_e:\"http:\",Ce=\"0.0\",Me=ye.pathname,Oe=ye.hostname,Ee=C(),ke=je+\"//log.mmstat.com/\",Ie=we?ke:je+(Ee?\"//wgo.mmstat.com/\":\"//gm.mmstat.com/\"),Se=ke+t(ye.hostname)+\".gif\",Te=[[\"logtype\",xe?0:1]],Ae=ye.href,Ne=ye.hash,Re=F.referrer,Be=we&&(Ae.indexOf(\"login.taobao.com\")>=0||Ae.indexOf(\"login.tmall.com\")>=0),Le=!!F.attachEvent,Ue=\"attachEvent\",Pe=\"addEventListener\",De=Le?Ue:Pe,$e=!1,Je=!0,qe=\"::-plain-::\",ze=\"data-spm\",Ge=\"data-spm-protocol\",He=\"goldlog_queue\",Ke=k(),Qe=_(\"cna\"),Ve={},We={},Ye=$e,Fe=Y._SPM_a,Xe=Y._SPM_b,Ze=$e;Re=function(){var t,e=\"wm_referrer\",n=\"refer_pv_id\",r=Y.name||\"\",a=m(r),i=a[e],c=a.wm_old_value;return t=F.referrer||o(i),ee=a[n],Be||(l(c)?l(i)||(Y.name=r.replace(/&?\\bwm_referrer=[^&]*/g,\"\")):Y.name=o(c)),t}(),ge={version:be,pvid:Ke,referrer:Re,_d:{},_microscope_data:Ve,on:N,DOMReady:T,getCookie:_,tryToGetAttribute:d,tryToGetHref:g,isNumber:f,send:function(t,e){var n=new Image,r=\"_img_\"+Math.random(),a=W(t,e);return Y[r]=n,n.onload=n.onerror=function(){Y[r]=null},n.src=a,n=null,a},emit:function(t,e){var n,r=\"ued.1.1.2?type=9\";return h(e)?n=[[\"_gm:id\",t]].concat(e):(n=u(e),n[\"_gm:id\"]=t),ge.send(Ie+r,n)},trace:function(t,e,n,r){ge.record(t,e,n,r)},record:function(t,e,a,o){o=arguments[3]||\"\";var i,c,u=\"?\",s=$e,m=\"\",f=(pe||\"0.0\")+\".0.0.\"+Ke,l=\"http://ac.mmstat.com/\";if(\"ac\"==t)i=l+\"1.gif\",s=n(o,\"A\")&&o.substr(1)==I(t);else if(n(t,\"ac-\"))i=l+t.substr(3),s=n(o,\"A\")&&o.substr(1)==I(t);else if(n(t,\"/\"))s=n(o,\"H\")&&o.substr(1)==I(t),i=Ie+t.substr(1),c=Je,m+=\"&spm-cnt=\"+f;else{if(!r(t,\".gif\"))return $e;i=ke+t}return s||\"%\"==o||I(Ae)==o?(i+=u+\"cache=\"+w()+\"&gmkey=\"+encodeURIComponent(e)+\"&gokey=\"+encodeURIComponent(a)+\"&cna=\"+Qe+\"&isbeta=\"+be+m,c&&(i+=\"&logtype=2\"),Q()?V({url:i,js:ve,referrer:ye.href}):ge.send(i)):$e}},Y.goldlog=ge,Y.goldminer={record:ge.emit},Y[He]&&h(Y[He])||(Y[He]=[]),Ee||L(),x(),E(),S(),q(),function(){var t,n,r,a=_(\"tracknick\"),o=/\\btanx\\.com$/.test(Oe)?_(\"cnaui\"):\"\",i=$(Ae),c=$(Re);if(Ne&&0==Ne.indexOf(\"#\")&&(Ne=Ne.substr(1)),(!xe||R())&&((\"3\"==fe||\"5\"==fe)&&(n=_(\"t\"),r=n?D(n,20):\"\"),t=[[P(),\"title=\"+escape(F.title)],[\"pre\",Re],[\"cache\",w()],[\"scr\",screen.width+\"x\"+screen.height],[\"isbeta\",be]],Qe&&t.push([P(),\"cna=\"+Qe]),a&&t.push([P(),\"nick=\"+a]),J(t,[[\"wm_pageid\",se],[\"wm_prototypeid\",fe],[\"wm_sid\",ce],[\"spm-url\",i],[\"spm-pre\",c],[\"cnaui\",o]]),t.push([\"spm-cnt\",(pe||\"0.0\")+\".0.0.\"+Ke]),Te=Te.concat(t),Te.push([P(),v()]),J(Te,[[\"bucket_id\",r],[\"urlokey\",Ne],[\"wm_instanceid\",ue]]),Y.g_aplus_pv_req=U(Se,Te)),xe){j();var u,s=We.on,m=\"1\"==s?\"http://ac.mmstat.com/y.gif\":Se,m=e(Oe,\"wrating.com\")?Se:m;\"1\"!=s&&\"2\"!=s||!(u=We.chksum)||u!==I(Ae).toString()||U(m,Te)}Be?A():N(Y,\"beforeunload\",function(){A()});var f=pe.split(\".\")[0];(\"1.7274553\"==pe||\"2013\"==f||\"a220o\"==f)&&H(\"http://cookiemapping.wrating.com/link.html\")}();var tn=(new Date).getTime();setTimeout(function(){Math.random()>1e-4||ge.emit(\"global_sample\",{type:\"timer\",t:tn-X})},1)}}();"
  },
  {
    "path": "works/demo/ali/file/base.css",
    "content": "abbr,article,aside,blockquote,body,command,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,input,li,mark,meter,nav,ol,output,p,pre,progress,section,summary,time,ul{margin:0;padding:0}address,caption,cite,code,em,figcaption,h1,h2,h3,h4,h5,h6,pre,strong,th{font-size:1em;font-weight:400;font-style:normal}fieldset,iframe{border:none}caption,th{text-align:left}table{border-collapse:collapse;border-spacing:0}article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}a{text-decoration:none}li,ol,ul{list-style:none;margin:0;padding:0}img{border:none}.clear{clear:both;visibility:hidden;width:100%}.clearer{clear:both;display:block;margin:0;padding:0;height:0;line-height:1px;font-size:1px}.selfclear{zoom:1}.selfclear:after{content:'.';display:block;height:0;clear:both;visibility:hidden}"
  },
  {
    "path": "works/demo/ali/file/browserdetect.js",
    "content": "\"undefined\"==typeof AC&&(AC={}),AC.Detector={getAgent:function(){return navigator.userAgent.toLowerCase()},isMac:function(a){var b=a||this.getAgent();return!!b.match(/mac/i)},isSnowLeopard:function(a){\"undefined\"!=typeof console&&console.warn('Instead of AC.Detector.isSnowLeopard, please use AC.Detector.macOSAtLeastVersion(\"10.6\").');var b=a||this.getAgent();return!!b.match(/mac os x 10_6/i)},macOSVersion:function(a){var b=a||this.getAgent();if(!this.isMac(b))return null;var c=b.match(/(mac os x )([\\d\\._]*)/i);if(null==c)return c;c=c[2].split(c[2].match(/\\./)?\".\":\"_\");for(var d=0;d<c.length;d++)c[d]=parseInt(c[d]);return c},macOSAtLeastVersion:function(a,b){if(\"undefined\"==typeof a)return!1;var c=this.macOSVersion(b);if(null==c)return!1;\"string\"==typeof a&&(a=a.replace(\".\",\"_\").split(\"_\"));for(var d=0;d<a.length;d++){var e=parseInt(c[d]);if(isNaN(e)&&(e=0),parseInt(a[d])>e)return!1}return!0},isWin:function(a){var b=a||this.getAgent();return!!b.match(/win/i)},winVersion:function(a){var b=a||this.getAgent();if(this.isWin(b)){var c=b.match(/nt\\s*([\\d\\.]*)/);return c&&c[1]?parseFloat(c[1]):!0}return!1},winAtLeastVersion:function(a,b){if(\"undefined\"==typeof a)return!1;if(a=parseFloat(a),0/0===a)return!1;var c=this.winVersion(b);return null===c||c===!1||c===!0?!1:c>=a},isWin2k:function(a){var b=a||this.getAgent();return this.isWin(b)&&b.match(/nt\\s*5/i)},isWinVista:function(a){var b=a||this.getAgent();return this.isWin(b)&&b.match(/nt\\s*6\\.0([0-9]{0,2})?/i)},isWebKit:function(a){if(void 0===this._isWebKit){var b=a||this.getAgent();this._isWebKit=!!b.match(/AppleWebKit/i),this.isWebKit=function(){return this._isWebKit}}return this._isWebKit},isSafari2:function(a){\"undefined\"!=typeof console&&console.warn(\"Instead of AC.Detector.isSafari2(), please use AC.Detector.isWebKit().\");var b=a||this.getAgent();if(void 0===this._isSafari2){if(this.isWebKit(b)){var c=parseInt(parseFloat(b.substring(b.lastIndexOf(\"safari/\")+7)),10);this._isSafari2=c>=419}else this._isSafari2=!1;this.isSafari2=function(){return this._isSafari2}}return this._isSafari2},isChrome:function(a){if(void 0===this._isChrome){var b=a||this.getAgent();this._isChrome=!!b.match(/Chrome/i),this.isChrome=function(){return this._isChrome}}return this._isChrome},isiPhone:function(a){\"undefined\"!=typeof console&&console.warn(\"Instead of AC.Detector.isiPhone(), please use AC.Detector.isMobile().\");var b=a||this.getAgent();return this.isMobile(b)},iPhoneOSVersion:function(a){\"undefined\"!=typeof console&&console.warn(\"Instead of AC.Detector.iPhoneOSVersion(), please use AC.Detector.iOSVersion().\");var b,c,d,e=a||this.getAgent(),f=this.isMobile(e);if(f){var b=e.match(/.*CPU ([\\w|\\s]+) like/i);return b&&b[1]?(c=b[1].split(\" \"),d=c[2].split(\"_\")):[1]}return null},isiPad:function(a){var b=a||this.getAgent();return!(!this.isWebKit(b)||!b.match(/ipad/i))},isMobile:function(a){var b=a||this.getAgent();return this.isWebKit(b)&&b.match(/Mobile/i)&&!this.isiPad(b)},_iOSVersion:null,iOSVersion:function(){return null===this._iOSVersion&&(this._iOSVersion=AC.Detector.isMobile()||AC.Detector.isiPad()?parseFloat(navigator.userAgent.match(/os ([\\d_]*)/i)[1].replace(\"_\",\".\")):!1),this._iOSVersion},isOpera:function(a){var b=a||this.getAgent();return!!b.match(/opera/i)},isIE:function(a){var b=a||this.getAgent();return!!b.match(/msie/i)},isIEStrict:function(a){var b=a||this.getAgent();return b.match(/msie/i)&&!this.isOpera(b)},isIE8:function(a){var b,c,d;return b=a||this.getAgent(),c=b.match(/msie\\D*([\\.\\d]*)/i),d=-1,c&&c[1]&&(d=c[1]),+d>=8},isFirefox:function(a){var b=a||this.getAgent();return!!b.match(/firefox/i)},isiTunesOK:function(a){var b=a||this.getAgent();return this.isMac(b)?!0:this.winAtLeastVersion(5.1,b)?!0:!1},_isQTInstalled:void 0,isQTInstalled:function(){if(void 0===this._isQTInstalled){var a=!1;if(navigator.plugins&&navigator.plugins.length)for(var b=0;b<navigator.plugins.length;b++){var c=navigator.plugins[b];c.name.indexOf(\"QuickTime\")>-1&&(a=!0)}else\"undefined\"!=typeof execScript&&(qtObj=!1,execScript('on error resume next: qtObj = IsObject(CreateObject(\"QuickTimeCheckObject.QuickTimeCheck.1\"))',\"VBScript\"),a=qtObj);this._isQTInstalled=a}return this._isQTInstalled},getQTVersion:function(){var a=\"0\";if(navigator.plugins&&navigator.plugins.length)for(var b=0;b<navigator.plugins.length;b++){var c=navigator.plugins[b],d=c.name.match(/quicktime\\D*([\\.\\d]*)/i);d&&d[1]&&(a=d[1])}else\"undefined\"!=typeof execScript&&(ieQTVersion=null,execScript('on error resume next: ieQTVersion = CreateObject(\"QuickTimeCheckObject.QuickTimeCheck.1\").QuickTimeVersion',\"VBScript\"),ieQTVersion&&(a=ieQTVersion.toString(16),a=[a.charAt(0),a.charAt(1),a.charAt(2)].join(\".\")));return a},isQTCompatible:function(a,b){function c(a,b){var d=parseInt(a[0],10);isNaN(d)&&(d=0);var e=parseInt(b[0],10);return isNaN(e)&&(e=0),d===e?a.length>1?c(a.slice(1),b.slice(1)):!0:e>d?!0:!1}var d=a.split(/\\./),e=b?b.split(/\\./):this.getQTVersion().split(/\\./);return c(d,e)},isValidQTAvailable:function(a){return this.isQTInstalled()&&this.isQTCompatible(a)},isSBVDPAvailable:function(){return!1},_svgAsBackground:null,svgAsBackground:function(a){if(null===this._svgAsBackground){var b=function(){AC.Detector._svgAsBackground=!0,\"function\"==typeof a&&a()},c=document.createElement(\"img\");c.setAttribute(\"src\",\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNzUiIGhlaWdodD0iMjc1Ij48L3N2Zz4%3D\"),c.complete?(c.style.visibility=\"hidden\",c.style.position=\"absolute\",document.body.appendChild(c),window.setTimeout(function(){AC.Detector._svgAsBackground=!1,c.width>=100?(document.body.removeChild(c),b()):document.body.removeChild(c)},1)):(this._svgAsBackground=!1,c.onload=b)}else this._svgAsBackground&&\"function\"==typeof a&&a();return this._svgAsBackground},_style:null,_prefixes:null,_preFixes:null,_css:null,isCSSAvailable:function(a){switch(this._style||(this._style=document.createElement(\"browserdetect\").style),this._prefixes||(this._prefixes=\"-webkit- -moz- -o- -ms- -khtml- \".split(\" \")),this._preFixes||(this._preFixes=\"Webkit Moz O ms Khtml \".split(\" \")),this._css||(this._css={}),a=a.replace(/([A-Z]+)([A-Z][a-z])/g,\"$1-$2\").replace(/([a-z\\d])([A-Z])/g,\"$1-$2\").replace(/^(\\-*webkit|\\-*moz|\\-*o|\\-*ms|\\-*khtml)\\-/,\"\").toLowerCase()){case\"gradient\":if(void 0!==this._css.gradient)return this._css.gradient;var a=\"background-image:\",b=\"gradient(linear,left top,right bottom,from(#9f9),to(white));\",c=\"linear-gradient(left top,#9f9, white);\";return this._style.cssText=(a+this._prefixes.join(b+a)+this._prefixes.join(c+a)).slice(0,-a.length),this._css.gradient=-1!==this._style.backgroundImage.indexOf(\"gradient\"),this._css.gradient;case\"inset-box-shadow\":if(void 0!==this._css[\"inset-box-shadow\"])return this._css[\"inset-box-shadow\"];var a=\"box-shadow:\",d=\"#fff 0 1px 1px inset;\";return this._style.cssText=this._prefixes.join(a+d),this._css[\"inset-box-shadow\"]=-1!==this._style.cssText.indexOf(\"inset\"),this._css[\"inset-box-shadow\"];default:var e,f,g,h=a.split(\"-\"),i=h.length;if(h.length>0)for(a=h[0],f=1;i>f;f++)a+=h[f].substr(0,1).toUpperCase()+h[f].substr(1);if(e=a.substr(0,1).toUpperCase()+a.substr(1),void 0!==this._css[a])return this._css[a];for(g=this._preFixes.length-1;g>=0;g--)if(void 0!==this._style[this._preFixes[g]+a]||void 0!==this._style[this._preFixes[g]+e])return this._css[a]=!0,!0;return!1}return!1},_supportsThreeD:!1,supportsThreeD:function(){try{if(this._supportsThreeD=!1,\"styleMedia\"in window?this._supportsThreeD=window.styleMedia.matchMedium(\"(-webkit-transform-3d)\"):\"media\"in window&&(this._supportsThreeD=window.media.matchMedium(\"(-webkit-transform-3d)\")),!this._supportsThreeD){if(!document.getElementById(\"supportsThreeDStyle\")){var a=document.createElement(\"style\");a.id=\"supportsThreeDStyle\",a.textContent=\"@media (transform-3d),(-o-transform-3d),(-moz-transform-3d),(-ms-transform-3d),(-webkit-transform-3d) { #supportsThreeD { height:3px } }\",document.querySelector(\"head\").appendChild(a)}(div=document.querySelector(\"#supportsThreeD\"))||(div=document.createElement(\"div\"),div.id=\"supportsThreeD\",document.body.appendChild(div)),this._supportsThreeD=3===div.offsetHeight}return this._supportsThreeD}catch(b){return!1}},_hasGyro:null,_testingForGyro:!1,hasGyro:function(){if(null!==this._hasGyro)return this._hasGyro;if(\"DeviceOrientationEvent\"in window&&null!==window.DeviceOrientationEvent){if(this._testingForGyro===!1){this._testingForGyro=!0;var a=this;this.boundTestingForGyro=function(b){a.testingForGyro(b)},window.addEventListener(\"deviceorientation\",this.boundTestingForGyro,!0),this._testGyroTimeout=window.setTimeout(function(){this._hasGyro=!1}.bind(this),250)}return this._hasGyro}return this._hasGyro=!1},testingForGyro:function(a){return this._hasGyro===!1?this._hasGyro:(this._hasGyro=\"undefined\"!=typeof a.gamma&&\"undefined\"!=typeof a.beta?!0:!1,window.clearTimeout(this._testGyroTimeout),window.removeEventListener(\"deviceorientation\",this.boundTestingForGyro,!0),delete this.boundTestingForGyro,void 0)},_isiPadWithGyro:null,isiPadWithGyro:function(){return this._isiPadWithGyro!==!1&&this.isiPad()?this._isiPadWithGyro=this.hasGyro():!1},_hasLocalStorage:null,hasLocalStorage:function(){if(null!==this._hasLocalStorage)return this._hasLocalStorage;try{\"undefined\"!=typeof localStorage&&\"setItem\"in localStorage?(localStorage.setItem(\"ac_browser_detect\",\"test\"),this._hasLocalStorage=!0,localStorage.removeItem(\"ac_browser_detect\",\"test\")):this._hasLocalStorage=!1}catch(a){this._hasLocalStorage=!1}return this._hasLocalStorage},_hasSessionStorage:null,hasSessionStorage:function(){if(null!==this._hasSessionStorage)return this._hasSessionStorage;try{\"undefined\"!=typeof sessionStorage&&\"setItem\"in sessionStorage?(sessionStorage.setItem(\"ac_browser_detect\",\"test\"),this._hasSessionStorage=!0,sessionStorage.removeItem(\"ac_browser_detect\",\"test\")):this._hasSessionStorage=!1}catch(a){this._hasSessionStorage=!1}return this._hasSessionStorage},_hasCookies:null,hasCookies:function(){return null!==this._hasCookies?this._hasCookies:(this._hasCookies=\"cookie\"in document&&navigator.cookieEnabled?!0:!1,this._hasCookies)}};"
  },
  {
    "path": "works/demo/ali/file/btm.v.3.css",
    "content": "body {\n\tmargin:0;\n\tpadding:0;\n}\n.btmbarbox {\n\tposition:absolute;\n\tbottom:0;\n\tleft:0;\n\theight:38px;\n\twidth:100%;\n}\n.btmbg, .btmbar {\n\theight:35px;\n\twidth:100%;\n\t/*position:fixed;*/\n\tposition:absolute;\n\tbottom:0;\n\tleft:0;\n\tfont:16px \"microsoft yahei\", simsun, Arial, Helvetica, sans-serif;\n\t*font:14px simsun, Arial, Helvetica, sans-serif;\n\toverflow:hidden;\n}\n.btmbg {\n\tbackground:url(/images/abtest/btmbg.png) repeat-x;\n\t_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale, src=/images/abtest/btmbg.png);\n\t_background:none;\n}\n.btmbar {\n\tbackground:url(/images/abtest/btmicon.gif) no-repeat 8px 6px;\n\theight:30px;\n}\n.newslist {\n\tlist-style:none;\n\tpadding:0;\n\tmargin:0 50px 0 127px;\n\theight:30px;\n\toverflow:hidden;\n}\n.newslist li {\n\tfloat:left;\n\tline-height:30px;\n\tmargin-right:-2px;\n}\n.newslist a {\n\tdisplay:block;\n\tcolor:#00c;\n}\n.newslist a em {\n\tcolor:#c00;\n\tfont-style:normal;\n\ttext-decoration:underline;\n}\n.division_l {\n\tbackground:url(/images/abtest/division.gif) no-repeat left 7px;\n\tpadding-left:13px;\n\tdisplay:block;\n\tcursor:pointer;\n}\n.division_r {\n\tbackground:url(/images/abtest/division.gif) no-repeat right 7px;\n\tpadding-right:20px;\n\tdisplay:block;\n\tcursor:pointer;\n}\n.newsico {\n\tbackground:url(/images/abtest/newsico.gif) no-repeat left 9px;\n\tpadding-left:18px;\n\tdisplay:block;\n}\n.newslist a:hover {\n\tzoom:1;\n\tfilter:progid:DXImageTransform.Microsoft.gradient(startcolorstr=#FCFCFC,endcolorstr=#EDE9BC,gradientType=0);\n    background:-moz-linear-gradient(top, #FCFCFC, #EDE9BC);\n    background:-webkit-gradient(linear, 0 0, 0 bottom, from(#FCFCFC), to(#EDE9BC));\n    background:-o-linear-gradient(top, #FCFCFC, #EDE9BC);\n\tposition:relative;\n\tfloat:left;\n}\n.newslist a:hover .division_l {\n\tbackground:url(/images/abtest/division_hover.gif) no-repeat;\n\tfloat:left;\n}\n.newslist a:hover .division_r {\n\tbackground:url(/images/abtest/division_hover.gif) no-repeat right top;\n\tfloat:left;\n}\n.close, .cfg {\n\twidth:18px;\n\theight:28px;\n\tposition:absolute;\n\tbottom:3px;\n\tright:28px;\n\tbackground:url(/images/abtest/btmbtn.gif) no-repeat left -38px;\n\toverflow:hidden;\n\tline-height:100em;\n}\n.cfg:hover {\n\tbackground-position:left 8px;\n}\n.close {\n\tbackground-position:-22px -37px;\n\tright:6px;\n}\n.close:hover {\n\tbackground-position:-22px 9px;\n}\n.optboxbg {\n\tbackground:url(/images/optbox.png) no-repeat;\n\twidth:144px;\n\theight:109px;\n\tposition:absolute;\n\tright:8px;\n\tbottom:35px;\n\t_background-image:none;\n\t_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"/images/optbox.png\", sizingMethod=\"crop\");\n}\n.optbox {\n\twidth:127px;\n\theight:75px;\n\tposition:absolute;\n\tright:17px;\n\tbottom:57px;\n\tline-height:22px;\n\tfont-size:12px;\n}\n.optbox a {\n\tcolor:#426BBD;\n\tdisplay:block;\n\tpadding-left:9px;\n\t_zoom:1;\n\ttext-decoration:none;\n}\n.optbox a:hover {\n\tbackground-color:#EAF1F5;\n}\n.feedback {\n\tborder-top:1px solid #ccc;\n\tmargin-top:4px;\n\tpadding-top:4px;\n}"
  },
  {
    "path": "works/demo/ali/file/event_mixins.js",
    "content": "Event.Publisher=Class.create(),Object.extend(Event.Publisher,{_ls_event_targets:null,_event_source_id:null,_fl_trace_events:!1,getEventSourceId:function(){return\"function\"==typeof this._event_source_id?this._event_source_id():this._event_source_id},getEventTarget:function(a){return this._ls_event_targets||(this._ls_event_targets=new Array),this._ls_event_targets[a]||document.body.appendChild(this._ls_event_targets[a]=document.createElement(\"A\")),this._ls_event_targets[a]},addEventListener:function(a,b,c){var d=this.getEventTarget(a);if(Event.observe(d,\"click\",b,c),this._fl_trace_events){var e={publisher:this.getEventSourceId(),event_name:a,listener:b,capturing:c,event_source_proxy:d};this.dispatchEvent(\"eventListenerAdded\",e,!0,!0)}},removeEventListener:function(a,b,c){var d=this.getEventTarget(a);if(Event.stopObserving(d,\"click\",b,c),this._fl_trace_events){var e={publisher:this.getEventSourceId(),event_name:a,listener:b,capturing:c,event_source_proxy:d};this.dispatchEvent(\"eventListenerRemoved\",e,!0,!0)}},dispatchEvent:function(a,b,c,d){var e=this.getEventTarget(a),f={event_name:a,event_target:this,data:b?b:null};c||(c=!1),d||(d=!1);var g=Event.create(f,c,d,!0,e);if(this._fl_trace_events){if(a.match(/event(?:ListenerAdded|ListenerRemoved|Dispatched|Received)/))return;var b={publisher:this.getEventSourceId(),event_name:a,event_data:f,can_bubble:c,cancelable:d,event_source_proxy:e,result:g};this.dispatchEvent(\"eventDispatched\",b,!0,!0)}},toggleEventsTrace:function(){var a=Event.Tracer.findTracer();return a&&this._fl_trace_events?(this._fl_trace_events=!1,a&&a.unregisterPublisher(this)):(this._fl_trace_events=!0,a=Event.Tracer.startTrace(),a.registerPublisher(this)),this._fl_trace_events},isEventsTraceActive:function(){return this._fl_trace_events}}),Event.Listener=Class.create(),Object.extend(Event.Listener,{_listens:null,getEventHandlerName:function(a){var b=a.split(/[ _]/).join(\"-\").camelize();return\"on\"+b.charAt(0).toUpperCase()+b.substr(1)},listenForEvent:function(a,b,c,d){d||(d=this.getEventHandlerName(b)),this._listens||(this._listens=new Array);var e=this[d];\"function\"==typeof d&&(e=d);var f=function(a){a.event_data&&e.bindAsEventListener(this)(a)}.bindAsEventListener(this);this._listens.push([a,b,c,d,f]),a.addEventListener(b,f,c)},stopListeningForEvent:function(a,b,c,d){if(!this._listens)return!1;d||(d=this.getEventHandlerName(b));var e=-1,f=this._listens.detect(function(f,g){return f[0]==a&&f[1]==b&&f[2]==c&&f[3]==d?(e=g,!0):void 0});return e>=0?(this._listens.splice(e,1),a.removeEventListener(b,f[4],c),!0):!1}}),Object.extend(Event,{create:function(a,b,c,d,e){var f;return document.createEvent?(b||(b=!1),c||(c=!1),/Konqueror|Safari|KHTML/.test(navigator.userAgent)?(f=document.createEvent(\"HTMLEvents\"),f.initEvent(\"click\",b,c)):(f=document.createEvent(\"MouseEvents\"),f.initMouseEvent(\"click\",b,c,window,0,0,0,0,0,!1,!1,!1,!1,0,null))):(f=document.createEventObject(),f.event_type=\"onclick\"),f.event_data=a,d&&Event.dispatch(e,f),f},dispatch:function(a,b){return document.createEvent?a.dispatchEvent(b):a.fireEvent(\"undefined\"!=typeof b.event_type?b.event_type:\"onclick\",b)}});"
  },
  {
    "path": "works/demo/ali/file/header_footer.css",
    "content": "@charset \"utf-8\";#head_body{width:100%;height:auto;margin:0 auto;position:absolute;left:0;top:0;right:0;z-index:1000;background:#FFF;-moz-opacity:.8;opacity:.8;filter:alpha(opacity=80)}.head_bg{background:#FFF}#head_body #header{width:auto;position:relative;margin:0 40px;height:60px;border-bottom:1px solid #EEE}#head_body #header #logo{position:absolute;text-indent:-10000px;background:url(http://gtms03.alicdn.com/tps/i3/TB1TwBVFVXXXXaDapXXTqHeIpXX-192-40.png);width:192px;height:40px;left:0;top:9px}#head_body #header #head{width:680px;margin:auto;height:60px}#head_body #header #head li{float:left;font:100 14px/60px \"microsoft yahei\";text-align:center;margin-right:22px;padding:0 12px}#head_body #header #head li a{color:#333;text-align:center}#head_body #header #head li a.headhover{font:700 14px/60px \"microsoft yahei\"}#head_body #header #head li ul{width:70px;position:absolute;left:-9px;top:-999em;z-index:99999999;padding:8px;display:none}#head_body #header #er{position:absolute;width:190px;right:10%;Top:0}#head_body #header #er #erweima{position:relative;width:18px;display:none}#head_body #header #er #erweima a{display:block;background:url(http://gtms03.alicdn.com/tps/i3/TB1YM36FpXXXXbtcpXXoq9FFpXX-18-18.png) center 25% no-repeat;float:left;border:1px solid #FFF;width:18px;height:18px;margin-top:20px}#head_body #header #er #erweima:hover .fu_dr{width:32px;background:#FFF;display:block;height:1px;position:absolute;right:-15px;top:60px;z-index:201}#head_body #header #er #erweima .fu{display:none;position:absolute;top:60px;right:-16px}#head_body #header #er #erweima:hover .fu{border:1px solid #CCC;display:block;width:132px;height:148px;cursor:pointer;top:60px;right:-16px;font:100 12px/32px \"microsoft yahei\";text-align:center;color:#666}#head_body #header #er #erweima:hover .fu img{border:0;width:110px;height:110px;margin:11px 11px -14px 11px}#head_body #header #er #reg{float:left;font:100 12px \"microsoft yahei\";margin-left:22px}#head_body #header #er #reg a{color:#2373AE;line-height:62px}#head_body #header #er #reg span{padding:0 5px;color:#999;font:100 12px arial}#head_body #header #er #submit{background:#FE3D5D;color:#FFF;font:100 12px \"microsoft yahei\";padding:5px 12px;border-radius:3px;float:right;margin-top:16px;text-decoration:none}#head_body #header #er #submit:hover{background:#CB314B}#head_body #header .right{position:absolute;right:0;top:0;font:100 12px/62px \"microsoft yahei\";height:62px}#head_body #header .right ul li{float:left;margin-left:10px}#head_body #header .right a#weibo{background:url(http://gtms02.alicdn.com/tps/i2/TB12REiFVXXXXbKXFXX3pcaFFXX-25-25.png) center no-repeat;height:62px;width:25px;display:block}#head_body #header .right a#laiwang{background:url(http://gtms02.alicdn.com/tps/i2/TB1AfgrFVXXXXXVXXXX3pcaFFXX-25-25.png) center no-repeat;height:62px;width:25px;display:block}#bottom_bg{position:absolute;bottom:118px;left:50%;width:30%;margin-left:-15%;height:auto}#bottom_bg img{width:100%}#fluidfooter{width:100%;height:120px;background-color:#FFF;border-top:1px solid #EEE}.not_bottom{position:relative;margin-top:670px}.yes_bottom{position:absolute;bottom:0}#footer{width:1200px;margin:0 auto;height:120px;color:#333}#footer .footer{border-bottom:1px solid #EEE;height:78px;background:url(http://gtms01.alicdn.com/tps/i1/TB1saMqFVXXXXXnXpXXnW9CMFXX-292-47.png) 0 50% no-repeat;font:100 12px/80px \"microsoft yahei\";text-indent:312px}#footer .copyright{height:41px}#footer .copyright ul.group_link{margin:0;padding:0;float:left}#footer .copyright ul.group_link li{float:left;list-style:none;margin-right:8px}#footer .copyright ul.group_link li a{font:100 12px/32px \"microsoft yahei\";text-decoration:none;color:#666}#footer .copyright ul.group_link li a:hover{text-decoration:underline}#footer .copyright ul.right{margin:0;padding:0;float:right}#footer .copyright ul.right li{float:left;list-style:none;margin-left:8px}#footer .copyright ul.right li a{font:100 12px/32px \"microsoft yahei\";text-decoration:none;color:#666}#footer .copyright ul.right li a:hover{text-decoration:underline}#cooperation_body{width:546px;height:143px;position:absolute;z-index:1;left:30%;background:url(http://gtms01.alicdn.com/tps/i1/TB1HGksFVXXXXafXXXXreuH6VXX-546-143.png) no-repeat;bottom:77px}#cooperation{width:1200px;height:288px;position:absolute;left:50%;top:50%;margin-left:-600px;margin-top:-144px;overflow:hidden}#cooperation ul li{float:left;width:400px}#cooperation ul li dl dt a{display:block;width:110px;height:110px;margin:0 auto;margin-bottom:30px}#cooperation ul li dl dt a#cooperation1{background:url(http://gtms01.alicdn.com/tps/i1/TB1Vc7nFVXXXXXoXpXXW4780FXX-110-110.png) center center no-repeat}#cooperation ul li dl dt a#cooperation1:hover{background:url(http://gtms02.alicdn.com/tps/i2/TB1lygbFVXXXXbUXVXXW4780FXX-110-110.png) center center no-repeat}#cooperation ul li dl dt a#cooperation2{background:url(http://gtms04.alicdn.com/tps/i4/TB1ZB.gFVXXXXa2XVXXW4780FXX-110-110.png) center center no-repeat}#cooperation ul li dl dt a#cooperation2:hover{background:url(http://gtms01.alicdn.com/tps/i1/TB1QHwgFVXXXXXcXFXXW4780FXX-110-110.png) center center no-repeat}#cooperation ul li dl dt a#cooperation3{background:url(http://gtms03.alicdn.com/tps/i3/TB1NaArFVXXXXcoXXXXW4780FXX-110-110.png) center center no-repeat}#cooperation ul li dl dt a#cooperation3:hover{background:url(http://gtms04.alicdn.com/tps/i4/TB1.WoqFVXXXXcoXXXXW4780FXX-110-110.png) center center no-repeat}#cooperation ul li dl dd{text-align:center;font-family:\"microsoft yahei\";font-size:12px;line-height:22px;color:#333}#cooperation ul li dl dd img{margin-left:5px;margin-bottom:-2px}#cooperation ul li dl dd.title{font-size:18px;font-weight:100;line-height:32px;color:#000;margin-bottom:5px}#agenda{width:100%;margin-top:61px;*padding-top:61px;font-family:\"microsoft yahei\";behavior:url(style/css/ie-css3.htc);*margin-bottom:-19px}#agenda #left{width:calc(30% - 1px);*width:29.95%;float:left;background:#F9F9F9;height:100%;border-right:1px solid #E3E7E9;position:relative}#agenda #left p{position:absolute;right:38px;font-size:16px;color:#333}#agenda #left p.date1{top:110px}#agenda #left p.date2{top:388px}#agenda #left p.date3{top:740px}#agenda #left p.date4{top:1096px}#agenda #right{width:70%;float:right}#agenda #right h1{font-size:18px;padding:38px;border-bottom:1px solid #E3E7E9}#agenda #right h1.title1{background:url(http://gtms03.alicdn.com/tps/i3/TB1dexlFVXXXXcraXXXOuD4FpXX-19-19.png) 280px center #F9F9F9 no-repeat}#agenda #right h1.title2{background:url(http://gtms03.alicdn.com/tps/i3/TB1dexlFVXXXXcraXXXOuD4FpXX-19-19.png) 298px center #F9F9F9 no-repeat}#agenda #right h1.title3{background:url(http://gtms03.alicdn.com/tps/i3/TB1dexlFVXXXXcraXXXOuD4FpXX-19-19.png) 280px center #F9F9F9 no-repeat}#agenda #right h2{background:#E9E9E9;padding-left:38px;padding-top:12px;padding-bottom:12px}#agenda #right ul li{border-bottom:1px solid #E3E7E9;text-indent:38px;padding:12px 0;font-size:12px;color:#333}#agenda #right ul li span{color:#999;margin-right:40px}#agenda #right ul li i{padding-left:32px}.fullBg{position:fixed;top:0;left:0;overflow:hidden}"
  },
  {
    "path": "works/demo/ali/file/index.js",
    "content": "!function(){function r(){this.bf_P=this.Fbf_P(),this.bf_S0=this.Fbf_S0(),this.bf_S1=this.Fbf_S1(),this.bf_S2=this.Fbf_S2(),this.bf_S3=this.Fbf_S3(),this.escape=function(r){for(var t=\"\",e=0;e<r.length;e++){var o=r.charCodeAt(e),n=Math.floor(o/16),i=o%16;n+=10>n?48:55,i+=10>i?48:55,t+=String.fromCharCode(n)+String.fromCharCode(i)}return t},this.wordbyte0=function(r){return Math.floor(Math.floor(Math.floor(r/256)/256)/256)%256},this.wordbyte1=function(r){return Math.floor(Math.floor(r/256)/256)%256},this.wordbyte2=function(r){return Math.floor(r/256)%256},this.wordbyte3=function(r){return r%256},this.xor=function(r,t){var e=r^t;return 0>e&&(e=4294967296+e),e};var r=\"4055AOI1944sa95\";this.key=r.length>56?r.substr(0,56):r;for(var t=0,e=0;18>e;++e){var o=256*(256*(256*this.key.charCodeAt(t%this.key.length)+this.key.charCodeAt((t+1)%this.key.length))+this.key.charCodeAt((t+2)%this.key.length))+this.key.charCodeAt((t+3)%this.key.length);this.bf_P[e]=this.xor(this.bf_P[e],o),t=(t+4)%this.key.length}this.xl_par=0,this.xr_par=0;for(var e=0;18>e;e+=2)this.encipher(),this.bf_P[e]=this.xl_par,this.bf_P[e+1]=this.xr_par;for(t=0;256>t;t+=2)this.encipher(),this.bf_S0[t]=this.xl_par,this.bf_S0[t+1]=this.xr_par;for(t=0;256>t;t+=2)this.encipher(),this.bf_S1[t]=this.xl_par,this.bf_S1[t+1]=this.xr_par;for(t=0;256>t;t+=2)this.encipher(),this.bf_S2[t]=this.xl_par,this.bf_S2[t+1]=this.xr_par;for(t=0;256>t;t+=2)this.encipher(),this.bf_S3[t]=this.xl_par,this.bf_S3[t+1]=this.xr_par;this.unescape=function(r){var t=\"\";for(e=0;e<r.length;e++){var o=r.charCodeAt(e++),n=r.charCodeAt(e);o-=58>o?48:o>96?87:55,n-=58>n?48:n>96?87:55,t+=String.fromCharCode(16*o+n)}return t}}r.prototype.Fbf_P=function(){return[608135816,2242054355,320440878,57701188,2752067618,698298832,137296536,3964562569,1160258022,953160567,3193202383,887688300,3232508343,3380367581,1065670069,3041331479,2450970073,2306472731]},r.prototype.Fbf_S0=function(){return[3509652390,2564797868,805139163,3491422135,3101798381,1780907670,3128725573,4046225305,614570311,3012652279,134345442,2240740374,1667834072,1901547113,2757295779,4103290238,227898511,1921955416,1904987480,2182433518,2069144605,3260701109,2620446009,720527379,3318853667,677414384,3393288472,3101374703,2390351024,1614419982,1822297739,2954791486,3608508353,3174124327,2024746970,1432378464,3864339955,2857741204,1464375394,1676153920,1439316330,715854006,3033291828,289532110,2706671279,2087905683,3018724369,1668267050,732546397,1947742710,3462151702,2609353502,2950085171,1814351708,2050118529,680887927,999245976,1800124847,3300911131,1713906067,1641548236,4213287313,1216130144,1575780402,4018429277,3917837745,3693486850,3949271944,596196993,3549867205,258830323,2213823033,772490370,2760122372,1774776394,2652871518,566650946,4142492826,1728879713,2882767088,1783734482,3629395816,2517608232,2874225571,1861159788,326777828,3124490320,2130389656,2716951837,967770486,1724537150,2185432712,2364442137,1164943284,2105845187,998989502,3765401048,2244026483,1075463327,1455516326,1322494562,910128902,469688178,1117454909,936433444,3490320968,3675253459,1240580251,122909385,2157517691,634681816,4142456567,3825094682,3061402683,2540495037,79693498,3249098678,1084186820,1583128258,426386531,1761308591,1047286709,322548459,995290223,1845252383,2603652396,3431023940,2942221577,3202600964,3727903485,1712269319,422464435,3234572375,1170764815,3523960633,3117677531,1434042557,442511882,3600875718,1076654713,1738483198,4213154764,2393238008,3677496056,1014306527,4251020053,793779912,2902807211,842905082,4246964064,1395751752,1040244610,2656851899,3396308128,445077038,3742853595,3577915638,679411651,2892444358,2354009459,1767581616,3150600392,3791627101,3102740896,284835224,4246832056,1258075500,768725851,2589189241,3069724005,3532540348,1274779536,3789419226,2764799539,1660621633,3471099624,4011903706,913787905,3497959166,737222580,2514213453,2928710040,3937242737,1804850592,3499020752,2949064160,2386320175,2390070455,2415321851,4061277028,2290661394,2416832540,1336762016,1754252060,3520065937,3014181293,791618072,3188594551,3933548030,2332172193,3852520463,3043980520,413987798,3465142937,3030929376,4245938359,2093235073,3534596313,375366246,2157278981,2479649556,555357303,3870105701,2008414854,3344188149,4221384143,3956125452,2067696032,3594591187,2921233993,2428461,544322398,577241275,1471733935,610547355,4027169054,1432588573,1507829418,2025931657,3646575487,545086370,48609733,2200306550,1653985193,298326376,1316178497,3007786442,2064951626,458293330,2589141269,3591329599,3164325604,727753846,2179363840,146436021,1461446943,4069977195,705550613,3059967265,3887724982,4281599278,3313849956,1404054877,2845806497,146425753,1854211946]},r.prototype.Fbf_S1=function(){return[1266315497,3048417604,3681880366,3289982499,290971e4,1235738493,2632868024,2414719590,3970600049,1771706367,1449415276,3266420449,422970021,1963543593,2690192192,3826793022,1062508698,1531092325,1804592342,2583117782,2714934279,4024971509,1294809318,4028980673,1289560198,2221992742,1669523910,35572830,157838143,1052438473,1016535060,1802137761,1753167236,1386275462,3080475397,2857371447,1040679964,2145300060,2390574316,1461121720,2956646967,4031777805,4028374788,33600511,2920084762,1018524850,629373528,3691585981,3515945977,2091462646,2486323059,586499841,988145025,935516892,3367335476,2599673255,2839830854,265290510,3972581182,2759138881,3795373465,1005194799,847297441,406762289,1314163512,1332590856,1866599683,4127851711,750260880,613907577,1450815602,3165620655,3734664991,3650291728,3012275730,3704569646,1427272223,778793252,1343938022,2676280711,2052605720,1946737175,3164576444,3914038668,3967478842,3682934266,1661551462,3294938066,4011595847,840292616,3712170807,616741398,312560963,711312465,1351876610,322626781,1910503582,271666773,2175563734,1594956187,70604529,3617834859,1007753275,1495573769,4069517037,2549218298,2663038764,504708206,2263041392,3941167025,2249088522,1514023603,1998579484,1312622330,694541497,2582060303,2151582166,1382467621,776784248,2618340202,3323268794,2497899128,2784771155,503983604,4076293799,907881277,423175695,432175456,1378068232,4145222326,3954048622,3938656102,3820766613,2793130115,2977904593,26017576,3274890735,3194772133,1700274565,1756076034,4006520079,3677328699,720338349,1533947780,354530856,688349552,3973924725,1637815568,332179504,3949051286,53804574,2852348879,3044236432,1282449977,3583942155,3416972820,4006381244,1617046695,2628476075,3002303598,1686838959,431878346,2686675385,1700445008,1080580658,1009431731,832498133,3223435511,2605976345,2271191193,2516031870,1648197032,4164389018,2548247927,300782431,375919233,238389289,3353747414,2531188641,2019080857,1475708069,455242339,2609103871,448939670,3451063019,1395535956,2413381860,1841049896,1491858159,885456874,4264095073,4001119347,1565136089,3898914787,1108368660,540939232,1173283510,2745871338,3681308437,4207628240,3343053890,4016749493,1699691293,1103962373,3625875870,2256883143,3830138730,1031889488,3479347698,1535977030,4236805024,3251091107,2132092099,1774941330,1199868427,1452454533,157007616,2904115357,342012276,595725824,1480756522,206960106,497939518,591360097,863170706,2375253569,3596610801,1814182875,2094937945,3421402208,1082520231,3463918190,2785509508,435703966,3908032597,1641649973,2842273706,3305899714,1510255612,2148256476,2655287854,3276092548,4258621189,236887753,3681803219,274041037,1734335097,3815195456,3317970021,1899903192,1026095262,4050517792,356393447,2410691914,3873677099,3682840055]},r.prototype.Fbf_S2=function(){return[3913112168,2491498743,4132185628,2489919796,1091903735,1979897079,3170134830,3567386728,3557303409,857797738,1136121015,1342202287,507115054,2535736646,337727348,3213592640,1301675037,2528481711,1895095763,1721773893,3216771564,62756741,2142006736,835421444,2531993523,1442658625,3659876326,2882144922,676362277,1392781812,170690266,3921047035,1759253602,3611846912,1745797284,664899054,1329594018,3901205900,3045908486,2062866102,2865634940,3543621612,3464012697,1080764994,553557557,3656615353,3996768171,991055499,499776247,1265440854,648242737,3940784050,980351604,3713745714,1749149687,3396870395,4211799374,3640570775,1161844396,3125318951,1431517754,545492359,4268468663,3499529547,1437099964,2702547544,3433638243,2581715763,2787789398,1060185593,1593081372,2418618748,4260947970,69676912,2159744348,86519011,2512459080,3838209314,1220612927,3339683548,133810670,1090789135,1078426020,1569222167,845107691,3583754449,4072456591,1091646820,628848692,1613405280,3757631651,526609435,236106946,48312990,2942717905,3402727701,1797494240,859738849,992217954,4005476642,2243076622,3870952857,3732016268,765654824,3490871365,2511836413,1685915746,3888969200,1414112111,2273134842,3281911079,4080962846,172450625,2569994100,980381355,4109958455,2819808352,2716589560,2568741196,3681446669,3329971472,1835478071,660984891,3704678404,4045999559,3422617507,3040415634,1762651403,1719377915,3470491036,2693910283,3642056355,3138596744,1364962596,2073328063,1983633131,926494387,3423689081,2150032023,4096667949,1749200295,3328846651,309677260,2016342300,1779581495,3079819751,111262694,1274766160,443224088,298511866,1025883608,3806446537,1145181785,168956806,3641502830,3584813610,1689216846,3666258015,3200248200,1692713982,2646376535,4042768518,1618508792,1610833997,3523052358,4130873264,2001055236,3610705100,2202168115,4028541809,2961195399,1006657119,2006996926,3186142756,1430667929,3210227297,1314452623,4074634658,4101304120,2273951170,1399257539,3367210612,3027628629,1190975929,2062231137,2333990788,2221543033,2438960610,1181637006,548689776,2362791313,3372408396,3104550113,3145860560,296247880,1970579870,3078560182,3769228297,1714227617,3291629107,3898220290,166772364,1251581989,493813264,448347421,195405023,2709975567,677966185,3703036547,1463355134,2715995803,1338867538,1343315457,2802222074,2684532164,233230375,2599980071,2000651841,3277868038,1638401717,4028070440,3237316320,6314154,819756386,300326615,590932579,1405279636,3267499572,3150704214,2428286686,3959192993,3461946742,1862657033,1266418056,963775037,2089974820,2263052895,1917689273,448879540,3550394620,3981727096,150775221,3627908307,1303187396,508620638,2975983352,2726630617,1817252668,1876281319,1457606340,908771278,3720792119,3617206836,2455994898,1729034894,1080033504]},r.prototype.Fbf_S3=function(){return[976866871,3556439503,2881648439,1522871579,1555064734,1336096578,3548522304,2579274686,3574697629,3205460757,3593280638,3338716283,3079412587,564236357,2993598910,1781952180,1464380207,3163844217,3332601554,1699332808,1393555694,1183702653,3581086237,1288719814,691649499,2847557200,2895455976,3193889540,2717570544,1781354906,1676643554,2592534050,3230253752,1126444790,2770207658,2633158820,2210423226,2615765581,2414155088,3127139286,673620729,2805611233,1269405062,4015350505,3341807571,4149409754,1057255273,2012875353,2162469141,2276492801,2601117357,993977747,3918593370,2654263191,753973209,36408145,2530585658,25011837,3520020182,2088578344,530523599,2918365339,1524020338,1518925132,3760827505,3759777254,1202760957,3985898139,3906192525,674977740,4174734889,2031300136,2019492241,3983892565,4153806404,3822280332,352677332,2297720250,60907813,90501309,3286998549,1016092578,2535922412,2839152426,457141659,509813237,4120667899,652014361,1966332200,2975202805,55981186,2327461051,676427537,3255491064,2882294119,3433927263,1307055953,942726286,933058658,2468411793,3933900994,4215176142,1361170020,2001714738,2830558078,3274259782,1222529897,1679025792,2729314320,3714953764,1770335741,151462246,3013232138,1682292957,1483529935,471910574,1539241949,458788160,3436315007,1807016891,3718408830,978976581,1043663428,3165965781,1927990952,4200891579,2372276910,3208408903,3533431907,1412390302,2931980059,4132332400,1947078029,3881505623,4168226417,2941484381,1077988104,1320477388,886195818,18198404,3786409e3,2509781533,112762804,3463356488,1866414978,891333506,18488651,661792760,1628790961,3885187036,3141171499,876946877,2693282273,1372485963,791857591,2686433993,3759982718,3167212022,3472953795,2716379847,445679433,3561995674,3504004811,3574258232,54117162,3331405415,2381918588,3769707343,4154350007,1140177722,4074052095,668550556,3214352940,367459370,261225585,2610173221,4209349473,3468074219,3265815641,314222801,3066103646,3808782860,282218597,3406013506,3773591054,379116347,1285071038,846784868,2669647154,3771962079,3550491691,2305946142,453669953,1268987020,3317592352,3279303384,3744833421,2610507566,3859509063,266596637,3847019092,517658769,3462560207,3443424879,370717030,4247526661,2224018117,4143653529,4112773975,2788324899,2477274417,1456262402,2901442914,1517677493,1846949527,2295493580,3734397586,2176403920,1280348187,1908823572,3871786941,846861322,1172426758,3287448474,3383383037,1655181056,3139813346,901632758,1897031941,2986607138,3066810236,3447102507,1393639104,373351379,950779232,625454576,3124240540,4148612726,2007998917,544563296,2244738638,2330496472,2058025392,1291430526,424198748,50039436,29584100,3605783033,2429876329,2791104160,1057563949,3255363231,3075367218,3463963227,1469046755,985887462]},r.prototype.lingshao=function(r){for(var t=0;t<r.length%8;t++)r+=\"0\";for(var e=\"\",t=0;t<r.length;t+=8){var o=r.substr(t,4),n=r.substr(t+4,4),i=o.charCodeAt(3)|o.charCodeAt(2)<<8|o.charCodeAt(1)<<16|o.charCodeAt(0)<<24;0>i&&(i=4294967296+i);var a=n.charCodeAt(3)|n.charCodeAt(2)<<8|n.charCodeAt(1)<<16|n.charCodeAt(0)<<24;0>a&&(a=4294967296+a),this.xl_par=i,this.xr_par=a,this.encipher(),e+=this.wordescape(this.xl_par)+this.wordescape(this.xr_par)}return e},r.prototype.wordescape=function(r){for(var t=\"\",e=new Array(this.wordbyte3(r),this.wordbyte2(r),this.wordbyte1(r),this.wordbyte0(r)),o=3;o>=0;o--){var n=Math.floor(e[o]/16),i=e[o]%16;n+=10>n?48:55,i+=10>i?48:55,t+=String.fromCharCode(n)+String.fromCharCode(i)}return t},r.prototype.wordunescape=function(r){for(var t=0,e=6;e>=0;e-=2){var o=r.charCodeAt(e),n=r.charCodeAt(e+1);o-=58>o?48:55,n-=58>n?48:55,t=256*t+(16*o+n)}return t},r.prototype.round=function(r,t,e){var o=this;return o.xor(r,o.xor(o.xor(o.bf_S0[o.wordbyte0(t)]+o.bf_S1[o.wordbyte1(t)],o.bf_S2[o.wordbyte2(t)])+o.bf_S3[o.wordbyte3(t)],o.bf_P[e]))},r.prototype.encipher=function(){var r=this,t=r.xl_par,e=r.xr_par;t=r.xor(t,r.bf_P[0]),e=r.round(e,t,1),t=r.round(t,e,2),e=r.round(e,t,3),t=r.round(t,e,4),e=r.round(e,t,5),t=r.round(t,e,6),e=r.round(e,t,7),t=r.round(t,e,8),e=r.round(e,t,9),t=r.round(t,e,10),e=r.round(e,t,11),t=r.round(t,e,12),e=r.round(e,t,13),t=r.round(t,e,14),e=r.round(e,t,15),t=r.round(t,e,16),e=r.xor(e,r.bf_P[17]),r.xl_par=e,r.xr_par=t},r.prototype.decipher=function(){var r=this,t=r.xl_par,e=r.xr_par;t=r.xor(t,r.bf_P[17]),e=r.round(e,t,16),t=r.round(t,e,15),e=r.round(e,t,14),t=r.round(t,e,13),e=r.round(e,t,12),t=r.round(t,e,11),e=r.round(e,t,10),t=r.round(t,e,9),e=r.round(e,t,8),t=r.round(t,e,7),e=r.round(e,t,6),t=r.round(t,e,5),e=r.round(e,t,4),t=r.round(t,e,3),e=r.round(e,t,2),t=r.round(t,e,1),e=r.xor(e,r.bf_P[0]),r.xl_par=e,r.xr_par=t};var t={decode:function(r){return decodeURIComponent(r.replace(/\\+/g,\" \"))},isNotEmptyString:function(r){return\"string\"==typeof r&&\"\"!==r},get:function(r){var t,e,o=this;return o.isNotEmptyString(r)&&(e=String(document.cookie).match(new RegExp(\"(?:^| )\"+r+\"(?:(?:=([^;]*))|;|$)\")))&&(t=e[1]?o.decode(e[1]):\"\"),t},getDomain:function(){var r=document.domain.split(\".\"),t=r.length;return r[t-2]+\".\"+r[t-1]},set:function(r,t,e,o,n,i){var a=String(encodeURIComponent(t)),h=e;try{o=o?o:this.getDomain()}catch(s){}\"number\"==typeof h&&(h=new Date,h.setTime(h.getTime()+864e5*e)),h instanceof Date&&(a+=\"; expires=\"+h.toUTCString()),o&&(a+=\"; domain=\"+o),a+=\"; path=/\",i&&(a+=\"; secure\"),document.cookie=r+\"=\"+a},del:function(r,t,e,o){this.set(r,\"\",-1,t,e,o)}},e=function(){function r(r){if(external)try{var t=external.twGetRunPath.toLowerCase(),e=external.twGetSecurityID(window),o=external.twGetVersion(e);if(t&&-1===t.indexOf(r))return!1;if(o)return{version:o}}catch(n){}}function t(r,t){for(var e=0;e<t.length;e++)if(r===t[e])return e}function e(r){return r.replace(/(\\d*\\.[^\\.]*).*/,\"$1\")}function o(r){for(var t,e=\"\",o=0;r>o;o++)t=Math.floor(10*Math.random()),0==o&&\"0\"==t&&(t=1),e+=t;return e}function n(r){return 10>r?\"0\"+r:r}return function(){function i(){var r=new Date,t=Date.parse(\"Jan 1,\"+r.getFullYear());return+r-t}function a(){var r=[0,0,0],t=window.navigator;try{t.javaEnabled()&&(r[0]=1)}catch(e){}try{window.localStorage&&(r[1]=1)}catch(e){}try{(t.plugins[\"Shockwave Flash\"]||window.ActiveXObject)&&(r[2]=1)}catch(e){}return r.join(\"\")}function h(){x=\"number\"==typeof x?x:x.replace(/[a-zA-Z]+/g,\"\");var r,e=p.split(\"|\").concat(b.split(\"|\")),h=[];e=e.concat(m),h[0]=n(t(w,e)),h[1]=n(parseInt(x)),h[2]=t(c.toLocaleLowerCase(),u),h[3]=o(4),h[4]=parseInt(Number(a()),2)+1+\"\"+i(),r=parseInt(h[3]+h[4]).toString(32);var s={name:w,version:x,core:_,os:c,cls:h[0]+\"\"+h[1]+h[2]+r,num:h,canCheckOS:u,canCheckBrowser:e};return s}var s,c,d,f=navigator.userAgent,u=[\"windows\",\"mac\",\"android\",\"ipad\",\"iphone\",\"linux\",\"other\"],p=\"other|ie|chrome|firefox|webkit|safari|mobile_safari|mobile_webkit|ucbrowser|Gecko|opera|opera mini|opera mobi\",b=\"360|maxthon|qihu theworld|theworld|qqbrowser|taobrowser|se [0-9]+.|tencenttraveler|lbbrowser\",l=new RegExp(b,\"i\"),m=[\"ucbrowser\",\"crios\",\"mqqbrowser\",\"sogoumobilebrowser\",\"oupeng\",\"chrome\"],w=\"other\",_=\"other\",x=\"00\";if(f.indexOf(\"Android\")>-1?c=\"Android\":(c=f.match(/(Windows|Mac|Android|ipad|iphone|linux)/i),c=c?c[0]:\"other\"),(s=f.match(/MSIE ([^;]*)|Trident.*; rv(?:\\\\s|:)?([\\d.]+)/))&&s[1]?(_=\"ie\",_=\"trident\",x=e(s[1])):(s=f.match(/Chrome\\/([\\d.]*)/))&&s[1]&&(_=\"chrome\",w=\"chrome\",x=s[1]),(s=f.match(l))&&s[0]&&f.indexOf(\"Android\")<0&&f.indexOf(\"Mobile\")<0){if(f.indexOf(\"AppleWebKit\")>-1&&(_=\"webkit\"),w=s[0].toLocaleLowerCase(),(d=w.match(/se\\s(\\d+)\\./i))&&d[1])w=\"se [0-9]+.\",x=d[1];else if(b.indexOf(w)>-1){var d,v=new RegExp(w+\"\\\\/*\\\\s*[0-9.]+\",\"i\");(d=f.match(v))&&d[0]&&(x=d[0].replace(/^[a-zA-Z\\/\\s]+/,\"\"))}return h()}if((s=f.match(/Trident.*; rv(?:\\\\s|:)?([0-9.]+)/))&&s[1])return w=\"ie\",_=\"trident\",x=e(s[1]),h();if((s=f.match(/MSIE ([^;]*)|Trident.*; rv(?:\\\\s|:)?([0-9.]+)/))&&s[1]){w=\"ie\";try{var g=window.external;\"ie\"==w&&(r(\"theworld\")?w=\"theworld\":isNaN(g)&&(w=\"360\"))}catch(y){}}if(f.indexOf(\"AppleWebKit\")>-1)if(w=\"webkit\",_=\"webkit\",(s=f.match(/OPR\\/([\\d.]*)/))&&s[1])x=e(s[1]),w=\"opera\";else if((s=f.match(/\\/([\\d.]*) Mobile/))&&s[1]){w=\"mobile_safari\",x=(d=f.match(/Version\\/([\\d.]*)/))&&d[1]?d[1]:e(s[1]);var S=new RegExp(m.join(\"|\"),\"i\");if((s=f.match(S))&&(w=s[0].toLowerCase(),w=w.replace(/[^a-zA-Z]+/gi,\"\"),m.join(\",\").indexOf(w)>-1)){var d,v=new RegExp(w+\"\\\\/*\\\\s*([0-9.]+)\",\"i\");(d=f.match(v))&&d[1]&&(x=d[1])}}else if(s=f.match(/NokiaN[^\\/]*|Android \\d\\.\\d|webOS\\/\\d\\.\\d/)){w=\"mobile_webkit\",x=s[0];var S=new RegExp(m.join(\"|\"),\"i\");if((s=f.match(S))&&(w=s[0].toLowerCase(),w=w.replace(/[^a-zA-Z]+/gi,\"\"),m.join(\",\").indexOf(w)>-1)){var d,v=new RegExp(w+\"\\\\/*\\\\s*([0-9.]+)\",\"i\");(d=f.match(v))&&d[1]&&(x=d[1])}}else(s=f.match(/\\/([\\d.]*) Safari/))&&s[1]?(w=\"safari\",x=e(s[1]),!/version\\/([\\d.]+).*safari/.test(f)&&(s=f.match(/Chrome\\/([0-9.]*)/))&&s[1]&&(w=\"chrome\",x=s[1])):(s=f.match(/Chrome\\/([0-9.]*)/))&&s[1]&&(w=\"chrome\",x=s[1]);else(s=f.match(/Gecko/))?(w=\"Gecko\",_=\"Gecko\",(s=f.match(/Firefox\\/([\\d.]*)/))&&s[1]&&(w=\"firefox\",x=e(s[1]))):(s=f.match(/Presto\\/([\\d.]*)/))&&s[1]&&(_=\"presto\",x=e(s[1]),(s=f.match(/Opera\\/([\\d.]*)/))&&s[1]&&(w=\"opera\",x=e(s[1]),(s=f.match(/Opera\\/.* Version\\/([\\d.]*)/))&&s[1]&&(x=e(s[1])),(s=f.match(/Opera Mini[^;]*/))&&s?(w=\"opera mini\",x=s[0]):(s=f.match(/Opera Mobi[^;]*/))&&s&&(w=\"opera mobi\",x=s[0])));return h()}}();try{var o=e(),n=new r,i=n.lingshao(o.cls);t.set(\"isg\",i,30)}catch(a){}}(window);"
  },
  {
    "path": "works/demo/ali/file/index_2.css",
    "content": "body{margin:0}.fullBg{position:fixed;top:0;left:0;overflow:hidden}#banner{width:880px;height:360px;position:absolute;left:50%;margin-left:-440px;top:50%;margin-top:-180px}a#page_down{position:absolute;left:50%;bottom:20px;width:52px;height:52px;margin-left:-17px;background:url(http://gtms02.alicdn.com/tps/i2/TB17fVmFVXXXXaTaXXXkEI0HXXX-52-52.png) no-repeat;z-index:100}#banner .list-wrap{width:880px;height:224px}#banner .list-wrap dl{width:100%;color:#FFF;margin:0;padding:0}#banner .list-wrap dl .hide{position:absolute;top:-9999px;left:-9999px}#banner .list-wrap dl dt{width:100%;text-align:center;margin:0;padding:0;margin-bottom:32px}#banner .list-wrap dl dd{width:880px;text-align:center;font:100 26px \"microsoft yahei\";margin:0;padding:0;margin-bottom:32px}#banner .list-wrap dl dd.content{font-size:12px}#banner .nav{width:478px;margin:0 auto;padding:0;overflow:hidden;list-style:none}#banner .nav li{float:left;margin-right:70px;margin-top:80px}#banner .nav li.item_4{margin-right:0}#banner .nav li.item_1 a{display:block;width:67px;height:67px;background:url(http://gtms01.alicdn.com/tps/i1/TB1smMnFVXXXXX0XpXXXL5D2VXX-67-134.png) no-repeat}#banner .nav li.item_2 a{display:block;width:67px;height:67px;background:url(http://gtms02.alicdn.com/tps/i2/TB1XZdpFVXXXXb2XVXXXL5D2VXX-67-134.png) no-repeat}#banner .nav li.item_3 a{display:block;width:67px;height:67px;background:url(http://gtms03.alicdn.com/tps/i3/TB14isrFVXXXXXQXpXXXL5D2VXX-67-134.png) no-repeat}#banner .nav li.item_4 a{display:block;width:67px;height:67px;background:url(http://gtms04.alicdn.com/tps/i4/TB1T6RYFVXXXXcAXVXXXL5D2VXX-67-134.png) no-repeat}#banner .nav li a.current,#banner .nav li a:hover{background-position:0 -67px}"
  },
  {
    "path": "works/demo/ali/file/index_3.css",
    "content": "#index_3{width:100%;height:100%}#index_3 li{width:100%;float:left;height:100%;cursor:pointer}#index_3 li img{filter:Alpha(Opacity=50,Style=1);opacity:.5;-moz-opacity:.5;width:100%;height:auto}#index_3 li:hover img{filter:Alpha(Opacity=100,Style=1);opacity:1;-moz-opacity:1}#index_3 li h1,#index_3 li h2,#index_3 li p{display:block;position:absolute;color:#FFF;text-align:center;width:100%}#index_3 li h1{font:100 26px \"microsoft yahei\";bottom:25%}#index_3 li h2{font:100 14px \"microsoft yahei\";bottom:22%}.fullBg{position:fixed;top:0;left:0;overflow:hidden}.owl-carousel .owl-stage:after{content:\".\";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel{display:none;width:100%;position:relative;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0px,0,0)}.owl-controls .owl-dot,.owl-controls .owl-nav div{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel .owl-video-play-icon:hover{-moz-transform:scale(1.3,1.3);-ms-transform:scale(1.3,1.3);-o-transform:scale(1.3,1.3);-webkit-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-loaded{display:block}.owl-loading{opacity:0;display:block}.owl-hidden{opacity:0}.owl-carousel .owl-refresh .owl-item{display:none}.owl-carousel .owl-item{position:relative;float:left}.owl-carousel .owl-item img{width:100%}.owl-carousel.owl-text-select-on .owl-item{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.owl-carousel .owl-grab{cursor:move;cursor:-webkit-grab;cursor:-o-grab;cursor:-ms-grab;cursor:grab}.owl-carousel .owl-stage.backfacefix .owl-item{-webkit-backface-visibility:hidden}.owl-rtl{direction:rtl}.owl-rtl .owl-item{float:right}.no-js .owl-carousel{display:block}.animated{-webkit-animation-duration:600ms;animation-duration:600ms;-webkit-animation-fill-mode:both;animation-fill-mode:both}.owl-animated-in{z-index:0}.owl-animated-out{z-index:1}.fadeOut{-webkit-animation-name:fadeOut;animation-name:fadeOut}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-theme .owl-controls{margin-top:-150px;text-align:center;-webkit-tap-highlight-color:rgba(0,0,0,0)}.owl-theme .owl-controls .owl-nav div:hover{text-decoration:none}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1;*display:inline;z-index:100}.owl-theme .owl-dots .owl-dot span{-webkit-backface-visibility:visible;display:block;width:13px;height:13px;margin:5px 7px;filter:Alpha(Opacity=50);opacity:.5;-webkit-border-radius:20px;-moz-border-radius:20px;border-radius:20px;transition-property:opacity;transition-duration:200ms;transition-timing-function:ease;background:#CCC}.owl-theme .owl-dots .owl-dot.active span{border:2px solid #FFF;background:0 0;width:10px;height:10px;filter:Alpha(Opacity=100)}"
  },
  {
    "path": "works/demo/ali/file/jquery.fullbg.js",
    "content": "!function(a){a.fn.fullBg=function(){function b(){var b=c.width(),d=c.height(),e=a(window).width(),f=a(window).height(),g=e/b,h=f/d,i=h*b,j=g*d;c.css(j>f?{width:e+\"px\",height:j+\"px\"}:{width:i+\"px\",height:f+\"px\"})}var c=a(this);c.addClass(\"fullBg\"),b(),a(window).resize(function(){b()})}}(jQuery);"
  },
  {
    "path": "works/demo/ali/file/organictabs.jquery.js",
    "content": "!function(a){a.organicTabs=function(b,c){var d=this;d.$el=a(b),d.$nav=d.$el.find(\".nav\"),d.init=function(){d.options=a.extend({},a.organicTabs.defaultOptions,c),a(\".hide\").css({position:\"relative\",top:0,left:0,display:\"none\"}),d.$nav.delegate(\"a\",\"click\",function(b){b.preventDefault();var c=d.$el.find(\"a.current\").attr(\"href\").substring(1),e=a(this),f=e.attr(\"href\").substring(1),g=d.$el.find(\".list-wrap\"),h=g.height();g.height(h),f!=c&&0==d.$el.find(\":animated\").length&&d.$el.find(\"#\"+c).fadeOut(d.options.speed,function(){d.$el.find(\"#\"+f).fadeIn(d.options.speed);var a=d.$el.find(\"#\"+f).height();g.animate({height:a},d.options.speed),d.$el.find(\".nav li a\").removeClass(\"current\"),e.addClass(\"current\"),window.history&&history.pushState&&history.replaceState(\"\",\"\",\"?\"+d.options.param+\"=\"+f)})});var b={};if(window.location.href.replace(new RegExp(\"([^?=&]+)(=([^&]*))?\",\"g\"),function(a,c,d,e){b[c]=e}),b[d.options.param]){var e=a(\"a[href='#\"+b[d.options.param]+\"']\");e.closest(\".nav\").find(\"a\").removeClass(\"current\").end().next(\".list-wrap\").find(\"ul\").hide(),e.addClass(\"current\"),a(\"#\"+b[d.options.param]).show()}},d.init()},a.organicTabs.defaultOptions={speed:300,param:\"tab\"},a.fn.organicTabs=function(b){return this.each(function(){new a.organicTabs(this,b)})}}(jQuery);"
  },
  {
    "path": "works/demo/ali/file/overview.css",
    "content": "body,html{overflow-y:hidden;min-width:1024px;-webkit-transition:opacity 400ms;-moz-transition:opacity 400ms;transition:opacity 400ms}body{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;*background-color:#e4d8c4;*zoom:1}body.player-jump{opacity:0}#main,html{display:block;position:static;padding:0;width:100%;height:100%;*zoom:1}#main{position:relative;z-index:10}html.scroll,html.scroll body.scroll{overflow-y:visible}html.scroll{*min-width:auto;*overflow-y:auto}html.scroll body.scroll{position:relative;min-width:inherit;*overflow-y:visible}html.scroll body.scroll #main{position:absolute;top:0;overflow:visible}#product-nav-slide .product-header-background{opacity:1}#product-nav-slide{position:absolute;width:100%;z-index:20;top:-61px;line-height:normal;-webkit-transform:translateZ(0);-webkit-transition:-webkit-transform 700ms;-moz-transition:-moz-transform 700ms;transition:transform 700ms}#product-nav-slide.active{-webkit-transition:-webkit-transform 600ms;-moz-transition:-moz-transform 600ms;transition:transform 600ms;-webkit-transition-delay:1010ms;-moz-transition-delay:1010ms;transition-delay:1010ms;-webkit-transform:translateY(57px) translateZ(0);-moz-transform:translateY(57px);transform:translateY(57px)}body.scroll #product-nav-slide{display:none}#progress-nav{position:absolute;z-index:100;margin-top:-32px;right:40px;top:50%;opacity:1;pointer-events:none}body.scroll #progress-nav{display:none}#progress-nav.on{pointer-events:auto}#progress-nav li{display:block;width:14px;height:13px;margin:9px}#progress-nav li a{display:block;position:relative;z-index:1;width:100%;height:100%;cursor:pointer;text-decoration:none}#progress-nav li a .dot{position:absolute;z-index:1;top:2px;left:2px;width:14px;height:16px;background:url(http://gtms01.alicdn.com/tps/i1/TB1jdEgFVXXXXX3XVXXBudbFXXX-14-32.png) 0 0 no-repeat}#progress-nav li a.active .dot{top:2px;left:2px;width:14px;height:16px;background:url(http://gtms01.alicdn.com/tps/i1/TB1jdEgFVXXXXX3XVXXBudbFXXX-14-32.png) 0 -16px no-repeat}#progress-nav.light li a .dot{width:14px;height:16px;background:url(http://gtms01.alicdn.com/tps/i1/TB1jdEgFVXXXXX3XVXXBudbFXXX-14-32.png) 0 0 no-repeat}#progress-nav.light li a.active .dot{width:14px;height:16px;background:url(http://gtms01.alicdn.com/tps/i1/TB1jdEgFVXXXXX3XVXXBudbFXXX-14-32.png) 0 -16px no-repeat}#progress-nav li a .hover-text{position:absolute;top:-3px;right:12px;padding-right:13px;width:50px;opacity:0;*display:none;font:100 14px/22px \"microsoft yahei\";color:#333;text-align:right;-webkit-transition:opacity .3s;-moz-transition:opacity .3s;transition:opacity .3s}#progress-nav li a:hover .hover-text{opacity:1;*display:block}#progress-nav li a.ios .hover-text{top:-2px}.slide-content{display:block;position:absolute;z-index:1;top:0;left:0;width:100%;height:100%}.slide-content img.hero{position:absolute;z-index:10;top:50%;left:50%;behavior:url(style/ie7pngfix.htc)}.slide{display:block;z-index:19;top:100%;left:0;width:100%;min-width:980px;height:100%;overflow:hidden;*zoom:1;-webkit-transform:translateZ(0)}body.scroll .slide{height:900px!important;margin-top:0}#hero{top:0}#forward{top:100%}#smart{top:200%}#fluidfooter{top:300%}body.scroll #hero{top:0}body.scroll #forward{top:900px}body.scroll #smart{top:1800px}body.scroll #fluidfooter{top:2700px}.page1{background:#FFF}.page2{background:#2899FF}.page3{background:#333}#hero{position:relative}#hero a#page_down{position:absolute;left:50%;bottom:20px;width:52px;height:52px;margin-left:-17px;background:url(http://gtms02.alicdn.com/tps/i2/TB17fVmFVXXXXaTaXXXkEI0HXXX-52-52.png) no-repeat;z-index:100}#hero a#mouse_down{opacity:.8;position:absolute;right:160px;bottom:20px;width:48px;height:60px;margin-left:-17px;background:url(http://gtms01.alicdn.com/tps/i1/TB1_WInFVXXXXaAXpXXQ0LDHXXX-48-60.png) no-repeat;z-index:100}#hero a#mouse_down:hover{-webkit-opacity:1;opacity:1}#hero.min-height{min-height:480px}#forward{*margin-top:-130px}#smart{*margin-top:-135px}.ilife{margin:0 auto;width:980px;padding:62px 0 43px;border-bottom:1px solid #e2e2e2;font-size:1.333em;line-height:1.688em;text-align:center}.ilife h1{margin-bottom:2px}.ilife p{margin-bottom:0;padding:0 150px}#ilife-hero{padding-bottom:24px;border-bottom:none}#ilife-copy{padding-top:0}"
  },
  {
    "path": "works/demo/ali/file/overview.js",
    "content": "AC.define(\"overview/shared/assetLoader/AssetLoader\",[\"require\",\"defer/Deferred\"],function(a){function b(a,b){this._assetsToLoad=[].concat(a),this._type=b||\"img\"}var c=a(\"defer/Deferred\");return b.prototype={load:function(){return this._assetsLoaded=[],this._assetsCountLoaded=0,this._defer=new c,this._failure=!1,this._assetsToLoad.forEach(this._loadAsset.bind(this)),this._defer.promise()},_progress:function(a,b){this._defer.progress(this._assetsLoaded[a]=b),this._assetsCountLoaded+=1,this._assetsCountLoaded===this._assetsToLoad.length&&this._defer.resolve(this._assetsLoaded)},_error:function(a){this._failure=!0,this._defer.reject(a.target)},_loadAsset:function(a,b){var c;this._failure||(c=document.createElement(this._type),c.onload=this._progress.bind(this,b,c),c.onerror=this._error.bind(this),c.src=a)}},b}),AC.define(\"overview/shared/element/eachAncestor\",[\"require\"],function(){function a(a,b){a=AC.Element.getElementById(a);var c=a.parentNode;if(AC.Element.isElement(c))for(;c&&(\"function\"!=typeof b||b(c)!==!1);)c=c!==document.body?c.parentNode:null}return a}),AC.define(\"overview/shared/element/descendantOf\",[\"require\",\"overview/shared/element/eachAncestor\"],function(a){var b=a(\"overview/shared/element/eachAncestor\");return function(a,c){var d=!1;return b(a,function(a){return a===c?(d=!0,!1):void 0}),d}}),AC.define(\"eventEmitter/EventEmitter\",[],function(){var a=function(a){this.context=a},b=a.prototype,c=function(){return this.hasOwnProperty(\"_events\")||\"object\"==typeof this._events||(this._events={}),this._events},d=function(a,b){var c=a[0],d=a[1],e=a[2];if(\"object\"==typeof c)for(var f in c)b.call(this,f,c[f],e);\"string\"==typeof c&&(c=c.split(\" \"),c.forEach(function(a){b.call(this,a,d,e)},this))},e=function(a,b){var d,e,f;if(d=c.call(this)[a])for(e=0,f=d.length;f>e&&!b(d[e],e);e++);};return b.on=function(){var a=c.call(this);return d.call(this,arguments,function(b,c,d){a[b]=a[b]||(a[b]=[]),a[b].push({callback:c,context:d})}),this},b.once=function(){return d.call(this,arguments,function(a,b,c){var d=function(e){b.call(c||this,e),this.off(a,d)};this.on(a,d,this)}),this},b.off=function(a,b){var d=c.call(this);if(0===arguments.length)return d={},this;if(1===arguments.length&&d[a])return d[a]=[],this;var f=-1;return e.call(this,a,function(a,c){return f=c,a.callback===b?!0:void 0}),-1!==f?(d[a].splice(f,1),this):void 0},b.trigger=function(a,b){return a=a.split(\" \"),a.forEach(function(a){e.call(this,a,function(a){a.callback.call(a.context||this.context||this,b)}.bind(this))},this),this},a}),AC.define(\"overview/shared/responsive/windowResizeTimeout\",[\"require\"],function(){var a,b,c=AC.Element,d=AC.Environment,e=[],f=function(a){b&&clearTimeout(b),b=window.setTimeout(a,300)},g=function(){var a,b;for(a=0,b=e.length;b>a;a+=1)e[a]()},h=window.innerWidth;return a=c.addEventListener(window,\"resize\",function(){var a=window.innerWidth,b=!1;\"ios\"===d.Browser.os.toLowerCase()&&(a>h||h>a)&&(b=!0,d.Browser.version>=7&&(b=!1)),h=a,b===!1&&f(g)}),function(a){e.push(a)}}),AC.define(\"overview/shared/responsive/Controller\",[\"require\",\"overview/shared/assetLoader/AssetLoader\",\"overview/shared/element/descendantOf\",\"eventEmitter/EventEmitter\",\"overview/shared/responsive/windowResizeTimeout\"],function(a){var b=a(\"overview/shared/assetLoader/AssetLoader\"),c=AC.Element,d=AC.Environment,e=AC.Retina,f=AC.ViewMaster,g=a(\"overview/shared/element/descendantOf\"),h=a(\"eventEmitter/EventEmitter\"),i=Event.Listener.listenForEvent||function(){},j=a(\"overview/shared/responsive/windowResizeTimeout\"),k=[],l=function(a){var b=a.indexOf(\"#\")>-1?a.replace(/.*#/,\"\"):\"\",c=e.sharedInstance().bestSrc(a).replace(/#.*/,\"\");return b?c+\"#\"+b:c},m=function(){return{width:window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth,height:window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}},n=function(){return 90!==Math.abs(window.orientation)},o=function(a,b,d){return this.element=a||document.body,this.responsePoints=b||{},this.options=d||{},this.options.classNamePrefix=this.options.classNamePrefix||\"ac-responsive\",this.options.attribute=this.options.attribute||\"data-responsive-src\",this.options.tabletPortraitAttribute=this.options.tabletPortraitAttribute||\"data-responsive-tablet-portrait-src\",this.options.tabletLandscapeAttribute=this.options.tabletLandscapeAttribute||\"data-responsive-tablet-landscape-src\",this.options.handheldPortraitAttribute=this.options.handheldPortraitAttribute||\"data-responsive-handheld-portrait-src\",this.options.handheldLandscapeAttribute=this.options.handheldLandscapeAttribute||\"data-responsive-handheld-landscape-src\",this.delegate=this.options.delegate||{},this.items=c.selectAll(\"[\"+this.options.attribute+\"]\",this.element),k.push(this),this};return o.prototype=new h,o.prototype.addListeners=function(){this.respond(),j(this.respond.bind(this));i(f,\"ViewMasterWillShowNotification\",!1,function(a){var b,c,d,e;for(b=a.event_data.data.incomingView,c=a.event_data.data.outgoingView,d=0,e=k.length;e>d;d+=1)c&&g(c.content,k[d].element)&&k[d].respondForItem(b.content)}),i(f,\"ViewMasterDidShowNotification\",!1,function(a){var b,d,e,f;for(b=a.event_data.data.incomingView,d=a.event_data.data.outgoingView,e=0,f=k.length;f>e;e+=1)b&&g(b.content,k[e].element)&&k[e].addItem(c.select(\"img\",b.content)||b.content)})},o.prototype.respondForClassNameAndItemAndSource=function(a,e,f){var g,h,i,j,k=this;d.Feature.isDesktop()||(g=e.getAttribute(this.options.tabletPortraitAttribute),h=e.getAttribute(this.options.tabletLandscapeAttribute),handheldPortraitSource=e.getAttribute(this.options.handheldPortraitAttribute),handheldLandscapeSource=e.getAttribute(this.options.handheldLandscapeAttribute),d.Feature.isHandheld()&&n()&&handheldPortraitSource?(a=\"handheld-portrait\",f=handheldPortraitSource):d.Feature.isHandheld()&&!n()&&handheldLandscapeSource?(a=\"handheld-landscape\",f=handheldLandscapeSource):n()&&g?(a=\"tablet-portrait\",f=g):!n()&&h&&(a=\"tablet-landscape\",f=h)),f=l(f),i=new b(f),this.toggleClassName(this.element,a),e.src?(e.setAttribute(\"data-previous-src\",e.getAttribute(\"src\")),e.removeAttribute(\"src\"),e.removeAttribute(\"width\"),e.removeAttribute(\"height\")):e.href&&e.setAttribute(\"href\",f),this.trigger(\"responded\",{target:this,snap:a}),this._className=a,j=i.load(),j=j.then(function(a,b){var d,e,f=new Image;f.src=a,d=f.src.match(\"2x\")?Math.round(f.width/2):f.width,e=f.src.match(\"2x\")?Math.round(f.height/2):f.height,\"a\"===b.tagName.toLowerCase?b.href=f.src:b.style.cssText.match(\"DXImageTransform.Microsoft.AlphaImageLoader\")?(b.setAttribute(\"src\",b.getAttribute(\"data-previous-src\")),c.setStyle(b,{filter:b.style.filter.replace(/(src=['\"]*)[^'\"]*(['\"]*)/,\"$1\"+a+\"$2\"),width:d+\"px\",height:e+\"px\"})):(b.src=a,b.width=d,b.height=e),\"function\"==typeof k.delegate.didLoad&&k.delegate.didLoad(b)}.bind(this,f,e))},o.prototype.getClassName=function(){return this._className},o.prototype.toggleClassName=function(a,b){a.className=a.className.replace(/\\s*ac\\-responsive\\-[^\\s]*/g,\"\").replace(/  /g,\" \"),c.addClassName(a,(this.options.classNamePrefix+\"-\"+b).toLowerCase())},o.prototype.addItem=function(a){-1===this.items.indexOf(a)&&this.items.push(a)},o.prototype.respondForItem=function(a,b){b||(b=m());var d,e,f,g,h,i,j,k;for(d in this.responsePoints){for(e=this.responsePoints[d],h=0,i=e.length;i>h&&(f=e[h],f<=b.height);h+=1)g=f;j=e.indexOf(g),a.getAttribute(this.options.attribute)||(a=c.select(\"[\"+this.options.attribute+\"]\",a)),k=JSON.parse(a.getAttribute(this.options.attribute)),this.respondForClassNameAndItemAndSource(d+\"-\"+g+\"-to-\"+e[j+1],a,k[j])}},o.prototype.respond=function(a){var b,c;for(b=0,c=this.items.length;c>b;b+=1)this.respondForItem(this.items[b],a)},o}),AC.define(\"overview/shared/responsive/builder\",[\"require\",\"overview/shared/responsive/Controller\"],function(a){var b=AC.Element,c=a(\"overview/shared/responsive/Controller\"),d=function(a){return a.match(/:\\/\\//)?a.replace(/(\\w+:\\/\\/[^\\/]*)\\/.*/,\"$1/\"):\"\"},e=function(a){return a.indexOf(\"#\")>-1?a.replace(/.*#/,\"#\"):\"\"},f=function(a,b,c){new RegExp(a.replace(/\\w*:\\/\\/[^\\/]*/,\"\"));return c?(!c.match(/:\\/\\//)&&a.match(/:\\/\\//)&&(c=a+c),c=c.replace(/([^:]\\/)\\//,\"$1\"),c+=b):c},g=function(a,b,c){return!c.match(/:\\/\\//)&&a.match(/:\\/\\//)?(c=c.replace(/([^,;:}{\\s\\[\\]]*)([:,\\]])/g,'\"'+a+\"$1\"+b+'\"$2'),c=c.replace(/([^:]\\/)\\//g,\"$1\")):(c=c.replace(/([^,;:}{\\s\\[\\]]*)([:,\\]])/g,'\"$1'+b+'\"$2'),c=c.replace(/([^:]\\/)\\//g,\"$1\")),JSON.parse(c)},h=function(a){return a=a.replace(/([^,;:}{\\s\\[\\]]*)([:,\\]])/g,'\"$1\"$2'),JSON.parse(a)},i=function(a){var b,c,d,e;b=h(\"{\"+a+\"}\");for(c in b){for(d=0,e=b[c].length;e>d;d+=1)b[c][d]=parseInt(b[c][d],10);b[c].indexOf(0)<0&&b[c].push(0),b[c].indexOf(1/0)<0&&b[c].push(1/0),b[c].sort(function(a,b){return a-b})}return b},j=function(a,b,c,h,i,j){var k,l,m,n,o,p,q,r,s;for(k=0,l=a.length;l>k;k+=1)m=a[k],n=m.src||m.href,o=[],o[0]=n,p=d(n),q=e(n),o=o.concat(g(p,q,m.getAttribute(b))),m.setAttribute(b,JSON.stringify(o)),r=f(p,q,m.getAttribute(c)),r&&m.setAttribute(c,r),s=f(p,q,m.getAttribute(h)),s&&m.setAttribute(h,s),mobilePortraitSource=f(p,q,m.getAttribute(i)),mobilePortraitSource&&m.setAttribute(i,mobilePortraitSource),mobileLandscapeSource=f(p,q,m.getAttribute(j)),mobileLandscapeSource&&m.setAttribute(j,mobileLandscapeSource)},k=function(a,d){var e,f,g,h,k;a=a||document.body,d=d||{},d.classNamePrefix=d.classNamePrefix||\"ac-responsive\",d.attribute=d.attribute||\"data-responsive-value\",d.tabletPortraitAttribute=d.tabletPortraitAttribute||\"data-responsive-tablet-portrait-src\",d.tabletLandscapeAttribute=d.tabletLandscapeAttribute||\"data-responsive-tablet-landscape-src\",d.handheldPortraitAttribute=d.handheldPortraitAttribute||\"data-responsive-handheld-portrait-src\",d.handheldLandscapeAttribute=d.handheldLandscapeAttribute||\"data-responsive-handheld-landscape-src\",d.elementAttribute=d.elementAttribute||\"data-responsive-src\";try{e=document.createElement(\"style\"),e.id=\"ac-responsive-loading\",e.innerHTML=\".\"+d.classNamePrefix+\" *[\"+d.elementAttribute+\"] { visibility:hidden; }\",document.head.appendChild(e)}catch(l){}h=[],k=b.selectAll(\".\"+d.classNamePrefix,a);var m,n=[];for(f=0,g=k.length;g>f;f+=1){var o=k[f],p=i(o.getAttribute(d.attribute));j(b.selectAll(\"[\"+d.elementAttribute+\"]\",o),d.elementAttribute,d.tabletPortraitAttribute,d.tabletLandscapeAttribute,d.handheldPortraitAttribute,d.handheldLandscapeAttribute),m=new c(o,p,{classNamePrefix:d.classNamePrefix,attribute:d.elementAttribute,handheldPortraitAttribute:d.handheldPortraitAttribute,handheldLandscapeAttribute:d.handheldLandscapeAttribute,tabletPortraitAttribute:d.tabletPortraitAttribute,tabletLandscapeAttribute:d.tabletLandscapeAttribute,delegate:{didLoad:f===g-1?function(){e.parentNode&&e.parentNode.removeChild(e)}:null}}),n.push(m)}return n};return k}),AC.define(\"overview/shared/responsive/ControllerSet\",[\"require\"],function(){function a(a){this._controllers=a}return a.prototype={getControllerByElement:function(a){var b,c;for(b=0,c=this._controllers.length;c>b;b+=1)if(this._controllers[b].element===a)return this._controllers[b]}},a}),AC.define(\"overview/shared/scene/observer/nav/Focus\",[\"require\"],function(){function a(a,b){this.indicies=[];for(var c=0,d=b.length;d>c;c++)this.indicies[c]=c,AC.Element.addEventListener(b[c].element,\"focus\",this.onFocused.bind(this,c,a),!0)}return a.prototype={onFocused:function(a,b,c){var d=this.indicies[a],e=document.documentElement.clientHeight||window.innerHeight||document.documentElement.offsetHeight,f=AC.Event.target(c),g=f===AC.Element.getElementById(\"sp-searchtext\")?window.scrollX:0,h=b.show(d);h?h.then(function(){AC.Element.getBoundingBox(f).top>e?b.show(++d):AC.Element.getBoundingBox(f).bottom<0&&b.show(--d)}):AC.Element.getBoundingBox(f).top>e?b.show(++d):AC.Element.getBoundingBox(f).bottom<0&&b.show(--d),this.indicies[a]=d,document.body.scrollTop=0,window.scrollTo(g,0),AC.Element.setStyle(document.body,{overflow:\"visible\"}),window.requestAnimationFrame(function(){document.body.scrollTop=0,window.scrollTo(g,0),AC.Element.setStyle(document.body,{overflow:\"\"})})}},a}),AC.define(\"animationSequencer/Clock\",[],function(){function a(){this._currentTimeMS=0,this._playbackRate=1,this._paused=!0,this._resetStartTime()}var b=a.prototype;return b._updateCurrentTime=function(){var a,b=Date.now();a=this._paused?0:b-this._startTime,this._currentTimeMS+=a*this._playbackRate,this._startTime=b},b._resetStartTime=function(){this._startTime=Date.now()},b.play=function(){return this._resetStartTime(),this._paused=!1,this},b.pause=function(){return this._updateCurrentTime(),this._paused=!0,this},b.isPaused=function(){return this._paused},b.getCurrentTime=function(){return this._updateCurrentTime(),this._currentTimeMS/1e3},b.setCurrentTime=function(a){isNaN(a)||(this._resetStartTime(),this._currentTimeMS=1e3*a)},b.getPlaybackRate=function(){return this._playbackRate},b.setPlaybackRate=function(a){isNaN(a)||(this._playbackRate=a)},a}),AC.define(\"animationSequencer/Player/BasicPlayer\",[\"require\",\"eventEmitter/EventEmitter\",\"animationSequencer/Clock\"],function(a){function b(a,b){this.options=b||{},this._clip=a,this._clock=this.options.clock||new d,this._paused=!0,window.setTimeout(function(){this.trigger(\"canplay\")}.bind(this),0)}var c=a(\"eventEmitter/EventEmitter\"),d=a(\"animationSequencer/Clock\"),e=b.prototype=new c;return e.addEventListener=e.on,e.removeEventListener=e.off,e.play=function(){this._paused=!1,this._clock.play(),this._update(),this.trigger(\"play\")},e.pause=function(){this.setPaused(!0),this._clock.pause(),this.trigger(\"pause\")},e._updateCurrentTime=function(a){this._clock.setCurrentTime(a),this._lastTime=this._clip.setCurrentTime(a)},e._update=function(){var a=this._clock.getCurrentTime(),b=this.getDuration(),c=this._clock.getPlaybackRate(),d=c>0,e=d&&a>=b,f=!d&&0>=a;(e||f)&&(a=e?b:0,this.pause(),this._updateCurrentTime(a)),this.trigger(\"timeupdate\",{previous:this._lastTime,time:a}),e&&this.trigger(\"ended\"),f&&this.trigger(\"returned\"),this.isPaused()||(this._updateCurrentTime(a),window.requestAnimationFrame(this._update.bind(this)))},e._isValidTime=function(a){return a>=0&&a<=this.getDuration()},e.isPaused=function(){return this._paused},e.setPaused=function(a){this._paused=!!a},e.getCurrentTime=function(){return this._clock.getCurrentTime()},e.setCurrentTime=function(a){this._isValidTime(a)&&(this.trigger(\"seeking\",{time:a}),this._updateCurrentTime(a),this.trigger(\"seeked\",{time:a}))},e.getPlaybackRate=function(){return this._clock.getPlaybackRate()},e.setPlaybackRate=function(a){this._clock.setPlaybackRate(a),this.trigger(\"ratechange\",{rate:a})},e.getDuration=function(){return this._clip.getDuration()},b}),AC.define(\"animationSequencer/clip/TimedClip\",[],function(){function a(a,b){b=b||{},this._clip=a,this._startDelay=b.startDelay||0,this._loop=b.loop||!1,this._fill=b.fill||\"both\"}a.FILL_MODES=[\"none\",\"forwards\",\"backwards\",\"both\"];var b=a.prototype;return b._show=function(){this._isHidden&&(this._isHidden=!1,this._clip.show())},b.setEasingDirection=function(a){return this._clip.setEasingDirection(a)},b._applyFill=function(a){if(\"none\"!==this.getFill()){var b=this.getDuration(),c=a>b,d=this.getFill(),e=c&&\"forwards\"===d,f=!c&&\"backwards\"===d,g=\"both\"===d||e||f;g&&this._clip.setCurrentTime(c?b:0)}},b._hide=function(){this._isHidden||(this._isHidden=!0,this._clip.hide())},b.isPaused=function(){return this._paused},b.getCurrentTime=function(){return this._currentTime},b.setCurrentTime=function(a,b){0>a||a>this.getDuration()?(this._clip.inEffect=!1,this._applyFill(a)):(this._clip.inEffect=!0,this._clip.setCurrentTime(a,b))},b.getDuration=function(){return this._clip.getDuration()},b.getStartDelay=function(){return this._startDelay},b.setStartDelay=function(){isNaN(delay)||(this._startDelay=delay)},b.getLoop=function(){return this._loop},b.setLoop=function(a){this._loop=!!a},b.getFill=function(){return this._fill},b.setFill=function(b){var c=a.FILL_MODES;-1!==c.indexOf(b.toLowerCase())&&(this._fill=b)},a}),AC.define(\"animationSequencer/clip/CompositeClip\",[\"require\",\"animationSequencer/clip/TimedClip\"],function(a){function b(a){a&&a.length&&(this._clips=a.map(this._ensureTimedClip),this._duration=this._calcDuration())}var c=a(\"animationSequencer/clip/TimedClip\"),d=b.prototype;return d.addClip=function(a){a=this._ensureTimedClip(a),this._clips.push(a),this._duration=this._calcDuration()},d._calcDuration=function(a){a=a||this._clips;var b=a.reduce(function(a,b){var c=b.getStartDelay()+b.getDuration();return c>a?c:a},0);return b},d.setEasingDirection=function(a){this._clips.forEach(function(b){b.setEasingDirection(a)})},d._ensureTimedClip=function(a){return a instanceof c||(a=new c(a)),a},d._getLocalTime=function(a,b){return b-a.getStartDelay()},d._getEligibleClips=function(){return this._clips},d.getDuration=function(){return this._duration},d.getCurrentTime=function(){return this._currentTime},d.setCurrentTime=function(a,b){var c=this._getEligibleClips();c&&c.length&&c.forEach(function(c){var d=this._getLocalTime(c,a);c.setCurrentTime(d,b)}.bind(this))},d.getPlaybackRate=function(){return this._playbackRate},d.setPlaybackRate=function(a){isNaN(a)||(this._playbackRate=a)},b}),AC.define(\"overview/shared/story/Story\",[\"require\",\"animationSequencer/Player/BasicPlayer\",\"animationSequencer/clip/CompositeClip\",\"defer/Deferred\"],function(a){function b(a,b){c.call(this,new d),this._scenes,this._currentSceneIndex=0,this.setScenes(a),this._locked=!1,this._stageTracker=b}var c=a(\"animationSequencer/Player/BasicPlayer\"),d=a(\"animationSequencer/clip/CompositeClip\"),e=a(\"defer/Deferred\");return b.prototype=new c,b.prototype.isLocked=function(){return this._locked},b.prototype.setScenes=function(a){var b=[];this._scenes=a,this._scenes.forEach(function(a){b.push(a.getClip())}.bind(this)),this.__setClip(new d(b))},b.prototype.__getLastSceneIndex=function(){for(var a,b,c=this._scenes.length-1;c>=0;c-=1)if(b=this._scenes[c],b.getDuration()<=this.getDuration()){a=c;break}return a},b.prototype.__setClip=function(a){var b=this.getCurrentTime(),c=this.getDuration();this._clip=a,b>a.getDuration()?(this.__afterShow(this.__getLastSceneIndex(),this._currentSlideIndex),this.setCurrentTime(this._clip.getDuration())):b===c?(this.setCurrentTime(this.getDuration()),this._currentSceneIndex=this._scenes.length-1):this.setCurrentTime(b)},b.prototype.showFirst=function(a){return this.show(0,a)},b.prototype.showLast=function(a){var b=this._scenes.length-1;return this.show(b,a)},b.prototype.getSceneById=function(a){var b;return this._scenes.forEach(function(c){c.get(\"id\")===a&&(b=c)}),b},b.prototype.getSceneIndex=function(a){return this._scenes.indexOf(a)},b.prototype.showPrevious=function(a){var b=this._currentSceneIndex-1,c=this._scenes[b];return c?this.show(b,a):void 0},b.prototype.showNext=function(a){var b=this._currentSceneIndex+1,c=this._scenes[b];return c?this.show(b,a):void 0},b.prototype.__triggerWillShow=function(a,b,c){var d;return this._scenes.forEach(function(e,f){var g=e.getDuration();(1===a&&g>b&&c>=g||-1===a&&b>g&&g>=c)&&(d={target:this,incomingIndex:f,outgoingIndex:0>a?f+1:f-1})}.bind(this)),d&&this.trigger(\"willShow\",d),d},b.prototype.jumpTo=function(a){function b(b){f===!0&&(AC.Element.removeVendorPrefixEventListener(document.body,\"transitionEnd\",c),f=!1,d.resolve()),b.target===document.body&&\"opacity\"===b.propertyName&&(f=!0,this.setCurrentTime(a),AC.Element.removeClassName(document.body,\"player-jump\"))}var c,d=new e,f=!1;return c=b.bind(this),AC.Element.addVendorPrefixEventListener(document.body,\"transitionEnd\",c),AC.Element.addClassName(document.body,\"player-jump\"),d.promise()},b.prototype.show=function(a,b){if(!(a===this._currentSceneIndex||a>this.__getLastSceneIndex())){var c,d=a-this._currentSceneIndex,e=this._scenes[a],f=d>0?this._currentSceneIndex+d:a+Math.abs(d),g=this._scenes[f],h=0===a?0:e.getDuration(),i=AC.Element.select(\"#progress-nav\");if(!(h>this.getDuration()||this._locked===!0))return this._locked=!0,this.trigger(\"willShow\",{target:this,incomingIndex:a,outgoingIndex:this._currentSceneIndex}),Math.abs(d)<=1?(g.setPlaybackRate(0>d?-1:1),c=g.play().then(function(a){this.setCurrentTime(a)}.bind(this))):c=this.jumpTo(h).then(function(){0===h&&AC.Element.setStyle(i,{opacity:1})}.bind(this)),b&&this._stageTracker.trackInteraction(b,a),c.then(this.__afterShow.bind(this,a,this._currentSceneIndex))}},b.prototype.__afterShow=function(a,b){this._locked=!1,this._currentSceneIndex=a,this.trigger(\"didShow\",{target:this,incomingIndex:a,outgoingIndex:b})},b.prototype.playToScene=function(a){var b=this._scenes.indexOf(a),c=a.getDuration();return this._locked=!0,this.trigger(\"willShow\",{target:this,incomingIndex:b,outgoingIndex:this._currentSceneIndex}),0===b&&(c=0),this._stageTracker.trackInteraction(\"touch\",b),this.playTo(c).then(this.__afterShow.bind(this,b,this._currentSceneIndex))},b.prototype.playToNext=function(){var a=this._currentSceneIndex+1,b=this._scenes[a];return b?this.playToScene(b):void 0},b.prototype.playToPrevious=function(){var a=this._currentSceneIndex-1,b=this._scenes[a],c=new e;return b?this.playToScene(b):(c.resolve(),c.promise())},b.prototype.playTo=function(a){var b=a,c=new e,d=(this.getCurrentTime(),a<this.getCurrentTime()?-1:1);a>this.getDuration()?b=this.getDuration():0>a&&(b=0);var f=function(a){(0>d&&(a.time<=b||0===a.time)||d>0&&a.time>=b)&&(this.pause(),this.off(\"timeupdate\",f),this.setCurrentTime(b),c.resolve())}.bind(this);return this.on(\"timeupdate\",f),(-1===d&&this.getPlaybackRate()>0||1===d&&this.getPlaybackRate()<0)&&this.setPlaybackRate(-1*this.getPlaybackRate()),this.play(),c.promise()},b}),AC.define(\"overview/shared/element/selectAncestor\",[\"require\",\"overview/shared/element/eachAncestor\"],function(a){var b=a(\"overview/shared/element/eachAncestor\");return function(a,c){a=AC.Element.getElementById(a);var d=null;return null!==a&&void 0===c?a.parentNode:(b(a,function(a){return AC.Element.matchesSelector(a,c)?(d=a,!1):void 0}),d)}}),AC.define(\"overview/shared/scene/controller/trigger/Trigger\",[\"require\",\"overview/shared/element/selectAncestor\"],function(a){function b(a,b){this._player=a,this._scenes=b}var c=a(\"overview/shared/element/selectAncestor\");return b.prototype={onClick:function(a){var b,d,e,f=\"bubble\";AC.Element.hasClassName(AC.Event.target(a),\"progress-nav-trigger\")?b=AC.Event.target(a).getAttribute(\"data-scene\"):(e=c(AC.Event.target(a),\".progress-nav-trigger\"),e&&(b=e.getAttribute(\"data-scene\"))),b&&(d=this._player.getSceneById(b),this._player.show(this._player.getSceneIndex(d),f),AC.Event.stop(a))}},b}),AC.define(\"overview/shared/scene/controller/trigger/builder\",[\"require\",\"overview/shared/scene/controller/trigger/Trigger\"],function(a){var b=a(\"overview/shared/scene/controller/trigger/Trigger\");return function(a,c,d){var e=new b(a,d),f=AC.Element.select(\"#scroll-to-continue\");return AC.Element.addEventListener(c,\"click\",e.onClick.bind(e)),f&&AC.Element.addEventListener(f,\"click\",e.onClick.bind(e)),e}}),AC.define(\"overview/shared/scene/controller/mouseWheel/MouseWheel\",[\"require\"],function(){function a(a,b,c){this._player=a,this._locked=!1,this._scrollLockDuration=b,this._horizontalThreshold=c||0}return a.prototype={onMouseWheel:function(a){var b=\"scroll\",c=a.wheelDeltaY||-1*a.deltaY;(c>this._horizontalThreshold||c<-this._horizontalThreshold)&&AC.Event.stop(a),this._locked===!0||c<=this._horizontalThreshold&&c>=-this._horizontalThreshold||(this._locked=!0,c>this._horizontalThreshold?this._player.showPrevious(b):c<-this._horizontalThreshold&&this._player.showNext(b),window.setTimeout(function(){this._locked=!1}.bind(this),this._scrollLockDuration))}},a}),AC.define(\"overview/shared/scene/controller/mouseWheel/builder\",[\"require\",\"overview/shared/scene/controller/mouseWheel/MouseWheel\"],function(a){var b=a(\"overview/shared/scene/controller/mouseWheel/MouseWheel\"),c=\"onwheel\"in document.createElement(\"div\")?\"wheel\":void 0!==document.onmousewheel?\"mousewheel\":\"DOMMouseScroll\";return function(a){var d=new b(a,1400);return AC.Element.addEventListener(document,c,d.onMouseWheel.bind(d)),d}}),AC.define(\"overview/shared/scene/controller/keyboard/Keyboard\",[\"require\"],function(){function a(a){this._player=a}return a.prototype={onKeyDown:function(a){var b=\"keyboard\";\"input\"!==document.activeElement.tagName.toLowerCase()&&(35===a.keyCode||a.metaKey===!0&&40===a.keyCode?(AC.Event.stop(a),this._player.showLast(b)):36===a.keyCode||a.metaKey===!0&&38===a.keyCode?(AC.Event.stop(a),this._player.showFirst(b)):40===a.keyCode||34===a.keyCode||32===a.keyCode&&!a.shiftKey?(AC.Event.stop(a),this._player.showNext(b)):(38===a.keyCode||33===a.keyCode||32===a.keyCode&&a.shiftKey)&&(AC.Event.stop(a),this._player.showPrevious(b)))}},a}),AC.define(\"overview/shared/scene/controller/keyboard/builder\",[\"require\",\"overview/shared/scene/controller/keyboard/Keyboard\"],function(a){var b=a(\"overview/shared/scene/controller/keyboard/Keyboard\");return function(a){var c=new b(a);return AC.Element.addEventListener(document,\"keydown\",c.onKeyDown.bind(c)),c}}),AC.define(\"overview/shared/scene/controller/touch/Touch\",[\"require\"],function(){function a(a){this._player=a,this._startY=null,this._windowHeight=document.documentElement.clientHeight||window.innerHeight||document.documentElement.offsetHeight,this._playerStartingTime=null,this._currentTime=0}return a.prototype={onTouchStart:function(a){this._player.isLocked()||null!==this._startY||(this._startY=a.touches[0].screenY,this._playerStartingTime=this._player.getCurrentTime(),this._startingDirection=null,this._reverseEase=!1)},onTouchMove:function(a){{var b,c,d;this._player._clip,a.direction.y}null!==this._startY&&null!==this._playerStartingTime&&(b=this._startY-a.touches[0].screenY,c=b/this._windowHeight,this._currentTime=d=this._playerStartingTime+c,this._player._clip.setEasingDirection(d<this._playerStartingTime?-1:0),this._player.setCurrentTime(d))},onTouchEnd:function(a){if(null!==this._startY&&null!==this._playerStartingTime){var b=a.difference.current.y/this._windowHeight,c=this._player.getPlaybackRate();this._player.setCurrentTime(this._currentTime),b>.4||a.speed>=7?(this._player.setPlaybackRate(1.8),\"down\"===a.direction.y?this._player.playToNext().then(this._player.setPlaybackRate.bind(this._player,c)):\"up\"===a.direction.y&&this._player.playToPrevious().then(this._player.setPlaybackRate.bind(this._player,c))):(this._player._locked=!0,this._player.playTo(this._playerStartingTime).then(function(){this._player._locked=!1}.bind(this))),this._startY=null,this._playerStartingTime=null,this._startingDirection=null}}},a}),AC.define(\"overview/shared/scene/controller/touch/builder\",[\"require\",\"overview/shared/scene/controller/touch/Touch\"],function(a){function b(a){var b=new c(a);AC.Element.addEventListener(document,\"touchmove\",d),document.body.trackTouches(b.onTouchStart.bind(b),b.onTouchMove.bind(b),b.onTouchEnd.bind(b),{stopEvent:!1})}var c=a(\"overview/shared/scene/controller/touch/Touch\"),d=function(a){a.touches&&a.touches.length<=1&&\"a\"!==a.target.tagName.toLowerCase()&&AC.Event.stop(a)};return function(a){var c=document.getElementsByTagName(\"head\")[0],d=document.createElement(\"script\");d.type=\"text/javascript\",d.setAttribute(\"src\",\"http://images.apple.com/global/scripts/pagingview.js\"),c.appendChild(d),document.observe(\"ac:trackTouches:load\",b.bind(void 0,a))}}),AC.define(\"overview/shared/scene/observer/nav/Nav\",[\"require\"],function(){function a(a,b,c){this._player=a,this._element=b,this._navButtons=AC.Element.selectAll(\"a\",this._element),this._footerIndex=c,this._productNav=AC.Element.select(\"#product-nav-slide\")}return a.prototype={toggleNav:function(a){var b=AC.Environment.Feature.isDesktop()?-1:0;b<a.incomingIndex&&a.incomingIndex<this._footerIndex?AC.Element.addClassName(this._element,\"on\"):AC.Element.removeClassName(this._element,\"on\")},onWillShow:function(a){0!==a.incomingIndex?AC.Element.addClassName(this._productNav,\"active\"):AC.Element.removeClassName(this._productNav,\"active\"),this._navButtons[a.incomingIndex]&&AC.Element.addClassName(this._navButtons[a.incomingIndex],\"active\"),AC.Element.removeClassName(this._navButtons[a.outgoingIndex],\"active\"),this.toggleNav(a)}},a}),AC.define(\"overview/shared/scene/observer/nav/builder\",[\"require\",\"overview/shared/scene/observer/nav/Nav\"],function(a){var b=a(\"overview/shared/scene/observer/nav/Nav\");return function(a,c,d){var e=new b(a,c,d);return e.onWillShow({incomingIndex:0}),a.on(\"willShow\",e.onWillShow.bind(e)),e}}),AC.define(\"overview/shared/scene/StageTracker\",[\"require\"],function(){var a=AC.Tracking,b=Class.create({__defaultOptions:{decimals:1},initialize:function(a){var b;this.scenes=[],this.trackClickQueue=[],\"object\"!=typeof a&&(a={}),\"object\"!=typeof this.__defaultOptions&&(this.__defaultOptions={}),this._options=AC.Object.extend(AC.Object.clone(this.__defaultOptions),a),this.__dateSceneIn=(new Date).getTime(),b=AC.Element.selectAll(\".slide\");for(var c=0;c<b.length;c++)this.scenes.push({element:b[c],shouldTrack:!0});this.currentSceneIndex=0},findSceneId:function(a){return this.scenes[a].element.id},timeInScene:function(){var a=(new Date).getTime(),b=Math.pow(10,this._options.decimals),c=Math.round((a-this.__dateSceneIn)/(1e3/b))/b;return this.__dateSceneIn=a,c},trackInteraction:function(a,b){if(b===this.currentSceneIndex)return 0;if(b>this.scenes.length-1){if(!(this.currentSceneIndex<this.scenes.length-1))return 0;b=this.scenes.length-1}var c=this.findSceneId(this.currentSceneIndex),d={prop1:a,prop34:AC.Tracking.pageName()+\" - home - \"+c+\" - \"+s.prop5,prop35:this.timeInScene()};this.scenes[this.currentSceneIndex].shouldTrack&&(this.trackClickQueue.push(d),this.scenes[this.currentSceneIndex].shouldTrack=!1),b&&(this.currentSceneIndex=b)},fireTrackClickQueue:function(){for(;this.trackClickQueue.length>0;){var b=this.trackClickQueue.shift();a.trackClick(b,this,\"o\",b.prop34)}}});return b}),AC.define(\"overview/shared/story/builder\",[\"require\",\"overview/shared/story/Story\",\"overview/shared/scene/controller/trigger/builder\",\"overview/shared/scene/controller/mouseWheel/builder\",\"overview/shared/scene/controller/keyboard/builder\",\"overview/shared/scene/controller/touch/builder\",\"overview/shared/scene/observer/nav/builder\",\"overview/shared/scene/StageTracker\"],function(a){var b=a(\"overview/shared/story/Story\"),c=a(\"overview/shared/scene/controller/trigger/builder\"),d=a(\"overview/shared/scene/controller/mouseWheel/builder\"),e=a(\"overview/shared/scene/controller/keyboard/builder\"),f=a(\"overview/shared/scene/controller/touch/builder\"),g=a(\"overview/shared/scene/observer/nav/builder\"),h=a(\"overview/shared/scene/StageTracker\");return function(a,i,j){var k=new h,l=window.story=new b(a,k);j=j||4;var m;return l.on(\"willShow\",function(a){m=l.getPlaybackRate(),a.incomingIndex>j&&l.setPlaybackRate(2*m)}),l.on(\"didShow\",function(){l.getPlaybackRate()!==m&&l.setPlaybackRate(m),k.fireTrackClickQueue()}),d(l),e(l),c(l,i,a),\"ontouchstart\"in window&&f(l),g(l,i,j),AC.Element.setStyle(AC.Element.select(\"#fluidfooter\"),{height:AC.Element.select(\"#fluidfooter\").offsetHeight+\"px\"}),l}}),AC.define(\"animationSequencer/player/BasicPlayer\",[\"require\",\"eventEmitter/EventEmitter\",\"animationSequencer/Clock\"],function(a){function b(a,b){this.options=b||{},this._clip=a,this._clock=this.options.clock||new d,this._paused=!0,window.setTimeout(function(){this.trigger(\"canplay\")}.bind(this),0)}var c=a(\"eventEmitter/EventEmitter\"),d=a(\"animationSequencer/Clock\"),e=b.prototype=new c;return e.addEventListener=e.on,e.removeEventListener=e.off,e.play=function(){this._paused=!1,this._clock.play(),this._update(),this.trigger(\"play\")},e.pause=function(){this.setPaused(!0),this._clock.pause(),this.trigger(\"pause\")},e._updateCurrentTime=function(a){this._clock.setCurrentTime(a),this._lastTime=this._clip.setCurrentTime(a)},e._update=function(){var a=this._clock.getCurrentTime(),b=this.getDuration(),c=this._clock.getPlaybackRate(),d=c>0,e=d&&a>=b,f=!d&&0>=a;(e||f)&&(a=e?b:0,this.pause(),this._updateCurrentTime(a)),this.trigger(\"timeupdate\",{previous:this._lastTime,time:a}),e&&this.trigger(\"ended\"),f&&this.trigger(\"returned\"),this.isPaused()||(this._updateCurrentTime(a),window.requestAnimationFrame(this._update.bind(this)))\n},e._isValidTime=function(a){return a>=0&&a<=this.getDuration()},e.isPaused=function(){return this._paused},e.setPaused=function(a){this._paused=!!a},e.getCurrentTime=function(){return this._clock.getCurrentTime()},e.setCurrentTime=function(a){this._isValidTime(a)&&(this.trigger(\"seeking\",{time:a}),this._updateCurrentTime(a),this.trigger(\"seeked\",{time:a}))},e.getPlaybackRate=function(){return this._clock.getPlaybackRate()},e.setPlaybackRate=function(a){this._clock.setPlaybackRate(a),this.trigger(\"ratechange\",{rate:a})},e.getDuration=function(){return this._clip.getDuration()},b}),AC.define(\"overview/shared/scene/Scene\",[\"require\",\"animationSequencer/player/BasicPlayer\",\"animationSequencer/clip/TimedClip\",\"defer/Deferred\"],function(a){function b(a,b){this.options=b||{},this._clip=a,this._cssPlayer=b.cssPlayer,this._jsPlayer=b.jsPlayer}a(\"animationSequencer/player/BasicPlayer\"),a(\"animationSequencer/clip/TimedClip\"),a(\"defer/Deferred\");return b.prototype={__shouldUseJSPlayer:function(){return\"ontouchstart\"in window||!AC.Environment.Feature.cssPropertyAvailable(\"transform\")},__getPlayer:function(){return this.__shouldUseJSPlayer()?this._jsPlayer:this._cssPlayer},get:function(a){return this.options[a]},getDuration:function(){return this._clip.getDuration()},play:function(){return this.__getPlayer().play().then(function(){var a;return a=this.getPlaybackRate()>0?this.getDuration():this.get(\"startTime\"),\"\"+a}.bind(this))},getPlaybackRate:function(){return this.__getPlayer().getPlaybackRate()},setPlaybackRate:function(a){this.__getPlayer().setPlaybackRate(a)},getClip:function(){return this._clip}},b}),AC.define(\"animationSequencer/vendor/KeySpline\",[],function(){function a(a,b,c,d){function e(a,b){return 1-3*b+3*a}function f(a,b){return 3*b-6*a}function g(a){return 3*a}function h(a,b,c){return((e(b,c)*a+f(b,c))*a+g(b))*a}function i(a,b,c){return 3*e(b,c)*a*a+2*f(b,c)*a+g(b)}function j(b){for(var d=b,e=0;4>e;++e){var f=i(d,a,c);if(0===f)return d;var g=h(d,a,c)-b;d-=g/f}return d}this.get=function(e){return a===b&&c===d?e:h(j(e),b,d)}}return a}),AC.define(\"animationSequencer/vendor/EasingFunctions\",[],function(){var a={linear:function(a,b,c,d){return c*a/d+b},easeInQuad:function(a,b,c,d){return c*(a/=d)*a+b},easeOutQuad:function(a,b,c,d){return-c*(a/=d)*(a-2)+b},easeInOutQuad:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b},easeInCubic:function(a,b,c,d){return c*(a/=d)*a*a+b},easeOutCubic:function(a,b,c,d){return c*((a=a/d-1)*a*a+1)+b},easeInOutCubic:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a+b:c/2*((a-=2)*a*a+2)+b},easeInQuart:function(a,b,c,d){return c*(a/=d)*a*a*a+b},easeOutQuart:function(a,b,c,d){return-c*((a=a/d-1)*a*a*a-1)+b},easeInOutQuart:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a+b:-c/2*((a-=2)*a*a*a-2)+b},easeInQuint:function(a,b,c,d){return c*(a/=d)*a*a*a*a+b},easeOutQuint:function(a,b,c,d){return c*((a=a/d-1)*a*a*a*a+1)+b},easeInOutQuint:function(a,b,c,d){return(a/=d/2)<1?c/2*a*a*a*a*a+b:c/2*((a-=2)*a*a*a*a+2)+b},easeInSine:function(a,b,c,d){return-c*Math.cos(a/d*(Math.PI/2))+c+b},easeOutSine:function(a,b,c,d){return c*Math.sin(a/d*(Math.PI/2))+b},easeInOutSine:function(a,b,c,d){return-c/2*(Math.cos(Math.PI*a/d)-1)+b},easeInExpo:function(a,b,c,d){return 0===a?b:c*Math.pow(2,10*(a/d-1))+b},easeOutExpo:function(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b},easeInOutExpo:function(a,b,c,d){return 0===a?b:a===d?b+c:(a/=d/2)<1?c/2*Math.pow(2,10*(a-1))+b:c/2*(-Math.pow(2,-10*--a)+2)+b},easeInCirc:function(a,b,c,d){return-c*(Math.sqrt(1-(a/=d)*a)-1)+b},easeOutCirc:function(a,b,c,d){return c*Math.sqrt(1-(a=a/d-1)*a)+b},easeInOutCirc:function(a,b,c,d){return(a/=d/2)<1?-c/2*(Math.sqrt(1-a*a)-1)+b:c/2*(Math.sqrt(1-(a-=2)*a)+1)+b},easeInElastic:function(a,b,c,d){var e=1.70158,f=0,g=c;return 0===a?b:1===(a/=d)?b+c:(f||(f=.3*d),g<Math.abs(c)?(g=c,e=f/4):e=f/(2*Math.PI)*Math.asin(c/g),-(g*Math.pow(2,10*(a-=1))*Math.sin(2*(a*d-e)*Math.PI/f))+b)},easeOutElastic:function(a,b,c,d){var e=1.70158,f=0,g=c;return 0===a?b:1===(a/=d)?b+c:(f||(f=.3*d),g<Math.abs(c)?(g=c,e=f/4):e=f/(2*Math.PI)*Math.asin(c/g),g*Math.pow(2,-10*a)*Math.sin(2*(a*d-e)*Math.PI/f)+c+b)},easeInOutElastic:function(a,b,c,d){var e=1.70158,f=0,g=c;return 0===a?b:2===(a/=d/2)?b+c:(f||(f=.3*d*1.5),g<Math.abs(c)?(g=c,e=f/4):e=f/(2*Math.PI)*Math.asin(c/g),1>a?-.5*g*Math.pow(2,10*(a-=1))*Math.sin(2*(a*d-e)*Math.PI/f)+b:g*Math.pow(2,-10*(a-=1))*Math.sin(2*(a*d-e)*Math.PI/f)*.5+c+b)},easeInBack:function(a,b,c,d,e){return void 0===e&&(e=1.70158),c*(a/=d)*a*((e+1)*a-e)+b},easeOutBack:function(a,b,c,d,e){return void 0===e&&(e=1.70158),c*((a=a/d-1)*a*((e+1)*a+e)+1)+b},easeInOutBack:function(a,b,c,d,e){return void 0===e&&(e=1.70158),(a/=d/2)<1?c/2*a*a*(((e*=1.525)+1)*a-e)+b:c/2*((a-=2)*a*(((e*=1.525)+1)*a+e)+2)+b},easeInBounce:function(b,c,d,e){return d-a.easeOutBounce(e-b,0,d,e)+c},easeOutBounce:function(a,b,c,d){return(a/=d)<1/2.75?7.5625*c*a*a+b:2/2.75>a?c*(7.5625*(a-=1.5/2.75)*a+.75)+b:2.5/2.75>a?c*(7.5625*(a-=2.25/2.75)*a+.9375)+b:c*(7.5625*(a-=2.625/2.75)*a+.984375)+b},easeInOutBounce:function(b,c,d,e){return e/2>b?.5*a.easeInBounce(2*b,0,d,e)+c:.5*a.easeOutBounce(2*b-e,0,d,e)+.5*d+c}};return a}),AC.define(\"animationSequencer/clip/BaseClip\",[\"require\",\"animationSequencer/vendor/KeySpline\",\"animationSequencer/vendor/EasingFunctions\",\"eventEmitter/EventEmitter\"],function(a){function b(a,c){this.options=c||{},this._duration=a,this._currentTime=0,this._easingFunction=this._createEasing(this.options.easing||b.DEFAULT_EASING)}var c=a(\"animationSequencer/vendor/KeySpline\"),d=a(\"animationSequencer/vendor/EasingFunctions\"),e=\"Easing option must be one of: String, Array[Number:4], or Function. Given: \",f=\"KeySpline easing expected an array of exactly four (4) numbers, given: \",g=a(\"eventEmitter/EventEmitter\");b.DEFAULT_EASING=\"linear\";var h=b.prototype=new g;return h._createEasing=function(a){var b;if(\"string\"==typeof a)b=this._createPredefinedEasing(a);else if(Array.isArray(a))b=this._createBezierEasing(a);else{if(\"function\"!=typeof a)throw new TypeError(e+a);b=a}return b},h._createBezierEasing=function(a){var b,d=a,e=a.every(function(a){return\"number\"==typeof a});if(4!==a.length||!e)throw new TypeError(f+a);return b=new c(d[0],d[1],d[2],d[3]),function(a,c,d,e){return b.get(a/e)*d}},h._createPredefinedEasing=function(a){var b=d[a],c=\"\";if(!b)throw c+='Easing function \"'+b,c+='\" not recognized among the following: ',c+=Object.keys(d).join(\", \"),new Error(c);return b},h._getInterpolatedValue=function(a,b,c,d){return this._easingFunction(a,b,c,d)},h.getDuration=function(){return this._duration},h.getCurrentTime=function(){return this._currentTime},h.setCurrentTime=function(a){this._currentTime=a},b}),AC.define(\"animationSequencer/clip/TweenClip\",[\"require\",\"animationSequencer/clip/BaseClip\"],function(a){function b(a,b,d){c.call(this,a,d),this.props=b||[],this._initializePropEasing(),this._lastComputedTime=0,this._easingDirection=1}var c=a(\"animationSequencer/clip/BaseClip\");b.create=function(a){return new b(a.selector,a.duration,a.props)},b.validate=function(a){return\"string\"==typeof a.selector&&Array.isArray(a.props)},b.DEFAULT_EASING=\"linear\";var d=b.prototype=new c;return d._initializePropEasing=function(){this.props.forEach(function(a){a.easing=this._createEasing(a.easing||c.DEFAULT_EASING)}.bind(this))},d.setEasingDirection=function(a){this._easingDirection=a},d.tween=function(a){shouldReverseEase=-1===this._easingDirection,this.options.reverseEase!==!0&&(shouldReverseEase=!1);var b=this.getDuration(),c={};this.props.length<1||(this.props.forEach(function(d){var e,f=(d.units,d.axis,d.property);e=shouldReverseEase?d.easing(this.getDuration()-a,d.to,-(d.to-d.from),b):d.easing(a,d.from,d.to-d.from,b),c[f]=e}.bind(this)),this.trigger(\"tween_update\",c))},d.getCurrentTime=function(){return this._currentTime},d.setCurrentTime=function(a){0>a&&(a=0),a>this.getDuration()&&(a=this.getDuration()),0>a||a>this.getDuration()||(this._currentTime=a,this.tween(this._currentTime))},b}),AC.define(\"overview/scene/hero/tween/builder\",[\"require\",\"animationSequencer/clip/TweenClip\"],function(a){var b=a(\"animationSequencer/clip/TweenClip\");return function(){return[new b(0,[])]}}),AC.define(\"overview/shared/scene/player/TweenJS\",[\"require\",\"animationSequencer/player/BasicPlayer\",\"defer/Deferred\"],function(a){function b(a,b){c.apply(this,[a]),this._startTime=b}var c=a(\"animationSequencer/player/BasicPlayer\"),d=a(\"defer/Deferred\");return b.prototype=new c,b.prototype.__onTimeUpdate=function(a,b,c){var d=!1,e=this.getDuration(),f=this.getPlaybackRate()>0;(f&&c.time===e||!f&&c.time<=b)&&(d=!0),d===!0&&(this.pause(),this.off(\"timeupdate\",this.__boundOnTimeUpdate),this.__boundOnTimeUpdate=null,a.resolve(this.getCurrentTime()))},b.prototype.play=function(){var a=new d,b=this.getPlaybackRate()>0,e=this.getDuration(),f=b?this._startTime:e;return this.__boundOnTimeUpdate=this.__onTimeUpdate.bind(this,a,this._startTime),this.setCurrentTime(f),this.on(\"timeupdate\",this.__boundOnTimeUpdate),this._clip.setEasingDirection(b?1:-1),c.prototype.play.apply(this,arguments),a.promise()},b}),AC.define(\"overview/shared/scene/player/TransitionCSS\",[\"require\",\"defer/Deferred\"],function(a){function b(a){this._renderers=a,this._playbackRate=1}var c=a(\"defer/Deferred\");return b.prototype={__transitionsDone:function(){},getDuration:function(){var a=0;return this._renderers.forEach(function(b){b.getDuration()>a&&(a=b.getDuration())}),a},getCurrentTime:function(){},setPlaybackRate:function(a){this._playbackRate=a},getPlaybackRate:function(){return this._playbackRate},play:function(){var a=[],b=this._playbackRate;return this._renderers.forEach(function(c){a.push(b>0?c.renderToEnd():c.renderToStart())}),c.all(a)}},b}),AC.define(\"overview/shared/scene/renderer/js/Opacity\",[\"require\"],function(){function a(a){this._element=a}return a.prototype={render:function(a){var b=a.opacity;a.opacity<.003&&(b=0),AC.Element.setStyle(this._element,{opacity:b})}},a}),AC.define(\"overview/shared/scene/renderer/js/TranslateY\",[\"require\"],function(){function a(a,b){this._element=a,this._units=b||\"px\"}return a.prototype.render=function(a){AC.Element.setVendorPrefixStyle(this._element,\"transform\",\"translate3d(0, \"+a.y+this._units+\", 0)\")},a}),AC.define(\"overview/shared/scene/renderer/js/Width\",[\"require\"],function(){function a(a,b){this._element=a,this._units=b||\"px\"}return a.prototype.render=function(a){AC.Element.setStyle(this._element,{width:a.width+this._units})},a}),AC.define(\"overview/shared/scene/renderer/transition/Opacity\",[\"require\",\"defer/Deferred\"],function(a){function b(a,b,c,d,e){this._tweenData=c,this._transitionData=d,this._element=a,this._duration=b,this._relatedTransitions=e}var c=a(\"defer/Deferred\");return b.prototype.getDuration=function(){return this._duration},b.prototype.__buildStringFromProperty=function(a,b){var c=a.property+\" \"+this._duration+\"s\";return this._tweenData.relativeDelay&&b>0&&(c+=\" \"+this._tweenData.relativeDelay+\"s\"),c},b.prototype.__getTransitionString=function(a){var b=[];return b.push(this.__buildStringFromProperty(this._transitionData,a)),this._relatedTransitions.forEach(function(c){b.push(this.__buildStringFromProperty(c,a))}.bind(this)),b.join(\",\")},b.prototype.__render=function(a,b,d){var e=new c;this.__boundOnTransitionEnd=this.__onTransitionEnd.bind(this,e),AC.Element.setStyle(this._element,{opacity:a}),AC.Element.addVendorPrefixEventListener(this._element,\"transitionEnd\",this.__boundOnTransitionEnd);var f=this.__getTransitionString(d);return this._element.setVendorPrefixStyle(\"transition\",f),AC.Element.setStyle(this._element,{opacity:b}),e.promise()},b.prototype.__onTransitionEnd=function(a,b){b.target===this._element&&(AC.Element.removeVendorPrefixEventListener(this._element,\"transitionEnd\",this.__boundOnTransitionEnd),this.__boundOnTransitionEnd=null,this._element.setVendorPrefixStyle(\"transition\",\"\"),this._tweenData.relativeDelay&&this._element.setVendorPrefixStyle(\"transition-delay\",\"\"),a.resolve())},b.prototype.renderToStart=function(){return this.__render(this._transitionData.to,this._transitionData.from,-1)},b.prototype.renderToEnd=function(){return this.__render(this._transitionData.from,this._transitionData.to,1)},b}),AC.define(\"overview/shared/scene/renderer/transition/TranslateY\",[\"require\",\"defer/Deferred\"],function(a){function b(a,b,c,d){this._tweenData=c,this._transitionData=d,this._element=a,this._duration=b,this._transitionProperty=\"-webkit-transform\",this._lastTranslateValue}var c=a(\"defer/Deferred\");return b.prototype.__render=function(a,b,d){var e=new c;this.__boundOnTransitionEnd=this.__onTransitionEnd.bind(this,e),AC.Element.addVendorPrefixEventListener(this._element,\"transitionEnd\",this.__boundOnTransitionEnd);var f=this._transitionProperty+\" \"+this._duration+\"s ease\";return this._tweenData.relativeDelay&&d>0&&(f+=\" \"+this._tweenData.relativeDelay+\"s\"),this._element.setVendorPrefixStyle(\"transition\",f),AC.Element.setVendorPrefixStyle(this._element,\"transform\",\"translate3d(0, \"+b+this._transitionData.units+\", 0)\"),e.promise()},b.prototype.getDuration=function(){return this._duration},b.prototype.__onTransitionEnd=function(a,b){b.target===this._element&&(AC.Element.removeVendorPrefixEventListener(this._element,\"transitionEnd\",this.__boundOnTransitionEnd),this.__boundOnTransitionEnd=null,this._element.setVendorPrefixStyle(\"transition\",\"\"),this._tweenData.relativeDelay&&this._element.setVendorPrefixStyle(\"transition-delay\",\"\"),a.resolve())},b.prototype.renderToEnd=function(){return this.__render(this._transitionData.from,this._transitionData.to,1)},b.prototype.renderToStart=function(){return this.__render(this._transitionData.to,this._transitionData.from,-1)},b}),AC.define(\"overview/shared/scene/renderer/transition/Width\",[\"require\",\"defer/Deferred\"],function(a){function b(a,b,c,d,e){this._tweenData=c,this._transitionData=d,this._element=a,this._duration=b,this._relatedTransitions=e}var c=a(\"defer/Deferred\");return b.prototype.getDuration=function(){return this._duration},b.prototype.__buildStringFromProperty=function(a){var b=a.property+\" \"+this._duration+\"s\";return this._tweenData.relativeDelay&&direction>0&&(transitionString+=\" \"+a.relativeDelay+\"s\"),b},b.prototype.__getTransitionString=function(){var a=[];return a.push(this.__buildStringFromProperty(this._transitionData)),this._relatedTransitions.forEach(function(b){a.push(this.__buildStringFromProperty(b))}.bind(this)),a.join(\",\")},b.prototype.__render=function(a,b,d){var e=new c;this.__boundOnTransitionEnd=this.__onTransitionEnd.bind(this,e),AC.Element.setStyle(this._element,{width:a+d}),AC.Element.addVendorPrefixEventListener(this._element,\"transitionEnd\",this.__boundOnTransitionEnd);var f=this.__getTransitionString();return this._element.setVendorPrefixStyle(\"transition\",f),AC.Element.setStyle(this._element,{width:b+d}),e.promise()},b.prototype.__onTransitionEnd=function(a,b){b.target===this._element&&(AC.Element.removeVendorPrefixEventListener(this._element,\"transitionEnd\",this.__boundOnTransitionEnd),this.__boundOnTransitionEnd=null,this._element.setVendorPrefixStyle(\"transition\",\"\"),this._tweenData.relativeDelay&&this._element.setVendorPrefixStyle(\"transition-delay\",\"\"),a.resolve())},b.prototype.renderToStart=function(){return this.__render(this._transitionData.to,this._transitionData.from,this._transitionData.units,-1)},b.prototype.renderToEnd=function(){return this.__render(this._transitionData.from,this._transitionData.to,this._transitionData.units,1)},b}),AC.define(\"overview/shared/clip/createClipFromData\",[\"require\",\"animationSequencer/clip/CompositeClip\",\"animationSequencer/clip/TimedClip\",\"animationSequencer/clip/TweenClip\",\"overview/shared/scene/renderer/js/Opacity\",\"overview/shared/scene/renderer/js/TranslateY\",\"overview/shared/scene/renderer/js/Width\",\"overview/shared/scene/renderer/transition/Opacity\",\"overview/shared/scene/renderer/transition/TranslateY\",\"overview/shared/scene/renderer/transition/Width\",\"overview/shared/scene/player/TweenJS\",\"overview/shared/scene/player/TransitionCSS\"],function(a){{var b=(a(\"animationSequencer/clip/CompositeClip\"),a(\"animationSequencer/clip/TimedClip\")),c=a(\"animationSequencer/clip/TweenClip\"),d=a(\"overview/shared/scene/renderer/js/Opacity\"),e=a(\"overview/shared/scene/renderer/js/TranslateY\"),f=a(\"overview/shared/scene/renderer/js/Width\"),g=a(\"overview/shared/scene/renderer/transition/Opacity\"),h=a(\"overview/shared/scene/renderer/transition/TranslateY\"),i=a(\"overview/shared/scene/renderer/transition/Width\");a(\"overview/shared/scene/player/TweenJS\"),a(\"overview/shared/scene/player/TransitionCSS\")}return function(a){var j=[],k=[];return a.forEach(function(a){var l=new c(a.duration,a.props,{reverseEase:a.reverseEase});a.props.forEach(function(b){var c,j;\"y\"===b.property?c=new e(b.element,b.units):\"opacity\"===b.property?c=new d(b.element):\"width\"===b.property&&(c=new f(b.element)),l.on(\"tween_update\",c.render.bind(c)),\"y\"===b.property?j=new h(b.element,a.duration,a,b,AC.Array.without(a.props,b)):\"opacity\"===b.property?j=new g(b.element,a.duration,a,b,AC.Array.without(a.props,b)):\"width\"===b.property&&(j=new i(b.element,a.duration,a,b,AC.Array.without(a.props,b))),k.push(j)}),(a.startDelay||a.fill)&&(l=new b(l,{fill:a.fill,startDelay:a.startDelay||0})),j.push(l)}),{clips:j,cssRenderers:k}}}),AC.define(\"overview/scene/hero/builder\",[\"require\",\"overview/shared/scene/Scene\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/hero/tween/builder\",\"overview/shared/scene/player/TweenJS\",\"overview/shared/scene/player/TransitionCSS\",\"overview/shared/clip/createClipFromData\"],function(a){var b=a(\"overview/shared/scene/Scene\"),c=a(\"animationSequencer/clip/CompositeClip\"),d=a(\"overview/scene/hero/tween/builder\"),e=a(\"overview/shared/scene/player/TweenJS\"),f=a(\"overview/shared/scene/player/TransitionCSS\"),g=a(\"overview/shared/clip/createClipFromData\");return function(a){var h=d(a.startTime),i=g(h),j=new c(i.clips);a.jsPlayer=new e(j,a.startTime),a.cssPlayer=new f(i.cssRenderers,a.startTime);var k=new b(j,a);return k}}),AC.define(\"overview/scene/forward/tween/stage\",[\"require\",\"animationSequencer/clip/TweenClip\",\"animationSequencer/clip/CompositeClip\",\"animationSequencer/clip/TimedClip\"],function(a){a(\"animationSequencer/clip/TweenClip\"),a(\"animationSequencer/clip/CompositeClip\"),a(\"animationSequencer/clip/TimedClip\");return function(a){var b=AC.Element.select(\"#main\");return[{duration:1,startDelay:a,fill:\"forwards\",reverseEase:!0,props:[{element:b,property:\"y\",from:0,to:-100,units:\"%\",easing:\"easeOutQuad\"}]}]}}),AC.define(\"overview/shared/scene/clip/footerSync\",[\"require\",\"animationSequencer/clip/TweenClip\",\"animationSequencer/clip/CompositeClip\",\"animationSequencer/clip/TimedClip\"],function(a){a(\"animationSequencer/clip/TweenClip\"),a(\"animationSequencer/clip/CompositeClip\"),a(\"animationSequencer/clip/TimedClip\");return function(a,b){var c=AC.Element.select(\"#fluidfooter\"),d=document.documentElement.clientHeight||window.innerHeight||document.documentElement.offsetHeight,e=-(document.getElementById(\"fluidfooter\").offsetTop-d),f=e/3,g=f*(b-1),h=f*b;return[{duration:1,startDelay:a,fill:\"none\",reverseEase:!0,props:[{element:c,property:\"y\",from:g,to:h,units:\"px\",easing:\"easeOutQuad\"}]}]}}),AC.define(\"overview/scene/forward/tween/navFadeIn\",[\"require\"],function(){return function(){var a=AC.Element.select(\"#progress-nav\");return AC.Environment.Feature.isDesktop()?[]:[{duration:.3,startDelay:.7,fill:\"backwards\",props:[{element:a,property:\"opacity\",from:0,to:1}]}]}}),AC.define(\"overview/scene/forward/tween/builder\",[\"require\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/forward/tween/stage\",\"overview/shared/scene/clip/footerSync\",\"overview/scene/forward/tween/navFadeIn\"],function(a){var b=(a(\"animationSequencer/clip/CompositeClip\"),a(\"overview/scene/forward/tween/stage\")),c=a(\"overview/shared/scene/clip/footerSync\"),d=a(\"overview/scene/forward/tween/navFadeIn\");return function(a){var e=[];return e=e.concat(b(a)),e=e.concat(d(a)),e=e.concat(c(a,0))}}),AC.define(\"overview/scene/forward/builder\",[\"require\",\"overview/shared/scene/Scene\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/forward/tween/builder\",\"overview/shared/scene/player/TweenJS\",\"overview/shared/scene/player/TransitionCSS\",\"overview/shared/clip/createClipFromData\"],function(a){var b=a(\"overview/shared/scene/Scene\"),c=a(\"animationSequencer/clip/CompositeClip\"),d=a(\"overview/scene/forward/tween/builder\"),e=a(\"overview/shared/scene/player/TweenJS\"),f=a(\"overview/shared/scene/player/TransitionCSS\"),g=a(\"overview/shared/clip/createClipFromData\");return function(a){var h=d(a.startTime),i=g(h),j=new c(i.clips);a.jsPlayer=new e(j,a.startTime),a.cssPlayer=new f(i.cssRenderers,a.startTime);var k=new b(j,a);return k}}),AC.define(\"overview/scene/smart/tween/stage\",[\"require\",\"animationSequencer/clip/TweenClip\",\"animationSequencer/clip/CompositeClip\",\"animationSequencer/clip/TimedClip\"],function(a){a(\"animationSequencer/clip/TweenClip\"),a(\"animationSequencer/clip/CompositeClip\"),a(\"animationSequencer/clip/TimedClip\");return function(a){var b=AC.Element.select(\"#main\");return[{duration:1,startDelay:a,fill:\"forwards\",reverseEase:!0,props:[{element:b,property:\"y\",from:-100,to:-200,units:\"%\",easing:\"easeOutQuad\"}]}]}}),AC.define(\"overview/scene/smart/tween/builder\",[\"require\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/smart/tween/stage\",\"overview/shared/scene/clip/footerSync\"],function(a){var b=(a(\"animationSequencer/clip/CompositeClip\"),a(\"overview/scene/smart/tween/stage\")),c=a(\"overview/shared/scene/clip/footerSync\");return function(a){var d=b(a);return d=d.concat(c(a,1))}}),AC.define(\"overview/scene/smart/builder\",[\"require\",\"overview/shared/scene/Scene\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/smart/tween/builder\",\"overview/shared/scene/player/TweenJS\",\"overview/shared/scene/player/TransitionCSS\",\"overview/shared/clip/createClipFromData\"],function(a){var b=a(\"overview/shared/scene/Scene\"),c=a(\"animationSequencer/clip/CompositeClip\"),d=a(\"overview/scene/smart/tween/builder\"),e=a(\"overview/shared/scene/player/TweenJS\"),f=a(\"overview/shared/scene/player/TransitionCSS\"),g=a(\"overview/shared/clip/createClipFromData\");return function(a){var h=d(a.startTime),i=g(h),j=new c(i.clips);a.jsPlayer=new e(j,a.startTime),a.cssPlayer=new f(i.cssRenderers,a.startTime);var k=new b(j,a);return k}}),AC.define(\"overview/scene/ios/tween/stage\",[\"require\",\"animationSequencer/clip/TweenClip\",\"animationSequencer/clip/CompositeClip\",\"animationSequencer/clip/TimedClip\"],function(a){a(\"animationSequencer/clip/TweenClip\"),a(\"animationSequencer/clip/CompositeClip\"),a(\"animationSequencer/clip/TimedClip\");return function(a){var b=AC.Element.select(\"#main\");return[{duration:1,startDelay:a,fill:\"forwards\",reverseEase:!0,props:[{element:b,property:\"y\",from:-200,to:-300,units:\"%\",easing:\"easeOutQuad\"}]}]}}),AC.define(\"overview/scene/ios/tween/builder\",[\"require\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/ios/tween/stage\",\"overview/shared/scene/clip/footerSync\"],function(a){var b=(a(\"animationSequencer/clip/CompositeClip\"),a(\"overview/scene/ios/tween/stage\")),c=a(\"overview/shared/scene/clip/footerSync\");return function(a){var d=b(a);return d=d.concat(c(a,2))}}),AC.define(\"overview/scene/ios/builder\",[\"require\",\"overview/shared/scene/Scene\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/ios/tween/builder\",\"overview/shared/scene/player/TweenJS\",\"overview/shared/scene/player/TransitionCSS\",\"overview/shared/clip/createClipFromData\"],function(a){var b=a(\"overview/shared/scene/Scene\"),c=a(\"animationSequencer/clip/CompositeClip\"),d=a(\"overview/scene/ios/tween/builder\"),e=a(\"overview/shared/scene/player/TweenJS\"),f=a(\"overview/shared/scene/player/TransitionCSS\"),g=a(\"overview/shared/clip/createClipFromData\");return function(a){var h=d(a.startTime),i=g(h),j=new c(i.clips);a.jsPlayer=new e(j,a.startTime),a.cssPlayer=new f(i.cssRenderers,a.startTime);var k=new b(j,a);return k}}),AC.define(\"overview/scene/cases/tween/stage\",[\"require\",\"animationSequencer/clip/TweenClip\",\"animationSequencer/clip/CompositeClip\",\"animationSequencer/clip/TimedClip\"],function(a){a(\"animationSequencer/clip/TweenClip\"),a(\"animationSequencer/clip/CompositeClip\"),a(\"animationSequencer/clip/TimedClip\");return function(a){var b=AC.Element.select(\"#main\");return[{duration:1,startDelay:a,fill:\"forwards\",reverseEase:!0,props:[{element:b,property:\"y\",from:-300,to:-400,units:\"%\",easing:\"easeOutQuad\"}]}]}}),AC.define(\"overview/scene/cases/tween/builder\",[\"require\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/cases/tween/stage\",\"overview/shared/scene/clip/footerSync\"],function(a){var b=(a(\"animationSequencer/clip/CompositeClip\"),a(\"overview/scene/cases/tween/stage\")),c=a(\"overview/shared/scene/clip/footerSync\");return function(a){var d=b(a);return d=d.concat(c(a,3))}}),AC.define(\"overview/scene/cases/builder\",[\"require\",\"overview/shared/scene/Scene\",\"animationSequencer/clip/CompositeClip\",\"overview/scene/cases/tween/builder\",\"overview/shared/scene/player/TweenJS\",\"overview/shared/scene/player/TransitionCSS\",\"overview/shared/clip/createClipFromData\"],function(a){var b=a(\"overview/shared/scene/Scene\"),c=a(\"animationSequencer/clip/CompositeClip\"),d=a(\"overview/scene/cases/tween/builder\"),e=a(\"overview/shared/scene/player/TweenJS\"),f=a(\"overview/shared/scene/player/TransitionCSS\"),g=a(\"overview/shared/clip/createClipFromData\");return function(a){var h=d(a.startTime),i=g(h),j=new c(i.clips);a.jsPlayer=new e(j,a.startTime),a.cssPlayer=new f(i.cssRenderers,a.startTime);var k=new b(j,a);return k}}),AC.define(\"overview/scene/footer/tween/mainOut\",[\"require\",\"animationSequencer/clip/TweenClip\",\"animationSequencer/clip/CompositeClip\",\"animationSequencer/clip/TimedClip\"],function(a){var b=(a(\"animationSequencer/clip/TweenClip\"),a(\"animationSequencer/clip/CompositeClip\"),a(\"animationSequencer/clip/TimedClip\"),AC.Element.select(\"#fluidfooter\")),c=b.offsetHeight;return function(a){var b=AC.Element.select(\"#main\"),d=document.documentElement.clientHeight||window.innerHeight||document.documentElement.offsetHeight,e=d-55,f=2*d,g=f+c;return c>e&&(g=f+e),[{duration:1,startDelay:a,fill:\"forwards\",reverseEase:!0,props:[{element:b,property:\"y\",from:-f,to:-g,units:\"px\",easing:\"easeOutQuad\"}]}]}}),AC.define(\"overview/scene/footer/tween/navFadeOut\",[\"require\"],function(){return function(a){var b=AC.Element.select(\"#progress-nav\");return[{duration:1,startDelay:a,fill:\"forwards\",reverseEase:!0,props:[{element:b,property:\"opacity\",from:1,to:0,easing:\"easeOutQuad\"}]}]}}),AC.define(\"overview/scene/footer/tween/builder\",[\"require\",\"overview/scene/footer/tween/mainOut\",\"overview/scene/footer/tween/navFadeOut\"],function(a){var b=a(\"overview/scene/footer/tween/mainOut\"),c=a(\"overview/scene/footer/tween/navFadeOut\");return function(a){var d=[];return d=d.concat(b(a)),d=d.concat(c(a))}}),AC.define(\"overview/shared/scene/clip/footerScrollPoints\",[\"require\"],function(){function a(){for(var a=AC.Element.selectAll(\"#fluidfooter > *\"),b=[],c=0;c<a.length;c++)b.push({section:a[c],height:AC.Element.getBoundingBox(a[c]).height,top:a[c].offsetTop});return b}function b(a,b){return[{easing:\"easeOutQuad\",from:a,to:b,property:\"y\"}]}var c=AC.Element.select(\"#fluidfooter\"),d=AC.Element.getBoundingBox(c).height;return function(e){var f=a(),g=document.documentElement.clientHeight||window.innerHeight||document.documentElement.offsetHeight;footerDistanceToBottomOfWindow=AC.Element.select(\"#fluidfooter\").offsetTop-g;var h=[],i=[],j=g-55,k=-(footerDistanceToBottomOfWindow+d);if(j>d)h.push(b(-footerDistanceToBottomOfWindow,k));else{var l=f[0],m=-(footerDistanceToBottomOfWindow+j),n=l.height;h.push(b(-footerDistanceToBottomOfWindow,m));for(var o=1,p=f.length;p>o;++o){if(l=f[o],n+l.height>j){var q=m-n;k>q&&(q=k,o=p),h.push(b(m,q)),m-=n,n=0}n+=l.height}}return h.forEach(function(a,b){a.forEach(function(a){a.element=c,a.units=\"px\"});var d=0===b?\"none\":\"forwards\",f=[{duration:1,startDelay:e+b,fill:d,reverseEase:!0,props:a}];i=i.concat(f)}),i}}),AC.define(\"overview/shared/scene/clip/footer\",[\"require\",\"overview/shared/scene/Scene\",\"animationSequencer/clip/CompositeClip\",\"overview/shared/clip/createClipFromData\",\"overview/shared/scene/clip/footerScrollPoints\",\"overview/shared/scene/player/TweenJS\",\"overview/shared/scene/player/TransitionCSS\"],function(a){var b=a(\"overview/shared/scene/Scene\"),c=a(\"animationSequencer/clip/CompositeClip\"),d=a(\"overview/shared/clip/createClipFromData\"),e=a(\"overview/shared/scene/clip/footerScrollPoints\"),f=a(\"overview/shared/scene/player/TweenJS\"),g=a(\"overview/shared/scene/player/TransitionCSS\");return function(a,h,i,j){var k=a.startTime,l=a.id,m=a.element,n=e(a.startTime,h),o=d(j),p=new c(o.clips);a.jsPlayer=new f(p,a.startTime),a.cssPlayer=new g(o.cssRenderers,a.startTime);var q=[],r=i;return n.forEach(function(a,e){var h,i=[a],j=[];if(0!==e){var n=AC.Object.clone(a);n.props=a.props.slice(0),n.props[0]=AC.Object.clone(a.props[0]),n.props[0].element=AC.Element.select(\"#main\"),n.props[0].from=-r;var s=r+(a.props[0].from-a.props[0].to);n.props[0].to=-s,r=s,i.push(n)}h=d(i);var t;0===e&&(h.clips.push(p),j=j.concat(o.cssRenderers)),j=j.concat(h.cssRenderers);var u=new c(h.clips);t=new b(new c(h.clips),{id:l+\"-\"+e,jsPlayer:new f(u,k+e),cssPlayer:new g(j,k+e),element:m,duration:1,startTime:k+e}),q.push(t)}),q}}),AC.define(\"overview/scene/builder\",[\"require\",\"overview/scene/hero/builder\",\"overview/scene/forward/builder\",\"overview/scene/smart/builder\",\"overview/scene/ios/builder\",\"overview/scene/cases/builder\",\"overview/scene/footer/tween/builder\",\"overview/shared/scene/clip/footer\"],function(a){var b=a(\"overview/scene/hero/builder\"),c=a(\"overview/scene/forward/builder\"),d=a(\"overview/scene/smart/builder\"),e=(a(\"overview/scene/ios/builder\"),a(\"overview/scene/cases/builder\"),a(\"overview/scene/footer/tween/builder\")),f=a(\"overview/shared/scene/clip/footer\");return function(a){var g=document.documentElement.clientHeight||window.innerHeight||document.documentElement.offsetHeight,h=document.getElementById(\"fluidfooter\").offsetTop-g,i=3*g+(g-55),j=e(a[3].startTime),k=f(a[3],h,i,j),l=[b(a[0]),c(a[1]),d(a[2])];return l=l.concat(k)}}),AC.define(\"overview/story/tableOfContents\",[\"require\"],function(){return function(){return[{id:\"hero\",element:AC.Element.select(\"#hero\"),startTime:0,duration:0},{id:\"forward\",element:AC.Element.select(\"#forward\"),startTime:0,duration:1},{id:\"smart\",element:AC.Element.select(\"#smart\"),startTime:1,duration:1},{id:\"footer\",element:AC.Element.select(\"#fluidfooter\"),startTime:3,duration:1}]}}),AC.define(\"overview/story/observer/LightDarkProgressNav\",[\"require\"],function(){function a(a,b,c){this._element=a,this._className=c||\"light\",this._slideIndexes=b}return a.prototype={onWillShow:function(a){-1!==this._slideIndexes.indexOf(a.incomingIndex)?AC.Element.addClassName(this._element,this._className):(AC.Element.hasClassName(this._element),this._className&&AC.Element.removeClassName(this._element,this._className))}},a}),AC.define(\"overview/story/observer/builder\",[\"require\",\"overview/story/observer/LightDarkProgressNav\"],function(a){var b=a(\"overview/story/observer/LightDarkProgressNav\");return function(a,c,d){var e=new b(c,d);return a.on(\"willShow\",e.onWillShow.bind(e)),e}}),AC.define(\"overview/bootstrap\",[\"require\",\"overview/shared/responsive/builder\",\"overview/shared/responsive/ControllerSet\",\"overview/shared/responsive/windowResizeTimeout\",\"overview/shared/scene/observer/nav/Focus\",\"overview/shared/story/builder\",\"overview/scene/builder\",\"overview/story/tableOfContents\",\"overview/story/observer/builder\"],function(a){function b(){var a=j(l);d=window.story=i(a,m,3);new h(d,l)}function c(){var a=j(l);d.setScenes(a),window.scrollTo(0,0)}{var d,e=a(\"overview/shared/responsive/builder\"),f=a(\"overview/shared/responsive/ControllerSet\"),g=a(\"overview/shared/responsive/windowResizeTimeout\"),h=a(\"overview/shared/scene/observer/nav/Focus\"),i=a(\"overview/shared/story/builder\"),j=a(\"overview/scene/builder\"),k=a(\"overview/story/tableOfContents\"),l=k(),m=AC.Element.select(\"#progress-nav\"),n=a(\"overview/story/observer/builder\"),o=e(document.body);\nnew f(o)}AC.onDOMReady(function(){if(document.all){AC.Element.addClassName(document.getElementsByTagName(\"html\")[0],\"scroll\"),AC.Element.addClassName(document.body,\"scroll\");var a,e,f=parseInt(AC.Element.getStyle(l[0].element,\"height\"),10)||999999;for(a=0,e=o.length;e>a;a+=1)o[a].respond({width:999999,height:f})}else{var a,e;for(a=0,e=o.length;e>a;a+=1)o[a].addListeners();b(),g(c),n(d,m,[1])}})});"
  },
  {
    "path": "works/demo/ali/file/owl.carousel.js",
    "content": "!function(a,b,c,d){function e(b,c){b.owlCarousel={name:\"Owl Carousel\",author:\"Bartosz Wojciechowski\",version:\"2.0.0-beta.1.8\",released:\"03.05.2014\"},this.options=a.extend({},n,c),this._options=a.extend({},n,c),this.dom=a.extend({},o),this.width=a.extend({},p),this.num=a.extend({},q),this.pos=a.extend({},r),this.drag=a.extend({},s),this.speed=a.extend({},t),this.state=a.extend({},u),this.e=a.extend({},v),this.dom.el=b,this.dom.$el=a(b),this.init()}function f(a){var b,d,e=c.createElement(\"div\"),f=a;for(b in f)if(d=f[b],\"undefined\"!=typeof e.style[d])return e=null,[d,b];return[!1]}function g(){return f([\"transition\",\"WebkitTransition\",\"MozTransition\",\"OTransition\"])[1]}function h(){return f([\"transform\",\"WebkitTransform\",\"MozTransform\",\"OTransform\",\"msTransform\"])[0]}function j(){return f([\"perspective\",\"webkitPerspective\",\"MozPerspective\",\"OPerspective\",\"MsPerspective\"])[0]}function k(){return\"ontouchstart\"in b||!!navigator.msMaxTouchPoints}function l(){return b.navigator.msPointerEnabled}function m(){return b.devicePixelRatio>1}var n={items:2,loop:!1,center:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,autoHeight:!1,startPosition:0,URLhashListener:!1,nav:!1,navRewind:!0,navText:[\"<\",\">\"],slideBy:1,dots:!0,dotsEach:!1,dotData:!1,lazyLoad:!1,lazyContent:!1,autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,smartSpeed:250,fluidSpeed:!1,autoplaySpeed:!1,navSpeed:!1,dotsSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,responsiveClass:!1,video:!1,videoHeight:!1,videoWidth:!1,animateOut:!1,animateIn:!1,fallbackEasing:\"swing\",callbacks:!1,info:!1,nestedItemSelector:!1,itemElement:\"div\",stageElement:\"div\",themeClass:\"owl-theme\",baseClass:\"owl-carousel\",itemClass:\"owl-item\",centerClass:\"center\",activeClass:\"active\",navContainerClass:\"owl-nav\",navClass:[\"owl-prev\",\"owl-next\"],controlsClass:\"owl-controls\",dotClass:\"owl-dot\",dotsClass:\"owl-dots\",autoHeightClass:\"owl-height\"},o={el:null,$el:null,stage:null,$stage:null,oStage:null,$oStage:null,$items:null,$oItems:null,$cItems:null,$cc:null,$navPrev:null,$navNext:null,$page:null,$nav:null,$content:null},p={el:0,stage:0,item:0,prevWindow:0,cloneLast:0},q={items:0,oItems:0,cItems:0,active:0,merged:[],nav:[],allPages:0},r={start:0,max:0,maxValue:0,prev:0,current:0,currentAbs:0,currentPage:0,stage:0,items:[],lsCurrent:0},s={start:0,startX:0,startY:0,current:0,currentX:0,currentY:0,offsetX:0,offsetY:0,distance:null,startTime:0,endTime:0,updatedX:0,targetEl:null},t={onDragEnd:300,nav:300,css2speed:0},u={isTouch:!1,isScrolling:!1,isSwiping:!1,direction:!1,inMotion:!1,autoplay:!1,lazyContent:!1},v={_onDragStart:null,_onDragMove:null,_onDragEnd:null,_transitionEnd:null,_resizer:null,_responsiveCall:null,_goToLoop:null,_checkVisibile:null,_autoplay:null,_pause:null,_play:null,_stop:null};e.prototype.init=function(){if(this.fireCallback(\"onInitBefore\"),this.dom.$el.hasClass(this.options.baseClass)||this.dom.$el.addClass(this.options.baseClass),this.dom.$el.hasClass(this.options.themeClass)||this.dom.$el.addClass(this.options.themeClass),this.options.rtl&&this.dom.$el.addClass(\"owl-rtl\"),this.browserSupport(),this.sortOptions(),this.setResponsiveOptions(),this.options.autoWidth&&this.state.imagesLoaded!==!0){var a=this.dom.$el.find(\"img\");if(a.length)return this.preloadAutoWidthImages(a),!1}this.width.prevWindow=this.windowWidth(),this.createStage(),this.fetchContent(),this.eventsCall(),this.addCustomEvents(),this.internalEvents(),this.dom.$el.addClass(\"owl-loading\"),this.refresh(!0),this.dom.$el.removeClass(\"owl-loading\").addClass(\"owl-loaded\"),this.fireCallback(\"onInitAfter\")},e.prototype.sortOptions=function(){var a=this.options.responsive;this.responsiveSorted={};var b,c,d,e=[];for(b in a)e.push(b);for(e=e.sort(function(a,b){return a-b}),c=0;c<e.length;c++)d=e[c],this.responsiveSorted[d]=a[d]},e.prototype.setResponsiveOptions=function(){if(this.options.responsive===!1)return!1;{var a,b,c,d,e=this.windowWidth();this.options.responsive}for(c in this._options)\"responsive\"!==c&&(this.options[c]=this._options[c]);for(a in this.responsiveSorted)if(e>=a){d=a;for(b in this.responsiveSorted[d])this.options[b]=this.responsiveSorted[d][b]}this.num.breakpoint=d,this.options.responsiveClass&&this.dom.$el.attr(\"class\",function(a,b){return b.replace(/\\b owl-responsive-\\S+/g,\"\")}).addClass(\"owl-responsive-\"+d)},e.prototype.optionsLogic=function(){this.dom.$el.toggleClass(\"owl-center\",this.options.center),this.options.slideBy&&\"page\"===this.options.slideBy?this.options.slideBy=this.options.items:this.options.slideBy>this.options.items&&(this.options.slideBy=this.options.items),this.options.loop&&this.num.oItems<this.options.items&&(this.options.loop=!1),this.num.oItems<=this.options.items&&(this.options.navRewind=!1),this.options.autoWidth&&(this.options.stagePadding=!1,this.options.dotsEach=1,this.options.merge=!1),this.state.lazyContent&&(this.options.loop=!1,this.options.merge=!1,this.options.dots=!1,this.options.freeDrag=!1,this.options.lazyContent=!0),this.state.animate=(this.options.animateIn||this.options.animateOut)&&1===this.options.items&&this.support3d?!0:!1},e.prototype.createStage=function(){var b=c.createElement(\"div\"),d=c.createElement(this.options.stageElement);b.className=\"owl-stage-outer\",d.className=\"owl-stage\",b.appendChild(d),this.dom.el.appendChild(b),this.dom.oStage=b,this.dom.$oStage=a(b),this.dom.stage=d,this.dom.$stage=a(d),b=null,d=null},e.prototype.createItem=function(){var a=c.createElement(this.options.itemElement);return a.className=this.options.itemClass,a},e.prototype.fetchContent=function(b){this.dom.$content=b?b instanceof jQuery?b:a(b):this.options.nestedItemSelector?this.dom.$el.find(\".\"+this.options.nestedItemSelector).not(\".owl-stage-outer\"):this.dom.$el.children().not(\".owl-stage-outer\"),this.num.oItems=this.dom.$content.length,0!==this.num.oItems&&this.initStructure()},e.prototype.initStructure=function(){this.state.lazyContent=this.options.lazyContent&&this.num.oItems>=3*this.options.items?!0:!1,this.state.lazyContent?(this.pos.currentAbs=this.options.items,this.dom.$content.remove()):this.createNormalStructure()},e.prototype.createNormalStructure=function(){for(var a=0;a<this.num.oItems;a++){var b=this.fillItem(this.dom.$content,a);this.dom.$stage.append(b)}this.dom.$content=null},e.prototype.createCustomStructure=function(b){for(var c=0;b>c;c++){var d=this.createItem(),e=a(d);this.setData(e,!1),this.dom.$stage.append(e)}},e.prototype.createLazyContentStructure=function(a){return this.state.lazyContent?a&&this.dom.$stage.children().length===3*this.options.items?!1:(this.dom.$stage.empty(),void this.createCustomStructure(3*this.options.items)):!1},e.prototype.fillItem=function(b,c){var d=this.createItem(),e=b[c]||b,f=this.traversContent(e);return this.setData(d,!1,f),a(d).append(e)},e.prototype.traversContent=function(b){var c,d,e=a(b);return this.options.dotData&&(c=e.find(\"[data-dot]\").andSelf().data(\"dot\")),this.options.URLhashListener&&(d=e.find(\"[data-hash]\").andSelf().data(\"hash\")),{dot:c||!1,hash:d||!1}},e.prototype.setData=function(b,c,d){var e,f;d&&(e=d.dot,f=d.hash);var g={index:!1,indexAbs:!1,posLeft:!1,clone:!1,active:!1,loaded:!1,lazyLoad:!1,current:!1,width:!1,center:!1,page:!1,hasVideo:!1,playVideo:!1,dot:e,hash:f};c&&(g=a.extend({},g,c.data(\"owl-item\"))),a(b).data(\"owl-item\",g)},e.prototype.updateLocalContent=function(){this.dom.$oItems=this.dom.$stage.find(\".\"+this.options.itemClass).filter(function(){return a(this).data(\"owl-item\").clone===!1}),this.num.oItems=this.dom.$oItems.length;for(var b=0;b<this.num.oItems;b++){var c=this.dom.$oItems.eq(b);c.data(\"owl-item\").index=b}},e.prototype.checkVideoLinks=function(){if(!this.options.video)return!1;for(var a,b,c=0;c<this.num.items;c++)b=this.dom.$items.eq(c),b.data(\"owl-item\").hasVideo||(a=b.find(\".owl-video\"),a.length&&(this.state.hasVideos=!0,this.dom.$items.eq(c).data(\"owl-item\").hasVideo=!0,a.css(\"display\",\"none\"),this.getVideoInfo(a,b)))},e.prototype.getVideoInfo=function(a,b){var c,d,e,f=a.data(\"vimeo-id\"),g=a.data(\"youtube-id\"),h=a.data(\"width\")||this.options.videoWidth,i=a.data(\"height\")||this.options.videoHeight,j=a.attr(\"href\");if(f)d=\"vimeo\",e=f;else if(g)d=\"youtube\",e=g;else{if(!j)throw new Error(\"Missing video link.\");e=j.match(/(http:|https:|)\\/\\/(player.|www.)?(vimeo\\.com|youtu(be\\.com|\\.be|be\\.googleapis\\.com))\\/(video\\/|embed\\/|watch\\?v=|v\\/)?([A-Za-z0-9._%-]*)(\\&\\S+)?/),e[3].indexOf(\"youtu\")>-1?d=\"youtube\":e[3].indexOf(\"vimeo\")>-1&&(d=\"vimeo\"),e=e[6]}b.data(\"owl-item\").videoType=d,b.data(\"owl-item\").videoId=e,b.data(\"owl-item\").videoWidth=h,b.data(\"owl-item\").videoHeight=i,c={type:d,id:e};var k=h&&i?'style=\"width:'+h+\"px;height:\"+i+'px;\"':\"\";a.wrap('<div class=\"owl-video-wrapper\"'+k+\"></div>\"),this.createVideoTn(a,c)},e.prototype.createVideoTn=function(b,c){function d(a){f='<div class=\"owl-video-play-icon\"></div>',e=j.options.lazyLoad?'<div class=\"owl-video-tn '+i+'\" '+h+'=\"'+a+'\"></div>':'<div class=\"owl-video-tn\" style=\"opacity:1;background-image:url('+a+')\"></div>',b.after(e),b.after(f)}var e,f,g=b.find(\"img\"),h=\"src\",i=\"\",j=this;if(this.options.lazyLoad&&(h=\"data-src\",i=\"owl-lazy\"),g.length)return d(g.attr(h)),g.remove(),!1;if(\"youtube\"===c.type){var k=\"http://img.youtube.com/vi/\"+c.id+\"/hqdefault.jpg\";d(k)}else\"vimeo\"===c.type&&a.ajax({type:\"GET\",url:\"http://vimeo.com/api/v2/video/\"+c.id+\".json\",jsonp:\"callback\",dataType:\"jsonp\",success:function(a){var b=a[0].thumbnail_large;d(b),j.options.loop&&j.updateItemState()}})},e.prototype.stopVideo=function(){this.fireCallback(\"onVideoStop\");var a=this.dom.$items.eq(this.state.videoPlayIndex);a.find(\".owl-video-frame\").remove(),a.removeClass(\"owl-video-playing\"),this.state.videoPlay=!1},e.prototype.playVideo=function(b){this.fireCallback(\"onVideoPlay\"),this.state.videoPlay&&this.stopVideo();var c,d,e=a(b.target||b.srcElement),f=e.closest(\".\"+this.options.itemClass),g=f.data(\"owl-item\").videoType,h=f.data(\"owl-item\").videoId,i=f.data(\"owl-item\").videoWidth||Math.floor(f.data(\"owl-item\").width-this.options.margin),j=f.data(\"owl-item\").videoHeight||this.dom.$stage.height();\"youtube\"===g?c='<iframe width=\"'+i+'\" height=\"'+j+'\" src=\"http://www.youtube.com/embed/'+h+\"?autoplay=1&v=\"+h+'\" frameborder=\"0\" allowfullscreen></iframe>':\"vimeo\"===g&&(c='<iframe src=\"http://player.vimeo.com/video/'+h+'?autoplay=1\" width=\"'+i+'\" height=\"'+j+'\" frameborder=\"0\" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'),f.addClass(\"owl-video-playing\"),this.state.videoPlay=!0,this.state.videoPlayIndex=f.data(\"owl-item\").indexAbs,d=a('<div style=\"height:'+j+\"px; width:\"+i+'px\" class=\"owl-video-frame\">'+c+\"</div>\"),e.after(d)},e.prototype.loopClone=function(){if(!this.options.loop||this.state.lazyContent||this.num.oItems<this.options.items)return!1;var b,c,d,e=this.options.items,f=this.num.oItems-1;for(this.options.stagePadding&&1===this.options.items&&(e+=1),this.num.cItems=2*e,d=0;e>d;d++){var g=this.dom.$oItems.eq(d).clone(!0,!0),h=this.dom.$oItems.eq(f-d).clone(!0,!0);b=a(g[0]).addClass(\"cloned\"),c=a(h[0]).addClass(\"cloned\"),this.setData(b[0],g),this.setData(c[0],h),b.data(\"owl-item\").clone=!0,c.data(\"owl-item\").clone=!0,this.dom.$stage.append(b),this.dom.$stage.prepend(c),b=c=null}this.dom.$cItems=this.dom.$stage.find(\".\"+this.options.itemClass).filter(function(){return a(this).data(\"owl-item\").clone===!0})},e.prototype.reClone=function(){null!==this.dom.$cItems&&(this.dom.$cItems.remove(),this.dom.$cItems=null,this.num.cItems=0),this.options.loop&&this.loopClone()},e.prototype.calculate=function(){var a,b,c,d=0,e=0;this.width.el=this.dom.$el.width()-2*this.options.stagePadding,this.width.view=this.dom.$el.width();var f=this.width.el-this.options.margin*(1===this.options.items?0:this.options.items-1);for(this.width.el=this.width.el+this.options.margin,this.width.item=(f/this.options.items+this.options.margin).toFixed(3),this.dom.$items=this.dom.$stage.find(\".owl-item\"),this.num.items=this.dom.$items.length,this.options.autoWidth&&this.dom.$items.css(\"width\",\"\"),this.pos.items=[],this.num.merged=[],this.num.nav=[],c=this.options.rtl?this.options.center?-(this.width.el/2):0:this.options.center?this.width.el/2:0,this.width.mergeStage=0,a=0;a<this.num.items;a++){if(this.options.merge){var g=this.dom.$items.eq(a).find(\"[data-merge]\").attr(\"data-merge\")||1;this.options.mergeFit&&g>this.options.items&&(g=this.options.items),this.num.merged.push(parseInt(g)),this.width.mergeStage+=this.width.item*this.num.merged[a]}else this.num.merged.push(1);this.options.loop?a>=this.num.cItems/2&&a<this.num.cItems/2+this.num.oItems&&this.num.nav.push(this.num.merged[a]):this.num.nav.push(this.num.merged[a]);var h=this.width.item*this.num.merged[a];this.options.autoWidth&&(h=this.dom.$items.eq(a).width()+this.options.margin,this.options.rtl?this.dom.$items[a].style.marginLeft=this.options.margin+\"px\":this.dom.$items[a].style.marginRight=this.options.margin+\"px\"),this.pos.items.push(c),this.dom.$items.eq(a).data(\"owl-item\").posLeft=d,this.dom.$items.eq(a).data(\"owl-item\").width=h,this.options.rtl?(c+=h,d+=h):(c-=h,d-=h),e-=Math.abs(h),this.options.center&&(this.pos.items[a]=this.options.rtl?this.pos.items[a]+h/2:this.pos.items[a]-h/2)}this.width.stage=Math.abs(this.options.autoWidth?this.options.center?e:c:e);var i=this.num.oItems+this.num.cItems;for(b=0;i>b;b++)this.dom.$items.eq(b).data(\"owl-item\").indexAbs=b;this.setMinMax(),this.setSizes()},e.prototype.setMinMax=function(){var a=this.dom.$oItems.eq(0).data(\"owl-item\").indexAbs;if(this.pos.min=0,this.pos.minValue=this.pos.items[a],this.options.loop||(this.pos.max=this.num.oItems-1),this.options.loop&&(this.pos.max=this.num.oItems+this.options.items),this.options.loop||this.options.center||(this.pos.max=this.num.oItems-this.options.items),this.options.loop&&this.options.center&&(this.pos.max=this.num.oItems+this.options.items),this.pos.maxValue=this.pos.items[this.pos.max],!this.options.loop&&!this.options.center&&this.options.autoWidth||this.options.merge&&!this.options.center){var b=this.options.rtl?1:-1;for(i=0;i<this.pos.items.length;i++)this.pos.items[i]*b<this.width.stage-this.width.el&&(this.pos.max=i+1);this.pos.maxValue=this.options.rtl?this.width.stage-this.width.el:-(this.width.stage-this.width.el),this.pos.items[this.pos.max]=this.pos.maxValue}this.pos.loop=this.options.center?this.pos.items[0]-this.pos.items[this.num.oItems]:-this.pos.items[this.num.oItems],this.num.oItems<this.options.items&&!this.options.center&&(this.pos.max=0,this.pos.maxValue=this.pos.items[0])},e.prototype.setSizes=function(){this.options.stagePadding!==!1&&(this.dom.oStage.style.paddingLeft=this.options.stagePadding+\"px\",this.dom.oStage.style.paddingRight=this.options.stagePadding+\"px\"),this.options.rtl?b.setTimeout(function(){this.dom.stage.style.width=this.width.stage+\"px\"}.bind(this),0):this.dom.stage.style.width=this.width.stage+\"px\";for(var a=0;a<this.num.items;a++)this.options.autoWidth||(this.dom.$items[a].style.width=this.width.item-this.options.margin+\"px\"),this.options.rtl?this.dom.$items[a].style.marginLeft=this.options.margin+\"px\":this.dom.$items[a].style.marginRight=this.options.margin+\"px\",1===this.num.merged[a]||this.options.autoWidth||(this.dom.$items[a].style.width=this.width.item*this.num.merged[a]-this.options.margin+\"px\");this.width.stagePrev=this.width.stage},e.prototype.responsive=function(){if(!this.num.oItems)return!1;var d=this.isElWidthChanged();if(!d)return!1;var e=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return e&&a(e.parentNode).hasClass(\"owl-video-frame\")&&(this.setSpeed(0),this.state.isFullScreen=!0),e&&this.state.isFullScreen&&this.state.videoPlay?!1:this.state.isFullScreen?(this.state.isFullScreen=!1,!1):this.state.videoPlay&&this.state.orientation!==b.orientation?(this.state.orientation=b.orientation,!1):(this.fireCallback(\"onResponsiveBefore\"),this.state.responsive=!0,this.refresh(),this.state.responsive=!1,void this.fireCallback(\"onResponsiveAfter\"))},e.prototype.refresh=function(a){return this.state.videoPlay&&this.stopVideo(),this.setResponsiveOptions(),this.createLazyContentStructure(!0),this.updateLocalContent(),this.optionsLogic(),0===this.num.oItems?(null!==this.dom.$page&&this.dom.$page.hide(),!1):(this.dom.$stage.addClass(\"owl-refresh\"),this.reClone(),this.calculate(),this.dom.$stage.removeClass(\"owl-refresh\"),this.state.lazyContent&&(this.pos.currentAbs=this.options.items),this.initPosition(a),this.state.lazyContent||a||this.jumpTo(this.pos.current,!1),this.checkVideoLinks(),this.updateItemState(),this.rebuildDots(),this.updateControls(),this.autoplay(),this.autoHeight(),this.state.orientation=b.orientation,void this.watchVisibility())},e.prototype.updateItemState=function(a){this.state.lazyContent?this.updateLazyContent(a):this.updateActiveItems(),this.options.center&&(this.dom.$items.eq(this.pos.currentAbs).addClass(this.options.centerClass).data(\"owl-item\").center=!0),this.options.lazyLoad&&this.lazyLoad()},e.prototype.updateActiveItems=function(){var a,b,c,d,e,f,g;for(a=0;a<this.num.items;a++)this.dom.$items.eq(a).data(\"owl-item\").active=!1,this.dom.$items.eq(a).data(\"owl-item\").current=!1,this.dom.$items.eq(a).removeClass(this.options.activeClass).removeClass(this.options.centerClass);for(this.num.active=0,stageX=this.pos.stage,view=this.options.rtl?this.width.view:-this.width.view,b=0;b<this.num.items;b++)c=this.dom.$items.eq(b),d=c.data(\"owl-item\").posLeft,e=c.data(\"owl-item\").width,f=this.options.rtl?d+e:d-e,(this.op(d,\"<=\",stageX)&&this.op(d,\">\",stageX+view)||this.op(f,\"<\",stageX)&&this.op(f,\">\",stageX+view))&&(this.num.active++,this.options.freeDrag&&!g&&(g=!0,this.pos.current=c.data(\"owl-item\").index,this.pos.currentAbs=c.data(\"owl-item\").indexAbs),c.data(\"owl-item\").active=!0,c.data(\"owl-item\").current=!0,c.addClass(this.options.activeClass),this.options.lazyLoad||(c.data(\"owl-item\").loaded=!0),this.options.loop&&(this.options.lazyLoad||this.options.center)&&this.updateClonedItemsState(c.data(\"owl-item\").index))},e.prototype.updateClonedItemsState=function(a){var b,c,d;for(this.options.center&&(b=this.dom.$items.eq(this.pos.currentAbs).data(\"owl-item\").index),d=0;d<this.num.items;d++)c=this.dom.$items.eq(d),c.data(\"owl-item\").index===a&&(c.data(\"owl-item\").current=!0,c.data(\"owl-item\").index===b&&c.addClass(this.options.centerClass))},e.prototype.updateLazyPosition=function(){var a=this.pos.goToLazyContent||0;this.pos.lcMovedBy=Math.abs(this.options.items-this.pos.currentAbs),this.options.items<this.pos.currentAbs?(this.pos.lcCurrent+=this.pos.currentAbs-this.options.items,this.state.lcDirection=\"right\"):this.options.items>this.pos.currentAbs&&(this.pos.lcCurrent-=this.options.items-this.pos.currentAbs,this.state.lcDirection=\"left\"),this.pos.lcCurrent=0!==a?a:this.pos.lcCurrent,this.pos.lcCurrent>=this.dom.$content.length?this.pos.lcCurrent=this.pos.lcCurrent-this.dom.$content.length:this.pos.lcCurrent<-this.dom.$content.length+1&&(this.pos.lcCurrent=this.pos.lcCurrent+this.dom.$content.length),this.options.startPosition>0&&(this.pos.lcCurrent=this.options.startPosition,this._options.startPosition=this.options.startPosition=0),this.pos.lcCurrentAbs=this.pos.lcCurrent<0?this.pos.lcCurrent+this.dom.$content.length:this.pos.lcCurrent},e.prototype.updateLazyContent=function(a){this.pos.lcCurrent===d&&(this.pos.lcCurrent=0,this.pos.current=this.pos.currentAbs=this.options.items),a||this.updateLazyPosition();var b,c,e,f,g,h,i;if(this.state.lcDirection!==!1)for(b=0;b<this.pos.lcMovedBy;b++)\"right\"===this.state.lcDirection&&(e=this.dom.$stage.find(\".owl-item\").eq(0),e.appendTo(this.dom.$stage)),\"left\"===this.state.lcDirection&&(e=this.dom.$stage.find(\".owl-item\").eq(-1),e.prependTo(this.dom.$stage)),e.data(\"owl-item\").active=!1;for(this.dom.$items=this.dom.$stage.find(\".owl-item\"),c=0;c<this.num.items;c++)this.dom.$items.eq(c).removeClass(this.options.centerClass),f=this.pos.lcCurrent+c-this.options.items,f>=this.dom.$content.length&&(f-=this.dom.$content.length),f<-this.dom.$content.length&&(f+=this.dom.$content.length),g=this.dom.$content.eq(f),h=this.dom.$items.eq(c),i=h.data(\"owl-item\"),(i.active===!1||0!==this.pos.goToLazyContent||a===!0)&&(h.empty(),h.append(g.clone(!0,!0)),i.active=!0,i.current=!0,i.loaded=this.options.lazyLoad?!1:!0);this.pos.goToLazyContent=0,this.pos.current=this.pos.currentAbs=this.options.items,this.setSpeed(0),this.animStage(this.pos.items[this.options.items])},e.prototype.eventsCall=function(){this.e._onDragStart=function(a){this.onDragStart(a)}.bind(this),this.e._onDragMove=function(a){this.onDragMove(a)}.bind(this),this.e._onDragEnd=function(a){this.onDragEnd(a)}.bind(this),this.e._transitionEnd=function(a){this.transitionEnd(a)}.bind(this),this.e._resizer=function(){this.responsiveTimer()}.bind(this),this.e._responsiveCall=function(){this.responsive()}.bind(this),this.e._preventClick=function(a){this.preventClick(a)}.bind(this),this.e._goToHash=function(){this.goToHash()}.bind(this),this.e._goToPage=function(a){this.goToPage(a)}.bind(this),this.e._ap=function(){this.autoplay()}.bind(this),this.e._play=function(){this.play()}.bind(this),this.e._pause=function(){this.pause()}.bind(this),this.e._playVideo=function(a){this.playVideo(a)}.bind(this),this.e._navNext=function(b){return a(b.target).hasClass(\"disabled\")?!1:(b.preventDefault(),void this.next())}.bind(this),this.e._navPrev=function(b){return a(b.target).hasClass(\"disabled\")?!1:(b.preventDefault(),void this.prev())}.bind(this)},e.prototype.responsiveTimer=function(){return this.windowWidth()===this.width.prevWindow?!1:(b.clearInterval(this.e._autoplay),b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this.e._responsiveCall,this.options.responsiveRefreshRate),void(this.width.prevWindow=this.windowWidth()))},e.prototype.internalEvents=function(){var a=k(),d=l();if(this.dragType=a&&!d?[\"touchstart\",\"touchmove\",\"touchend\",\"touchcancel\"]:a&&d?[\"MSPointerDown\",\"MSPointerMove\",\"MSPointerUp\",\"MSPointerCancel\"]:[\"mousedown\",\"mousemove\",\"mouseup\"],(a||d)&&this.options.touchDrag?this.on(c,this.dragType[3],this.e._onDragEnd):(this.dom.$stage.on(\"dragstart\",function(){return!1}),this.options.mouseDrag?this.dom.stage.onselectstart=function(){return!1}:this.dom.$el.addClass(\"owl-text-select-on\")),this.dom.$stage.on(this.dragType[2],\".owl-video-play-icon\",this.e._playVideo),this.options.URLhashListener&&this.on(b,\"hashchange\",this.e._goToHash,!1),this.options.autoplayHoverPause){this.dom.$stage.on(\"mouseover\",this.e._pause),this.dom.$stage.on(\"mouseleave\",this.e._ap)}this.transitionEndVendor&&this.on(this.dom.stage,this.transitionEndVendor,this.e._transitionEnd,!1),this.options.responsive!==!1&&this.on(b,\"resize\",this.e._resizer,!1),this.updateEvents()},e.prototype.updateEvents=function(){!this.options.touchDrag||\"touchstart\"!==this.dragType[0]&&\"MSPointerDown\"!==this.dragType[0]?this.options.mouseDrag&&\"mousedown\"===this.dragType[0]?this.on(this.dom.stage,this.dragType[0],this.e._onDragStart,!1):this.off(this.dom.stage,this.dragType[0],this.e._onDragStart):this.on(this.dom.stage,this.dragType[0],this.e._onDragStart,!1)},e.prototype.onDragStart=function(a){var d=a.originalEvent||a||b.event;if(3===d.which)return!1;\"mousedown\"===this.dragType[0]&&this.dom.$stage.addClass(\"owl-grab\"),this.fireCallback(\"onTouchStart\"),this.drag.startTime=(new Date).getTime(),this.setSpeed(0),this.state.isTouch=!0,this.state.isScrolling=!1,this.state.isSwiping=!1,this.drag.distance=0;var e=\"touchstart\"===d.type,f=e?a.targetTouches[0].pageX:d.pageX||d.clientX,g=e?a.targetTouches[0].pageY:d.pageY||d.clientY;if(this.drag.offsetX=this.dom.$stage.position().left-this.options.stagePadding,this.drag.offsetY=this.dom.$stage.position().top,this.options.rtl&&(this.drag.offsetX=this.dom.$stage.position().left+this.width.stage-this.width.el+this.options.margin),this.state.inMotion&&this.support3d){var h=this.getTransformProperty();this.drag.offsetX=h,this.animStage(h)}else if(this.state.inMotion&&!this.support3d)return this.state.inMotion=!1,!1;this.drag.startX=f-this.drag.offsetX,this.drag.startY=g-this.drag.offsetY,this.drag.start=f-this.drag.startX,this.drag.targetEl=d.target||d.srcElement,this.drag.updatedX=this.drag.start,this.on(c,this.dragType[1],this.e._onDragMove,!1),this.on(c,this.dragType[2],this.e._onDragEnd,!1)},e.prototype.onDragMove=function(a){if(this.state.isTouch&&!this.state.isScrolling){var c=a.originalEvent||a||b.event,e=\"touchmove\"==c.type,f=e?c.targetTouches[0].pageX:c.pageX||c.clientX,g=e?c.targetTouches[0].pageY:c.pageY||c.clientY;if(this.drag.currentX=f-this.drag.startX,this.drag.currentY=g-this.drag.startY,this.drag.distance=this.drag.currentX-this.drag.offsetX,this.drag.distance<0?this.state.direction=this.options.rtl?\"right\":\"left\":this.drag.distance>0&&(this.state.direction=this.options.rtl?\"left\":\"right\"),this.options.loop)this.op(this.drag.currentX,\">\",this.pos.minValue)&&\"right\"===this.state.direction?this.drag.currentX-=this.pos.loop:this.op(this.drag.currentX,\"<\",this.pos.maxValue)&&\"left\"===this.state.direction&&(this.drag.currentX+=this.pos.loop);else{var h=this.options.rtl?this.pos.maxValue:this.pos.minValue,i=this.options.rtl?this.pos.minValue:this.pos.maxValue,j=this.options.pullDrag?this.drag.distance/5:0;this.drag.currentX=Math.max(Math.min(this.drag.currentX,h+j),i+j)}(this.drag.distance>8||this.drag.distance<-8)&&(c.preventDefault!==d?c.preventDefault():c.returnValue=!1,this.state.isSwiping=!0),this.drag.updatedX=this.drag.currentX,(this.drag.currentY>16||this.drag.currentY<-16)&&this.state.isSwiping===!1&&(this.state.isScrolling=!0,this.drag.updatedX=this.drag.start),this.animStage(this.drag.updatedX)}},e.prototype.onDragEnd=function(){if(this.state.isTouch){if(\"mousedown\"===this.dragType[0]&&this.dom.$stage.removeClass(\"owl-grab\"),this.fireCallback(\"onTouchEnd\"),this.state.isTouch=!1,this.state.isScrolling=!1,this.state.isSwiping=!1,0===this.drag.distance&&this.state.inMotion!==!0)return this.state.inMotion=!1,!1;this.drag.endTime=(new Date).getTime();var a=this.drag.endTime-this.drag.startTime,b=Math.abs(this.drag.distance);(b>3||a>300)&&this.removeClick(this.drag.targetEl);var d=this.closest(this.drag.updatedX);this.setSpeed(this.options.dragEndSpeed,!1,!0),this.animStage(this.pos.items[d]),this.options.pullDrag||this.drag.updatedX!==this.pos.items[d]||this.transitionEnd(),this.drag.distance=0,this.off(c,this.dragType[1],this.e._onDragMove),this.off(c,this.dragType[2],this.e._onDragEnd)}},e.prototype.removeClick=function(a){this.drag.targetEl=a,this.on(a,\"click\",this.e._preventClick,!1)},e.prototype.preventClick=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1,a.stopPropagation&&a.stopPropagation(),this.off(this.drag.targetEl,\"click\",this.e._preventClick,!1)},e.prototype.getTransformProperty=function(){var a=b.getComputedStyle(this.dom.stage,null).getPropertyValue(this.vendorName+\"transform\");a=a.replace(/matrix(3d)?\\(|\\)/g,\"\").split(\",\");var c=16===a.length;return c!==!0?a[4]:a[12]},e.prototype.closest=function(a){var b=0,c=30;if(!this.options.freeDrag)for(var d=0;d<this.num.items;d++)a>this.pos.items[d]-c&&a<this.pos.items[d]+c?b=d:this.op(a,\"<\",this.pos.items[d])&&this.op(a,\">\",this.pos.items[d+1||this.pos.items[d]-this.width.el])&&(b=\"left\"===this.state.direction?d+1:d);return this.options.loop||(this.op(a,\">\",this.pos.minValue)?b=a=this.pos.min:this.op(a,\"<\",this.pos.maxValue)&&(b=a=this.pos.max)),this.options.freeDrag?(this.updateItemState(),a):(this.pos.currentAbs=b,this.pos.current=this.dom.$items.eq(b).data(\"owl-item\").index,b)},e.prototype.animStage=function(a){0!==this.speed.current&&this.pos.currentAbs!==this.pos.min&&(this.fireCallback(\"onTransitionStart\"),this.state.inMotion=!0);var b=this.pos.stage=a,c=this.dom.stage.style;this.support3d?(translate=\"translate3d(\"+b+\"px,0px, 0px)\",c[this.transformVendor]=translate):this.state.isTouch?c.left=b+\"px\":this.dom.$stage.animate({left:b},this.speed.css2speed,this.options.fallbackEasing,function(){this.state.inMotion&&this.transitionEnd()}.bind(this)),this.onChange()},e.prototype.updatePosition=function(a){if(0===this.num.oItems)return!1;if(a===d)return!1;var b=a;return this.pos.prev=this.pos.currentAbs,this.state.revert?(this.pos.current=this.dom.$items.eq(b).data(\"owl-item\").index,void(this.pos.currentAbs=b)):(b=this.options.loop?b>=this.num.oItems?this.num.oItems-1:b:this.options.navRewind?b>this.pos.max?this.pos.min:0>b?this.pos.max:b:b>this.pos.max?this.pos.max:0>=b?0:b,this.pos.current=this.dom.$oItems.eq(b).data(\"owl-item\").index,void(this.pos.currentAbs=this.dom.$oItems.eq(b).data(\"owl-item\").indexAbs))},e.prototype.setSpeed=function(a,b,c){var e=a,f=b;if(e===!1&&0!==e&&c!==!0||e===d){var g=Math.abs(f-this.pos.prev);g=0===g?1:g,g>6&&(g=6),e=g*this.options.smartSpeed}if(e===!1&&c===!0&&(e=this.options.smartSpeed),0===e&&(e=0),this.support3d){var h=this.dom.stage.style;h.webkitTransitionDuration=h.MsTransitionDuration=h.msTransitionDuration=h.MozTransitionDuration=h.OTransitionDuration=h.transitionDuration=e/1e3+\"s\"}else this.speed.css2speed=e;return this.speed.current=e,e},e.prototype.jumpTo=function(a,b){this.state.lazyContent&&(this.pos.goToLazyContent=a),this.updatePosition(a),this.setSpeed(0),this.animStage(this.pos.items[this.pos.currentAbs]),b!==!0&&this.updateItemState()},e.prototype.goTo=function(a,b){return this.state.lazyContent&&this.state.inMotion?!1:(this.updatePosition(a),this.state.animate&&(b=0),this.setSpeed(b,this.pos.currentAbs),this.state.animate&&this.animate(),void this.animStage(this.pos.items[this.pos.currentAbs]))},e.prototype.next=function(a){var b=a||this.options.navSpeed;this.options.loop&&!this.state.lazyContent?this.goToLoop(this.options.slideBy,b):this.goTo(this.pos.current+this.options.slideBy,b)},e.prototype.prev=function(a){var b=a||this.options.navSpeed;this.options.loop&&!this.state.lazyContent?this.goToLoop(-this.options.slideBy,b):this.goTo(this.pos.current-this.options.slideBy,b)},e.prototype.goToLoop=function(a,c){var d=this.pos.currentAbs,e=this.pos.currentAbs,f=this.pos.currentAbs+a,g=0>e-f?!0:!1;this.state.revert=!0,1>f&&g===!1?(this.state.bypass=!0,d=this.num.items-(this.options.items-e)-this.options.items,this.jumpTo(d,!0)):f>=this.num.items-this.options.items&&g===!0&&(this.state.bypass=!0,d=e-this.num.oItems,this.jumpTo(d,!0)),b.clearTimeout(this.e._goToLoop),this.e._goToLoop=b.setTimeout(function(){this.state.bypass=!1,this.goTo(d+a,c),this.state.revert=!1}.bind(this),30)},e.prototype.initPosition=function(a){if(!this.dom.$oItems||!a||this.state.lazyContent)return!1;var b=this.options.startPosition;\"URLHash\"===this.options.startPosition?b=this.options.startPosition=this.hashPosition():typeof this.options.startPosition===Number||this.options.center||(this.options.startPosition=0),this.dom.oStage.scrollLeft=0,this.jumpTo(b,!0)},e.prototype.goToHash=function(){var a=this.hashPosition();a===!1&&(a=0),this.dom.oStage.scrollLeft=0,this.goTo(a,this.options.navSpeed)},e.prototype.hashPosition=function(){var a,c=b.location.hash.substring(1);if(\"\"===c)return!1;for(var d=0;d<this.num.oItems;d++)c===this.dom.$oItems.eq(d).data(\"owl-item\").hash&&(a=d);return a},e.prototype.autoplay=function(){this.options.autoplay&&!this.state.videoPlay?(b.clearInterval(this.e._autoplay),this.e._autoplay=b.setInterval(this.e._play,this.options.autoplayTimeout)):(b.clearInterval(this.e._autoplay),this.state.autoplay=!1)},e.prototype.play=function(a,d){return c.hidden===!0?!1:(this.options.autoplay||(this._options.autoplay=this.options.autoplay=!0,this._options.autoplayTimeout=this.options.autoplayTimeout=a||this.options.autoplayTimeout||4e3,this._options.autoplaySpeed=d||this.options.autoplaySpeed),this.options.autoplay===!1||this.state.isTouch||this.state.isScrolling||this.state.isSwiping||this.state.inMotion?(b.clearInterval(this.e._autoplay),!1):(!this.options.loop&&this.pos.current>=this.pos.max?(b.clearInterval(this.e._autoplay),this.goTo(0)):this.next(this.options.autoplaySpeed),void(this.state.autoplay=!0)))\n},e.prototype.stop=function(){this._options.autoplay=this.options.autoplay=!1,this.state.autoplay=!1,b.clearInterval(this.e._autoplay)},e.prototype.pause=function(){b.clearInterval(this.e._autoplay)},e.prototype.transitionEnd=function(a){if(a!==d){a.stopPropagation();var b=a.target||a.srcElement||a.originalTarget;if(b!==this.dom.stage)return!1}this.state.inMotion=!1,this.updateItemState(),this.autoplay(),this.fireCallback(\"onTransitionEnd\")},e.prototype.isElWidthChanged=function(){var a=this.dom.$el.width()-this.options.stagePadding,b=this.width.el+this.options.margin;return a!==b},e.prototype.windowWidth=function(){return this.options.responsiveBaseElement!==b?this.width.window=a(this.options.responsiveBaseElement).width():b.innerWidth?this.width.window=b.innerWidth:c.documentElement&&c.documentElement.clientWidth&&(this.width.window=c.documentElement.clientWidth),this.width.window},e.prototype.controls=function(){var b=c.createElement(\"div\");b.className=this.options.controlsClass,this.dom.$el.append(b),this.dom.$cc=a(b)},e.prototype.updateControls=function(){null===this.dom.$cc&&(this.options.nav||this.options.dots)&&this.controls(),null===this.dom.$nav&&this.options.nav&&this.createNavigation(this.dom.$cc[0]),null===this.dom.$page&&this.options.dots&&this.createDots(this.dom.$cc[0]),null!==this.dom.$nav&&(this.options.nav?(this.dom.$nav.show(),this.updateNavigation()):this.dom.$nav.hide()),null!==this.dom.$page&&(this.options.dots?(this.dom.$page.show(),this.updateDots()):this.dom.$page.hide())},e.prototype.createNavigation=function(b){var d=c.createElement(\"div\");d.className=this.options.navContainerClass,b.appendChild(d);var e=c.createElement(\"div\"),f=c.createElement(\"div\");e.className=this.options.navClass[0],f.className=this.options.navClass[1],d.appendChild(e),d.appendChild(f),this.dom.$nav=a(d),this.dom.$navPrev=a(e).html(this.options.navText[0]),this.dom.$navNext=a(f).html(this.options.navText[1]),this.dom.$nav.on(this.dragType[2],\".\"+this.options.navClass[0],this.e._navPrev),this.dom.$nav.on(this.dragType[2],\".\"+this.options.navClass[1],this.e._navNext)},e.prototype.createDots=function(b){function d(b){b.preventDefault();var c=a(this).data(\"page\");f.goTo(c,f.options.dotsSpeed)}var e=c.createElement(\"div\");e.className=this.options.dotsClass,b.appendChild(e),this.dom.$page=a(e);var f=this;this.dom.$page.on(this.dragType[2],\".\"+this.options.dotClass,d),this.rebuildDots()},e.prototype.rebuildDots=function(){if(null===this.dom.$page)return!1;var b,d,e,f,g=0,h=0,i=0,j=0;for(b=this.options.dotsEach||this.options.items,(this.options.center||this.options.dotData)&&(b=1),this.dom.$page.html(\"\"),f=0;f<this.num.nav.length;f++){if(g>=b||0===g){d=c.createElement(\"div\"),d.className=this.options.dotClass,e=c.createElement(\"span\"),d.appendChild(e);var k=a(d);this.options.dotData&&k.html(this.dom.$oItems.eq(f).data(\"owl-item\").dot),k.data(\"page\",i),k.data(\"goToPage\",j),this.dom.$page.append(d),g=0,j++}this.dom.$oItems.eq(f).data(\"owl-item\").page=j-1,g+=this.num.nav[f],i++}if(!this.options.loop&&!this.options.center)for(var l=this.num.nav.length-1;l>=0&&(h+=this.num.nav[l],this.dom.$oItems.eq(l).data(\"owl-item\").page=j-1,!(h>=b));l--);this.num.allPages=j-1},e.prototype.updateDots=function(){for(var a=this.dom.$page.children(),b=this.dom.$oItems.eq(this.pos.current).data(\"owl-item\").page,c=0;c<a.length;c++){var d=a.eq(c).data(\"goToPage\");d===b?(this.pos.currentPage=c,a.eq(c).addClass(\"active\")):a.eq(c).removeClass(\"active\")}},e.prototype.updateNavigation=function(){var a=this.options.nav;this.dom.$navNext.toggleClass(\"disabled\",!a),this.dom.$navPrev.toggleClass(\"disabled\",!a),this.options.loop||!a||this.options.navRewind||(this.pos.current<=0&&this.dom.$navPrev.addClass(\"disabled\"),this.pos.current>=this.pos.max&&this.dom.$navNext.addClass(\"disabled\"))},e.prototype.insertContent=function(a){this.dom.$stage.empty(),this.fetchContent(a),this.refresh()},e.prototype.addItem=function(b,c){if(c=c||0,this.state.lazyContent)this.dom.$content=this.dom.$content.add(a(b)),this.updateItemState(!0);else{var d=this.fillItem(b);if(0===this.dom.$oItems.length)this.dom.$stage.append(d);else{var e=this.dom.$oItems.eq(c);-1!==c?e.before(d):e.after(d)}this.refresh()}},e.prototype.removeItem=function(a){this.state.lazyContent?(this.dom.$content.splice(a,1),this.updateItemState(!0)):(this.dom.$oItems.eq(a).remove(),this.refresh())},e.prototype.addCustomEvents=function(){this.e.next=function(a,b){this.next(b)}.bind(this),this.e.prev=function(a,b){this.prev(b)}.bind(this),this.e.goTo=function(a,b,c){this.goTo(b,c)}.bind(this),this.e.jumpTo=function(a,b){this.jumpTo(b)}.bind(this),this.e.addItem=function(a,b,c){this.addItem(b,c)}.bind(this),this.e.removeItem=function(a,b){this.removeItem(b)}.bind(this),this.e.refresh=function(){this.refresh()}.bind(this),this.e.destroy=function(){this.destroy()}.bind(this),this.e.autoHeight=function(){this.autoHeight(!0)}.bind(this),this.e.stop=function(){this.stop()}.bind(this),this.e.play=function(a,b,c){this.play(b,c)}.bind(this),this.e.insertContent=function(a,b){this.insertContent(b)}.bind(this),this.dom.$el.on(\"next.owl\",this.e.next),this.dom.$el.on(\"prev.owl\",this.e.prev),this.dom.$el.on(\"goTo.owl\",this.e.goTo),this.dom.$el.on(\"jumpTo.owl\",this.e.jumpTo),this.dom.$el.on(\"addItem.owl\",this.e.addItem),this.dom.$el.on(\"removeItem.owl\",this.e.removeItem),this.dom.$el.on(\"destroy.owl\",this.e.destroy),this.dom.$el.on(\"refresh.owl\",this.e.refresh),this.dom.$el.on(\"autoHeight.owl\",this.e.autoHeight),this.dom.$el.on(\"play.owl\",this.e.play),this.dom.$el.on(\"stop.owl\",this.e.stop),this.dom.$el.on(\"stopVideo.owl\",this.e.stop),this.dom.$el.on(\"insertContent.owl\",this.e.insertContent)},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent(\"on\"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent(\"on\"+b,c)},e.prototype.fireCallback=function(a,b){if(this.options.callbacks){if(this.dom.el.dispatchEvent){var d=c.createEvent(\"CustomEvent\");return d.initCustomEvent(a,!0,!0,b),this.dom.el.dispatchEvent(d)}return this.dom.el.dispatchEvent?void 0:this.dom.$el.trigger(a)}},e.prototype.watchVisibility=function(){function a(a){return a.offsetWidth>0&&a.offsetHeight>0}function c(){a(this.dom.el)&&(this.dom.$el.removeClass(\"owl-hidden\"),this.refresh(),b.clearInterval(this.e._checkVisibile))}a(this.dom.el)||(this.dom.$el.addClass(\"owl-hidden\"),b.clearInterval(this.e._checkVisibile),this.e._checkVisibile=b.setInterval(c.bind(this),500))},e.prototype.onChange=function(){this.state.isTouch||this.state.bypass||this.state.responsive||((this.options.nav||this.options.dots)&&this.updateControls(),this.autoHeight(),this.fireCallback(\"onChangeState\")),this.state.isTouch||this.state.bypass||(this.storeInfo(),this.state.videoPlay&&this.stopVideo())},e.prototype.storeInfo=function(){var a=this.state.lazyContent?this.pos.lcCurrentAbs||0:this.pos.current,b=this.state.lazyContent?this.dom.$content.length-1:this.num.oItems;this.info={items:this.options.items,allItems:b,currentPosition:a,currentPage:this.pos.currentPage,allPages:this.num.allPages,autoplay:this.state.autoplay,windowWidth:this.width.window,elWidth:this.width.el,breakpoint:this.num.breakpoint},\"function\"==typeof this.options.info&&this.options.info.apply(this,[this.info,this.dom.el])},e.prototype.autoHeight=function(a){if(this.options.autoHeight!==!0&&a!==!0)return!1;this.dom.$oStage.hasClass(this.options.autoHeightClass)||this.dom.$oStage.addClass(this.options.autoHeightClass);var c=this.dom.$items.eq(this.pos.currentAbs),d=this.dom.$oStage,e=0,f=b.setInterval(function(){e+=1,c.data(\"owl-item\").loaded?(d.height(c.height()+\"px\"),clearInterval(f)):500===e&&clearInterval(f)},100)},e.prototype.preloadAutoWidthImages=function(b){var c=0,d=this;b.each(function(e,f){var g=a(f),h=new Image;h.onload=function(){c++,g.attr(\"src\",h.src),g.css(\"opacity\",1),c>=b.length&&(d.state.imagesLoaded=!0,d.init())},h.src=g.attr(\"src\")||g.attr(\"data-src\")||g.attr(\"data-src-retina\")})},e.prototype.lazyLoad=function(){var a,b,c,d=m()?\"data-src-retina\":\"data-src\";for(c=0;c<this.num.items;c++){var e=this.dom.$items.eq(c);e.data(\"owl-item\").current===!0&&e.data(\"owl-item\").loaded===!1&&(b=e.find(\".owl-lazy\"),a=b.attr(d),a=a||b.attr(\"data-src\"),a&&(b.css(\"opacity\",\"0\"),this.preload(b,e)))}},e.prototype.preload=function(b,c){var d=this;b.each(function(b,e){var f=a(e),g=new Image;g.onload=function(){c.data(\"owl-item\").loaded=!0,f.is(\"img\")?f.attr(\"src\",g.src):f.css(\"background-image\",\"url(\"+g.src+\")\"),f.css(\"opacity\",1),d.fireCallback(\"onLazyLoaded\")},g.src=f.attr(\"data-src\")||f.attr(\"data-src-retina\")})},e.prototype.animate=function(){var b=this.dom.$items.eq(this.pos.prev),c=Math.abs(b.data(\"owl-item\").width)*this.pos.prev,d=this.dom.$items.eq(this.pos.currentAbs),e=Math.abs(d.data(\"owl-item\").width)*this.pos.currentAbs;if(this.pos.currentAbs===this.pos.prev)return!1;var f=e-c,g=this.options.animateIn,h=this.options.animateOut,i=this;removeStyles=function(){a(this).css({left:\"\"}).removeClass(\"animated owl-animated-out owl-animated-in\").removeClass(g).removeClass(h),i.transitionEnd()},h&&b.css({left:f+\"px\"}).addClass(\"animated owl-animated-out \"+h).one(\"webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend\",removeStyles),g&&d.addClass(\"animated owl-animated-in \"+g).one(\"webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend\",removeStyles)},e.prototype.destroy=function(){b.clearInterval(this.e._autoplay),this.dom.$el.hasClass(this.options.themeClass)&&this.dom.$el.removeClass(this.options.themeClass),this.options.responsive!==!1&&this.off(b,\"resize\",this.e._resizer),this.transitionEndVendor&&this.off(this.dom.stage,this.transitionEndVendor,this.e._transitionEnd),(this.options.mouseDrag||this.options.touchDrag)&&(this.off(this.dom.stage,this.dragType[0],this.e._onDragStart),this.options.mouseDrag&&this.off(c,this.dragType[3],this.e._onDragStart),this.options.mouseDrag&&(this.dom.$stage.off(\"dragstart\",function(){return!1}),this.dom.stage.onselectstart=function(){})),this.options.URLhashListener&&this.off(b,\"hashchange\",this.e._goToHash),this.dom.$el.off(\"next.owl\",this.e.next),this.dom.$el.off(\"prev.owl\",this.e.prev),this.dom.$el.off(\"goTo.owl\",this.e.goTo),this.dom.$el.off(\"jumpTo.owl\",this.e.jumpTo),this.dom.$el.off(\"addItem.owl\",this.e.addItem),this.dom.$el.off(\"removeItem.owl\",this.e.removeItem),this.dom.$el.off(\"refresh.owl\",this.e.refresh),this.dom.$el.off(\"autoHeight.owl\",this.e.autoHeight),this.dom.$el.off(\"play.owl\",this.e.play),this.dom.$el.off(\"stop.owl\",this.e.stop),this.dom.$el.off(\"stopVideo.owl\",this.e.stop),this.dom.$stage.off(\"click\",this.e._playVideo),null!==this.dom.$cc&&this.dom.$cc.remove(),null!==this.dom.$cItems&&this.dom.$cItems.remove(),this.e=null,this.dom.$el.data(\"owlCarousel\",null),delete this.dom.el.owlCarousel,this.dom.$stage.unwrap(),this.dom.$items.unwrap(),this.dom.$items.contents().unwrap(),this.dom=null},e.prototype.op=function(a,b,c){var d=this.options.rtl;switch(b){case\"<\":return d?a>c:c>a;case\">\":return d?c>a:a>c;case\">=\":return d?c>=a:a>=c;case\"<=\":return d?a>=c:c>=a}},e.prototype.browserSupport=function(){if(this.support3d=j(),this.support3d){this.transformVendor=h();var a=[\"transitionend\",\"webkitTransitionEnd\",\"transitionend\",\"oTransitionEnd\"];this.transitionEndVendor=a[g()],this.vendorName=this.transformVendor.replace(/Transform/i,\"\"),this.vendorName=\"\"!==this.vendorName?\"-\"+this.vendorName.toLowerCase()+\"-\":\"\"}this.state.orientation=b.orientation},a.fn.owlCarousel=function(b){return this.each(function(){a(this).data(\"owlCarousel\")||a(this).data(\"owlCarousel\",new e(this,b))})}}(window.Zepto||window.jQuery,window,document),Function.prototype.bind||(Function.prototype.bind=function(a){if(\"function\"!=typeof this)throw new TypeError(\"Function.prototype.bind - what is trying to be bound is not callable\");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e});"
  },
  {
    "path": "works/demo/ali/file/pb_v.0.0.js",
    "content": "var uigs_clpingbackurl=\"http://pb.sogou.com/cl.gif\";var uigs_pvpingbackurl=\"http://pb.sogou.com/pv.gif\";var uigs_version=\"v1.1\";var uigs_staytime=new Date().getTime();if(typeof (uigs_para)!=\"undefined\"&&typeof (uigs_para.uigs_clpingbackurl)!=\"undefined\"&&uigs_para.uigs_clpingbackurl!=\"\"){uigs_clpingbackurl=uigs_para.uigs_clpingbackurl}if(typeof (uigs_para)!=\"undefined\"&&typeof (uigs_para.uigs_pvpingbackurl)!=\"undefined\"&&uigs_para.uigs_pvpingbackurl!=\"\"){uigs_pvpingbackurl=uigs_para.uigs_pvpingbackurl}var uigs_cookieArray=new Array();var uigs_acookie=document.cookie.split(\"; \");var uigs_pbs=new Array();for(var i=0;i<uigs_acookie.length;i++){var arr=uigs_acookie[i].split(\"=\");uigs_cookieArray[arr[0]]=arr[1]}function uigs_getCookie(A){return uigs_cookieArray[A]}function uigs_getCookiePara(){var A=\"\";if(typeof (uigs_para)!=\"undefined\"){if(typeof (uigs_para.uigs_cookie)==\"undefined\"){}else{var B=uigs_para.uigs_cookie.split(\",\");for(i in B){if(typeof (uigs_getCookie(B[i]))!=\"undefined\"){if(B[i]!=\"SUV\"){if(A==\"\"){A=B[i]+\"=\"+uigs_getCookie(B[i])}else{A=A+\"&\"+B[i]+\"=\"+uigs_getCookie(B[i])}}}}}}return encodeURIComponent(A)}uigs_d=escape((new Date().getTime())*1000+Math.round(Math.random()*1000));if(typeof (uigs_para)!=\"undefined\"&&typeof (uigs_para.uigs_uuid)==\"undefined\"){uigs_para.uigs_uuid=uigs_d}function uigs_getPingbackhead(){if(typeof (uigs_para)!=\"undefined\"&&typeof (uigs_para.uigs_productid)!=\"undefined\"){uigs_c=escape((new Date().getTime())*1000+Math.round(Math.random()*1000));r=(typeof (encodeURIComponent)==\"function\")?encodeURIComponent(document.referrer):document.referrer;var A=\"?uigs_productid=\"+uigs_para.uigs_productid+\"&uigs_t=\"+uigs_c;if(typeof (uigs_para.uigs_cookie)==\"undefined\"){}else{A+=\"&uigs_cookie=\"+uigs_getCookiePara()}if(typeof (uigs_para.uigs_uuid)!=\"undefined\"){A+=\"&uigs_uuid=\"+uigs_para.uigs_uuid}for(i in uigs_para){if(i==\"uigs_cookie\"||i==\"uigs_uuid\"||i==\"uigs_productid\"){}else{A+=\"&\"+encodeURIComponent(i)+\"=\"+encodeURIComponent(uigs_para[i])}}A+=\"&uigs_version=\"+uigs_version+\"&uigs_refer=\"+r;return A}else{return\"\"}}function uigs_pv(){if(!uigs_getCookie(\"SUV\")){uigs_c=escape((new Date().getTime())*1000+Math.round(Math.random()*1000));cookie=\"SUV=\"+uigs_c+\";path=/;expires=Tue, 19-Jan-2046 00:00:00 GMT;domain=sogou.com\"}if(typeof (uigs_para)!=\"undefined\"&&typeof (uigs_para.uigs_productid)!=\"undefined\"){var C=uigs_staytime;if(uigs_staytime<0){C=0-uigs_staytime}var A=uigs_pvpingbackurl+uigs_getPingbackhead();var B=uigs_pbs.length;uigs_pbs[B]=new Image();uigs_pbs[B].src=A}}var uigs_spv;if(typeof (uigs_pvflag)==\"undefined\"||!uigs_pvflag){if(!uigs_spv){uigs_pv()}}uigs_spv=1;$uigs_d=document;var uigs_oldclick=$uigs_d.onclick;$uigs_d.onclick=function(A){var B;if(uigs_oldclick){B=uigs_oldclick(A)}uigs_clickit(A);return B};var uigs_clickit=function(D){if(typeof (uigs_para)!=\"undefined\"&&typeof (uigs_para.uigs_productid)!=\"undefined\"){if((D&&(D.button!=0))||((!D)&&(window.event.button!=0))){return }try{D=D||window.event;var G=((D.target)?D.target:D.srcElement);var C=\"\";var H=\"\";var A=\"\";var E=\"\";while(C==\"\"){A=G.tagName.toUpperCase();if(!C){C=G.uigs||G.getAttribute(\"uigs\")||\"\"}if(C&&C==\"nouigs\"){return }if(A==\"A\"||A==\"LINK\"||A==\"AREA\"||A==\"INPUT\"||A==\"DIV\"){H=A}if(G.href){E=G.href}try{if(H==uigs_para.uigs_pbtag){C=G.id||G.getAttribute(\"id\")||\"\";while(C==\"\"){if(G.parentNode){G=G.parentNode}else{break}if(!G.tagName){break}if(!C){C=G.id||G.getAttribute(\"id\")||\"\"}}break}}catch(B){}if(G.parentNode){G=G.parentNode}else{break}if(!G.tagName){break}}if((H&&(C))||(H&&H==uigs_para.uigs_pbtag)){uigsPB(C+\"&href=\"+E)}}catch(F){}}};function uigsPB(A){if(typeof (uigs_para)!=\"undefined\"&&typeof (uigs_para.uigs_productid)!=\"undefined\"){var D=uigs_staytime;if(uigs_staytime<0){D=0-uigs_staytime}var B=uigs_clpingbackurl+uigs_getPingbackhead()+\"&uigs_st=\"+parseInt((new Date().getTime()-D)/1000)+\"&uigs_cl=\"+encodeURIComponent(A);var C=uigs_pbs.length;uigs_pbs[C]=new Image();uigs_pbs[C].src=B}}var uigs_al=false;function uigs_iecompattest(){return(document.compatMode&&document.compatMode!=\"BackCompat\")?document.documentElement:document.body}var uigs_judgeBottom=function(){try{var B=uigs_iecompattest().clientHeight;var A=uigs_iecompattest().scrollHeight;var F=uigs_iecompattest().scrollTop;if(F>100&&A-B-F<100&&!uigs_al){uigs_al=true;var C=\"\";var D=uigs_staytime;if(uigs_staytime<0){D=0-uigs_staytime}C=\"tob=\"+parseInt((new Date().getTime()-D)/1000);uigsPB(C)}}catch(E){}};window.setInterval(uigs_judgeBottom,100);"
  },
  {
    "path": "works/demo/ali/file/prototype.js",
    "content": "function $A(a){if(!a)return[];if(\"toArray\"in Object(a))return a.toArray();for(var b=a.length||0,c=new Array(b);b--;)c[b]=a[b];return c}function $w(a){return Object.isString(a)?(a=a.strip(),a?a.split(/\\s+/):[]):[]}function $H(a){return new Hash(a)}function $R(a,b,c){return new ObjectRange(a,b,c)}function $(a){if(arguments.length>1){for(var b=0,c=[],d=arguments.length;d>b;b++)c.push($(arguments[b]));return c}return Object.isString(a)&&(a=document.getElementById(a)),Element.extend(a)}var Prototype={Version:\"1.7\",Browser:function(){var a=navigator.userAgent,b=\"[object Opera]\"==Object.prototype.toString.call(window.opera);return{IE:!!window.attachEvent&&!b,Opera:b,WebKit:a.indexOf(\"AppleWebKit/\")>-1,Gecko:a.indexOf(\"Gecko\")>-1&&-1===a.indexOf(\"KHTML\"),MobileSafari:/Apple.*Mobile/.test(a)}}(),BrowserFeatures:{XPath:!!document.evaluate,SelectorsAPI:!!document.querySelector,ElementExtensions:function(){var a=window.Element||window.HTMLElement;return!(!a||!a.prototype)}(),SpecificElementExtensions:function(){if(\"undefined\"!=typeof window.HTMLDivElement)return!0;var a=document.createElement(\"div\"),b=document.createElement(\"form\"),c=!1;return a.__proto__&&a.__proto__!==b.__proto__&&(c=!0),a=b=null,c}()},ScriptFragment:\"<script[^>]*>([\\\\S\\\\s]*?)</script>\",JSONFilter:/^\\/\\*-secure-([\\s\\S]*)\\*\\/\\s*$/,emptyFunction:function(){},K:function(a){return a}};Prototype.Browser.MobileSafari&&(Prototype.BrowserFeatures.SpecificElementExtensions=!1);var Abstract={},Try={these:function(){for(var a,b=0,c=arguments.length;c>b;b++){var d=arguments[b];try{a=d();break}catch(e){}}return a}},Class=function(){function a(){}function b(){function b(){this.initialize.apply(this,arguments)}var c=null,d=$A(arguments);Object.isFunction(d[0])&&(c=d.shift()),Object.extend(b,Class.Methods),b.superclass=c,b.subclasses=[],c&&(a.prototype=c.prototype,b.prototype=new a,c.subclasses.push(b));for(var e=0,f=d.length;f>e;e++)b.addMethods(d[e]);return b.prototype.initialize||(b.prototype.initialize=Prototype.emptyFunction),b.prototype.constructor=b,b}function c(a){var b=this.superclass&&this.superclass.prototype,c=Object.keys(a);d&&(a.toString!=Object.prototype.toString&&c.push(\"toString\"),a.valueOf!=Object.prototype.valueOf&&c.push(\"valueOf\"));for(var e=0,f=c.length;f>e;e++){var g=c[e],h=a[g];if(b&&Object.isFunction(h)&&\"$super\"==h.argumentNames()[0]){var i=h;h=function(a){return function(){return b[a].apply(this,arguments)}}(g).wrap(i),h.valueOf=i.valueOf.bind(i),h.toString=i.toString.bind(i)}this.prototype[g]=h}return this}var d=function(){for(var a in{toString:1})if(\"toString\"===a)return!1;return!0}();return{create:b,Methods:{addMethods:c}}}();!function(){function a(a){switch(a){case null:return u;case void 0:return v}var b=typeof a;switch(b){case\"boolean\":return w;case\"number\":return x;case\"string\":return y}return z}function b(a,b){for(var c in b)a[c]=b[c];return a}function c(a){try{return s(a)?\"undefined\":null===a?\"null\":a.inspect?a.inspect():String(a)}catch(b){if(b instanceof RangeError)return\"...\";throw b}}function d(a){return e(\"\",{\"\":a},[])}function e(b,c,d){var f=c[b],g=typeof f;a(f)===z&&\"function\"==typeof f.toJSON&&(f=f.toJSON(b));var h=t.call(f);switch(h){case C:case B:case D:f=f.valueOf()}switch(f){case null:return\"null\";case!0:return\"true\";case!1:return\"false\"}switch(g=typeof f){case\"string\":return f.inspect(!0);case\"number\":return isFinite(f)?String(f):\"null\";case\"object\":for(var i=0,j=d.length;j>i;i++)if(d[i]===f)throw new TypeError;d.push(f);var k=[];if(h===E){for(var i=0,j=f.length;j>i;i++){var l=e(i,f,d);k.push(\"undefined\"==typeof l?\"null\":l)}k=\"[\"+k.join(\",\")+\"]\"}else{for(var m=Object.keys(f),i=0,j=m.length;j>i;i++){var b=m[i],l=e(b,f,d);\"undefined\"!=typeof l&&k.push(b.inspect(!0)+\":\"+l)}k=\"{\"+k.join(\",\")+\"}\"}return d.pop(),k}}function f(a){return JSON.stringify(a)}function g(a){return $H(a).toQueryString()}function h(a){return a&&a.toHTML?a.toHTML():String.interpret(a)}function i(b){if(a(b)!==z)throw new TypeError;var c=[];for(var d in b)b.hasOwnProperty(d)&&c.push(d);return c}function j(a){var b=[];for(var c in a)b.push(a[c]);return b}function k(a){return b({},a)}function l(a){return!(!a||1!=a.nodeType)}function m(a){return t.call(a)===E}function n(a){return a instanceof Hash}function o(a){return t.call(a)===A}function p(a){return t.call(a)===D}function q(a){return t.call(a)===C}function r(a){return t.call(a)===F}function s(a){return\"undefined\"==typeof a}var t=Object.prototype.toString,u=\"Null\",v=\"Undefined\",w=\"Boolean\",x=\"Number\",y=\"String\",z=\"Object\",A=\"[object Function]\",B=\"[object Boolean]\",C=\"[object Number]\",D=\"[object String]\",E=\"[object Array]\",F=\"[object Date]\",G=window.JSON&&\"function\"==typeof JSON.stringify&&\"0\"===JSON.stringify(0)&&\"undefined\"==typeof JSON.stringify(Prototype.K),H=\"function\"==typeof Array.isArray&&Array.isArray([])&&!Array.isArray({});H&&(m=Array.isArray),b(Object,{extend:b,inspect:c,toJSON:G?f:d,toQueryString:g,toHTML:h,keys:Object.keys||i,values:j,clone:k,isElement:l,isArray:m,isHash:n,isFunction:o,isString:p,isNumber:q,isDate:r,isUndefined:s})}(),Object.extend(Function.prototype,function(){function a(a,b){for(var c=a.length,d=b.length;d--;)a[c+d]=b[d];return a}function b(b,c){return b=k.call(b,0),a(b,c)}function c(){var a=this.toString().match(/^[\\s\\(]*function[^(]*\\(([^)]*)\\)/)[1].replace(/\\/\\/.*?[\\r\\n]|\\/\\*(?:.|[\\r\\n])*?\\*\\//g,\"\").replace(/\\s+/g,\"\").split(\",\");return 1!=a.length||a[0]?a:[]}function d(a){if(arguments.length<2&&Object.isUndefined(arguments[0]))return this;var c=this,d=k.call(arguments,1);return function(){var e=b(d,arguments);return c.apply(a,e)}}function e(b){var c=this,d=k.call(arguments,1);return function(e){var f=a([e||window.event],d);return c.apply(b,f)}}function f(){if(!arguments.length)return this;var a=this,c=k.call(arguments,0);return function(){var d=b(c,arguments);return a.apply(this,d)}}function g(a){var b=this,c=k.call(arguments,1);return a=1e3*a,window.setTimeout(function(){return b.apply(b,c)},a)}function h(){var b=a([.01],arguments);return this.delay.apply(this,b)}function i(b){var c=this;return function(){var d=a([c.bind(this)],arguments);return b.apply(this,d)}}function j(){if(this._methodized)return this._methodized;var b=this;return this._methodized=function(){var c=a([this],arguments);return b.apply(null,c)}}var k=Array.prototype.slice;return{argumentNames:c,bind:d,bindAsEventListener:e,curry:f,delay:g,defer:h,wrap:i,methodize:j}}()),function(a){function b(){return this.getUTCFullYear()+\"-\"+(this.getUTCMonth()+1).toPaddedString(2)+\"-\"+this.getUTCDate().toPaddedString(2)+\"T\"+this.getUTCHours().toPaddedString(2)+\":\"+this.getUTCMinutes().toPaddedString(2)+\":\"+this.getUTCSeconds().toPaddedString(2)+\"Z\"}function c(){return this.toISOString()}a.toISOString||(a.toISOString=b),a.toJSON||(a.toJSON=c)}(Date.prototype),RegExp.prototype.match=RegExp.prototype.test,RegExp.escape=function(a){return String(a).replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g,\"\\\\$1\")};var PeriodicalExecuter=Class.create({initialize:function(a,b){this.callback=a,this.frequency=b,this.currentlyExecuting=!1,this.registerCallback()},registerCallback:function(){this.timer=setInterval(this.onTimerEvent.bind(this),1e3*this.frequency)},execute:function(){this.callback(this)},stop:function(){this.timer&&(clearInterval(this.timer),this.timer=null)},onTimerEvent:function(){if(!this.currentlyExecuting)try{this.currentlyExecuting=!0,this.execute(),this.currentlyExecuting=!1}catch(a){throw this.currentlyExecuting=!1,a}}});Object.extend(String,{interpret:function(a){return null==a?\"\":String(a)},specialChar:{\"\\b\":\"\\\\b\",\"\t\":\"\\\\t\",\"\\n\":\"\\\\n\",\"\\f\":\"\\\\f\",\"\\r\":\"\\\\r\",\"\\\\\":\"\\\\\\\\\"}}),Object.extend(String.prototype,function(){function prepareReplacement(a){if(Object.isFunction(a))return a;var b=new Template(a);return function(a){return b.evaluate(a)}}function gsub(a,b){var c,d=\"\",e=this;if(b=prepareReplacement(b),Object.isString(a)&&(a=RegExp.escape(a)),!a.length&&!a.source)return b=b(\"\"),b+e.split(\"\").join(b)+b;for(;e.length>0;)(c=e.match(a))?(d+=e.slice(0,c.index),d+=String.interpret(b(c)),e=e.slice(c.index+c[0].length)):(d+=e,e=\"\");return d}function sub(a,b,c){return b=prepareReplacement(b),c=Object.isUndefined(c)?1:c,this.gsub(a,function(a){return--c<0?a[0]:b(a)})}function scan(a,b){return this.gsub(a,b),String(this)}function truncate(a,b){return a=a||30,b=Object.isUndefined(b)?\"...\":b,this.length>a?this.slice(0,a-b.length)+b:String(this)}function strip(){return this.replace(/^\\s+/,\"\").replace(/\\s+$/,\"\")}function stripTags(){return this.replace(/<\\w+(\\s+(\"[^\"]*\"|'[^']*'|[^>])+)?>|<\\/\\w+>/gi,\"\")}function stripScripts(){return this.replace(new RegExp(Prototype.ScriptFragment,\"img\"),\"\")}function extractScripts(){var a=new RegExp(Prototype.ScriptFragment,\"img\"),b=new RegExp(Prototype.ScriptFragment,\"im\");return(this.match(a)||[]).map(function(a){return(a.match(b)||[\"\",\"\"])[1]})}function evalScripts(){return this.extractScripts().map(function(script){return eval(script)})}function escapeHTML(){return this.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function unescapeHTML(){return this.stripTags().replace(/&lt;/g,\"<\").replace(/&gt;/g,\">\").replace(/&amp;/g,\"&\")}function toQueryParams(a){var b=this.strip().match(/([^?#]*)(#.*)?$/);return b?b[1].split(a||\"&\").inject({},function(a,b){if((b=b.split(\"=\"))[0]){var c=decodeURIComponent(b.shift()),d=b.length>1?b.join(\"=\"):b[0];void 0!=d&&(d=decodeURIComponent(d)),c in a?(Object.isArray(a[c])||(a[c]=[a[c]]),a[c].push(d)):a[c]=d}return a}):{}}function toArray(){return this.split(\"\")}function succ(){return this.slice(0,this.length-1)+String.fromCharCode(this.charCodeAt(this.length-1)+1)}function times(a){return 1>a?\"\":new Array(a+1).join(this)}function camelize(){return this.replace(/-+(.)?/g,function(a,b){return b?b.toUpperCase():\"\"})}function capitalize(){return this.charAt(0).toUpperCase()+this.substring(1).toLowerCase()}function underscore(){return this.replace(/::/g,\"/\").replace(/([A-Z]+)([A-Z][a-z])/g,\"$1_$2\").replace(/([a-z\\d])([A-Z])/g,\"$1_$2\").replace(/-/g,\"_\").toLowerCase()}function dasherize(){return this.replace(/_/g,\"-\")}function inspect(a){var b=this.replace(/[\\x00-\\x1f\\\\]/g,function(a){return a in String.specialChar?String.specialChar[a]:\"\\\\u00\"+a.charCodeAt().toPaddedString(2,16)});return a?'\"'+b.replace(/\"/g,'\\\\\"')+'\"':\"'\"+b.replace(/'/g,\"\\\\'\")+\"'\"}function unfilterJSON(a){return this.replace(a||Prototype.JSONFilter,\"$1\")}function isJSON(){var a=this;return a.blank()?!1:(a=a.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g,\"@\"),a=a.replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g,\"]\"),a=a.replace(/(?:^|:|,)(?:\\s*\\[)+/g,\"\"),/^[\\],:{}\\s]*$/.test(a))}function evalJSON(sanitize){var json=this.unfilterJSON(),cx=/[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;cx.test(json)&&(json=json.replace(cx,function(a){return\"\\\\u\"+(\"0000\"+a.charCodeAt(0).toString(16)).slice(-4)}));try{if(!sanitize||json.isJSON())return eval(\"(\"+json+\")\")}catch(e){}throw new SyntaxError(\"Badly formed JSON string: \"+this.inspect())}function parseJSON(){var a=this.unfilterJSON();return JSON.parse(a)}function include(a){return this.indexOf(a)>-1}function startsWith(a){return 0===this.lastIndexOf(a,0)}function endsWith(a){var b=this.length-a.length;return b>=0&&this.indexOf(a,b)===b}function empty(){return\"\"==this}function blank(){return/^\\s*$/.test(this)}function interpolate(a,b){return new Template(this,b).evaluate(a)}var NATIVE_JSON_PARSE_SUPPORT=window.JSON&&\"function\"==typeof JSON.parse&&JSON.parse('{\"test\": true}').test;return{gsub:gsub,sub:sub,scan:scan,truncate:truncate,strip:String.prototype.trim||strip,stripTags:stripTags,stripScripts:stripScripts,extractScripts:extractScripts,evalScripts:evalScripts,escapeHTML:escapeHTML,unescapeHTML:unescapeHTML,toQueryParams:toQueryParams,parseQuery:toQueryParams,toArray:toArray,succ:succ,times:times,camelize:camelize,capitalize:capitalize,underscore:underscore,dasherize:dasherize,inspect:inspect,unfilterJSON:unfilterJSON,isJSON:isJSON,evalJSON:NATIVE_JSON_PARSE_SUPPORT?parseJSON:evalJSON,include:include,startsWith:startsWith,endsWith:endsWith,empty:empty,blank:blank,interpolate:interpolate}}());var Template=Class.create({initialize:function(a,b){this.template=a.toString(),this.pattern=b||Template.Pattern},evaluate:function(a){return a&&Object.isFunction(a.toTemplateReplacements)&&(a=a.toTemplateReplacements()),this.template.gsub(this.pattern,function(b){if(null==a)return b[1]+\"\";var c=b[1]||\"\";if(\"\\\\\"==c)return b[2];var d=a,e=b[3],f=/^([^.[]+|\\[((?:.*?[^\\\\])?)\\])(\\.|\\[|$)/;if(b=f.exec(e),null==b)return c;for(;null!=b;){var g=b[1].startsWith(\"[\")?b[2].replace(/\\\\\\\\]/g,\"]\"):b[1];if(d=d[g],null==d||\"\"==b[3])break;e=e.substring(\"[\"==b[3]?b[1].length:b[0].length),b=f.exec(e)}return c+String.interpret(d)})}});Template.Pattern=/(^|.|\\r|\\n)(#\\{(.*?)\\})/;var $break={},Enumerable=function(){function a(a,b){var c=0;try{this._each(function(d){a.call(b,d,c++)})}catch(d){if(d!=$break)throw d}return this}function b(a,b,c){var d=-a,e=[],f=this.toArray();if(1>a)return f;for(;(d+=a)<f.length;)e.push(f.slice(d,d+a));return e.collect(b,c)}function c(a,b){a=a||Prototype.K;var c=!0;return this.each(function(d,e){if(c=c&&!!a.call(b,d,e),!c)throw $break}),c}function d(a,b){a=a||Prototype.K;var c=!1;return this.each(function(d,e){if(c=!!a.call(b,d,e))throw $break}),c}function e(a,b){a=a||Prototype.K;var c=[];return this.each(function(d,e){c.push(a.call(b,d,e))}),c}function f(a,b){var c;return this.each(function(d,e){if(a.call(b,d,e))throw c=d,$break}),c}function g(a,b){var c=[];return this.each(function(d,e){a.call(b,d,e)&&c.push(d)}),c}function h(a,b,c){b=b||Prototype.K;var d=[];return Object.isString(a)&&(a=new RegExp(RegExp.escape(a))),this.each(function(e,f){a.match(e)&&d.push(b.call(c,e,f))}),d}function i(a){if(Object.isFunction(this.indexOf)&&-1!=this.indexOf(a))return!0;var b=!1;return this.each(function(c){if(c==a)throw b=!0,$break}),b}function j(a,b){return b=Object.isUndefined(b)?null:b,this.eachSlice(a,function(c){for(;c.length<a;)c.push(b);return c})}function k(a,b,c){return this.each(function(d,e){a=b.call(c,a,d,e)}),a}function l(a){var b=$A(arguments).slice(1);return this.map(function(c){return c[a].apply(c,b)})}function m(a,b){a=a||Prototype.K;var c;return this.each(function(d,e){d=a.call(b,d,e),(null==c||d>=c)&&(c=d)}),c}function n(a,b){a=a||Prototype.K;var c;return this.each(function(d,e){d=a.call(b,d,e),(null==c||c>d)&&(c=d)}),c}function o(a,b){a=a||Prototype.K;var c=[],d=[];return this.each(function(e,f){(a.call(b,e,f)?c:d).push(e)}),[c,d]}function p(a){var b=[];return this.each(function(c){b.push(c[a])}),b}function q(a,b){var c=[];return this.each(function(d,e){a.call(b,d,e)||c.push(d)}),c}function r(a,b){return this.map(function(c,d){return{value:c,criteria:a.call(b,c,d)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return d>c?-1:c>d?1:0}).pluck(\"value\")}function s(){return this.map()}function t(){var a=Prototype.K,b=$A(arguments);Object.isFunction(b.last())&&(a=b.pop());var c=[this].concat(b).map($A);return this.map(function(b,d){return a(c.pluck(d))})}function u(){return this.toArray().length}function v(){return\"#<Enumerable:\"+this.toArray().inspect()+\">\"}return{each:a,eachSlice:b,all:c,every:c,any:d,some:d,collect:e,map:e,detect:f,findAll:g,select:g,filter:g,grep:h,include:i,member:i,inGroupsOf:j,inject:k,invoke:l,max:m,min:n,partition:o,pluck:p,reject:q,sortBy:r,toArray:s,entries:s,zip:t,size:u,inspect:v,find:f}}();Array.from=$A,function(){function a(a,b){for(var c=0,d=this.length>>>0;d>c;c++)c in this&&a.call(b,this[c],c,this)}function b(){return this.length=0,this}function c(){return this[0]}function d(){return this[this.length-1]}function e(){return this.select(function(a){return null!=a})}function f(){return this.inject([],function(a,b){return Object.isArray(b)?a.concat(b.flatten()):(a.push(b),a)})}function g(){var a=r.call(arguments,0);return this.select(function(b){return!a.include(b)})}function h(a){return(a===!1?this.toArray():this)._reverse()}function i(a){return this.inject([],function(b,c,d){return 0!=d&&(a?b.last()==c:b.include(c))||b.push(c),b})}function j(a){return this.uniq().findAll(function(b){return a.detect(function(a){return b===a})})}function k(){return r.call(this,0)}function l(){return this.length}function m(){return\"[\"+this.map(Object.inspect).join(\", \")+\"]\"}function n(a,b){b||(b=0);var c=this.length;for(0>b&&(b=c+b);c>b;b++)if(this[b]===a)return b;return-1}function o(a,b){b=isNaN(b)?this.length:(0>b?this.length+b:b)+1;var c=this.slice(0,b).reverse().indexOf(a);return 0>c?c:b-c-1}function p(){for(var a,b=r.call(this,0),c=0,d=arguments.length;d>c;c++)if(a=arguments[c],!Object.isArray(a)||\"callee\"in a)b.push(a);else for(var e=0,f=a.length;f>e;e++)b.push(a[e]);return b}var q=Array.prototype,r=q.slice,s=q.forEach;s||(s=a),Object.extend(q,Enumerable),q._reverse||(q._reverse=q.reverse),Object.extend(q,{_each:s,clear:b,first:c,last:d,compact:e,flatten:f,without:g,reverse:h,uniq:i,intersect:j,clone:k,toArray:k,size:l,inspect:m});var t=function(){return 1!==[].concat(arguments)[0][0]}(1,2);t&&(q.concat=p),q.indexOf||(q.indexOf=n),q.lastIndexOf||(q.lastIndexOf=o)}();var Hash=Class.create(Enumerable,function(){function a(a){this._object=Object.isHash(a)?a.toObject():Object.clone(a)}function b(a){for(var b in this._object){var c=this._object[b],d=[b,c];d.key=b,d.value=c,a(d)}}function c(a,b){return this._object[a]=b}function d(a){return this._object[a]!==Object.prototype[a]?this._object[a]:void 0}function e(a){var b=this._object[a];return delete this._object[a],b}function f(){return Object.clone(this._object)}function g(){return this.pluck(\"key\")}function h(){return this.pluck(\"value\")}function i(a){var b=this.detect(function(b){return b.value===a});return b&&b.key}function j(a){return this.clone().update(a)}function k(a){return new Hash(a).inject(this,function(a,b){return a.set(b.key,b.value),a})}function l(a,b){return Object.isUndefined(b)?a:a+\"=\"+encodeURIComponent(String.interpret(b))}function m(){return this.inject([],function(a,b){var c=encodeURIComponent(b.key),d=b.value;if(d&&\"object\"==typeof d){if(Object.isArray(d)){for(var e,f=[],g=0,h=d.length;h>g;g++)e=d[g],f.push(l(c,e));return a.concat(f)}}else a.push(l(c,d));return a}).join(\"&\")}function n(){return\"#<Hash:{\"+this.map(function(a){return a.map(Object.inspect).join(\": \")}).join(\", \")+\"}>\"}function o(){return new Hash(this)}return{initialize:a,_each:b,set:c,get:d,unset:e,toObject:f,toTemplateReplacements:f,keys:g,values:h,index:i,merge:j,update:k,toQueryString:m,inspect:n,toJSON:f,clone:o}}());Hash.from=$H,Object.extend(Number.prototype,function(){function a(){return this.toPaddedString(2,16)}function b(){return this+1}function c(a,b){return $R(0,this,!0).each(a,b),this}function d(a,b){var c=this.toString(b||10);return\"0\".times(a-c.length)+c}function e(){return Math.abs(this)}function f(){return Math.round(this)}function g(){return Math.ceil(this)}function h(){return Math.floor(this)}return{toColorPart:a,succ:b,times:c,toPaddedString:d,abs:e,round:f,ceil:g,floor:h}}());var ObjectRange=Class.create(Enumerable,function(){function a(a,b,c){this.start=a,this.end=b,this.exclusive=c}function b(a){for(var b=this.start;this.include(b);)a(b),b=b.succ()}function c(a){return a<this.start?!1:this.exclusive?a<this.end:a<=this.end}return{initialize:a,_each:b,include:c}}()),Ajax={getTransport:function(){return Try.these(function(){return new XMLHttpRequest},function(){return new ActiveXObject(\"Msxml2.XMLHTTP\")},function(){return new ActiveXObject(\"Microsoft.XMLHTTP\")})||!1},activeRequestCount:0};if(Ajax.Responders={responders:[],_each:function(a){this.responders._each(a)},register:function(a){this.include(a)||this.responders.push(a)},unregister:function(a){this.responders=this.responders.without(a)},dispatch:function(a,b,c,d){this.each(function(e){if(Object.isFunction(e[a]))try{e[a].apply(e,[b,c,d])}catch(f){}})}},Object.extend(Ajax.Responders,Enumerable),Ajax.Responders.register({onCreate:function(){Ajax.activeRequestCount++},onComplete:function(){Ajax.activeRequestCount--}}),Ajax.Base=Class.create({initialize:function(a){this.options={method:\"post\",asynchronous:!0,contentType:\"application/x-www-form-urlencoded\",encoding:\"UTF-8\",parameters:\"\",evalJSON:!0,evalJS:!0},Object.extend(this.options,a||{}),this.options.method=this.options.method.toLowerCase(),Object.isHash(this.options.parameters)&&(this.options.parameters=this.options.parameters.toObject())}}),Ajax.Request=Class.create(Ajax.Base,{_complete:!1,initialize:function(a,b,c){a(c),this.transport=Ajax.getTransport(),this.request(b)},request:function(a){this.url=a,this.method=this.options.method;var b=Object.isString(this.options.parameters)?this.options.parameters:Object.toQueryString(this.options.parameters);[\"get\",\"post\"].include(this.method)||(b+=(b?\"&\":\"\")+\"_method=\"+this.method,this.method=\"post\"),b&&\"get\"===this.method&&(this.url+=(this.url.include(\"?\")?\"&\":\"?\")+b),this.parameters=b.toQueryParams();try{var c=new Ajax.Response(this);this.options.onCreate&&this.options.onCreate(c),Ajax.Responders.dispatch(\"onCreate\",this,c),this.transport.open(this.method.toUpperCase(),this.url,this.options.asynchronous),this.options.asynchronous&&this.respondToReadyState.bind(this).defer(1),this.transport.onreadystatechange=this.onStateChange.bind(this),this.setRequestHeaders(),this.body=\"post\"==this.method?this.options.postBody||b:null,this.transport.send(this.body),!this.options.asynchronous&&this.transport.overrideMimeType&&this.onStateChange()}catch(d){this.dispatchException(d)}},onStateChange:function(){var a=this.transport.readyState;a>1&&(4!=a||!this._complete)&&this.respondToReadyState(this.transport.readyState)},setRequestHeaders:function(){var a={\"X-Requested-With\":\"XMLHttpRequest\",\"X-Prototype-Version\":Prototype.Version,Accept:\"text/javascript, text/html, application/xml, text/xml, */*\"};if(\"post\"==this.method&&(a[\"Content-type\"]=this.options.contentType+(this.options.encoding?\"; charset=\"+this.options.encoding:\"\"),this.transport.overrideMimeType&&(navigator.userAgent.match(/Gecko\\/(\\d{4})/)||[0,2005])[1]<2005&&(a.Connection=\"close\")),\"object\"==typeof this.options.requestHeaders){var b=this.options.requestHeaders;if(Object.isFunction(b.push))for(var c=0,d=b.length;d>c;c+=2)a[b[c]]=b[c+1];else $H(b).each(function(b){a[b.key]=b.value})}for(var e in a)this.transport.setRequestHeader(e,a[e])},success:function(){var a=this.getStatus();return!a||a>=200&&300>a||304==a},getStatus:function(){try{return 1223===this.transport.status?204:this.transport.status||0}catch(a){return 0}},respondToReadyState:function(a){var b=Ajax.Request.Events[a],c=new Ajax.Response(this);if(\"Complete\"==b){try{this._complete=!0,(this.options[\"on\"+c.status]||this.options[\"on\"+(this.success()?\"Success\":\"Failure\")]||Prototype.emptyFunction)(c,c.headerJSON)}catch(d){this.dispatchException(d)}var e=c.getHeader(\"Content-type\");(\"force\"==this.options.evalJS||this.options.evalJS&&this.isSameOrigin()&&e&&e.match(/^\\s*(text|application)\\/(x-)?(java|ecma)script(;.*)?\\s*$/i))&&this.evalResponse()}try{(this.options[\"on\"+b]||Prototype.emptyFunction)(c,c.headerJSON),Ajax.Responders.dispatch(\"on\"+b,this,c,c.headerJSON)}catch(d){this.dispatchException(d)}\"Complete\"==b&&(this.transport.onreadystatechange=Prototype.emptyFunction)},isSameOrigin:function(){var a=this.url.match(/^\\s*https?:\\/\\/[^\\/]*/);return!a||a[0]==\"#{protocol}//#{domain}#{port}\".interpolate({protocol:location.protocol,domain:document.domain,port:location.port?\":\"+location.port:\"\"})},getHeader:function(a){try{return this.transport.getResponseHeader(a)||null}catch(b){return null}},evalResponse:function(){try{return eval((this.transport.responseText||\"\").unfilterJSON())}catch(e){this.dispatchException(e)}},dispatchException:function(a){(this.options.onException||Prototype.emptyFunction)(this,a),Ajax.Responders.dispatch(\"onException\",this,a)}}),Ajax.Request.Events=[\"Uninitialized\",\"Loading\",\"Loaded\",\"Interactive\",\"Complete\"],Ajax.Response=Class.create({initialize:function(a){this.request=a;var b=this.transport=a.transport,c=this.readyState=b.readyState;if((c>2&&!Prototype.Browser.IE||4==c)&&(this.status=this.getStatus(),this.statusText=this.getStatusText(),this.responseText=String.interpret(b.responseText),this.headerJSON=this._getHeaderJSON()),4==c){var d=b.responseXML;this.responseXML=Object.isUndefined(d)?null:d,this.responseJSON=this._getResponseJSON()}},status:0,statusText:\"\",getStatus:Ajax.Request.prototype.getStatus,getStatusText:function(){try{return this.transport.statusText||\"\"}catch(a){return\"\"}},getHeader:Ajax.Request.prototype.getHeader,getAllHeaders:function(){try{return this.getAllResponseHeaders()}catch(a){return null}},getResponseHeader:function(a){return this.transport.getResponseHeader(a)},getAllResponseHeaders:function(){return this.transport.getAllResponseHeaders()},_getHeaderJSON:function(){var a=this.getHeader(\"X-JSON\");if(!a)return null;a=decodeURIComponent(escape(a));try{return a.evalJSON(this.request.options.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}},_getResponseJSON:function(){var a=this.request.options;if(!a.evalJSON||\"force\"!=a.evalJSON&&!(this.getHeader(\"Content-type\")||\"\").include(\"application/json\")||this.responseText.blank())return null;try{return this.responseText.evalJSON(a.sanitizeJSON||!this.request.isSameOrigin())}catch(b){this.request.dispatchException(b)}}}),Ajax.Updater=Class.create(Ajax.Request,{initialize:function(a,b,c,d){this.container={success:b.success||b,failure:b.failure||(b.success?null:b)},d=Object.clone(d);var e=d.onComplete;d.onComplete=function(a,b){this.updateContent(a.responseText),Object.isFunction(e)&&e(a,b)}.bind(this),a(c,d)},updateContent:function(a){var b=this.container[this.success()?\"success\":\"failure\"],c=this.options;if(c.evalScripts||(a=a.stripScripts()),b=$(b))if(c.insertion)if(Object.isString(c.insertion)){var d={};d[c.insertion]=a,b.insert(d)}else c.insertion(b,a);else b.update(a)}}),Ajax.PeriodicalUpdater=Class.create(Ajax.Base,{initialize:function(a,b,c,d){a(d),this.onComplete=this.options.onComplete,this.frequency=this.options.frequency||2,this.decay=this.options.decay||1,this.updater={},this.container=b,this.url=c,this.start()},start:function(){this.options.onComplete=this.updateComplete.bind(this),this.onTimerEvent()},stop:function(){this.updater.options.onComplete=void 0,clearTimeout(this.timer),(this.onComplete||Prototype.emptyFunction).apply(this,arguments)},updateComplete:function(a){this.options.decay&&(this.decay=a.responseText==this.lastText?this.decay*this.options.decay:1,this.lastText=a.responseText),this.timer=this.onTimerEvent.bind(this).delay(this.decay*this.frequency)},onTimerEvent:function(){this.updater=new Ajax.Updater(this.container,this.url,this.options)}}),Prototype.BrowserFeatures.XPath&&(document._getElementsByXPath=function(a,b){for(var c=[],d=document.evaluate(a,$(b)||document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),e=0,f=d.snapshotLength;f>e;e++)c.push(Element.extend(d.snapshotItem(e)));return c}),!Node)var Node={};Node.ELEMENT_NODE||Object.extend(Node,{ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12}),function(a){function b(a,b){return\"select\"===a?!1:\"type\"in b?!1:!0}var c=function(){try{var a=document.createElement('<input name=\"x\">');return\"input\"===a.tagName.toLowerCase()&&\"x\"===a.name}catch(b){return!1}}(),d=a.Element;a.Element=function(a,d){d=d||{},a=a.toLowerCase();var e=Element.cache;if(c&&d.name)return a=\"<\"+a+' name=\"'+d.name+'\">',delete d.name,Element.writeAttribute(document.createElement(a),d);e[a]||(e[a]=Element.extend(document.createElement(a)));var f=b(a,d)?e[a].cloneNode(!1):document.createElement(a);return Element.writeAttribute(f,d)},Object.extend(a.Element,d||{}),d&&(a.Element.prototype=d.prototype)}(this),Element.idCounter=1,Element.cache={},Element._purgeElement=function(a){var b=a._prototypeUID;b&&(Element.stopObserving(a),a._prototypeUID=void 0,delete Element.Storage[b])},Element.Methods={visible:function(a){return\"none\"!=$(a).style.display},toggle:function(a){return a=$(a),Element[Element.visible(a)?\"hide\":\"show\"](a),a},hide:function(a){return a=$(a),a.style.display=\"none\",a},show:function(a){return a=$(a),a.style.display=\"\",a},remove:function(a){return a=$(a),a.parentNode.removeChild(a),a},update:function(){function a(a,b){a=$(a);for(var c=Element._purgeElement,g=a.getElementsByTagName(\"*\"),h=g.length;h--;)c(g[h]);if(b&&b.toElement&&(b=b.toElement()),Object.isElement(b))return a.update().insert(b);b=Object.toHTML(b);var i=a.tagName.toUpperCase();if(\"SCRIPT\"===i&&f)return a.text=b,a;if(e)if(i in Element._insertionTranslations.tags){for(;a.firstChild;)a.removeChild(a.firstChild);Element._getContentFromAnonymousElement(i,b.stripScripts()).each(function(b){a.appendChild(b)})}else if(d&&Object.isString(b)&&b.indexOf(\"<link\")>-1){for(;a.firstChild;)a.removeChild(a.firstChild);var j=Element._getContentFromAnonymousElement(i,b.stripScripts(),!0);j.each(function(b){a.appendChild(b)})}else a.innerHTML=b.stripScripts();else a.innerHTML=b.stripScripts();return b.evalScripts.bind(b).defer(),a}var b=function(){var a=document.createElement(\"select\"),b=!0;return a.innerHTML='<option value=\"test\">test</option>',a.options&&a.options[0]&&(b=\"OPTION\"!==a.options[0].nodeName.toUpperCase()),a=null,b}(),c=function(){try{var a=document.createElement(\"table\");if(a&&a.tBodies){a.innerHTML=\"<tbody><tr><td>test</td></tr></tbody>\";var b=\"undefined\"==typeof a.tBodies[0];return a=null,b}}catch(c){return!0}}(),d=function(){try{var a=document.createElement(\"div\");a.innerHTML=\"<link>\";var b=0===a.childNodes.length;return a=null,b}catch(c){return!0}}(),e=b||c||d,f=function(){var a=document.createElement(\"script\"),b=!1;try{a.appendChild(document.createTextNode(\"\")),b=!a.firstChild||a.firstChild&&3!==a.firstChild.nodeType}catch(c){b=!0}return a=null,b}();return a}(),replace:function(a,b){if(a=$(a),b&&b.toElement)b=b.toElement();else if(!Object.isElement(b)){b=Object.toHTML(b);var c=a.ownerDocument.createRange();c.selectNode(a),b.evalScripts.bind(b).defer(),b=c.createContextualFragment(b.stripScripts())}return a.parentNode.replaceChild(b,a),a},insert:function(a,b){a=$(a),(Object.isString(b)||Object.isNumber(b)||Object.isElement(b)||b&&(b.toElement||b.toHTML))&&(b={bottom:b});var c,d,e,f;for(var g in b)c=b[g],g=g.toLowerCase(),d=Element._insertionTranslations[g],c&&c.toElement&&(c=c.toElement()),Object.isElement(c)?d(a,c):(c=Object.toHTML(c),e=(\"before\"==g||\"after\"==g?a.parentNode:a).tagName.toUpperCase(),f=Element._getContentFromAnonymousElement(e,c.stripScripts()),(\"top\"==g||\"after\"==g)&&f.reverse(),f.each(d.curry(a)),c.evalScripts.bind(c).defer());return a},wrap:function(a,b,c){return a=$(a),Object.isElement(b)?$(b).writeAttribute(c||{}):b=Object.isString(b)?new Element(b,c):new Element(\"div\",b),a.parentNode&&a.parentNode.replaceChild(b,a),b.appendChild(a),b},inspect:function(a){a=$(a);var b=\"<\"+a.tagName.toLowerCase();return $H({id:\"id\",className:\"class\"}).each(function(c){var d=c.first(),e=c.last(),f=(a[d]||\"\").toString();f&&(b+=\" \"+e+\"=\"+f.inspect(!0))}),b+\">\"},recursivelyCollect:function(a,b,c){a=$(a),c=c||-1;for(var d=[];(a=a[b])&&(1==a.nodeType&&d.push(Element.extend(a)),d.length!=c););return d},ancestors:function(a){return Element.recursivelyCollect(a,\"parentNode\")},descendants:function(a){return Element.select(a,\"*\")},firstDescendant:function(a){for(a=$(a).firstChild;a&&1!=a.nodeType;)a=a.nextSibling;return $(a)},immediateDescendants:function(a){for(var b=[],c=$(a).firstChild;c;)1===c.nodeType&&b.push(Element.extend(c)),c=c.nextSibling;return b},previousSiblings:function(a){return Element.recursivelyCollect(a,\"previousSibling\")},nextSiblings:function(a){return Element.recursivelyCollect(a,\"nextSibling\")},siblings:function(a){return a=$(a),Element.previousSiblings(a).reverse().concat(Element.nextSiblings(a))\n},match:function(a,b){return a=$(a),Object.isString(b)?Prototype.Selector.match(a,b):b.match(a)},up:function(a,b,c){if(a=$(a),1==arguments.length)return $(a.parentNode);var d=Element.ancestors(a);return Object.isNumber(b)?d[b]:Prototype.Selector.find(d,b,c)},down:function(a,b,c){return a=$(a),1==arguments.length?Element.firstDescendant(a):Object.isNumber(b)?Element.descendants(a)[b]:Element.select(a,b)[c||0]},previous:function(a,b,c){return a=$(a),Object.isNumber(b)&&(c=b,b=!1),Object.isNumber(c)||(c=0),b?Prototype.Selector.find(a.previousSiblings(),b,c):a.recursivelyCollect(\"previousSibling\",c+1)[c]},next:function(a,b,c){if(a=$(a),Object.isNumber(b)&&(c=b,b=!1),Object.isNumber(c)||(c=0),b)return Prototype.Selector.find(a.nextSiblings(),b,c);Object.isNumber(c)?c+1:1;return a.recursivelyCollect(\"nextSibling\",c+1)[c]},select:function(a){a=$(a);var b=Array.prototype.slice.call(arguments,1).join(\", \");return Prototype.Selector.select(b,a)},adjacent:function(a){a=$(a);var b=Array.prototype.slice.call(arguments,1).join(\", \");return Prototype.Selector.select(b,a.parentNode).without(a)},identify:function(a){a=$(a);var b=Element.readAttribute(a,\"id\");if(b)return b;do b=\"anonymous_element_\"+Element.idCounter++;while($(b));return Element.writeAttribute(a,\"id\",b),b},readAttribute:function(a,b){if(a=$(a),Prototype.Browser.IE){var c=Element._attributeTranslations.read;if(c.values[b])return c.values[b](a,b);if(c.names[b]&&(b=c.names[b]),b.include(\":\"))return a.attributes&&a.attributes[b]?a.attributes[b].value:null}return a.getAttribute(b)},writeAttribute:function(a,b,c){a=$(a);var d={},e=Element._attributeTranslations.write;\"object\"==typeof b?d=b:d[b]=Object.isUndefined(c)?!0:c;for(var f in d)b=e.names[f]||f,c=d[f],e.values[f]&&(b=e.values[f](a,c)),c===!1||null===c?a.removeAttribute(b):c===!0?a.setAttribute(b,b):a.setAttribute(b,c);return a},getHeight:function(a){return Element.getDimensions(a).height},getWidth:function(a){return Element.getDimensions(a).width},classNames:function(a){return new Element.ClassNames(a)},hasClassName:function(a,b){if(a=$(a)){var c=a.className;return c.length>0&&(c==b||new RegExp(\"(^|\\\\s)\"+b+\"(\\\\s|$)\").test(c))}},addClassName:function(a,b){return(a=$(a))?(Element.hasClassName(a,b)||(a.className+=(a.className?\" \":\"\")+b),a):void 0},removeClassName:function(a,b){return(a=$(a))?(a.className=a.className.replace(new RegExp(\"(^|\\\\s+)\"+b+\"(\\\\s+|$)\"),\" \").strip(),a):void 0},toggleClassName:function(a,b){return(a=$(a))?Element[Element.hasClassName(a,b)?\"removeClassName\":\"addClassName\"](a,b):void 0},cleanWhitespace:function(a){a=$(a);for(var b=a.firstChild;b;){var c=b.nextSibling;3!=b.nodeType||/\\S/.test(b.nodeValue)||a.removeChild(b),b=c}return a},empty:function(a){return $(a).innerHTML.blank()},descendantOf:function(a,b){if(a=$(a),b=$(b),a.compareDocumentPosition)return 8===(8&a.compareDocumentPosition(b));if(b.contains)return b.contains(a)&&b!==a;for(;a=a.parentNode;)if(a==b)return!0;return!1},scrollTo:function(a){a=$(a);var b=Element.cumulativeOffset(a);return window.scrollTo(b[0],b[1]),a},getStyle:function(a,b){a=$(a),b=\"float\"==b?\"cssFloat\":b.camelize();var c=a.style[b];if(!c||\"auto\"==c){var d=document.defaultView.getComputedStyle(a,null);c=d?d[b]:null}return\"opacity\"==b?c?parseFloat(c):1:\"auto\"==c?null:c},getOpacity:function(a){return $(a).getStyle(\"opacity\")},setStyle:function(a,b){a=$(a);var c=a.style;if(Object.isString(b))return a.style.cssText+=\";\"+b,b.include(\"opacity\")?a.setOpacity(b.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1]):a;for(var d in b)\"opacity\"==d?a.setOpacity(b[d]):c[\"float\"==d||\"cssFloat\"==d?Object.isUndefined(c.styleFloat)?\"cssFloat\":\"styleFloat\":d]=b[d];return a},setOpacity:function(a,b){return a=$(a),a.style.opacity=1==b||\"\"===b?\"\":1e-5>b?0:b,a},makePositioned:function(a){a=$(a);var b=Element.getStyle(a,\"position\");return\"static\"!=b&&b||(a._madePositioned=!0,a.style.position=\"relative\",Prototype.Browser.Opera&&(a.style.top=0,a.style.left=0)),a},undoPositioned:function(a){return a=$(a),a._madePositioned&&(a._madePositioned=void 0,a.style.position=a.style.top=a.style.left=a.style.bottom=a.style.right=\"\"),a},makeClipping:function(a){return a=$(a),a._overflow?a:(a._overflow=Element.getStyle(a,\"overflow\")||\"auto\",\"hidden\"!==a._overflow&&(a.style.overflow=\"hidden\"),a)},undoClipping:function(a){return a=$(a),a._overflow?(a.style.overflow=\"auto\"==a._overflow?\"\":a._overflow,a._overflow=null,a):a},clonePosition:function(a,b){var c=Object.extend({setLeft:!0,setTop:!0,setWidth:!0,setHeight:!0,offsetTop:0,offsetLeft:0},arguments[2]||{});b=$(b);var d=Element.viewportOffset(b),e=[0,0],f=null;return a=$(a),\"absolute\"==Element.getStyle(a,\"position\")&&(f=Element.getOffsetParent(a),e=Element.viewportOffset(f)),f==document.body&&(e[0]-=document.body.offsetLeft,e[1]-=document.body.offsetTop),c.setLeft&&(a.style.left=d[0]-e[0]+c.offsetLeft+\"px\"),c.setTop&&(a.style.top=d[1]-e[1]+c.offsetTop+\"px\"),c.setWidth&&(a.style.width=b.offsetWidth+\"px\"),c.setHeight&&(a.style.height=b.offsetHeight+\"px\"),a}},Object.extend(Element.Methods,{getElementsBySelector:Element.Methods.select,childElements:Element.Methods.immediateDescendants}),Element._attributeTranslations={write:{names:{className:\"class\",htmlFor:\"for\"},values:{}}},Prototype.Browser.Opera?(Element.Methods.getStyle=Element.Methods.getStyle.wrap(function(a,b,c){switch(c){case\"height\":case\"width\":if(!Element.visible(b))return null;var d=parseInt(a(b,c),10);if(d!==b[\"offset\"+c.capitalize()])return d+\"px\";var e;return e=\"height\"===c?[\"border-top-width\",\"padding-top\",\"padding-bottom\",\"border-bottom-width\"]:[\"border-left-width\",\"padding-left\",\"padding-right\",\"border-right-width\"],e.inject(d,function(c,d){var e=a(b,d);return null===e?c:c-parseInt(e,10)})+\"px\";default:return a(b,c)}}),Element.Methods.readAttribute=Element.Methods.readAttribute.wrap(function(a,b,c){return\"title\"===c?b.title:a(b,c)})):Prototype.Browser.IE?(Element.Methods.getStyle=function(a,b){a=$(a),b=\"float\"==b||\"cssFloat\"==b?\"styleFloat\":b.camelize();var c=a.style[b];return!c&&a.currentStyle&&(c=a.currentStyle[b]),\"opacity\"==b?(c=(a.getStyle(\"filter\")||\"\").match(/alpha\\(opacity=(.*)\\)/))&&c[1]?parseFloat(c[1])/100:1:\"auto\"==c?\"width\"!=b&&\"height\"!=b||\"none\"==a.getStyle(\"display\")?null:a[\"offset\"+b.capitalize()]+\"px\":c},Element.Methods.setOpacity=function(a,b){function c(a){return a.replace(/alpha\\([^\\)]*\\)/gi,\"\")}a=$(a);var d=a.currentStyle;(d&&!d.hasLayout||!d&&\"normal\"==a.style.zoom)&&(a.style.zoom=1);var e=a.getStyle(\"filter\"),f=a.style;return 1==b||\"\"===b?((e=c(e))?f.filter=e:f.removeAttribute(\"filter\"),a):(1e-5>b&&(b=0),f.filter=c(e)+\"alpha(opacity=\"+100*b+\")\",a)},Element._attributeTranslations=function(){var a=\"className\",b=\"for\",c=document.createElement(\"div\");return c.setAttribute(a,\"x\"),\"x\"!==c.className&&(c.setAttribute(\"class\",\"x\"),\"x\"===c.className&&(a=\"class\")),c=null,c=document.createElement(\"label\"),c.setAttribute(b,\"x\"),\"x\"!==c.htmlFor&&(c.setAttribute(\"htmlFor\",\"x\"),\"x\"===c.htmlFor&&(b=\"htmlFor\")),c=null,{read:{names:{\"class\":a,className:a,\"for\":b,htmlFor:b},values:{_getAttr:function(a,b){return a.getAttribute(b)},_getAttr2:function(a,b){return a.getAttribute(b,2)},_getAttrNode:function(a,b){var c=a.getAttributeNode(b);return c?c.value:\"\"},_getEv:function(){var a,b=document.createElement(\"div\");b.onclick=Prototype.emptyFunction;var c=b.getAttribute(\"onclick\");return String(c).indexOf(\"{\")>-1?a=function(a,b){return(b=a.getAttribute(b))?(b=b.toString(),b=b.split(\"{\")[1],b=b.split(\"}\")[0],b.strip()):null}:\"\"===c&&(a=function(a,b){return b=a.getAttribute(b),b?b.strip():null}),b=null,a}(),_flag:function(a,b){return $(a).hasAttribute(b)?b:null},style:function(a){return a.style.cssText.toLowerCase()},title:function(a){return a.title}}}}}(),Element._attributeTranslations.write={names:Object.extend({cellpadding:\"cellPadding\",cellspacing:\"cellSpacing\"},Element._attributeTranslations.read.names),values:{checked:function(a,b){a.checked=!!b},style:function(a,b){a.style.cssText=b?b:\"\"}}},Element._attributeTranslations.has={},$w(\"colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc frameBorder\").each(function(a){Element._attributeTranslations.write.names[a.toLowerCase()]=a,Element._attributeTranslations.has[a.toLowerCase()]=a}),function(a){Object.extend(a,{href:a._getAttr2,src:a._getAttr2,type:a._getAttr,action:a._getAttrNode,disabled:a._flag,checked:a._flag,readonly:a._flag,multiple:a._flag,onload:a._getEv,onunload:a._getEv,onclick:a._getEv,ondblclick:a._getEv,onmousedown:a._getEv,onmouseup:a._getEv,onmouseover:a._getEv,onmousemove:a._getEv,onmouseout:a._getEv,onfocus:a._getEv,onblur:a._getEv,onkeypress:a._getEv,onkeydown:a._getEv,onkeyup:a._getEv,onsubmit:a._getEv,onreset:a._getEv,onselect:a._getEv,onchange:a._getEv})}(Element._attributeTranslations.read.values),Prototype.BrowserFeatures.ElementExtensions&&!function(){function a(a){for(var b,c=a.getElementsByTagName(\"*\"),d=[],e=0;b=c[e];e++)\"!\"!==b.tagName&&d.push(b);return d}Element.Methods.down=function(b,c,d){return b=$(b),1==arguments.length?b.firstDescendant():Object.isNumber(c)?a(b)[c]:Element.select(b,c)[d||0]}}()):Prototype.Browser.Gecko&&/rv:1\\.8\\.0/.test(navigator.userAgent)?Element.Methods.setOpacity=function(a,b){return a=$(a),a.style.opacity=1==b?.999999:\"\"===b?\"\":1e-5>b?0:b,a}:Prototype.Browser.WebKit&&(Element.Methods.setOpacity=function(a,b){if(a=$(a),a.style.opacity=1==b||\"\"===b?\"\":1e-5>b?0:b,1==b)if(\"IMG\"==a.tagName.toUpperCase()&&a.width)a.width++,a.width--;else try{var c=document.createTextNode(\" \");a.appendChild(c),a.removeChild(c)}catch(d){}return a}),\"outerHTML\"in document.documentElement&&(Element.Methods.replace=function(a,b){if(a=$(a),b&&b.toElement&&(b=b.toElement()),Object.isElement(b))return a.parentNode.replaceChild(b,a),a;b=Object.toHTML(b);var c=a.parentNode,d=c.tagName.toUpperCase();if(Element._insertionTranslations.tags[d]){var e=a.next(),f=Element._getContentFromAnonymousElement(d,b.stripScripts());c.removeChild(a),f.each(e?function(a){c.insertBefore(a,e)}:function(a){c.appendChild(a)})}else a.outerHTML=b.stripScripts();return b.evalScripts.bind(b).defer(),a}),Element._returnOffset=function(a,b){var c=[a,b];return c.left=a,c.top=b,c},Element._getContentFromAnonymousElement=function(a,b,c){var d=new Element(\"div\"),e=Element._insertionTranslations.tags[a],f=!1;if(e?f=!0:c&&(f=!0,e=[\"\",\"\",0]),f){d.innerHTML=\"&nbsp;\"+e[0]+b+e[1],d.removeChild(d.firstChild);for(var g=e[2];g--;)d=d.firstChild}else d.innerHTML=b;return $A(d.childNodes)},Element._insertionTranslations={before:function(a,b){a.parentNode.insertBefore(b,a)},top:function(a,b){a.insertBefore(b,a.firstChild)},bottom:function(a,b){a.appendChild(b)},after:function(a,b){a.parentNode.insertBefore(b,a.nextSibling)},tags:{TABLE:[\"<table>\",\"</table>\",1],TBODY:[\"<table><tbody>\",\"</tbody></table>\",2],TR:[\"<table><tbody><tr>\",\"</tr></tbody></table>\",3],TD:[\"<table><tbody><tr><td>\",\"</td></tr></tbody></table>\",4],SELECT:[\"<select>\",\"</select>\",1]}},function(){var a=Element._insertionTranslations.tags;Object.extend(a,{THEAD:a.TBODY,TFOOT:a.TBODY,TH:a.TD})}(),Element.Methods.Simulated={hasAttribute:function(a,b){b=Element._attributeTranslations.has[b]||b;var c=$(a).getAttributeNode(b);return!(!c||!c.specified)}},Element.Methods.ByTag={},Object.extend(Element,Element.Methods),function(a){!Prototype.BrowserFeatures.ElementExtensions&&a.__proto__&&(window.HTMLElement={},window.HTMLElement.prototype=a.__proto__,Prototype.BrowserFeatures.ElementExtensions=!0),a=null}(document.createElement(\"div\")),Element.extend=function(){function a(a){if(\"undefined\"!=typeof window.Element){var b=window.Element.prototype;if(b){var c=\"_\"+(Math.random()+\"\").slice(2),d=document.createElement(a);b[c]=\"x\";var e=\"x\"!==d[c];return delete b[c],d=null,e}}return!1}function b(a,b){for(var c in b){var d=b[c];!Object.isFunction(d)||c in a||(a[c]=d.methodize())}}var c=a(\"object\");if(Prototype.BrowserFeatures.SpecificElementExtensions)return c?function(a){if(a&&\"undefined\"==typeof a._extendedByPrototype){var c=a.tagName;c&&/^(?:object|applet|embed)$/i.test(c)&&(b(a,Element.Methods),b(a,Element.Methods.Simulated),b(a,Element.Methods.ByTag[c.toUpperCase()]))}return a}:Prototype.K;var d={},e=Element.Methods.ByTag,f=Object.extend(function(a){if(!a||\"undefined\"!=typeof a._extendedByPrototype||1!=a.nodeType||a==window)return a;var c=Object.clone(d),f=a.tagName.toUpperCase();return e[f]&&Object.extend(c,e[f]),b(a,c),a._extendedByPrototype=Prototype.emptyFunction,a},{refresh:function(){Prototype.BrowserFeatures.ElementExtensions||(Object.extend(d,Element.Methods),Object.extend(d,Element.Methods.Simulated))}});return f.refresh(),f}(),Element.hasAttribute=document.documentElement.hasAttribute?function(a,b){return a.hasAttribute(b)}:Element.Methods.Simulated.hasAttribute,Element.addMethods=function(a){function b(b){b=b.toUpperCase(),Element.Methods.ByTag[b]||(Element.Methods.ByTag[b]={}),Object.extend(Element.Methods.ByTag[b],a)}function c(a,b,c){c=c||!1;for(var d in a){var e=a[d];Object.isFunction(e)&&(c&&d in b||(b[d]=e.methodize()))}}function d(a){var b,c={OPTGROUP:\"OptGroup\",TEXTAREA:\"TextArea\",P:\"Paragraph\",FIELDSET:\"FieldSet\",UL:\"UList\",OL:\"OList\",DL:\"DList\",DIR:\"Directory\",H1:\"Heading\",H2:\"Heading\",H3:\"Heading\",H4:\"Heading\",H5:\"Heading\",H6:\"Heading\",Q:\"Quote\",INS:\"Mod\",DEL:\"Mod\",A:\"Anchor\",IMG:\"Image\",CAPTION:\"TableCaption\",COL:\"TableCol\",COLGROUP:\"TableCol\",THEAD:\"TableSection\",TFOOT:\"TableSection\",TBODY:\"TableSection\",TR:\"TableRow\",TH:\"TableCell\",TD:\"TableCell\",FRAMESET:\"FrameSet\",IFRAME:\"IFrame\"};if(c[a]&&(b=\"HTML\"+c[a]+\"Element\"),window[b])return window[b];if(b=\"HTML\"+a+\"Element\",window[b])return window[b];if(b=\"HTML\"+a.capitalize()+\"Element\",window[b])return window[b];var d=document.createElement(a),e=d.__proto__||d.constructor.prototype;return d=null,e}var e=Prototype.BrowserFeatures,f=Element.Methods.ByTag;if(a||(Object.extend(Form,Form.Methods),Object.extend(Form.Element,Form.Element.Methods),Object.extend(Element.Methods.ByTag,{FORM:Object.clone(Form.Methods),INPUT:Object.clone(Form.Element.Methods),SELECT:Object.clone(Form.Element.Methods),TEXTAREA:Object.clone(Form.Element.Methods),BUTTON:Object.clone(Form.Element.Methods)})),2==arguments.length){var g=a;a=arguments[1]}g?Object.isArray(g)?g.each(b):b(g):Object.extend(Element.Methods,a||{});var h=window.HTMLElement?HTMLElement.prototype:Element.prototype;if(e.ElementExtensions&&(c(Element.Methods,h),c(Element.Methods.Simulated,h,!0)),e.SpecificElementExtensions)for(var i in Element.Methods.ByTag){var j=d(i);Object.isUndefined(j)||c(f[i],j.prototype)}Object.extend(Element,Element.Methods),delete Element.ByTag,Element.extend.refresh&&Element.extend.refresh(),Element.cache={}},document.viewport={getDimensions:function(){return{width:this.getWidth(),height:this.getHeight()}},getScrollOffsets:function(){return Element._returnOffset(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft,window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop)}},function(a){function b(){return e.WebKit&&!f.evaluate?document:e.Opera&&window.parseFloat(window.opera.version())<9.5?document.body:document.documentElement}function c(c){return d||(d=b()),g[c]=\"client\"+c,a[\"get\"+c]=function(){return d[g[c]]},a[\"get\"+c]()}var d,e=Prototype.Browser,f=document,g={};a.getWidth=c.curry(\"Width\"),a.getHeight=c.curry(\"Height\")}(document.viewport),Element.Storage={UID:1},Element.addMethods({getStorage:function(a){if(a=$(a)){var b;return a===window?b=0:(\"undefined\"==typeof a._prototypeUID&&(a._prototypeUID=Element.Storage.UID++),b=a._prototypeUID),Element.Storage[b]||(Element.Storage[b]=$H()),Element.Storage[b]}},store:function(a,b,c){return(a=$(a))?(2===arguments.length?Element.getStorage(a).update(b):Element.getStorage(a).set(b,c),a):void 0},retrieve:function(a,b,c){if(a=$(a)){var d=Element.getStorage(a),e=d.get(b);return Object.isUndefined(e)&&(d.set(b,c),e=c),e}},clone:function(a,b){if(a=$(a)){var c=a.cloneNode(b);if(c._prototypeUID=void 0,b)for(var d=Element.select(c,\"*\"),e=d.length;e--;)d[e]._prototypeUID=void 0;return Element.extend(c)}},purge:function(a){if(a=$(a)){var b=Element._purgeElement;b(a);for(var c=a.getElementsByTagName(\"*\"),d=c.length;d--;)b(c[d]);return null}}}),function(){function a(a){var b=a.match(/^(\\d+)%?$/i);return b?Number(b[1])/100:null}function b(b,c,d){var e=null;if(Object.isElement(b)&&(e=b,b=e.getStyle(c)),null===b)return null;if(/^(?:-)?\\d+(\\.\\d+)?(px)?$/i.test(b))return window.parseFloat(b);var f=b.include(\"%\"),g=d===document.viewport;if(/\\d/.test(b)&&e&&e.runtimeStyle&&(!f||!g)){var h=e.style.left,i=e.runtimeStyle.left;return e.runtimeStyle.left=e.currentStyle.left,e.style.left=b||0,b=e.style.pixelLeft,e.style.left=h,e.runtimeStyle.left=i,b}if(e&&f){d=d||e.parentNode;var j=a(b),k=null,l=(e.getStyle(\"position\"),c.include(\"left\")||c.include(\"right\")||c.include(\"width\")),m=c.include(\"top\")||c.include(\"bottom\")||c.include(\"height\");return d===document.viewport?l?k=document.viewport.getWidth():m&&(k=document.viewport.getHeight()):l?k=$(d).measure(\"width\"):m&&(k=$(d).measure(\"height\")),null===k?0:k*j}return 0}function c(a){for(;a&&a.parentNode;){var b=a.getStyle(\"display\");if(\"none\"===b)return!1;a=$(a.parentNode)}return!0}function d(a){return a.include(\"border\")&&(a+=\"-width\"),a.camelize()}function e(a,b){return new Element.Layout(a,b)}function f(a,b){return $(a).getLayout().get(b)}function g(a){a=$(a);var b=Element.getStyle(a,\"display\");if(b&&\"none\"!==b)return{width:a.offsetWidth,height:a.offsetHeight};var c=a.style,d={visibility:c.visibility,position:c.position,display:c.display},e={visibility:\"hidden\",display:\"block\"};\"fixed\"!==d.position&&(e.position=\"absolute\"),Element.setStyle(a,e);var f={width:a.offsetWidth,height:a.offsetHeight};return Element.setStyle(a,d),f}function h(a){if(a=$(a),q(a)||r(a)||o(a)||p(a))return $(document.body);var b=\"inline\"===Element.getStyle(a,\"display\");if(!b&&a.offsetParent)return $(a.offsetParent);for(;(a=a.parentNode)&&a!==document.body;)if(\"static\"!==Element.getStyle(a,\"position\"))return $(p(a)?document.body:a);return $(document.body)}function i(a){a=$(a);var b=0,c=0;if(a.parentNode)do b+=a.offsetTop||0,c+=a.offsetLeft||0,a=a.offsetParent;while(a);return new Element.Offset(c,b)}function j(a){a=$(a);var b=a.getLayout(),c=0,d=0;do if(c+=a.offsetTop||0,d+=a.offsetLeft||0,a=a.offsetParent){if(o(a))break;var e=Element.getStyle(a,\"position\");if(\"static\"!==e)break}while(a);return d-=b.get(\"margin-top\"),c-=b.get(\"margin-left\"),new Element.Offset(d,c)}function k(a){var b=0,c=0;do b+=a.scrollTop||0,c+=a.scrollLeft||0,a=a.parentNode;while(a);return new Element.Offset(c,b)}function l(a){e=$(e);var b=0,c=0,d=document.body,e=a;do if(b+=e.offsetTop||0,c+=e.offsetLeft||0,e.offsetParent==d&&\"absolute\"==Element.getStyle(e,\"position\"))break;while(e=e.offsetParent);e=a;do e!=d&&(b-=e.scrollTop||0,c-=e.scrollLeft||0);while(e=e.parentNode);return new Element.Offset(c,b)}function m(a){if(a=$(a),\"absolute\"===Element.getStyle(a,\"position\"))return a;var b=h(a),c=a.viewportOffset(),d=b.viewportOffset(),e=c.relativeTo(d),f=a.getLayout();return a.store(\"prototype_absolutize_original_styles\",{left:a.getStyle(\"left\"),top:a.getStyle(\"top\"),width:a.getStyle(\"width\"),height:a.getStyle(\"height\")}),a.setStyle({position:\"absolute\",top:e.top+\"px\",left:e.left+\"px\",width:f.get(\"width\")+\"px\",height:f.get(\"height\")+\"px\"}),a}function n(a){if(a=$(a),\"relative\"===Element.getStyle(a,\"position\"))return a;var b=a.retrieve(\"prototype_absolutize_original_styles\");return b&&a.setStyle(b),a}function o(a){return\"BODY\"===a.nodeName.toUpperCase()}function p(a){return\"HTML\"===a.nodeName.toUpperCase()}function q(a){return a.nodeType===Node.DOCUMENT_NODE}function r(a){return a!==document.body&&!Element.descendantOf(a,document.body)}var s=Prototype.K;\"currentStyle\"in document.documentElement&&(s=function(a){return a.currentStyle.hasLayout||(a.style.zoom=1),a}),Element.Layout=Class.create(Hash,{initialize:function(a,b,c){a(),this.element=$(b),Element.Layout.PROPERTIES.each(function(a){this._set(a,null)},this),c&&(this._preComputing=!0,this._begin(),Element.Layout.PROPERTIES.each(this._compute,this),this._end(),this._preComputing=!1)},_set:function(a,b){return Hash.prototype.set.call(this,a,b)},set:function(){throw\"Properties of Element.Layout are read-only.\"},get:function(a,b){var c=a(b);return null===c?this._compute(b):c},_begin:function(){if(!this._prepared){var a=this.element;if(c(a))return void(this._prepared=!0);var d={position:a.style.position||\"\",width:a.style.width||\"\",visibility:a.style.visibility||\"\",display:a.style.display||\"\"};a.store(\"prototype_original_styles\",d);var e=a.getStyle(\"position\"),f=a.getStyle(\"width\");(\"0px\"===f||null===f)&&(a.style.display=\"block\",f=a.getStyle(\"width\"));var g=\"fixed\"===e?document.viewport:a.parentNode;a.setStyle({position:\"absolute\",visibility:\"hidden\",display:\"block\"});var h,i=a.getStyle(\"width\");if(f&&i===f)h=b(a,\"width\",g);else if(\"absolute\"===e||\"fixed\"===e)h=b(a,\"width\",g);else{var j=a.parentNode,k=$(j).getLayout();h=k.get(\"width\")-this.get(\"margin-left\")-this.get(\"border-left\")-this.get(\"padding-left\")-this.get(\"padding-right\")-this.get(\"border-right\")-this.get(\"margin-right\")}a.setStyle({width:h+\"px\"}),this._prepared=!0}},_end:function(){var a=this.element,b=a.retrieve(\"prototype_original_styles\");a.store(\"prototype_original_styles\",null),a.setStyle(b),this._prepared=!1},_compute:function(a){var b=Element.Layout.COMPUTATIONS;if(!(a in b))throw\"Property not found.\";return this._set(a,b[a].call(this,this.element))},toObject:function(){var a=$A(arguments),b=0===a.length?Element.Layout.PROPERTIES:a.join(\" \").split(\" \"),c={};return b.each(function(a){if(Element.Layout.PROPERTIES.include(a)){var b=this.get(a);null!=b&&(c[a]=b)}},this),c},toHash:function(){var a=this.toObject.apply(this,arguments);return new Hash(a)},toCSS:function(){var a=$A(arguments),b=0===a.length?Element.Layout.PROPERTIES:a.join(\" \").split(\" \"),c={};return b.each(function(a){if(Element.Layout.PROPERTIES.include(a)&&!Element.Layout.COMPOSITE_PROPERTIES.include(a)){var b=this.get(a);null!=b&&(c[d(a)]=b+\"px\")}},this),c},inspect:function(){return\"#<Element.Layout>\"}}),Object.extend(Element.Layout,{PROPERTIES:$w(\"height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height\"),COMPOSITE_PROPERTIES:$w(\"padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height\"),COMPUTATIONS:{height:function(){this._preComputing||this._begin();var a=this.get(\"border-box-height\");if(0>=a)return this._preComputing||this._end(),0;var b=this.get(\"border-top\"),c=this.get(\"border-bottom\"),d=this.get(\"padding-top\"),e=this.get(\"padding-bottom\");return this._preComputing||this._end(),a-b-c-d-e},width:function(){this._preComputing||this._begin();var a=this.get(\"border-box-width\");if(0>=a)return this._preComputing||this._end(),0;var b=this.get(\"border-left\"),c=this.get(\"border-right\"),d=this.get(\"padding-left\"),e=this.get(\"padding-right\");return this._preComputing||this._end(),a-b-c-d-e},\"padding-box-height\":function(){var a=this.get(\"height\"),b=this.get(\"padding-top\"),c=this.get(\"padding-bottom\");return a+b+c},\"padding-box-width\":function(){var a=this.get(\"width\"),b=this.get(\"padding-left\"),c=this.get(\"padding-right\");return a+b+c},\"border-box-height\":function(a){this._preComputing||this._begin();var b=a.offsetHeight;return this._preComputing||this._end(),b},\"border-box-width\":function(a){this._preComputing||this._begin();var b=a.offsetWidth;return this._preComputing||this._end(),b},\"margin-box-height\":function(){var a=this.get(\"border-box-height\"),b=this.get(\"margin-top\"),c=this.get(\"margin-bottom\");return 0>=a?0:a+b+c},\"margin-box-width\":function(){var a=this.get(\"border-box-width\"),b=this.get(\"margin-left\"),c=this.get(\"margin-right\");return 0>=a?0:a+b+c},top:function(a){var b=a.positionedOffset();return b.top},bottom:function(a){var b=a.positionedOffset(),c=a.getOffsetParent(),d=c.measure(\"height\"),e=this.get(\"border-box-height\");return d-e-b.top},left:function(a){var b=a.positionedOffset();return b.left},right:function(a){var b=a.positionedOffset(),c=a.getOffsetParent(),d=c.measure(\"width\"),e=this.get(\"border-box-width\");return d-e-b.left},\"padding-top\":function(a){return b(a,\"paddingTop\")},\"padding-bottom\":function(a){return b(a,\"paddingBottom\")},\"padding-left\":function(a){return b(a,\"paddingLeft\")},\"padding-right\":function(a){return b(a,\"paddingRight\")},\"border-top\":function(a){return b(a,\"borderTopWidth\")},\"border-bottom\":function(a){return b(a,\"borderBottomWidth\")},\"border-left\":function(a){return b(a,\"borderLeftWidth\")},\"border-right\":function(a){return b(a,\"borderRightWidth\")},\"margin-top\":function(a){return b(a,\"marginTop\")},\"margin-bottom\":function(a){return b(a,\"marginBottom\")},\"margin-left\":function(a){return b(a,\"marginLeft\")},\"margin-right\":function(a){return b(a,\"marginRight\")}}}),\"getBoundingClientRect\"in document.documentElement&&Object.extend(Element.Layout.COMPUTATIONS,{right:function(a){var b=s(a.getOffsetParent()),c=a.getBoundingClientRect(),d=b.getBoundingClientRect();return(d.right-c.right).round()},bottom:function(a){var b=s(a.getOffsetParent()),c=a.getBoundingClientRect(),d=b.getBoundingClientRect();return(d.bottom-c.bottom).round()}}),Element.Offset=Class.create({initialize:function(a,b){this.left=a.round(),this.top=b.round(),this[0]=this.left,this[1]=this.top},relativeTo:function(a){return new Element.Offset(this.left-a.left,this.top-a.top)},inspect:function(){return\"#<Element.Offset left: #{left} top: #{top}>\".interpolate(this)},toString:function(){return\"[#{left}, #{top}]\".interpolate(this)},toArray:function(){return[this.left,this.top]}}),Prototype.Browser.IE?(h=h.wrap(function(a,b){if(b=$(b),q(b)||r(b)||o(b)||p(b))return $(document.body);var c=b.getStyle(\"position\");if(\"static\"!==c)return a(b);b.setStyle({position:\"relative\"});var d=a(b);return b.setStyle({position:c}),d}),j=j.wrap(function(a,b){if(b=$(b),!b.parentNode)return new Element.Offset(0,0);var c=b.getStyle(\"position\");if(\"static\"!==c)return a(b);var d=b.getOffsetParent();d&&\"fixed\"===d.getStyle(\"position\")&&s(d),b.setStyle({position:\"relative\"});var e=a(b);return b.setStyle({position:c}),e})):Prototype.Browser.Webkit&&(i=function(a){a=$(a);var b=0,c=0;do{if(b+=a.offsetTop||0,c+=a.offsetLeft||0,a.offsetParent==document.body&&\"absolute\"==Element.getStyle(a,\"position\"))break;a=a.offsetParent}while(a);return new Element.Offset(c,b)}),Element.addMethods({getLayout:e,measure:f,getDimensions:g,getOffsetParent:h,cumulativeOffset:i,positionedOffset:j,cumulativeScrollOffset:k,viewportOffset:l,absolutize:m,relativize:n}),\"getBoundingClientRect\"in document.documentElement&&Element.addMethods({viewportOffset:function(a){if(a=$(a),r(a))return new Element.Offset(0,0);var b=a.getBoundingClientRect(),c=document.documentElement;return new Element.Offset(b.left-c.clientLeft,b.top-c.clientTop)}})}(),window.$$=function(){var a=$A(arguments).join(\", \");return Prototype.Selector.select(a,document)},Prototype.Selector=function(){function a(){throw new Error('Method \"Prototype.Selector.select\" must be defined.')}function b(){throw new Error('Method \"Prototype.Selector.match\" must be defined.')}function c(a,b,c){c=c||0;var d,e=Prototype.Selector.match,f=a.length,g=0;for(d=0;f>d;d++)if(e(a[d],b)&&c==g++)return Element.extend(a[d])}function d(a){for(var b=0,c=a.length;c>b;b++)Element.extend(a[b]);return a}var e=Prototype.K;return{select:a,match:b,find:c,extendElements:Element.extend===e?e:d,extendElement:Element.extend}}(),Prototype._original_property=window.Sizzle,function(){function a(a,b,c,d,e,f){for(var g=\"previousSibling\"==a&&!f,h=0,i=d.length;i>h;h++){var j=d[h];if(j){g&&1===j.nodeType&&(j.sizcache=c,j.sizset=h),j=j[a];for(var k=!1;j;){if(j.sizcache===c){k=d[j.sizset];break}if(1!==j.nodeType||f||(j.sizcache=c,j.sizset=h),j.nodeName===b){k=j;break}j=j[a]}d[h]=k}}}function b(a,b,c,d,e,f){for(var g=\"previousSibling\"==a&&!f,i=0,j=d.length;j>i;i++){var k=d[i];if(k){g&&1===k.nodeType&&(k.sizcache=c,k.sizset=i),k=k[a];for(var l=!1;k;){if(k.sizcache===c){l=d[k.sizset];break}if(1===k.nodeType)if(f||(k.sizcache=c,k.sizset=i),\"string\"!=typeof b){if(k===b){l=!0;break}}else if(h.filter(b,[k]).length>0){l=k;break}k=k[a]}d[i]=l}}}var c=/((?:\\((?:\\([^()]+\\)|[^()]+)+\\)|\\[(?:\\[[^[\\]]*\\]|['\"][^'\"]*['\"]|[^[\\]'\"]+)+\\]|\\\\.|[^ >+~,(\\[\\\\]+)+|[>+~])(\\s*,\\s*)?((?:.|\\r|\\n)*)/g,d=0,e=Object.prototype.toString,f=!1,g=!0;[0,0].sort(function(){return g=!1,0});var h=function(a,b,d,f){d=d||[];var g=b=b||document;if(1!==b.nodeType&&9!==b.nodeType)return[];if(!a||\"string\"!=typeof a)return d;for(var k,m,n,r,s=[],t=!0,u=p(b),v=a;null!==(c.exec(\"\"),k=c.exec(v));)if(v=k[3],s.push(k[1]),k[2]){r=k[3];break}if(s.length>1&&j.exec(a))if(2===s.length&&i.relative[s[0]])m=q(s[0]+s[1],b);else for(m=i.relative[s[0]]?[b]:h(s.shift(),b);s.length;)a=s.shift(),i.relative[a]&&(a+=s.shift()),m=q(a,m);else{if(!f&&s.length>1&&9===b.nodeType&&!u&&i.match.ID.test(s[0])&&!i.match.ID.test(s[s.length-1])){var w=h.find(s.shift(),b,u);b=w.expr?h.filter(w.expr,w.set)[0]:w.set[0]}if(b){var w=f?{expr:s.pop(),set:l(f)}:h.find(s.pop(),1!==s.length||\"~\"!==s[0]&&\"+\"!==s[0]||!b.parentNode?b:b.parentNode,u);for(m=w.expr?h.filter(w.expr,w.set):w.set,s.length>0?n=l(m):t=!1;s.length;){var x=s.pop(),y=x;i.relative[x]?y=s.pop():x=\"\",null==y&&(y=b),i.relative[x](n,y,u)}}else n=s=[]}if(n||(n=m),!n)throw\"Syntax error, unrecognized expression: \"+(x||a);if(\"[object Array]\"===e.call(n))if(t)if(b&&1===b.nodeType)for(var z=0;null!=n[z];z++)n[z]&&(n[z]===!0||1===n[z].nodeType&&o(b,n[z]))&&d.push(m[z]);else for(var z=0;null!=n[z];z++)n[z]&&1===n[z].nodeType&&d.push(m[z]);else d.push.apply(d,n);else l(n,d);return r&&(h(r,g,d,f),h.uniqueSort(d)),d};h.uniqueSort=function(a){if(n&&(f=g,a.sort(n),f))for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1);return a},h.matches=function(a,b){return h(a,null,null,b)},h.find=function(a,b,c){var d,e;if(!a)return[];for(var f=0,g=i.order.length;g>f;f++){var e,h=i.order[f];if(e=i.leftMatch[h].exec(a)){var j=e[1];if(e.splice(1,1),\"\\\\\"!==j.substr(j.length-1)&&(e[1]=(e[1]||\"\").replace(/\\\\/g,\"\"),d=i.find[h](e,b,c),null!=d)){a=a.replace(i.match[h],\"\");break}}}return d||(d=b.getElementsByTagName(\"*\")),{set:d,expr:a}},h.filter=function(a,b,c,d){for(var e,f,g=a,h=[],j=b,k=b&&b[0]&&p(b[0]);a&&b.length;){for(var l in i.filter)if(null!=(e=i.match[l].exec(a))){var m,n,o=i.filter[l];if(f=!1,j==h&&(h=[]),i.preFilter[l])if(e=i.preFilter[l](e,j,c,h,d,k)){if(e===!0)continue}else f=m=!0;if(e)for(var q=0;null!=(n=j[q]);q++)if(n){m=o(n,e,q,j);var r=d^!!m;c&&null!=m?r?f=!0:j[q]=!1:r&&(h.push(n),f=!0)}if(void 0!==m){if(c||(j=h),a=a.replace(i.match[l],\"\"),!f)return[];break}}if(a==g){if(null==f)throw\"Syntax error, unrecognized expression: \"+a;break}g=a}return j};var i=h.selectors={order:[\"ID\",\"NAME\",\"TAG\"],match:{ID:/#((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)/,CLASS:/\\.((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)/,NAME:/\\[name=['\"]*((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)['\"]*\\]/,ATTR:/\\[\\s*((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)\\s*(?:(\\S?=)\\s*(['\"]*)(.*?)\\3|)\\s*\\]/,TAG:/^((?:[\\w\\u00c0-\\uFFFF\\*-]|\\\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\\((even|odd|[\\dn+-]*)\\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\\((\\d*)\\))?(?=[^-]|$)/,PSEUDO:/:((?:[\\w\\u00c0-\\uFFFF-]|\\\\.)+)(?:\\((['\"]*)((?:\\([^\\)]+\\)|[^\\2\\(\\)]*)+)\\2\\))?/},leftMatch:{},attrMap:{\"class\":\"className\",\"for\":\"htmlFor\"},attrHandle:{href:function(a){return a.getAttribute(\"href\")}},relative:{\"+\":function(a,b,c){var d=\"string\"==typeof b,e=d&&!/\\W/.test(b),f=d&&!e;e&&!c&&(b=b.toUpperCase());for(var g,i=0,j=a.length;j>i;i++)if(g=a[i]){for(;(g=g.previousSibling)&&1!==g.nodeType;);a[i]=f||g&&g.nodeName===b?g||!1:g===b}f&&h.filter(b,a,!0)},\">\":function(a,b,c){var d=\"string\"==typeof b;if(d&&!/\\W/.test(b)){b=c?b:b.toUpperCase();for(var e=0,f=a.length;f>e;e++){var g=a[e];if(g){var i=g.parentNode;a[e]=i.nodeName===b?i:!1}}}else{for(var e=0,f=a.length;f>e;e++){var g=a[e];\ng&&(a[e]=d?g.parentNode:g.parentNode===b)}d&&h.filter(b,a,!0)}},\"\":function(c,e,f){var g=d++,h=b;if(!/\\W/.test(e)){var i=e=f?e:e.toUpperCase();h=a}h(\"parentNode\",e,g,c,i,f)},\"~\":function(c,e,f){var g=d++,h=b;if(\"string\"==typeof e&&!/\\W/.test(e)){var i=e=f?e:e.toUpperCase();h=a}h(\"previousSibling\",e,g,c,i,f)}},find:{ID:function(a,b,c){if(\"undefined\"!=typeof b.getElementById&&!c){var d=b.getElementById(a[1]);return d?[d]:[]}},NAME:function(a,b){if(\"undefined\"!=typeof b.getElementsByName){for(var c=[],d=b.getElementsByName(a[1]),e=0,f=d.length;f>e;e++)d[e].getAttribute(\"name\")===a[1]&&c.push(d[e]);return 0===c.length?null:c}},TAG:function(a,b){return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){if(a=\" \"+a[1].replace(/\\\\/g,\"\")+\" \",f)return a;for(var g,h=0;null!=(g=b[h]);h++)g&&(e^(g.className&&(\" \"+g.className+\" \").indexOf(a)>=0)?c||d.push(g):c&&(b[h]=!1));return!1},ID:function(a){return a[1].replace(/\\\\/g,\"\")},TAG:function(a,b){for(var c=0;b[c]===!1;c++);return b[c]&&p(b[c])?a[1]:a[1].toUpperCase()},CHILD:function(a){if(\"nth\"==a[1]){var b=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.exec(\"even\"==a[2]&&\"2n\"||\"odd\"==a[2]&&\"2n+1\"||!/\\D/.test(a[2])&&\"0n+\"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}return a[0]=d++,a},ATTR:function(a,b,c,d,e,f){var g=a[1].replace(/\\\\/g,\"\");return!f&&i.attrMap[g]&&(a[1]=i.attrMap[g]),\"~=\"===a[2]&&(a[4]=\" \"+a[4]+\" \"),a},PSEUDO:function(a,b,d,e,f){if(\"not\"===a[1]){if(!((c.exec(a[3])||\"\").length>1||/^\\w/.test(a[3]))){var g=h.filter(a[3],b,d,!0^f);return d||e.push.apply(e,g),!1}a[3]=h(a[3],null,null,b)}else if(i.match.POS.test(a[0])||i.match.CHILD.test(a[0]))return!0;return a},POS:function(a){return a.unshift(!0),a}},filters:{enabled:function(a){return a.disabled===!1&&\"hidden\"!==a.type},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){return a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!h(c[3],a).length},header:function(a){return/h\\d/i.test(a.nodeName)},text:function(a){return\"text\"===a.type},radio:function(a){return\"radio\"===a.type},checkbox:function(a){return\"checkbox\"===a.type},file:function(a){return\"file\"===a.type},password:function(a){return\"password\"===a.type},submit:function(a){return\"submit\"===a.type},image:function(a){return\"image\"===a.type},reset:function(a){return\"reset\"===a.type},button:function(a){return\"button\"===a.type||\"BUTTON\"===a.nodeName.toUpperCase()},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return 0===b},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0==b},eq:function(a,b,c){return c[3]-0==b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=i.filters[e];if(f)return f(a,c,b,d);if(\"contains\"===e)return(a.textContent||a.innerText||\"\").indexOf(b[3])>=0;if(\"not\"===e){for(var g=b[3],c=0,h=g.length;h>c;c++)if(g[c]===a)return!1;return!0}},CHILD:function(a,b){var c=b[1],d=a;switch(c){case\"only\":case\"first\":for(;d=d.previousSibling;)if(1===d.nodeType)return!1;if(\"first\"==c)return!0;d=a;case\"last\":for(;d=d.nextSibling;)if(1===d.nodeType)return!1;return!0;case\"nth\":var e=b[2],f=b[3];if(1==e&&0==f)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)1===d.nodeType&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return 0==e?0==j:j%e==0&&j/e>=0}},ID:function(a,b){return 1===a.nodeType&&a.getAttribute(\"id\")===b},TAG:function(a,b){return\"*\"===b&&1===a.nodeType||a.nodeName===b},CLASS:function(a,b){return(\" \"+(a.className||a.getAttribute(\"class\"))+\" \").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=i.attrHandle[c]?i.attrHandle[c](a):null!=a[c]?a[c]:a.getAttribute(c),e=d+\"\",f=b[2],g=b[4];return null==d?\"!=\"===f:\"=\"===f?e===g:\"*=\"===f?e.indexOf(g)>=0:\"~=\"===f?(\" \"+e+\" \").indexOf(g)>=0:g?\"!=\"===f?e!=g:\"^=\"===f?0===e.indexOf(g):\"$=\"===f?e.substr(e.length-g.length)===g:\"|=\"===f?e===g||e.substr(0,g.length+1)===g+\"-\":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=i.setFilters[e];return f?f(a,c,b,d):void 0}}},j=i.match.POS;for(var k in i.match)i.match[k]=new RegExp(i.match[k].source+/(?![^\\[]*\\])(?![^\\(]*\\))/.source),i.leftMatch[k]=new RegExp(/(^(?:.|\\r|\\n)*?)/.source+i.match[k].source);var l=function(a,b){return a=Array.prototype.slice.call(a,0),b?(b.push.apply(b,a),b):a};try{Array.prototype.slice.call(document.documentElement.childNodes,0)}catch(m){l=function(a,b){var c=b||[];if(\"[object Array]\"===e.call(a))Array.prototype.push.apply(c,a);else if(\"number\"==typeof a.length)for(var d=0,f=a.length;f>d;d++)c.push(a[d]);else for(var d=0;a[d];d++)c.push(a[d]);return c}}var n;document.documentElement.compareDocumentPosition?n=function(a,b){if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a==b&&(f=!0),0;var c=4&a.compareDocumentPosition(b)?-1:a===b?0:1;return 0===c&&(f=!0),c}:\"sourceIndex\"in document.documentElement?n=function(a,b){if(!a.sourceIndex||!b.sourceIndex)return a==b&&(f=!0),0;var c=a.sourceIndex-b.sourceIndex;return 0===c&&(f=!0),c}:document.createRange&&(n=function(a,b){if(!a.ownerDocument||!b.ownerDocument)return a==b&&(f=!0),0;var c=a.ownerDocument.createRange(),d=b.ownerDocument.createRange();c.setStart(a,0),c.setEnd(a,0),d.setStart(b,0),d.setEnd(b,0);var e=c.compareBoundaryPoints(Range.START_TO_END,d);return 0===e&&(f=!0),e}),function(){var a=document.createElement(\"div\"),b=\"script\"+(new Date).getTime();a.innerHTML=\"<a name='\"+b+\"'/>\";var c=document.documentElement;c.insertBefore(a,c.firstChild),document.getElementById(b)&&(i.find.ID=function(a,b,c){if(\"undefined\"!=typeof b.getElementById&&!c){var d=b.getElementById(a[1]);return d?d.id===a[1]||\"undefined\"!=typeof d.getAttributeNode&&d.getAttributeNode(\"id\").nodeValue===a[1]?[d]:void 0:[]}},i.filter.ID=function(a,b){var c=\"undefined\"!=typeof a.getAttributeNode&&a.getAttributeNode(\"id\");return 1===a.nodeType&&c&&c.nodeValue===b}),c.removeChild(a),c=a=null}(),function(){var a=document.createElement(\"div\");a.appendChild(document.createComment(\"\")),a.getElementsByTagName(\"*\").length>0&&(i.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(\"*\"===a[1]){for(var d=[],e=0;c[e];e++)1===c[e].nodeType&&d.push(c[e]);c=d}return c}),a.innerHTML=\"<a href='#'></a>\",a.firstChild&&\"undefined\"!=typeof a.firstChild.getAttribute&&\"#\"!==a.firstChild.getAttribute(\"href\")&&(i.attrHandle.href=function(a){return a.getAttribute(\"href\",2)}),a=null}(),document.querySelectorAll&&function(){var a=h,b=document.createElement(\"div\");if(b.innerHTML=\"<p class='TEST'></p>\",!b.querySelectorAll||0!==b.querySelectorAll(\".TEST\").length){h=function(b,c,d,e){if(c=c||document,!e&&9===c.nodeType&&!p(c))try{return l(c.querySelectorAll(b),d)}catch(f){}return a(b,c,d,e)};for(var c in a)h[c]=a[c];b=null}}(),document.getElementsByClassName&&document.documentElement.getElementsByClassName&&function(){var a=document.createElement(\"div\");a.innerHTML=\"<div class='test e'></div><div class='test'></div>\",0!==a.getElementsByClassName(\"e\").length&&(a.lastChild.className=\"e\",1!==a.getElementsByClassName(\"e\").length&&(i.order.splice(1,0,\"CLASS\"),i.find.CLASS=function(a,b,c){return\"undefined\"==typeof b.getElementsByClassName||c?void 0:b.getElementsByClassName(a[1])},a=null))}();var o=document.compareDocumentPosition?function(a,b){return 16&a.compareDocumentPosition(b)}:function(a,b){return a!==b&&(a.contains?a.contains(b):!0)},p=function(a){return 9===a.nodeType&&\"HTML\"!==a.documentElement.nodeName||!!a.ownerDocument&&\"HTML\"!==a.ownerDocument.documentElement.nodeName},q=function(a,b){for(var c,d=[],e=\"\",f=b.nodeType?[b]:b;c=i.match.PSEUDO.exec(a);)e+=c[0],a=a.replace(i.match.PSEUDO,\"\");a=i.relative[a]?a+\"*\":a;for(var g=0,j=f.length;j>g;g++)h(a,f[g],d);return h.filter(e,d)};window.Sizzle=h}(),function(a){function b(b,c){return d(a(b,c||document))}function c(b,c){return 1==a.matches(c,[b]).length}var d=Prototype.Selector.extendElements;Prototype.Selector.engine=a,Prototype.Selector.select=b,Prototype.Selector.match=c}(Sizzle),window.Sizzle=Prototype._original_property,delete Prototype._original_property;var Form={reset:function(a){return a=$(a),a.reset(),a},serializeElements:function(a,b){\"object\"!=typeof b?b={hash:!!b}:Object.isUndefined(b.hash)&&(b.hash=!0);var c,d,e,f,g=!1,h=b.submit;return b.hash?(f={},e=function(a,b,c){return b in a?(Object.isArray(a[b])||(a[b]=[a[b]]),a[b].push(c)):a[b]=c,a}):(f=\"\",e=function(a,b,c){return a+(a?\"&\":\"\")+encodeURIComponent(b)+\"=\"+encodeURIComponent(c)}),a.inject(f,function(a,b){return!b.disabled&&b.name&&(c=b.name,d=$(b).getValue(),null==d||\"file\"==b.type||\"submit\"==b.type&&(g||h===!1||h&&c!=h||!(g=!0))||(a=e(a,c,d))),a})}};Form.Methods={serialize:function(a,b){return Form.serializeElements(Form.getElements(a),b)},getElements:function(a){for(var b,c=$(a).getElementsByTagName(\"*\"),d=[],e=Form.Element.Serializers,f=0;b=c[f];f++)d.push(b);return d.inject([],function(a,b){return e[b.tagName.toLowerCase()]&&a.push(Element.extend(b)),a})},getInputs:function(a,b,c){a=$(a);var d=a.getElementsByTagName(\"input\");if(!b&&!c)return $A(d).map(Element.extend);for(var e=0,f=[],g=d.length;g>e;e++){var h=d[e];b&&h.type!=b||c&&h.name!=c||f.push(Element.extend(h))}return f},disable:function(a){return a=$(a),Form.getElements(a).invoke(\"disable\"),a},enable:function(a){return a=$(a),Form.getElements(a).invoke(\"enable\"),a},findFirstElement:function(a){var b=$(a).getElements().findAll(function(a){return\"hidden\"!=a.type&&!a.disabled}),c=b.findAll(function(a){return a.hasAttribute(\"tabIndex\")&&a.tabIndex>=0}).sortBy(function(a){return a.tabIndex}).first();return c?c:b.find(function(a){return/^(?:input|select|textarea)$/i.test(a.tagName)})},focusFirstElement:function(a){a=$(a);var b=a.findFirstElement();return b&&b.activate(),a},request:function(a,b){a=$(a),b=Object.clone(b||{});var c=b.parameters,d=a.readAttribute(\"action\")||\"\";return d.blank()&&(d=window.location.href),b.parameters=a.serialize(!0),c&&(Object.isString(c)&&(c=c.toQueryParams()),Object.extend(b.parameters,c)),a.hasAttribute(\"method\")&&!b.method&&(b.method=a.method),new Ajax.Request(d,b)}},Form.Element={focus:function(a){return $(a).focus(),a},select:function(a){return $(a).select(),a}},Form.Element.Methods={serialize:function(a){if(a=$(a),!a.disabled&&a.name){var b=a.getValue();if(void 0!=b){var c={};return c[a.name]=b,Object.toQueryString(c)}}return\"\"},getValue:function(a){a=$(a);var b=a.tagName.toLowerCase();return Form.Element.Serializers[b](a)},setValue:function(a,b){a=$(a);var c=a.tagName.toLowerCase();return Form.Element.Serializers[c](a,b),a},clear:function(a){return $(a).value=\"\",a},present:function(a){return\"\"!=$(a).value},activate:function(a){a=$(a);try{a.focus(),!a.select||\"input\"==a.tagName.toLowerCase()&&/^(?:button|reset|submit)$/i.test(a.type)||a.select()}catch(b){}return a},disable:function(a){return a=$(a),a.disabled=!0,a},enable:function(a){return a=$(a),a.disabled=!1,a}};var Field=Form.Element,$F=Form.Element.Methods.getValue;Form.Element.Serializers=function(){function a(a,d){switch(a.type.toLowerCase()){case\"checkbox\":case\"radio\":return b(a,d);default:return c(a,d)}}function b(a,b){return Object.isUndefined(b)?a.checked?a.value:null:void(a.checked=!!b)}function c(a,b){return Object.isUndefined(b)?a.value:void(a.value=b)}function d(a,b){if(Object.isUndefined(b))return(\"select-one\"===a.type?e:f)(a);for(var c,d,g=!Object.isArray(b),h=0,i=a.length;i>h;h++)if(c=a.options[h],d=this.optionValue(c),g){if(d==b)return void(c.selected=!0)}else c.selected=b.include(d)}function e(a){var b=a.selectedIndex;return b>=0?g(a.options[b]):null}function f(a){var b,c=a.length;if(!c)return null;for(var d=0,b=[];c>d;d++){var e=a.options[d];e.selected&&b.push(g(e))}return b}function g(a){return Element.hasAttribute(a,\"value\")?a.value:a.text}return{input:a,inputSelector:b,textarea:c,select:d,selectOne:e,selectMany:f,optionValue:g,button:c}}(),Abstract.TimedObserver=Class.create(PeriodicalExecuter,{initialize:function(a,b,c,d){a(d,c),this.element=$(b),this.lastValue=this.getValue()},execute:function(){var a=this.getValue();(Object.isString(this.lastValue)&&Object.isString(a)?this.lastValue!=a:String(this.lastValue)!=String(a))&&(this.callback(this.element,a),this.lastValue=a)}}),Form.Element.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.Element.getValue(this.element)}}),Form.Observer=Class.create(Abstract.TimedObserver,{getValue:function(){return Form.serialize(this.element)}}),Abstract.EventObserver=Class.create({initialize:function(a,b){this.element=$(a),this.callback=b,this.lastValue=this.getValue(),\"form\"==this.element.tagName.toLowerCase()?this.registerFormCallbacks():this.registerCallback(this.element)},onElementEvent:function(){var a=this.getValue();this.lastValue!=a&&(this.callback(this.element,a),this.lastValue=a)},registerFormCallbacks:function(){Form.getElements(this.element).each(this.registerCallback,this)},registerCallback:function(a){if(a.type)switch(a.type.toLowerCase()){case\"checkbox\":case\"radio\":Event.observe(a,\"click\",this.onElementEvent.bind(this));break;default:Event.observe(a,\"change\",this.onElementEvent.bind(this))}}}),Form.Element.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.Element.getValue(this.element)}}),Form.EventObserver=Class.create(Abstract.EventObserver,{getValue:function(){return Form.serialize(this.element)}}),function(){function a(a,b){return a.which?a.which===b+1:a.button===b}function b(a,b){return a.button===y[b]}function c(a,b){switch(b){case 0:return 1==a.which&&!a.metaKey;case 1:return 2==a.which||1==a.which&&a.metaKey;case 2:return 3==a.which;default:return!1}}function d(a){return x(a,0)}function e(a){return x(a,1)}function f(a){return x(a,2)}function g(a){a=t.extend(a);var b=a.target,c=a.type,d=a.currentTarget;return d&&d.tagName&&(\"load\"===c||\"error\"===c||\"click\"===c&&\"input\"===d.tagName.toLowerCase()&&\"radio\"===d.type)&&(b=d),b.nodeType==Node.TEXT_NODE&&(b=b.parentNode),Element.extend(b)}function h(a,b){var c=t.element(a);if(!b)return c;for(;c;){if(Object.isElement(c)&&Prototype.Selector.match(c,b))return Element.extend(c);c=c.parentNode}}function i(a){return{x:j(a),y:k(a)}}function j(a){var b=document.documentElement,c=document.body||{scrollLeft:0};return a.pageX||a.clientX+(b.scrollLeft||c.scrollLeft)-(b.clientLeft||0)}function k(a){var b=document.documentElement,c=document.body||{scrollTop:0};return a.pageY||a.clientY+(b.scrollTop||c.scrollTop)-(b.clientTop||0)}function l(a){t.extend(a),a.preventDefault(),a.stopPropagation(),a.stopped=!0}function m(a){var b;switch(a.type){case\"mouseover\":case\"mouseenter\":b=a.fromElement;break;case\"mouseout\":case\"mouseleave\":b=a.toElement;break;default:return null}return Element.extend(b)}function n(a,b,c){var d=Element.retrieve(a,\"prototype_event_registry\");Object.isUndefined(d)&&(B.push(a),d=Element.retrieve(a,\"prototype_event_registry\",$H()));var e=d.get(b);if(Object.isUndefined(e)&&(e=[],d.set(b,e)),e.pluck(\"handler\").include(c))return!1;var f;return b.include(\":\")?f=function(d){return Object.isUndefined(d.eventName)?!1:d.eventName!==b?!1:(t.extend(d,a),void c.call(a,d))}:v||\"mouseenter\"!==b&&\"mouseleave\"!==b?f=function(b){t.extend(b,a),c.call(a,b)}:(\"mouseenter\"===b||\"mouseleave\"===b)&&(f=function(b){t.extend(b,a);for(var d=b.relatedTarget;d&&d!==a;)try{d=d.parentNode}catch(e){d=a}d!==a&&c.call(a,b)}),f.handler=c,e.push(f),f}function o(){for(var a=0,b=B.length;b>a;a++)t.stopObserving(B[a]),B[a]=null}function p(a,b,c){a=$(a);var d=n(a,b,c);if(!d)return a;if(b.include(\":\"))a.addEventListener?a.addEventListener(\"dataavailable\",d,!1):(a.attachEvent(\"ondataavailable\",d),a.attachEvent(\"onlosecapture\",d));else{var e=C(b);a.addEventListener?a.addEventListener(e,d,!1):a.attachEvent(\"on\"+e,d)}return a}function q(a,b,c){a=$(a);var d=Element.retrieve(a,\"prototype_event_registry\");if(!d)return a;if(!b)return d.each(function(b){var c=b.key;q(a,c)}),a;var e=d.get(b);if(!e)return a;if(!c)return e.each(function(c){q(a,b,c.handler)}),a;for(var f,g=e.length;g--;)if(e[g].handler===c){f=e[g];break}if(!f)return a;if(b.include(\":\"))a.removeEventListener?a.removeEventListener(\"dataavailable\",f,!1):(a.detachEvent(\"ondataavailable\",f),a.detachEvent(\"onlosecapture\",f));else{var h=C(b);a.removeEventListener?a.removeEventListener(h,f,!1):a.detachEvent(\"on\"+h,f)}return d.set(b,e.without(f)),a}function r(a,b,c,d){a=$(a),Object.isUndefined(d)&&(d=!0),a==document&&document.createEvent&&!a.dispatchEvent&&(a=document.documentElement);var e;return document.createEvent?(e=document.createEvent(\"HTMLEvents\"),e.initEvent(\"dataavailable\",d,!0)):(e=document.createEventObject(),e.eventType=d?\"ondataavailable\":\"onlosecapture\"),e.eventName=b,e.memo=c||{},document.createEvent?a.dispatchEvent(e):a.fireEvent(e.eventType,e),t.extend(e)}function s(a,b,c,d){return a=$(a),Object.isFunction(c)&&Object.isUndefined(d)&&(d=c,c=null),new t.Handler(a,b,c,d).start()}var t={KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_LEFT:37,KEY_UP:38,KEY_RIGHT:39,KEY_DOWN:40,KEY_DELETE:46,KEY_HOME:36,KEY_END:35,KEY_PAGEUP:33,KEY_PAGEDOWN:34,KEY_INSERT:45,cache:{}},u=document.documentElement,v=\"onmouseenter\"in u&&\"onmouseleave\"in u,w=function(){return!1};window.attachEvent&&(w=window.addEventListener?function(a){return!(a instanceof window.Event)}:function(){return!0});var x,y={0:1,1:4,2:2};x=window.attachEvent?window.addEventListener?function(c,d){return w(c)?b(c,d):a(c,d)}:b:Prototype.Browser.WebKit?c:a,t.Methods={isLeftClick:d,isMiddleClick:e,isRightClick:f,element:g,findElement:h,pointer:i,pointerX:j,pointerY:k,stop:l};var z=Object.keys(t.Methods).inject({},function(a,b){return a[b]=t.Methods[b].methodize(),a});if(window.attachEvent){var A={stopPropagation:function(){this.cancelBubble=!0},preventDefault:function(){this.returnValue=!1},inspect:function(){return\"[object Event]\"}};t.extend=function(a,b){if(!a)return!1;if(!w(a))return a;if(a._extendedByPrototype)return a;a._extendedByPrototype=Prototype.emptyFunction;var c=t.pointer(a);return Object.extend(a,{target:a.srcElement||b,relatedTarget:m(a),pageX:c.x,pageY:c.y}),Object.extend(a,z),Object.extend(a,A),a}}else t.extend=Prototype.K;window.addEventListener&&(t.prototype=window.Event.prototype||document.createEvent(\"HTMLEvents\").__proto__,Object.extend(t.prototype,z));var B=[];Prototype.Browser.IE&&window.attachEvent(\"onunload\",o),Prototype.Browser.WebKit&&window.addEventListener(\"unload\",Prototype.emptyFunction,!1);var C=Prototype.K,D={mouseenter:\"mouseover\",mouseleave:\"mouseout\"};v||(C=function(a){return D[a]||a}),t.Handler=Class.create({initialize:function(a,b,c,d){this.element=$(a),this.eventName=b,this.selector=c,this.callback=d,this.handler=this.handleEvent.bind(this)},start:function(){return t.observe(this.element,this.eventName,this.handler),this},stop:function(){return t.stopObserving(this.element,this.eventName,this.handler),this},handleEvent:function(a){var b=t.findElement(a,this.selector);b&&this.callback.call(this.element,a,b)}}),Object.extend(t,t.Methods),Object.extend(t,{fire:r,observe:p,stopObserving:q,on:s}),Element.addMethods({fire:r,observe:p,stopObserving:q,on:s}),Object.extend(document,{fire:r.methodize(),observe:p.methodize(),stopObserving:q.methodize(),on:s.methodize(),loaded:!1}),window.Event?Object.extend(window.Event,t):window.Event=t}(),function(){function a(){document.loaded||(d&&window.clearTimeout(d),document.loaded=!0,document.fire(\"dom:loaded\"))}function b(){\"complete\"===document.readyState&&(document.stopObserving(\"readystatechange\",b),a())}function c(){try{document.documentElement.doScroll(\"left\")}catch(b){return void(d=c.defer())}a()}var d;document.addEventListener?document.addEventListener(\"DOMContentLoaded\",a,!1):(document.observe(\"readystatechange\",b),window==top&&(d=c.defer())),Event.observe(window,\"load\",a)}(),Element.addMethods(),Hash.toQueryString=Object.toQueryString;var Toggle={display:Element.toggle};Element.Methods.childOf=Element.Methods.descendantOf;var Insertion={Before:function(a,b){return Element.insert(a,{before:b})},Top:function(a,b){return Element.insert(a,{top:b})},Bottom:function(a,b){return Element.insert(a,{bottom:b})},After:function(a,b){return Element.insert(a,{after:b})}},$continue=new Error('\"throw $continue\" is deprecated, use \"return\" instead'),Position={includeScrollOffsets:!1,prepare:function(){this.deltaX=window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0,this.deltaY=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0},within:function(a,b,c){return this.includeScrollOffsets?this.withinIncludingScrolloffsets(a,b,c):(this.xcomp=b,this.ycomp=c,this.offset=Element.cumulativeOffset(a),c>=this.offset[1]&&c<this.offset[1]+a.offsetHeight&&b>=this.offset[0]&&b<this.offset[0]+a.offsetWidth)},withinIncludingScrolloffsets:function(a,b,c){var d=Element.cumulativeScrollOffset(a);return this.xcomp=b+d[0]-this.deltaX,this.ycomp=c+d[1]-this.deltaY,this.offset=Element.cumulativeOffset(a),this.ycomp>=this.offset[1]&&this.ycomp<this.offset[1]+a.offsetHeight&&this.xcomp>=this.offset[0]&&this.xcomp<this.offset[0]+a.offsetWidth},overlap:function(a,b){return a?\"vertical\"==a?(this.offset[1]+b.offsetHeight-this.ycomp)/b.offsetHeight:\"horizontal\"==a?(this.offset[0]+b.offsetWidth-this.xcomp)/b.offsetWidth:void 0:0},cumulativeOffset:Element.Methods.cumulativeOffset,positionedOffset:Element.Methods.positionedOffset,absolutize:function(a){return Position.prepare(),Element.absolutize(a)},relativize:function(a){return Position.prepare(),Element.relativize(a)},realOffset:Element.Methods.cumulativeScrollOffset,offsetParent:Element.Methods.getOffsetParent,page:Element.Methods.viewportOffset,clone:function(a,b,c){return c=c||{},Element.clonePosition(b,a,c)}};document.getElementsByClassName||(document.getElementsByClassName=function(a){function b(a){return a.blank()?null:\"[contains(concat(' ', @class, ' '), ' \"+a+\" ')]\"}return a.getElementsByClassName=Prototype.BrowserFeatures.XPath?function(a,c){c=c.toString().strip();var d=/\\s/.test(c)?$w(c).map(b).join(\"\"):b(c);return d?document._getElementsByXPath(\".//*\"+d,a):[]}:function(a,b){b=b.toString().strip();var c=[],d=/\\s/.test(b)?$w(b):null;if(!d&&!b)return c;var e=$(a).getElementsByTagName(\"*\");b=\" \"+b+\" \";for(var f,g,h=0;f=e[h];h++)f.className&&(g=\" \"+f.className+\" \")&&(g.include(b)||d&&d.all(function(a){return!a.toString().blank()&&g.include(\" \"+a+\" \")}))&&c.push(Element.extend(f));return c},function(a,b){return $(b||document.body).getElementsByClassName(a)}}(Element.Methods)),Element.ClassNames=Class.create(),Element.ClassNames.prototype={initialize:function(a){this.element=$(a)},_each:function(a){this.element.className.split(/\\s+/).select(function(a){return a.length>0})._each(a)},set:function(a){this.element.className=a},add:function(a){this.include(a)||this.set($A(this).concat(a).join(\" \"))},remove:function(a){this.include(a)&&this.set($A(this).without(a).join(\" \"))},toString:function(){return $A(this).join(\" \")}},Object.extend(Element.ClassNames.prototype,Enumerable),function(){window.Selector=Class.create({initialize:function(a){this.expression=a.strip()},findElements:function(a){return Prototype.Selector.select(this.expression,a)},match:function(a){return Prototype.Selector.match(a,this.expression)},toString:function(){return this.expression},inspect:function(){return\"#<Selector: \"+this.expression+\">\"}}),Object.extend(Selector,{matchElements:function(a,b){for(var c=Prototype.Selector.match,d=[],e=0,f=a.length;f>e;e++){var g=a[e];c(g,b)&&d.push(Element.extend(g))}return d},findElement:function(a,b,c){c=c||0;for(var d,e=0,f=0,g=a.length;g>f;f++)if(d=a[f],Prototype.Selector.match(d,b)&&c===e++)return Element.extend(d)},findChildElements:function(a,b){var c=b.toArray().join(\", \");return Prototype.Selector.select(c,a||document)}})}();"
  },
  {
    "path": "works/demo/ali/file/reveal.css",
    "content": ".modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background:#000;opacity:.6;filter:alpha(opacity=60)}.modal{position:fixed;top:0;left:0;z-index:1050;height:100%}.close{cursor:pointer;cursor:pointer;position:absolute;right:10px;top:14px;background:#000}.close:hover{background-color:grey;color:#FFF}.button-blue{display:block;float:left;padding:5px 0;width:80px;margin-right:10px;color:#fff;background:#407acc;text-align:center;cursor:pointer}.button-blue:hover{background:#084b91;text-decoration:none;color:#fff}.button-grey{display:block;float:left;padding:5px 0;width:80px;color:#fff;background:#ccc;text-align:center;cursor:pointer}.button-grey:hover{background:#aaa;text-decoration:none}.modal{display:none;width:100%;background:#fff;overflow:hidden;opacity:.95;filter:alpha(opacity=95)}.modal a:hover{text-decoration:none}.modal .close{position:absolute;top:40px;right:40px;cursor:pointer;background:url(http://gtms04.alicdn.com/tps/i4/TB1hoNrFVXXXXXGXVXXoSK5GXXX-33-32.png) no-repeat;width:32px;height:32px;display:block}.forgot-btn,.login-btn{display:inline-block;*display:inline;*zoom:1;margin-top:14px;color:#FFF}#myModal{width:100%;height:100%}#formreg{width:840px;margin:0 auto;margin-top:80px}.clear{clear:both;zoom:1;width:100%}#formreg h1{font:100 18px \"microsoft yahei\"}#formreg dl{font:100 12px \"microsoft yahei\";margin-bottom:10px}#formreg dl dt{width:165px;text-align:right;margin-right:10px;font:100 14px \"microsoft yahei\";float:left}#formreg dl dd{width:420px;float:left;height:32px;margin-bottom:10px}#formreg dl dd label{width:165px;text-align:right;float:left;margin-right:10px;font:100 14px/32px \"microsoft yahei\"}#formreg dl.list{margin-top:30px;clear:both}#formreg dl.list dd{width:665px;margin-top:-4px}#formreg dl.list dd li{float:left;width:110px;line-height:18px}#formreg dl.list dd li label{width:auto;cursor:pointer}#formreg dl.list2{margin-top:30px;clear:both}#formreg dl.list2 dd{width:665px;margin-top:-4px}#formreg dl.list2 dd li{float:left;marign-right:12px}#formreg dl.list2 dd li label{width:auto;cursor:pointer}#formreg input[type=text]{border:1px solid #EEE;height:28px;width:194px;font:100 12px \"microsoft yahei\"}#formreg input[type=checkbox]{margin-right:6px}.select_box{width:164px;position:relative;padding:0;float:left}.select_box input{width:auto}.submit_box{width:194px;position:relative;margin:10px;padding:0;text-align:center}li,ul{list-style-type:none;padding:0;margin:0}.select_box input#myselect{cursor:pointer;display:block;line-height:30px;width:100%;height:28px;overflow:hidden;border:1px solid #EEE;padding-right:20px;padding-left:10px;background:url(http://gtms01.alicdn.com/tps/i1/TB1YQAqFVXXXXaxXpXXRWZN.VXX-12-6.gif) no-repeat 160px center}.select_box ul{width:194px;position:absolute;left:0;top:25px;border:1px solid #EEE;overflow:hidden;display:none;background:#FFF;z-index:99999}.select_box ul li{display:block;height:30px;overflow:hidden;line-height:30px;padding-left:5px;width:100%;cursor:pointer}.hover{background:#EEE}#line{border-bottom:1px solid #EEE;clear:both;zoom:1;height:15px}#button{text-align:center;margin-top:20px}"
  },
  {
    "path": "works/demo/ali/file/s_code_h.js",
    "content": "function safariHandler(a){s.lt(a.href)&&a.addEventListener(\"mouseup\",function(a){if(a.which&&1==a.which||a.button&&1==a.button){var b=a.currentTarget.href,c=s.lt(b);\"d\"==c&&(b.match(/\\.rss|\\.xml/)?s.eVar16=s.prop16=\"sign ups\":(s.eVar11=AC.Tracking.pageName()+\" - \"+b.substring(b.lastIndexOf(\"/\")+1,b.length),s.eVar11=s.eVar11.toLowerCase(),s.eVar16=s.prop16=\"Downloads\",s.events=s.apl(s.events,\"event5\",\",\",1)),s.linkTrackVars=\"prop16,eVar16,eVar11,events\",s.linkTrackEvents=\"event5\"),s.linkTrackVars=\"None\",s.linkTrackEvents=\"None\"}},!1)}function s_getObjectID(a){var b=a.href;return b}function QTCheck(){return AC&&\"undefined\"!=typeof AC.Detector&&\"undefined\"!=typeof AC.Detector.getQTVersion?AC.Detector.isMobile()||AC.Detector.isiPad()?\"mobile\":\"0\"==AC.Detector.getQTVersion()?\"no quicktime\":\"quicktime \"+AC.Detector.getQTVersion().split(/\\./)[0]+\".x\":\"quicktime not detected\"}function s_doPlugins(a){function b(){if(a.u.match(/windows/i))return void(a.prop9=\"windows\");if(a.u.match(/(kindle|silk-accelerated)/i))return void(a.prop9=a.u.match(/(kindle fire|silk-accelerated)/i)?\"kindle fire\":\"kindle\");if(a.u.match(/(iphone|ipod|ipad)/i)){var b=a.u.match(/OS [0-9_]+/i);return void(a.prop9=\"i\"+b[0].replace(/_/g,\".\"))}if(a.u.match(/android/i))return void(a.prop9=a.u.match(/android [0-9]\\.?[0-9]?\\.?[0-9]?/i));if(a.u.match(/webos\\/[0-9\\.]+/i)){var b=a.u.match(/webos\\/[0-9]\\.?[0-9]?\\.?[0-9]?/i);return void(a.prop9=b[0].replace(/webos\\//i,\"web os \"))}if(a.u.match(/rim tablet os [0-9\\.]+/i)){var b=a.u.match(/rim tablet os [0-9]\\.?[0-9]?\\.?[0-9]?/i);return void(a.prop9=b[0].replace(/rim tablet os/i,\"rim os \"))}if((a.u.match(/firefox\\/(\\d{2}||[3-9])/i)||a.u.match(/AppleWebKit\\//))&&a.u.match(/Mac OS X [0-9_\\.]+/)){var c=a.u.match(/[0-9_\\.]+/g);return c=c[1].split(/_|\\./),void(a.prop9=c[0]+\".\"+c[1]+\".x\")}var d=a.u.match(/AppleWebKit\\/\\d*/i)&&a.u.match(/AppleWebKit\\/\\d*/i).toString().replace(/AppleWebKit\\//i,\"\");a.prop9=d>522?\"10.5.x\":d>400?\"10.4.x\":d>99?\"10.3.x\":d>80?\"10.2.x\":\"mac unknown or non-safari\"}if(a.tcall=\"undefined\"==typeof a.linkType?!0:!1,a.pageName){var c=escape(a.pageName);c=c.replace(/(%u2018|%u2019|%u02BC|%u02BD)/g,\"%27\"),c=c.replace(/(%u201C|%u201D|%E2%80%9C|%E2%80%9D)/g,\"%22\"),c=c.replace(/(%09|%0A|%0D)/g,\"\"),a.pageName=unescape(c)}if(a.d.URL.match(/(apple.com\\/retail\\/.+\\/map\\/|apple.com\\/buy\\/locator\\/|discussions.apple.com|discussionsjapan.apple.com)/g)||a.setupDynamicObjectIDs(),a.prop5=window.devicePixelRatio>=2?navigator.platform+\" 2x\":navigator.platform,tempVar1=a.getQueryParam(\"ref\"),tempVar1&&a.tcall?a.referrer=tempVar1:tempVar1&&!a.tcall&&(a.referrer=\"\"),a.server=a.getQueryParam(\"alias\"),a.server||(a.server=\"new approach\"),!a.campaign&&(a.campaign=a.getQueryParam(\"cid\"),a.setClickMapEmail(\"Email_PageName,Email_OID\",\"Email_OT\"),a.campaign.match(/OAS-.+?-DOMAINS-/i))){var d=\"http://\"+a.campaign.replace(/OAS-.+?-DOMAINS-/i,\"\");a.referrer=a.tcall?d:\"\"}if(a.campaign=a.getValOnce(a.campaign,\"s_campaign\",0),a.prop6=a.prop6?a.prop6:'D=\"'+a.getQueryParam(\"cp\").toLowerCase()+': \"+pageName',a.prop11=a.getQueryParam(\"sr\"),a.d.URL.match(/\\/channel\\//)||a.prop11||!a.c_r(\"s_3p\")||(a.prop11=a.c_r(\"s_3p\"),a.c_w(\"s_3p\",\"\",-1)),a.eVar7=a.eVar7?\"\":a.getQueryParam(\"aid\"),a.eVar7=a.getValOnce(a.eVar7,\"s_var_7\",0),a.eVar2&&(a.events=a.apl(a.events,\"event6\",\",\",1)),!a.d.URL.match(/apple.com\\/(\\w{2}|befr|benl|chfr|chde|asia|lae)\\/search\\//)&&!a.d.URL.match(/apple.com\\/search\\//)&&(a.d.referrer.match(/apple.com\\/(\\w{2}|befr|benl|chfr|chde|asia|lae)\\/search\\//)||a.d.referrer.match(/apple.com\\/search\\//)))if(a.eVar2=a.d.referrer.match(/\\/support\\//)?\"acs: \":a.d.referrer.match(/\\/store\\//)?\"aos: \":\"www: \",a.d.referrer.match(/apple.com\\/(\\w{2}|befr|benl|chfr|chde|asia|lae)\\/search/)){a.eVar2+=a.getQueryParam(\"q\",\"\",a.d.referrer).replace(/\\+/g,\" \");var e=a.d.referrer.match(/\\/(\\w{2}|befr|benl|chfr|chde|asia|lae)\\//i);a.eVar2+=\" (\"+e[0].replace(/\\//g,\"\")+\")\"}else a.eVar2+=a.getQueryParam(\"q\",\"\",a.d.referrer).replace(/\\+/g,\" \")+\" (us)\";if(\"em\"==a.prop11&&a.tcall&&(a.referrer=\"imap://chatterbox.com\"),\"app\"==a.prop11&&a.tcall&&(a.referrer=\"file://fromApp\"),document.referrer&&document.referrer.indexOf(\"apple.com/startpage/\")>-1&&a.tcall&&(a.referrer=\"news://startpage.com\",a._1_referrer=1),!a.prop17){var f=a.getPercentPageViewed(a.pageName);if(f&&f.length>=5&&\"undefined\"!=typeof f[1]){if(a.prop14=f[0],a.prop17=f[1]+\":\"+f[2],a.prop28=10*Math.round(f[3]/10),a.eVar17=a.eVar18=\"\",f[4]){for(var g=f[4].split(/\\|/g),h=\"\",i=0;i<g.length;i++)if(i!=g.length-1){var k=g[i+1].split(/:/)[0]-g[i].split(/:/)[0];if(k>100){h+=g[i].split(/:/)[1];for(var l=k/100;l>1;)h+=\"0\",l--}else h+=g[i].split(/:/)[1]}else h+=g[i].split(/:/)[1];h.length>254?(a.eVar17=h.substring(0,254),a.eVar18=h.substring(255,h.length)):a.eVar17=h}a.tcall||(a.linkTrackVars=\"prop17,prop28\")}}if(a.prop38=a.tcall?a.deviceOrientationChanges(!0):\"\",a.prop32=a.eVar32=a.getQueryParam(\"psid\"),a.prop32||a.c_r(\"s_sid\")){var m=new Date,n=m.getTime();m.setTime(n+63072e4),a.prop32?a.c_w(\"s_psid\",a.prop32,m):a.c_w(\"s_psid\",a.c_r(\"s_sid\"),m),a.c_w(\"s_sid\",\"\",-1)}if(a.prop32||a.c_r(\"s_pathLength\")||(a.prop32=a.c_r(\"s_psid\")),!a.prop20){var o=navigator.userAgent.match(/foh:r\\d{3}/i);a.prop20=o?\"store kiosk:\"+o.toString().replace(/foh:/i,\"\"):\"non-store kiosk\"}a.linkLeaveQueryString=!0;var p=a.downloadLinkHandler();p&&(p.match(/\\.rss|\\.xml/)?a.eVar16=a.prop16=\"sign ups\":(a.eVar11=AC.Tracking.pageName()+\" - \"+p.substring(p.lastIndexOf(\"/\")+1,p.length),a.eVar16=a.prop16=\"downloads\",a.events=a.apl(a.events,\"event5\",\",\",1)),a.linkTrackVars=\"prop16,eVar16,eVar11,events\",a.linkTrackEvents=\"event5\"),a.linkLeaveQueryString=!1,\"undefined\"!=typeof Media&&a.tcall&&(a.prop18=QTCheck()),b(),a.pageName&&a.pageName.match(/feedback - thank you/)&&(a.prop16=a.eVar16=\"feedback\"),a.prop13&&(a.tcall||\"o\"==a.linkType||\"\"==a.linkType)&&a.pageName&&!a.pageName.match(/movie trailers -/)&&(a.prop13.match(/(v@s|v@r)/i)&&(a.prop16=a.eVar16=\"video plays\",a.events=\"event2\",a.tcall||(a.linkTrackEvents+=\",event2\",a.linkTrackVars+=\",events,prop16,eVar16\")),a.prop13.match(/v@e/i)&&(a.prop16=a.eVar16=\"video ends\",a.tcall||(a.linkTrackEvents=\"\",a.linkTrackVars+=\",prop16,eVar16\"))),a.linkLeaveQueryString=!0;var p=(a.linkHandler(\"itms.apple.com|itunes.apple.com\",\"e\"),a.linkHandler(\"ax.itunes.apple.com/WebObjects/MZStoreServices.woa/ws/RSS/|rss.support.apple.com\",\"o\"));if(p&&(a.eVar16=a.prop16=\"sign ups\",a.linkTrackVars=\"eVar16,prop16\"),a.linkLeaveQueryString=!1,a.tcall){var q,r=window.location.pathname,s=!1,t=!0;if((a.c_r(\"iTunesPresent\")||a.prop12&&\"iTunes\"==a.prop12)&&(q=q?q+\"it,\":\"it,\"),a.c_r(\"hasMobileMe\")&&(q=q?q+\"mm,\":\"mm,\"),(a.c_r(\"DefaultAppleID\")||a.pageName&&a.pageName.match(/iforgot - cr or email option/))&&(q=q?q+\"aid,\":\"aid,\"),a.c_r(\"trackStartpage\")&&(q=q?q+\"sp,\":\"sp,\"),a.prop11&&a.prop11.match(\"3p\")&&(q=q?q+\"3p,\":\"3p,\"),a.pageName&&a.pageName.match(/one to one - index/)&&(q=q?q+\"o2o,\":\"o2o,\"),r.match(\"/welcomescreen/\")){var u;(u=r.match(\"ilife.*\"))?(u=\"il\"+u.toString().match(\"[0-9]+\")+\",\",q=q?q+u:u):(u=r.match(\"iwork.*\"))?(u=\"iwk\"+u.toString().match(\"[0-9]+\")+\",\",q=q?q+u:u):(u=r.match(\"itunes.*\"))?(u=\"it\"+u.toString().match(\"[0-9]+\")+\",\",q=q?q+u:u):(u=r.match(\"aperture.*\"))&&(u=\"ap\"+u.toString().match(\"[0-9]+\")+\",\",q=q?q+u:u)}if(a.getQueryParam(\"sr\")&&a.getQueryParam(\"vr\")){var v=a.getQueryParam(\"vr\");v=v.substring(0,v.indexOf(\"-\"))+\",\",q=q?q+v:v}if(\"undefined\"!=typeof q)if(q=q.substring(0,q.length-1).toLowerCase(),q=q.split(\",\"),a.c_r(\"s_membership\")){var w=a.c_r(\"s_membership\").split(/:/);for(w.splice(0,1),i=0;i<q.length;i++){for(j=0;j<w.length;j++)w[j]==q[i]&&(t=!1);t&&(w[w.length]=q[i],s=!0),t=!0}if(s){q=w.length+\":\"+w.toString().replace(/,/g,\":\");var m=new Date,n=m.getTime();m.setTime(n+63072e3),a.c_w(\"s_membership\",q,m),a.prop31=q}}else{q=q.length+\":\"+q.toString().replace(/,/g,\":\");var m=new Date,n=m.getTime();m.setTime(n+63072e3),a.c_w(\"s_membership\",q,m),a.prop31=q}a.prop31||a.c_r(\"s_pathLength\")||(a.prop31=a.c_r(\"s_membership\"))}if(AC&&\"undefined\"!=typeof AC.Storage&&a.tcall&&!a.prop25&&(a.prop25=AC.Storage.getItem(\"s_nav\")?AC.Storage.getItem(\"s_nav\"):\"other nav or none\",AC.Storage.removeItem(\"s_nav\"),document.referrer.match(/(downloads|epp|store|storeint)\\.apple\\.com/)&&(a.prop25=\"aos nav\")),(a.pageName&&a.prop14&&a.pageName.toLowerCase()!=a.prop14.toLowerCase()||!a.prop14)&&a.tcall){var x,y=a.c_r(\"s_pathLength\"),z=y.indexOf(\",\")>-1?y.split(\",\"):[],m=new Date,n=m.getTime();if(m.setTime(n+18e5),a.channel?(x=a.channel.substring(a.channel.indexOf(\".\")+1,a.channel.length),x=x.substring(x.indexOf(\".\")+1,x.length)):x=\"no channel\",0!=z.length&&z.toString().indexOf(x+\"=\")>-1){for(i=0;i<z.length;i++)if(z[i].toString().indexOf(x+\"=\")>-1){var A=z[i].split(\"=\");++A[1],z[i]=A[0]+\"=\"+A[1],a.prop48=A[1]}a.c_w(\"s_pathLength\",z,m)}else{var A=y+x+\"=1,\";a.c_w(\"s_pathLength\",A,m),a.prop48=\"1\"}}a.tcall&&(a.prop50=a.getVisitNumPerChannel()),a.hier1=a.channel?a.channel:\"\",a.linkTrackVars=a.apl(a.linkTrackVars,\"hier1\",\",\",1),a.prop49=\"D=s_vi\",a.prop4=a.prop4?a.prop4:\"D=g\",a.manageVars(\"lowercaseVars\",\"purchaseID,pageType,events,products,transactionID\",2)}function s_gi(a,b,c){var d,e,f,g,h,i=\"s.version='H.25.5';s.an=s_an;s.logDebug=function(m){var s=this,tcf=new Function('var e;try{console.log(\\\"'+s.rep(s.rep(s.rep(m,\\\"\\\\\\\\\\\",\\\"\\\\\\\\\\\\\\\\\\\"),\\\"\\\\n\\\",\\\"\\\\\\\\n\\\"),\\\"\\\\\\\"\\\",\\\"\\\\\\\\\\\\\\\"\\\")+'\\\");}catch(e){}');tcf()};s.cls=function(x,c){var i,y='';if(!c)c=this.an;for(i=0;i<x.length;i++){n=x.substring(i,i+1);if(c.indexOf(n)>=0)y+=n}return y};s.fl=function(x,l){return x?(''+x).substring(0,l):x};s.co=function(o){return o};s.num=function(x){x=''+x;for(var p=0;p<x.length;p++)if(('0123456789').indexOf(x.substring(p,p+1))<0)return 0;return 1};s.rep=s_rep;s.sp=s_sp;s.jn=s_jn;s.ape=function(x){var s=this,h='0123456789ABCDEF',f=\\\"+~!*()'\\\",i,c=s.charSet,n,l,e,y='';c=c?c.toUpperCase():'';if(x){x=''+x;if(s.em==3){x=encodeURIComponent(x);for(i=0;i<f.length;i++) {n=f.substring(i,i+1);if(x.indexOf(n)>=0)x=s.rep(x,n,\\\"%\\\"+n.charCodeAt(0).toString(16).toUpperCase())}}else if(c=='AUTO'&&('').charCodeAt){for(i=0;i<x.length;i++){c=x.substring(i,i+1);n=x.charCodeAt(i);if(n>127){l=0;e='';while(n||l<4){e=h.substring(n%16,n%16+1)+e;n=(n-n%16)/16;l++}y+='%u'+e}else if(c=='+')y+='%2B';else y+=escape(c)}x=y}else x=s.rep(escape(''+x),'+','%2B');if(c&&c!='AUTO'&&s.em==1&&x.indexOf('%u')<0&&x.indexOf('%U')<0){i=x.indexOf('%');while(i>=0){i++;if(h.substring(8).indexOf(x.substring(i,i+1).toUpperCase())>=0)return x.substring(0,i)+'u00'+x.substring(i);i=x.indexOf('%',i)}}}return x};s.epa=function(x){var s=this,y,tcf;if(x){x=s.rep(''+x,'+',' ');if(s.em==3){tcf=new Function('x','var y,e;try{y=decodeURIComponent(x)}catch(e){y=unescape(x)}return y');return tcf(x)}else return unescape(x)}return y};s.pt=function(x,d,f,a){var s=this,t=x,z=0,y,r;while(t){y=t.indexOf(d);y=y<0?t.length:y;t=t.substring(0,y);r=s[f](t,a);if(r)return r;z+=y+d.length;t=x.substring(z,x.length);t=z<x.length?t:''}return ''};s.isf=function(t,a){var c=a.indexOf(':');if(c>=0)a=a.substring(0,c);c=a.indexOf('=');if(c>=0)a=a.substring(0,c);if(t.substring(0,2)=='s_')t=t.substring(2);return (t!=''&&t==a)};s.fsf=function(t,a){var s=this;if(s.pt(a,',','isf',t))s.fsg+=(s.fsg!=''?',':'')+t;return 0};s.fs=function(x,f){var s=this;s.fsg='';s.pt(x,',','fsf',f);return s.fsg};s.mpc=function(m,a){var s=this,c,l,n,v;v=s.d.visibilityState;if(!v)v=s.d.webkitVisibilityState;if(v&&v=='prerender'){if(!s.mpq){s.mpq=new Array;l=s.sp('webkitvisibilitychange,visibilitychange',',');for(n=0;n<l.length;n++){s.d.addEventListener(l[n],new Function('var s=s_c_il['+s._in+'],c,v;v=s.d.visibilityState;if(!v)v=s.d.webkitVisibilityState;if(s.mpq&&v==\\\"visible\\\"){while(s.mpq.length>0){c=s.mpq.shift();s[c.m].apply(s,c.a)}s.mpq=0}'),false)}}c=new Object;c.m=m;c.a=a;s.mpq.push(c);return 1}return 0};s.si=function(){var s=this,i,k,v,c=s_gi+'var s=s_gi(\\\"'+s.oun+'\\\");s.sa(\\\"'+s.un+'\\\");';for(i=0;i<s.va_g.length;i++){k=s.va_g[i];v=s[k];if(v!=undefined){if(typeof(v)!='number')c+='s.'+k+'=\\\"'+s_fe(v)+'\\\";';else c+='s.'+k+'='+v+';'}}c+=\\\"s.lnk=s.eo=s.linkName=s.linkType=s.wd.s_objectID=s.ppu=s.pe=s.pev1=s.pev2=s.pev3='';\\\";return c};s.c_d='';s.c_gdf=function(t,a){var s=this;if(!s.num(t))return 1;return 0};s.c_gd=function(){var s=this,d=s.wd.location.hostname,n=s.fpCookieDomainPeriods,p;if(!n)n=s.cookieDomainPeriods;if(d&&!s.c_d){n=n?parseInt(n):2;n=n>2?n:2;p=d.lastIndexOf('.');if(p>=0){while(p>=0&&n>1){p=d.lastIndexOf('.',p-1);n--}s.c_d=p>0&&s.pt(d,'.','c_gdf',0)?d.substring(p):d}}return s.c_d};s.c_r=function(k){var s=this;k=s.ape(k);var c=' '+s.d.cookie,i=c.indexOf(' '+k+'='),e=i<0?i:c.indexOf(';',i),v=i<0?'':s.epa(c.substring(i+2+k.length,e<0?c.length:e));return v!='[[B]]'?v:''};s.c_w=function(k,v,e){var s=this,d=s.c_gd(),l=s.cookieLifetime,t;v=''+v;l=l?(''+l).toUpperCase():'';if(e&&l!='SESSION'&&l!='NONE'){t=(v!=''?parseInt(l?l:0):-60);if(t){e=new Date;e.setTime(e.getTime()+(t*1000))}}if(k&&l!='NONE'){s.d.cookie=k+'='+s.ape(v!=''?v:'[[B]]')+'; path=/;'+(e&&l!='SESSION'?' expires='+e.toGMTString()+';':'')+(d?' domain='+d+';':'');return s.c_r(k)==v}return 0};s.eh=function(o,e,r,f){var s=this,b='s_'+e+'_'+s._in,n=-1,l,i,x;if(!s.ehl)s.ehl=new Array;l=s.ehl;for(i=0;i<l.length&&n<0;i++){if(l[i].o==o&&l[i].e==e)n=i}if(n<0){n=i;l[n]=new Object}x=l[n];x.o=o;x.e=e;f=r?x.b:f;if(r||f){x.b=r?0:o[e];x.o[e]=f}if(x.b){x.o[b]=x.b;return b}return 0};s.cet=function(f,a,t,o,b){var s=this,r,tcf;if(s.apv>=5&&(!s.isopera||s.apv>=7)){tcf=new Function('s','f','a','t','var e,r;try{r=s[f](a)}catch(e){r=s[t](e)}return r');r=tcf(s,f,a,t)}else{if(s.ismac&&s.u.indexOf('MSIE 4')>=0)r=s[b](a);else{s.eh(s.wd,'onerror',0,o);r=s[f](a);s.eh(s.wd,'onerror',1)}}return r};s.gtfset=function(e){var s=this;return s.tfs};s.gtfsoe=new Function('e','var s=s_c_il['+s._in+'],c;s.eh(window,\\\"onerror\\\",1);s.etfs=1;c=s.t();if(c)s.d.write(c);s.etfs=0;return true');s.gtfsfb=function(a){return window};s.gtfsf=function(w){var s=this,p=w.parent,l=w.location;s.tfs=w;if(p&&p.location!=l&&p.location.host==l.host){s.tfs=p;return s.gtfsf(s.tfs)}return s.tfs};s.gtfs=function(){var s=this;if(!s.tfs){s.tfs=s.wd;if(!s.etfs)s.tfs=s.cet('gtfsf',s.tfs,'gtfset',s.gtfsoe,'gtfsfb')}return s.tfs};s.mrq=function(u){var s=this,l=s.rl[u],n,r;s.rl[u]=0;if(l)for(n=0;n<l.length;n++){r=l[n];s.mr(0,0,r.r,r.t,r.u)}};s.flushBufferedRequests=function(){};s.mr=function(sess,q,rs,ta,u){var s=this,dc=s.dc,t1=s.trackingServer,t2=s.trackingServerSecure,tb=s.trackingServerBase,p='.sc',ns=s.visitorNamespace,un=s.cls(u?u:(ns?ns:s.fun)),r=new Object,l,imn='s_i_'+(un),im,b,e;if(!rs){if(t1){if(t2&&s.ssl)t1=t2}else{if(!tb)tb='2o7.net';if(dc)dc=(''+dc).toLowerCase();else dc='d1';if(tb=='2o7.net'){if(dc=='d1')dc='112';else if(dc=='d2')dc='122';p=''}t1=un+'.'+dc+'.'+p+tb}rs='http'+(s.ssl?'s':'')+'://'+t1+'/b/ss/'+s.un+'/'+(s.mobile?'5.1':'1')+'/'+s.version+(s.tcn?'T':'')+'/'+sess+'?AQB=1&ndh=1'+(q?q:'')+'&AQE=1';if(s.isie&&!s.ismac)rs=s.fl(rs,2047)}if(s.d.images&&s.apv>=3&&(!s.isopera||s.apv>=7)&&(s.ns6<0||s.apv>=6.1)){if(!s.rc)s.rc=new Object;if(!s.rc[un]){s.rc[un]=1;if(!s.rl)s.rl=new Object;s.rl[un]=new Array;setTimeout('if(window.s_c_il)window.s_c_il['+s._in+'].mrq(\\\"'+un+'\\\")',750)}else{l=s.rl[un];if(l){r.t=ta;r.u=un;r.r=rs;l[l.length]=r;return ''}imn+='_'+s.rc[un];s.rc[un]++}if(s.debugTracking){var d='AppMeasurement Debug: '+rs,dl=s.sp(rs,'&'),dln;for(dln=0;dln<dl.length;dln++)d+=\\\"\\\\n\\\\t\\\"+s.epa(dl[dln]);s.logDebug(d)}im=s.wd[imn];if(!im)im=s.wd[imn]=new Image;im.s_l=0;im.onload=new Function('e','this.s_l=1;var wd=window,s;if(wd.s_c_il){s=wd.s_c_il['+s._in+'];s.bcr();s.mrq(\\\"'+un+'\\\");s.nrs--;if(!s.nrs)s.m_m(\\\"rr\\\")}');if(!s.nrs){s.nrs=1;s.m_m('rs')}else s.nrs++;im.src=rs;if(s.useForcedLinkTracking||s.bcf){if(!s.forcedLinkTrackingTimeout)s.forcedLinkTrackingTimeout=250;setTimeout('if(window.s_c_il)window.s_c_il['+s._in+'].bcr()',s.forcedLinkTrackingTimeout);}else if((s.lnk||s.eo)&&(!ta||ta=='_self'||ta=='_top'||ta=='_parent'||(s.wd.name&&ta==s.wd.name))){b=e=new Date;while(!im.s_l&&e.getTime()-b.getTime()<500)e=new Date}return ''}return '<im'+'g sr'+'c=\\\"'+rs+'\\\" width=1 height=1 border=0 alt=\\\"\\\">'};s.gg=function(v){var s=this;if(!s.wd['s_'+v])s.wd['s_'+v]='';return s.wd['s_'+v]};s.glf=function(t,a){if(t.substring(0,2)=='s_')t=t.substring(2);var s=this,v=s.gg(t);if(v)s[t]=v};s.gl=function(v){var s=this;if(s.pg)s.pt(v,',','glf',0)};s.rf=function(x){var s=this,y,i,j,h,p,l=0,q,a,b='',c='',t;if(x&&x.length>255){y=''+x;i=y.indexOf('?');if(i>0){q=y.substring(i+1);y=y.substring(0,i);h=y.toLowerCase();j=0;if(h.substring(0,7)=='http://')j+=7;else if(h.substring(0,8)=='https://')j+=8;i=h.indexOf(\\\"/\\\",j);if(i>0){h=h.substring(j,i);p=y.substring(i);y=y.substring(0,i);if(h.indexOf('google')>=0)l=',q,ie,start,search_key,word,kw,cd,';else if(h.indexOf('yahoo.co')>=0)l=',p,ei,';if(l&&q){a=s.sp(q,'&');if(a&&a.length>1){for(j=0;j<a.length;j++){t=a[j];i=t.indexOf('=');if(i>0&&l.indexOf(','+t.substring(0,i)+',')>=0)b+=(b?'&':'')+t;else c+=(c?'&':'')+t}if(b&&c)q=b+'&'+c;else c=''}i=253-(q.length-c.length)-y.length;x=y+(i>0?p.substring(0,i):'')+'?'+q}}}}return x};s.s2q=function(k,v,vf,vfp,f){var s=this,qs='',sk,sv,sp,ss,nke,nk,nf,nfl=0,nfn,nfm;if(k==\\\"contextData\\\")k=\\\"c\\\";if(v){for(sk in v)if((!f||sk.substring(0,f.length)==f)&&v[sk]&&(!vf||vf.indexOf(','+(vfp?vfp+'.':'')+sk+',')>=0)&&(!Object||!Object.prototype||!Object.prototype[sk])){nfm=0;if(nfl)for(nfn=0;nfn<nfl.length;nfn++)if(sk.substring(0,nfl[nfn].length)==nfl[nfn])nfm=1;if(!nfm){if(qs=='')qs+='&'+k+'.';sv=v[sk];if(f)sk=sk.substring(f.length);if(sk.length>0){nke=sk.indexOf('.');if(nke>0){nk=sk.substring(0,nke);nf=(f?f:'')+nk+'.';if(!nfl)nfl=new Array;nfl[nfl.length]=nf;qs+=s.s2q(nk,v,vf,vfp,nf)}else{if(typeof(sv)=='boolean'){if(sv)sv='true';else sv='false'}if(sv){if(vfp=='retrieveLightData'&&f.indexOf('.contextData.')<0){sp=sk.substring(0,4);ss=sk.substring(4);if(sk=='transactionID')sk='xact';else if(sk=='channel')sk='ch';else if(sk=='campaign')sk='v0';else if(s.num(ss)){if(sp=='prop')sk='c'+ss;else if(sp=='eVar')sk='v'+ss;else if(sp=='list')sk='l'+ss;else if(sp=='hier'){sk='h'+ss;sv=sv.substring(0,255)}}}qs+='&'+s.ape(sk)+'='+s.ape(sv)}}}}}if(qs!='')qs+='&.'+k}return qs};s.hav=function(){var s=this,qs='',l,fv='',fe='',mn,i,e;if(s.lightProfileID){l=s.va_m;fv=s.lightTrackVars;if(fv)fv=','+fv+','+s.vl_mr+','}else{l=s.va_t;if(s.pe||s.linkType){fv=s.linkTrackVars;fe=s.linkTrackEvents;if(s.pe){mn=s.pe.substring(0,1).toUpperCase()+s.pe.substring(1);if(s[mn]){fv=s[mn].trackVars;fe=s[mn].trackEvents}}}if(fv)fv=','+fv+','+s.vl_l+','+s.vl_l2;if(fe){fe=','+fe+',';if(fv)fv+=',events,'}if (s.events2)e=(e?',':'')+s.events2}for(i=0;i<l.length;i++){var k=l[i],v=s[k],b=k.substring(0,4),x=k.substring(4),n=parseInt(x),q=k;if(!v)if(k=='events'&&e){v=e;e=''}if(v&&(!fv||fv.indexOf(','+k+',')>=0)&&k!='linkName'&&k!='linkType'){if(k=='timestamp')q='ts';else if(k=='dynamicVariablePrefix')q='D';else if(k=='visitorID')q='vid';else if(k=='pageURL'){q='g';if(v.length>255){s.pageURLRest=v.substring(255);v=v.substring(0,255);}}else if(k=='pageURLRest')q='-g';else if(k=='referrer'){q='r';v=s.fl(s.rf(v),255)}else if(k=='vmk'||k=='visitorMigrationKey')q='vmt';else if(k=='visitorMigrationServer'){q='vmf';if(s.ssl&&s.visitorMigrationServerSecure)v=''}else if(k=='visitorMigrationServerSecure'){q='vmf';if(!s.ssl&&s.visitorMigrationServer)v=''}else if(k=='charSet'){q='ce';if(v.toUpperCase()=='AUTO')v='ISO8859-1';else if(s.em==2||s.em==3)v='UTF-8'}else if(k=='visitorNamespace')q='ns';else if(k=='cookieDomainPeriods')q='cdp';else if(k=='cookieLifetime')q='cl';else if(k=='variableProvider')q='vvp';else if(k=='currencyCode')q='cc';else if(k=='channel')q='ch';else if(k=='transactionID')q='xact';else if(k=='campaign')q='v0';else if(k=='resolution')q='s';else if(k=='colorDepth')q='c';else if(k=='javascriptVersion')q='j';else if(k=='javaEnabled')q='v';else if(k=='cookiesEnabled')q='k';else if(k=='browserWidth')q='bw';else if(k=='browserHeight')q='bh';else if(k=='connectionType')q='ct';else if(k=='homepage')q='hp';else if(k=='plugins')q='p';else if(k=='events'){if(e)v+=(v?',':'')+e;if(fe)v=s.fs(v,fe)}else if(k=='events2')v='';else if(k=='contextData'){qs+=s.s2q('c',s[k],fv,k,0);v=''}else if(k=='lightProfileID')q='mtp';else if(k=='lightStoreForSeconds'){q='mtss';if(!s.lightProfileID)v=''}else if(k=='lightIncrementBy'){q='mti';if(!s.lightProfileID)v=''}else if(k=='retrieveLightProfiles')q='mtsr';else if(k=='deleteLightProfiles')q='mtsd';else if(k=='retrieveLightData'){if(s.retrieveLightProfiles)qs+=s.s2q('mts',s[k],fv,k,0);v=''}else if(s.num(x)){if(b=='prop')q='c'+n;else if(b=='eVar')q='v'+n;else if(b=='list')q='l'+n;else if(b=='hier'){q='h'+n;v=s.fl(v,255)}}if(v)qs+='&'+s.ape(q)+'='+(k.substring(0,3)!='pev'?s.ape(v):v)}}return qs};s.ltdf=function(t,h){t=t?t.toLowerCase():'';h=h?h.toLowerCase():'';var qi=h.indexOf('?');h=qi>=0?h.substring(0,qi):h;if(t&&h.substring(h.length-(t.length+1))=='.'+t)return 1;return 0};s.ltef=function(t,h){t=t?t.toLowerCase():'';h=h?h.toLowerCase():'';if(t&&h.indexOf(t)>=0)return 1;return 0};s.lt=function(h){var s=this,lft=s.linkDownloadFileTypes,lef=s.linkExternalFilters,lif=s.linkInternalFilters;lif=lif?lif:s.wd.location.hostname;h=h.toLowerCase();if(s.trackDownloadLinks&&lft&&s.pt(lft,',','ltdf',h))return 'd';if(s.trackExternalLinks&&h.indexOf('#')!=0&&h.indexOf('about:')!=0&&h.indexOf('javascript:')!=0&&(lef||lif)&&(!lef||s.pt(lef,',','ltef',h))&&(!lif||!s.pt(lif,',','ltef',h)))return 'e';return ''};s.lc=new Function('e','var s=s_c_il['+s._in+'],b=s.eh(this,\\\"onclick\\\");s.lnk=this;s.t();s.lnk=0;if(b)return this[b](e);return true');s.bcr=function(){var s=this;if(s.bct&&s.bce)s.bct.dispatchEvent(s.bce);if(s.bcf){if(typeof(s.bcf)=='function')s.bcf();else if(s.bct&&s.bct.href)s.d.location=s.bct.href}s.bct=s.bce=s.bcf=0};s.bc=new Function('e','if(e&&e.s_fe)return;var s=s_c_il['+s._in+'],f,tcf,t,n,nrs,a,h;if(s.d&&s.d.all&&s.d.all.cppXYctnr)return;if(!s.bbc)s.useForcedLinkTracking=0;else if(!s.useForcedLinkTracking){s.b.removeEventListener(\\\"click\\\",s.bc,true);s.bbc=s.useForcedLinkTracking=0;return}else s.b.removeEventListener(\\\"click\\\",s.bc,false);s.eo=e.srcElement?e.srcElement:e.target;nrs=s.nrs;s.t();s.eo=0;if(s.nrs>nrs&&s.useForcedLinkTracking&&e.target){a=e.target;while(a&&a!=s.b&&a.tagName.toUpperCase()!=\\\"A\\\"&&a.tagName.toUpperCase()!=\\\"AREA\\\")a=a.parentNode;if(a){h=a.href;if(h.indexOf(\\\"#\\\")==0||h.indexOf(\\\"about:\\\")==0||h.indexOf(\\\"javascript:\\\")==0)h=0;t=a.target;if(e.target.dispatchEvent&&h&&(!t||t==\\\"_self\\\"||t==\\\"_top\\\"||t==\\\"_parent\\\"||(s.wd.name&&t==s.wd.name))){e.stopPropagation();if (e.stopImmediatePropagation) {e.stopImmediatePropagation();}e.preventDefault();n=s.d.createEvent(\\\"MouseEvents\\\");n.initMouseEvent(\\\"click\\\",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,e.clientX,e.clientY,e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget);n.s_fe=1;s.bct=e.target;s.bce=n}}}');s.oh=function(o){var s=this,l=s.wd.location,h=o.href?o.href:'',i,j,k,p;i=h.indexOf(':');j=h.indexOf('?');k=h.indexOf('/');if(h&&(i<0||(j>=0&&i>j)||(k>=0&&i>k))){p=o.protocol&&o.protocol.length>1?o.protocol:(l.protocol?l.protocol:'');i=l.pathname.lastIndexOf('/');h=(p?p+'//':'')+(o.host?o.host:(l.host?l.host:''))+(h.substring(0,1)!='/'?l.pathname.substring(0,i<0?0:i)+'/':'')+h}return h};s.ot=function(o){var t=o.tagName;if(o.tagUrn||(o.scopeName&&o.scopeName.toUpperCase()!='HTML'))return '';t=t&&t.toUpperCase?t.toUpperCase():'';if(t=='SHAPE')t='';if(t){if((t=='INPUT'||t=='BUTTON')&&o.type&&o.type.toUpperCase)t=o.type.toUpperCase();else if(!t&&o.href)t='A';}return t};s.oid=function(o){var s=this,t=s.ot(o),p,c,n='',x=0;if(t&&!o.s_oid){p=o.protocol;c=o.onclick;if(o.href&&(t=='A'||t=='AREA')&&(!c||!p||p.toLowerCase().indexOf('javascript')<0))n=s.oh(o);else if(c){n=s.rep(s.rep(s.rep(s.rep(''+c,\\\"\\\\r\\\",''),\\\"\\\\n\\\",''),\\\"\\\\t\\\",''),' ','');x=2}else if(t=='INPUT'||t=='SUBMIT'){if(o.value)n=o.value;else if(o.innerText)n=o.innerText;else if(o.textContent)n=o.textContent;x=3}else if(o.src&&t=='IMAGE')n=o.src;if(n){o.s_oid=s.fl(n,100);o.s_oidt=x}}return o.s_oid};s.rqf=function(t,un){var s=this,e=t.indexOf('='),u=e>=0?t.substring(0,e):'',q=e>=0?s.epa(t.substring(e+1)):'';if(u&&q&&(','+u+',').indexOf(','+un+',')>=0){if(u!=s.un&&s.un.indexOf(',')>=0)q='&u='+u+q+'&u=0';return q}return ''};s.rq=function(un){if(!un)un=this.un;var s=this,c=un.indexOf(','),v=s.c_r('s_sq'),q='';if(c<0)return s.pt(v,'&','rqf',un);return s.pt(un,',','rq',0)};s.sqp=function(t,a){var s=this,e=t.indexOf('='),q=e<0?'':s.epa(t.substring(e+1));s.sqq[q]='';if(e>=0)s.pt(t.substring(0,e),',','sqs',q);return 0};s.sqs=function(un,q){var s=this;s.squ[un]=q;return 0};s.sq=function(q){var s=this,k='s_sq',v=s.c_r(k),x,c=0;s.sqq=new Object;s.squ=new Object;s.sqq[q]='';s.pt(v,'&','sqp',0);s.pt(s.un,',','sqs',q);v='';for(x in s.squ)if(x&&(!Object||!Object.prototype||!Object.prototype[x]))s.sqq[s.squ[x]]+=(s.sqq[s.squ[x]]?',':'')+x;for(x in s.sqq)if(x&&(!Object||!Object.prototype||!Object.prototype[x])&&s.sqq[x]&&(x==q||c<2)){v+=(v?'&':'')+s.sqq[x]+'='+s.ape(x);c++}return s.c_w(k,v,0)};s.wdl=new Function('e','var s=s_c_il['+s._in+'],r=true,b=s.eh(s.wd,\\\"onload\\\"),i,o,oc;if(b)r=this[b](e);for(i=0;i<s.d.links.length;i++){o=s.d.links[i];oc=o.onclick?\\\"\\\"+o.onclick:\\\"\\\";if((oc.indexOf(\\\"s_gs(\\\")<0||oc.indexOf(\\\".s_oc(\\\")>=0)&&oc.indexOf(\\\".tl(\\\")<0)s.eh(o,\\\"onclick\\\",0,s.lc);}return r');s.wds=function(){var s=this;if(s.apv>3&&(!s.isie||!s.ismac||s.apv>=5)){if(s.b&&s.b.attachEvent)s.b.attachEvent('onclick',s.bc);else if(s.b&&s.b.addEventListener){if(s.n&&s.n.userAgent.indexOf('WebKit')>=0&&s.d.createEvent){s.bbc=1;s.useForcedLinkTracking=1;s.b.addEventListener('click',s.bc,true)}s.b.addEventListener('click',s.bc,false)}else s.eh(s.wd,'onload',0,s.wdl)}};s.vs=function(x){var s=this,v=s.visitorSampling,g=s.visitorSamplingGroup,k='s_vsn_'+s.un+(g?'_'+g:''),n=s.c_r(k),e=new Date,y=e.getYear();e.setYear(y+10+(y<1900?1900:0));if(v){v*=100;if(!n){if(!s.c_w(k,x,e))return 0;n=x}if(n%10000>v)return 0}return 1};s.dyasmf=function(t,m){if(t&&m&&m.indexOf(t)>=0)return 1;return 0};s.dyasf=function(t,m){var s=this,i=t?t.indexOf('='):-1,n,x;if(i>=0&&m){var n=t.substring(0,i),x=t.substring(i+1);if(s.pt(x,',','dyasmf',m))return n}return 0};s.uns=function(){var s=this,x=s.dynamicAccountSelection,l=s.dynamicAccountList,m=s.dynamicAccountMatch,n,i;s.un=s.un.toLowerCase();if(x&&l){if(!m)m=s.wd.location.host;if(!m.toLowerCase)m=''+m;l=l.toLowerCase();m=m.toLowerCase();n=s.pt(l,';','dyasf',m);if(n)s.un=n}i=s.un.indexOf(',');s.fun=i<0?s.un:s.un.substring(0,i)};s.sa=function(un){var s=this;if(s.un&&s.mpc('sa',arguments))return;s.un=un;if(!s.oun)s.oun=un;else if((','+s.oun+',').indexOf(','+un+',')<0)s.oun+=','+un;s.uns()};s.m_i=function(n,a){var s=this,m,f=n.substring(0,1),r,l,i;if(!s.m_l)s.m_l=new Object;if(!s.m_nl)s.m_nl=new Array;m=s.m_l[n];if(!a&&m&&m._e&&!m._i)s.m_a(n);if(!m){m=new Object,m._c='s_m';m._in=s.wd.s_c_in;m._il=s._il;m._il[m._in]=m;s.wd.s_c_in++;m.s=s;m._n=n;m._l=new Array('_c','_in','_il','_i','_e','_d','_dl','s','n','_r','_g','_g1','_t','_t1','_x','_x1','_rs','_rr','_l');s.m_l[n]=m;s.m_nl[s.m_nl.length]=n}else if(m._r&&!m._m){r=m._r;r._m=m;l=m._l;for(i=0;i<l.length;i++)if(m[l[i]])r[l[i]]=m[l[i]];r._il[r._in]=r;m=s.m_l[n]=r}if(f==f.toUpperCase())s[n]=m;return m};s.m_a=new Function('n','g','e','if(!g)g=\\\"m_\\\"+n;var s=s_c_il['+s._in+'],c=s[g+\\\"_c\\\"],m,x,f=0;if(s.mpc(\\\"m_a\\\",arguments))return;if(!c)c=s.wd[\\\"s_\\\"+g+\\\"_c\\\"];if(c&&s_d)s[g]=new Function(\\\"s\\\",s_ft(s_d(c)));x=s[g];if(!x)x=s.wd[\\\\'s_\\\\'+g];if(!x)x=s.wd[g];m=s.m_i(n,1);if(x&&(!m._i||g!=\\\"m_\\\"+n)){m._i=f=1;if((\\\"\\\"+x).indexOf(\\\"function\\\")>=0)x(s);else s.m_m(\\\"x\\\",n,x,e)}m=s.m_i(n,1);if(m._dl)m._dl=m._d=0;s.dlt();return f');s.m_m=function(t,n,d,e){t='_'+t;var s=this,i,x,m,f='_'+t,r=0,u;if(s.m_l&&s.m_nl)for(i=0;i<s.m_nl.length;i++){x=s.m_nl[i];if(!n||x==n){m=s.m_i(x);u=m[t];if(u){if((''+u).indexOf('function')>=0){if(d&&e)u=m[t](d,e);else if(d)u=m[t](d);else u=m[t]()}}if(u)r=1;u=m[t+1];if(u&&!m[f]){if((''+u).indexOf('function')>=0){if(d&&e)u=m[t+1](d,e);else if(d)u=m[t+1](d);else u=m[t+1]()}}m[f]=1;if(u)r=1}}return r};s.m_ll=function(){var s=this,g=s.m_dl,i,o;if(g)for(i=0;i<g.length;i++){o=g[i];if(o)s.loadModule(o.n,o.u,o.d,o.l,o.e,1);g[i]=0}};s.loadModule=function(n,u,d,l,e,ln){var s=this,m=0,i,g,o=0,f1,f2,c=s.h?s.h:s.b,b,tcf;if(n){i=n.indexOf(':');if(i>=0){g=n.substring(i+1);n=n.substring(0,i)}else g=\\\"m_\\\"+n;m=s.m_i(n)}if((l||(n&&!s.m_a(n,g)))&&u&&s.d&&c&&s.d.createElement){if(d){m._d=1;m._dl=1}if(ln){if(s.ssl)u=s.rep(u,'http:','https:');i='s_s:'+s._in+':'+n+':'+g;b='var s=s_c_il['+s._in+'],o=s.d.getElementById(\\\"'+i+'\\\");if(s&&o){if(!o.l&&s.wd.'+g+'){o.l=1;if(o.i)clearTimeout(o.i);o.i=0;s.m_a(\\\"'+n+'\\\",\\\"'+g+'\\\"'+(e?',\\\"'+e+'\\\"':'')+')}';f2=b+'o.c++;if(!s.maxDelay)s.maxDelay=250;if(!o.l&&o.c<(s.maxDelay*2)/100)o.i=setTimeout(o.f2,100)}';f1=new Function('e',b+'}');tcf=new Function('s','c','i','u','f1','f2','var e,o=0;try{o=s.d.createElement(\\\"script\\\");if(o){o.type=\\\"text/javascript\\\";'+(n?'o.id=i;o.defer=true;o.onload=o.onreadystatechange=f1;o.f2=f2;o.l=0;':'')+'o.src=u;c.appendChild(o);'+(n?'o.c=0;o.i=setTimeout(f2,100)':'')+'}}catch(e){o=0}return o');o=tcf(s,c,i,u,f1,f2)}else{o=new Object;o.n=n+':'+g;o.u=u;o.d=d;o.l=l;o.e=e;g=s.m_dl;if(!g)g=s.m_dl=new Array;i=0;while(i<g.length&&g[i])i++;g[i]=o}}else if(n){m=s.m_i(n);m._e=1}return m};s.voa=function(vo,r){var s=this,l=s.va_g,i,k,v,x;for(i=0;i<l.length;i++){k=l[i];v=vo[k];if(v||vo['!'+k]){if(!r&&(k==\\\"contextData\\\"||k==\\\"retrieveLightData\\\")&&s[k])for(x in s[k])if(!v[x])v[x]=s[k][x];s[k]=v}}};s.vob=function(vo){var s=this,l=s.va_g,i,k;for(i=0;i<l.length;i++){k=l[i];vo[k]=s[k];if(!vo[k])vo['!'+k]=1}};s.dlt=new Function('var s=s_c_il['+s._in+'],d=new Date,i,vo,f=0;if(s.dll)for(i=0;i<s.dll.length;i++){vo=s.dll[i];if(vo){if(!s.m_m(\\\"d\\\")||d.getTime()-vo._t>=s.maxDelay){s.dll[i]=0;s.t(vo)}else f=1}}if(s.dli)clearTimeout(s.dli);s.dli=0;if(f){if(!s.dli)s.dli=setTimeout(s.dlt,s.maxDelay)}else s.dll=0');s.dl=function(vo){var s=this,d=new Date;if(!vo)vo=new Object;s.vob(vo);vo._t=d.getTime();if(!s.dll)s.dll=new Array;s.dll[s.dll.length]=vo;if(!s.maxDelay)s.maxDelay=250;s.dlt()};s.gfid=function(){var s=this,d='0123456789ABCDEF',k='s_fid',fid=s.c_r(k),h='',l='',i,j,m=8,n=4,e=new Date,y;if(!fid||fid.indexOf('-')<0){for(i=0;i<16;i++){j=Math.floor(Math.random()*m);h+=d.substring(j,j+1);j=Math.floor(Math.random()*n);l+=d.substring(j,j+1);m=n=16}fid=h+'-'+l;}y=e.getYear();e.setYear(y+2+(y<1900?1900:0));if(!s.c_w(k,fid,e))fid=0;return fid};s.applyADMS=function(){var s=this,vb=new Object;if(s.wd.ADMS&&!s.visitorID&&!s.admsc){if(!s.adms)s.adms=ADMS.getDefault();if(!s.admsq){s.visitorID=s.adms.getVisitorID(new Function('v','var s=s_c_il['+s._in+'],l=s.admsq,i;if(v==-1)v=0;if(v)s.visitorID=v;s.admsq=0;if(l){s.admsc=1;for(i=0;i<l.length;i++)s.t(l[i]);s.admsc=0;}'));if(!s.visitorID)s.admsq=new Array}if(s.admsq){s.vob(vb);vb['!visitorID']=0;s.admsq.push(vb);return 1}else{if(s.visitorID==-1)s.visitorID=0}}return 0};s.track=s.t=function(vo){var s=this,trk=1,tm=new Date,sed=Math&&Math.random?Math.floor(Math.random()*10000000000000):tm.getTime(),sess='s'+Math.floor(tm.getTime()/10800000)%10+sed,y=tm.getYear(),vt=tm.getDate()+'/'+tm.getMonth()+'/'+(y<1900?y+1900:y)+' '+tm.getHours()+':'+tm.getMinutes()+':'+tm.getSeconds()+' '+tm.getDay()+' '+tm.getTimezoneOffset(),tcf,tfs=s.gtfs(),ta=-1,q='',qs='',code='',vb=new Object;if(s.mpc('t',arguments))return;s.gl(s.vl_g);s.uns();s.m_ll();if(!s.td){var tl=tfs.location,a,o,i,x='',c='',v='',p='',bw='',bh='',j='1.0',k=s.c_w('s_cc','true',0)?'Y':'N',hp='',ct='',pn=0,ps;if(String&&String.prototype){j='1.1';if(j.match){j='1.2';if(tm.setUTCDate){j='1.3';if(s.isie&&s.ismac&&s.apv>=5)j='1.4';if(pn.toPrecision){j='1.5';a=new Array;if(a.forEach){j='1.6';i=0;o=new Object;tcf=new Function('o','var e,i=0;try{i=new Iterator(o)}catch(e){}return i');i=tcf(o);if(i&&i.next){j='1.7';if(a.reduce){j='1.8';if(j.trim){j='1.8.1';if(Date.parse){j='1.8.2';if(Object.create)j='1.8.5'}}}}}}}}}if(s.apv>=4)x=screen.width+'x'+screen.height;if(s.isns||s.isopera){if(s.apv>=3){v=s.n.javaEnabled()?'Y':'N';if(s.apv>=4){c=screen.pixelDepth;bw=s.wd.innerWidth;bh=s.wd.innerHeight}}s.pl=s.n.plugins}else if(s.isie){if(s.apv>=4){v=s.n.javaEnabled()?'Y':'N';c=screen.colorDepth;if(s.apv>=5){bw=s.d.documentElement.offsetWidth;bh=s.d.documentElement.offsetHeight;if(!s.ismac&&s.b){tcf=new Function('s','tl','var e,hp=0;try{s.b.addBehavior(\\\"#default#homePage\\\");hp=s.b.isHomePage(tl)?\\\"Y\\\":\\\"N\\\"}catch(e){}return hp');hp=tcf(s,tl);tcf=new Function('s','var e,ct=0;try{s.b.addBehavior(\\\"#default#clientCaps\\\");ct=s.b.connectionType}catch(e){}return ct');ct=tcf(s)}}}else r=''}if(s.pl)while(pn<s.pl.length&&pn<30){ps=s.fl(s.pl[pn].name,100)+';';if(p.indexOf(ps)<0)p+=ps;pn++}s.resolution=x;s.colorDepth=c;s.javascriptVersion=j;s.javaEnabled=v;s.cookiesEnabled=k;s.browserWidth=bw;s.browserHeight=bh;s.connectionType=ct;s.homepage=hp;s.plugins=p;s.td=1}if(vo){s.vob(vb);s.voa(vo)}s.fid=s.gfid();if(s.applyADMS())return '';if((vo&&vo._t)||!s.m_m('d')){if(s.usePlugins)s.doPlugins(s);if(!s.abort){var l=s.wd.location,r=tfs.document.referrer;if(!s.pageURL)s.pageURL=l.href?l.href:l;if(!s.referrer&&!s._1_referrer){s.referrer=r;s._1_referrer=1}s.m_m('g');if(s.lnk||s.eo){var o=s.eo?s.eo:s.lnk,p=s.pageName,w=1,t=s.ot(o),n=s.oid(o),x=o.s_oidt,h,l,i,oc;if(s.eo&&o==s.eo){while(o&&!n&&t!='BODY'){o=o.parentElement?o.parentElement:o.parentNode;if(o){t=s.ot(o);n=s.oid(o);x=o.s_oidt}}if(!n||t=='BODY')o='';if(o){oc=o.onclick?''+o.onclick:'';if((oc.indexOf('s_gs(')>=0&&oc.indexOf('.s_oc(')<0)||oc.indexOf('.tl(')>=0)o=0}}if(o){if(n)ta=o.target;h=s.oh(o);i=h.indexOf('?');h=s.linkLeaveQueryString||i<0?h:h.substring(0,i);l=s.linkName;t=s.linkType?s.linkType.toLowerCase():s.lt(h);if(t&&(h||l)){s.pe='lnk_'+(t=='d'||t=='e'?t:'o');s.pev1=(h?s.ape(h):'');s.pev2=(l?s.ape(l):'')}else trk=0;if(s.trackInlineStats){if(!p){p=s.pageURL;w=0}t=s.ot(o);i=o.sourceIndex;if(o.dataset&&o.dataset.sObjectId){s.wd.s_objectID=o.dataset.sObjectId;}else if(o.getAttribute&&o.getAttribute('data-s-object-id')){s.wd.s_objectID=o.getAttribute('data-s-object-id');}else if(s.useForcedLinkTracking){s.wd.s_objectID='';oc=o.onclick?''+o.onclick:'';if(oc){var ocb=oc.indexOf('s_objectID'),oce,ocq,ocx;if(ocb>=0){ocb+=10;while(ocb<oc.length&&(\\\"= \\\\t\\\\r\\\\n\\\").indexOf(oc.charAt(ocb))>=0)ocb++;if(ocb<oc.length){oce=ocb;ocq=ocx=0;while(oce<oc.length&&(oc.charAt(oce)!=';'||ocq)){if(ocq){if(oc.charAt(oce)==ocq&&!ocx)ocq=0;else if(oc.charAt(oce)==\\\"\\\\\\\\\\\")ocx=!ocx;else ocx=0;}else{ocq=oc.charAt(oce);if(ocq!='\\\"'&&ocq!=\\\"'\\\")ocq=0}oce++;}oc=oc.substring(ocb,oce);if(oc){o.s_soid=new Function('s','var e;try{s.wd.s_objectID='+oc+'}catch(e){}');o.s_soid(s)}}}}}if(s.gg('objectID')){n=s.gg('objectID');x=1;i=1}if(p&&n&&t)qs='&pid='+s.ape(s.fl(p,255))+(w?'&pidt='+w:'')+'&oid='+s.ape(s.fl(n,100))+(x?'&oidt='+x:'')+'&ot='+s.ape(t)+(i?'&oi='+i:'')}}else trk=0}if(trk||qs){s.sampled=s.vs(sed);if(trk){if(s.sampled)code=s.mr(sess,(vt?'&t='+s.ape(vt):'')+s.hav()+q+(qs?qs:s.rq()),0,ta);qs='';s.m_m('t');if(s.p_r)s.p_r();s.referrer=s.lightProfileID=s.retrieveLightProfiles=s.deleteLightProfiles=''}s.sq(qs)}}}else s.dl(vo);if(vo)s.voa(vb,1);s.abort=0;s.pageURLRest=s.lnk=s.eo=s.linkName=s.linkType=s.wd.s_objectID=s.ppu=s.pe=s.pev1=s.pev2=s.pev3='';if(s.pg)s.wd.s_lnk=s.wd.s_eo=s.wd.s_linkName=s.wd.s_linkType='';return code};s.trackLink=s.tl=function(o,t,n,vo,f){var s=this;s.lnk=o;s.linkType=t;s.linkName=n;if(f){s.bct=o;s.bcf=f}s.t(vo)};s.trackLight=function(p,ss,i,vo){var s=this;s.lightProfileID=p;s.lightStoreForSeconds=ss;s.lightIncrementBy=i;s.t(vo)};s.setTagContainer=function(n){var s=this,l=s.wd.s_c_il,i,t,x,y;s.tcn=n;if(l)for(i=0;i<l.length;i++){t=l[i];if(t&&t._c=='s_l'&&t.tagContainerName==n){s.voa(t);if(t.lmq)for(i=0;i<t.lmq.length;i++){x=t.lmq[i];y='m_'+x.n;if(!s[y]&&!s[y+'_c']){s[y]=t[y];s[y+'_c']=t[y+'_c']}s.loadModule(x.n,x.u,x.d)}if(t.ml)for(x in t.ml)if(s[x]){y=s[x];x=t.ml[x];for(i in x)if(!Object.prototype[i]){if(typeof(x[i])!='function'||(''+x[i]).indexOf('s_c_il')<0)y[i]=x[i]}}if(t.mmq)for(i=0;i<t.mmq.length;i++){x=t.mmq[i];if(s[x.m]){y=s[x.m];if(y[x.f]&&typeof(y[x.f])=='function'){if(x.a)y[x.f].apply(y,x.a);else y[x.f].apply(y)}}}if(t.tq)for(i=0;i<t.tq.length;i++)s.t(t.tq[i]);t.s=s;return}}};s.wd=window;s.ssl=(s.wd.location.protocol.toLowerCase().indexOf('https')>=0);s.d=document;s.b=s.d.body;if(s.d.getElementsByTagName){s.h=s.d.getElementsByTagName('HEAD');if(s.h)s.h=s.h[0]}s.n=navigator;s.u=s.n.userAgent;s.ns6=s.u.indexOf('Netscape6/');var apn=s.n.appName,v=s.n.appVersion,ie=v.indexOf('MSIE '),o=s.u.indexOf('Opera '),i;if(v.indexOf('Opera')>=0||o>0)apn='Opera';s.isie=(apn=='Microsoft Internet Explorer');s.isns=(apn=='Netscape');s.isopera=(apn=='Opera');s.ismac=(s.u.indexOf('Mac')>=0);if(o>0)s.apv=parseFloat(s.u.substring(o+6));else if(ie>0){s.apv=parseInt(i=v.substring(ie+5));if(s.apv>3)s.apv=parseFloat(i)}else if(s.ns6>0)s.apv=parseFloat(s.u.substring(s.ns6+10));else s.apv=parseFloat(v);s.em=0;if(s.em.toPrecision)s.em=3;else if(String.fromCharCode){i=escape(String.fromCharCode(256)).toUpperCase();s.em=(i=='%C4%80'?2:(i=='%U0100'?1:0))}if(s.oun)s.sa(s.oun);s.sa(un);s.vl_l='timestamp,dynamicVariablePrefix,visitorID,fid,vmk,visitorMigrationKey,visitorMigrationServer,visitorMigrationServerSecure,ppu,charSet,visitorNamespace,cookieDomainPeriods,cookieLifetime,pageName,pageURL,referrer,contextData,currencyCode,lightProfileID,lightStoreForSeconds,lightIncrementBy,retrieveLightProfiles,deleteLightProfiles,retrieveLightData';s.va_l=s.sp(s.vl_l,',');s.vl_mr=s.vl_m='timestamp,charSet,visitorNamespace,cookieDomainPeriods,cookieLifetime,contextData,lightProfileID,lightStoreForSeconds,lightIncrementBy';s.vl_t=s.vl_l+',variableProvider,channel,server,pageType,transactionID,purchaseID,campaign,state,zip,events,events2,products,linkName,linkType';var n;for(n=1;n<=75;n++){s.vl_t+=',prop'+n+',eVar'+n;s.vl_m+=',prop'+n+',eVar'+n}for(n=1;n<=5;n++)s.vl_t+=',hier'+n;for(n=1;n<=3;n++)s.vl_t+=',list'+n;s.va_m=s.sp(s.vl_m,',');s.vl_l2=',tnt,pe,pev1,pev2,pev3,resolution,colorDepth,javascriptVersion,javaEnabled,cookiesEnabled,browserWidth,browserHeight,connectionType,homepage,pageURLRest,plugins';s.vl_t+=s.vl_l2;s.va_t=s.sp(s.vl_t,',');s.vl_g=s.vl_t+',trackingServer,trackingServerSecure,trackingServerBase,fpCookieDomainPeriods,disableBufferedRequests,mobile,visitorSampling,visitorSamplingGroup,dynamicAccountSelection,dynamicAccountList,dynamicAccountMatch,trackDownloadLinks,trackExternalLinks,trackInlineStats,linkLeaveQueryString,linkDownloadFileTypes,linkExternalFilters,linkInternalFilters,linkTrackVars,linkTrackEvents,linkNames,lnk,eo,lightTrackVars,_1_referrer,un';s.va_g=s.sp(s.vl_g,',');s.pg=pg;s.gl(s.vl_g);s.contextData=new Object;s.retrieveLightData=new Object;if(!ss)s.wds();if(pg){s.wd.s_co=function(o){return o};s.wd.s_gs=function(un){s_gi(un,1,1).t()};s.wd.s_dc=function(un){s_gi(un,1).t()}}\",j=window,k=j.s_c_il,l=navigator,m=l.userAgent,n=l.appVersion,o=n.indexOf(\"MSIE \"),p=m.indexOf(\"Netscape6/\");\nif(a&&(a=a.toLowerCase(),k))for(f=0;2>f;f++)for(e=0;e<k.length;e++)if(h=k[e],g=h._c,(!g||\"s_c\"==g||f>0&&\"s_l\"==g)&&(h.oun==a||h.fs&&h.sa&&h.fs(h.oun,a))){if(h.sa&&h.sa(a),\"s_c\"==g)return h}else h=0;return j.s_an=\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",j.s_sp=new Function(\"x\",\"d\",\"var a=new Array,i=0,j;if(x){if(x.split)a=x.split(d);else if(!d)for(i=0;i<x.length;i++)a[a.length]=x.substring(i,i+1);else while(i>=0){j=x.indexOf(d,i);a[a.length]=x.substring(i,j<0?x.length:j);i=j;if(i>=0)i+=d.length}}return a\"),j.s_jn=new Function(\"a\",\"d\",\"var x='',i,j=a.length;if(a&&j>0){x=a[0];if(j>1){if(a.join)x=a.join(d);else for(i=1;i<j;i++)x+=d+a[i]}}return x\"),j.s_rep=new Function(\"x\",\"o\",\"n\",\"return s_jn(s_sp(x,o),n)\"),j.s_d=new Function(\"x\",\"var t='`^@$#',l=s_an,l2=new Object,x2,d,b=0,k,i=x.lastIndexOf('~~'),j,v,w;if(i>0){d=x.substring(0,i);x=x.substring(i+2);l=s_sp(l,'');for(i=0;i<62;i++)l2[l[i]]=i;t=s_sp(t,'');d=s_sp(d,'~');i=0;while(i<5){v=0;if(x.indexOf(t[i])>=0) {x2=s_sp(x,t[i]);for(j=1;j<x2.length;j++){k=x2[j].substring(0,1);w=t[i]+k;if(k!=' '){v=1;w=d[b+l2[k]]}x2[j]=w+x2[j].substring(1)}}if(v)x=s_jn(x2,'');else{w=t[i]+' ';if(x.indexOf(w)>=0)x=s_rep(x,w,t[i]);i++;b+=62}}}return x\"),j.s_fe=new Function(\"c\",\"return s_rep(s_rep(s_rep(c,'\\\\\\\\','\\\\\\\\\\\\\\\\'),'\\\"','\\\\\\\\\\\"'),\\\"\\\\n\\\",\\\"\\\\\\\\n\\\")\"),j.s_fa=new Function(\"f\",\"var s=f.indexOf('(')+1,e=f.indexOf(')'),a='',c;while(s>=0&&s<e){c=f.substring(s,s+1);if(c==',')a+='\\\",\\\"';else if((\\\"\\\\n\\\\r\\\\t \\\").indexOf(c)<0)a+=c;s++}return a?'\\\"'+a+'\\\"':a\"),j.s_ft=new Function(\"c\",\"c+='';var s,e,o,a,d,q,f,h,x;s=c.indexOf('=function(');while(s>=0){s++;d=1;q='';x=0;f=c.substring(s);a=s_fa(f);e=o=c.indexOf('{',s);e++;while(d>0){h=c.substring(e,e+1);if(q){if(h==q&&!x)q='';if(h=='\\\\\\\\')x=x?0:1;else x=0}else{if(h=='\\\"'||h==\\\"'\\\")q=h;if(h=='{')d++;if(h=='}')d--}if(d>0)e++}c=c.substring(0,s)+'new Function('+(a?a+',':'')+'\\\"'+s_fe(c.substring(o+1,e))+'\\\")'+c.substring(e+1);s=c.indexOf('=function(')}return c;\"),i=s_d(i),o>0?(d=parseInt(e=n.substring(o+5)),d>3&&(d=parseFloat(e))):d=parseFloat(p>0?m.substring(p+10):n),(5>d||n.indexOf(\"Opera\")>=0||m.indexOf(\"Opera\")>=0)&&(i=s_ft(i)),h||(h=new Object,j.s_c_in||(j.s_c_il=new Array,j.s_c_in=0),h._il=j.s_c_il,h._in=j.s_c_in,h._il[h._in]=h,j.s_c_in++),h._c=\"s_c\",new Function(\"s\",\"un\",\"pg\",\"ss\",i)(h,a,b,c),h}function s_giqf(){var a,b,c,d=window,e=d.s_giq;if(e)for(a=0;a<e.length;a++)b=e[a],c=s_gi(b.oun),c.sa(b.un),c.setTagContainer(b.tagContainerName);d.s_giq=0}if(\"object\"==typeof AC&&\"function\"==typeof AC.onDOMReady&&\"object\"==typeof AC.Element&&\"object\"==typeof AC.Storage&&AC.onDOMReady(function(){function a(a,b){AC.Element.addEventListener(a,\"mouseup\",function(){AC.Storage.setItem(\"s_nav\",b,\"0\")})}var b=AC.Element.selectAll(\"#globalheader a\");b.forEach(function(b){a(b,\"global nav\")});var c=AC.Element.selectAll(\"#productheader a\");c=c.concat(AC.Element.selectAll(\".localnav a\")),c.forEach(function(b){a(b,\"product nav\")});var d=AC.Element.selectAll(\"#buystrip a\");d=d.concat(AC.Element.selectAll(\".buystrip a\")),d.forEach(function(b){a(b,\"buy strip\")});var e=AC.Element.selectAll(\"#globalfooter a\");e.forEach(function(b){a(b,\"global footer\")});var f=AC.Element.selectAll(\".productbrowser .pb-slider .pb-slide ul li a\");f.forEach(function(b){a(b,\"product browser\")})}),document.location.search&&s_account){var dls=document.location.search;(dls.indexOf(\"?cid=AOS-\")>-1||dls.indexOf(\"&cid=AOS-\")>-1)&&(s_account+=\",applestoreWW\")}var s=s_gi(s_account);navigator&&navigator.loadPurpose&&\"preview\"==navigator.loadPurpose&&(s.t=new Function(\"return ''\")),s._isSafari=!1,s.u.toLowerCase().indexOf(\"webkit\")>-1&&s.u.toLowerCase().indexOf(\"safari\")>-1&&s.u.toLowerCase().indexOf(\"chrome\")<0&&(s._isSafari=!0),s.currencyCode=\"USD\",window.location.hostname.indexOf(\".com.cn\")>-1&&(s.fpCookieDomainPeriods=\"3\"),s.trackDownloadLinks=!0,s.trackExternalLinks=!0,s.trackInlineStats=!0,s.useForcedLinkTracking=!0,s.forcedLinkTrackingTimeout=100,s.linkDownloadFileTypes=\"zip,wav,mp3,doc,pdf,xls,dmg,sit,pkg,exe,mov,m4a,rss,xml,extz,safariextz\",s.linkInternalFilters=\"javascript:,apple.com\",s.linkLeaveQueryString=!1,s.linkTrackVars=\"campaign\",s.linkTrackEvents=\"None\",s.loadModule(\"Media\"),s.Media.autoTrack=!1,s.Media.trackVars=\"prop13,hier1\",s.Media.trackEvents=\"None\",s.Media.trackWhilePlaying=!0,s.Media.trackMilestones=\"10,50,90\",s.Media.monitor=function(a,b){if(\"CLOSE\"==b.event&&(b.percent>=\"99\"&&(a.Media.trackVars=\"prop13,prop16,eVar16\",a.prop13=\"v@e: \"+b.name,a.eVar16=a.prop16=\"video ends\",a.Media.track(b.name),a.prop13=a.prop16=a.eVar16=\"\"),b.percent<\"99\")){var c=a.events,d=a.prop13,e=a.prop16,f=a.prop4,g=a.Media.trackVars,h=a.Media.trackEvents;a.events=a.prop13=a.prop16=a.eVar16=a.prop4=\"\",a.Media.trackVars=a.Media.trackEvents=\"\",a.Media.track(b.name),a.events=c,a.prop13=d,a.prop16=a.eVar16=e,a.prop4=f,a.Media.trackVars=g,a.Media.trackEvents=h}},s.eVar54=document.location.href,s.eVar49=document.referrer;var s_vi_vnum=s.c_r(\"s_vnum_n2_us\");if(s_vi_vnum){var date=new Date;date.setTime(date.getTime()+63072e6);var expires=\"; expires=\"+date.toGMTString();document.cookie=\"s_vnum_n2_us=\"+s_vi_vnum+expires+\"; domain=apple.com; path=/\"}var s_vi=s.c_r(\"s_vi\");if(s_vi){var date=new Date;date.setTime(date.getTime()+63072e6);var expires=\"; expires=\"+date.toGMTString();document.cookie=\"s_vi=\"+s_vi+expires+\"; domain=apple.com; path=/\"}var s_pv=s.c_r(\"s_pv\");if(s_pv){var expires=\";expires=Thu, 01 Jan 1970 00:00:01 GMT\";document.cookie=\"s_pv=\"+s_pv+expires+\"; domain=apple.com; path=/\"}if(s.getObjectID=s_getObjectID,\"function\"==typeof iTunesDetected){var activeX=document.createElement(\"object\");activeX.setAttribute(\"width\",1),activeX.setAttribute(\"height\",1),activeX.id=\"iTunesDetectorIE\",activeX.setAttribute(\"classid\",\"clsid:D719897A-B07A-4C0C-AEA9-9B663A28DFCB\"),document.getElementsByTagName(\"head\")[0].appendChild(activeX),s.prop12=iTunesDetected()?\"itunes\":\"no itunes\"}\"undefined\"==typeof AC&&(AC={}),AC.Tracking||(AC.Tracking={}),AC.Tracking._pageName=null,AC.Tracking.pageName=function(){if(AC.Tracking._pageName)return AC.Tracking._pageName;for(var a,b=document.getElementsByTagName(\"meta\"),c=0;a=b[c];c++)if(\"omni_page\"===a.getAttribute(\"name\"))return AC.Tracking._pageName=a.getAttribute(\"content\").toLowerCase(),AC.Tracking._pageName;return AC.Tracking._pageNameForTitle_atHost_andPath(document.title,window.location.hostname,window.location.pathname)},AC.Tracking._pageNameForTitle_atHost_andPath=function(a,b,c){var d=a.toLowerCase();return/\\s-\\s/.test(d)&&(d=d.replace(/\\s*-?\\s*(apple|アップル|애플컴퓨터코리아|蘋果|蘋果電腦|apple中国|苹果中国)\\s+[^-]*-?\\s*/,\"\")),c.match(/^\\/(ws|pr|g5|go|ta|wm)\\//)||(c=c.replace(/^\\/(\\w{2}|befr|benl|chfr|chde|asia|lae)(?=\\/)/,\"\")),!(c.match(/\\//g).length<=2)||c.match(/support/)||b.match(/support/)||b.match(/selfsolve/)||!c.match(/index\\.html/)&&c.match(/\\.html/)||(d+=\" - index\"),/\\/pr\\//.test(c)&&(d=\"pr - \"+d),d},s.usePlugins=!0,s.doPlugins=s_doPlugins,s.getVisitNumPerChannel=function(){function a(a){for(var b=0;b<=p.length;b++)if(a==p[b])return b+1}var b,c,d=this,e=new Date,f=0,g=!1,h=!1,i=\"no channel\",j=e.getTime(),k=j+18e5,l=j+15768e7,m=d.wd.location.pathname,n=\"us\",o=\"\",p=new Array(\"no channel\",\"aos\",\"homepage\",\"support\",\"itunes\",\"myappleid.iforgot\",\"trailers\",\"ip\",\"discussions\",\"myappleid\",\"quicktime\",\"ipad\",\"ipadmini\",\"legal\",\"mac\",\"macosx\",\"safari\",\"ipod\",\"developer\",\"retailstore\",\"macbookair\",\"retail.concierge\",\"macosx.downloads\",\"ipodtouch\",\"ios\",\"macbookpro\",\"webapps\",\"search\",\"retail.onetoone\",\"icloud\",\"imac\",\"macmini\",\"ilife\",\"other\",\"findouthow\",\"jobs\",\"mobileme\",\"whymac\",\"macappstore\",\"hotnews\",\"redirects\",\"ipodnano\",\"education\",\"iwork\",\"ipodclassic\",\"macpro\",\"contact\",\"appletv\",\"finalcutstudio\",\"pr\",\"productpromotions\",\"ipodshuffle\",\"airportexpress\",\"environment\",\"aperture\",\"batteries\",\"mac.facetime\",\"productpromotions.rebate\",\"timecapsule\",\"displays\",\"airportextreme\",\"logicstudio\",\"buy\",\"about\",\"accessibility\",\"mightymouse\",\"thunderbolt\",\"html5\",\"remotedesktop\",\"magictrackpad\",\"keyboard\",\"business\",\"retail.jointventure\",\"itunesappstore\",\"pro\",\"science\",\"logicexpress\",\"channelprograms\",\"startpage\",\"advertising\",\"financialservices\",\"giftcards\",\"xsan\",\"server\",\"battery\",\"companystore\",\"ali\",\"supplier\",\"beatles\",\"usergroups\",\"webbadges\",\"procurement\",\"802.11n\",\"retail\",\"itunesnews\",\"ibooks-author\",\"osx\",\"apple-events\");d.wd.location.hostname.match(/apple.com.cn/)?n=\"cn\":m.match(/^\\/(ws|pr|g5|go|ta|wm|kb)\\//)||m.match(/^\\/(\\w{2}|befr|benl|chfr|chde|asia|lae)(?=\\/)/)&&(n=m.split(\"/\")[1].toLowerCase());var q=\"s_vnum_n2_\"+n,r=\"s_invisit_n2_\"+n;if(d.channel&&(i=d.channel.substring(d.channel.indexOf(\".\")+1,d.channel.length),i=i.substring(i.indexOf(\".\")+1,i.length)),o=a(i),o||(o=\"0\"),d.c_w(\"s_vnum_\"+n,\"\",63072e3),d.c_w(\"s_invisit_\"+n,\"\",63072e3),d.c_w(\"s_invisit_n_\"+n,\"\",63072e3),d.c_w(\"s_vnum_n_\"+n,\"\",63072e3),b=d.c_r(q),c=d.c_r(r),o){if(c)for(var s,t=c.split(/,/),u=0;s=t[u];u++)if(o.toString()==s){g=!0;break}if(!g){for(var s,v=b.split(/,/),u=0;s=v[u];u++){var w=s.split(/\\|/);if(o.toString()==w[0]){f=parseInt(w[1])+1,v[u]=w[0]+\"|\"+f,h=!0;break}}return e.setTime(k),d.c_w(r,c?c+\",\"+o:o,e),e.setTime(l),h?(d.c_w(q,v.toString(),e),i+\"=\"+f):(v.toString()?v.push(o+\"|1\"):v=o+\"|1\",d.c_w(q,v.toString(),e),i+\"=1\")}}},s.handlePPVevents=new Function(\"\",\"if(!s.getPPVid)return;var dh=Math.max(Math.max(s.d.body.scrollHeight,s.d.documentElement.scrollHeight),Math.max(s.d.body.offsetHeight,s.d.documentElement.offsetHeight),Math.max(s.d.body.clientHeight,s.d.documentElement.clientHeight)),vph=s.wd.innerHeight||(s.d.documentElement.clientHeight||s.d.body.clientHeight),st=s.wd.pageYOffset||(s.wd.document.documentElement.scrollTop||s.wd.document.body.scrollTop),vh=st+vph,pv=Math.min(Math.round(vh/dh*100),100),c=s.c_r('s_ppv'),a=(c.indexOf(',')>-1)?c.split(',',5):[],id=(a.length>0)?(a[0]):escape(s.getPPVid),cv=(a.length>1)?parseInt(a[1]):(0),p0=(a.length>2)?parseInt(a[2]):(pv),cy=(a.length>3)?parseInt(a[3]):(0),pt=s._ct,ph=s._ch,t=new Date;t.setTime(t.getTime()+1800000);s._ct=new Date().getTime();s._ch=vh;var sa='',td=Math.round((s._ct-pt)/1000),hd=Math.abs(s._ch-ph),lowerBound,upperBound;if(hd&&td){lowerBound=Math.ceil(st/100)*100;upperBound=Math.ceil(s._ch/100)*100;while(lowerBound<=upperBound){if(lowerBound!=0){var value=lowerBound+':'+(td>10?'>':td);if(s.pxViewedArray.length==0){s.pxViewedArray.push(value);}else if(s.pxViewedArray.toString().indexOf(lowerBound)==-1){s.pxViewedArray.push(value);}else{for(i=0;i<s.pxViewedArray.length;i++){var av=s.pxViewedArray[i].split(':');if(lowerBound==av[0]){if(av[1]!='>'){var totalTime=Math.floor((Number(av[1])+Number(td))*100)/100;if(totalTime>10){totalTime='>';}s.pxViewedArray[i]=av[0]+':'+totalTime;}break;}}}}lowerBound=lowerBound+100;s.pxViewedArray.sort(function(a,b){return parseInt(a)-parseInt(b)});}}sa=s.pxViewedArray.toString().replace(/,/g,'|');cn=(pv>0)?(id+','+((pv>cv)?pv:cv)+','+p0+','+((vh>cy)?vh:cy)+','+((sa)?sa:'')):'';s.c_w('s_ppv',cn,t);\"),s.getPercentPageViewed=new Function(\"pid\",\"pid=pid?pid:'-';var s=this,ist=!s.getPPVid?true:false,t=new Date;t.setTime(t.getTime()+1800000);if(typeof(s.linkType)!='undefined'&&s.linkType!='e')return'';var v=s.c_r('s_ppv'),a=(v.indexOf(',')>-1)?v.split(',',5):[];if(a.length<5){for(var i=4;i>0;i--){a[i]=(i<a.length)?(a[i-1]):('');}a[0]='';}a[0]=unescape(a[0]);s.getPPVpid=pid;s.c_w('s_ppv',escape(pid),t);s.pxViewedArray=[];if(ist){s.getPPVid=(pid)?(pid):(s.pageName?s.pageName:document.location.href);s.c_w('s_ppv',escape(s.getPPVid),0);if(s.wd.addEventListener){s.wd.addEventListener('load',s.handlePPVevents,false);s.wd.addEventListener('scroll',s.handlePPVevents,false);s.wd.addEventListener('resize',s.handlePPVevents,false);}else if(s.wd.attachEvent){s.wd.attachEvent('onload',s.handlePPVevents);s.wd.attachEvent('onscroll',s.handlePPVevents);s.wd.attachEvent('onresize',s.handlePPVevents);}}return(pid!='-')?(a):(a[1]);\"),s.p_oc=new Function(\"evt\",\"var o=s.wd.orientation,ot=(Math.abs(o)==90)?'l':'p',cv,v;s.lc=(evt.type=='load')?s.lc+1:s.lc;if(s.lc==0)return;if(typeof(o)!='undefined'){ot=(evt.type=='load')?ot:ot+':'+s.c_r('s_orientationHeight');cv=s.c_r('s_orientation');v=cv?cv+=','+ot:ot;s.c_w('s_orientation',v)}\"),s.p_och=new Function(\"\",\"var dh=Math.max(Math.max(s.d.body.scrollHeight,s.d.documentElement.scrollHeight),Math.max(s.d.body.offsetHeight,s.d.documentElement.offsetHeight),Math.max(s.d.body.clientHeight,s.d.documentElement.clientHeight));vph=s.wd.innerHeight||(s.d.documentElement.clientHeight||s.d.body.clientHeight),st=s.wd.pageYOffset||(s.wd.document.documentElement.scrollTop||s.wd.document.body.scrollTop),vh=st+vph;s.c_w('s_orientationHeight',vh);\"),s.deviceOrientationChanges=new Function(\"ext\",\"var s=this,v;s.lc=0;if(typeof(s.linkType)!='undefined'&&s.linkType!='e')return'';var cv=s.c_r('s_orientation'),cva=(cv.indexOf(',')>-1)?cv.split(','):'';if(cv){if(cva){if(!ext){for(i=1;i<cva.length;i++){cva[i]=cva[i].split(':')[0];}}cva[0]+='@s';cva.push(cva[cva.length-1].split(':')[0]+'@e');v=cva.toString();}else{v=cv+'@s,'+cv+'@e';}}s.c_w('s_orientation','');if(s.wd.addEventListener){s.wd.addEventListener('orientationchange',s.p_oc,false);s.wd.addEventListener('load',s.p_oc,false);s.wd.addEventListener('load',s.p_och,false);s.wd.addEventListener('scroll',s.p_och,false);}return v;\"),s.detectRIA=new Function(\"cn\",\"fp\",\"sp\",\"mfv\",\"msv\",\"sf\",\"cn=cn?cn:'s_ria';msv=msv?msv:2;mfv=mfv?mfv:10;var s=this,sv='',fv=-1,dwi=0,fr='',sr='',w,mt=s.n.mimeTypes,uk=s.c_r(cn),k=s.c_w('s_cc','true',0)?'Y':'N';fk=uk.substring(0,uk.indexOf('|'));sk=uk.substring(uk.indexOf('|')+1,uk.length);if(k=='Y'&&s.p_fo('detectRIA')){if(uk&&!sf){if(fp){s[fp]=fk;}if(sp){s[sp]=sk;}return false;}if(!fk&&fp){if(s.pl&&s.pl.length){if(s.pl['Shockwave Flash 2.0'])fv=2;x=s.pl['Shockwave Flash'];if(x){fv=0;z=x.description;if(z)fv=z.substring(16,z.indexOf('.'));}}else if(navigator.plugins&&navigator.plugins.length){x=navigator.plugins['Shockwave Flash'];if(x){fv=0;z=x.description;if(z)fv=z.substring(16,z.indexOf('.'));}}else if(mt&&mt.length){x=mt['application/x-shockwave-flash'];if(x&&x.enabledPlugin)fv=0;}if(fv<=0)dwi=1;w=s.u.indexOf('Win')!=-1?1:0;if(dwi&&s.isie&&w&&execScript){result=false;for(var i=mfv;i>=3&&result!=true;i--){execScript('on error resume next: result = IsObject(CreateObject(\\\"ShockwaveFlash.ShockwaveFlash.'+i+'\\\"))','VBScript');fv=i;}}fr=fv==-1?'Flash Not Detected':fv==0?'Flash Enabled (No Version)':'Flash '+fv;}if(!sk&&sp&&s.apv>=4.1){var tc='try{x=new ActiveXObject(\\\"AgControl.A'+'gControl\\\");for(var i=msv;i>0;i--){for(var j=9;j>=0;j--){if(x.is'+'VersionSupported(i+\\\".\\\"+j)){sv=i+\\\".\\\"+j;break;}}if(sv){break;}'+'}}catch(e){try{x=navigator.plugins[\\\"Silverlight Plug-In\\\"];sv=x'+'.description.substring(0,x.description.indexOf(\\\".\\\")+2);}catch('+'e){}}';eval(tc);sr=sv==''?'Silverlight Not Detected':'Silverlight '+sv;}if((fr&&fp)||(sr&&sp)){s.c_w(cn,fr+'|'+sr,0);if(fr)s[fp]=fr;if(sr)s[sp]=sr;}}\"),s.downloadLinkHandler=new Function(\"p\",\"var s=this,h=s.p_gh(),n='linkDownloadFileTypes',i,t;if(!h||(s.linkType&&(h||s.linkName)))return '';i=h.indexOf('?');t=s[n];s[n]=p?p:t;if(s.lt(h)=='d')s.linkType='d';else h='';s[n]=t;return h;\"),s.linkHandler=new Function(\"p\",\"t\",\"var s=this,h=s.p_gh(),i,l;t=t?t:'o';if(!h||(s.linkType&&(h||s.linkName)))return '';i=h.indexOf('?');h=s.linkLeaveQueryString||i<0?h:h.substring(0,i);l=s.pt(p,'|','p_gn',h.toLowerCase());if(l){s.linkName=l=='[['?'':l;s.linkType=t;return h;}return '';\"),s.p_gn=new Function(\"t\",\"h\",\"var i=t?t.indexOf('~'):-1,n,x;if(t&&h){n=i<0?'':t.substring(0,i);x=t.substring(i+1);if(h.indexOf(x.toLowerCase())>-1)return n?n:'[[';}return 0;\"),s.getPreviousValue=new Function(\"v\",\"c\",\"el\",\"var s=this,t=new Date,i,j,r='';t.setTime(t.getTime()+1800000);if(el){if(s.events){i=s.split(el,',');j=s.split(s.events,',');for(x in i){for(y in j){if(i[x]==j[y]){if(s.c_r(c)) r=s.c_r(c);v?s.c_w(c,v,t):s.c_w(c,'no value',t);return r}}}}}else{if(s.c_r(c)) r=s.c_r(c);v?s.c_w(c,v,t):s.c_w(c,'no value',t);return r}\"),s.setupDynamicObjectIDs=new Function(\"var s=this;if(!s.doi){s.doi=1;if(s.apv>3&&(!s.isie||!s.ismac||s.apv>=5)){if(s.wd.attachEvent)s.wd.attachEvent('onload',s.setOIDs);else if(s.wd.addEventListener)s.wd.addEventListener('load',s.setOIDs,false);else{s.doiol=s.wd.onload;s.wd.onload=s.setOIDs}}s.wd.s_semaphore=1}\"),s.setOIDs=new Function(\"e\",\"var s=s_c_il[\"+s._in+\"],b=s.eh(s.wd,'onload'),o='onclick',x,l,u,c,i,a=new Array;if(s.doiol){if(b)s[b]=s.wd[b];s.doiol(e)}if(s.d.links){for(i=0;i<s.d.links.length;i++){l=s.d.links[i];if(s._isSafari){safariHandler(l);}c=l[o]?''+l[o]:'';b=s.eh(l,o);z=l[b]?''+l[b]:'';u=s.getObjectID(l);if(u&&c.indexOf('s_objectID')<0&&z.indexOf('s_objectID')<0){u=s.repl(u,'\\\"','');u=s.repl(u,'\\\\n','').substring(0,97);l.s_oc=l[o];a[u]=a[u]?a[u]+1:1;x='';if(c.indexOf('.t(')>=0||c.indexOf('.tl(')>=0||c.indexOf('s_gs(')>=0)x='var x=\\\".tl(\\\";';x+='s_objectID=\\\"'+u+'_'+a[u]+'\\\";return this.s_oc?this.s_oc(e):true';if(s.isns&&s.apv>=5)l.setAttribute(o,x);l[o]=new Function('e',x)}}}s.wd.s_semaphore=0;return true\"),s.getQueryParam=new Function(\"p\",\"d\",\"u\",\"var s=this,v='',i,t;d=d?d:'';u=u?u:(s.pageURL?s.pageURL:s.wd.location);if(u=='f')u=s.gtfs().location;while(p){i=p.indexOf(',');i=i<0?p.length:i;t=s.p_gpv(p.substring(0,i),u+'');if(t){t=t.indexOf('#')>-1?t.substring(0,t.indexOf('#')):t;}if(t)v+=v?d+t:t;p=p.substring(i==p.length?i:i+1)}return v\"),s.p_gpv=new Function(\"k\",\"u\",\"var s=this,v='',i=u.indexOf('?'),q;if(k&&i>-1){q=u.substring(i+1);v=s.pt(q,'&','p_gvf',k)}return v\"),s.p_gvf=new Function(\"t\",\"k\",\"if(t){var s=this,i=t.indexOf('='),p=i<0?t:t.substring(0,i),v=i<0?'True':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s.epa(v)}return ''\"),s.getValOnce=new Function(\"v\",\"c\",\"e\",\"var s=this,a=new Date,v=v?v:v='',c=c?c:c='s_gvo',e=e?e:0,k=s.c_r(c);if(v){a.setTime(a.getTime()+e*86400000);s.c_w(c,v,e?a:0);}return v==k?'':v\"),s.setClickMapEmail=new Function(\"qp\",\"ot\",\"var s=this,v=s.getQueryParam(qp,'~'),d,pn,oid,ot=s.getQueryParam(ot),ot=ot?ot:'A',cv;d=v.indexOf('~');if(!v)return '';if(d>-1){pn=v.substring(0,d);oid=v.substring(d+1);}cv='&pid='+s.ape(s.fl(pn,255))+'&pidt=1&oid='+s.ape(s.fl(oid,100))+'&oidt=1&ot='+ot+'&oi=1';s.sq(cv);\"),s.getAndPersistValue=new Function(\"v\",\"c\",\"e\",\"var s=this,a=new Date;e=e?e:0;a.setTime(a.getTime()+e*86400000);if(v)s.c_w(c,v,e?a:0);return s.c_r(c);\"),s.__se=new Function(\"var l={'~':'tl:[\\\\'','^': 'kw:[\\\\'','%': 'ahoo','|': '\\\\'],','>': '\\\\']}','*': '.com','$': 'search',';':'query','#':'land','`':'oogle','+':'http://www','<':'keyword'};var f=this.___se+'';var g='';for(var i=0;i<f.length;i++){if(l[f.substring(i,i+1)]&&typeof l[f.substring(i,i+1)]!='undefined'){g+=l[f.substring(i,i+1)];}else{g+=f.substring(i,i+1);}}return eval('('+g+')');\"),s.___se=\"{}\",s.isEntry=new Function(\"var s=this;var l=s.linkInternalFilters,r=s.referrer||typeof s.referrer!='undefined'?s.referrer:document.referrer,p=l.indexOf(','),b=0,v='';if(!r){return 1;}while(p=l.indexOf(',')){v=p>-1?l.substring(b,p):l;if(v=='.'||r.indexOf(v)>-1){return 0;}if(p==-1){break;}b=p+1;l=l.substring(b,l.length);}return 1;\"),s.p_fo=new Function(\"n\",\"var s=this;if(!s.__fo){s.__fo=new Object;}if(!s.__fo[n]){s.__fo[n]=new Object;return 1;}else {return 0;}\"),s.manageVars=new Function(\"c\",\"l\",\"f\",\"var s=this,vl,la,vla;l=l?l:'';f=f?f:1 ;if(!s[c])return false;vl='pageName,purchaseID,channel,server,pageType,campaign,state,zip,events,products,transactionID';for(var n=1;n<76;n++){vl+=',prop'+n+',eVar'+n+',hier'+n;}if(l&&(f==1||f==2)){if(f==1){vl=l;}if(f==2){la=s.split(l,',');vla=s.split(vl,',');vl='';for(x in la){for(y in vla){if(la[x]==vla[y]){vla[y]='';}}}for(y in vla){vl+=vla[y]?','+vla[y]:'';}}s.pt(vl,',',c,0);return true;}else if(l==''&&f==1){s.pt(vl,',',c,0);return true;}else{return false;}\"),s.clearVars=new Function(\"t\",\"var s=this;s[t]='';\"),s.lowercaseVars=new Function(\"t\",\"var s=this;if(s[t]&&t!='events'){s[t]=s[t].toString();if(s[t].indexOf('D=')!=0){s[t]=s[t].toLowerCase();}}\"),s.join=new Function(\"v\",\"p\",\"var s = this;var f,b,d,w;if(p){f=p.front?p.front:'';b=p.back?p.back:'';d=p.delim?p.delim:'';w=p.wrap?p.wrap:'';}var str='';for(var x=0;x<v.length;x++){if(typeof(v[x])=='object' )str+=s.join( v[x],p);else str+=w+v[x]+w;if(x<v.length-1)str+=d;}return f+str+b;\"),s.p_fo=new Function(\"n\",\"var s=this;if(!s.__fo){s.__fo=new Object;}if(!s.__fo[n]){s.__fo[n]=new Object;return 1;}else {return 0;}\"),s.p_gh=new Function(\"var s=this;if(!s.eo&&!s.lnk)return '';var o=s.eo?s.eo:s.lnk,y=s.ot(o),n=s.oid(o),x=o.s_oidt;if(s.eo&&o==s.eo){while(o&&!n&&y!='BODY'){o=o.parentElement?o.parentElement:o.parentNode;if(!o)return '';y=s.ot(o);n=s.oid(o);x=o.s_oidt}}return o.href?o.href:'';\"),s.apl=new Function(\"L\",\"v\",\"d\",\"u\",\"var s=this,m=0;if(!L)L='';if(u){var i,n,a=s.split(L,d);for(i=0;i<a.length;i++){n=a[i];m=m||(u==1?(n==v):(n.toLowerCase()==v.toLowerCase()));}}if(!m)L=L?L+d+v:v;return L\"),s.repl=new Function(\"x\",\"o\",\"n\",\"var i=x.indexOf(o),l=n.length;while(x&&i>=0){x=x.substring(0,i)+n+x.substring(i+o.length);i=x.indexOf(o,i+l)}return x\"),s.split=new Function(\"l\",\"d\",\"var i,x=0,a=new Array;while(l){i=l.indexOf(d);i=i>-1?i:l.length;a[x++]=l.substring(0,i);l=l.substring(i+d.length);}return a\"),s.vpr=new Function(\"vs\",\"v\",\"if(typeof(v)!='undefined'){var s=this; eval('s.'+vs+'=\\\"'+v+'\\\"')}\"),s.trackingServer=\"metrics.apple.com\",s.trackingServerSecure=\"securemetrics.apple.com\",s.dc=112,s.m_Media_c=\"var m=s.m_i('Media');m.cn=function(n){var m=this;return m.s.rep(m.s.rep(m.s.rep(n,\\\"\\\\n\\\",''),\\\"\\\\r\\\",''),'--**--','')};m.open=function(n,l,p,b){var m=this,i=new Object,tm=new Date,a='',x;n=m.cn(n);l=parseInt(l);if(!l)l=1;if(n&&p){if(!m.l)m.l=new Object;if(m.l[n])m.close(n);if(b&&b.id)a=b.id;for (x in m.l)if(m.l[x]&&m.l[x].a==a)m.close(m.l[x].n);i.n=n;i.l=l;i.p=m.cn(p);i.a=a;i.t=0;i.ts=0;i.s=Math.floor(tm.getTime()/1000);i.lx=0;i.lt=i.s;i.lo=0;i.e='';i.to=-1;m.l[n]=i}};m.close=function(n){this.e(n,0,-1)};m.play=function(n,o){var m=this,i;i=m.e(n,1,o);i.m=new Function('var m=s_c_il['+m._in+'],i;if(m.l){i=m.l[\\\"'+m.s.rep(i.n,'\\\"','\\\\\\\\\\\"')+'\\\"];if(i){if(i.lx==1)m.e(i.n,3,-1);i.mt=setTimeout(i.m,5000)}}');i.m()};m.stop=function(n,o){this.e(n,2,o)};m.track=function(n){var m=this;if (m.trackWhilePlaying) {m.e(n,4,-1)}};m.e=function(n,x,o){var m=this,i,tm=new Date,ts=Math.floor(tm.getTime()/1000),ti=m.trackSeconds,tp=m.trackMilestones,z=new Array,j,d='--**--',t=1,b,v=m.trackVars,e=m.trackEvents,pe='media',pev3,w=new Object,vo=new Object;n=m.cn(n);i=n&&m.l&&m.l[n]?m.l[n]:0;if(i){w.name=n;w.length=i.l;w.playerName=i.p;if(i.to<0)w.event=\\\"OPEN\\\";else w.event=(x==1?\\\"PLAY\\\":(x==2?\\\"STOP\\\":(x==3?\\\"MONITOR\\\":\\\"CLOSE\\\")));w.openTime=new Date();w.openTime.setTime(i.s*1000);if(x>2||(x!=i.lx&&(x!=2||i.lx==1))) {b=\\\"Media.\\\"+name;pev3 = m.s.ape(i.n)+d+i.l+d+m.s.ape(i.p)+d;if(x){if(o<0&&i.lt>0){o=(ts-i.lt)+i.lo;o=o<i.l?o:i.l-1}o=Math.floor(o);if(x>=2&&i.lo<o){i.t+=o-i.lo;i.ts+=o-i.lo;}if(x<=2){i.e+=(x==1?'S':'E')+o;i.lx=x;}else if(i.lx!=1)m.e(n,1,o);i.lt=ts;i.lo=o;pev3+=i.t+d+i.s+d+(m.trackWhilePlaying&&i.to>=0?'L'+i.to:'')+i.e+(x!=2?(m.trackWhilePlaying?'L':'E')+o:'');if(m.trackWhilePlaying){b=0;pe='m_o';if(x!=4){w.offset=o;w.percent=((w.offset+1)/w.length)*100;w.percent=w.percent>100?100:Math.floor(w.percent);w.timePlayed=i.t;if(m.monitor)m.monitor(m.s,w)}if(i.to<0)pe='m_s';else if(x==4)pe='m_i';else{t=0;v=e='None';ti=ti?parseInt(ti):0;z=tp?m.s.sp(tp,','):0;if(ti&&i.ts>=ti)t=1;else if(z){if(o<i.to)i.to=o;else{for(j=0;j<z.length;j++){ti=z[j]?parseInt(z[j]):0;if(ti&&((i.to+1)/i.l<ti/100)&&((o+1)/i.l>=ti/100)){t=1;j=z.length}}}}}}}else{m.e(n,2,-1);if(m.trackWhilePlaying){w.offset=i.lo;w.percent=((w.offset+1)/w.length)*100;w.percent=w.percent>100?100:Math.floor(w.percent);w.timePlayed=i.t;if(m.monitor)m.monitor(m.s,w)}m.l[n]=0;if(i.e){pev3+=i.t+d+i.s+d+(m.trackWhilePlaying&&i.to>=0?'L'+i.to:'')+i.e;if(m.trackWhilePlaying){v=e='None';pe='m_o'}else{t=0;m.s.fbr(b)}}else t=0;b=0}if(t){vo.linkTrackVars=v;vo.linkTrackEvents=e;vo.pe=pe;vo.pev3=pev3;m.s.t(vo,b);if(m.trackWhilePlaying){i.ts=0;i.to=o;i.e=''}}}}return i};m.ae=function(n,l,p,x,o,b){if(n&&p){var m=this;if(!m.l||!m.l[n])m.open(n,l,p,b);m.e(n,x,o)}};m.a=function(o,t){var m=this,i=o.id?o.id:o.name,n=o.name,p=0,v,c,c1,c2,xc=m.s.h,x,e,f1,f2='s_media_'+m._in+'_oc',f3='s_media_'+m._in+'_t',f4='s_media_'+m._in+'_s',f5='s_media_'+m._in+'_l',f6='s_media_'+m._in+'_m',f7='s_media_'+m._in+'_c',tcf,w;if(!i){if(!m.c)m.c=0;i='s_media_'+m._in+'_'+m.c;m.c++}if(!o.id)o.id=i;if(!o.name)o.name=n=i;if(!m.ol)m.ol=new Object;if(m.ol[i])return;m.ol[i]=o;if(!xc)xc=m.s.b;tcf=new Function('o','var e,p=0;try{if(o.versionInfo&&o.currentMedia&&o.controls)p=1}catch(e){p=0}return p');p=tcf(o);if(!p){tcf=new Function('o','var e,p=0,t;try{t=o.GetQuickTimeVersion();if(t)p=2}catch(e){p=0}return p');p=tcf(o);if(!p){tcf=new Function('o','var e,p=0,t;try{t=o.GetVersionInfo();if(t)p=3}catch(e){p=0}return p');p=tcf(o)}}v=\\\"var m=s_c_il[\\\"+m._in+\\\"],o=m.ol['\\\"+i+\\\"']\\\";if(p==1){p='Windows Media Player '+o.versionInfo;c1=v+',n,p,l,x=-1,cm,c,mn;if(o){cm=o.currentMedia;c=o.controls;if(cm&&c){mn=cm.name?cm.name:c.URL;l=cm.duration;p=c.currentPosition;n=o.playState;if(n){if(n==8)x=0;if(n==3)x=1;if(n==1||n==2||n==4||n==5||n==6)x=2;}';c2='if(x>=0)m.ae(mn,l,\\\"'+p+'\\\",x,x!=2?p:-1,o)}}';c=c1+c2;if(m.s.isie&&xc){x=m.s.d.createElement('script');x.language='jscript';x.type='text/javascript';x.htmlFor=i;x.event='PlayStateChange(NewState)';x.defer=true;x.text=c;xc.appendChild(x);o[f6]=new Function(c1+'if(n==3){x=3;'+c2+'}setTimeout(o.'+f6+',5000)');o[f6]()}}if(p==2){p='QuickTime Player '+(o.GetIsQuickTimeRegistered()?'Pro ':'')+o.GetQuickTimeVersion();f1=f2;c=v+',n,x,t,l,p,p2,mn;if(o){mn=o.GetMovieName()?o.GetMovieName():o.GetURL();n=o.GetRate();t=o.GetTimeScale();l=o.GetDuration()/t;p=o.GetTime()/t;p2=o.'+f5+';if(n!=o.'+f4+'||p<p2||p-p2>5){x=2;if(n!=0)x=1;else if(p>=l)x=0;if(p<p2||p-p2>5)m.ae(mn,l,\\\"'+p+'\\\",2,p2,o);m.ae(mn,l,\\\"'+p+'\\\",x,x!=2?p:-1,o)}if(n>0&&o.'+f7+'>=10){m.ae(mn,l,\\\"'+p+'\\\",3,p,o);o.'+f7+'=0}o.'+f7+'++;o.'+f4+'=n;o.'+f5+'=p;setTimeout(\\\"'+v+';o.'+f2+'(0,0)\\\",500)}';o[f1]=new Function('a','b',c);o[f4]=-1;o[f7]=0;o[f1](0,0)}if(p==3){p='RealPlayer '+o.GetVersionInfo();f1=n+'_OnPlayStateChange';c1=v+',n,x=-1,l,p,mn;if(o){mn=o.GetTitle()?o.GetTitle():o.GetSource();n=o.GetPlayState();l=o.GetLength()/1000;p=o.GetPosition()/1000;if(n!=o.'+f4+'){if(n==3)x=1;if(n==0||n==2||n==4||n==5)x=2;if(n==0&&(p>=l||p==0))x=0;if(x>=0)m.ae(mn,l,\\\"'+p+'\\\",x,x!=2?p:-1,o)}if(n==3&&(o.'+f7+'>=10||!o.'+f3+')){m.ae(mn,l,\\\"'+p+'\\\",3,p,o);o.'+f7+'=0}o.'+f7+'++;o.'+f4+'=n;';c2='if(o.'+f2+')o.'+f2+'(o,n)}';if(m.s.wd[f1])o[f2]=m.s.wd[f1];m.s.wd[f1]=new Function('a','b',c1+c2);o[f1]=new Function('a','b',c1+'setTimeout(\\\"'+v+';o.'+f1+'(0,0)\\\",o.'+f3+'?500:5000);'+c2);o[f4]=-1;if(m.s.isie)o[f3]=1;o[f7]=0;o[f1](0,0)}};m.as=new Function('e','var m=s_c_il['+m._in+'],l,n;if(m.autoTrack&&m.s.d.getElementsByTagName){l=m.s.d.getElementsByTagName(m.s.isie?\\\"OBJECT\\\":\\\"EMBED\\\");if(l)for(n=0;n<l.length;n++)m.a(l[n]);}');if(s.wd.attachEvent)s.wd.attachEvent('onload',m.as);else if(s.wd.addEventListener)s.wd.addEventListener('load',m.as,false)\",s.m_i(\"Media\");var s_code=\"\",s_objectID;s_giqf();"
  },
  {
    "path": "works/demo/ali/file/saved_resource",
    "content": "/*2014-08-28 10:18:15*/!function(){function t(t){var e,n;try{return e=[].slice.call(t)}catch(r){e=[],n=t.length;for(var a=0;n>a;a++)e.push(t[a]);return e}}function e(t,e){return t&&t.getAttribute?t.getAttribute(e)||\"\":\"\"}function n(t,e,n){if(t&&t.setAttribute)try{t.setAttribute(e,n)}catch(r){}}function r(t,e){if(t&&t.removeAttribute)try{t.removeAttribute(e)}catch(r){n(t,e,\"\")}}function a(t,e){return 0==t.indexOf(e)}function i(t){return\"string\"==typeof t}function o(t){return\"[object Array]\"===Object.prototype.toString.call(t)}function c(t,e){return t.indexOf(e)>=0}function u(t,e){return t.indexOf(e)>-1}function f(t,e){for(var n=0,r=e.length;r>n;n++)if(u(t,e[n]))return de;return ge}function m(t){return i(t)?t.replace(/^\\s+|\\s+$/g,\"\"):\"\"}function s(t){return\"undefined\"==typeof t}function l(t,e){var n=e||\"\";if(t)try{n=decodeURIComponent(t)}catch(r){}return n}function p(){return ce=ce||le.getElementsByTagName(\"head\")[0],ue||(ce?ue=ce.getElementsByTagName(\"meta\"):[])}function d(t,e){var n,r,a=t.split(\";\"),i=a.length;for(n=0;i>n;n++)r=a[n].split(\"=\"),e[m(r[0])||ke]=l(m(r.slice(1).join(\"=\")))}function g(){var t,n,r,a=p(),i=a.length;for(t=0;i>t;t++)if(n=a[t],\"aplus-terminal\"==e(n,\"name\")){r=e(n,\"content\");break}return r}function h(){var t,n,r,a,i=p();for(t=0,n=i.length;n>t;t++)r=i[t],a=e(r,\"name\"),a==Re&&(fe=e(r,Le))}function b(t){var n,r,i,o,c,u,f=p();if(f)for(n=0,r=f.length;r>n;n++)if(o=f[n],c=e(o,\"name\"),c==t)return ae=e(o,\"content\"),ae.indexOf(\":\")>=0&&(i=ae.split(\":\"),fe=\"i\"==i[0]?\"i\":\"u\",ae=i[1]),u=e(o,Le),u&&(fe=\"i\"==u?\"i\":\"u\"),ie=a(ae,\"110\"),re=ie?je:ae,de;return ge}function v(){return Math.floor(268435456*Math.random()).toString(16)}function y(t){var e,n,r=[];for(e in t)t.hasOwnProperty(e)&&(n=\"\"+t[e],r.push(a(e,ke)?n:e+\"=\"+encodeURIComponent(n)));return r.join(\"&\")}function _(t){var e,n,r,i=[],o=t.length;for(r=0;o>r;r++)e=t[r][0],n=t[r][1],i.push(a(e,ke)?n:e+\"=\"+encodeURIComponent(n));return i.join(\"&\")}function N(t){var e;try{e=m(t.getAttribute(\"href\",2))}catch(n){}return e||\"\"}function w(t,e,n){t[Pe]((Te?\"on\":\"\")+e,function(t){t=t||se.event;var e=t.target||t.srcElement;n(e)},ge)}function x(t){var e=se.KISSY;e?e.ready(t):se.jQuery?jQuery(le).ready(t):\"complete\"===le.readyState?t():w(se,\"load\",t)}function A(t,e){var n,r=new Image,a=\"_img_\"+Math.random(),i=-1==t.indexOf(\"?\")?\"?\":\"&\",c=e?o(e)?_(e):y(e):\"\";return se[a]=r,r.onload=r.onerror=function(){se[a]=null},r.src=n=c?t+i+c:t,r=null,n}function j(){var t;if(xe&&!ze&&(t=he.match(/^[^?]+\\?[^?]*spm=([^&?]+)/),t&&(ze=t[1]+\"_\")),!s(re))return re;if(se._SPM_a&&se._SPM_b)return ee=se._SPM_a.replace(/^{(\\w+)}$/g,\"$1\"),ne=se._SPM_b.replace(/^{(\\w+)}$/g,\"$1\"),Ie=de,re=ee+\".\"+ne,h(),re;if(b(Re)||b(\"spm-id\"),!re)return Oe=!0,re=je,je;var n,r,a=le.getElementsByTagName(\"body\");return a=a&&a.length?a[0]:null,a&&(n=e(a,Re),n&&(r=re.split(\".\"),re=r[0]+\".\"+n)),u(re,\".\")||(Oe=!0,re=je),re}function O(n){var r,a,i,o,c,u,f,m,s=[];for(r=t(n.getElementsByTagName(\"a\")),a=t(n.getElementsByTagName(\"area\")),o=r.concat(a),f=0,m=o.length;m>f;f++){for(u=!1,c=i=o[f];(c=c.parentNode)&&c!=n;)if(e(c,Re)){u=!0;break}u||s.push(i)}return s}function k(t,n,r){var o,u,f,m,s,l,p,d,g,h,b,v,y,_,w,x,A;if(n=n||t.getAttribute(Re)||\"\"){if(o=O(t),f=n.split(\".\"),w=a(n,\"110\")&&3==f.length,w&&(x=f[2],f[2]=\"w\"+(x||\"0\"),n=f.join(\".\")),i(b=j())&&b.match(/^[\\w\\-\\*]+(\\.[\\w\\-\\*]+)?$/))if(c(n,\".\")){if(!a(n,b)){for(m=b.split(\".\"),f=n.split(\".\"),y=0,v=m.length;v>y;y++)f[y]=m[y];n=f.join(\".\")}}else c(b,\".\")||(b+=\".0\"),n=b+\".\"+n;if(n.match&&n.match(/^[\\w\\-\\*]+\\.[\\w\\-\\*]+\\.[\\w\\-\\*]+$/)){for(A=parseInt(e(t,\"data-spm-max-idx\"))||0,_=0,s=A,v=o.length;v>_;_++)u=o[_],l=N(u),l&&(w&&u.setAttribute(He,x),p=u.getAttribute(Qe),p&&z(p)?I(u,p,r):(d=L(u.parentNode),d.a_spm_ab?(h=d.a_spm_ab,g=d.ab_idx):(h=void 0,s++,g=s),p=h?n+\"-\"+h+\".\"+(C(u)||g):n+\".\"+(C(u)||g),I(u,p,r)));t.setAttribute(\"data-spm-max-idx\",s)}}}function E(t){var e,n=[\"mclick.simba.taobao.com\",\"click.simba.taobao.com\",\"click.tanx.com\",\"click.mz.simba.taobao.com\",\"click.tz.simba.taobao.com\",\"redirect.simba.taobao.com\",\"rdstat.tanx.com\",\"stat.simba.taobao.com\",\"s.click.taobao.com\"],r=n.length;for(e=0;r>e;e++)if(-1!=t.indexOf(n[e]))return!0;return!1}function $(t){return t?!!t.match(/^[^\\?]*\\balipay\\.(?:com|net)\\b/i):ge}function T(t){return t?!!t.match(/^[^\\?]*\\balipay\\.(?:com|net)\\/.*\\?.*\\bsign=.*/i):ge}function B(t){for(var n;(t=t.parentNode)&&t.tagName!=$e;)if(n=e(t,Le))return n;return\"\"}function M(t,e){if(t&&/&?\\bspm=[^&#]*/.test(t)&&(t=t.replace(/&?\\bspm=[^&#]*/g,\"\").replace(/&{2,}/g,\"&\").replace(/\\?&/,\"?\").replace(/\\?$/,\"\")),!e)return t;var n,r,a,i,o,c,f,m=\"&\";if(-1!=t.indexOf(\"#\")&&(a=t.split(\"#\"),t=a.shift(),r=a.join(\"#\")),i=t.split(\"?\"),o=i.length-1,a=i[0].split(\"//\"),a=a[a.length-1].split(\"/\"),c=a.length>1?a.pop():\"\",o>0&&(n=i.pop(),t=i.join(\"?\")),n&&o>1&&-1==n.indexOf(\"&\")&&-1!=n.indexOf(\"%\")&&(m=\"%26\"),t=t+\"?spm=\"+ze+e+(n?m+n:\"\")+(r?\"#\"+r:\"\"),f=u(c,\".\")?c.split(\".\").pop().toLowerCase():\"\"){if({png:1,jpg:1,jpeg:1,gif:1,bmp:1,swf:1}.hasOwnProperty(f))return 0;!n&&1>=o&&(r||{htm:1,html:1,php:1}.hasOwnProperty(f)||(t+=\"&file=\"+c))}return t}function P(t){return t&&he.split(\"#\")[0]==t.split(\"#\")[0]}function I(t,n,r){if(t.setAttribute(Qe,n),!r&&!e(t,De)&&(oe=se.g_aplus_pv_id,oe&&(n+=\".\"+oe),oe||re&&re!=je)){var i=N(t),o=\"i\"==(e(t,Le)||B(t)||fe),c=Ne+\"tbspm.1.1?logtype=2&spm=\";i&&!E(i)&&(o||!(a(i,\"#\")||P(i)||a(i.toLowerCase(),\"javascript:\")||$(i)||T(i)))&&(o?(c+=n+\"&url=\"+encodeURIComponent(i)+\"&cache=\"+v(),me==t&&A(c)):r||(i=M(i,n))&&S(t,i))}}function S(t,e){var n,r=t.innerHTML;r&&-1==r.indexOf(\"<\")&&(n=le.createElement(\"b\"),n.style.display=\"none\",t.appendChild(n)),t.href=e,n&&t.removeChild(n)}function C(t){var n;return Oe?n=\"0\":(n=e(t,Re),n&&n.match(/^d\\w+$/)||(n=\"\")),n}function R(t){for(var e,n,r=t;t&&t.tagName!=Ee&&t.tagName!=$e&&t.getAttribute;){if(n=t.getAttribute(Re)){e=n,r=t;break}if(!(t=t.parentNode))break}return e&&!/^[\\w\\-\\.]+$/.test(e)&&(e=\"0\"),{spm_c:e,el:r}}function L(t){for(var n,r={},a=\"\";t&&t.tagName!=Ee&&t.tagName!=$e;){if(!a&&(a=e(t,Ye))){n=parseInt(e(t,\"data-spm-ab-max-idx\"))||0,r.a_spm_ab=a,r.ab_idx=++n,t.setAttribute(\"data-spm-ab-max-idx\",n);break}if(e(t,Re))break;t=t.parentNode}return r}function U(t){var e;return t&&(e=t.match(/&?\\bspm=([^&#]*)/))?e[1]:\"\"}function D(t,e){var n=N(t),r=U(n),a=null,i=re&&2==re.split(\".\").length;return i?(a=[re,0,C(t)||0],void I(t,a.join(\".\"),e)):void(n&&r&&(n=n.replace(/&?\\bspm=[^&#]*/g,\"\").replace(/&{2,}/g,\"&\").replace(/\\?&/,\"?\").replace(/\\?$/,\"\").replace(/\\?#/,\"#\"),S(t,n)))}function z(t){var e=t.split(\".\");return e[0]+\".\"+e[1]==re}function H(t,n){me=t,Ie&&q();var r,a,i=e(t,Qe);if(i&&z(i))I(t,i,n);else{if(r=R(t.parentNode),a=r.spm_c,!a)return void D(t,n);Oe&&(a=\"0\"),k(r.el,a,n)}}function Q(e){if(e&&1==e.nodeType){r(e,\"data-spm-max-idx\");var n,a=t(e.getElementsByTagName(\"a\")),i=t(e.getElementsByTagName(\"area\")),o=a.concat(i),c=o.length;for(n=0;c>n;n++)r(o[n],Qe)}}function Y(t){var e=t.parentNode;if(!e)return\"\";var n=t.getAttribute(Re),r=R(e),a=r.spm_c||0;a&&-1!=a.indexOf(\".\")&&(a=a.split(\".\"),a=a[a.length-1]);var i=re+\".\"+a,o=Ae[i]||0;return o++,Ae[i]=o,n=n||o,i+\".i\"+n}function K(t){var n,r=t.tagName;return oe=se.g_aplus_pv_id,\"A\"!=r&&\"AREA\"!=r?n=Y(t):(H(t,de),n=e(t,Qe)),n=(n||\"0.0.0.0\").split(\".\"),{a:n[0],b:n[1],c:n[2],d:n[3],e:oe}}function V(t,e){if(e||(e=le),le.evaluate)return e.evaluate(t,le,null,9,null).singleNodeValue;for(var n,r=t.split(\"/\");!n&&r.length>0;)n=r.shift();var a,i=/^.+?\\[@id=\"(.+?)\"]$/i,o=/^(.+?)\\[(\\d+)]$/i;return(a=n.match(i))?e=e.getElementById(a[1]):(a=n.match(o))&&(e=e.getElementsByTagName(a[1])[parseInt(a[2])-1]),e?0==r.length?e:V(r.join(\"/\"),e):null}function q(){var t,e,r,a={};for(t in Se)Se.hasOwnProperty(t)&&(e=V(t),e&&(a[t]=1,r=Se[t],n(e,Re,(\"A\"==e.tagName?r.spmd:r.spmc)||\"\")));for(t in a)a.hasOwnProperty(t)&&delete Se[t]}function F(){if(!Ce){if(!se.spmData)return void(we||setTimeout(arguments.callee,100));Ce=de;var t,e,n,r,a=se.spmData.data;if(a&&o(a)){for(t=0,e=a.length;e>t;t++)n=a[t],r=n.xpath,r=r.replace(/^id\\(\"(.+?)\"\\)(.*)/g,'//*[@id=\"$1\"]$2'),Se[r]={spmc:n.spmc,spmd:n.spmd};q()}}}function G(){var t,n,r,a,i=le.getElementsByTagName(\"iframe\"),o=i.length;for(n=0;o>n;n++)t=i[n],!t.src&&(r=e(t,Ue))&&(a=K(t),a?(a=[a.a,a.b,a.c,a.d,a.e].join(\".\"),t.src=M(r,a)):t.src=r)}function J(){function t(){e++,e>10&&(n=3e3),G(),setTimeout(t,n)}var e=0,n=500;t()}function W(t,e){var n,r,i=\"gostr\",o=\"locaid\",c={};if(d(e,c),n=c[i],r=c[o],n&&r){a(n,\"/\")&&(n=n.substr(1));var u,f=K(t),m=[f.a,f.b,f.c,r].join(\".\"),s=n+\".\"+m,l=[\"logtype=2\",\"cache=\"+Math.random(),\"autosend=1\"];for(u in c)c.hasOwnProperty(u)&&u!=i&&u!=o&&l.push(u+\"=\"+c[u]);l.length>0&&(s+=\"?\"+l.join(\"&\")),A(Ne+s),t.setAttribute(Qe,m)}}function X(t){for(var n;t&&t.tagName!=Ee;){n=e(t,De);{if(n){W(t,n);break}t=t.parentNode}}}function Z(){w(le,\"mousedown\",X)}function te(t){for(var e;t&&(e=t.tagName);){if(\"A\"==e||\"AREA\"==e){H(t,ge);break}if(e==$e||e==Ee)break;t=t.parentNode}}var ee,ne,re,ae,ie,oe,ce,ue,fe,me,se=window,le=document,pe=location,de=!0,ge=!1,he=pe.href,be=pe.protocol,ve=\"https:\"==be,ye=ve?be:\"http:\",_e=g(),Ne=ye+(ve?\"//log.mmstat.com/\":_e?\"//wgo.mmstat.com/\":\"//gm.mmstat.com/\"),we=ge,xe=parent!==self,Ae={},je=\"0.0\",Oe=!1,ke=\"::-plain-::\",Ee=\"HTML\",$e=\"BODY\",Te=!!le.attachEvent,Be=\"attachEvent\",Me=\"addEventListener\",Pe=Te?Be:Me,Ie=ge,Se={},Ce=ge,Re=\"data-spm\",Le=\"data-spm-protocol\",Ue=\"data-spm-src\",De=\"data-spm-click\",ze=\"\",He=\"data-spm-wangpu-module-id\",Qe=\"data-spm-anchor-id\",Ye=\"data-spm-ab\";f(he,[\"xiaobai.com\",\"admin.taobao.org\"])||(x(function(){we=de}),j(),F(),_e||J(),Z(),w(le,\"mousedown\",te),w(le,\"keydown\",te),se.g_SPM={resetModule:Q,anchorBeacon:H,getParam:K})}();/*pub-1|2013-05-29 11:03:48*/(function(){var i=window,x=document,m=location,o=m.href,s=i._alimm_spmact_on_;if(typeof s==\"undefined\"){s=1}if(s==1){s=1}if(s==0){s=0}if(!s){return}try{var a=i.g_SPM.getParam}catch(u){a=function(){return{a:0,b:0,c:0,d:0,e:0}}}var j=true;try{j=(self.location!=top.location)}catch(u){}var v=\"data-spm-act-id\";var h=[\"mclick.simba.taobao.com\",\"click.simba.taobao.com\",\"click.tanx.com\",\"click.mz.simba.taobao.com\",\"click.tz.simba.taobao.com\",\"redirect.simba.taobao.com\",\"rdstat.tanx.com\",\"stat.simba.taobao.com\",\"s.click.taobao.com\"];var c=!!x.attachEvent;var b=\"attachEvent\";var n=\"addEventListener\";var f=c?b:n;function r(y,z,e){y[f]((c?\"on\":\"\")+z,function(B){B=B||i.event;var A=B.target||B.srcElement;e(B,A)},false)}function p(){if(/&?\\bspm=[^&#]*/.test(location.href)){return location.href.match(/&?\\bspm=[^&#]*/ig)[0].split(\"=\")[1]}return\"\"}function w(z,F){if(z&&/&?\\bspm=[^&#]*/.test(z)){z=z.replace(/&?\\bspm=[^&#]*/g,\"\").replace(/&{2,}/g,\"&\").replace(/\\?&/,\"?\").replace(/\\?$/,\"\")}if(!F){return z}var G,C,E,D=\"&\",A,y,e,B;if(z.indexOf(\"#\")!=-1){E=z.split(\"#\");z=E.shift();C=E.join(\"#\")}A=z.split(\"?\");y=A.length-1;E=A[0].split(\"//\");E=E[E.length-1].split(\"/\");e=E.length>1?E.pop():\"\";if(y>0){G=A.pop();z=A.join(\"?\")}if(G&&y>1&&G.indexOf(\"&\")==-1&&G.indexOf(\"%\")!=-1){D=\"%26\"}z=z+\"?spm=\"+F+(G?(D+G):\"\")+(C?(\"#\"+C):\"\");B=e.indexOf(\".\")>-1?e.split(\".\").pop().toLowerCase():\"\";if(B){if(({png:1,jpg:1,jpeg:1,gif:1,bmp:1,swf:1}).hasOwnProperty(B)){return 0}if(!G&&y<=1){if(!C&&!({htm:1,html:1,php:1}).hasOwnProperty(B)){z+=\"&file=\"+e}}}return z}function d(z){var E=window.location.href;var y=E.match(/mm_\\d{0,24}_\\d{0,24}_\\d{0,24}/i);var C=E.match(/[&\\?](pvid=[^&]*)/i);var A=new RegExp(\"%3Dmm_\\\\d+_\\\\d+_\\\\d+\",\"ig\");var B=new RegExp(\"mm_\\\\d+_\\\\d+_\\\\d+\",\"ig\");function D(F){F=F.replace(/refpos[=(%3D)]\\w*/ig,e).replace(A,\"%3D\"+y+\"%26\"+C.replace(\"=\",\"%3D\")).replace(B,y);if(C.length>0){F+=\"&\"+C}return F}if(C&&C[1]){C=C[1]}else{C=\"\"}var e=E.match(/(refpos=(\\d{0,24}_\\d{0,24}_\\d{0,24})?(,[a-z]+)?)(,[a-z]+)?/i);if(e&&e[0]){e=e[0]}else{e=\"\"}if(y){y=y[0];return D(z)}return z}function l(e){var y=i.KISSY;if(y){y.ready(e)}else{if(i.jQuery){jQuery(x).ready(e)}else{if(x.readyState===\"complete\"){e()}else{r(i,\"load\",e)}}}}function t(e,y){return e&&e.getAttribute?(e.getAttribute(y)||\"\"):\"\"}function q(y){if(!y){return}var z,e=h.length;for(z=0;z<e;z++){if(y.indexOf(h[z])>-1){return true}}return false}function g(z,F){if(z&&/&?\\bspm=[^&#]*/.test(z)){z=z.replace(/&?\\bspm=[^&#]*/g,\"\").replace(/&{2,}/g,\"&\").replace(/\\?&/,\"?\").replace(/\\?$/,\"\")}if(!F){return z}var G,C,E,D=\"&\",A,y,e,B;if(z.indexOf(\"#\")!=-1){E=z.split(\"#\");z=E.shift();C=E.join(\"#\")}A=z.split(\"?\");y=A.length-1;E=A[0].split(\"//\");E=E[E.length-1].split(\"/\");e=E.length>1?E.pop():\"\";if(y>0){G=A.pop();z=A.join(\"?\")}if(G&&y>1&&G.indexOf(\"&\")==-1&&G.indexOf(\"%\")!=-1){D=\"%26\"}z=z+\"?spm=\"+F+(G?(D+G):\"\")+(C?(\"#\"+C):\"\");B=e.indexOf(\".\")>-1?e.split(\".\").pop().toLowerCase():\"\";if(B){if(({png:1,jpg:1,jpeg:1,gif:1,bmp:1,swf:1}).hasOwnProperty(B)){return 0}if(!G&&y<=1){if(!C&&!({htm:1,html:1,php:1}).hasOwnProperty(B)){z+=\"&__file=\"+e}}}return z}function k(y){if(q(y.href)){var z=t(y,v);if(!z){if(!a){return}var A=a(y),B=[A.a,A.b,A.c,A.d,A.e].join(\".\");if(j){B=[A.a||\"0\",A.b||\"0\",A.c||\"0\",A.d||\"0\"].join(\".\");B=(p()||\"0.0.0.0.0\")+\"_\"+B}var e=g(y.href,B);y.href=e;y.setAttribute(v,B)}}y=undefined}r(x,\"mousedown\",function(A,z){var B,y=0;while(z&&(B=z.tagName)&&y<5){if(B==\"A\"||B==\"AREA\"){k(z);break}else{if(B==\"BODY\"||B==\"HTML\"){break}}z=z.parentNode;y++}});l(function(){var B=document.getElementsByTagName(\"iframe\");var C,e;for(var A=0;A<B.length;A++){C=t(B[A],\"mmsrc\");e=t(B[A],\"mmworked\");var z=a(B[A]);var y=[z.a||\"0\",z.b||\"0\",z.c||\"0\",z.d||\"0\",z.e||\"0\"].join(\".\");if(C&&!e){if(j){y=[z.a||\"0\",z.b||\"0\",z.c||\"0\",z.d||\"0\"].join(\".\");y=p()+\"_\"+y}B[A].src=w(d(C),y);B[A].setAttribute(\"mmworked\",\"mmworked\")}else{B[A].setAttribute(v,y)}}})})();"
  },
  {
    "path": "works/demo/ali/file/sizzle.js",
    "content": "!function(a,b){function c(a,b,c,d){for(var e=0,f=b.length;f>e;e++)eb(a,b[e],c,d)}function d(a,b,d,e,f,g){var h,i=fb.setFilters[b.toLowerCase()];return i||eb.error(b),(a||!(h=f))&&c(a||\"*\",e,h=[],f),h.length>0?i(h,d,g):[]}function e(a,e,f,g,h){for(var i,j,k,l,m,n,o,p,q=0,r=h.length,s=S.POS,t=new RegExp(\"^\"+s.source+\"(?!\"+y+\")\",\"i\"),u=function(){for(var a=1,c=arguments.length-2;c>a;a++)arguments[a]===b&&(i[a]=b)};r>q;q++){for(s.exec(\"\"),a=h[q],l=[],k=0,m=g;i=s.exec(a);)p=s.lastIndex=i.index+i[0].length,p>k&&(o=a.slice(k,i.index),k=p,n=[e],I.test(o)&&(m&&(n=m),m=g),(j=O.test(o))&&(o=o.slice(0,-5).replace(I,\"$&*\")),i.length>1&&i[0].replace(t,u),m=d(o,i[1],i[2],n,m,j));m?(l=l.concat(m),(o=a.slice(k))&&\")\"!==o?c(o,l,f,g):w.apply(f,l)):eb(a,e,f,g)}return 1===r?f:eb.uniqueSort(f)}function f(a,b,c){for(var d,e,f,g=[],h=0,i=K.exec(a),j=!i.pop()&&!i.pop(),k=j&&a.match(J)||[\"\"],l=fb.preFilter,m=fb.filter,n=!c&&b!==p;null!=(e=k[h])&&j;h++)for(g.push(d=[]),n&&(e=\" \"+e);e;){j=!1,(i=I.exec(e))&&(e=e.slice(i[0].length),j=d.push({part:i.pop().replace(H,\" \"),captures:i}));for(f in m)!(i=S[f].exec(e))||l[f]&&!(i=l[f](i,b,c))||(e=e.slice(i.shift().length),j=d.push({part:f,captures:i}));if(!j)break}return j||eb.error(a),g}function g(a,b,c){var d=b.dir,e=u++;return a||(a=function(a){return a===c}),b.first?function(b,c){for(;b=b[d];)if(1===b.nodeType)return a(b,c)&&b}:function(b,c){for(var f,g=e+\".\"+l,h=g+\".\"+k;b=b[d];)if(1===b.nodeType){if((f=b[x])===h)return!1;if(\"string\"==typeof f&&0===f.indexOf(g)){if(b.sizset)return b}else{if(b[x]=h,a(b,c))return b.sizset=!0,b;b.sizset=!1}}}}function h(a,b){return a?function(c,d){var e=b(c,d);return e&&a(e===!0?c:e,d)}:b}function i(a,b,c){for(var d,e,f=0;d=a[f];f++)fb.relative[d.part]?e=g(e,fb.relative[d.part],b):(d.captures.push(b,c),e=h(e,fb.filter[d.part].apply(null,d.captures)));return e}function j(a){return function(b,c){for(var d,e=0;d=a[e];e++)if(d(b,c))return!0;return!1}}var k,l,m,n,o,p=a.document,q=p.documentElement,r=\"undefined\",s=!1,t=!0,u=0,v=[].slice,w=[].push,x=(\"sizcache\"+Math.random()).replace(\".\",\"\"),y=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",z=\"(?:\\\\\\\\.|[-\\\\w]|[^\\\\x00-\\\\xa0])\",A=\"(?:[\\\\w#_-]|[^\\\\x00-\\\\xa0]|\\\\\\\\.)\",B=\"([*^$|!~]?=)\",C=\"\\\\[\"+y+\"*(\"+z+\"+)\"+y+\"*(?:\"+B+y+\"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\"+A+\"+)|)|)\"+y+\"*\\\\]\",D=\":(\"+z+\"+)(?:\\\\((?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\2|(.*))\\\\)|)\",E=\":(nth|eq|gt|lt|first|last|even|odd)(?:\\\\((\\\\d*)\\\\)|)(?=[^-]|$)\",F=y+\"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\"+y+\"*\",G=\"(?=[^\\\\x20\\\\t\\\\r\\\\n\\\\f])(?:\\\\\\\\.|\"+C+\"|\"+D.replace(2,7)+\"|[^\\\\\\\\(),])+\",H=new RegExp(\"^\"+y+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+y+\"+$\",\"g\"),I=new RegExp(\"^\"+F),J=new RegExp(G+\"?(?=\"+y+\"*,|$)\",\"g\"),K=new RegExp(\"^(?:(?!,)(?:(?:^|,)\"+y+\"*\"+G+\")*?|\"+y+\"*(.*?))(\\\\)|$)\"),L=new RegExp(G.slice(19,-6)+\"\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])+|\"+F,\"g\"),M=/^(?:#([\\w\\-]+)|(\\w+)|\\.([\\w\\-]+))$/,N=/[\\x20\\t\\r\\n\\f]*[+~]/,O=/:not\\($/,P=/h\\d/i,Q=/input|select|textarea|button/i,R=/\\\\(?!\\\\)/g,S={ID:new RegExp(\"^#(\"+z+\"+)\"),CLASS:new RegExp(\"^\\\\.(\"+z+\"+)\"),NAME:new RegExp(\"^\\\\[name=['\\\"]?(\"+z+\"+)['\\\"]?\\\\]\"),TAG:new RegExp(\"^(\"+z.replace(\"[-\",\"[-\\\\*\")+\"+)\"),ATTR:new RegExp(\"^\"+C),PSEUDO:new RegExp(\"^\"+D),CHILD:new RegExp(\"^:(only|nth|last|first)-child(?:\\\\(\"+y+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+y+\"*(?:([+-]|)\"+y+\"*(\\\\d+)|))\"+y+\"*\\\\)|)\",\"i\"),POS:new RegExp(E,\"ig\"),needsContext:new RegExp(\"^\"+y+\"*[>+~]|\"+E,\"i\")},T={},U=[],V={},W=[],X=function(a){return a.sizzleFilter=!0,a},Y=function(a){return function(b){return\"input\"===b.nodeName.toLowerCase()&&b.type===a}},Z=function(a){return function(b){var c=b.nodeName.toLowerCase();return(\"input\"===c||\"button\"===c)&&b.type===a}},$=function(a){var b=!1,c=p.createElement(\"div\");try{b=a(c)}catch(d){}return c=null,b},_=$(function(a){a.innerHTML=\"<select></select>\";var b=typeof a.lastChild.getAttribute(\"multiple\");return\"boolean\"!==b&&\"string\"!==b}),ab=$(function(a){a.id=x+0,a.innerHTML=\"<a name='\"+x+\"'></a><div name='\"+x+\"'></div>\",q.insertBefore(a,q.firstChild);var b=p.getElementsByName&&p.getElementsByName(x).length===2+p.getElementsByName(x+0).length;return o=!p.getElementById(x),q.removeChild(a),b}),bb=$(function(a){return a.appendChild(p.createComment(\"\")),0===a.getElementsByTagName(\"*\").length}),cb=$(function(a){return a.innerHTML=\"<a href='#'></a>\",a.firstChild&&typeof a.firstChild.getAttribute!==r&&\"#\"===a.firstChild.getAttribute(\"href\")}),db=$(function(a){return a.innerHTML=\"<div class='hidden e'></div><div class='hidden'></div>\",a.getElementsByClassName&&0!==a.getElementsByClassName(\"e\").length?(a.lastChild.className=\"e\",1!==a.getElementsByClassName(\"e\").length):!1}),eb=function(a,b,c,d){c=c||[],b=b||p;var e,f,g,h,i=b.nodeType;if(1!==i&&9!==i)return[];if(!a||\"string\"!=typeof a)return c;if(g=hb(b),!g&&!d&&(e=M.exec(a)))if(h=e[1]){if(9===i){if(f=b.getElementById(h),!f||!f.parentNode)return c;if(f.id===h)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(h))&&ib(b,f)&&f.id===h)return c.push(f),c}else{if(e[2])return w.apply(c,v.call(b.getElementsByTagName(a),0)),c;if((h=e[3])&&db&&b.getElementsByClassName)return w.apply(c,v.call(b.getElementsByClassName(h),0)),c}return lb(a,b,c,d,g)},fb=eb.selectors={cacheLength:50,match:S,order:[\"ID\",\"TAG\"],attrHandle:{},createPseudo:X,find:{ID:o?function(a,b,c){if(typeof b.getElementById!==r&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==r&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==r&&e.getAttributeNode(\"id\").value===a?[e]:b:[]}},TAG:bb?function(a,b){return typeof b.getElementsByTagName!==r?b.getElementsByTagName(a):void 0}:function(a,b){var c=b.getElementsByTagName(a);if(\"*\"===a){for(var d,e=[],f=0;d=c[f];f++)1===d.nodeType&&e.push(d);return e}return c}},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(R,\"\"),a[3]=(a[4]||a[5]||\"\").replace(R,\"\"),\"~=\"===a[2]&&(a[3]=\" \"+a[3]+\" \"),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),\"nth\"===a[1]?(a[2]||eb.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(\"even\"===a[2]||\"odd\"===a[2])),a[4]=+(a[6]+a[7]||\"odd\"===a[2])):a[2]&&eb.error(a[0]),a},PSEUDO:function(a){var b,c=a[4];return S.CHILD.test(a[0])?null:(c&&(b=K.exec(c))&&b.pop()&&(a[0]=a[0].slice(0,b[0].length-c.length-1),c=b[0].slice(0,-1)),a.splice(2,3,c||a[3]),a)}},filter:{ID:o?function(a){return a=a.replace(R,\"\"),function(b){return b.getAttribute(\"id\")===a}}:function(a){return a=a.replace(R,\"\"),function(b){var c=typeof b.getAttributeNode!==r&&b.getAttributeNode(\"id\");return c&&c.value===a}},TAG:function(a){return\"*\"===a?function(){return!0}:(a=a.replace(R,\"\").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=T[a];return b||(b=T[a]=new RegExp(\"(^|\"+y+\")\"+a+\"(\"+y+\"|$)\"),U.push(a),U.length>fb.cacheLength&&delete T[U.shift()]),function(a){return b.test(a.className||typeof a.getAttribute!==r&&a.getAttribute(\"class\")||\"\")}},ATTR:function(a,b,c){return b?function(d){var e=eb.attr(d,a),f=e+\"\";if(null==e)return\"!=\"===b;switch(b){case\"=\":return f===c;case\"!=\":return f!==c;case\"^=\":return c&&0===f.indexOf(c);case\"*=\":return c&&f.indexOf(c)>-1;case\"$=\":return c&&f.substr(f.length-c.length)===c;case\"~=\":return(\" \"+f+\" \").indexOf(c)>-1;case\"|=\":return f===c||f.substr(0,c.length+1)===c+\"-\"}}:function(b){return null!=eb.attr(b,a)}},CHILD:function(a,b,c,d){if(\"nth\"===a){var e=u++;return function(a){var b,f,g=0,h=a;if(1===c&&0===d)return!0;if(b=a.parentNode,b&&(b[x]!==e||!a.sizset)){for(h=b.firstChild;h&&(1!==h.nodeType||(h.sizset=++g,h!==a));h=h.nextSibling);b[x]=e}return f=a.sizset-d,0===c?0===f:f%c===0&&f/c>=0}}return function(b){var c=b;switch(a){case\"only\":case\"first\":for(;c=c.previousSibling;)if(1===c.nodeType)return!1;if(\"first\"===a)return!0;c=b;case\"last\":for(;c=c.nextSibling;)if(1===c.nodeType)return!1;return!0}}},PSEUDO:function(a,b,c,d){var e=fb.pseudos[a]||fb.pseudos[a.toLowerCase()];return e||eb.error(\"unsupported pseudo: \"+a),e.sizzleFilter?e(b,c,d):e}},pseudos:{not:X(function(a,b,c){var d=kb(a.replace(H,\"$1\"),b,c);return function(a){return!d(a)}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&!!a.checked||\"option\"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},contains:X(function(a){return function(b){return(b.textContent||b.innerText||jb(b)).indexOf(a)>-1}}),has:X(function(a){return function(b){return eb(a,b).length>0}}),header:function(a){return P.test(a.nodeName)},text:function(a){var b,c;return\"input\"===a.nodeName.toLowerCase()&&\"text\"===(b=a.type)&&(null==(c=a.getAttribute(\"type\"))||c.toLowerCase()===b)},radio:Y(\"radio\"),checkbox:Y(\"checkbox\"),file:Y(\"file\"),password:Y(\"password\"),image:Y(\"image\"),submit:Z(\"submit\"),reset:Z(\"reset\"),button:function(a){var b=a.nodeName.toLowerCase();return\"input\"===b&&\"button\"===a.type||\"button\"===b},input:function(a){return Q.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return!(a!==b.activeElement||b.hasFocus&&!b.hasFocus()||!a.type&&!a.href)},active:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b,c){return c?a.slice(1):[a[0]]},last:function(a,b,c){var d=a.pop();return c?a:[d]},even:function(a,b,c){for(var d=[],e=c?1:0,f=a.length;f>e;e+=2)d.push(a[e]);return d},odd:function(a,b,c){for(var d=[],e=c?0:1,f=a.length;f>e;e+=2)d.push(a[e]);return d},lt:function(a,b,c){return c?a.slice(+b):a.slice(0,+b)},gt:function(a,b,c){return c?a.slice(0,+b+1):a.slice(+b+1)},eq:function(a,b,c){var d=a.splice(+b,1);return c?a:d}}};fb.setFilters.nth=fb.setFilters.eq,fb.filters=fb.pseudos,cb||(fb.attrHandle={href:function(a){return a.getAttribute(\"href\",2)},type:function(a){return a.getAttribute(\"type\")}}),ab&&(fb.order.push(\"NAME\"),fb.find.NAME=function(a,b){return typeof b.getElementsByName!==r?b.getElementsByName(a):void 0}),db&&(fb.order.splice(1,0,\"CLASS\"),fb.find.CLASS=function(a,b,c){return typeof b.getElementsByClassName===r||c?void 0:b.getElementsByClassName(a)});try{v.call(q.childNodes,0)[0].nodeType}catch(gb){v=function(a){for(var b,c=[];b=this[a];a++)c.push(b);return c}}var hb=eb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?\"HTML\"!==b.nodeName:!1},ib=eb.contains=q.compareDocumentPosition?function(a,b){return!!(16&a.compareDocumentPosition(b))}:q.contains?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b.parentNode;return a===d||!!(d&&1===d.nodeType&&c.contains&&c.contains(d))}:function(a,b){for(;b=b.parentNode;)if(b===a)return!0;return!1},jb=eb.getText=function(a){var b,c=\"\",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if(\"string\"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=jb(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d];d++)c+=jb(b);return c};eb.attr=function(a,b){var c,d=hb(a);return d||(b=b.toLowerCase()),fb.attrHandle[b]?fb.attrHandle[b](a):_||d?a.getAttribute(b):(c=a.getAttributeNode(b),c?\"boolean\"==typeof a[b]?a[b]?b:null:c.specified?c.value:null:null)},eb.error=function(a){throw new Error(\"Syntax error, unrecognized expression: \"+a)},[0,0].sort(function(){return t=0}),q.compareDocumentPosition?m=function(a,b){return a===b?(s=!0,0):(a.compareDocumentPosition&&b.compareDocumentPosition?4&a.compareDocumentPosition(b):a.compareDocumentPosition)?-1:1}:(m=function(a,b){if(a===b)return s=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return n(a,b);if(!g)return-1;if(!h)return 1;for(;i;)e.unshift(i),i=i.parentNode;for(i=h;i;)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;c>j&&d>j;j++)if(e[j]!==f[j])return n(e[j],f[j]);return j===c?n(a,f[j],-1):n(e[j],b,1)},n=function(a,b,c){if(a===b)return c;for(var d=a.nextSibling;d;){if(d===b)return-1;d=d.nextSibling}return 1}),eb.uniqueSort=function(a){var b,c=1;if(m&&(s=t,a.sort(m),s))for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a};var kb=eb.compile=function(a,b,c){var d,e,g,h=V[a];if(h&&h.context===b)return h.dirruns++,h;for(e=f(a,b,c),g=0;d=e[g];g++)e[g]=i(d,b,c);return h=V[a]=j(e),h.context=b,h.runs=h.dirruns=0,W.push(a),W.length>fb.cacheLength&&delete V[W.shift()],h};eb.matches=function(a,b){return eb(a,null,null,b)},eb.matchesSelector=function(a,b){return eb(b,null,null,[a]).length>0};var lb=function(a,b,c,d,f){a=a.replace(H,\"$1\");var g,h,i,j,m,n,o,p,q,r=a.match(J),s=a.match(L),t=b.nodeType;if(S.POS.test(a))return e(a,b,c,d,r);if(d)g=v.call(d,0);else if(r&&1===r.length){if(s.length>1&&9===t&&!f&&(r=S.ID.exec(s[0]))){if(b=fb.find.ID(r[1],b,f)[0],!b)return c;a=a.slice(s.shift().length)}for(p=(r=N.exec(s[0]))&&!r.index&&b.parentNode||b,q=s.pop(),n=q.split(\":not\")[0],i=0,j=fb.order.length;j>i;i++)if(o=fb.order[i],r=S[o].exec(n)){if(g=fb.find[o]((r[1]||\"\").replace(R,\"\"),p,f),null==g)continue;n===q&&(a=a.slice(0,a.length-q.length)+n.replace(S[o],\"\"),a||w.apply(c,v.call(g,0)));break}}if(a)for(h=kb(a,b,f),l=h.dirruns,null==g&&(g=fb.find.TAG(\"*\",N.test(a)&&b.parentNode||b)),i=0;m=g[i];i++)k=h.runs++,h(m,b)&&c.push(m);return c};p.querySelectorAll&&!function(){var a,b=lb,c=/'|\\\\/g,d=/\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,e=[],f=[\":active\"],g=q.matchesSelector||q.mozMatchesSelector||q.webkitMatchesSelector||q.oMatchesSelector||q.msMatchesSelector;$(function(a){a.innerHTML=\"<select><option selected></option></select>\",a.querySelectorAll(\"[selected]\").length||e.push(\"\\\\[\"+y+\"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\"),a.querySelectorAll(\":checked\").length||e.push(\":checked\")}),$(function(a){a.innerHTML=\"<p test=''></p>\",a.querySelectorAll(\"[test^='']\").length&&e.push(\"[*^$]=\"+y+\"*(?:\\\"\\\"|'')\"),a.innerHTML=\"<input type='hidden'>\",a.querySelectorAll(\":enabled\").length||e.push(\":enabled\",\":disabled\")}),e=e.length&&new RegExp(e.join(\"|\")),lb=function(a,d,f,g,h){if(!(g||h||e&&e.test(a)))if(9===d.nodeType)try{return w.apply(f,v.call(d.querySelectorAll(a),0)),f}catch(i){}else if(1===d.nodeType&&\"object\"!==d.nodeName.toLowerCase()){var j=d.getAttribute(\"id\"),k=j||x,l=N.test(a)&&d.parentNode||d;j?k=k.replace(c,\"\\\\$&\"):d.setAttribute(\"id\",k);try{return w.apply(f,v.call(l.querySelectorAll(a.replace(J,\"[id='\"+k+\"'] $&\")),0)),f}catch(i){}finally{j||d.removeAttribute(\"id\")}}return b(a,d,f,g,h)},g&&($(function(b){a=g.call(b,\"div\");try{g.call(b,\"[test!='']:sizzle\"),f.push(fb.match.PSEUDO)}catch(c){}}),f=new RegExp(f.join(\"|\")),eb.matchesSelector=function(b,c){if(c=c.replace(d,\"='$1']\"),!(hb(b)||f.test(c)||e&&e.test(c)))try{var h=g.call(b,c);if(h||a||b.document&&11!==b.document.nodeType)return h}catch(i){}return eb(c,null,null,[b]).length>0})}(),\"function\"==typeof define&&define.amd?define(function(){return eb}):a.Sizzle=eb}(window);"
  },
  {
    "path": "works/demo/ali/file/swap_view.js",
    "content": "\"undefined\"==typeof AC&&(AC={}),\"undefined\"==typeof document.event&&(document.event={}),Event.Publisher&&Object.extend(document.event,Event.Publisher),AC.SwapView=Class.create({_view:null,currentContent:null,delegate:null,initialize:function(a){\"string\"==typeof a?this._viewId=a:(this._view=$(a),this._resetView())},view:function(){return this._view||(this._view=$(this._viewId),this._resetView()),this._view},_resetView:function(){if(this._view){for(var a,b=this._view.childNodes;a=b[0];)this._view.removeChild(a);this._view.addClassName(\"swapView\")}},setDelegate:function(a){this.delegate=a},setContent:function(a){return a!==this.currentContent?(this.currentContent&&\"function\"==typeof this.delegate.willClose&&this.delegate.willClose(this,this.currentContent),a&&\"function\"==typeof this.delegate.isContentLoaded&&!this.delegate.isContentLoaded(this,a)&&\"function\"==typeof this.delegate.loadContent?void this.delegate.loadContent(this,a):void this.setLoadedContent(a)):void 0},setLoadedContent:function(a){\"function\"==typeof this.delegate.willShow&&(a=this.delegate.willShow(this,this.currentContent,a));var b,c=!0;\"function\"==typeof this.delegate.shouldAnimateContentChange&&(c=this.delegate.shouldAnimateContentChange(this,this.currentContent,a)),c&&\"function\"==typeof this.delegate.willAnimate?(this.didAnimate=!0,this.view()&&a&&this.currentContent!==a&&this.view().appendChild(a),\"function\"==typeof this.delegate.didAppendContent&&this.delegate.didAppendContent(this,a),b=this.delegate.willAnimate(this,this.currentContent,a,this.didShow.bind(this,a))):(this.didAnimate=!1,this.currentContent!==a&&(this.currentContent&&this.currentContent.parentNode&&this.currentContent.parentNode.removeChild(this.currentContent),a&&this.view().appendChild(a),\"function\"==typeof this.delegate.didAppendContent&&this.delegate.didAppendContent(this,a)),a&&$(a).setOpacity(1),this.didShow(a))},didShow:function(a){this.currentContent&&this.currentContent!==a&&this.currentContent.parentNode&&this.currentContent.parentNode.removeChild(this.currentContent),\"function\"==typeof this.delegate.didShow&&this.delegate.didShow(this,this.currentContent,a),this.currentContent=a}}),\"undefined\"==typeof AC.ViewMaster&&(AC.ViewMaster={}),AC.ViewMaster.Viewer=Class.create({view:null,triggerClassName:null,currentSection:null,requestedSection:null,sections:null,orderedSections:null,_locked:!1,_didShowInitial:!1,options:null,initialize:function(a,b,c,d){c&&(this.triggerClassName=c),this.sections=$H(),this.orderedSections=[],this.options=d||{},this.silentPreviousSelection(this.options.silentPreviousSelection),this.silentFirstSection(this.options.silentFirstSection),this.triggerEvent=this.options.triggerEvent||\"click\";var e,f,g=null;if(a)for(f=0;f<a.length;f++)e=this.addSection(a.item(f)),g||(g=e);this.view=new AC.SwapView(b),this.view.setDelegate(this);var h,i,j=document.location.hash;if(this.sectionRegExp=this.options.sectionRegExp||new RegExp(/#(.*)$/),i=j.match(this.sectionRegExp),i&&i[1]&&(j=i[1]),j!==this.view._viewId){var k,l=document.getElementsByClassName(this.triggerClassName);for(f=0,k;k=l[f];f++)if(k.getAttribute(\"href\").match(new RegExp(\"#\"+j+\"(?![_w-])\"))){h=this.sectionWithId(j),h&&(g=h);break}}if(!h&&\"string\"==typeof this.options.initialId&&this.options.initialId.length>0&&(g=this.sectionWithId(this.options.initialId)),this.show(g),this._boundTriggerClicked=this._triggerClicked.bindAsEventListener(this),\"object\"==typeof this.triggerEvent)for(var m,f=0;m=this.triggerEvent[f];f++)Event.observe(document,m,this._boundTriggerClicked);else Event.observe(document,this.triggerEvent,this._boundTriggerClicked);AC.Detector.isIEStrict()&&Event.observe(document,\"mouseup\",this._boundTriggerClicked),this.options.alwaysUseKeyboardNav===!0&&(this.options.useKeyboardNav=!0),(this.options.useKeyboardNav===!0||this.options.escapeToClose===!0)&&(this._boundKeyDown=this._keyDown.bindAsEventListener(this),Event.observe(document,\"keydown\",this._boundKeyDown)),this.__addEventListeners()},__addEventListeners:function(){if(\"function\"==typeof this.listenForEvent){var a=function(a){this.stopMovieIfItsPlaying(a)}.bind(this);this.selectSectionFromEventHandler=this.selectSectionFromEvent.bind(this),this.listenForEvent(AC.ViewMaster,\"ViewMasterSelectSectionWithIdNotification\",!0,this.selectSectionFromEventHandler),this.listenForEvent(AC.ViewMaster,\"ViewMasterWillShowNotification\",!0,a),this.listenForEvent(document.event,\"replayMovie\",!1,this.stopMovieIfItsPlaying.bind(this)),this.options.parentSectionId&&this.listenForEvent(AC.ViewMaster,\"ViewMasterWillCloseNotification\",!1,function(a){var b=a.event_data.data;this!==b.sender&&b.outgoingView&&b.outgoingView.id===this.options.parentSectionId&&this.willClose(this.view,this.currentSection)})}},initialSectionFromId:function(a){return this.sectionWithId(a)},sectionWithId:function(a){if(!a)return null;var b=null;if(a&&this.sections.get(a)&&(b=this.sections.get(a)),b)return b;var c,d=null;return c=document.getElementById(a),c===this.view._view&&(c=null),c||(c=document.body.down(\"a.\"+this.triggerClassName+\"[href*=#\"+a+\"]\")),c||(d=document.getElementsByName(a),d&&d.length>0&&(c=d[0]),c===this.view._view&&(c=null)),c&&(\"a\"===c.tagName.toLowerCase()?Element.hasClassName(c,this.triggerClassName)&&(b=this.addSection(c)):b=this.addSection(c)),b},indexOfSection:function(a){return this.orderedSections.indexOf(a.id)},selectSectionFromEvent:function(a){a.event_data.data.sender!==this&&a.event_data.data.parentTriggerClassName===this.triggerClassName&&this.selectSectionWithIdEvent(a.event_data.data.parentSectionId,a.event_data.data.event)},selectSectionWithIdEvent:function(a,b){var c,d,e=this.sectionWithId(a),f=null,g=!1;if(e){if(f=e.triggers(),f&&f.length>0)for(c=0;d=f[c];c++)if(Element.Methods.hasClassName(d,this.triggerClassName)){g=!0;break}g||(d=document.createElement(\"a\"),d.className=this.triggerClassName,d.href=\"#\"+a,d.style.display=\"none\",document.body.appendChild(d),e._triggers.push(d)),this.triggerClicked(b,$(d))}},setDelegate:function(a){this.delegate=a,this.delegate&&\"function\"==typeof this.delegate.didShow&&this.currentSection&&this.currentSection.isContentLoaded()&&this.delegate.didShow(this,this.previousSection,this.currentSection)},createSectionForContent:function(a){return new AC.ViewMaster.Section(a,this)},addSection:function(a){var b=this.createSectionForContent(a);return this.sections.set(b.id,b),this.orderedSections.push(b.id),b},silentPreviousSelection:function(a){return\"boolean\"==typeof a&&(this._silentPreviousSelection=a),this._silentPreviousSelection},silentFirstSection:function(a){return\"boolean\"==typeof a&&(this._silentFirstSection=a),this._silentFirstSection},currentTrigger:function(){return this._currentTrigger},triggerClicked:function(a,b){b.addClassName(\"active\"),this._currentTrigger=b,a&&this.options.silentTriggers&&Event.stop(a);var c,d=null;if(b.href.match(/#previous/)){if(d=this.getPreviousSection(),!d)return}else if(b.href.match(/#next/)){if(d=this.getNextSection(),!d)return}else{var e=b.href.match(this.sectionRegExp);c=e?e[1]:b.name,d=this.sections.get(c)}return d||(d=this.addSection(b)),d.isContentRemote()&&(d.isContentLoaded()&&b.href.match(/#previous/)&&b.href.match(/#next/)&&d.clearTrigger(b),a&&Event.stop(a)),d===this.currentSection?(a&&Event.stop(a),void(\"function\"==typeof AC.ViewMaster.dispatchEvent&&AC.ViewMaster.dispatchEvent(\"ViewMasterDidShowNotification\",{sender:this,outgoingView:this.previousSection,incomingView:this.currentSection,trigger:b}))):void(d&&setTimeout(this.show.bind(this,d),1))},_triggerClicked:function(a){if(!this.options.passive){var b=a.element();if(AC.Detector.isIEStrict()&&\"mouseup\"===a.type)b&&\"A\"===b.nodeName.toUpperCase()&&(b=b.down(\".\"+this.triggerClassName));else for(;b&&\"A\"!==b.nodeName.toUpperCase()&&\"BODY\"!==b.nodeName.toUpperCase();)b=b.parentNode;if(this._silentPreviousSelection!==!0&&this._silentFirstSection!==!0&&!this._locked&&b&&b.href&&((previousSelection=b.href.toString().match(/SwapViewPreviousSelection$/))||b.href.toString().match(/SwapViewFirstSection$/))&&(b=$(b),b.hasClassName(this.triggerClassName)||b.descendantOf(this.view.view())))return Event.stop(a),void(previousSelection?this.showPreviousSelection():this.showFirst());if(b&&b.href&&Element.Methods.hasClassName(b,this.triggerClassName)){if(this._locked)return void Event.stop(a);if(this.options.parentSectionId&&\"function\"==typeof this.stopListeningForEvent&&\"function\"==typeof this.listenForEvent&&\"function\"==typeof AC.ViewMaster.dispatchEvent){var c=this;Event.stop(a),this.stopListeningForEvent(AC.ViewMaster,\"ViewMasterSelectSectionWithIdNotification\",!0,this.selectSectionFromEventHandler),this.listenForEvent(AC.ViewMaster,\"ViewMasterDidShowNotification\",!1,function(a){this.stopListeningForEvent(AC.ViewMaster,\"ViewMasterDidShowNotification\",!1,arguments.callee),c.triggerClicked(a,b),this.listenForEvent(AC.ViewMaster,\"ViewMasterSelectSectionWithIdNotification\",!0,this.selectSectionFromEventHandler)}),AC.ViewMaster.dispatchEvent(\"ViewMasterSelectSectionWithIdNotification\",{sender:this,parentSectionId:this.options.parentSectionId,parentTriggerClassName:this.options.parentTriggerClassName,event:a,trigger:b})}else this.triggerClicked(a,b)}}},_keyDown:function(a){if(this._locked||a.keyCode===Event.KEY_ESC||a.keyCode===Event.KEY_LEFT||a.keyCode===Event.KEY_RIGHT){var b=a.target?a.target:a.srcElement,c=b.getAttribute(\"contenteditable\"),d=!0;if(null==c&&(d=!1),d&&c==document.body.getAttribute(\"contenteditable\")&&(d=!1),d&&\"false\"==c&&(d=!1),\"input\"!=b.tagName.toLowerCase()&&\"textarea\"!=b.tagName.toLowerCase()&&\"select\"!=b.tagName.toLowerCase()&&!d){var e=document.viewport.getScrollOffsets(),f=document.viewport.getHeight(),g=this.view.view(),h=g.getHeight(),i=g.cumulativeOffset()[1];if(this.options.alwaysUseKeyboardNav===!0||i>=e[1]&&Math.round(i+h/2)<e[1]+f){if(a.keyCode===Event.KEY_LEFT&&this.options.useKeyboardNav===!0){this._currentTrigger=\"arrow_left\",this.showPrevious();var j=\"previous\"}else if(a.keyCode===Event.KEY_RIGHT&&this.options.useKeyboardNav===!0){this._currentTrigger=\"arrow_right\",this.showNext();var j=\"next\"}else if(a.keyCode===Event.KEY_ESC&&this.options.escapeToClose===!0){this.currentSection.content.down('a[href=\"#SwapViewFirstSection\"]')?(a.stop(),this._currentTrigger=\"esc_key\",this.showFirst()):this.currentSection.content.down('a[href=\"#SwapViewPreviousSelection\"]')&&(a.stop(),this._currentTrigger=\"esc_key\",this.showPreviousSelection());var j=\"escape\"}void 0!==typeof j&&(this.view._view.fire(\"AC.ViewMaster.Viewer:usedKeyboardNav\",j),\"object\"==typeof this.__slideshow&&\"function\"==typeof this.__slideshow.userInteracted&&this.__slideshow.userInteracted())}}}},isContentLoaded:function(a,b){return b.isContentLoaded()},loadContent:function(a,b){b&&b.loadContent()},_showContentDidLoad:!1,contentDidLoad:function(a,b){b&&b.firstChild&&(this._showContentDidLoad=!0),this.view.setLoadedContent(a),AC.loadRemoteContent.insertScriptFragment(b),this.scrollSectionToVisible(a),this._showContentDidLoad&&this.delegate&&\"function\"==typeof this.delegate.didShow&&this.delegate.didShow(this,this.previousSection,this.currentSection),this._showContentDidLoad=!1},show:function(a,b){if(!this._locked&&(a||b)&&(this.options.alwaysShowSection||a!==this.currentSection)){if(this._locked=!0,this.delegate&&\"function\"==typeof this.delegate.willShowSection){var c=this.delegate.willShowSection(this,this.previousSection,a);c instanceof AC.ViewMaster.Section&&(a=c)}this.previousSection=this.currentSection,this.currentSection=a,this.disablePreviousNextIfNeeded(),this.scrollSectionToVisible(a),this.view.setContent(a)}},disablePreviousNextIfNeeded:function(){if(this.currentSection&&\"undefined\"!=typeof this.currentSection){var a=this.indexOfSection(this.currentSection),b=this.orderedSections.length-1,c=this.options.discontinuousPreviousNext;this.previousTriggers=this.previousTriggers?this.previousTriggers.concat($$(\".\"+this.triggerClassName+'[href=\"#previous\"]')).uniq():$$(\".\"+this.triggerClassName+'[href=\"#previous\"]'),this.previousTriggers.each(function(b){c===!0&&0===a?b.addClassName(\"disabled\"):b.removeClassName(\"disabled\")}),this.nextTriggers=this.nextTriggers?this.nextTriggers.concat($$(\".\"+this.triggerClassName+'[href=\"#next\"]')).uniq():$$(\".\"+this.triggerClassName+'[href=\"#next\"]'),this.nextTriggers.each(function(d){c===!0&&a===b?d.addClassName(\"disabled\"):d.removeClassName(\"disabled\")})}},scrollSectionToVisible:function(a){if(\"boolean\"==typeof this.options.ensureInView&&this.options.ensureInView){if(this._didShowInitial){if(a._isContentLoaded){var b=a.content.viewportOffset()[1];(0>b||b>.75*document.viewport.getHeight())&&new Effect.ScrollTo(a.content,{duration:.3})}}else $(document.body).scrollTo();return!0}return!1},__applyOptionHeightFromFirstSection:function(){if(1==this.options.heightFromFirstSection&&!this._heightSet){var a=this.sectionWithId(this.orderedSections[0]);a&&this.setHeightFromSection(a)}},setHeightFromSection:function(a){var b=a.heightOfContent();return b>0&&(this.view.view().style.height=b+\"px\",this._heightSet=!0),b},__zIndex:1001,__manageZ:function(a){if(this.options.manageZ===!0||\"number\"==typeof this.options.manageZ){var b,c,d,e,f=\"\";a!==!0&&(f=\"number\"==typeof this.options.manageZ?this.options.manageZ:this.__zIndex),(e=this.view.view())&&(f=a!==!0&&(b=parseInt(e.getAttribute(\"data-manage-z\")))&&isNaN(b)===!1?b:f,e.style.zIndex=f),this.previousSection&&this.previousSection.content&&(c=a!==!0&&(c=this.previousSection.getZIndexFromContent())?c:f,this.previousSection.content.style.zIndex=c),this.currentSection&&this.currentSection.content&&(d=a!==!0&&(d=this.currentSection.getZIndexFromContent())?d:f,this.currentSection.content.style.zIndex=d),this.delegate&&\"function\"==typeof this.delegate.manageZ&&this.delegate.manageZ(this,this.previousSection,this.currentSection,f,c,d)}},showFirst:function(){this.show(this.getFirstSection())},getFirstSection:function(){return this.sections.get(this.orderedSections[0])},showNext:function(){this.show(this.getNextSection())},getNextSection:function(){var a=this.indexOfSection(this.currentSection);if(this.options.discontinuousPreviousNext===!0&&a===this.orderedSections.length-1)return!1;var b=this.orderedSections.length-1===a?0:a+1;return this.sections.get(this.orderedSections[b])},showPrevious:function(){this.show(this.getPreviousSection())},getPreviousSection:function(){var a=this.indexOfSection(this.currentSection);if(this.options.discontinuousPreviousNext===!0&&0===a)return!1;var b=0===a?this.orderedSections.length-1:a-1;return this.sections.get(this.orderedSections[b])},showPreviousSelection:function(){this.show(this.getPreviousSelection())},getPreviousSelection:function(){if(this.previousSection)return this.previousSection;var a=this.orderedSections.length;for(i=0;a>i;i++)if(this.orderedSections[i]!=this.currentSection.id)return this.sections.get(this.orderedSections[i]);return!1},willShow:function(a,b,c){return this.delegate&&\"function\"==typeof this.delegate.willShow&&this.delegate.willShow(this,this.previousSection,this.currentSection),\"function\"==typeof AC.ViewMaster.dispatchEvent&&AC.ViewMaster.dispatchEvent(\"ViewMasterWillShowNotification\",{sender:this,outgoingView:this.previousSection,incomingView:this.currentSection}),this.__manageZ(!1),this._repaintTriggers(this.previousSection,this.currentSection),this._didShowInitial&&c&&c!=this.previousSection&&($(c.content).setOpacity(0),$(c.content).removeClassName(\"hidden\")),c?(this._addGalleryContentClassName(c.content),c.willShow(this)):null},willClose:function(a,b){this.delegate&&\"function\"==typeof this.delegate.willClose&&this.delegate.willClose(this,this.previousSection,this.currentSection),\"function\"==typeof AC.ViewMaster.dispatchEvent&&AC.ViewMaster.dispatchEvent(\"ViewMasterWillCloseNotification\",{sender:this,outgoingView:b}),this.previousSection&&this.previousSection.willClose(this)},shouldAnimateContentChange:function(){var a=!0;return a=this.delegate&&\"function\"==typeof this.delegate.shouldAnimateContentChange?this.delegate.shouldAnimateContentChange(this,this.previousSection,this.currentSection):\"boolean\"==typeof this.options.shouldAnimateContentChange?this.options.shouldAnimateContentChange:!0,\"boolean\"==typeof a?a:!0},willAnimate:function(a,b,c,d){var e=this.options.animationDuration||.4,f=Math.random()+\"Queue\";return this._didShowInitial||\"function\"!=typeof d?this.delegate&&\"function\"==typeof this.delegate.willAnimate?this.delegate.willAnimate(this,b,c,d,f,e):this.options.shouldAnimateOpacityAndHeight?this._animationPlusHeight(a,b,c,d,f,e):this._animation(a,b,c,d,f,e):void d()},_animation:function(a,b,c,d,e,f){var g=a.view(),h=this;g&&(g.style.position=\"relative\"),b&&(b.style.position=\"absolute\"),c&&(c.style.position=\"absolute\");var i=function(){g&&(g.style.position=\"\"),b&&(b.style.position=\"\"),c&&(c.style.position=\"\"),d()};if(!AC.Detector.isCSSAvailable(\"transition\"))return b&&h.options.shouldAnimateFadeIn!==!0?new Effect.Parallel([new Effect.Opacity(b,{sync:!0,from:1,to:0}),new Effect.Opacity(c,{sync:!0,from:0,to:1})],{duration:f,afterFinish:i,queue:{scope:e}}):new Effect.Opacity(c,{from:0,to:1,duration:f,afterFinish:i,queue:{scope:e}});c&&(c.setOpacity(0),c.setVendorPrefixStyle(\"transition\",\"opacity \"+f+\"s\")),b&&h.options.shouldAnimateFadeIn!==!0&&(b.setOpacity(1),b.setVendorPrefixStyle(\"transition\",\"opacity \"+f+\"s\")),window.setTimeout(function(){c&&c.setOpacity(1),b&&h.options.shouldAnimateFadeIn!==!0&&b.setOpacity(0)},100);var j=function(a){a.target==c&&\"opacity\"==a.propertyName&&(c.removeVendorEventListener(\"transitionEnd\",j,!1),i())};c&&c.addVendorEventListener(\"transitionEnd\",j,!1)},_animationPlusHeight:function(a,b,c,d,e,f){var g=a.view(),h=c.offsetHeight||1,i=g.offsetHeight||1,j=h/i*100;g&&(g.style.position=\"relative\"),b&&(b.style.position=\"absolute\"),c&&(c.style.position=\"absolute\");var k=function(){g&&(g.style.position=\"\"),b&&(b.style.position=\"\"),c&&(c.style.position=\"\"),d()};if(!AC.Detector.isCSSAvailable(\"transition\"))return b?new Effect.Parallel([new Effect.Opacity(b,{sync:!0,from:1,to:0}),new Effect.Opacity(c,{sync:!0,from:0,to:1}),new Effect.Scale(g,j,{scaleMode:{originalHeight:i,originalWidth:g.offsetWidth},sync:!0,scaleX:!1,scaleContent:!1})],{duration:f,afterFinish:k,queue:{scope:e}}):new Effect.Parallel([new Effect.Opacity(c,{sync:!0,from:0,to:1}),new Effect.Scale(g,j,{scaleMode:{originalHeight:i,originalWidth:g.offsetWidth},sync:!0,scaleX:!1,scaleContent:!1})],{duration:f,afterFinish:k,queue:{scope:e}});c.setOpacity(0),c.setVendorPrefixStyle(\"transition\",\"opacity \"+f+\"s\"),b&&b.setOpacity(0),window.setTimeout(function(){c.setOpacity(1)},100),AC.Detector.isiPad()||AC.Detector.isMobile()||g.setVendorPrefixStyle(\"transition\",\"height \"+f+\"s\"),g.style.height=h+\"px\";var l=function(a){a.target==c&&\"opacity\"==a.propertyName&&(c.removeVendorEventListener(\"transitionEnd\",l,!1),k())};c.addVendorEventListener(\"transitionEnd\",l,!1)},didAppendContent:function(a,b){this.delegate&&\"function\"==typeof this.delegate.didAppendContent&&this.delegate.didAppendContent(this,b),this.__applyOptionHeightFromFirstSection()},hideSwapViewLinks:function(a){var b=this.getPreviousSelection();if(!b||this._silentPreviousSelection===!0){var c=a.select('a[href$=\"SwapViewPreviousSelection\"]');if(c.length>0){this._previousSectionLinks||(this._previousSectionLinks=[]);for(var d=c.length-1;d>=0;d--)c[d].style.display=\"none\",this._previousSectionLinks.push(c[d])}}if(b&&this._silentPreviousSelection!==!0&&this._previousSectionLinks&&this._previousSectionLinks.length>0)for(var d=this._previousSectionLinks.length-1;d>=0;d--)this._previousSectionLinks[d].style.display=\"\",this._previousSectionLinks.splice(d,1);var b=this.getFirstSection();if(!b||b==this.currentSection||this._silentFirstSection===!0){var c=a.select('a[href$=\"SwapViewFirstSection\"]');if(c.length>0){this._firstSectionLinks||(this._firstSectionLinks=[]);for(var d=c.length-1;d>=0;d--)c[d].style.display=\"none\",this._firstSectionLinks.push(c[d])}}if(b&&b!==this.currentSection&&this._silentFirstSection!==!0&&this._firstSectionLinks&&this._firstSectionLinks.length>0)for(var d=this._firstSectionLinks.length-1;d>=0;d--)this._firstSectionLinks[d].style.display=\"\",this._firstSectionLinks.splice(d,1)},stopMovieIfItsPlaying:function(a){if(AC.ViewMaster.Viewer.allowMultipleVideos()!==!0){if(a.event_data.data.incomingView)var b=a.event_data.data.sender,c=a.event_data.data.incomingView,d=!1;else var b=this,c=a.event_data.data,d=!0;(b!=this||d)&&this.currentSection&&this.currentSection.hasMovie()&&c&&(\"function\"==typeof c.hasMovie&&c.hasMovie()||c.content&&c.content.getElementsByClassName(\"movieLink\")[0])&&(this.options.showPreviousOnStopMovie&&this.getPreviousSelection()?this.showPreviousSelection():this.options.showFirstOnStopMovie&&this.getFirstSection()?this.showFirst():this.currentSection.stopMovie())}},didShow:function(a,b,c){c&&(this._addGalleryContentClassName(c.content),this.hideSwapViewLinks(c)),this.__manageZ(!0),this.currentSection&&this.currentSection.didShow(this),this._didShowInitial=!0,this._locked=!1,this.options.shouldAnimateOpacityAndHeight&&window.setTimeout(function(){var b=a.view(),d=c.offsetHeight||0;b.style.height=d+\"px\"},35),!this._showContentDidLoad&&this.delegate&&\"function\"==typeof this.delegate.didShow&&this.delegate.didShow(this,this.previousSection,this.currentSection),\"function\"==typeof AC.ViewMaster.dispatchEvent&&AC.ViewMaster.dispatchEvent(\"ViewMasterDidShowNotification\",{sender:this,outgoingView:this.previousSection,incomingView:this.currentSection,trigger:this._currentTrigger})},_repaintTriggers:function(a,b){if(a){for(var c,d=a.triggers(),e=0;c=d[e];e++)c.removeClassName(\"active\");d=a.relatedElements();for(var c,e=0;c=d[e];e++)c.removeClassName(\"active\")}if(b){for(var c,f=b.triggers(),e=0;c=f[e];e++)c.addClassName(\"active\");f=b.relatedElements();for(var c,e=0;c=f[e];e++)c.addClassName(\"active\")}},_addGalleryContentClassName:function(a){this.options.addGalleryContentClassName===!0&&a&&Object.isElement(a)&&a.addClassName(\"gallery-content\")}}),AC.ViewMaster.Viewer.allowMultipleVideos=function(a){return\"boolean\"==typeof a&&(this._allowMultipleVideos=a),this._allowMultipleVideos},Event.Publisher&&Object.extend(AC.ViewMaster,Event.Publisher),Event.Listener&&Object.extend(AC.ViewMaster.Viewer.prototype,Event.Listener),AC.ViewMaster.Section=Class.create({content:null,moviePanel:null,controllerPanel:null,movie:null,_movieController:null,movieLink:null,endState:null,hasShown:!1,_isContentRemote:!1,isContentRemote:function(){return this._isContentRemote},_isContentLoaded:!0,isContentLoaded:function(){return this._isContentLoaded},_onMoviePlayable:Prototype.EmptyFunction,_onMovieFinished:Prototype.EmptyFunction,id:null,triggers:function(){if(!this._triggers){this._triggers=[];var a=new RegExp(\"#\"+this.id+\"$\");(this.viewMaster.sectionRegExp||this.viewMaster.options.sectionRegExp)&&(a=this.viewMaster.sectionRegExp||this.viewMaster.options.sectionRegExp,a=a.toString().replace(/^\\//,\"\").replace(/\\/$/,\"\"),a=new RegExp(a.replace(\"(.*)\",this.id)));for(var b,c=document.getElementsByClassName(this.viewMaster.triggerClassName),d=0;b=$(c[d]);d++)\"a\"===b.tagName.toLowerCase()&&b.href.match(a)&&this._triggers.push(b);for(var b,e=this.content.getElementsByClassName(this.viewMaster.triggerClassName),d=0;b=$(e[d]);d++)\"a\"===b.tagName.toLowerCase()&&b.href.match(a)&&this._triggers.push(b)}return this._triggers},relatedElements:function(){return this._relatedElements||(this._relatedElements=document.getElementsByClassName(this.id)),this._relatedElements},initialize:function(a,b){if(this.content=$(a),\"a\"===this.content.tagName.toLowerCase()){var c=this.content.getAttribute(\"href\"),d=c.split(\"#\");this._contentURL=d[0];var e=window.location.href.split(\"#\"),f=(a.className,document.getElementsByTagName(\"base\")[0]),g=f?f.href:null;if(2===d.length&&(this.id=d[1]),!(this._contentURL.length>0)||g&&this._contentURL==g||this._contentURL===e[0]||this._contentURL.startsWith(\"#\")&&this._contentURL===c){var h=$(this.id)||$(\"MASKED-\"+this.id);h&&(this.content=h)}else this._isContentRemote=!0,this._isContentLoaded=!1;this.id||(this.id=this.content.name)}else this.id=a.id;if((!this._isContentRemote||this._isContentLoaded)&&this.content.setAttribute(\"id\",\"MASKED-\"+this.id),b&&(this.viewMaster=b),!this._isContentRemote&&this._isContentLoaded&&!this.content.hasClassName(\"content\")){var i=this.content.getElementsByClassName(\"content\")[0];i&&(this.content=i)}this.isMobile=AC.Detector.isMobile()},clearTrigger:function(a){a.href!==\"#\"+this.id&&(a.href=\"#\"+this.id,a.removeAttribute(\"id\"),a.removeAttribute(\"name\"),this.viewMaster.options.silentTriggers||(document.location.hash=this.id))},remoteContentDidLoad:function(a,b){this.clearTrigger(this.content),this.content=$(a),this.content.setAttribute(\"id\",\"MASKED-\"+this.id),this._isContentLoaded=!0,this.viewMaster.contentDidLoad(this,b)},loadContent:function(){if(this._isContentLoaded){var a=this;a.viewMaster.contentDidLoad(a,null)}else if(-1!==this.content.className.indexOf(\"imageLink\")){var b=document.createElement(this.viewMaster.options.useHTML5Tags?\"figure\":\"div\");if(this.viewMaster.options.imageLinkClasses){try{console.warn('\"imageLinkClasses\" is deprecated. Use \"addSectionIdAsClassName\" instead.')}catch(c){}Element.addClassName(b,this.id)}if(b.appendChild(this.content.cloneNode(!0)),this.viewMaster.options.imageLinkAutoCaptions){var d=\"string\"==typeof this.viewMaster.options.imageLinkAutoCaptions?this.viewMaster.options.imageLinkAutoCaptions:\"title\";if(this.content.hasAttribute(d)){if(this.viewMaster.options.useHTML5Tags)var e=document.createElement(\"figcaption\");else{var e=document.createElement(\"p\");Element.addClassName(e,\"caption\")}e.innerHTML=this.content.getAttribute(d),Element.insert(b,e)}}this.remoteContentDidLoad(b)}else if(-1!==this.content.className.indexOf(\"movieLink\")||-1!==this.content.className.indexOf(\"audioLink\")){var b=document.createElement(this.viewMaster.options.useHTML5Tags?\"figure\":\"div\");b.appendChild(this.content.cloneNode(!0)),this.remoteContentDidLoad(b)}else AC.loadRemoteContent(this._contentURL,!0,!0,this.remoteContentDidLoad.bind(this),null,this)},shouldImportScriptForContentURL:function(a){var b=!1;return a.hasAttribute?b=a.hasAttribute(\"src\"):(src=a.getAttribute(\"src\"),b=null!=src&&\"\"!==src),b?!0:(scriptText=a.text,-1!==scriptText.search(/.*\\.location\\.replace\\(.*\\).*/)?!1:!0)},mediaType:function(){return this.movieLink?\"video/quicktime\":\"text/html\"},willClose:function(){this._closeController(),this._closeMovie()},willShow:function(){if(!this.hasShown){this.hasShown=!0,this.viewMaster.options.addSectionIdAsClassName===!0&&this.content.addClassName(this.id);for(var a=this.content.getElementsByClassName(\"imageLink\"),b=0;b<a.length;b++)this._loadImage(a[b]);this.moviePanel||(this.movieLink=this.content.getElementsByClassName(\"movieLink\")[0],this.movieLink&&(this.posterLink=this.__getPoster(this.content,this.movieLink),this._loadMovie()))}return this.content},__getPoster:function(a,b){var c;if(b&&b.hasAttribute(\"data-poster\"))c=b.readAttribute(\"data-poster\");else{var c=a.getElementsByClassName(\"posterLink\")[0];c&&(c=c.href)}return c},_heightOfContent:0,heightOfContent:function(){return 0!==this._heightOfContent||this._isContentRemote&&!this._isContentLoaded||(this.content.parentNode?this._heightOfContent=this.content.getOuterDimensions().height:(this.content.style.visibility=\"hidden\",this.viewMaster.view.view().appendChild(this.content),this._heightOfContent=this.content.getOuterDimensions().height,this.viewMaster.view.view().removeChild(this.content),this.content.style.visibility=\"\")),this._heightOfContent},getZIndexFromContent:function(){return this.content?parseInt(this.content.getAttribute(\"data-manage-z\"))||null:null},didShow:function(){var a=this.hasMovie()&&!this.isMobile,b=this.isACMediaAvailable();b?a?(this._movieControls=this.newMovieController(),this._playMovie(),this._movieController?(this._movieController.setControlPanel(this._movieControls),this.onMovieFinished=this.didFinishMovie.bind(this),this._movieController.setDelegate(this)):this.controllerPanel.innerHTML=\"\"):this._playMovie():(a&&(this._movieController=this.newMovieController(),this.controllerPanel.innerHTML=\"\",this.controllerPanel.appendChild(this._movieController.render())),this._playMovie(),a&&(this._onMoviePlayable=this._movieController.monitorMovie.bind(this._movieController),this._onMovieFinished=this.didFinishMovie.bind(this),this._movieController.attachToMovie(this.movie,{onMoviePlayable:this._onMoviePlayable,onMovieFinished:this._onMovieFinished})))},defaultMovieWidth:function(){return 848},defaultMovieHeight:function(){return 480},defaultOptions:function(){return{width:this.defaultMovieWidth(),height:this.defaultMovieHeight(),controller:!1,posterFrame:null,showlogo:!1,autostart:!0,cache:!0,bgcolor:\"white\",aggressiveCleanup:!1}},_forceACQuicktime:!1,isACMediaAvailable:function(){return\"undefined\"!=typeof Media&&this._forceACQuicktime===!1},setShouldForceACQuicktime:function(a){this._forceACQuicktime=a},movieControls:function(){return this._movieControls},newMovieController:function(){return this.isACMediaAvailable()?this._movieControls||new Media.ControlsWidget(this.controllerPanel):new AC.QuicktimeController},_loadImage:function(a){var b=document.createElement(\"img\");\"about:\"===a.protocol&&(a.href=\"/\"+a.pathname,a.href=a.href.replace(/^\\/blank/,\"\")),b.setAttribute(\"src\",a.href),this.viewMaster.options.imageLinkAutoCaptions?b.setAttribute(\"alt\",\"\"):b.setAttribute(\"alt\",a.title),a.parentNode.replaceChild(b,a)},_loadMovie:function(){var a=this.isACMediaAvailable();if(this.moviePanel=$(document.createElement(\"div\")),this.moviePanel.addClassName(\"moviePanel\"),this.movieLink.parentNode.replaceChild(this.moviePanel,this.movieLink),this.controllerPanel=$(document.createElement(\"div\")),this.controllerPanel.addClassName(\"controllerPanel\"),a===!1||this.moviePanel.appendChild(this.controllerPanel),a===!1?this.moviePanel.parentNode.insertBefore(this.controllerPanel,this.moviePanel.nextSibling):this.moviePanel.appendChild(this.controllerPanel),this.endState=$(this.content.getElementsByClassName(\"endState\")[0]),this.endState){this.endState.parentNode.removeChild(this.endState);var b=$(this.endState.getElementsByClassName(\"replay\")[0]);b&&b.observe(\"click\",function(a){Event.stop(a),this.replayMovie()}.bindAsEventListener(this))}},_playMovie:function(a){if(this.movieLink&&this.moviePanel){var b=this.isACMediaAvailable();if(b?(this.movie&&this.movie.parentNode==this.moviePanel&&(this.moviePanel.removeChild(this.movie),this.controllerPanel.hide()),this.endState&&this.endState.parentNode==this.moviePanel&&this.moviePanel.removeChild(this.endState),this.controllerPanel&&Element.hasClassName(this.controllerPanel,\"inactive\")&&(this.controllerPanel.show(),Element.removeClassName(this.controllerPanel,\"inactive\"))):this.moviePanel.innerHTML=\"\",this.posterLink&&this.posterLink.length>0)var c=this.posterLink;var d,e=this.movieLink.getAttribute(\"href\",2).toQueryParams(),f=this.defaultOptions();1==a&&(e.replay=!0),f.posterFrame=c,d=Object.extend(f,e);for(opt in d)d[opt]=\"true\"===d[opt]?!0:\"false\"===d[opt]?!1:d[opt];b===!0?(this._movieController=Media.create(this.moviePanel,this.movieLink.getAttribute(\"href\",2),d),this._movieController&&(this.movie=this._movieController.video().object())):(this.movie=AC.Quicktime.packageMovie(this.movieLink.id+\"movieId\",this.movieLink.getAttribute(\"href\",2),d,this.moviePanel),AC.Quicktime.movieIsFlash||this.moviePanel.appendChild(this.movie)),b===!0&&!this.isMobile&&this.movie&&(this._movieControls.reset(),this.moviePanel.appendChild(this.controllerPanel)),\"function\"==typeof document.event.dispatchEvent&&document.event.dispatchEvent(\"didStart\",this)}},replayMovie:function(){var a=this.isACMediaAvailable();\"function\"==typeof document.event.dispatchEvent&&document.event.dispatchEvent(\"replayMovie\",this),a&&this.moviePanel&&this.endState&&this.moviePanel.removeChild(this.endState),this._playMovie(!0),a&&this.controllerPanel.show(),this.controllerPanel.removeClassName(\"inactive\"),a?(this._movieController.setControlPanel(this._movieControls),this._movieController.setDelegate(this)):(this.controllerPanel.stopObserving(\"click\",this._movieController.replay),this._movieController.replay=null,this._movieController.attachToMovie(this.movie,{onMoviePlayable:this._onMoviePlayable,onMovieFinished:this._onMovieFinished}))\n},stopMovie:function(){this.hasMovie()&&(this._closeController(),this._closeMovie(),this.viewMaster.options.showPreviousOnStopMovie&&this.viewMaster.getPreviousSelection()?this.viewMaster.showPreviousSelection():this.viewMaster.options.showFirstOnStopMovie&&this.viewMaster.getFirstSection()?this.viewMaster.showFirst():this.endState?this.moviePanel.appendChild(this.endState):this.stopMovieWithNoEndState())},stopMovieWithNoEndState:function(){var a=this;setTimeout(function(){a.viewMaster.showPreviousSelection()},0)},_closeMovie:function(){this.movie&&this.moviePanel&&(this.isACMediaAvailable()?(AC.Detector.isIEStrict()?(this.moviePanel.removeChild(this.movie),this.controllerPanel.hide()):this.moviePanel.innerHTML=\"\",this.movie=null):(this.moviePanel.removeChild(this.movie),this.movie=null,this.moviePanel.innerHTML=\"\"))},_closeController:function(){this.isACMediaAvailable()?this._movieController&&this.hasMovie()&&!this.isMobile&&(this._movieController.stop(),this._movieController.setControlPanel(null),AC.Detector.isIEStrict()&&this.controllerPanel.hide(),this.controllerPanel.addClassName(\"inactive\")):this._movieController&&this._movieController.movie&&this.hasMovie()&&!this.isMobile&&(this._movieController.Stop(),this._movieController.detachFromMovie(),this.controllerPanel.addClassName(\"inactive\"),this._movieController.replay=this.replayMovie.bind(this),this.controllerPanel.observe(\"click\",this._movieController.replay))},hasMovie:function(){return!!this.movieLink},isMoviePlaying:function(){if(this._movieController){if(\"function\"==typeof this._movieController.playing)return this._movieController.playing();if(\"boolean\"==typeof this._movieController.playing)return this._movieController.playing}return!1},didFinishMovie:function(){if(this.hasMovie()){\"function\"==typeof document.event.dispatchEvent&&document.event.dispatchEvent(\"didFinishMovie\",this);var a=this;window.setTimeout(function(){a.stopMovie.apply(a)},0)}}}),AC.ViewMaster.Slideshow=Class.create(),Event.Listener&&Object.extend(AC.ViewMaster.Slideshow.prototype,Event.Listener),Event.Publisher&&Object.extend(AC.ViewMaster.Slideshow.prototype,Event.Publisher),Object.extend(AC.ViewMaster.Slideshow.prototype,{contentController:null,animationTimeout:null,options:null,_playing:!1,_active:!1,_progress:0,setProgress:function(a){this._progress=a},progress:function(){return this._progress},initialize:function(a,b,c){this.contentController=a,this.contentController.__slideshow=this,this.triggerClassName=b,this.options=c||{},this.options.stopOnContentTriggerClick===!0&&this.contentController.options.useTouchEvents===!0&&(this.options.stopOnUserInteraction=this.options.stopOnContentTriggerClick),this.options.addNoListeners||(this.listenForEvent(AC.ViewMaster,\"ViewMasterWillShowNotification\",!0,this.willShow),this.listenForEvent(AC.ViewMaster,\"ViewMasterDidShowNotification\",!0,this.didShow)),this.options.autoplay&&(this.options.autoplay===!0?this.start():\"number\"==typeof this.options.autoplay&&(this.toAutoplay=window.setTimeout(function(){this.start()}.bind(this),this.options.autoplay))),Event.observe(document,\"click\",this._triggerHandler.bindAsEventListener(this));var d=this.contentController.view.view();Event.observe(d,\"AC.ViewMaster.Slideshow:play\",this.play.bindAsEventListener(this)),Event.observe(d,\"AC.ViewMaster.Slideshow:stop\",this.stop.bindAsEventListener(this))},start:function(){this._active||(this._active=!0,(\"always\"==this.options.wipeProgress||\"on start\"==this.options.wipeProgress)&&(this._progress=0),this.play(!0),this._repaintTriggers(),\"function\"==typeof document.event.dispatchEvent&&document.event.dispatchEvent(\"didStart\",this))},stop:function(){this._active=!1,this.pause(),this._repaintTriggers(),this.toAutoplay&&(window.clearTimeout(this.toAutoplay),delete this.toAutoplay),\"function\"==typeof document.event.dispatchEvent&&document.event.dispatchEvent(\"didEnd\",this)},play:function(a){this._active&&((\"always\"==this.options.wipeProgress||\"on play\"==this.options.wipeProgress&&!a)&&(this._progress=0),this.animationTimeout=setTimeout(this._update.bind(this),this._heartbeatDelay()),this._playing=!0)},_update:function(){\"function\"==typeof this.options.onProgress&&this.options.onProgress(this._progress,this.delay()),this._progress>=this.delay()?(this._progress=0,this.next()):(this._progress+=this._heartbeatDelay(),this.animationTimeout=setTimeout(this._update.bind(this),this._heartbeatDelay()))},delay:function(){return this.options.delay||5e3},_heartbeatDelay:function(){return this.options.heartbeatDelay||100},pause:function(){clearTimeout(this.animationTimeout),this._playing=!1},next:function(){var a=this.contentController.options.discontinuousPreviousNext;this.options.discontinuousPreviousNext!==a&&(this.contentController.options.discontinuousPreviousNext=this.options.discontinuousPreviousNext);var b=\"number\"==typeof this.options.stopAfterReturnToSection&&this.contentController.indexOfSection(this.contentController.currentSection)==this.options.stopAfterReturnToSection||\"string\"==typeof this.options.stopAfterReturnToSection&&this.contentController.currentSection.id==this.options.stopAfterReturnToSection,c=this.options.willEnd&&this.contentController.getNextSection()==this.contentController.getFirstSection();if(b||c){if(c)try{console.warn(\"Instead of AC.ViewMaster.Slideshow.options.willEnd = true, please use AC.ViewMaster.Viewer.options.discontinuousPreviousNext = true.\")}catch(d){}this._returnedToSection||c?this.stop():this._returnedToSection||(this._returnedToSection=!0)}this._active&&this.contentController.showNext(),this.contentController.options.discontinuousPreviousNext=a,this.contentController.disablePreviousNextIfNeeded()},previous:function(){this.contentController.showPrevious()},reset:function(){this.contentController.showFirst(),this.setProgress(0)},willShow:function(a){a.event_data.data.sender==this.contentController&&this.pause()},didShow:function(a){a.event_data.data.sender==this.contentController&&this.play()},_triggerHandler:function(a){var b=a.element();if((this.options.stopOnUserInteraction===!0||this.options.stopOnContentTriggerClick)&&(link=a.findElement(\"a\"))&&link.hasClassName(this.contentController.triggerClassName)&&-1==link.href.search(this.contentController.currentSection.id))if(this.options.stopOnContentTriggerClick){try{console.warn('\"stopOnContentTriggerClick\" is deprecated. Please use \"stopOnUserInteraction\" instead.')}catch(c){}this.stop()}else this.userInteracted();else b.hasClassName(this.triggerClassName)&&b.href.match(/#slideshow-toggle/)&&(Event.stop(a),this._active?this.stop():this.start())},userInteracted:function(){this.options.stopOnUserInteraction===!0&&this.stop()},_repaintTriggers:function(){if(this.triggerClassName)for(var a=document.getElementsByClassName(this.triggerClassName),b=a.length-1;b>=0;b--)this._repaintTrigger(a[b])},_repaintTrigger:function(a){var b=$(a);this._active?b.addClassName(\"playing\"):b.removeClassName(\"playing\")}}),AC.SlideView=Class.create(AC.SwapView,{_resetView:function(){this._view&&this._view.addClassName(\"swapView\")},setLoadedContent:function(a){\"function\"==typeof this.delegate.willShow&&(a=this.delegate.willShow(this,this.currentContent,a));var b,c=!0;\"function\"==typeof this.delegate.shouldAnimateContentChange&&(c=this.delegate.shouldAnimateContentChange(this,this.currentContent,a)),c&&\"function\"==typeof this.delegate.willAnimate?(this.didAnimate=!0,\"function\"==typeof this.delegate.didAppendContent&&this.delegate.didAppendContent(this,a),b=this.delegate.willAnimate(this,this.currentContent,a,this.didShow.bind(this,a))):(this.didAnimate=!1,this.currentContent!==a&&\"function\"==typeof this.delegate.didAppendContent&&this.delegate.didAppendContent(this,a),a&&$(a).setOpacity(1),this.didShow(a))},didShow:function(a){\"function\"==typeof this.delegate.didShow&&this.delegate.didShow(this,this.currentContent,a),this.currentContent=a}}),AC.ViewMaster.SlideViewer=Class.create(AC.ViewMaster.Viewer,{initialize:function(a,b,c,d){c&&(this.triggerClassName=c),this.sections=$H(),this.orderedSections=[],this.options=d||{},this.silentPreviousSelection(this.options.silentPreviousSelection),this.silentFirstSection(this.options.silentFirstSection),this.triggerEvent=this.options.triggerEvent||\"click\";var e,f,g=null;if(a)for(f=0;f<a.length;f++)e=this.addSection(a.item(f)),g||(g=e);this.view=new AC.SlideView(b),this.view.setDelegate(this),this.__mask=this.view.view().up();var h,i,j=document.location.hash;if(this.sectionRegExp=this.options.sectionRegExp||new RegExp(/#(.*)$/),i=j.match(this.sectionRegExp),i&&i[1]&&(j=i[1]),j!==this.view._viewId){var k,l=document.getElementsByClassName(this.triggerClassName);for(f=0,k;k=l[f];f++)if(k.getAttribute(\"href\").match(new RegExp(\"#\"+j+\"(?![_w-])\"))){h=this.sectionWithId(j),h&&(g=h);break}}if(!h&&\"string\"==typeof this.options.initialId&&this.options.initialId.length>0&&(g=this.sectionWithId(this.options.initialId)),this.show(g),this._boundTriggerClicked=this._triggerClicked.bindAsEventListener(this),\"object\"==typeof this.triggerEvent)for(var m,f=0;m=this.triggerEvent[f];f++)Event.observe(document,m,this._boundTriggerClicked);else Event.observe(document,this.triggerEvent,this._boundTriggerClicked);AC.Detector.isIEStrict()&&Event.observe(document,\"mouseup\",this._boundTriggerClicked),(this.options.useKeyboardNav===!0||this.options.escapeToClose===!0)&&(this._boundKeyDown=this._keyDown.bindAsEventListener(this),Event.observe(document,\"keydown\",this._boundKeyDown)),this.options.useTouchEvents===!0&&\"undefined\"!=typeof window.ontouchstart&&this.__touchLoadEventDependencies(),this.__addEventListeners(),this._addGalleryContentClassNameToAllSections()},__touchLoadEventDependencies:function(){if(\"function\"==typeof Element.trackTouches)this.__touchInitTrackTouches();else{if(null===$(\"swap-view-track-touches-script-tag\")){var a=document.getElementsByTagName(\"head\")[0],b=document.createElement(\"script\");b.type=\"text/javascript\",b.setAttribute(\"src\",\"http://images.apple.com/global/scripts/pagingview.js\"),b.setAttribute(\"id\",\"swap-view-track-touches-script-tag\"),a.appendChild(b)}this.__boundTouchInitTrackTouches=this.__touchInitTrackTouches.bindAsEventListener(this),document.observe(\"ac:trackTouches:load\",this.__boundTouchInitTrackTouches)}},__touchInitTrackTouches:function(){this.options.discontinuousPreviousNext=!0,this.options.continuous=!1,this._shouldBeContinuous=!1,this.__boundTouchTrackEvents=this.__touchTrackEvents.bindAsEventListener(this),this.__maskWidth=this.__mask.getWidth()||0,this.view.view().trackTouches(this.__boundTouchTrackEvents,this.__boundTouchTrackEvents,this.__boundTouchTrackEvents,{stopEvent:\"horizontal\",stopThreshold:10})},__touchTrackEvents:function(a){var b=this.view.view();b.setVendorPrefixStyle(\"transition-duration\",\"0\"),a.startCoords&&a.coords&&(a.difference&&\"undefined\"!=typeof this.__touchTrackedStartOffset?b.setVendorPrefixTransform(this.__touchTrackingNewLeft(a)+\"px\"):this.__touchStart(a),0===a.touches.length&&this.__touchEnd(a))},__touchStart:function(){var a,b=this.view.view();this.__storedShouldAnimateContentChange=this.options.shouldAnimateContentChange,this.options.shouldAnimateContentChange=!1,\"undefined\"!=typeof this.__touchAnimateAfterTouchEnd&&this.__touchAnimateAfterTouchEnd(!1),a=b.translateOffset(),this.__touchTrackedStartOffset=null===a||\"object\"!=typeof a?0:a.x},__touchEnd:function(a){var b,c,d=this.view.view(),e=a.difference.abs.x/this.__maskWidth,f=a.difference.current.x/this.__maskWidth,g=this.options.animationDuration||.4;(f>.4||a.speed>=7)&&(\"right\"===a.direction.x?b=this.getNextSection():\"left\"===a.direction.x&&(b=this.getPreviousSection())),this.__touchSetTransitionEnd(d,b),b===!1||\"undefined\"==typeof b?this._animate(this.__touchTrackedStartOffset,g*e):(c=-1*b.content.positionedOffset()[0],e>=.5&&(g*=.5),this._animate(c,g)),a.difference.abs.x>5&&\"object\"==typeof this.__slideshow&&\"function\"==typeof this.__slideshow.userInteracted&&this.__slideshow.userInteracted(),delete this.__touchTrackedStartOffset},__touchSetTransitionEnd:function(a,b){var c=function(c){c!==!1&&this.show(b),this.options.shouldAnimateContentChange=this.__storedShouldAnimateContentChange,delete this.__storedShouldAnimateContentChange,a.removeVendorEventListener(\"transitionEnd\",this.__touchAnimateAfterTouchEnd,!1),delete this.__touchAnimateAfterTouchEnd};this.__touchAnimateAfterTouchEnd=c.bindAsEventListener(this),a.addVendorEventListener(\"transitionEnd\",this.__touchAnimateAfterTouchEnd,!1)},__touchTrackingNewLeft:function(a){var b,c,d=this.isAtEnd(this.currentSection);return b=function(a,b){var c,d,e;return c=function(a){return 1==a?1:1-Math.pow(2,-3*a)},e=a/b,d=parseFloat(c(e)*(b/3))},d!==!1&&\"left\"===d&&a.difference.x<0||\"right\"===d&&a.difference.x>0?(c=b(a.difference.abs.x,this.__maskWidth),\"left\"===d&&(c*=-1)):c=a.difference.x,this.__touchTrackedStartOffset-c},isAtEnd:function(a){var b=this.orderedSections.indexOf(a.id);return 0===b?\"left\":b===this.orderedSections.length-1?\"right\":!1},getNextSection:function(a){return this.options.continuous&&(this._shouldBeContinuous=!0),a()},getPreviousSection:function(a){return this.options.continuous&&(this._shouldBeContinuous=!0),a()},willShow:function(a,b,c,d){return this.options.shouldAddActiveClassToContent===!0&&(c&&c.removeClassName(\"active\"),d&&d.content.addClassName(\"active\")),a(b,c,d)},__fixScrollLeft:function(a){(void 0===this.__fixScrollLeftCounter||a&&a.type&&\"load\"===a.type)&&(this.__fixScrollLeftCounter=0),(0!==this.__mask.scrollLeft||this.__fixScrollLeftCounter<5)&&(this.__mask.scrollLeft=0,this.__fixScrollLeftCounter++,window.setTimeout(this.__boundFixScrollLeft,10))},willAnimate:function(a,b,c,d,e){this.__boundFixScrollLeft=this.__fixScrollLeft.bind(this),window.setTimeout(this.__boundFixScrollLeft,50),Event.observe(window,\"load\",this.__boundFixScrollLeft);var f=b.view().offsetLeft||0,g=-d.offsetLeft||0;f!==g?(this._didShowInitial=!0,a(b,c,d,e),this._didShowInitial=!1):a(b,c,d,e),this.willAnimate=a},_animate:function(a,b){var c=this.view.view();0==b?c.setVendorPrefixStyle(\"transition\",\"none\"):c.setVendorPrefixStyle(\"transition\",\"-webkit-transform \"+b+\"s cubic-bezier(0,0,0.25,1)\"),c.setAttribute(\"left\",a),AC.Detector.supportsThreeD()?c.setVendorPrefixStyle(\"transform\",\"translate3d(\"+a+\"px, 0, 0)\"):c.setVendorPrefixStyle(\"transform\",\"translate(\"+a+\"px, 0)\")},_animation:function(a,b,c,d,e,f){var g=a.view(),h=g.offsetLeft||0,i=-c.offsetLeft||0;if(c.setOpacity(1),this._shouldBeContinuous){var j=this.indexOfSection(a.delegate.currentSection),k=this.indexOfSection(a.delegate.previousSection),l=i;0===j&&k===this.orderedSections.length-1?(i=-1*(b.positionedOffset()[0]+b.getWidth()),this._continuousCloneElement=this._continuousClone(a,c,i)):j===this.orderedSections.length-1&&0===k&&(i=-1*(b.positionedOffset()[0]-b.getWidth()),this._continuousCloneElement=this._continuousClone(a,c,i))}var m=this;if(!AC.Detector.isCSSAvailable(\"transition\")||!AC.Detector.isCSSAvailable(\"transform\"))return new Effect.Move(g,{x:i-h,y:0,duration:f,afterFinish:function(){m._continuousReset(l,a),d()},queue:{scope:e}});this._animate(i,f);var n=function(b){b.target==g&&b.propertyName.match(/transform$/i)&&(g.removeVendorEventListener(\"transitionEnd\",n,!1),m._continuousReset(l,a),d())};g.addVendorEventListener(\"transitionEnd\",n,!1)},_continuousClone:function(a,b,c){if(this._shouldBeContinuous){var d=b.cloneNode(!0);return d.id=d.id+\"-clone\",d.innerHTML=b.innerHTML,d.setStyle(\"position: absolute; top: 0; left:\"+-1*c+\"px\"),a._view.insert(d),d}return!1},_continuousReset:function(a,b){this._shouldBeContinuous&&(b._view.setAttribute(\"left\",a),AC.Detector.isCSSAvailable(\"transition\")&&AC.Detector.isCSSAvailable(\"transform\")?(b._view.setVendorPrefixStyle(\"transition\",\"none\"),AC.Detector.supportsThreeD()?b._view.setVendorPrefixStyle(\"transform\",\"translate3d(\"+a+\"px, 0, 0)\"):b._view.setVendorPrefixStyle(\"transform\",\"translate(\"+a+\"px, 0)\")):b._view.setStyle(\"left:\"+a+\"px\"),delete this._shouldBeContinuous),this._continuousCloneElement&&(this._removeContinuousCloneElement?(this._continuousCloneElement.remove(),delete this._continuousCloneElement,delete this._removeContinuousCloneElement):this._removeContinuousCloneElement=!0)},_addGalleryContentClassNameToAllSections:function(){if(this.options.addGalleryContentClassName===!0){var a;for(a=0;a<this.orderedSections.length;a++)this._addGalleryContentClassName(this.sectionWithId(this.orderedSections[a]).content)}}}),AC.loadRemoteContent=function(a,b,c,d,e,f){if(\"string\"==typeof a){\"boolean\"!=typeof b&&(b=!0),\"boolean\"!=typeof c&&(c=!0);var g=arguments.callee,h=g._loadArgumentsByUrl[a];if(!h){g._loadArgumentsByUrl[a]={contentURL:a,importScripts:b,importCSS:c,callback:d,context:e,delegate:f};var i={method:\"get\",onSuccess:arguments.callee.loadTemplateHTMLFromRequest,onFailure:arguments.callee.failedToadTemplateHTMLFromRequest,onException:function(a,b){throw b}};a.match(/\\.json$/)||(i.requestHeaders={Accept:\"text/xml\"},i.onCreate=function(a){a.request.overrideMimeType(\"text/xml\")}),new Ajax.Request(a,i)}}},AC.loadRemoteContent._loadArgumentsByUrl={},AC.loadRemoteContent.loadTemplateHTMLFromRequest=function(a){var b=a.request.url,c=(arguments.callee,AC.loadRemoteContent._loadArgumentsByUrl[b]),d=window.document,e=a.responseXMLValue().documentElement;AC.Detector.isIEStrict()&&(e=e.ownerDocument);var d=window.document,f=document.createDocumentFragment();c.importScripts&&AC.loadRemoteContent.importScriptsFromXMLDocument(e,f,c),c.importCSS&&AC.loadRemoteContent.importCssFromXMLDocumentAtLocation(e,b,c);var g=null,h=null,i=e.getElementsByTagName(\"body\")[0];if(i){i.normalize();var h=Element.Methods.childNodeWithNodeTypeAtIndex(i,Node.ELEMENT_NODE,0);if(h)g=d._importNode(h,!0),g.cleanSpaces&&g.cleanSpaces(!0);else{i.cleanSpaces?i.cleanSpaces(!0):\"function\"==typeof i.normalize&&i.normalize();var j=i.childNodes;g=d.createDocumentFragment();for(var k=0,l=0;l=j[k];k++){var m=d._importNode(l,!0);g.appendChild(m)}}var n=c.callback;n(g,f,c.context)}},AC.loadRemoteContent.javascriptTypeValueRegExp=new RegExp(\"text/javascript\",\"i\"),AC.loadRemoteContent.javascriptLanguageValueRegExp=new RegExp(\"javascript\",\"i\"),AC.loadRemoteContent.documentScriptsBySrc=function(){if(!AC.loadRemoteContent._documentScriptsBySrc){AC.loadRemoteContent._documentScriptsBySrc={};var a=document.getElementsByTagName(\"script\");if(!a||0===a.length)return AC.loadRemoteContent._documentScriptsBySrc;for(var b=0,c=null;c=a[b];b++){var d=c.getAttribute(\"type\"),e=null,f=c.getAttribute(\"language\");if(this.javascriptTypeValueRegExp.test(d)||this.javascriptLanguageValueRegExp.test(f)){if(c.hasAttribute)var g=c.hasAttribute(\"src\");else var g=Element.Methods.hasAttribute(c,\"src\");if(g){var e=c.getAttribute(\"src\");AC.loadRemoteContent._documentScriptsBySrc[e]=e}}}}return AC.loadRemoteContent._documentScriptsBySrc},AC.loadRemoteContent.importScriptsFromXMLDocument=function(a,b,c){var d,e,f,g,h=a.getElementsByTagName(\"script\"),i=c.contentURL,j=c.delegate,k=c.context,l=j&&\"function\"==typeof j.shouldImportScriptForContentURL,m=navigator.userAgent.toLowerCase(),n=AC.Detector.isIEStrict()&&parseInt(m.substring(m.lastIndexOf(\"msie \")+5))<9,o=!0;b||(b=document.createDocumentFragment());for(var p=AC.loadRemoteContent.documentScriptsBySrc(),q=0,r=null;r=h[q];q++)if(d=r.getAttribute(\"type\"),e=null,o=!0,f=r.getAttribute(\"language\"),(this.javascriptTypeValueRegExp.test(d)||this.javascriptLanguageValueRegExp.test(f))&&(r.hasAttribute?(g=r.hasAttribute(\"src\"),e=r.getAttribute(\"src\")):(e=r.getAttribute(\"src\"),g=null!=e&&\"\"!==e),\"Redirect\"!==r.getAttribute(\"id\")&&(!l||j.shouldImportScriptForContentURL(r,i,k))))if(g){if(!p.hasOwnProperty(e)){var s=document.createElement(\"script\");s.setAttribute(\"type\",\"text/javascript\"),n?(s.tmp_src=e,s.onreadystatechange=function(){var a,b=window.event.srcElement;b.isLoaded||\"complete\"!=b.readyState&&\"loaded\"!=b.readyState||(a=b.tmp_src,a?(b.tmp_src=null,b.src=a,b.isLoaded=!1):(b.onreadystatechange=null,b.isLoaded=!0))}):s.src=e,AC.loadRemoteContent._documentScriptsBySrc[e]=e,b.appendChild(s)}}else{var s=document.createElement(\"script\");if(s.setAttribute(\"type\",\"text/javascript\"),n){var t=new Function(r.text);s.onreadystatechange=function(){var a=window.event.srcElement;a.isLoaded||\"complete\"!=a.readyState&&\"loaded\"!=a.readyState||(a.onreadystatechange=null,a.isLoaded=!0,t())}}else s.text=r.text;AC.loadRemoteContent._documentScriptsBySrc[e]=e,b.appendChild(s)}return b},AC.loadRemoteContent.insertScriptFragment=function(a){if(a){AC.isDomReady=!1,Event._domReady.done=!1;var b,c,d=document.getElementsByTagName(\"head\")[0],e=a.childNodes,f=function(){var a;(!window.event||(a=window.event.srcElement)&&(a.isLoaded||\"undefined\"==typeof a.isLoaded&&(\"complete\"==a.readyState||\"loaded\"==a.readyState)))&&(arguments.callee.loadedCount++,a&&!a.isLoaded&&(a.onreadystatechange=null,a.isLoaded=!0),arguments.callee.loadedCount===arguments.callee.loadingCount&&Event._domReady())};for(f.loadedCount=0,f.loadingCount=a.childNodes.length,c=0;b=e[c];c++)if(b.addEventListener)b.addEventListener(\"load\",f,!1);else if(\"function\"==typeof b.onreadystatechange){var g=b.onreadystatechange;b.onreadystatechange=function(){var a=window.event.srcElement;g.call(a),f()}}else b.onreadystatechange=f;d.appendChild(a),d=null}},AC.loadRemoteContent.documentLinksByHref=function(){if(!AC.loadRemoteContent._documentLinksByHref){AC.loadRemoteContent._documentLinksByHref={};var a=document.getElementsByTagName(\"link\");if(!a||0===a.length)return AC.loadRemoteContent._documentLinksByHref;for(var b=0,c=null;c=a[b];b++){{c.getAttribute(\"type\")}if(\"text/css\"===c.type.toLowerCase()){var d=null;if(c.hasAttribute)var e=c.hasAttribute(\"href\");else var e=Element.hasAttribute(c,\"href\");if(e){var d=c.getAttribute(\"href\");AC.loadRemoteContent._documentLinksByHref[d]=d}}}}return AC.loadRemoteContent._documentLinksByHref},AC.loadRemoteContent.__importCssElementInHeadFromLocation=function(a,b,c){var d=\"LINK\"===a.tagName.toUpperCase();if(d){var e=a.getAttribute(\"type\");if(!e||e&&\"text/css\"!==e.toLowerCase())return;var f=a.getAttribute(\"href\");if(!f.startsWith(\"http\")&&!f.startsWith(\"/\")){var g=f;c.pathExtension().length>0&&(c=c.stringByDeletingLastPathComponent()),f=c.stringByAppendingPathComponent(g)}if(AC.Detector.isIEStrict()){window.document.createStyleSheet(f,1)}else{var h=window.document.importNode(a,!0);h.href=f}AC.loadRemoteContent.documentLinksByHref()[f]=f}(!AC.Detector.isIEStrict()||AC.Detector.isIEStrict()&&!d)&&b.insertBefore(h,b.firstChild)},AC.loadRemoteContent.importCssFromXMLDocumentAtLocation=function(a,b){var c=window.document.getElementsByTagName(\"head\")[0],d=[];if(d.addObjectsFromArray(a.getElementsByTagName(\"style\")),d.addObjectsFromArray(a.getElementsByTagName(\"link\")),d)for(var e=AC.loadRemoteContent.documentLinksByHref(),f=0,g=null;g=d[f];f++){var h=g.getAttribute(\"href\");e.hasOwnProperty(h)||this.__importCssElementInHeadFromLocation(g,c,b)}},Ajax.Request.prototype._overrideMimeType=null,Ajax.Request.prototype.overrideMimeType=function(a){this._overrideMimeType=a,this.transport.overrideMimeType&&this.transport.overrideMimeType(a)},Ajax.Request.prototype._doesOverrideXMLMimeType=function(){return\"text/xml\"===this._overrideMimeType},Ajax.Response.prototype.responseXMLValue=function(){if(AC.Detector.isIEStrict()){var a=this.transport.responseXML.documentElement;!a&&this.request._doesOverrideXMLMimeType()&&this.transport.responseXML.loadXML(this.transport.responseText)}return this.transport.responseXML},\"undefined\"!=typeof AC.Retina&&(AC.Retina.SwapView=function(){var a;return null===AC.Retina.sharedInstance()?!1:(a=function(a){if(a.event_data.data.incomingView&&Object.isElement(a.event_data.data.incomingView.content)){var b=a.event_data.data.incomingView.content,c=a.event_data.data.sender.view.view();AC.Retina.sharedInstance().replace(b,c)}},a=a.bindAsEventListener(this),void(\"Listener\"in Event&&\"undefined\"!=typeof AC.ViewMaster&&Event.Listener.listenForEvent(AC.ViewMaster,\"ViewMasterDidShowNotification\",!1,a)))},Event.observe(window,\"load\",function(){window.setTimeout(AC.Retina.SwapView,20)}));"
  },
  {
    "path": "works/demo/ali/file/yun4.htm",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<!-- saved from url=(0431)http://ht.www.sogou.com/websearch/features/yun4.jsp?pid=sogou-brse-596dedf4498e258e&w=1366&v=1425&st=1411639842657&od=69&ls=1411565251431&lc=&lk=&sd=18&cd=0&kd=0&u=1411462102292095&y=FD86207B0EE8AF30FF1079CDFBF84E64&query=AWDC%20-%20%E9%98%BF%E9%87%8C%E4%BA%91%E5%BC%80%E5%8F%91%E8%80%85%E5%A4%A7%E4%BC%9A|http%3A%2F%2Fawdc.aliyun.com%2F&r=http%3A%2F%2Fweibo.com%2Fu%2F2330269092%2Fhome%3Fwvr%3D5%26c%3Dspr_qdhz_bd_baidusmt_weibo_s -->\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=GBK\">\n\n<title></title>\n\n\n<link href=\"btm.v.3.css\" rel=\"stylesheet\" type=\"text/css\">\n\n<link href=\"abtest1120.css\" rel=\"stylesheet\" type=\"text/css\">\n</head>\n<body sid=\"20\" hint=\"Ʊ˫ɫ###20###0\tԱװģ###20###0\tϷ###20###0\tֻ۸###20###0\t###20###0\t998Ϸ###20###0\t###20###0\t׿ֻϷ###20###0\tҹ˾###20###0\tܹ###20###0\" newwidth=\"239.4\">\n\t\n\t\t  \n\t\t  <div class=\"sogou-recommend\"><a target=\"_blank\" class=\"sogou-recommend-jump\" hidefocus=\"\" id=\"hint_b\" href=\"http://www.sogou.com/sogou?query=%B8%A3%C0%FB%B2%CA%C6%B1%CB%AB%C9%AB%C7%F2&pid=sogou-brse-596dedf4498e258e-12020\"></a> <a target=\"_blank\" class=\"sogou-recommend-logo-box\" id=\"hint_a\" href=\"http://www.sogou.com/sogou?query=%B8%A3%C0%FB%B2%CA%C6%B1%CB%AB%C9%AB%C7%F2&pid=sogou-brse-596dedf4498e258e-11020\"><span class=\"sogou-recommend-logo\"></span></a>\n\t      <span id=\"sogoutip\" style=\"display:none;\" title=\"300000,-1\">ѹ²⣬ʱܶݸȤ </span>\n\t\t  <ul class=\"sogou-recommend-list\">\n\t\t  \n\t\t  \n\t\t     \n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_0\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%B8%A3%C0%FB%B2%CA%C6%B1%CB%AB%C9%AB%C7%F2&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_0\">Ʊ˫ɫ\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_1\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%CC%D4%B1%A6%B5%EA%C6%CC%D7%B0%D0%DE%C4%A3%B0%E5&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_1\">Աװģ\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_2\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%D3%CE%CF%B7%BA%D0%D7%D3&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_2\">Ϸ\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_3\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%BA%EC%C3%D7%CA%D6%BB%FA%BC%DB%B8%F1&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_3\">ֻ۸\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_4\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%C1%D2%D1%E6&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_4\">\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_5\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=998%D3%CE%CF%B7&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_5\">998Ϸ\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_6\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%C1%AA%CF%EB&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_6\">\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_7\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%B0%B2%D7%BF%CA%D6%BB%FA%D3%CE%CF%B7&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_7\">׿ֻϷ\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_8\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%B0%E1%BC%D2%B9%AB%CB%BE&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_8\">ҹ˾\n\t\t</span></a></li>\n\t\t\t\n\t\t\n\n\n\n\n\n\t\t\n\t\t\t<li><a id=\"hint_9\" target=\"_blank\" href=\"http://www.sogou.com/sogou?query=%BC%D1%C4%DC%B9%D9%CD%F8&pid=sogou-brse-596dedf4498e258e-10020\"><span id=\"hint_text_9\">ܹ\n\t\t</span></a></li>\n\t\t\t\n\t</ul>\n\t   <span class=\"sogou-recommend-config\" id=\"bbconfig\"></span>\n\t  <span id=\"pan_style\" class=\"old\"></span>\n\t  <span class=\"sogou-recommend-close\" id=\"windowcloseit\" href=\"javascript:void(0)\"></span>\n\t  </div>\n\t  <script>\n\tdocument.getElementById('hint_a').href =\"http://www.sogou.com/sogou?query=%B8%A3%C0%FB%B2%CA%C6%B1%CB%AB%C9%AB%C7%F2&pid=sogou-brse-596dedf4498e258e-11020\";\n\tdocument.getElementById('hint_b').href =\"http://www.sogou.com/sogou?query=%B8%A3%C0%FB%B2%CA%C6%B1%CB%AB%C9%AB%C7%F2&pid=sogou-brse-596dedf4498e258e-12020\";\n</script>\n\t\n\n\n\n\n\n\n<script type=\"text/javascript\">\n\n    \n\tvar iploc = 'CN5000';\n\tvar remoteIP = '14.111.157.174';\n\tvar order = 69;\n\tvar uigs_para={\"abtestid\":\"9\",\"sceneid\":\"20\",\"uigs_productid\":\"webext\",\"uigs_pbtag\":\"A\",\"uigs_cookie\":\"SUID\",\"type\":\"ext_sugg\",\"v\":\"7112\",\"u\":\"1411462102292095\",\"hint_type\":\"20_20_20_20_20_20_20_20_20_20\",\"query\":\"AWDC - ƿߴ|http://awdc.aliyun.com/\",\"y\":\"FD86207B0EE8AF30FF1079CDFBF84E64\",\"SUV\":\"00EA59AC0E6F8D2453AE41FBC8F9E793\",\"rn\":\"10\",\"lt\":(new Date()).getTime()-1411639842657};\n\n\t\tuigs_para.ip = \"14.111.157.174\";\n\t\tuigs_para.ls = \"201409242127\";\n\t\tuigs_para.lc = \"\";\n\t\tuigs_para.lk = \"\";\n\t\tuigs_para.sd = \"18\";\n\t\tuigs_para.cd = \"0\";\n\t\tuigs_para.kd = \"0\";\t\n\t\tuigs_para.w = \"1366\";\n\t\tuigs_para.r = \"http://weibo.com/u/2330269092/home?wvr=5&c=spr_qdhz_bd_baidusmt_weibo_s\";\n\n(function(){\n\tvar close = document.getElementById(\"windowcloseit\");\n\tbind(close,\"click\", closePb);\n\tfunction bind(ele,evt,func){\n\t\tif(ele === null || evt === null || func === null){\n\t\t\treturn;\n\t\t}\n\t\tif(window.addEventListener){\n\t\t\tele.addEventListener(evt,func,false);\n\t\t}else if(window.attachEvent){\n\t\t\tele.attachEvent(\"on\" + evt,func);\n\t\t}else{\n\t\t\tele[\"on\" + evt] = func;\n\t\t}\n\t}\n\tfunction closePb(){\n\t\tvar url = \"http://pb.sogou.com/cl.gif\";\n\t\tvar urlparas = \"\";\n\t\tfor(var m in uigs_para){\n\t\t\turlparas += \"&\" + encodeURIComponent(m) + \"=\" + encodeURIComponent(uigs_para[m]);\n\t\t}\n\t\turlparas = urlparas.substring(1);\n\t\turl = url + \"?\" + urlparas + \"&act=close\";\n\t\tnew Image().src = url;\n\t}\n})();\n\t(function(type){\n\t\t//if (order > 4) {\n\t\t//\treturn;\n\t\t//}\n\t\tfunction animate(obj, property, start, end, step, interval) {\n\t\t\tif (step == 0 || !obj) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ((step > 0 && start >= end) ||(step < 0 && start <= end)) {\n\t\t\t\tobj.style[property] = end + \"px\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tobj.style[property] = start + step + \"px\";\n\t\t\tsetTimeout(function(){animate(obj, property, start + step, end, step, interval);}, interval);\n\t\t}\n\n\t\tvar sogoubtmbar = document.getElementById(\"sogoubtmbar\");\n\t\tif (type == 0) {\n\t\t\treturn;\n\t\t} else if (type == 1) {\n\t\t\tanimate(sogoubtmbar, \"bottom\", -38, 0, 1, 30);\n\t\t} else if (type == 2) {\n\t\t\tsogoubtmbar.style.visibility = \"hidden\";\n\t\t\tfunction run() {\n\t\t\t\tif (sogoubtmbar.offsetWidth > 0) {\n\t\t\t\t\tsogoubtmbar.style.visibility = \"\";\n\t\t\t\t\tanimate(sogoubtmbar, \"left\", sogoubtmbar.offsetWidth, 0, -sogoubtmbar.offsetWidth*20/1000, 20);\n\t\t\t\t} else {\n\t\t\t\t\tsetTimeout(run, 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\trun();\n\t\t}\n\t})(1);\n</script>\n<script type=\"text/javascript\" src=\"pb_v.0.0.js\"></script>\n \n\n<!--zly-->\n</body></html>"
  },
  {
    "path": "works/demo/ali/startmove.js",
    "content": "function startMove(obj, json, fnEnd) {\n\tif (obj.timer) {\n\t\tclearInterval(obj.timer);\n\t}\n\tobj.timer = setInterval(function() {\n\t\tdoMove(obj, json, fnEnd);\n\t}, 10);\n\n\tvar oDate = new Date();\n\n\tif (oDate.getTime() - obj.lastMove > 30) {\n\t\tdoMove(obj, json, fnEnd);\n\t}\n}\n\nfunction getStyle(obj, attr){\n\treturn obj.currentStyle?obj.currentStyle[attr]:getComputedStyle(obj, false)[attr];\n}\n\nfunction doMove(obj, json, fnEnd) {\n\tvar iCur = 0;\n\tvar attr = '';\n\tvar bStop = true; //假设运动已经该停止了\n\tfor (attr in json) {\n\t\tiCur = attr == 'opacity' ? parseInt(100 * parseFloat(getStyle(obj, 'opacity'))) : parseInt(getStyle(obj, attr));\n\t\tif (isNaN(iCur)) {\n\t\t\tiCur = 0;\n\t\t}\n\t\tvar iSpeed = (json[attr] - iCur) / 8;\n\t\tiSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);\n\t\tif (parseInt(json[attr]) != iCur) {\n\t\t\tbStop = false;\n\t\t}\n\t\tif (attr == 'opacity') {\n\t\t\tobj.style.filter = \"alpha(opacity:\" + (iCur + iSpeed) + \")\";\n\t\t\tobj.style.opacity = (iCur + iSpeed) / 100;\n\t\t} else {\n\t\t\tobj.style[attr] = iCur + iSpeed + 'px';\n\t\t}\n\t}\n\tif (bStop) {\n\t\tclearInterval(obj.timer);\n\t\tobj.timer = null;\n\n\t\tif (fnEnd) {\n\t\t\tfnEnd();\n\t\t}\n\t}\n\n\tobj.lastMove = (new Date()).getTime();\n}"
  },
  {
    "path": "works/demo/d3/d3.v3.js",
    "content": "!function() {\n  var d3 = {\n    version: \"3.4.13\"\n  };\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;\n  try {\n    d3_array(d3_documentElement.childNodes)[0].nodeType;\n  } catch (e) {\n    d3_array = function(list) {\n      var i = list.length, array = new Array(i);\n      while (i--) array[i] = list[i];\n      return array;\n    };\n  }\n  try {\n    d3_document.createElement(\"div\").style.setProperty(\"opacity\", 0, \"\");\n  } catch (error) {\n    var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n    d3_element_prototype.setAttribute = function(name, value) {\n      d3_element_setAttribute.call(this, name, value + \"\");\n    };\n    d3_element_prototype.setAttributeNS = function(space, local, value) {\n      d3_element_setAttributeNS.call(this, space, local, value + \"\");\n    };\n    d3_style_prototype.setProperty = function(name, value, priority) {\n      d3_style_setProperty.call(this, name, value + \"\", priority);\n    };\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = c = array[i]) != null && a <= a)) a = c = undefined;\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n && !((a = c = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  function d3_number(x) {\n    return x === null ? NaN : +x;\n  }\n  function d3_numeric(x) {\n    return !isNaN(x);\n  }\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n    }\n    return j ? s / j : undefined;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    var numbers = [], n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n    }\n    return numbers.length ? d3.quantile(numbers.sort(d3_ascending), .5) : undefined;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array) {\n    var m = array.length, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m], array[m] = array[i], array[i] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.zip = function() {\n    if (!(n = arguments.length)) return [];\n    for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {\n      for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {\n        zip[j] = arguments[j][i];\n      }\n    }\n    return zips;\n  };\n  function d3_zipLength(d) {\n    return d.length;\n  }\n  d3.transpose = function(matrix) {\n    return d3.zip.apply(d3, matrix);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    for (var key in properties) {\n      Object.defineProperty(ctor.prototype, key, {\n        value: properties[key],\n        enumerable: false\n      });\n    }\n  }\n  d3.map = function(object) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) object.forEach(function(key, value) {\n      map.set(key, value);\n    }); else for (var key in object) map.set(key, object[key]);\n    return map;\n  };\n  function d3_Map() {\n    this._ = Object.create(null);\n  }\n  var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this._[d3_map_escape(key)];\n    },\n    set: function(key, value) {\n      return this._[d3_map_escape(key)] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      for (var key in this._) values.push(this._[key]);\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      for (var key in this._) entries.push({\n        key: d3_map_unescape(key),\n        value: this._[key]\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n    }\n  });\n  function d3_map_escape(key) {\n    return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n  }\n  function d3_map_unescape(key) {\n    return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n  }\n  function d3_map_has(key) {\n    return d3_map_escape(key) in this._;\n  }\n  function d3_map_remove(key) {\n    return (key = d3_map_escape(key)) in this._ && delete this._[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    for (var key in this._) keys.push(d3_map_unescape(key));\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this._) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this._) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {\n    this._ = Object.create(null);\n  }\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(key) {\n      this._[d3_map_escape(key += \"\")] = true;\n      return key;\n    },\n    remove: d3_map_remove,\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key));\n    }\n  });\n  d3.behavior = {};\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.slice(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.slice(i + 1);\n      type = type.slice(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatcher = d3_documentElement.matches || d3_documentElement[d3_vendorSymbol(d3_documentElement, \"matchesSelector\")], d3_selectMatches = function(n, s) {\n    return d3_selectMatcher.call(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3_selectionRoot;\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: \"http://www.w3.org/1999/xhtml\",\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0) {\n        prefix = name.slice(0, i);\n        name = name.slice(i + 1);\n      }\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? function() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    } : function() {\n      return this.ownerDocument.createElementNS(this.namespaceURI, name);\n    };\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(function() {\n      var parent = this.parentNode;\n      if (parent) parent.removeChild(this);\n    });\n  };\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n        for (i = -1; ++i < n; ) {\n          if (nodeByKeyValue.has(keyValue = key.call(node = group[i], node.__data__, i))) {\n            exitNodes[i] = node;\n          } else {\n            nodeByKeyValue.set(keyValue, node);\n          }\n          keyValues[i] = keyValue;\n        }\n        for (i = -1; ++i < m; ) {\n          if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          } else if (node !== true) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          }\n          nodeByKeyValue.set(keyValue, true);\n        }\n        for (i = -1; ++i < n; ) {\n          if (nodeByKeyValue.get(keyValues[i]) !== true) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    d3_selection_each(this, function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3_selectionPrototype.transition = function() {\n    var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_selectionPrototype.interrupt = function() {\n    return this.each(d3_selection_interrupt);\n  };\n  function d3_selection_interrupt() {\n    var lock = this.__transition__;\n    if (lock) ++lock.active;\n  }\n  d3.select = function(node) {\n    var group = [ typeof node === \"string\" ? d3_select(node, d3_document) : node ];\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group = d3_array(typeof nodes === \"string\" ? d3_selectAll(nodes, d3_document) : nodes);\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  var d3_selectionRoot = d3.select(d3_documentElement);\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.slice(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  d3_selection_onFilters.forEach(function(k) {\n    if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n  });\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect = \"onselectstart\" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, \"userSelect\"), d3_event_dragId = 0;\n  function d3_event_dragSuppress() {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement.style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        function off() {\n          w.on(click, null);\n        }\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {\n        svg = d3.select(\"body\").append(\"svg\").style({\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          margin: 0,\n          padding: 0,\n          border: \"none\"\n        }, \"important\");\n        var ctm = svg[0][0].getScreenCTM();\n        d3_mouse_bug44083 = !(ctm.f || ctm.e);\n        svg.remove();\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_behavior_dragMouseSubject, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_behavior_dragTouchSubject, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject()).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged && d3.event.target === target);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  function d3_behavior_dragTouchSubject() {\n    return d3.event.target;\n  }\n  function d3_behavior_dragMouseSubject() {\n    return d3_window;\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  var π = Math.PI, τ = 2 * π, halfπ = π / 2, ε = 1e-6, ε2 = ε * ε, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];\n    var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;\n    function interpolate(t) {\n      var s = t * S;\n      if (dr) {\n        var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      }\n      return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];\n    }\n    interpolate.duration = S * 1e3;\n    return interpolate;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = dx / 2, cy = dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: +_\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      dispatch({\n        type: \"zoomend\"\n      });\n    }\n    function mousedowned() {\n      var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged && d3.event.target === target);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(that);\n      started();\n      zoomstarted(dispatch);\n      subject.on(mousedown, null).on(touchstart, started);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0], l = locations0[p.identifier];\n            scaleTo(view.k * 2);\n            translateTo(p, l);\n            d3_eventPreventDefault();\n            zoomed(dispatch);\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)), \n      d3_selection_interrupt.call(this), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var dispatch = event.of(this, arguments), p = d3.mouse(this), l = location(p), k = Math.log(view.k) / Math.LN2;\n      zoomstarted(dispatch);\n      scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));\n      translateTo(p, l);\n      zoomed(dispatch);\n      zoomended(dispatch);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ];\n  var d3_behavior_zoomDelta, d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n  }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return d3.event.wheelDelta;\n  }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n    return -d3.event.detail;\n  }, \"MozMousePixelScroll\");\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/i.exec(format);\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  function d3_identity(d) {\n    return d;\n  }\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (d3_window.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  function d3_xhrHasResponse(request) {\n    var type = request.responseType;\n    return type && type !== \"text\" ? request.response : request.responseText;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.slice(j, I - k);\n        }\n        return text.slice(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && (a = f(a, n++)) == null) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      f: false,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  };\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now();\n    d3_timer_active = d3_timer_queueHead;\n    while (d3_timer_active) {\n      if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);\n      d3_timer_active = d3_timer_active.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.f) {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      } else {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n      while (i > 0 && g > 0) {\n        if (length + g + 1 > width) g = Math.max(1, width - length);\n        t.push(value.substring(i -= g, i + g));\n        if ((length += g + 1) > width) break;\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n        exponent = false;\n\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before, after;\n        if (i < 0) {\n          var j = exponent ? value.lastIndexOf(\"e\") : -1;\n          if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n        } else {\n          before = value.substring(0, i);\n          after = locale_decimal + value.substring(i + 1);\n        }\n        if (!zfill && comma) before = formatGroup(before, Infinity);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.slice(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.slice(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"w\" in d && (\"W\" in d || \"U\" in d)) {\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = x >= sx, bottom = y >= sy, i = (bottom << 1) + right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = sx; else x2 = sx;\n        if (bottom) y1 = sy; else y2 = sy;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    a = +a, b = +b;\n    return function(t) {\n      return a * (1 - t) + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.slice(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.slice(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b) || /^(#|rgb\\(|hsl\\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;\n    if (ta[0] != tb[0] || ta[1] != tb[1]) {\n      s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: 1,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: 3,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    } else {\n      s.push(\"\");\n    }\n    if (ra != rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(s.pop() + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(s.pop() + \"rotate(\" + rb + \")\");\n    }\n    if (wa != wb) {\n      q.push({\n        i: s.push(s.pop() + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(s.pop() + \"skewX(\" + wb + \")\");\n    }\n    if (ka[0] != kb[0] || ka[1] != kb[1]) {\n      n = s.push(s.pop() + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: n - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: n - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] != 1 || kb[1] != 1) {\n      s.push(s.pop() + \"scale(\" + kb + \")\");\n    }\n    n = q.length;\n    return function(t) {\n      var i = -1, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return (x - a) / b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) / b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: (x - x0) / k\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight / (t.weight + s.weight));\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) alpha = x; else alpha = 0;\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        d3.timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, m = candidates.length, x;\n        while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ;\n    function pie(data) {\n      var values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      });\n      var a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle);\n      var k = ((typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a) / d3.sum(values);\n      var index = d3.range(data.length);\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      var arcs = [];\n      index.forEach(function(i) {\n        var d;\n        arcs[i] = {\n          data: data[i],\n          value: d = values[i],\n          startAngle: a,\n          endAngle: a += d * k\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return pie;\n    };\n    pie.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return pie;\n    };\n    pie.startAngle = function(x) {\n      if (!arguments.length) return startAngle;\n      startAngle = x;\n      return pie;\n    };\n    pie.endAngle = function(x) {\n      if (!arguments.length) return endAngle;\n      endAngle = x;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      if (!(n = data.length)) return data;\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var m = series[0].length, n, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = 0;\n      root.y = 0;\n      root.dx = size[0];\n      root.dy = size[1];\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12, \n      Math.floor), e;\n      return function(d) {\n        return d / pow(f(log(d) + e)) <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);\n      range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;\n      range = steps(start + Math.round(error / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function arc() {\n      var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0, \n      a0 = a1, a1 = da), a1 - a0), df = da < π ? \"0\" : \"1\", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1);\n      return da >= d3_svg_arcMax ? r0 ? \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"M0,\" + r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + -r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + r0 + \"Z\" : \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"Z\" : r0 ? \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L\" + r0 * c1 + \",\" + r0 * s1 + \"A\" + r0 + \",\" + r0 + \" 0 \" + df + \",0 \" + r0 * c0 + \",\" + r0 * s0 + \"Z\" : \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L0,0\" + \"Z\";\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcOffset = -halfπ, d3_svg_arcMax = τ - ε;\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.join(\"L\");\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return d3_svg_lineLinear(points) + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] + d3_svg_arcOffset;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  function d3_transition(groups, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection) {\n    return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition();\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, id, node.__transition__[id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node.__transition__[id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id;\n    if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node.__transition__[id].tween.remove(name);\n    } : function(node) {\n      node.__transition__[id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node.__transition__[id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this.__transition__.count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node.__transition__[id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node.__transition__[id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node.__transition__[id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      d3_transitionInheritId = id;\n      d3_selection_each(this, function(node, i, j) {\n        d3_transitionInherit = node.__transition__[id];\n        type.call(node, node.__data__, i, j);\n      });\n      d3_transitionInherit = inherit;\n      d3_transitionInheritId = inheritId;\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node.__transition__[id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = Object.create(node.__transition__[id0]);\n          transition.delay += transition.duration;\n          d3_transitionNode(node, i, id1, transition);\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id1);\n  };\n  function d3_transitionNode(node, i, id, inherit) {\n    var lock = node.__transition__ || (node.__transition__ = {\n      active: 0,\n      count: 0\n    }), transition = lock[id];\n    if (!transition) {\n      var time = inherit.time;\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        ease: inherit.ease,\n        delay: inherit.delay,\n        duration: inherit.duration\n      };\n      ++lock.count;\n      d3.timer(function(elapsed) {\n        var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, timer = d3_timer_active, tweened = [];\n        timer.t = delay + time;\n        if (delay <= elapsed) return start(elapsed - delay);\n        timer.c = start;\n        function start(elapsed) {\n          if (lock.active > id) return stop();\n          lock.active = id;\n          transition.event && transition.event.start.call(node, d, i);\n          transition.tween.forEach(function(key, value) {\n            if (value = value.call(node, d, i)) {\n              tweened.push(value);\n            }\n          });\n          d3.timer(function() {\n            timer.c = tick(elapsed || 1) ? d3_true : tick;\n            return 1;\n          }, 0, time);\n        }\n        function tick(elapsed) {\n          if (lock.active !== id) return stop();\n          var t = elapsed / duration, e = ease(t), n = tweened.length;\n          while (n > 0) {\n            tweened[--n].call(node, e);\n          }\n          if (t >= 1) {\n            transition.event && transition.event.end.call(node, d, i);\n            return stop();\n          }\n        }\n        function stop() {\n          if (--lock.count) delete lock[id]; else delete node.__transition__;\n          return 1;\n        }\n      }, 0, time);\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n        if (orient === \"bottom\" || orient === \"top\") {\n          tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n          text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n          pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n        } else {\n          tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n          text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n          pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n        }\n        lineEnter.attr(y2, sign * innerTickSize);\n        textEnter.attr(y1, sign * tickSpacing);\n        lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n        textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1, scale0);\n        }\n        tickEnter.call(tickTransform, scale0, scale1);\n        tickUpdate.call(tickTransform, scale1, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = arguments;\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x0, x1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = x0(d);\n      return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y0, y1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = y0(d);\n      return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (typeof define === \"function\" && define.amd) define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3;\n  this.d3 = d3;\n}();"
  },
  {
    "path": "works/demo/d3/新建文本文档.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<meta charset=\"UTF-8\">\n\t<title>d3</title>\n\t<style>\n\t\t#contianer {\n\t\t\twidth: 500px;\n\t\t\theight: 250px;\n\t\t\tbackground: #ccc;\n\t\t}\n\t</style>\n\t<script src=\"d3.v3.js\"></script>\n</head>\n<body>\n\t<div id=\"contianer\"></div>\n\t<script>\n\t\tvar data = [1,3,5,7,8,3,1],\n\t\t\twidth = 500,\n\t\t\theight = 250,\n\t\t\tposition = {\n\t\t\t\ttop : 30,\n\t\t\t\tright : 20,\n\t\t\t\tbottom : 20,\n\t\t\t\tleft : 50\n\t\t\t}\n\t\t\t;\n\t\tvar svg = d3.select('#contianer').append('svg:svg')\n\t\t\t.attr({'width':width,'height':height}),\n\t\t\tg = svg.append('g').attr('transform', 'translate('+position.left+','+position.top+')');\n\n\t\tvar g_width = width - position.left - position.right,g_height = height - position.top - position.bottom;\n\n\t\tvar scaleX = d3.scale.linear().domain([0, data.length-1]).range([0, g_width]),\n\t\t\tscaleY = d3.scale.linear().domain(d3.max(data)).range([0, g_height]);\n\n\t\tvar  line_generator = d3.svg.line()\n\t\t.x(function(d, i) {\n\t\t\treturn scaleX(i);\n\t\t})\n\t\t.y(function(d) {\n\t\t\treturn scaleY(d);\n\t\t})\n\n\t\tg.append('path').attr('d', line_generator(data));\n\t\t\n\t\t\n\t</script>\n</body>\n</html>"
  },
  {
    "path": "works/demo/ee/index.htm",
    "content": "\n<!-- saved from url=(0058)http://strut.io/editor/preview_export/impress.html#/step-1 -->\n<html style=\"height: 100%;\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, minimum-scale=1, maximum-scale=1, user-scalable=no\">\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\">\n<title>软件工程创新实验室宣传</title>\n\n<meta name=\"description\" content=\"TODO\">\n<meta name=\"author\" content=\"TODO\">\n\n<style>\n.componentContainer {\n    position: absolute;\n    line-height: normal;\n    /*-webkit-transform-origin: 135% 135%;\n    -moz-transform-origin: 135% 135%;\n    transform-origin: 135% 135%;*/\n}\n\n.transformContainer {\n    -webkit-transform-origin: 0 0;\n    -moz-transform-origin: 0 0;\n    transform-origin: 0 0;\n}\n\n.bg {\n    width: 100%;\n    height: 100%;\n}\n</style>\n\n<link rel=\"stylesheet\" href=\"./index_files/default-reset.css\">\n<link href=\"./index_files/main.css\" rel=\"stylesheet\" type=\"text/css\">\n<link rel=\"stylesheet\" href=\"./index_files/efault.css\" id=\"theme\">\n<link href=\"./index_files/web-fonts.css\" rel=\"stylesheet\" type=\"text/css\">\n<link href=\"./index_files/backgroundClasses.css\" rel=\"stylesheet\" type=\"text/css\">\n<link href=\"./index_files/surfaceClasses.css\" rel=\"stylesheet\" type=\"text/css\">\n<style>\n.reveal.themedArea {\n    display: block;\n    position: absolute;\n    top: 0px;\n    left: 0px;\n    z-index: 0;\n    width: 100%;\n    height: 100%;\n}\n</style>\n\n<script async=\"\" src=\"./index_files/analytics.js\"></script><script type=\"text/javascript\" src=\"./index_files/dataset-shim.js\"></script><style type=\"text/css\"></style>\n<script type=\"text/javascript\" src=\"./index_files/impress.js\"></script>\n\n<script src=\"./index_files/onready.js\"></script>\n<script src=\"./index_files/loadPresentation.js\"></script>\n<script>\nready(function() {\n    if (document.getElementById('launched-placeholder'))\n        loadPresentation();\n\n    if (!window.presStarted) {\n        startPres(document, window);\n        impress().init();   \n    }\n\n    if (\"ontouchstart\" in document.documentElement) { \n        document.querySelector(\".hint\").innerHTML = \n            \"<p>Tap on the left or right to navigate</p>\";\n    }\n});\n</script>\n<script>\n    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n    })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');\n\n    ga('create', 'UA-42322531-1', 'strut.io');\n    ga('send', 'pageview');\n    </script>\n</head>\n<body class=\"impress-supported impress-enabled\" style=\"height: 100%; overflow: hidden;\">\n\n<!-- This is a work around / hack to get the user's browser to download the fonts \n if they decide to save the presentation. -->\n<div style=\"visibility: hidden; width: 0px; height: 0px\">\n<img src=\"./index_files/Lato-Bold.woff\">\n<img src=\"./index_files/HammersmithOne.woff\">\n<img src=\"./index_files/Droid-Sans-Mono.woff\">\n<img src=\"./index_files/Gorditas-Regular.woff\">\n<img src=\"./index_files/FredokaOne-Regular.woff\">\n<img src=\"./index_files/Ubuntu.woff\">\n<img src=\"./index_files/Ubuntu-Bold.woff\">\n<img src=\"./index_files/PressStart2P-Regular.woff\">\n<img src=\"./index_files/Lato-BoldItalic.woff\">\n<img src=\"./index_files/AbrilFatface-Regular.woff\">\n<img src=\"./index_files/Lato-Regular.woff\">\n</div>\n\n<div class=\"fallback-message\">\n    <p>Your browser <b>doesn't support the features required</b> by impress.js, so you are presented with a simplified version of this presentation.</p>\n    <p>For the best experience please use the latest <b>Chrome</b>, <b>Safari</b> or <b>Firefox</b> browser.</p>\n</div>\n\n<div class=\"bg  strut-surface\">\n<div class=\"bg innerBg strut-slide-0\">\n<div id=\"impress\" style=\"position: absolute; transform-origin: left top 0px; transition: all 500ms ease-in-out 250ms; -webkit-transition: all 500ms ease-in-out 250ms; transform-style: preserve-3d; top: 50%; left: 50%; transform: perspective(3859.2964824120604px) scale(0.2591145833333333);\"><div style=\"position: absolute; transform-origin: left top 0px; transition: all 500ms ease-in-out 0ms; -webkit-transition: all 500ms ease-in-out 0ms; transform-style: preserve-3d; transform: rotateZ(0deg) rotateY(0deg) rotateX(0deg) translate3d(-2457.6px, -2764.8px, 0px);\">\n\t\n\t\t\n\t\t\t<div class=\"step present active\" data-state=\"strut-slide-0\" data-x=\"2457.6\" data-y=\"2764.8\" data-scale=\"3\" id=\"step-1\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(2457.6px, 2764.8px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-0\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 182px; left: 57px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font><b>软件工程创新实验室宣传</b></font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 529px; left: 695px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font>王兴龙</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 612px; left: 609px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-1\" data-x=\"1665.7066666666667\" data-y=\"6958.08\" data-rotate-z=\"6.875493541569878\" data-scale=\"3\" id=\"step-2\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(1665.7066666666667px, 6958.08px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(6.875493541569878deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-1\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 107px; left: 88px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<img src=\"./index_files/48m4bEs.png\">\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 181px; left: 400px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font>期盼已久的大学生活终于开始了</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 468px; left: 96px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 48px;\" class=\"antialias\">\n<font>接下来是改怎样支配突然多出来的时间呢？</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 552px; left: 24px; -webkit-transform: rotate(-0.37rad)  ; -moz-transform: rotate(-0.37rad)  ; transform: rotate(-0.37rad)  ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-2\" data-x=\"10103.466666666667\" data-y=\"2764.8\" data-rotate-y=\"22.91831180523293\" data-z=\"100\" data-scale=\"3\" id=\"step-3\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(10103.466666666667px, 2764.8px, 100px) rotateX(0deg) rotateY(22.91831180523293deg) rotateZ(0deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-2\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 90px; left: 85px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n在寝室做一个 安静的美男子？<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 149px; left: 668px; -webkit-transform: rotate(0.24rad)  ; -moz-transform: rotate(0.24rad)  ; transform: rotate(0.24rad)  ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font>网吧开黑？</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 321px; left: 49px; -webkit-transform: rotate(-0.15rad)  ; -moz-transform: rotate(-0.15rad)  ; transform: rotate(-0.15rad)  ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n和以前一样，天天晚上上自习， 达到理工学霸的尖峰？<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 420px; left: 498px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<img src=\"./index_files/pfuQYqp.png\">\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-3\" data-x=\"6362.453333333333\" data-y=\"6773.76\" data-rotate-x=\"-21.772396214971284\" data-rotate-y=\"17.188733853924695\" data-rotate-z=\"-1.7188733853924696\" data-z=\"40\" data-scale=\"3\" id=\"step-4\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(6362.453333333333px, 6773.76px, 40px) rotateX(-21.772396214971284deg) rotateY(17.188733853924695deg) rotateZ(-1.7188733853924696deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-3\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 111px; left: 111px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font>或许你还有一个选择。。</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 276px; left: 194px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font>讲学到的专业知识运用到真实的工作环境中去！</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 378px; left: 89px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<img src=\"./index_files/nSAM2Ub.png\">\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-4\" data-x=\"14895.786666666667\" data-y=\"2380.8\" data-rotate-x=\"-33.231552117587746\" data-z=\"10\" data-scale=\"3\" id=\"step-5\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(14895.786666666667px, 2380.8px, 10px) rotateX(-33.231552117587746deg) rotateY(0deg) rotateZ(0deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-4\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 84px; left: 97px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font><b>期待你们来到这个大家庭</b></font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 335px; left: 147px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>软件工程创新实验室！</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 448px; left: 308px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<img src=\"./index_files/aWbD65Y.png\">\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-5\" data-x=\"6348.8\" data-y=\"2856.96\" data-rotate-z=\"-8.021409131831525\" data-scale=\"3\" id=\"step-6\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(6348.8px, 2856.96px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(-8.021409131831525deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-5\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 109px; left: 97px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>科委项目申报系统</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 256px; left: 341.33px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n道路救援系统<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 410px; left: 99px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>泛教育门户网站</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 587px; left: 368px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>More...</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-6\" data-x=\"16042.666666666666\" data-y=\"5990.4\" data-scale=\"3\" id=\"step-7\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(16042.666666666666px, 5990.4px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-6\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 133px; left: 116px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n真实的工作环境<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 306px; left: 416px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>扎实的专业技能</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 490px; left: 108px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>还有一群好基友。。</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-7\" data-x=\"11291.306666666667\" data-y=\"6819.84\" data-scale=\"3\" id=\"step-8\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(11291.306666666667px, 6819.84px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-7\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 91px; left: 60px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>良好的积极沟通</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 256px; left: 341.33px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 72px;\" class=\"antialias\">\n<font>学习新技术的能力</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 386px; left: 81px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 48px;\" class=\"antialias\">\n<font>需求分析能力</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 463px; left: 490px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 48px;\" class=\"antialias\">\n<font>解决问题能力</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-8\" data-x=\"33041.066666666666\" data-y=\"7065.6\" data-scale=\"3\" id=\"step-9\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(33041.066666666666px, 7065.6px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-8\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 120px; left: 104px; -webkit-transform: rotate(-0.23rad)  ; -moz-transform: rotate(-0.23rad)  ; transform: rotate(-0.23rad)  ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 48px;\" class=\"antialias\">\n只要你踏实、肯干<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 188px; left: 632px; -webkit-transform: rotate(0.57rad)  ; -moz-transform: rotate(0.57rad)  ; transform: rotate(0.57rad)  ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 48px;\" class=\"antialias\">\n只要你乐于分享<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 554px; left: 274px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 64px;\" class=\"antialias\">\n<font><b>来吧！加入我们吧！</b></font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 373px; left: 194px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font>只要你愿意在实际工作中展现自己的能力</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t\t\n\t\t\t<div class=\"step future\" data-state=\"strut-slide-9\" data-x=\"36864\" data-y=\"7065.6\" data-scale=\"3\" id=\"step-10\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(36864px, 7065.6px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg) scale(3); transform-style: preserve-3d;\">\n\t\t\t<div class=\" slideContainer strut-slide-9\" style=\"width: 1024px; height: 768px;\">\n\t\t\t<div class=\"themedArea\">\n\t\t\t\n\t\t\t</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 46px; left: 67px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font><b>送给大家的话：</b></font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 220px; left: 239px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n<font>不要在最该努力的时候选择安逸</font>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t<div class=\"componentContainer \" style=\"top: 421px; left: 282px; -webkit-transform:   ; -moz-transform:   ; transform:   ; width: px; height: px;\">\n<div class=\"transformContainer\" style=\"-webkit-transform: scale(1, 1);\n-moz-transform: scale(1, 1);\ntransform: scale(1, 1)\">\n<div style=\"font-size: 36px;\" class=\"antialias\">\n不被嘲笑的梦想，没有实现的价值<br>\n</div>\n</div>\n</div>\n\t\t\t\n\t\t\t</div>\n\t\t\n\t\t</div>\n\t\n\t<div id=\"overview\" class=\"step future\" data-state=\"strut-slide-overview\" data-x=\"17353.386666666665\" data-y=\"4723.2\" data-scale=\"9\" style=\"position: absolute; transform: translate(-50%, -50%) translate3d(17353.386666666665px, 4723.2px, 0px) rotateX(0deg) rotateY(0deg) rotateZ(0deg) scale(9); transform-style: preserve-3d;\"></div>\n\t\n</div></div>\n<div class=\"hint\">\n    <p>Use a spacebar or arrow keys to navigate</p>\n</div>\n</div>\n</div></body></html>"
  },
  {
    "path": "works/demo/ee/index_files/analytics.js",
    "content": "(function(){var aa=encodeURIComponent,f=window,ba=setTimeout,n=Math;function Pc(a,b){return a.href=b}function fa(a,b){return a.name=b}\nvar Qc=\"replace\",q=\"data\",m=\"match\",xc=\"send\",ja=\"port\",u=\"createElement\",id=\"setAttribute\",da=\"getTime\",x=\"host\",A=\"split\",B=\"location\",ra=\"hasOwnProperty\",ma=\"hostname\",ga=\"search\",E=\"protocol\",Ab=\"href\",kd=\"action\",G=\"apply\",p=\"push\",h=\"hash\",s=\"test\",ha=\"slice\",r=\"cookie\",t=\"indexOf\",ia=\"defaultValue\",v=\"name\",y=\"length\",z=\"prototype\",la=\"clientWidth\",jd=\"target\",C=\"call\",na=\"clientHeight\",F=\"substring\",oa=\"navigator\",Ub=\"parentNode\",H=\"join\",I=\"toLowerCase\";var pa=new function(){var a=[];this.set=function(b){a[b]=!0};this.M=function(){for(var b=[],c=0;c<a[y];c++)a[c]&&(b[n.floor(c/6)]=b[n.floor(c/6)]^1<<c%6);for(c=0;c<b[y];c++)b[c]=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\".charAt(b[c]||0);return b[H](\"\")+\"~\"}};function J(a){pa.set(a)};function K(a){return\"function\"==typeof a}function vd(a){return\"[object Array]\"==Object[z].toString[C](Object(a))}function qa(a){return void 0!=a&&-1<(a.constructor+\"\")[t](\"String\")}function ea(a,b){return 0==a[t](b)}function Lc(a){return a?a[Qc](/^[\\s\\xa0]+|[\\s\\xa0]+$/g,\"\"):\"\"}function Td(){return[Ud()^Mc()&2147483647,n.round((new Date)[da]()/1E3)][H](\".\")}function Ca(a){var b=M[u](\"img\");b.width=1;b.height=1;b.src=a;return b}function L(){}\nfunction sa(a){if(aa instanceof Function)return aa(a);J(28);return a}function ka(a){return sa(a)[Qc](/\\(/g,\"%28\")[Qc](/\\)/g,\"%29\")}var ta=function(a,b,c,d){try{a.addEventListener?a.addEventListener(b,c,!!d):a.attachEvent&&a.attachEvent(\"on\"+b,c)}catch(e){J(27)}},ua=function(a,b,c){a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent(\"on\"+b,c)};\nfunction vc(a,b){if(a){var c=M[u](\"script\");c.type=\"text/javascript\";c.async=!0;c.src=a;c.id=b;var d=M.getElementsByTagName(\"script\")[0];d[Ub].insertBefore(c,d)}}function D(){return Ba||\"https:\"==M[B][E]?\"https:\":\"http:\"}function eb(){var a=\"\"+M[B][ma];return 0==a[t](\"www.\")?a[F](4):a}function va(a){var b=M.referrer;if(/^https?:\\/\\//i[s](b)){if(a)return b;a=\"//\"+M[B][ma];var c=b[t](a);if(5==c||6==c)if(a=b.charAt(c+a[y]),\"/\"==a||\"?\"==a||\"\"==a||\":\"==a)return;return b}}\nfunction wa(a,b){if(1==b[y]&&null!=b[0]&&\"object\"===typeof b[0])return b[0];for(var c={},d=n.min(a[y]+1,b[y]),e=0;e<d;e++)if(\"object\"===typeof b[e]){for(var g in b[e])b[e][ra](g)&&(c[g]=b[e][g]);break}else e<a[y]&&(c[a[e]]=b[e]);return c};var N=function(){this.keys=[];this.w={};this.m={}};N[z].set=function(a,b,c){this.keys[p](a);c?this.m[\":\"+a]=b:this.w[\":\"+a]=b};N[z].get=function(a){return this.m[ra](\":\"+a)?this.m[\":\"+a]:this.w[\":\"+a]};N[z].map=function(a){for(var b=0;b<this.keys[y];b++){var c=this.keys[b],d=this.get(c);d&&a(c,d)}};var O=f,M=document,xa=function(a){var b=O._gaUserPrefs;if(b&&b.ioo&&b.ioo()||a&&!0===O[\"ga-disable-\"+a])return!0;try{var c=O.external;if(c&&c._gaUserPrefs&&\"oo\"==c._gaUserPrefs)return!0}catch(d){}return!1},fb=function(a){ba(a,100)},ya=function(a){var b=[],c=M[r][A](\";\");a=new RegExp(\"^\\\\s*\"+a+\"=\\\\s*(.*?)\\\\s*$\");for(var d=0;d<c[y];d++){var e=c[d][m](a);e&&b[p](e[1])}return b},zc=function(a,b,c,d,e,g){e=xa(e)?!1:Aa[s](M[B][ma])||\"/\"==c&&za[s](d)?!1:!0;if(!e)return!1;b&&1200<b[y]&&(b=b[F](0,1200),J(24));\nc=a+\"=\"+b+\"; path=\"+c+\"; \";g&&(c+=\"expires=\"+(new Date((new Date)[da]()+g)).toGMTString()+\"; \");d&&\"none\"!=d&&(c+=\"domain=\"+d+\";\");d=M[r];M.cookie=c;if(!(d=d!=M[r]))t:{a=ya(a);for(d=0;d<a[y];d++)if(b==a[d]){d=!0;break t}d=!1}return d},za=new RegExp(/^(www\\.)?google(\\.com?)?(\\.[a-z]{2})?$/),Aa=new RegExp(/(^|\\.)doubleclick\\.net$/i),Mc=function(){for(var a=O[oa].userAgent+(M[r]?M[r]:\"\")+(M.referrer?M.referrer:\"\"),b=a[y],c=O.history[y];0<c;)a+=c--^b++;return La(a)};var oc=function(){return D()+\"//www.google-analytics.com\"},Da=function(a){fa(this,\"len\");this.message=a+\"-8192\"},Ea=function(a){fa(this,\"ff2post\");this.message=a+\"-2036\"},Ga=function(a,b,c,d){c=c||L;d&&(d=c,O[oa].sendBeacon?O[oa].sendBeacon(a,b)?(d(),d=!0):d=!1:d=!1);if(!d)if(2036>=b[y])wc(a,b,c);else if(8192>=b[y]){if(0<=O[oa].userAgent[t](\"Firefox\")&&![].reduce)throw new Ea(b[y]);wd(a,b,c)||xd(a,b,c)||Fa(b,c)||c()}else throw new Da(b[y]);},wc=function(a,b,c){var d=Ca(a+\"?\"+b);d.onload=d.onerror=\nfunction(){d.onload=null;d.onerror=null;c()}},xd=function(a,b,c){var d;d=O.XDomainRequest;if(!d)return!1;d=new d;d.open(\"POST\",a);d.onerror=function(){c()};d.onload=c;d[xc](b);return!0},wd=function(a,b,c){var d=O.XMLHttpRequest;if(!d)return!1;var e=new d;if(!(\"withCredentials\"in e))return!1;e.open(\"POST\",a,!0);e.withCredentials=!0;e.setRequestHeader(\"Content-Type\",\"text/plain\");e.onreadystatechange=function(){4==e.readyState&&(c(),e=null)};e[xc](b);return!0},Fa=function(a,b){if(!M.body)return fb(function(){Fa(a,\nb)}),!0;a=aa(a);try{var c=M[u]('<iframe name=\"'+a+'\"></iframe>')}catch(d){c=M[u](\"iframe\"),fa(c,a)}c.height=\"0\";c.width=\"0\";c.style.display=\"none\";c.style.visibility=\"hidden\";var e=M[B],e=oc()+\"/analytics_iframe.html#\"+aa(e[E]+\"//\"+e[x]+\"/favicon.ico\"),g=function(){c.src=\"\";c[Ub]&&c[Ub].removeChild(c)};ta(O,\"beforeunload\",g);var ca=!1,l=0,k=function(){if(!ca){try{if(9<l||c.contentWindow[B][x]==M[B][x]){ca=!0;g();ua(O,\"beforeunload\",g);b();return}}catch(a){}l++;ba(k,200)}};ta(c,\"load\",k);M.body.appendChild(c);\nc.src=e;return!0};var Ha=function(){this.t=[]};Ha[z].add=function(a){this.t[p](a)};Ha[z].D=function(a){try{for(var b=0;b<this.t[y];b++){var c=a.get(this.t[b]);c&&K(c)&&c[C](O,a)}}catch(d){}b=a.get(Ia);b!=L&&K(b)&&(a.set(Ia,L,!0),ba(b,10))};function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw\"abort\";}function Ma(a){if(xa(P(a,Na)))throw\"abort\";}function Oa(){var a=M[B][E];if(\"http:\"!=a&&\"https:\"!=a)throw\"abort\";}\nfunction Pa(a){try{O.XMLHttpRequest&&\"withCredentials\"in new O.XMLHttpRequest?J(40):O.XDomainRequest&&J(41),O[oa].sendBeacon&&J(42)}catch(b){}a.set(Ac,R(a,Ac)+1);var c=[];Qa.map(function(b,d){if(d.p){var e=a.get(b);void 0!=e&&e!=d[ia]&&(\"boolean\"==typeof e&&(e*=1),c[p](d.p+\"=\"+sa(\"\"+e)))}});if(Ed(new Od(1E4))){var d=[];d[p](hd());d[p][G](d,Td()[A](\".\"));d[p](Bd());var e;e=O.crypto?!0:!1;d[p](e?\"c\":\"b\");c[p](\"z=\"+d[H](\".\"))}else c[p](\"z=\"+Bd());a.set(Ra,c[H](\"&\"),!0)}\nfunction Sa(a){var b=P(a,gd)||oc()+\"/collect\";Ga(b,P(a,Ra),a.get(Ia),a.get(Vd));a.set(Ia,L,!0)}function Hc(a){var b=O.gaData;b&&(b.expId&&a.set(Nc,b.expId),b.expVar&&a.set(Oc,b.expVar))}function cd(){if(O[oa]&&\"preview\"==O[oa].loadPurpose)throw\"abort\";}function yd(a){var b=O.gaDevIds;vd(b)&&0!=b[y]&&a.set(\"&did\",b[H](\",\"),!0)}function vb(a){if(!a.get(Na))throw\"abort\";};var hd=function(){return n.round(2147483647*n.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}},Ud=hd;function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if(\"transaction\"!=c&&\"item\"!=c){var c=R(a,Wa),d=(new Date)[da](),e=R(a,Xa);0==e&&a.set(Xa,d);e=n.round(2*(d-e)/1E3);0<e&&(c=n.min(c+e,20),a.set(Xa,d));if(0>=c)throw\"abort\";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new N},Qa=new N,Za=[];Ya[z].get=function(a){var b=$a(a),c=this[q].get(a);b&&void 0==c&&(c=K(b[ia])?b[ia]():b[ia]);return b&&b.n?b.n(this,a,c):c};var P=function(a,b){var c=a.get(b);return void 0==c?\"\":\"\"+c},R=function(a,b){var c=a.get(b);return void 0==c||\"\"===c?0:1*c};Ya[z].set=function(a,b,c){if(a)if(\"object\"==typeof a)for(var d in a)a[ra](d)&&ab(this,d,a[d],c);else ab(this,a,b,c)};\nvar ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb[s](c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a[q].set(b,c,d)},bb=function(a,b,c,d,e){fa(this,a);this.p=b;this.n=d;this.o=e;this.defaultValue=c},$a=function(a){var b=Qa.get(a);if(!b)for(var c=0;c<Za[y];c++){var d=Za[c],e=d[0].exec(a);if(e){b=d[1](e);Qa.set(b[v],b);break}}return b},yc=function(a){var b;Qa.map(function(c,d){d.p==a&&(b=d)});return b&&b[v]},S=function(a,b,c,d,e){a=new bb(a,b,c,d,e);Qa.set(a[v],a);return a[v]},cb=function(a,b){Za[p]([new RegExp(\"^\"+\na+\"$\"),b])},T=function(a,b,c){return S(a,b,c,void 0,db)},db=function(){};var gb=qa(f.GoogleAnalyticsObject)&&Lc(f.GoogleAnalyticsObject)||\"ga\",Ba=!1,hb=T(\"apiVersion\",\"v\"),ib=T(\"clientVersion\",\"_v\");S(\"anonymizeIp\",\"aip\");var jb=S(\"adSenseId\",\"a\"),Va=S(\"hitType\",\"t\"),Ia=S(\"hitCallback\"),Ra=S(\"hitPayload\");S(\"nonInteraction\",\"ni\");S(\"currencyCode\",\"cu\");var Vd=S(\"useBeacon\",void 0,!1);S(\"dataSource\",\"ds\");S(\"sessionControl\",\"sc\",\"\");S(\"sessionGroup\",\"sg\");S(\"queueTime\",\"qt\");var Ac=S(\"_s\",\"_s\");S(\"screenName\",\"cd\");\nvar kb=S(\"location\",\"dl\",\"\"),lb=S(\"referrer\",\"dr\"),mb=S(\"page\",\"dp\",\"\");S(\"hostname\",\"dh\");var nb=S(\"language\",\"ul\"),ob=S(\"encoding\",\"de\");S(\"title\",\"dt\",function(){return M.title||void 0});cb(\"contentGroup([0-9]+)\",function(a){return new bb(a[0],\"cg\"+a[1])});var pb=S(\"screenColors\",\"sd\"),qb=S(\"screenResolution\",\"sr\"),rb=S(\"viewportSize\",\"vp\"),sb=S(\"javaEnabled\",\"je\"),tb=S(\"flashVersion\",\"fl\");S(\"campaignId\",\"ci\");S(\"campaignName\",\"cn\");S(\"campaignSource\",\"cs\");S(\"campaignMedium\",\"cm\");\nS(\"campaignKeyword\",\"ck\");S(\"campaignContent\",\"cc\");var ub=S(\"eventCategory\",\"ec\"),xb=S(\"eventAction\",\"ea\"),yb=S(\"eventLabel\",\"el\"),zb=S(\"eventValue\",\"ev\"),Bb=S(\"socialNetwork\",\"sn\"),Cb=S(\"socialAction\",\"sa\"),Db=S(\"socialTarget\",\"st\"),Eb=S(\"l1\",\"plt\"),Fb=S(\"l2\",\"pdt\"),Gb=S(\"l3\",\"dns\"),Hb=S(\"l4\",\"rrt\"),Ib=S(\"l5\",\"srt\"),Jb=S(\"l6\",\"tcp\"),Kb=S(\"l7\",\"dit\"),Lb=S(\"l8\",\"clt\"),Mb=S(\"timingCategory\",\"utc\"),Nb=S(\"timingVar\",\"utv\"),Ob=S(\"timingLabel\",\"utl\"),Pb=S(\"timingValue\",\"utt\");S(\"appName\",\"an\");\nS(\"appVersion\",\"av\",\"\");S(\"appId\",\"aid\",\"\");S(\"appInstallerId\",\"aiid\",\"\");S(\"exDescription\",\"exd\");S(\"exFatal\",\"exf\");var Nc=S(\"expId\",\"xid\"),Oc=S(\"expVar\",\"xvar\"),Rc=S(\"_utma\",\"_utma\"),Sc=S(\"_utmz\",\"_utmz\"),Tc=S(\"_utmht\",\"_utmht\"),Ua=S(\"_hc\",void 0,0),Xa=S(\"_ti\",void 0,0),Wa=S(\"_to\",void 0,20);cb(\"dimension([0-9]+)\",function(a){return new bb(a[0],\"cd\"+a[1])});cb(\"metric([0-9]+)\",function(a){return new bb(a[0],\"cm\"+a[1])});S(\"linkerParam\",void 0,void 0,Bc,db);\nvar ld=S(\"usage\",\"_u\",void 0,function(){return pa.M()},db);S(\"forceSSL\",void 0,void 0,function(){return Ba},function(a,b,c){J(34);Ba=!!c});var ed=S(\"_j1\",\"jid\"),Hd=S(\"_j2\",\"gjid\");cb(\"\\\\&(.*)\",function(a){var b=new bb(a[0],a[1]),c=yc(a[0][F](1));c&&(b.n=function(a){return a.get(c)},b.o=function(a,b,g,ca){a.set(c,g,ca)},b.p=void 0);return b});\nvar Qb=T(\"_oot\"),dd=S(\"previewTask\"),Rb=S(\"checkProtocolTask\"),md=S(\"validationTask\"),Sb=S(\"checkStorageTask\"),Uc=S(\"historyImportTask\"),Tb=S(\"samplerTask\"),Vb=T(\"_rlt\"),Wb=S(\"buildHitTask\"),Xb=S(\"sendHitTask\"),Vc=S(\"ceTask\"),zd=S(\"devIdTask\"),Cd=S(\"timingTask\"),Ld=S(\"displayFeaturesTask\"),V=T(\"name\"),Q=T(\"clientId\",\"cid\"),Ad=S(\"userId\",\"uid\"),Na=T(\"trackingId\",\"tid\"),U=T(\"cookieName\",void 0,\"_ga\"),W=T(\"cookieDomain\"),Yb=T(\"cookiePath\",void 0,\"/\"),Zb=T(\"cookieExpires\",void 0,63072E3),$b=T(\"legacyCookieDomain\"),\nWc=T(\"legacyHistoryImport\",void 0,!0),ac=T(\"storage\",void 0,\"cookie\"),bc=T(\"allowLinker\",void 0,!1),cc=T(\"allowAnchor\",void 0,!0),Ka=T(\"sampleRate\",\"sf\",100),dc=T(\"siteSpeedSampleRate\",void 0,1),ec=T(\"alwaysSendReferrer\",void 0,!1),gd=S(\"transportUrl\"),Md=S(\"_r\",\"_r\"),Nd=S(\"_dfr\",void 0,1);\nfunction X(a,b,c,d){b[a]=function(){try{return d&&J(d),c[G](this,arguments)}catch(b){var g=b&&b[v];if(!(1<=100*n.random()||xa(\"?\"))){var ca=[\"t=error\",\"_e=exc\",\"_v=j30\",\"sr=1\"];a&&ca[p](\"_f=\"+a);g&&ca[p](\"_m=\"+sa(g[F](0,100)));ca[p](\"aip=1\");ca[p](\"z=\"+Ud());Ga(oc()+\"/collect\",ca[H](\"&\"))}throw b;}}};var Od=function(a){this.V=a;this.fa=void 0;this.$=!1;this.ha=void 0;this.ea=1},Ed=function(a,b,c){if(a.fa&&a.$)return 0;a.$=!0;if(b){if(a.ha&&R(b,a.ha))return R(b,a.ha);if(0==b.get(dc))return 0}if(0==a.V)return 0;void 0===c&&(c=Bd());return 0==c%a.V?n.floor(c/a.V)%a.ea+1:0};function fc(){var a,b,c;if((c=(c=O[oa])?c.plugins:null)&&c[y])for(var d=0;d<c[y]&&!b;d++){var e=c[d];-1<e[v][t](\"Shockwave Flash\")&&(b=e.description)}if(!b)try{a=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.7\"),b=a.GetVariable(\"$version\")}catch(g){}if(!b)try{a=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash.6\"),b=\"WIN 6,0,21,0\",a.AllowScriptAccess=\"always\",b=a.GetVariable(\"$version\")}catch(ca){}if(!b)try{a=new ActiveXObject(\"ShockwaveFlash.ShockwaveFlash\"),b=a.GetVariable(\"$version\")}catch(l){}b&&\n(a=b[m](/[\\d]+/g))&&3<=a[y]&&(b=a[0]+\".\"+a[1]+\" r\"+a[2]);return b||void 0};var gc=function(a,b){var c=n.min(R(a,dc),100);if(!(La(P(a,Q))%100>=c)&&(c={},Ec(c)||Fc(c))){var d=c[Eb];void 0==d||Infinity==d||isNaN(d)||(0<d?(Y(c,Gb),Y(c,Jb),Y(c,Ib),Y(c,Fb),Y(c,Hb),Y(c,Kb),Y(c,Lb),b(c)):ta(O,\"load\",function(){gc(a,b)},!1))}},Ec=function(a){var b=O.performance||O.webkitPerformance,b=b&&b.timing;if(!b)return!1;var c=b.navigationStart;if(0==c)return!1;a[Eb]=b.loadEventStart-c;a[Gb]=b.domainLookupEnd-b.domainLookupStart;a[Jb]=b.connectEnd-b.connectStart;a[Ib]=b.responseStart-b.requestStart;\na[Fb]=b.responseEnd-b.responseStart;a[Hb]=b.fetchStart-c;a[Kb]=b.domInteractive-c;a[Lb]=b.domContentLoadedEventStart-c;return!0},Fc=function(a){if(O.top!=O)return!1;var b=O.external,c=b&&b.onloadT;b&&!b.isValidLoadTime&&(c=void 0);2147483648<c&&(c=void 0);0<c&&b.setPageReadyTime();if(void 0==c)return!1;a[Eb]=c;return!0},Y=function(a,b){var c=a[b];if(isNaN(c)||Infinity==c||0>c)a[b]=void 0},Fd=function(a){return function(b){\"pageview\"!=b.get(Va)||a.I||(a.I=!0,gc(b,function(b){a[xc](\"timing\",b)}))}};var hc=!1,mc=function(a){if(\"cookie\"==P(a,ac)){var b=P(a,U),c=nd(a),d=kc(P(a,Yb)),e=lc(P(a,W)),g=1E3*R(a,Zb),ca=P(a,Na);if(\"auto\"!=e)zc(b,c,d,e,ca,g)&&(hc=!0);else{J(32);var l;t:{c=[];e=eb()[A](\".\");if(4==e[y]&&(l=e[e[y]-1],parseInt(l,10)==l)){l=[\"none\"];break t}for(l=e[y]-2;0<=l;l--)c[p](e[ha](l)[H](\".\"));c[p](\"none\");l=c}for(var k=0;k<l[y];k++)if(e=l[k],a[q].set(W,e),c=nd(a),zc(b,c,d,e,ca,g)){hc=!0;return}a[q].set(W,\"auto\")}}},nc=function(a){if(\"cookie\"==P(a,ac)&&!hc&&(mc(a),!hc))throw\"abort\";},\nYc=function(a){if(a.get(Wc)){var b=P(a,W),c=P(a,$b)||eb(),d=Xc(\"__utma\",c,b);d&&(J(19),a.set(Tc,(new Date)[da](),!0),a.set(Rc,d.R),(b=Xc(\"__utmz\",c,b))&&d[h]==b[h]&&a.set(Sc,b.R))}},nd=function(a){var b=ka(P(a,Q)),c=ic(P(a,W));a=jc(P(a,Yb));1<a&&(c+=\"-\"+a);return[\"GA1\",c,b][H](\".\")},Gc=function(a,b,c){for(var d=[],e=[],g,ca=0;ca<a[y];ca++){var l=a[ca];if(l.r[c]==b)d[p](l);else void 0==g||l.r[c]<g?(e=[l],g=l.r[c]):l.r[c]==g&&e[p](l)}return 0<d[y]?d:e},lc=function(a){return 0==a[t](\".\")?a.substr(1):\na},ic=function(a){return lc(a)[A](\".\")[y]},kc=function(a){if(!a)return\"/\";1<a[y]&&a.lastIndexOf(\"/\")==a[y]-1&&(a=a.substr(0,a[y]-1));0!=a[t](\"/\")&&(a=\"/\"+a);return a},jc=function(a){a=kc(a);return\"/\"==a?1:a[A](\"/\")[y]};function Xc(a,b,c){\"none\"==b&&(b=\"\");var d=[],e=ya(a);a=\"__utma\"==a?6:2;for(var g=0;g<e[y];g++){var ca=(\"\"+e[g])[A](\".\");ca[y]>=a&&d[p]({hash:ca[0],R:e[g],O:ca})}return 0==d[y]?void 0:1==d[y]?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){var c,d;null==a?c=d=1:(c=La(a),d=La(ea(a,\".\")?a[F](1):\".\"+a));for(var e=0;e<b[y];e++)if(b[e][h]==c||b[e][h]==d)return b[e]};var od=new RegExp(/^https?:\\/\\/([^\\/:]+)/),pd=/(.*)([?&#])(?:_ga=[^&#]*)(?:&?)(.*)/;function Bc(a){a=a.get(Q);var b=Ic(a,0);return\"_ga=1.\"+sa(b+\".\"+a)}function Ic(a,b){for(var c=new Date,d=O[oa],e=d.plugins||[],c=[a,d.userAgent,c.getTimezoneOffset(),c.getYear(),c.getDate(),c.getHours(),c.getMinutes()+b],d=0;d<e[y];++d)c[p](e[d].description);return La(c[H](\".\"))}var Dc=function(a){J(48);this.target=a;this.T=!1};\nDc[z].Q=function(a,b){if(a.tagName){if(\"a\"==a.tagName[I]()){a[Ab]&&Pc(a,qd(this,a[Ab],b));return}if(\"form\"==a.tagName[I]())return rd(this,a)}if(\"string\"==typeof a)return qd(this,a,b)};\nvar qd=function(a,b,c){var d=pd.exec(b);d&&3<=d[y]&&(b=d[1]+(d[3]?d[2]+d[3]:\"\"));a=a[jd].get(\"linkerParam\");var e=b[t](\"?\"),d=b[t](\"#\");c?b+=(-1==d?\"#\":\"&\")+a:(c=-1==e?\"?\":\"&\",b=-1==d?b+(c+a):b[F](0,d)+c+a+b[F](d));return b},rd=function(a,b){if(b&&b[kd]){var c=a[jd].get(\"linkerParam\")[A](\"=\")[1];if(\"get\"==b.method[I]()){for(var d=b.childNodes||[],e=0;e<d[y];e++)if(\"_ga\"==d[e][v]){d[e][id](\"value\",c);return}d=M[u](\"input\");d[id](\"type\",\"hidden\");d[id](\"name\",\"_ga\");d[id](\"value\",c);b.appendChild(d)}else\"post\"==\nb.method[I]()&&(b.action=qd(a,b[kd]))}};\nDc[z].S=function(a,b,c){function d(c){try{c=c||O.event;var d;t:{var g=c[jd]||c.srcElement;for(c=100;g&&0<c;){if(g[Ab]&&g.nodeName[m](/^a(?:rea)?$/i)){d=g;break t}g=g[Ub];c--}d={}}(\"http:\"==d[E]||\"https:\"==d[E])&&sd(a,d[ma]||\"\")&&d[Ab]&&Pc(d,qd(e,d[Ab],b))}catch(w){J(26)}}var e=this;this.T||(this.T=!0,ta(M,\"mousedown\",d,!1),ta(M,\"touchstart\",d,!1),ta(M,\"keyup\",d,!1));if(c){c=function(b){b=b||O.event;if((b=b[jd]||b.srcElement)&&b[kd]){var c=b[kd][m](od);c&&sd(a,c[1])&&rd(e,b)}};for(var g=0;g<M.forms[y];g++)ta(M.forms[g],\n\"submit\",c)}};function sd(a,b){if(b==M[B][ma])return!1;for(var c=0;c<a[y];c++)if(a[c]instanceof RegExp){if(a[c][s](b))return!0}else if(0<=b[t](a[c]))return!0;return!1};var Jd=function(a,b,c,d){this.U=b;this.aa=c;(b=d)||(b=(b=P(a,V))&&\"t0\"!=b?Wd[s](b)?\"_gat_\"+ka(P(a,Na)):\"_gat_\"+ka(b):\"_gat\");this.Y=b},Rd=function(a,b){var c=b.get(Wb);b.set(Wb,function(b){Pd(a,b);var d=c(b);Qd(a,b);return d});var d=b.get(Xb);b.set(Xb,function(b){var c=d(b);Id(a,b);return c})},Pd=function(a,b){b.get(a.U)||(\"1\"==ya(a.Y)[0]?b.set(a.U,\"\",!0):b.set(a.U,\"\"+Ud(),!0))},Qd=function(a,b){b.get(a.U)&&zc(a.Y,\"1\",b.get(Yb),b.get(W),b.get(Na),6E5)},Id=function(a,b){if(b.get(a.U)){var c=new N,\nd=function(a){c.set($a(a).p,b.get(a))};d(hb);d(ib);d(Na);d(Q);d(a.U);d(ld);var e=a.aa;c.map(function(a,b){e+=sa(a)+\"=\"+sa(\"\"+b)+\"&\"});e+=\"z=\"+Ud();Ca(e);b.set(a.U,\"\",!0)}},Wd=/^gtm\\d+$/;var fd=function(a,b){var c=a.b;if(!c.get(\"dcLoaded\")){J(29);O._gaq&&J(52);b=b||{};var d;b[U]&&(d=ka(b[U]));d=new Jd(c,ed,\"https://stats.g.doubleclick.net/collect?t=dc&aip=1&\",d);Rd(d,c);c.set(\"dcLoaded\",!0)}};var Sd=function(a){var b;a.get(\"dcLoaded\")||\"cookie\"!=a.get(ac)?b=!1:(b=new Od(R(a,Nd)),b=Ed(b,null,La(a.get(Q))));b&&(J(51),b=new Jd(a,ed),Pd(b,a),Qd(b,a),a.get(b.U)&&(a.set(Md,1,!0),a.set(gd,oc()+\"/r/collect\",!0)))};var Kd=function(a,b){var c=a.b;if(!c.get(\"_rlsaLoaded\")){J(38);b=b||{};if(b[U])var d=ka(b[U]);d=new Jd(c,Hd,\"https://www.google.com/ads/ga-audiences?t=sr&aip=1&\",d);Rd(d,c);c.set(\"_rlsaLoaded\",!0);tc(\"displayfeatures\",a,b)}};function $c(){var a=O.gaGlobal=O.gaGlobal||{};return a.hid=a.hid||Ud()};var ad,bd=function(a,b,c){if(!ad){var d;d=M[B][h];var e=O[v],g=/^#?gaso=([^&]*)/;if(e=(d=(d=d&&d[m](g)||e&&e[m](g))?d[1]:ya(\"GASO\")[0]||\"\")&&d[m](/^(?:!([-0-9a-z.]{1,40})!)?([-.\\w]{10,1200})$/i))zc(\"GASO\",\"\"+d,c,b,a,0),f._udo||(f._udo=b),f._utcp||(f._utcp=c),a=e[1],vc(\"https://www.google.com/analytics/web/inpage/pub/inpage.js?\"+(a?\"prefix=\"+a+\"&\":\"\")+Ud(),\"_gasojs\");ad=!0}};var wb=/^(UA|YT|MO|GP)-(\\d+)-(\\d+)$/,pc=function(a){function b(a,b){d.b[q].set(a,b)}function c(a,c){b(a,c);d.filters.add(a)}var d=this;this.b=new Ya;this.filters=new Ha;b(V,a[V]);b(Na,Lc(a[Na]));b(U,a[U]);b(W,a[W]||eb());b(Yb,a[Yb]);b(Zb,a[Zb]);b($b,a[$b]);b(Wc,a[Wc]);b(bc,a[bc]);b(cc,a[cc]);b(Ka,a[Ka]);b(dc,a[dc]);b(ec,a[ec]);b(ac,a[ac]);b(Ad,a[Ad]);b(hb,1);b(ib,\"j30\");c(Qb,Ma);c(dd,cd);c(Rb,Oa);c(md,vb);c(Sb,nc);c(Uc,Yc);c(Tb,Ja);c(Vb,Ta);c(Vc,Hc);c(zd,yd);c(Ld,Sd);c(Wb,Pa);c(Xb,Sa);c(Cd,Fd(this));\nJc(this.b,a[Q]);Kc(this.b);this.b.set(jb,$c());bd(this.b.get(Na),this.b.get(W),this.b.get(Yb))},Jc=function(a,b){if(\"cookie\"==P(a,ac)){hc=!1;var c;i:{var d=ya(P(a,U));if(d&&!(1>d[y])){c=[];for(var e=0;e<d[y];e++){var g;g=d[e][A](\".\");var ca=g.shift();(\"GA1\"==ca||\"1\"==ca)&&1<g[y]?(ca=g.shift()[A](\"-\"),1==ca[y]&&(ca[1]=\"1\"),ca[0]*=1,ca[1]*=1,g={r:ca,s:g[H](\".\")}):g=void 0;g&&c[p](g)}if(1==c[y]){J(13);c=c[0].s;break i}if(0==c[y])J(12);else{J(14);d=ic(P(a,W));c=Gc(c,d,0);if(1==c[y]){c=c[0].s;break i}d=\njc(P(a,Yb));c=Gc(c,d,1);c=c[0]&&c[0].s;break i}}c=void 0}c||(c=P(a,W),d=P(a,$b)||eb(),c=Xc(\"__utma\",d,c),(c=void 0==c?void 0:c.O[1]+\".\"+c.O[2])&&J(10));c&&(a[q].set(Q,c),hc=!0)}c=a.get(cc);if(e=(c=M[B][c?\"href\":\"search\"][m](\"(?:&|#|\\\\?)\"+sa(\"_ga\")[Qc](/([.*+?^=!:${}()|\\[\\]\\/\\\\])/g,\"\\\\$1\")+\"=([^&#]*)\"))&&2==c[y]?c[1]:\"\")a.get(bc)?(c=e[t](\".\"),-1==c?J(22):(d=e[F](c+1),\"1\"!=e[F](0,c)?J(22):(c=d[t](\".\"),-1==c?J(22):(e=d[F](0,c),c=d[F](c+1),e!=Ic(c,0)&&e!=Ic(c,-1)&&e!=Ic(c,-2)?J(23):(J(11),a[q].set(Q,\nc)))))):J(21);b&&(J(9),a[q].set(Q,sa(b)));a.get(Q)||((c=(c=O.gaGlobal&&O.gaGlobal.vid)&&-1!=c[ga](/^(?:utma\\.)?\\d+\\.\\d+$/)?c:void 0)?(J(17),a[q].set(Q,c)):(J(8),a[q].set(Q,Td())));mc(a)},Kc=function(a){var b=O[oa],c=O.screen,d=M[B];a.set(lb,va(a.get(ec)));if(d){var e=d.pathname||\"\";\"/\"!=e.charAt(0)&&(J(31),e=\"/\"+e);a.set(kb,d[E]+\"//\"+d[ma]+e+d[ga])}c&&a.set(qb,c.width+\"x\"+c.height);c&&a.set(pb,c.colorDepth+\"-bit\");var c=M.documentElement,g=(e=M.body)&&e[la]&&e[na],ca=[];c&&c[la]&&c[na]&&(\"CSS1Compat\"===\nM.compatMode||!g)?ca=[c[la],c[na]]:g&&(ca=[e[la],e[na]]);c=0>=ca[0]||0>=ca[1]?\"\":ca[H](\"x\");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&\"function\"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||\"\")[I]());if(d&&a.get(cc)&&(b=M[B][h])){b=b[A](/[?&#]+/);d=[];for(c=0;c<b[y];++c)(ea(b[c],\"utm_id\")||ea(b[c],\"utm_campaign\")||ea(b[c],\"utm_source\")||ea(b[c],\"utm_medium\")||ea(b[c],\"utm_term\")||ea(b[c],\"utm_content\")||ea(b[c],\"gclid\")||\nea(b[c],\"dclid\")||ea(b[c],\"gclsrc\"))&&d[p](b[c]);0<d[y]&&(b=\"#\"+d[H](\"&\"),a.set(kb,a.get(kb)+b))}};pc[z].get=function(a){return this.b.get(a)};pc[z].set=function(a,b){this.b.set(a,b)};var qc={pageview:[mb],event:[ub,xb,yb,zb],social:[Bb,Cb,Db],timing:[Mb,Nb,Pb,Ob]};\npc[z].send=function(a){if(!(1>arguments[y])){var b,c;\"string\"===typeof arguments[0]?(b=arguments[0],c=[][ha][C](arguments,1)):(b=arguments[0]&&arguments[0][Va],c=arguments);b&&(c=wa(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b[q].m={},J(44))}};var rc=function(a){if(\"prerender\"==M.visibilityState)return!1;a();return!0};var td=/^(?:(\\w+)\\.)?(?:(\\w+):)?(\\w+)$/,sc=function(a){if(K(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b[y]&&(this.c=b[1]||\"t0\",this.e=b[2]||\"\",this.d=b[3],this.a=[][ha][C](a,1),this.e||(this.A=\"create\"==this.d,this.i=\"require\"==this.d,this.g=\"provide\"==this.d,this.ba=\"remove\"==this.d),this.i&&(3<=this.a[y]?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.d)throw\"abort\";if(this.i&&(!qa(b)||\"\"==b))throw\"abort\";if(this.g&&\n(!qa(b)||\"\"==b||!K(a)))throw\"abort\";if(ud(this.c)||ud(this.e))throw\"abort\";if(this.g&&\"t0\"!=this.c)throw\"abort\";}};function ud(a){return 0<=a[t](\".\")||0<=a[t](\":\")};var Yd,Zd,$d;Yd=new N;$d=new N;Zd={ec:45,ecommerce:46,linkid:47};\nvar tc=function(a,b,c){b==$?J(35):b.get(V);var d=Yd.get(a);if(!K(d))return!1;b.plugins_=b.plugins_||new N;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},ae=function(a){function b(a){var b=(a[ma]||\"\")[A](\":\")[0][I](),c=(a[E]||\"\")[I](),c=1*a[ja]||(\"http:\"==c?80:\"https:\"==c?443:\"\");a=a.pathname||\"\";ea(a,\"/\")||(a=\"/\"+a);return[b,\"\"+c,a]}var c=M[u](\"a\");Pc(c,M[B][Ab]);var d=(c[E]||\"\")[I](),e=b(c),g=c[ga]||\"\",ca=d+\"//\"+e[0]+(e[1]?\":\"+e[1]:\"\");ea(a,\"//\")?a=d+a:ea(a,\"/\")?a=ca+a:\n!a||ea(a,\"?\")?a=ca+e[2]+(a||g):0>a[A](\"/\")[0][t](\":\")&&(a=ca+e[2][F](0,e[2].lastIndexOf(\"/\"))+\"/\"+a);Pc(c,a);d=b(c);return{protocol:(c[E]||\"\")[I](),host:d[0],port:d[1],path:d[2],G:c[ga]||\"\",url:a||\"\"}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J[G](Z,arguments),b=Z.f.concat(b);for(Z.f=[];0<b[y]&&!Z.v(b[0])&&!(b.shift(),0<Z.f[y]););Z.f=Z.f.concat(b)};\nZ.J=function(a){for(var b=[],c=0;c<arguments[y];c++)try{var d=new sc(arguments[c]);if(d.g)Yd.set(d.a[0],d.a[1]);else{if(d.i){var e=d,g=e.a[0];if(!K(Yd.get(g))&&!$d.get(g)){Zd[ra](g)&&J(Zd[g]);var ca=e.X;!ca&&Zd[ra](g)?(J(39),ca=g+\".js\"):J(43);if(ca){ca&&0<=ca[t](\"/\")||(ca=D()+\"//www.google-analytics.com/plugins/ua/\"+ca);var l=ae(ca),e=void 0;var k=l[E],w=M[B][E],e=\"https:\"==k||k==w?!0:\"http:\"!=k?!1:\"http:\"==w;var Xd;if(Xd=e){var e=l,be=ae(M[B][Ab]);if(e.G||0<=e.url[t](\"?\")||0<=e.path[t](\"://\"))Xd=\n!1;else if(e[x]==be[x]&&e[ja]==be[ja])Xd=!0;else{var ce=\"http:\"==e[E]?80:443;Xd=\"www.google-analytics.com\"==e[x]&&(e[ja]||ce)==ce&&ea(e.path,\"/plugins/\")?!0:!1}}Xd&&(vc(l.url),$d.set(g,!0))}}}b[p](d)}}catch(de){}return b};Z.v=function(a){try{if(a.u)a.u[C](O,$.j(\"t0\"));else{var b=a.c==gb?$:$.j(a.c);if(a.A)\"t0\"==a.c&&$.create[G]($,a.a);else if(a.ba)$.remove(a.c);else if(b)if(a.i){if(!tc(a.a[0],b,a.W))return!0}else if(a.e){var c=a.d,d=a.a,e=b.plugins_.get(a.e);e[c][G](e,d)}else b[a.d][G](b,a.a)}}catch(g){}};var $=function(a){J(1);Z.D[G](Z,[arguments])};$.h={};$.P=[];$.L=0;$.answer=42;var uc=[Na,W,V];$.create=function(a){var b=wa(uc,[][ha][C](arguments));b[V]||(b[V]=\"t0\");var c=\"\"+b[V];if($.h[c])return $.h[c];b=new pc(b);$.h[c]=b;$.P[p](b);return b};$.remove=function(a){for(var b=0;b<$.P[y];b++)if($.P[b].get(V)==a){$.P.splice(b,1);$.h[a]=null;break}};$.j=function(a){return $.h[a]};$.K=function(){return $.P[ha](0)};\n$.N=function(){\"ga\"!=gb&&J(49);var a=O[gb];if(!a||42!=a.answer){$.L=a&&a.l;$.loaded=!0;var b=O[gb]=$;X(\"create\",b,b.create,3);X(\"remove\",b,b.remove);X(\"getByName\",b,b.j,5);X(\"getAll\",b,b.K,6);b=pc[z];X(\"get\",b,b.get,7);X(\"set\",b,b.set,4);X(\"send\",b,b[xc],2);b=Ya[z];X(\"get\",b,b.get);X(\"set\",b,b.set);(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc[z];Yd.set(\"linker\",Dc);X(\"decorate\",b,b.Q,20);X(\"autoLink\",b,b.S,25);Yd.set(\"displayfeatures\",fd);Yd.set(\"adfeatures\",Kd);a=a&&a.q;vd(a)?Z.D[G]($,a):J(50)}};\n(function(){var a=$.N;if(!rc(a)){J(16);var b=!1,c=function(){!b&&rc(a)&&(b=!0,ua(M,\"visibilitychange\",c))};ta(M,\"visibilitychange\",c)}})();function La(a){var b=1,c=0,d;if(a)for(b=0,d=a[y]-1;0<=d;d--)c=a.charCodeAt(d),b=(b<<6&268435455)+c+(c<<14),c=b&266338304,b=0!=c?b^c>>21:b;return b};})(window);\n"
  },
  {
    "path": "works/demo/ee/index_files/backgroundClasses.css",
    "content": "/*[class*=\"bg-solid\"] {\n\tborder: 1px solid rgba(0, 0, 0, .3);\n\tbox-shadow: 0 2px 6px rgba(0, 0, 0, .4);\n\ttext-shadow: 0 2px 2px rgba(0, 0, 0, .3);\n}*/\n\n\n.bg-default {\n  background: -webkit-radial-gradient(#F0F0F0, #BEBEBE);\n  background: -moz-radial-gradient(#F0F0F0, #BEBEBE);\n  background: -ms-radial-gradient(#F0F0F0, #BEBEBE);\n  background: -o-radial-gradient(#F0F0F0, #BEBEBE);\n  background: radial-gradient(#F0F0F0, #BEBEBE);\n}\n\n/*\nincluded for legacy support of old decks with the defaultbg attribute set.\n*/\n.defaultbg {\n  background: -webkit-radial-gradient(#F0F0F0, #BEBEBE);\n  background: -moz-radial-gradient(#F0F0F0, #BEBEBE);\n  background: -ms-radial-gradient(#F0F0F0, #BEBEBE);\n  background: -o-radial-gradient(#F0F0F0, #BEBEBE);\n  background: radial-gradient(#F0F0F0, #BEBEBE);\n}\n\n.bg-solid-orange {\n\tbackground-color: #774040;\n}\n\n.bg-solid-black {\n\tbackground-color: #222;\n}\n\n.bg-solid-light {\n\tbackground-color: white;\n}\n\n.bg-solid-smoke {\n\tbackground-color: #DDD;\n}\n\n.bg-solid-yellow {\n\tbackground-color: #D1B377;\n}\n\n.bg-solid-grass {\n\tbackground-color: #597847;\n}\n\n.bg-solid-darkgreen {\n\tbackground-color: #134952;\n}\n\n.bg-solid-sky {\n\tbackground-color: #515E99;\n}\n\n.bg-solid-lavender {\n\tbackground-color: #443C4D;\n}\n\n.bg-solid-purple {\n\tbackground-color: #6C478F;\n}\n\n.bg-solid-salmon {\n\tbackground-color: #C98D8D;\n}\n\n.nobg {\n\tbackground: url(img/nobg.png);\n\tbackground-size: 40px 40px;\n}\n\n.themeProviders .thumbnail {\n\theight: 20px;\n\twidth: 20px;\n\tpadding: 10px;\n}\n"
  },
  {
    "path": "works/demo/ee/index_files/dataset-shim.js",
    "content": "/**\n * Add dataset support to elements\n * No globals, no overriding prototype with non-standard methods, \n *   handles CamelCase properly, attempts to use standard \n *   Object.defineProperty() (and Function bind()) methods, \n *   falls back to native implementation when existing\n * Inspired by http://code.eligrey.com/html5/dataset/ \n *   (via https://github.com/adalgiso/html5-dataset/blob/master/html5-dataset.js )\n * Depends on Function.bind and Object.defineProperty/Object.getOwnPropertyDescriptor (shims below)\n * Licensed under the X11/MIT License\n*/\n \n// Inspired by https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind#Compatibility\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function (oThis) {\n        'use strict';\n        if (typeof this !== \"function\") {\n            // closest thing possible to the ECMAScript 5 internal IsCallable function\n            throw new TypeError(\"Function.prototype.bind - what is trying to be bound is not callable\");\n        }\n \n        var aArgs = Array.prototype.slice.call(arguments, 1),\n            fToBind = this,\n            FNOP = function () {},\n            fBound = function () {\n                return fToBind.apply(\n                    this instanceof FNOP && oThis ? this : oThis,\n                   aArgs.concat(Array.prototype.slice.call(arguments))\n               );\n            };\n \n        FNOP.prototype = this.prototype;\n        fBound.prototype = new FNOP();\n \n        return fBound;\n    };\n}\n \n/*\n * Xccessors Standard: Cross-browser ECMAScript 5 accessors\n * http://purl.eligrey.com/github/Xccessors\n * \n * 2010-06-21\n * \n * By Eli Grey, http://eligrey.com\n * \n * A shim that partially implements Object.defineProperty,\n * Object.getOwnPropertyDescriptor, and Object.defineProperties in browsers that have\n * legacy __(define|lookup)[GS]etter__ support.\n * \n * Licensed under the X11/MIT License\n *   See LICENSE.md\n*/\n \n// Removed a few JSLint options as Notepad++ JSLint validator complaining and \n//   made comply with JSLint; also moved 'use strict' inside function\n/*jslint white: true, undef: true, plusplus: true,\n  bitwise: true, regexp: true, newcap: true, maxlen: 90 */\n \n/*! @source http://purl.eligrey.com/github/Xccessors/blob/master/xccessors-standard.js*/\n \n(function () {\n    'use strict';\n    var ObjectProto = Object.prototype,\n    defineGetter = ObjectProto.__defineGetter__,\n    defineSetter = ObjectProto.__defineSetter__,\n    lookupGetter = ObjectProto.__lookupGetter__,\n    lookupSetter = ObjectProto.__lookupSetter__,\n    hasOwnProp = ObjectProto.hasOwnProperty;\n    \n    if (defineGetter && defineSetter && lookupGetter && lookupSetter) {\n \n        if (!Object.defineProperty) {\n            Object.defineProperty = function (obj, prop, descriptor) {\n                if (arguments.length < 3) { // all arguments required\n                    throw new TypeError(\"Arguments not optional\");\n                }\n                \n                prop += \"\"; // convert prop to string\n \n                if (hasOwnProp.call(descriptor, \"value\")) {\n                    if (!lookupGetter.call(obj, prop) && !lookupSetter.call(obj, prop)) {\n                        // data property defined and no pre-existing accessors\n                        obj[prop] = descriptor.value;\n                    }\n \n                    if ((hasOwnProp.call(descriptor, \"get\") ||\n                         hasOwnProp.call(descriptor, \"set\"))) \n                    {\n                        // descriptor has a value prop but accessor already exists\n                        throw new TypeError(\"Cannot specify an accessor and a value\");\n                    }\n                }\n \n                // can't switch off these features in ECMAScript 3\n                // so throw a TypeError if any are false\n                if (!(descriptor.writable && descriptor.enumerable && \n                    descriptor.configurable))\n                {\n                    throw new TypeError(\n                        \"This implementation of Object.defineProperty does not support\" +\n                        \" false for configurable, enumerable, or writable.\"\n                    );\n                }\n                \n                if (descriptor.get) {\n                    defineGetter.call(obj, prop, descriptor.get);\n                }\n                if (descriptor.set) {\n                    defineSetter.call(obj, prop, descriptor.set);\n                }\n            \n                return obj;\n            };\n        }\n \n        if (!Object.getOwnPropertyDescriptor) {\n            Object.getOwnPropertyDescriptor = function (obj, prop) {\n                if (arguments.length < 2) { // all arguments required\n                    throw new TypeError(\"Arguments not optional.\");\n                }\n                \n                prop += \"\"; // convert prop to string\n \n                var descriptor = {\n                    configurable: true,\n                    enumerable  : true,\n                    writable    : true\n                },\n                getter = lookupGetter.call(obj, prop),\n                setter = lookupSetter.call(obj, prop);\n \n                if (!hasOwnProp.call(obj, prop)) {\n                    // property doesn't exist or is inherited\n                    return descriptor;\n                }\n                if (!getter && !setter) { // not an accessor so return prop\n                    descriptor.value = obj[prop];\n                    return descriptor;\n                }\n \n                // there is an accessor, remove descriptor.writable;\n                // populate descriptor.get and descriptor.set (IE's behavior)\n                delete descriptor.writable;\n                descriptor.get = descriptor.set = undefined;\n                \n                if (getter) {\n                    descriptor.get = getter;\n                }\n                if (setter) {\n                    descriptor.set = setter;\n                }\n                \n                return descriptor;\n            };\n        }\n \n        if (!Object.defineProperties) {\n            Object.defineProperties = function (obj, props) {\n                var prop;\n                for (prop in props) {\n                    if (hasOwnProp.call(props, prop)) {\n                        Object.defineProperty(obj, prop, props[prop]);\n                    }\n                }\n            };\n        }\n    }\n}());\n \n// Begin dataset code\n \nif (!document.documentElement.dataset && \n         // FF is empty while IE gives empty object\n        (!Object.getOwnPropertyDescriptor(Element.prototype, 'dataset')  ||\n        !Object.getOwnPropertyDescriptor(Element.prototype, 'dataset').get)\n    ) {\n    var propDescriptor = {\n        enumerable: true,\n        get: function () {\n            'use strict';\n            var i, \n                that = this,\n                HTML5_DOMStringMap, \n                attrVal, attrName, propName,\n                attribute,\n                attributes = this.attributes,\n                attsLength = attributes.length,\n                toUpperCase = function (n0) {\n                    return n0.charAt(1).toUpperCase();\n                },\n                getter = function () {\n                    return this;\n                },\n                setter = function (attrName, value) {\n                    return (typeof value !== 'undefined') ? \n                        this.setAttribute(attrName, value) : \n                        this.removeAttribute(attrName);\n                };\n            try { // Simulate DOMStringMap w/accessor support\n                // Test setting accessor on normal object\n                ({}).__defineGetter__('test', function () {});\n                HTML5_DOMStringMap = {};\n            }\n            catch (e1) { // Use a DOM object for IE8\n                HTML5_DOMStringMap = document.createElement('div');\n            }\n            for (i = 0; i < attsLength; i++) {\n                attribute = attributes[i];\n                // Fix: This test really should allow any XML Name without \n                //         colons (and non-uppercase for XHTML)\n                if (attribute && attribute.name && \n                    (/^data-\\w[\\w\\-]*$/).test(attribute.name)) {\n                    attrVal = attribute.value;\n                    attrName = attribute.name;\n                    // Change to CamelCase\n                    propName = attrName.substr(5).replace(/-./g, toUpperCase);\n                    try {\n                        Object.defineProperty(HTML5_DOMStringMap, propName, {\n                            enumerable: this.enumerable,\n                            get: getter.bind(attrVal || ''),\n                            set: setter.bind(that, attrName)\n                        });\n                    }\n                    catch (e2) { // if accessors are not working\n                        HTML5_DOMStringMap[propName] = attrVal;\n                    }\n                }\n            }\n            return HTML5_DOMStringMap;\n        }\n    };\n    try {\n        // FF enumerates over element's dataset, but not \n        //   Element.prototype.dataset; IE9 iterates over both\n        Object.defineProperty(Element.prototype, 'dataset', propDescriptor);\n    } catch (e) {\n        propDescriptor.enumerable = false; // IE8 does not allow setting to true\n        Object.defineProperty(Element.prototype, 'dataset', propDescriptor);\n    }\n}"
  },
  {
    "path": "works/demo/ee/index_files/default-reset.css",
    "content": ".themedArea div, .themedArea span, .themedArea applet, .themedArea object, .themedArea iframe,\n.themedArea h1, .themedArea h2, .themedArea h3, .themedArea h4, .themedArea h5, .themedArea h6, .themedArea p, .themedArea blockquote, .themedArea pre,\n.themedArea a, .themedArea abbr, .themedArea acronym, .themedArea address, .themedArea big, .themedArea cite, .themedArea code,\n.themedArea del, .themedArea dfn, .themedArea em, .themedArea img, .themedArea ins, .themedArea kbd, .themedArea q, .themedArea s, .themedArea samp,\n.themedArea small, .themedArea strike, .themedArea strong, .themedArea sub, .themedArea sup, .themedArea tt, .themedArea var,\n.themedArea b, .themedArea u, .themedArea i, .themedArea center,\n.themedArea dl, .themedArea dt, .themedArea dd, .themedArea ol, .themedArea ul, .themedArea li,\n.themedArea fieldset, .themedArea form, .themedArea label, .themedArea legend,\n.themedArea table, .themedArea caption, .themedArea tbody, .themedArea tfoot, .themedArea thead, .themedArea tr, .themedArea th, .themedArea td,\n.themedArea article, .themedArea aside, .themedArea canvas, .themedArea details, .themedArea embed,\n.themedArea figure, .themedArea figcaption, .themedArea footer, .themedArea header, .themedArea hgroup,\n.themedArea menu, .themedArea nav, .themedArea output, .themedArea ruby, .themedArea section, .themedArea summary,\n.themedArea time, .themedArea mark, .themedArea audio, video {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tfont-size: 100%;\n\tfont: inherit;\n\tvertical-align: baseline;\n}\n\n.themedArea article, .themedArea aside, .themedArea details, .themedArea figcaption, .themedArea figure,\n.themedArea footer, .themedArea header, .themedArea hgroup, .themedArea menu, .themedArea nav, .themedArea section {\n\tdisplay: block;\n}\n\n.themedArea h1,\n.themedArea h2,\n.themedArea h3,\n.themedArea h4,\n.themedArea h5,\n.themedArea h6 {\n\t-webkit-hyphens: auto;\n\t   -moz-hyphens: auto;\n\t        hyphens: auto;\n\n\tword-wrap: break-word;\n\tline-height: 1;\n}\n\n.themedArea h1 { font-size: 3.77em; }\n.themedArea h2 { font-size: 2.11em;\t}\n.themedArea h3 { font-size: 1.55em;\t}\n.themedArea h4 { font-size: 1em; }\n\n/* Fixes issue in Chrome where italic fonts did not appear when printing to PDF */\n.themedArea:after {\n  content: '';\n  font-style: italic;\n}\n\n.themedArea iframe {\n\tz-index: 1;\n}\n\n/** Prevents layering issues in certain browser/transition combinations */\n.themedArea a {\n\tposition: relative;\n}\n\n.themedArea strong,\n.themedArea b {\n\tfont-weight: bold;\n}\n\n.themedArea em,\n.themedArea i {\n\tfont-style: italic;\n}\n\n.themedArea ol,\n.themedArea ul {\n\tdisplay: inline-block;\n\n\ttext-align: left;\n\tmargin: 0 0 0 1em;\n}\n\n.themedArea ol {\n\tlist-style-type: decimal;\n}\n\n.themedArea ul {\n\tlist-style-type: disc;\n}\n\n.themedArea ul ul {\n\tlist-style-type: square;\n}\n\n.themedArea ul ul ul {\n\tlist-style-type: circle;\n}\n\n.themedArea ul ul,\n.themedArea ul ol,\n.themedArea ol ol,\n.themedArea ol ul {\n\tdisplay: block;\n\tmargin-left: 40px;\n}\n\n.themedArea p {\n\tmargin-bottom: 10px;\n\tline-height: 1.2em;\n}\n\n.themedArea q,\n.themedArea blockquote {\n\tquotes: none;\n}\n\n.themedArea blockquote {\n\tdisplay: block;\n\tposition: relative;\n\twidth: 70%;\n\tmargin: 5px auto;\n\tpadding: 5px;\n\n\tfont-style: italic;\n\tbackground: rgba(255, 255, 255, 0.05);\n\tbox-shadow: 0px 0px 2px rgba(0,0,0,0.2);\n}\n.themedArea blockquote p:first-child,\n.themedArea blockquote p:last-child {\n\tdisplay: inline-block;\n}\n\n.themedArea q {\n\tfont-style: italic;\n}\n\n.themedArea pre {\n\tdisplay: block;\n\tposition: relative;\n\twidth: 90%;\n\tmargin: 15px auto;\n\n\ttext-align: left;\n\tfont-size: 0.55em;\n\tfont-family: monospace;\n\tline-height: 1.2em;\n\n\tword-wrap: break-word;\n\n\tbox-shadow: 0px 0px 6px rgba(0,0,0,0.3);\n}\n.themedArea code {\n\tfont-family: monospace;\n}\n.themedArea pre code {\n\tpadding: 5px;\n\toverflow: auto;\n\tmax-height: 400px;\n\tword-wrap: normal;\n}\n.themedArea pre.stretch code {\n\theight: 100%;\n\tmax-height: 100%;\n\n\t-webkit-box-sizing: border-box;\n\t   -moz-box-sizing: border-box;\n\t        box-sizing: border-box;\n}\n\n.themedArea table th,\n.themedArea table td {\n\ttext-align: left;\n\tpadding-right: .3em;\n}\n\n.themedArea table th {\n\ttext-shadow: rgb(255,255,255) 1px 1px 2px;\n}\n\n.themedArea sup {\n\tvertical-align: super;\n}\n.themedArea sub {\n\tvertical-align: sub;\n}\n\n.themedArea small {\n\tdisplay: inline-block;\n\tfont-size: 0.6em;\n\tline-height: 1.2em;\n\tvertical-align: top;\n}\n\n.themedArea small * {\n\tvertical-align: top;\n}\n\n.themedArea .stretch {\n\tmax-width: none;\n\tmax-height: none;\n}\n\n.themedArea {\n\ttext-align: center;\n\tpadding: 20px 0px 0px;\n\tline-height: 1.2em;\n\tfont-weight: normal;\n}\n\n/*.strut-surface::before, .strut-surface::after {\n  display: block;\n  position: absolute;\n  background-size: cover;\n  background-position: center;\n  background-repeat: no-repeat;\n  content: \"\";\n  -webkit-filter: grayscale(0.3) brightness(0.3);\n  -moz-filter: grayscale(0.3) brightness(0.3);\n  filter: grayscale(0.3) brightness(0.3);\n}\n\n.strut-surface::after {\n  z-index: 1;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}*/\n\n.strut-surface, .innerBg {\n\tbackground-size: cover;\n\tbackground-position: center;\n  \tbackground-repeat: no-repeat;\n}\n\n.slideContainer {\n\tbackground-size: cover;\n\tbackground-position: center;\n  \tbackground-repeat: no-repeat;\n}\n\n.innerBg {\n\t-webkit-transition: background-color .8s ease;\n\t-moz-transition: background-color .8s ease;\n\t-ms-transition: background-color .8s ease;\n\ttransition: background-color .8s ease;\n}"
  },
  {
    "path": "works/demo/ee/index_files/default.css",
    "content": "@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);\n\n@font-face {\n  font-family: 'League Gothic';\n  src: url(\"../../lib/font/league_gothic-webfont.eot\");\n  src: url(\"../../lib/font/league_gothic-webfont.eot?#iefix\") format(\"embedded-opentype\"), url(\"../../lib/font/league_gothic-webfont.woff\") format(\"woff\"), url(\"../../lib/font/league_gothic-webfont.ttf\") format(\"truetype\"), url(\"../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular\") format(\"svg\");\n  font-weight: normal;\n  font-style: normal; }\n\n\nhtml, body {\n  font-family: \"Lato\", sans-serif;\n  color: #333;\n}\n\n.themedArea {\n  font-family: \"Lato\", sans-serif;\n  font-size: 36px;\n  font-weight: 200;\n  letter-spacing: -0.02em;\n  color: #333; }\n\n.themedArea h1,\n.themedArea h2,\n.themedArea h3,\n.themedArea h4,\n.themedArea h5,\n.themedArea h6 {\n  margin: 0 0 20px 0;\n  color: #333;\n  font-family: \"League Gothic\", Impact, sans-serif;\n  line-height: 0.9em;\n  letter-spacing: 0.02em;\n  text-transform: uppercase;\n  text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); }\n\n.themedArea h1 {\n   text-shadow: 0 1px 0 #666666, 0 2px 0 #5A5A5A, 0 3px 0 #494949, 0 4px 0 #4D4D4D, 0 5px 0 #494949, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15);\n}\n"
  },
  {
    "path": "works/demo/ee/index_files/impress.js",
    "content": "function startPres(document, window) {\nif (window.presStarted)\n    return;\nwindow.presStarted = true;\n\nvar innerBg = document.querySelector('.innerBg');\n\n/**\n * impress.js\n *\n * impress.js is a presentation tool based on the power of CSS3 transforms and transitions\n * in modern browsers and inspired by the idea behind prezi.com.\n *\n *\n * Copyright 2011-2012 Bartek Szopka (@bartaz)\n *\n * Released under the MIT and GPL Licenses.\n *\n * ------------------------------------------------\n *  author:  Bartek Szopka\n *  version: 0.5.3\n *  url:     http://bartaz.github.com/impress.js/\n *  source:  http://github.com/bartaz/impress.js/\n */\n\n/*jshint bitwise:true, curly:true, eqeqeq:true, forin:true, latedef:true, newcap:true,\n         noarg:true, noempty:true, undef:true, strict:true, browser:true */\n\n// You are one of those who like to know how things work inside?\n// Let me show you the cogs that make impress.js run...\n(function ( document, window ) {\n    'use strict';\n    \n    // HELPER FUNCTIONS\n    \n    // `pfx` is a function that takes a standard CSS property name as a parameter\n    // and returns it's prefixed version valid for current browser it runs in.\n    // The code is heavily inspired by Modernizr http://www.modernizr.com/\n    var pfx = (function () {\n        \n        var style = document.createElement('dummy').style,\n            prefixes = 'Webkit Moz O ms Khtml'.split(' '),\n            memory = {};\n        \n        return function ( prop ) {\n            if ( typeof memory[ prop ] === \"undefined\" ) {\n                \n                var ucProp  = prop.charAt(0).toUpperCase() + prop.substr(1),\n                    props   = (prop + ' ' + prefixes.join(ucProp + ' ') + ucProp).split(' ');\n                \n                memory[ prop ] = null;\n                for ( var i in props ) {\n                    if ( style[ props[i] ] !== undefined ) {\n                        memory[ prop ] = props[i];\n                        break;\n                    }\n                }\n            \n            }\n            \n            return memory[ prop ];\n        };\n    \n    })();\n    \n    // `arraify` takes an array-like object and turns it into real Array\n    // to make all the Array.prototype goodness available.\n    var arrayify = function ( a ) {\n        return [].slice.call( a );\n    };\n    \n    // `css` function applies the styles given in `props` object to the element\n    // given as `el`. It runs all property names through `pfx` function to make\n    // sure proper prefixed version of the property is used.\n    var css = function ( el, props ) {\n        var key, pkey;\n        for ( key in props ) {\n            if ( props.hasOwnProperty(key) ) {\n                pkey = pfx(key);\n                if ( pkey !== null ) {\n                    el.style[pkey] = props[key];\n                }\n            }\n        }\n        return el;\n    };\n    \n    // `toNumber` takes a value given as `numeric` parameter and tries to turn\n    // it into a number. If it is not possible it returns 0 (or other value\n    // given as `fallback`).\n    var toNumber = function (numeric, fallback) {\n        return isNaN(numeric) ? (fallback || 0) : Number(numeric);\n    };\n    \n    // `byId` returns element with given `id` - you probably have guessed that ;)\n    var byId = function ( id ) {\n        return document.getElementById(id);\n    };\n    \n    // `$` returns first element for given CSS `selector` in the `context` of\n    // the given element or whole document.\n    var $ = function ( selector, context ) {\n        context = context || document;\n        return context.querySelector(selector);\n    };\n    \n    // `$$` return an array of elements for given CSS `selector` in the `context` of\n    // the given element or whole document.\n    var $$ = function ( selector, context ) {\n        context = context || document;\n        return arrayify( context.querySelectorAll(selector) );\n    };\n    \n    // `triggerEvent` builds a custom DOM event with given `eventName` and `detail` data\n    // and triggers it on element given as `el`.\n    var triggerEvent = function (el, eventName, detail) {\n        var event = document.createEvent(\"CustomEvent\");\n        event.initCustomEvent(eventName, true, true, detail);\n        el.dispatchEvent(event);\n    };\n    \n    // `translate` builds a translate transform string for given data.\n    var translate = function ( t ) {\n        return \" translate3d(\" + t.x + \"px,\" + t.y + \"px,\" + t.z + \"px) \";\n    };\n    \n    // `rotate` builds a rotate transform string for given data.\n    // By default the rotations are in X Y Z order that can be reverted by passing `true`\n    // as second parameter.\n    var rotate = function ( r, revert ) {\n        var rX = \" rotateX(\" + r.x + \"deg) \",\n            rY = \" rotateY(\" + r.y + \"deg) \",\n            rZ = \" rotateZ(\" + r.z + \"deg) \";\n        \n        return revert ? rZ+rY+rX : rX+rY+rZ;\n    };\n    \n    // `scale` builds a scale transform string for given data.\n    var scale = function ( s ) {\n        return \" scale(\" + s + \") \";\n    };\n    \n    // `perspective` builds a perspective transform string for given data.\n    var perspective = function ( p ) {\n        return \" perspective(\" + p + \"px) \";\n    };\n    \n    // `getElementFromHash` returns an element located by id from hash part of\n    // window location.\n    var getElementFromHash = function () {\n        // get id from url # by removing `#` or `#/` from the beginning,\n        // so both \"fallback\" `#slide-id` and \"enhanced\" `#/slide-id` will work\n        return byId( window.location.hash.replace(/^#\\/?/,\"\") );\n    };\n    \n    // `computeWindowScale` counts the scale factor between window size and size\n    // defined for the presentation in the config.\n    var computeWindowScale = function ( config ) {\n        var hScale = window.innerHeight / config.height,\n            wScale = window.innerWidth / config.width,\n            scale = hScale > wScale ? wScale : hScale;\n        \n        if (config.maxScale && scale > config.maxScale) {\n            scale = config.maxScale;\n        }\n        \n        if (config.minScale && scale < config.minScale) {\n            scale = config.minScale;\n        }\n        \n        return scale;\n    };\n    \n    // CHECK SUPPORT\n    var body = document.body;\n    \n    var ua = navigator.userAgent.toLowerCase();\n    var impressSupported = \n                          // browser should support CSS 3D transtorms \n                           ( pfx(\"perspective\") !== null ) &&\n                           \n                          // and `classList` and `dataset` APIs\n                           ( body.classList ) &&\n                           ( body.dataset );\n                           \n                          // but some mobile devices need to be blacklisted,\n                          // because their CSS 3D support or hardware is not\n                          // good enough to run impress.js properly, sorry...\n                          // ( ua.search(/(iphone)|(ipod)|(android)/) === -1 );\n    \n    if (!impressSupported) {\n        // we can't be sure that `classList` is supported\n        body.className += \" impress-not-supported \";\n    } else {\n        body.classList.remove(\"impress-not-supported\");\n        body.classList.add(\"impress-supported\");\n    }\n    \n    // GLOBALS AND DEFAULTS\n    \n    // This is were the root elements of all impress.js instances will be kept.\n    // Yes, this means you can have more than one instance on a page, but I'm not\n    // sure if it makes any sense in practice ;)\n    var roots = {};\n    \n    // some default config values.\n    var defaults = {\n        width: 1024,\n        height: 768,\n        maxScale: 1,\n        minScale: 0,\n        \n        perspective: 1000,\n        \n        transitionDuration: 1000\n    };\n    \n    // it's just an empty function ... and a useless comment.\n    var empty = function () { return false; };\n    \n    // IMPRESS.JS API\n    \n    // And that's where interesting things will start to happen.\n    // It's the core `impress` function that returns the impress.js API\n    // for a presentation based on the element with given id ('impress'\n    // by default).\n    var impress = window.impress = function ( rootId ) {\n        var previousInit = body.classList.contains(\"impress-enabled\");\n        \n        // If impress.js is not supported by the browser return a dummy API\n        // it may not be a perfect solution but we return early and avoid\n        // running code that may use features not implemented in the browser.\n        if (!impressSupported) {\n            return {\n                init: empty,\n                goto: empty,\n                prev: empty,\n                next: empty\n            };\n        }\n        \n        rootId = rootId || \"impress\";\n        \n        // if given root is already initialized just return the API\n        if (roots[\"impress-root-\" + rootId]) {\n            return roots[\"impress-root-\" + rootId];\n        }\n        \n        // data of all presentation steps\n        var stepsData = {};\n        \n        // element of currently active step\n        var activeStep = null;\n        \n        // current state (position, rotation and scale) of the presentation\n        var currentState = null;\n        \n        // array of step elements\n        var steps = null;\n        \n        // configuration options\n        var config = null;\n        \n        // scale factor of the browser window\n        var windowScale = null;        \n        \n        // root presentation elements\n        var root = byId( rootId );\n        if (previousInit) {\n            var canvas = root.children[0];\n        } else {\n            var canvas = document.createElement(\"div\");\n        }\n        \n        var initialized = false;\n        \n        // STEP EVENTS\n        //\n        // There are currently two step events triggered by impress.js\n        // `impress:stepenter` is triggered when the step is shown on the \n        // screen (the transition from the previous one is finished) and\n        // `impress:stepleave` is triggered when the step is left (the\n        // transition to next step just starts).\n        \n        // reference to last entered step\n        var lastEntered = null;\n        \n        // `onStepEnter` is called whenever the step element is entered\n        // but the event is triggered only if the step is different than\n        // last entered step.\n        var onStepEnter = function (step) {\n            if (lastEntered !== step) {\n                triggerEvent(step, \"impress:stepenter\");\n                lastEntered = step;\n            }\n        };\n        \n        // `onStepLeave` is called whenever the step element is left\n        // but the event is triggered only if the step is the same as\n        // last entered step.\n        var onStepLeave = function (step) {\n            if (lastEntered === step) {\n                triggerEvent(step, \"impress:stepleave\");\n                lastEntered = null;\n            }\n        };\n        \n        // `initStep` initializes given step element by reading data from its\n        // data attributes and setting correct styles.\n        var initStep = function ( el, idx ) {\n            var data = el.dataset,\n                step = {\n                    translate: {\n                        x: toNumber(data.x),\n                        y: toNumber(data.y),\n                        z: toNumber(data.z)\n                    },\n                    rotate: {\n                        x: toNumber(data.rotateX),\n                        y: toNumber(data.rotateY),\n                        z: toNumber(data.rotateZ || data.rotate)\n                    },\n                    scale: toNumber(data.scale, 1),\n                    el: el\n                };\n            \n            if ( !el.id ) {\n                el.id = \"step-\" + (idx + 1);\n            }\n            \n            stepsData[\"impress-\" + el.id] = step;\n            \n            css(el, {\n                position: \"absolute\",\n                transform: \"translate(-50%,-50%)\" +\n                           translate(step.translate) +\n                           rotate(step.rotate) +\n                           scale(step.scale),\n                transformStyle: \"preserve-3d\"\n            });\n        };\n        \n        // `init` API function that initializes (and runs) the presentation.\n        var init = function () {\n            if (initialized) { return; }\n            \n            // First we set up the viewport for mobile devices.\n            // For some reason iPad goes nuts when it is not done properly.\n            var meta = $(\"meta[name='viewport']\") || document.createElement(\"meta\");\n            meta.content = \"width=device-width, minimum-scale=1, maximum-scale=1, user-scalable=no\";\n            if (meta.parentNode !== document.head) {\n                meta.name = 'viewport';\n                document.head.appendChild(meta);\n            }\n            \n            // initialize configuration object\n            var rootData = root.dataset;\n            config = {\n                width: toNumber( rootData.width, defaults.width ),\n                height: toNumber( rootData.height, defaults.height ),\n                maxScale: toNumber( rootData.maxScale, defaults.maxScale ),\n                minScale: toNumber( rootData.minScale, defaults.minScale ),                \n                perspective: toNumber( rootData.perspective, defaults.perspective ),\n                transitionDuration: toNumber( rootData.transitionDuration, defaults.transitionDuration )\n            };\n            \n            windowScale = computeWindowScale( config );\n            \n            // wrap steps with \"canvas\" element\n            if (!previousInit) {\n                arrayify( root.childNodes ).forEach(function ( el ) {\n                    canvas.appendChild( el );\n                });\n                root.appendChild(canvas);\n            }\n            \n            // set initial styles\n            document.documentElement.style.height = \"100%\";\n            \n            css(body, {\n                height: \"100%\",\n                overflow: \"hidden\"\n            });\n            \n            var rootStyles = {\n                position: \"absolute\",\n                transformOrigin: \"top left\",\n                transition: \"all 0s ease-in-out\",\n                transformStyle: \"preserve-3d\"\n            };\n            \n            css(root, rootStyles);\n            css(root, {\n                top: \"50%\",\n                left: \"50%\",\n                transform: perspective( config.perspective/windowScale ) + scale( windowScale )\n            });\n            css(canvas, rootStyles);\n            \n            body.classList.remove(\"impress-disabled\");\n            body.classList.add(\"impress-enabled\");\n            \n            // get and init steps\n            steps = $$(\".step\", root);\n            steps.forEach( initStep );\n            \n            // set a default initial state of the canvas\n            currentState = {\n                translate: { x: 0, y: 0, z: 0 },\n                rotate:    { x: 0, y: 0, z: 0 },\n                scale:     1\n            };\n            \n            initialized = true;\n            \n            triggerEvent(root, \"impress:init\", { api: roots[ \"impress-root-\" + rootId ] });\n        };\n        \n        // `getStep` is a helper function that returns a step element defined by parameter.\n        // If a number is given, step with index given by the number is returned, if a string\n        // is given step element with such id is returned, if DOM element is given it is returned\n        // if it is a correct step element.\n        var getStep = function ( step ) {\n            if (typeof step === \"number\") {\n                step = step < 0 ? steps[ steps.length + step] : steps[ step ];\n            } else if (typeof step === \"string\") {\n                step = byId(step);\n            }\n            return (step && step.id && stepsData[\"impress-\" + step.id]) ? step : null;\n        };\n        \n        // used to reset timeout for `impress:stepenter` event\n        var stepEnterTimeout = null;\n        \n        // `goto` API function that moves to step given with `el` parameter (by index, id or element),\n        // with a transition `duration` optionally given as second parameter.\n        var goto = function ( el, duration ) {\n            \n            if ( !initialized || !(el = getStep(el)) ) {\n                // presentation not initialized or given element is not a step\n                return false;\n            }\n            \n            // Sometimes it's possible to trigger focus on first link with some keyboard action.\n            // Browser in such a case tries to scroll the page to make this element visible\n            // (even that body overflow is set to hidden) and it breaks our careful positioning.\n            //\n            // So, as a lousy (and lazy) workaround we will make the page scroll back to the top\n            // whenever slide is selected\n            //\n            // If you are reading this and know any better way to handle it, I'll be glad to hear about it!\n            window.scrollTo(0, 0);\n            \n            var step = stepsData[\"impress-\" + el.id];\n\n            function updateSurface(step, operation) {\n                var state = step.dataset.state;\n                if (typeof state == 'string') {\n                    state = state.trim().split(' ');\n                    for (var i = 0; i < state.length; ++i) {\n                        innerBg.classList[operation](state[i]);\n                    }\n                }\n            }\n            \n            if ( activeStep ) {\n                activeStep.classList.remove(\"active\");\n                updateSurface(activeStep, 'remove');\n            }\n            el.classList.add(\"active\");\n            updateSurface(el, 'add');\n            \n            // compute target state of the canvas based on given step\n            var target = {\n                rotate: {\n                    x: -step.rotate.x,\n                    y: -step.rotate.y,\n                    z: -step.rotate.z\n                },\n                translate: {\n                    x: -step.translate.x,\n                    y: -step.translate.y,\n                    z: -step.translate.z\n                },\n                scale: 1 / step.scale\n            };\n            \n            // Check if the transition is zooming in or not.\n            //\n            // This information is used to alter the transition style:\n            // when we are zooming in - we start with move and rotate transition\n            // and the scaling is delayed, but when we are zooming out we start\n            // with scaling down and move and rotation are delayed.\n            var zoomin = target.scale >= currentState.scale;\n            \n            duration = toNumber(duration, config.transitionDuration);\n            var delay = (duration / 2);\n            \n            // if the same step is re-selected, force computing window scaling,\n            // because it is likely to be caused by window resize\n            if (el === activeStep) {\n                windowScale = computeWindowScale(config);\n            }\n            \n            var targetScale = target.scale * windowScale;\n            \n            // trigger leave of currently active element (if it's not the same step again)\n            if (activeStep && activeStep !== el) {\n                onStepLeave(activeStep);\n            }\n            \n            // Now we alter transforms of `root` and `canvas` to trigger transitions.\n            //\n            // And here is why there are two elements: `root` and `canvas` - they are\n            // being animated separately:\n            // `root` is used for scaling and `canvas` for translate and rotations.\n            // Transitions on them are triggered with different delays (to make\n            // visually nice and 'natural' looking transitions), so we need to know\n            // that both of them are finished.\n            css(root, {\n                // to keep the perspective look similar for different scales\n                // we need to 'scale' the perspective, too\n                transform: perspective( config.perspective / targetScale ) + scale( targetScale ),\n                transitionDuration: duration + \"ms\",\n                transitionDelay: (zoomin ? delay : 0) + \"ms\"\n            });\n            \n            css(canvas, {\n                transform: rotate(target.rotate, true) + translate(target.translate),\n                transitionDuration: duration + \"ms\",\n                transitionDelay: (zoomin ? 0 : delay) + \"ms\"\n            });\n            \n            // Here is a tricky part...\n            //\n            // If there is no change in scale or no change in rotation and translation, it means there was actually\n            // no delay - because there was no transition on `root` or `canvas` elements.\n            // We want to trigger `impress:stepenter` event in the correct moment, so here we compare the current\n            // and target values to check if delay should be taken into account.\n            //\n            // I know that this `if` statement looks scary, but it's pretty simple when you know what is going on\n            // - it's simply comparing all the values.\n            if ( currentState.scale === target.scale ||\n                (currentState.rotate.x === target.rotate.x && currentState.rotate.y === target.rotate.y &&\n                 currentState.rotate.z === target.rotate.z && currentState.translate.x === target.translate.x &&\n                 currentState.translate.y === target.translate.y && currentState.translate.z === target.translate.z) ) {\n                delay = 0;\n            }\n            \n            // store current state\n            currentState = target;\n            activeStep = el;\n            \n            // And here is where we trigger `impress:stepenter` event.\n            // We simply set up a timeout to fire it taking transition duration (and possible delay) into account.\n            //\n            // I really wanted to make it in more elegant way. The `transitionend` event seemed to be the best way\n            // to do it, but the fact that I'm using transitions on two separate elements and that the `transitionend`\n            // event is only triggered when there was a transition (change in the values) caused some bugs and \n            // made the code really complicated, cause I had to handle all the conditions separately. And it still\n            // needed a `setTimeout` fallback for the situations when there is no transition at all.\n            // So I decided that I'd rather make the code simpler than use shiny new `transitionend`.\n            //\n            // If you want learn something interesting and see how it was done with `transitionend` go back to\n            // version 0.5.2 of impress.js: http://github.com/bartaz/impress.js/blob/0.5.2/js/impress.js\n            window.clearTimeout(stepEnterTimeout);\n            stepEnterTimeout = window.setTimeout(function() {\n                onStepEnter(activeStep);\n            }, duration + delay);\n            \n            return el;\n        };\n        \n        // `prev` API function goes to previous step (in document order)\n        var prev = function () {\n            var prev = steps.indexOf( activeStep ) - 1;\n            prev = prev >= 0 ? steps[ prev ] : steps[ steps.length-1 ];\n            \n            return goto(prev);\n        };\n        \n        // `next` API function goes to next step (in document order)\n        var next = function () {\n            var next = steps.indexOf( activeStep ) + 1;\n            next = next < steps.length ? steps[ next ] : steps[ 0 ];\n            \n            return goto(next);\n        };\n        \n        // Adding some useful classes to step elements.\n        //\n        // All the steps that have not been shown yet are given `future` class.\n        // When the step is entered the `future` class is removed and the `present`\n        // class is given. When the step is left `present` class is replaced with\n        // `past` class.\n        //\n        // So every step element is always in one of three possible states:\n        // `future`, `present` and `past`.\n        //\n        // There classes can be used in CSS to style different types of steps.\n        // For example the `present` class can be used to trigger some custom\n        // animations when step is shown.\n        root.addEventListener(\"impress:init\", function(){\n            // STEP CLASSES\n            steps.forEach(function (step) {\n                step.classList.add(\"future\");\n            });\n            \n            root.addEventListener(\"impress:stepenter\", function (event) {\n                event.target.classList.remove(\"past\");\n                event.target.classList.remove(\"future\");\n                event.target.classList.add(\"present\");\n            }, false);\n            \n            root.addEventListener(\"impress:stepleave\", function (event) {\n                event.target.classList.remove(\"present\");\n                event.target.classList.add(\"past\");\n            }, false);\n            \n        }, false);\n        \n        // Adding hash change support.\n        root.addEventListener(\"impress:init\", function(){\n            \n            // last hash detected\n            var lastHash = \"\";\n            \n            // `#/step-id` is used instead of `#step-id` to prevent default browser\n            // scrolling to element in hash.\n            //\n            // And it has to be set after animation finishes, because in Chrome it\n            // makes transtion laggy.\n            // BUG: http://code.google.com/p/chromium/issues/detail?id=62820\n            root.addEventListener(\"impress:stepenter\", function (event) {\n                window.location.hash = lastHash = \"#/\" + event.target.id;\n            }, false);\n            \n            window.addEventListener(\"hashchange\", function () {\n                // When the step is entered hash in the location is updated\n                // (just few lines above from here), so the hash change is \n                // triggered and we would call `goto` again on the same element.\n                //\n                // To avoid this we store last entered hash and compare.\n                if (window.location.hash !== lastHash) {\n                    goto( getElementFromHash() );\n                }\n            }, false);\n            \n            // START \n            // by selecting step defined in url or first step of the presentation\n            goto(getElementFromHash() || steps[0], 0);\n        }, false);\n        \n        body.classList.add(\"impress-disabled\");\n        \n        // store and return API for given impress.js root element\n        return (roots[ \"impress-root-\" + rootId ] = {\n            init: init,\n            goto: goto,\n            next: next,\n            prev: prev\n        });\n\n    };\n    \n    // flag that can be used in JS to check if browser have passed the support test\n    impress.supported = impressSupported;\n    \n})(document, window);\n\n// NAVIGATION EVENTS\n\n// As you can see this part is separate from the impress.js core code.\n// It's because these navigation actions only need what impress.js provides with\n// its simple API.\n//\n// In future I think about moving it to make them optional, move to separate files\n// and treat more like a 'plugins'.\n(function ( document, window ) {\n    'use strict';\n    \n    // throttling function calls, by Remy Sharp\n    // http://remysharp.com/2010/07/21/throttling-function-calls/\n    var throttle = function (fn, delay) {\n        var timer = null;\n        return function () {\n            var context = this, args = arguments;\n            clearTimeout(timer);\n            timer = setTimeout(function () {\n                fn.apply(context, args);\n            }, delay);\n        };\n    };\n    \n    // wait for impress.js to be initialized\n    document.addEventListener(\"impress:init\", function (event) {\n        // Getting API from event data.\n        // So you don't event need to know what is the id of the root element\n        // or anything. `impress:init` event data gives you everything you \n        // need to control the presentation that was just initialized.\n        var api = event.detail.api;\n        \n        // KEYBOARD NAVIGATION HANDLERS\n        \n        // Prevent default keydown action when one of supported key is pressed.\n        document.addEventListener(\"keydown\", function ( event ) {\n            if ( event.keyCode === 9 || ( event.keyCode >= 32 && event.keyCode <= 34 ) || (event.keyCode >= 37 && event.keyCode <= 40) ) {\n                event.preventDefault();\n            }\n        }, false);\n        \n        // Trigger impress action (next or prev) on keyup.\n        \n        // Supported keys are:\n        // [space] - quite common in presentation software to move forward\n        // [up] [right] / [down] [left] - again common and natural addition,\n        // [pgdown] / [pgup] - often triggered by remote controllers,\n        // [tab] - this one is quite controversial, but the reason it ended up on\n        //   this list is quite an interesting story... Remember that strange part\n        //   in the impress.js code where window is scrolled to 0,0 on every presentation\n        //   step, because sometimes browser scrolls viewport because of the focused element?\n        //   Well, the [tab] key by default navigates around focusable elements, so clicking\n        //   it very often caused scrolling to focused element and breaking impress.js\n        //   positioning. I didn't want to just prevent this default action, so I used [tab]\n        //   as another way to moving to next step... And yes, I know that for the sake of\n        //   consistency I should add [shift+tab] as opposite action...\n        document.addEventListener(\"keyup\", function ( event ) {\n            if ( event.keyCode === 9 || ( event.keyCode >= 32 && event.keyCode <= 34 ) || (event.keyCode >= 37 && event.keyCode <= 40) ) {\n                switch( event.keyCode ) {\n                    case 33: // pg up\n                    case 37: // left\n                    case 38: // up\n                             api.prev();\n                             break;\n                    case 9:  // tab\n                    case 32: // space\n                    case 34: // pg down\n                    case 39: // right\n                    case 40: // down\n                             api.next();\n                             break;\n                }\n                \n                event.preventDefault();\n            }\n        }, false);\n        \n        // delegated handler for clicking on the links to presentation steps\n        document.addEventListener(\"click\", function ( event ) {\n            // event delegation with \"bubbling\"\n            // check if event target (or any of its parents is a link)\n            var target = event.target;\n            while ( (target.tagName !== \"A\") &&\n                    (target !== document.documentElement) ) {\n                target = target.parentNode;\n            }\n            \n            if ( target.tagName === \"A\" ) {\n                var href = target.getAttribute(\"href\");\n                \n                // if it's a link to presentation step, target this step\n                if ( href && href[0] === '#' ) {\n                    target = document.getElementById( href.slice(1) );\n                }\n            }\n            \n            if ( api.goto(target) ) {\n                event.stopImmediatePropagation();\n                event.preventDefault();\n            }\n        }, false);\n        \n        // delegated handler for clicking on step elements\n        document.addEventListener(\"click\", function ( event ) {\n            var target = event.target;\n            // find closest step element that is not active\n            while ( !(target.classList.contains(\"step\") && !target.classList.contains(\"active\")) &&\n                    (target !== document.documentElement) ) {\n                target = target.parentNode;\n            }\n            \n            if ( api.goto(target) ) {\n                event.preventDefault();\n            }\n        }, false);\n        \n        // touch handler to detect taps on the left and right side of the screen\n        // based on awesome work of @hakimel: https://github.com/hakimel/reveal.js\n        document.addEventListener(\"touchstart\", function ( event ) {\n            if (event.touches.length === 1) {\n                var x = event.touches[0].clientX,\n                    width = window.innerWidth * 0.3,\n                    result = null;\n                    \n                if ( x < width ) {\n                    result = api.prev();\n                } else if ( x > window.innerWidth - width ) {\n                    result = api.next();\n                }\n                \n                if (result) {\n                    event.preventDefault();\n                }\n            }\n        }, false);\n        \n        // rescale presentation when window is resized\n        window.addEventListener(\"resize\", throttle(function () {\n            // force going to active step again, to trigger rescaling\n            api.goto( document.querySelector(\".step.active\"), 500 );\n        }, 250), false);\n        \n    }, false);\n        \n})(document, window);\n\n// THAT'S ALL FOLKS!\n//\n// Thanks for reading it all.\n// Or thanks for scrolling down and reading the last part.\n//\n// I've learnt a lot when building impress.js and I hope this code and comments\n// will help somebody learn at least some part of it.\n\n\ndocument.addEventListener(\"keydown\", function(e) {\n    if (e.keyCode == 27) {\n        impress().goto('overview');\n    }\n}, false);\n\n}"
  },
  {
    "path": "works/demo/ee/index_files/loadPresentation.js",
    "content": "var loadPresentation = function() {\n\tvar presentation = localStorage.getItem('preview-string');\n\tvar config = JSON.parse(localStorage.getItem('preview-config'));\n\n\tif (presentation) {\n\t\tdocument.body.innerHTML = presentation;\n\t//\tdocument.body.className = config.surface + \" \" + document.body.className;\n\t}\n};\n"
  },
  {
    "path": "works/demo/ee/index_files/main.css",
    "content": "html, body, div, span, applet, object, iframe,\nh1, h2, h3, h4, h5, h6, p, blockquote, pre,\na, abbr, acronym, address, big, cite, code,\ndel, dfn, em, img, ins, kbd, q, s, samp,\nsmall, strike, strong, sub, sup, tt, var, u, i, center,\ndl, dt, dd, ol, ul, li,\nfieldset, form, label, legend,\ntable, caption, tbody, tfoot, thead, tr, th, td,\narticle, aside, canvas, details, embed, \nfigure, figcaption, footer, header, hgroup, \nmenu, nav, output, ruby, section, summary,\ntime, mark, audio, video {\n    margin: 0;\n    padding: 0;\n    border: 0;\n    font-size: 100%;\n    font: inherit;\n    vertical-align: baseline;\n}\n\n/* HTML5 display-role reset for older browsers */\narticle, aside, details, figcaption, figure, \nfooter, header, hgroup, menu, nav, section {\n    display: block;\n}\n\nbody {\n    line-height: 1;\n}\n\nol, ul {\n    /*list-style: none;*/\n}\nblockquote, q {\n    quotes: none;\n}\nblockquote:before, blockquote:after,\nq:before, q:after {\n    content: '';\n    content: none;\n}\n\ntable {\n    border-collapse: collapse;\n    border-spacing: 0;\n}\n\n/*.antialias {\n    -webkit-transform: translate3d(0,0,0);\n    -moz-transform: translate3d(0,0,0);\n    transform: translate3d(0,0,0);\n}\n*/\n\nbody {\n    min-height: 740px;\n    \n    background: rgb(215, 215, 215);\n    background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190)));\n    background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));\n    background:    -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));\n    background:     -ms-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));\n    background:      -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));\n    background:         radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190));    \n}\n\n\n/*\n    Because the main point behind the impress.js demo is to demo impress.js\n    we display a fallback message for users with browsers that don't support\n    all the features required by it.\n    \n    All of the content will be still fully accessible for them, but I want\n    them to know that they are missing something - that's what the demo is\n    about, isn't it?\n    \n    And then we hide the message, when support is detected in the browser.\n*/\n\n.fallback-message {\n    font-family: sans-serif;\n    line-height: 1.3;\n    \n    width: 780px;\n    padding: 10px 10px 0;\n    margin: 20px auto;\n\n    border: 1px solid #E4C652;\n    border-radius: 10px;\n    background: #EEDC94;\n}\n\n.fallback-message p {\n    margin-bottom: 10px;\n}\n\n.impress-supported .fallback-message {\n    display: none;\n}\n\n/*\n    Now let's style the presentation steps.\n    \n    We start with basics to make sure it displays correctly in everywhere ...\n*/\n\n.step {\n    position: relative;\n    /*width: 900px;\n    padding: 40px;*/\n    /*margin: 20px auto;*/\n\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing:    border-box;\n    -ms-box-sizing:     border-box;\n    -o-box-sizing:      border-box;\n    box-sizing:         border-box;\n}\n\n.impress-enabled .strut-slide-overview .step {\n    opacity: 1;\n}\n\n/*\n    ... and we enhance the styles for impress.js.\n    \n    Basically we remove the margin and make inactive steps a little bit transparent.\n*/\n.impress-enabled .step {\n    margin: 0;\n    opacity: 0.3;\n\n    -webkit-transition: opacity 1s;\n    -moz-transition:    opacity 1s;\n    -ms-transition:     opacity 1s;\n    -o-transition:      opacity 1s;\n    transition:         opacity 1s;\n}\n\n.impress-enabled .step.active { opacity: 1 }\n\n\n/*\n    And now we start to style each step separately.\n    \n    I agree that this may be not the most efficient, object-oriented and\n    scalable way of styling, but most of steps have quite a custom look\n    and typography tricks here and there, so they had to be styles separately.\n\n    First is the title step with a big <h1> (no room for padding) and some\n    3D positioning along Z axis.\n*/\n\n\n\n/*\n    The last step is an overview.\n    There is no content in it, so we make sure it's not visible because we want\n    to be able to click on other steps.\n\n*/\n#overview { display: none }\n\n/*\n    We also make other steps visible and give them a pointer cursor using the\n    `impress-on-` class.\n*/\n.impress-on-overview .step {\n    opacity: 1;\n    cursor: pointer;\n}\n\n\n/*\n    Now, when we have all the steps styled let's give users a hint how to navigate\n    around the presentation.\n    \n    The best way to do this would be to use JavaScript, show a delayed hint for a\n    first time users, then hide it and store a status in cookie or localStorage...\n    \n    But I wanted to have some CSS fun and avoid additional scripting...\n    \n    Let me explain it first, so maybe the transition magic will be more readable\n    when you read the code.\n    \n    First of all I wanted the hint to appear only when user is idle for a while.\n    You can't detect the 'idle' state in CSS, but I delayed a appearing of the\n    hint by 5s using transition-delay.\n    \n    You also can't detect in CSS if the user is a first-time visitor, so I had to\n    make an assumption that I'll only show the hint on the first step. And when\n    the step is changed hide the hint, because I can assume that user already\n    knows how to navigate.\n    \n    To summarize it - hint is shown when the user is on the first step for longer\n    than 5 seconds.\n    \n    The other problem I had was caused by the fact that I wanted the hint to fade\n    in and out. It can be easily achieved by transitioning the opacity property.\n    But that also meant that the hint was always on the screen, even if totally \n    transparent. It covered part of the screen and you couldn't correctly clicked\n    through it.\n    Unfortunately you cannot transition between display `block` and `none` in pure\n    CSS, so I needed a way to not only fade out the hint but also move it out of\n    the screen.\n    \n    I solved this problem by positioning the hint below the bottom of the screen\n    with CSS transform and moving it up to show it. But I also didn't want this move\n    to be visible. I wanted the hint only to fade in and out visually, so I delayed\n    the fade in transition, so it starts when the hint is already in its correct\n    position on the screen.\n    \n    I know, it sounds complicated ... maybe it would be easier with the code?\n*/\n\n.hint {\n    /*\n        We hide the hint until presentation is started and from browsers not supporting\n        impress.js, as they will have a linear scrollable view ...\n    */\n    display: none;\n    \n    /*\n        ... and give it some fixed position and nice styles.\n    */\n    position: fixed;\n    left: 0;\n    right: 0;\n    bottom: 200px;\n    \n    background: rgba(0,0,0,0.5);\n    color: #EEE;\n    text-align: center;\n    \n    font-size: 50px;\n    padding: 20px;\n    \n    z-index: 100;\n    \n    /*\n        By default we don't want the hint to be visible, so we make it transparent ...\n    */\n    opacity: 0;\n    \n    /*\n        ... and position it below the bottom of the screen (relative to it's fixed position)\n    */\n    -webkit-transform: translateY(400px);\n    -moz-transform:    translateY(400px);\n    -ms-transform:     translateY(400px);\n    -o-transform:      translateY(400px);\n    transform:         translateY(400px);\n\n    /*\n        Now let's imagine that the hint is visible and we want to fade it out and move out\n        of the screen.\n        \n        So we define the transition on the opacity property with 1s duration and another\n        transition on transform property delayed by 1s so it will happen after the fade out\n        on opacity finished.\n        \n        This way user will not see the hint moving down.\n    */\n    -webkit-transition: opacity 1s, -webkit-transform 0.5s 1s;\n    -moz-transition:    opacity 1s,    -moz-transform 0.5s 1s;\n    -ms-transition:     opacity 1s,     -ms-transform 0.5s 1s;\n    -o-transition:      opacity 1s,      -o-transform 0.5s 1s;\n    transition:         opacity 1s,         transform 0.5s 1s;\n}\n\n/*\n    Now we 'enable' the hint when presentation is initialized ...\n*/\n.impress-enabled .hint { display: block }\n\n/*\n    ... and we will show it when the first step (with id 'bored') is active.\n*/\n.strut-slide-0 .hint {\n    /*\n        We remove the transparency and position the hint in its default fixed\n        position.\n    */\n    opacity: 1;\n    \n    -webkit-transform: translateY(0px);\n    -moz-transform:    translateY(0px);\n    -ms-transform:     translateY(0px);\n    -o-transform:      translateY(0px);\n    transform:         translateY(0px);\n    \n    /*\n        Now for fade in transition we have the oposite situation from the one\n        above.\n        \n        First after 4.5s delay we animate the transform property to move the hint\n        into its correct position and after that we fade it in with opacity \n        transition.\n    */\n    -webkit-transition: opacity 1s 5s, -webkit-transform 0.5s 2.5s;\n    -moz-transition:    opacity 1s 5s,    -moz-transform 0.5s 2.5s;\n    -ms-transition:     opacity 1s 5s,     -ms-transform 0.5s 2.5s;\n    -o-transition:      opacity 1s 5s,      -o-transform 0.5s 2.5s;\n    transition:         opacity 1s 5s,         transform 0.5s 2.5s;\n}\n\n/*\n    And as the last thing there is a workaround for quite strange bug.\n    It happens a lot in Chrome. I don't remember if I've seen it in Firefox.\n    \n    Sometimes the element positioned in 3D (especially when it's moved back\n    along Z axis) is not clickable, because it falls 'behind' the <body>\n    element.\n    \n    To prevent this, I decided to make <body> non clickable by setting \n    pointer-events property to `none` value.\n    Value if this property is inherited, so to make everything else clickable\n    I bring it back on the #impress element.\n    \n    If you want to know more about `pointer-events` here are some docs:\n    https://developer.mozilla.org/en/CSS/pointer-events\n    \n    There is one very important thing to notice about this workaround - it makes\n    everything 'unclickable' except what's in #impress element.\n    \n    So use it wisely ... or don't use at all.\n*/\n.impress-enabled          { pointer-events: none }\n.impress-enabled #impress { pointer-events: auto }\n\n/*\n    There is one funny thing I just realized.\n    \n    Thanks to this workaround above everything except #impress element is invisible\n    for click events. That means that the hint element is also not clickable.\n    So basically all of this transforms and delayed transitions trickery was probably\n    not needed at all...\n    \n    But it was fun to learn about it, wasn't it?\n*/\n\n/*\n    That's all I have for you in this file.\n    Thanks for reading. I hope you enjoyed it at least as much as I enjoyed writing it\n    for you.\n*/"
  },
  {
    "path": "works/demo/ee/index_files/onready.js",
    "content": "var ready = (function(){    \n    var readyList,\n        DOMContentLoaded,\n        class2type = {};\n        class2type[\"[object Boolean]\"] = \"boolean\";\n        class2type[\"[object Number]\"] = \"number\";\n        class2type[\"[object String]\"] = \"string\";\n        class2type[\"[object Function]\"] = \"function\";\n        class2type[\"[object Array]\"] = \"array\";\n        class2type[\"[object Date]\"] = \"date\";\n        class2type[\"[object RegExp]\"] = \"regexp\";\n        class2type[\"[object Object]\"] = \"object\";\n\n    var ReadyObj = {\n        // Is the DOM ready to be used? Set to true once it occurs.\n        isReady: false,\n        // A counter to track how many items to wait for before\n        // the ready event fires. See #6781\n        readyWait: 1,\n        // Hold (or release) the ready event\n        holdReady: function( hold ) {\n            if ( hold ) {\n                ReadyObj.readyWait++;\n            } else {\n                ReadyObj.ready( true );\n            }\n        },\n        // Handle when the DOM is ready\n        ready: function( wait ) {\n            // Either a released hold or an DOMready/load event and not yet ready\n            if ( (wait === true && !--ReadyObj.readyWait) || (wait !== true && !ReadyObj.isReady) ) {\n                // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n                if ( !document.body ) {\n                    return setTimeout( ReadyObj.ready, 1 );\n                }\n\n                // Remember that the DOM is ready\n                ReadyObj.isReady = true;\n                // If a normal DOM Ready event fired, decrement, and wait if need be\n                if ( wait !== true && --ReadyObj.readyWait > 0 ) {\n                    return;\n                }\n                // If there are functions bound, to execute\n                readyList.resolveWith( document, [ ReadyObj ] );\n\n                // Trigger any bound ready events\n                //if ( ReadyObj.fn.trigger ) {\n                //  ReadyObj( document ).trigger( \"ready\" ).unbind( \"ready\" );\n                //}\n            }\n        },\n        bindReady: function() {\n            if ( readyList ) {\n                return;\n            }\n            readyList = ReadyObj._Deferred();\n\n            // Catch cases where $(document).ready() is called after the\n            // browser event has already occurred.\n            if ( document.readyState === \"complete\" ) {\n                // Handle it asynchronously to allow scripts the opportunity to delay ready\n                return setTimeout( ReadyObj.ready, 1 );\n            }\n\n            // Mozilla, Opera and webkit nightlies currently support this event\n            if ( document.addEventListener ) {\n                // Use the handy event callback\n                document.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n                // A fallback to window.onload, that will always work\n                window.addEventListener( \"load\", ReadyObj.ready, false );\n\n            // If IE event model is used\n            } else if ( document.attachEvent ) {\n                // ensure firing before onload,\n                // maybe late but safe also for iframes\n                document.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n                // A fallback to window.onload, that will always work\n                window.attachEvent( \"onload\", ReadyObj.ready );\n\n                // If IE and not a frame\n                // continually check to see if the document is ready\n                var toplevel = false;\n\n                try {\n                    toplevel = window.frameElement == null;\n                } catch(e) {}\n\n                if ( document.documentElement.doScroll && toplevel ) {\n                    doScrollCheck();\n                }\n            }\n        },\n        _Deferred: function() {\n            var // callbacks list\n                callbacks = [],\n                // stored [ context , args ]\n                fired,\n                // to avoid firing when already doing so\n                firing,\n                // flag to know if the deferred has been cancelled\n                cancelled,\n                // the deferred itself\n                deferred  = {\n\n                    // done( f1, f2, ...)\n                    done: function() {\n                        if ( !cancelled ) {\n                            var args = arguments,\n                                i,\n                                length,\n                                elem,\n                                type,\n                                _fired;\n                            if ( fired ) {\n                                _fired = fired;\n                                fired = 0;\n                            }\n                            for ( i = 0, length = args.length; i < length; i++ ) {\n                                elem = args[ i ];\n                                type = ReadyObj.type( elem );\n                                if ( type === \"array\" ) {\n                                    deferred.done.apply( deferred, elem );\n                                } else if ( type === \"function\" ) {\n                                    callbacks.push( elem );\n                                }\n                            }\n                            if ( _fired ) {\n                                deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );\n                            }\n                        }\n                        return this;\n                    },\n\n                    // resolve with given context and args\n                    resolveWith: function( context, args ) {\n                        if ( !cancelled && !fired && !firing ) {\n                            // make sure args are available (#8421)\n                            args = args || [];\n                            firing = 1;\n                            try {\n                                while( callbacks[ 0 ] ) {\n                                    callbacks.shift().apply( context, args );//shifts a callback, and applies it to document\n                                }\n                            }\n                            finally {\n                                fired = [ context, args ];\n                                firing = 0;\n                            }\n                        }\n                        return this;\n                    },\n\n                    // resolve with this as context and given arguments\n                    resolve: function() {\n                        deferred.resolveWith( this, arguments );\n                        return this;\n                    },\n\n                    // Has this deferred been resolved?\n                    isResolved: function() {\n                        return !!( firing || fired );\n                    },\n\n                    // Cancel\n                    cancel: function() {\n                        cancelled = 1;\n                        callbacks = [];\n                        return this;\n                    }\n                };\n\n            return deferred;\n        },\n        type: function( obj ) {\n            return obj == null ?\n                String( obj ) :\n                class2type[ Object.prototype.toString.call(obj) ] || \"object\";\n        }\n    }\n    // The DOM ready check for Internet Explorer\n    function doScrollCheck() {\n        if ( ReadyObj.isReady ) {\n            return;\n        }\n\n        try {\n            // If IE is used, use the trick by Diego Perini\n            // http://javascript.nwbox.com/IEContentLoaded/\n            document.documentElement.doScroll(\"left\");\n        } catch(e) {\n            setTimeout( doScrollCheck, 1 );\n            return;\n        }\n\n        // and execute any waiting functions\n        ReadyObj.ready();\n    }\n    // Cleanup functions for the document ready method\n    if ( document.addEventListener ) {\n        DOMContentLoaded = function() {\n            document.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n            ReadyObj.ready();\n        };\n\n    } else if ( document.attachEvent ) {\n        DOMContentLoaded = function() {\n            // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n            if ( document.readyState === \"complete\" ) {\n                document.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n                ReadyObj.ready();\n            }\n        };\n    }\n    function ready( fn ) {\n        // Attach the listeners\n        ReadyObj.bindReady();\n\n        var type = ReadyObj.type( fn );\n\n        // Add the callback\n        readyList.done( fn );//readyList is result of _Deferred()\n    }\n    return ready;\n})();"
  },
  {
    "path": "works/demo/ee/index_files/surfaceClasses.css",
    "content": ".bg-surf-grad-black {\n\tbackground-color: #333;\n\t/*background-image: -webkit-radial-gradient(#333, #111);\n\tbackground-image: -moz-radial-gradient(#333, #111);\n\tbackground-image: -ms-radial-gradient(#333, #111);\n\tbackground-image: -o-radial-gradient(#333, #111);\n\tbackground-image: radial-gradient(#333, #111);*/\n}\n\n.bg-surf-grad-light {\n\tbackground-color: #FFF;\n\t/*background-image: -webkit-radial-gradient(#FFF, #DDD);\n\tbackground-image: -moz-radial-gradient(#FFF, #DDD);\n\tbackground-image: -ms-radial-gradient(#FFF, #DDD);\n\tbackground-image: -o-radial-gradient(#FFF, #DDD);\n\tbackground-image: radial-gradient(#FFF, #DDD);*/\n}\n\n.bg-surf-grad-smoke {\n\tbackground-color: #EEE;\n\t/*background-image: -webkit-radial-gradient(#EEE, #CCC);\n\tbackground-image: -moz-radial-gradient(#EEE, #CCC);\n\tbackground-image: -ms-radial-gradient(#EEE, #CCC);\n\tbackground-image: -o-radial-gradient(#EEE, #CCC);\n\tbackground-image: radial-gradient(#EEE, #CCC);*/\n}\n\n.bg-surf-grad-orange {\n\tbackground-color: #945353;\n\t/*background-image: -webkit-radial-gradient(#945353, #774040);\n\tbackground-image: -moz-radial-gradient(#945353, #774040);\n\tbackground-image: -ms-radial-gradient(#945353, #774040);\n\tbackground-image: -o-radial-gradient(#945353, #774040);\n\tbackground-image: radial-gradient(#945353, #774040);*/\n}\n\n.bg-surf-grad-yellow {\n\tbackground-color: #cfb98c;\n\t/*background-image: -webkit-radial-gradient(#cfb98c, #D1B377);\n\tbackground-image: -moz-radial-gradient(#cfb98c, #D1B377);\n\tbackground-image: -ms-radial-gradient(#cfb98c, #D1B377);\n\tbackground-image: -o-radial-gradient(#cfb98c, #D1B377);\n\tbackground-image: radial-gradient(#cfb98c, #D1B377);*/\n}\n\n.bg-surf-grad-darkgreen {\n\tbackground-color: #4a939e;\n\t/*background-image: -webkit-radial-gradient(#4a939e, #134952);\n\tbackground-image: -moz-radial-gradient(#4a939e, #134952);\n\tbackground-image: -ms-radial-gradient(#4a939e, #134952);\n\tbackground-image: -o-radial-gradient(#4a939e, #134952);\n\tbackground-image: radial-gradient(#4a939e, #134952);*/\n}\n\n.bg-surf-grad-sky {\n\tbackground-color: #5e699c;\n\t/*background-image: -webkit-radial-gradient(#5e699c, #515E99);\n\tbackground-image: -moz-radial-gradient(#5e699c, #515E99);\n\tbackground-image: -ms-radial-gradient(#5e699c, #515E99);\n\tbackground-image: -o-radial-gradient(#5e699c, #515E99);\n\tbackground-image: radial-gradient(#5e699c, #515E99);*/\n}\n\n.bg-surf-grad-lavender {\n\tbackground-color: #554b61;\n\t/*background-image: -webkit-radial-gradient(#554b61, #443C4D);\n\tbackground-image: -moz-radial-gradient(#554b61, #443C4D);\n\tbackground-image: -ms-radial-gradient(#554b61, #443C4D);\n\tbackground-image: -o-radial-gradient(#554b61, #443C4D);\n\tbackground-image: radial-gradient(#554b61, #443C4D);*/\n}\n\n.bg-surf-grad-purple {\n\tbackground-color: #775796;\n\t/*background-image: -webkit-radial-gradient(#775796, #6C478F);\n\tbackground-image: -moz-radial-gradient(#775796, #6C478F);\n\tbackground-image: -ms-radial-gradient(#775796, #6C478F);\n\tbackground-image: -o-radial-gradient(#775796, #6C478F);\n\tbackground-image: radial-gradient(#775796, #6C478F);*/\n}\n\n.bg-surf-grad-salmon {\n\tbackground-color: #cfa2a2;\n\t/*background-image: -webkit-radial-gradient(#cfa2a2, #C98D8D);\n\tbackground-image: -moz-radial-gradient(#cfa2a2, #C98D8D);\n\tbackground-image: -ms-radial-gradient(#cfa2a2, #C98D8D);\n\tbackground-image: -o-radial-gradient(#cfa2a2, #C98D8D);\n\tbackground-image: radial-gradient(#cfa2a2, #C98D8D);*/\n}\n\n.bg-surf-grad-grass {\n\tbackground-color: #6c855d;\n\t/*background-image: -webkit-radial-gradient(#6c855d, #597847);\n\tbackground-image: -moz-radial-gradient(#6c855d, #597847);\n\tbackground-image: -ms-radial-gradient(#6c855d, #597847);\n\tbackground-image: -o-radial-gradient(#6c855d, #597847);\n\tbackground-image: radial-gradient(#6c855d, #597847);*/\n}"
  },
  {
    "path": "works/demo/ee/index_files/web-fonts.css",
    "content": "@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Lato Bold'), local('Lato-Bold'), url(Lato-Bold.woff) format('woff');\n}\n@font-face {\n  font-family: 'Hammersmith One';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Hammersmith One'), local('HammersmithOne'), url(HammersmithOne.woff) format('woff');\n}\n@font-face {\n  font-family: 'Gorditas';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Gorditas'), local('Gorditas-Regular'), url(Gorditas-Regular.woff) format('woff');\n}\n@font-face {\n  font-family: 'Fredoka One';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Fredoka One'), local('FredokaOne-Regular'), url(FredokaOne-Regular.woff) format('woff');\n}\n@font-face {\n  font-family: 'Ubuntu';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Ubuntu'), url(Ubuntu.woff) format('woff');\n}\n@font-face {\n  font-family: 'Ubuntu';\n  font-style: normal;\n  font-weight: 700;\n  src: local('Ubuntu Bold'), local('Ubuntu-Bold'), url(Ubuntu-Bold.woff) format('woff');\n}\n@font-face {\n  font-family: 'PressStart2P';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Press Start 2P'), local('PressStart2P-Regular'), url(PressStart2P-Regular.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: italic;\n  font-weight: 700;\n  src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url(Lato-BoldItalic.woff) format('woff');\n}\n@font-face {\n  font-family: 'Abril Fatface';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Abril Fatface'), local('AbrilFatface-Regular'), url(AbrilFatface-Regular.woff) format('woff');\n}\n@font-face {\n  font-family: 'Lato';\n  font-style: normal;\n  font-weight: 400;\n  src: local('Lato Regular'), local('Lato-Regular'), url(Lato-Regular.woff) format('woff');\n}\n@font-face {\n    font-family: 'Droid Sans Mono';\n    font-style: normal;\n    font-weight: 700;\n    src: local('Droid Sans Mono'), local('Droid-Sans-Mono'), url(Droid-Sans-Mono.woff) format('woff');\n}"
  },
  {
    "path": "works/demo/html5/ali.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>JS Bin</title>\n</head>\n<style type=\"text/css\">\n\t*{\n\t\tmargin: 0;\n\t\tpadding : 0;\n\t}\n\tli {\n\t\tlist-style-type: none;\n\t}\n\t#page {\n\t\twidth: 960px;\n\t\tmargin: 0px auto;\n\t\ttext-align: center;\n\t}\n\theader {\n\t\tmargin-bottom: 20px;\n\t\tbackground: #eee;\n\t\tborder-top: 3px solid black;\n\t\tborder-bottom: 3px solid black;\n\t}\n\n\theader h1 {\n\t\tpadding: 50px 0;\n\t}\n\t#content ul {\n\t\tfloat: left;\n\t\tmargin-right: 20px;\n\t}\n\t#content ul li {\n\t\theight: 30px;\n\t\tcolor: blue;\n\t} \n\n\t#content table{\n\t\tfloat: left;;\n\t\tborder-collapse: collapse;\n        border: none;\n        width: 86%;\n\t}\n\t#content table tr {\n\t\theight: 30px;\n\t\tline-height: 30px;\n\t}\n\t#content table th{\n\t\ttext-align: center;\n        border: 1px solid #000 ;\n\n    }\n \t#content table td{\n \t\twidth: 30%;\n        border: 1px solid #000 ;\n        text-align: left;\n    }\n    @media screen and (max-width:600px) {\n\t    #page {\n\t\t\twidth: 100%;\n\t\t\tmargin: 0px auto;\n\t\t\ttext-align: center;\n\t\t}\n\t\t#content ul {\n\t\t\tfloat: left;\n\t\t\twidth: 100%;\n\t\t\t\n\t\t}\n\n\t\t#content ul li {\n\t\t\tcolor: blue;\n\t\t\tfloat: left;\n\t\t\twidth: 33%;\n\t\t\theight: 150px;\n\t\t\tline-height: 150px;\n\t\t}\n\n\t\t#content table{\n\n\t        width: 100%;\n\t\t}\n    }\n</style>\n<body>\n\t<div id=\"page\">\n\t\t<header>\n\t\t\t<h1>阿里巴巴面试题</h1>\n\t\t</header>\n\t\t<section id=\"content\">\n\t\t\t<ul>\n\t\t\t\t<li>前段工程面试题</li>\n\t\t\t\t<li>设计师面试题</li>\n\t\t\t\t<li>JAVA面试题</li>\n\t\t\t</ul>\n\t\t\t<table>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr><th>我是标题一</th><th>标题二</th><th>标题三</th></tr>\n\t\t\t\t\t<tr><td>内容</td><td>内容</td><td>内容</td></tr>\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</section>\n\t</div>\n</body>\n</html>"
  },
  {
    "path": "works/demo/qqzone-img/index.html",
    "content": "<!DOCTYPE html>\n<html>\n\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title></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\t\n\t\t\t}\n\t\t\t.container {\n\t\t\t\twidth: 960px;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t.show-img {\n\t\t\t\twidth: 500px;\n\t\t\t\theight: 400px;\n\t\t\t\tmargin: 50px auto;\n\t\t\t\toverflow:hidden;\n\t\t\t\tborder: 1px solid #000000;\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t.show-img img {\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\t.show-img .ico-long-pic {\n\t\t\t\tpadding: 0 5px;\n\t\t\t\tposition: absolute;\n\t\t\t\tbackground: #009999;\n\t\t\t\tcolor: #FFF;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 0;\n\t\t\t\tz-index: 9;\n\t\t\t}\n\t\t\t.up {\n\t\t\t\twidth: 500px;\n\t\t\t\theight: 200px;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 0;\n\t\t\t\topacity: 0;\n\t\t\t\tfilter: Alpha(opacity=0);\n\t\t\t\tz-index: 99;\n\t\t\t} \n\t\t\t.down {\n\t\t\t\twidth: 500px;\n\t\t\t\theight: 200px;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 0;\n\t\t\t\ttop: 200px;\n\t\t\t\topacity: 0;\n\t\t\t\tfilter: Alpha(opacity=0);\n\t\t\t\tz-index: 99;\n\t\t\t} \n\t\t</style>\n\t</head>\n\n\t<body>\n\t\t<div class=\"container\">\n\t\t\t<div class=\"show-img\">\n\t\t\t\t<i class=\"ico-long-pic\">长图</i>\n\t\t\t\t<div class=\"up\"></div>\n\t\t\t\t<div class=\"down\"></div>\n\t\t\t\t<img id=\"long-pic\" src=\"1.jpg\" alt=\"\" />\n\t\t\t</div>\n\t\t</div>\n\t</body>\n\t<script>\n\t\tvar img = document.getElementById('long-pic');\n\t\t\n\t\tvar context = img.parentNode;\n\t\n\t\t\n\t\t\n\t\tcontext.onmouseover = function() {\n\t\t\t\n\t\t\tvar e = event || window.event,\n\t\t\t\ttarget = e.target || e.srcElement;\n\t\t\t\trelativeX = e.clientX - context.offsetLeft,\n\t\t\t\trelativeY = e.clientY - context.offsetTop,\n\t\t\t\ttargetH = -img.offsetHeight+context.offsetHeight,\n\t\t\t\tcompareH =  context.offsetHeight /2;\n\t\t\t\t\n\t\t\t\tif(target.className == 'up') {\n\t\t\t\t\t\n\t\t\t\t\tstartMove(img,0);\n\t\t\t\t}\n\t\t\t\tif(target.className == 'down') {\n\t\t\t\t\tstartMove(img,targetH);\n\t\t\t\t}\n\t\t\t\n\t\t}\n\t\t\n\t\tcontext.onmouseout = function() {\n\t\t\tif (img.timer) {\n\t\t\t\tclearInterval(img.timer);\n\t\t\t}\t\t\t\n\t\t}\n\t\t\n\t\tfunction startMove(obj, iTarget) {\n\t\t\tclearInterval(obj.timer);\n\t\t\t\n\t\t\tvar speed = obj.offsetTop > iTarget ? -10 : 10;\n\t\t\t\n\n\t\t\tobj.timer = setInterval(function(){\n\t\t\t\tif (Math.abs(iTarget - obj.offsetTop) <= Math.abs(speed)) {\n\t\t\t\t\tclearInterval(obj.timer);\n\t\t\t\t\tobj.style.top = iTarget + 'px';\n\t\t\t\t} else{\n\t\t\t\t\tobj.style.top = obj.offsetTop + speed + 'px';\n\t\t\t\t}\n\t\t\t},30);\n\t\t\t\n\t\t}\n\t\t\n\t\tfunction d(msg) {\n\t\t\tif(console) {\n\t\t\t\tconsole.log(msg);\n\t\t\t}\n\t\t}\n\t</script>\n\n</html>\n"
  },
  {
    "path": "works/demo/sm-meituan/index.html",
    "content": "<!doctype html>\n<html>\n    <head>\n        <meta charset=\"utf-8\">\n        <meta content=\"width=device-width,maximum-scale=1.0,minimum-scale=1.0,initial-scale=1.0,user-scalable=no\"\n        name=\"viewport\">\n        <meta name=\"format-detection\" content=\"telephone=no\">\n        <title>\n            网页搜索_美团\n        </title>\n        <link rel=\"shortcut icon\" href=\"http://stlogo.sm.cn/wap/sm/img/favicon.ico\"\n        type=\"image/x-icon\">\n        <link rel=\"stylesheet\" type=\"text/css\" href=\"main.css\">\n    </head>\n    <body>\n        <div class=\"focus-img show-wrap\">\n            <ul class=\"nav\">\n                <li>\n                    <a href=\"http://i.meituan.com/deal/2286521.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzM1Njk2ODk3X185MTA4MDc2LmpwZw==&amp;sign=yx:BbVMhklQspxk1YHFpjxicrWPvRI=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzM1Njk2ODk3X185MTA4MDc2LmpwZw==&amp;sign=yx:BbVMhklQspxk1YHFpjxicrWPvRI=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【佈麻佈辣精品冒菜】仅售8.50元！价值10元的代金券1...\n                                <span>\n                                    [37店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        8.5\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    10元\n                                </s>\n                                <span>\n                                    59297人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"http://i.meituan.com/deal/25458863.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AxLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ4NjY0NTk4X184NDQzNjcxLmpwZw==&amp;sign=yx:2OjlerpDXQt-kqGGBv8Ke_D48qc=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AxLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ4NjY0NTk4X184NDQzNjcxLmpwZw==&amp;sign=yx:2OjlerpDXQt-kqGGBv8Ke_D48qc=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【天绿迴转寿司】仅售68元！价值78元的价值78元的...\n                                <span>\n                                    [9店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        68\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    78元\n                                </s>\n                                <span>\n                                    37132人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"http://i.meituan.com/deal/25482475.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ4NjYyMzkzX180NTcxMDYyLmpwZw==&amp;sign=yx:lVhVtmTzblfqAx9vs1cakibGNfs=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ4NjYyMzkzX180NTcxMDYyLmpwZw==&amp;sign=yx:lVhVtmTzblfqAx9vs1cakibGNfs=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【天绿迴转寿司】仅售32.5元！价值50元的代金券1...\n                                <span>\n                                    [4店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        32.5\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    50元\n                                </s>\n                                <span>\n                                    14500人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"http://i.meituan.com/deal/25600497.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AxLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ5MDEyNzg4X18zMTIwNTQyLmpwZw==&amp;sign=yx:yVQjUODSgJQbSVsfrhoEISpYMJU=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AxLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ5MDEyNzg4X18zMTIwNTQyLmpwZw==&amp;sign=yx:yVQjUODSgJQbSVsfrhoEISpYMJU=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【巴萨奴纳】仅售43元！价值68元的单人自助午...\n                                <span>\n                                    [11店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        43\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    68元\n                                </s>\n                                <span>\n                                    23791人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"http://i.meituan.com/deal/3507818.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ2NzY4NzI0X18yMzE3NjgxLmpwZw==&amp;sign=yx:g-U2XUXkxsXuTvqNED_kgQjW0y0=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ2NzY4NzI0X18yMzE3NjgxLmpwZw==&amp;sign=yx:g-U2XUXkxsXuTvqNED_kgQjW0y0=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【每味每客】仅售7.5元！价值10元的代金券1张...\n                                <span>\n                                    [8店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        7.5\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    10元\n                                </s>\n                                <span>\n                                    73686人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"http://i.meituan.com/deal/4781377.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ2NzcwMjAzX181ODcxODY2LmpwZw==&amp;sign=yx:KEdAO8frac3dt8ifH1XarLjB6MA=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ2NzcwMjAzX181ODcxODY2LmpwZw==&amp;sign=yx:KEdAO8frac3dt8ifH1XarLjB6MA=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【每味每客】仅售12元！价值20元的代金券1张...\n                                <span>\n                                    [3店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        12\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    20元\n                                </s>\n                                <span>\n                                    65247人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"http://i.meituan.com/deal/2286521.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzM1Njk2ODk3X185MTA4MDc2LmpwZw==&amp;sign=yx:BbVMhklQspxk1YHFpjxicrWPvRI=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzM1Njk2ODk3X185MTA4MDc2LmpwZw==&amp;sign=yx:BbVMhklQspxk1YHFpjxicrWPvRI=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【佈麻佈辣精品冒菜】仅售8.50元！价值10元的代金券1...\n                                <span>\n                                    [37店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        8.5\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    10元\n                                </s>\n                                <span>\n                                    59297人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n                <li>\n                    <a href=\"http://i.meituan.com/deal/4781377.html/?nodown&amp;utm_source=waputm_searchmore&amp;utm_medium=wap\"\n                    data-log=\"10\">\n                        <div class=\"img-wrap\">\n                            <img data-image=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ2NzcwMjAzX181ODcxODY2LmpwZw==&amp;sign=yx:KEdAO8frac3dt8ifH1XarLjB6MA=&amp;tv=150_150&amp;x.jpg\"\n                            src=\"http://s2.zimgs.cn/ims?kt=url&amp;at=sc&amp;key=aHR0cDovL3AwLm1laXR1YW4ubmV0LzIwMC4xMjAvZGVhbC9fXzQ2NzcwMjAzX181ODcxODY2LmpwZw==&amp;sign=yx:KEdAO8frac3dt8ifH1XarLjB6MA=&amp;tv=150_150&amp;x.jpg\">\n                        </div>\n                        <div class=\"goods-info-p\">\n                            <p class=\"info-details\">\n                                【每味每客】仅售12元！价值20元的代金券1张...\n                                <span>\n                                    [3店通用]\n                                </span>\n                            </p>\n                            <p class=\"good-price\">\n                                <b>\n                                    <strong>\n                                        12\n                                    </strong>\n                                    元\n                                </b>\n                                <s>\n                                    20元\n                                </s>\n                                <span>\n                                    65247人\n                                </span>\n                            </p>\n                        </div>\n                    </a>\n                </li>\n            </ul>\n        </div>\n        <script>\n        (function() {\n            var oli = [].slice.apply(document.getElementsByTagName('li')),\n            oul = document.getElementsByTagName('ul')[0],\n            len = oli.length,\n            scaleW = window.innerWidth,\n            timer = null;\n\n            for (var i = 0; i < len; i++) {\n\n                oli[i].idx = i;\n                if (i == 0) {\n                    oli[i].style.webkitTransform = \"translate3d(\" + i * scaleW + \"px, 0, 0)\";\n                } else if (i == len - 1) {\n                    oli[i].style.webkitTransform = \"translate3d(-\" + scaleW + \"px, 0, 0)\";\n                } else {\n                    oli[i].style.webkitTransform = \"translate3d(\" + scaleW + \"px, 0, 0)\";\n                }\n            };\n\n            //手指按下的处理事件\n            var startHandler = function(evt) {\n                clearInterval(timer);\n\n                //记录手指按下的坐标\n                this.startX = evt.touches[0].pageX;\n\n                this.direction = 0;\n\n                //事件对象\n                var target = evt.target;\n                while (target.nodeName != 'LI' && target.nodeName != 'BODY') {\n                    target = target.parentNode;\n                }\n                this.target = target;\n\n            };\n\n            var moveHandler = function(evt) {\n                evt.preventDefault();\n\n                //记录方向，赋值为向左，正值为向右。\n                this.direction = evt.touches[0].pageX - this.startX;\n            }\n\n            //手指抬起的处理事件\n            var endHandler = function(evt) {\n\n                timer = setInterval(function() {\n                    move('right');\n                },\n                2000);\n\n                evt.preventDefault();\n\n                if (this.direction < 0) {\n                    move('right');\n                } else {\n                    move('left');\n                }\n            }\n\n            oul.addEventListener('touchstart', startHandler, false);\n            oul.addEventListener('touchmove', moveHandler, false);\n            oul.addEventListener('touchend', endHandler, false);\n\n            function move(flag) {\n                for (var i = oli.length - 1; i >= 0; i--) {\n                    oli[i].style.webkitTransition = \"\";\n                };\n                if (flag == 'left') {\n                    oli.unshift(oli.pop());\n                    oli[len - 1].style.webkitTransform = 'translate3d(-' + scaleW + 'px, 0, 0)';\n\n                    oli[0].style.webkitTransition = '-webkit-transform 0.8s ease-out';\n                    oli[1].style.webkitTransition = '-webkit-transform 0.8s ease-out';\n                    oli[0].style.webkitTransform = 'translate3d(0, 0, 0)';\n                    oli[1].style.webkitTransform = 'translate3d(' + scaleW + 'px, 0, 0)';\n                } else {\n                    oli.push(oli.shift());\n\n                    oli[1].style.webkitTransform = 'translate3d(' + scaleW + 'px, 0, 0)';\n\n                    oli[0].style.webkitTransition = '-webkit-transform 0.8s ease-out';\n                    oli[len - 1].style.webkitTransition = '-webkit-transform 0.8s ease-out';\n                    oli[0].style.webkitTransform = 'translate3d(0, 0, 0)';\n                    oli[len - 1].style.webkitTransform = 'translate3d(-' + scaleW + 'px, 0, 0)';\n                }\n\n            }\n\n            timer = setInterval(function() {\n                move('right')\n            },\n            2000);\n\n        })()\n        </script>\n    </body>\n\n</html>"
  },
  {
    "path": "works/demo/sm-meituan/main.css",
    "content": "body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section{\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\na {\n\tcolor: #002be5;\n\t-webkit-tap-highlight-color:initial;\n\ttext-decoration: none;\n}\n\nul {\n\tlist-style: none;\n}\n.show-wrap {\n\toverflow: hidden;\n\theight: 75px;\n\tposition: relative;\n}\n.show-wrap ul{\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\tdisplay: -webkit-box;\n\twidth: 100%;\n\t-webkit-box-orient: horizontal;\n}\n.show-wrap ul li {\n\tpadding: 13px 7px 8px;\n\twidth: 100%;\n\t-webkit-box-sizing:border-box;\n\tposition: absolute;\n}\n.show-wrap ul li a{\n\tdisplay: -webkit-box;\n\t-webkit-box-align:center;\n}\n\n.img-wrap {\n\twidth: 66px;\n\theight: 61px;\n\toverflow: hidden;\n\tmargin-right: 9px;\n}\n.goods-info-p {\n\t-webkit-box-flex:1;\n}\n.info-details {\n\tcolor: #333;\n\tfont-size: 14px;\n\theight: 40px;\n\toverflow: hidden;\n}\n\n.good-price {\n\tline-height: 20px;\n}\n\n\n.good-price b {\n\tcolor: red;\n\tfont-size: 14px;\n\tfont-weight: 400;\n}\n\n.good-price b strong {\n\tfont-size: 20px;\n}\n\n.good-price s {\n\tcolor: #999;\n\tfont-size: 12px;\n\tpadding: 0 2px;\n}\n\n.good-price span {\n\tfont-size: 12px;\n\tcolor: #999;\n\tfloat: right;\n\tpadding-left: 14px;\n\tbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MUIxQURBQ0IyMzg4MTFFNDkzQTRBMkI3MTAyRjBFMjUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MUIxQURBQ0MyMzg4MTFFNDkzQTRBMkI3MTAyRjBFMjUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxQjFBREFDOTIzODgxMUU0OTNBNEEyQjcxMDJGMEUyNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxQjFBREFDQTIzODgxMUU0OTNBNEEyQjcxMDJGMEUyNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv7uVz4AAAEwSURBVHjanJS/LgRRFId3JiNCkAgi2YIgokAUepFstFqeYErPop15Ar1H0FD4VyiQVegUKFaBxfpOciS7co4945d8yeTO3G/un3NvUhRFzckEbMAajEMHnuECjuBJPsrzvKdT5sgmYQ+mf7UPQR3WYf9H2p3UkEnbliHrjrxrQBIRjsFKrX9WYTQiHNb165cpGIkIB6ypOEuTRYQRmdvfEn5VEHYiwndoB2Rv8BoRSm3dBITX0TqUER4HhCfWTFLn41O4tNZI287hLLRLmk84gEfj3QscepuX/jGlunUStJiXvU7W5TAIc7Cjz1adbkNLp96z04leX5n+dQFmYSlY4LfQhDu44ir7ENEuzKisahYVSbMsy3sRblY8bl5kQPNp8FRE05YRPji7+Z+0vgUYAEV9ODzjr6XaAAAAAElFTkSuQmCC) 0 4px no-repeat;\n\tbackground-size : 10px auto;\n\tmargin-top: 3px;\n}"
  },
  {
    "path": "works/demo/stream/data.js",
    "content": "{\n\tcode : 0,\n\tlist : [\n\t\t{\n\t\t\tsrc : ['img/10.jpg','img/9.jpg','img/8.jpg'],\n\t\t\ttitle : ['22222222','1111111111','33333333']\n\t\t},\n\t\t{\n\t\t\tsrc : ['img/7.jpg','img/6.jpg','img/5.jpg'],\n\t\t\ttitle : ['22222222','1111111111','33333333']\n\t\t},\n\t\t{\n\t\t\tsrc : ['img/4.jpg','img/3.jpg','img/1.jpg'],\n\t\t\ttitle : ['22222222','1111111111','33333333']\n\t\t}\n\t]\n}"
  },
  {
    "path": "works/demo/stream/data2.js",
    "content": "{\n\tcode : 0,\n\tlist : [\n\t\t{\n\t\t\tsrc : 'img/10.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/9.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/8.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/7.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/6.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/5.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/3.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/3.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/2.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/1.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/10.jpg',\n\t\t\ttitle :'22222222'\n\t\t},\n\t\t{\n\t\t\tsrc : 'img/5.jpg',\n\t\t\ttitle :'22222222'\n\t\t}\n\t\t\n\t]\n}"
  },
  {
    "path": "works/demo/stream/float.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title></title>\n\t\t<style>\n\t\t\t* {\n\t\t\t\tmargin: 0;padding: 0;\n\t\t\t}\n\t\t\tli {\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\t\t\t#div1 {\n\t\t\t\twidth: 960px;\n\t\t\t\theight: auto;\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t\t#div1 ul {\n\t\t\t\tfloat: left;\n\t\t\t\tmargin-left: 10px;\n\t\t\t}\n\t\t\t\n\t\t\timg {\n\t\t\t\topacity: 1;\n\t\t\t\tfilter:Alpha(Opacity=100);\n\t\t\t}\n\t\t</style>\n\t\t<script src=\"../../../common/js/ajax.js\"></script>\n\t\t<script>\n\t\t\twindow.onload = function() {\n\t\t\t\t\n\t\t\t\tvar oUL = document.getElementsByTagName('ul');\n\t\t\t\tvar div1 = document.getElementById('div1');\n\t\t\t\t//读取数据开关\n\t\t\t\tvar flag = true;\n\t\t\t\t\n\t\t\t\twindow.onscroll = function() {\n\t\t\t\t\t\n\t\t\t\t\tvar body = document.documentElement || document.body;\n\t\t\t\t\n\t\t\t\t\t//可视区大小\n\t\t\t\t\tvar viewHeight = body.clientHeight;\n\t\t\t\t\t//滚动条高度\n\t\t\t\t\tvar scrollHeight = body.scrollHeight;\n\t\t\t\t\t\n\t\t\t\t\tfor (var i = 0; i < oUL.length; i++) {\n\t\t\t\t\t\tvar oli = oUL[i].getElementsByTagName('li');\n\t\t\t\t\t\tvar itemLi = oli[oli.length - 1];\n\t\t\t\t\t\t\n\t\t\t\t\t\tif(getTop(itemLi) < viewHeight +scrollHeight && flag) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tflag = false;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tAjax({\n\t\t\t\t\t\t\t\turl : \"data.js\",\n\t\t\t\t\t\t\t\tsuccess : function(_data) {\n\t\t\t\t\t\t\t\t\tvar data = eval('('+_data+')');\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tif(data.code) {\n\t\t\t\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif(data) {\n\t\t\t\t\t\t\t\t\t\tfor (var i = 0; i < data.list.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\tvar liData = data.list[i];\n\t\t\t\t\t\t\t\t\t\t\tfor (var j = 0; j < liData.src.length; j++) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar li = document.createElement('li');\n\t\t\t\t\t\t\t\t\t\t\t\tli.innerHTML = '<img src=\"'+liData.src[j]+'\" /><p>'+liData.title[j]+'</p>';\n\t\t\t\t\t\t\t\t\t\t\t\toUL[i].appendChild(li);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tdiv1.onmouseover = function() {\n\t\t\t\t\t\n\t\t\t\t\tvar e = event || window.event;\n\t\t\t\t\tvar target = e.target || e.srcElement;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tif(target.nodeName = 'IMG') {\n\t\t\t\t\t\tvar imgs = div1.getElementsByTagName('img');\n\t\t\t\t\t\tfor (var i = 0; i < imgs.length; i++) {\n\t\t\t\t\t\t\tstartMove(imgs[i], 100);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tstartMove(target, 40);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdiv1.onmouseout = function() {\n\t\t\t\t\tvar imgs = div1.getElementsByTagName('img');\n\t\t\t\t\tfor (var i = 0; i < imgs.length; i++) {\n\t\t\t\t\t\t\tstartMove(imgs[i], 100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t\t//获取当前元素与页面顶部的距离\n\t\t\tfunction getTop(obj) {\n\t\t\t\tvar top = 0;\n\t\t\t\twhile(obj) {\n\t\t\t\t\ttop += obj.offsetTop;\n\t\t\t\t\tobj = obj.offsetParent;\n\t\t\t\t}\n\t\t\t\treturn top;\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t//缓冲运动\n\t\t\tfunction startMove(obj, iTarget) {\n\t\t\t\tclearInterval(obj.timer);\n\t\t\t\t\n\t\t\t\tobj.timer = setInterval(function(){\n\t\t\t\t\tvar curOpacity = parseInt(100 * parseFloat(getStyle(obj, 'opacity')));\n\t\t\t\t\tvar speed = (iTarget - curOpacity) / 8;\n\t\t\t\t\tspeed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);\n\t\t\t\t\tif(Math.abs(iTarget - curOpacity) < speed) {\n\t\t\t\t\t\tclearInterval(obj.timer);\n\t\t\t\t\t\tobj.style.filter = \"alpha(opacity:\" + iTarget + \")\";\n\t\t\t\t\t\tobj.style.opacity = iTarget / 100;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tobj.style.filter = \"alpha(opacity:\" + (curOpacity + speed) + \")\";\n\t\t\t\t\tobj.style.opacity = (curOpacity + speed) / 100;\n\t\t\t\t},30);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t//获取样式\n\t\t\tfunction getStyle(obj, attr) {\n\t\t\t\treturn obj.currentStyle? obj.currentStyle(attr) : getComputedStyle(obj, false)[attr];\n\t\t\t}\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<div id=\"div1\">\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/1.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/2.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/3.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\n\t\t\t</ul>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/4.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/5.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/6.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\n\t\t\t</ul>\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/7.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/8.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/9.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\n\t\t\t</ul>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "works/demo/stream/position.html",
    "content": "<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title></title>\n\t\t<style>\n\t\t\t* {\n\t\t\t\tmargin: 0;padding: 0;\n\t\t\t}\n\t\t\tli {\n\t\t\t\tlist-style-type: none;\n\t\t\t}\n\t\t\t#div1 {\n\t\t\t\twidth: 960px;\n\t\t\t\theight: auto;\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tposition: relative;\n\t\t\t}\n\t\t\tli {\n\t\t\t\tmargin: 5px 0 0 10px;\n\t\t\t\tposition: absolute;\n\t\t\t}\n\t\t\t\n\t\t\timg {\n\t\t\t\t\n\t\t\t\topacity: 1;\n\t\t\t\tfilter:Alpha(Opacity=100);\n\t\t\t}\n\t\t</style>\n\t\t<script src=\"../../../common/js/ajax.js\"></script>\n\t\t<script>\n\t\t\twindow.onload = function() {\n\t\t\t\t\n\t\t\t\tvar oUL = document.getElementsByTagName('ul');\n\t\t\t\tvar div1 = document.getElementById('div1');\n\t\t\t\t\n\t\t\t\t//读取数据开关\n\t\t\t\tvar flag = true;\n\t\t\t\t\n\t\t\t\tvar itemHeight = {\n\t\t\t\t\tleft : [],\n\t\t\t\t\tmiddle : [],\n\t\t\t\t\tright : []\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tfor (var i = 0; i < document.getElementsByTagName('li').length; i++) {\n\t\t\t\t\tconsole.log('one')\n\t\t\t\t\tposition(i);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twindow.onscroll = function() {\n\t\t\t\t\t\n\t\t\t\t\tvar body = document.documentElement || document.body;\n\t\t\t\t\n\t\t\t\t\t//可视区大小\n\t\t\t\t\tvar viewHeight = body.clientHeight;\n\t\t\t\t\t//滚动条高度\n\t\t\t\t\tvar scrollHeight = body.scrollHeight;\n\t\t\t\t\tvar oli = document.getElementsByTagName('li');\n\t\t\t\t\tvar itemLi = oli[oli.length-1];\t\n\t\t\t\t\tif(getTop(itemLi) < viewHeight +scrollHeight && flag) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tflag = false;\n\t\t\t\t\t\t\n\t\t\t\t\t\tAjax({\n\t\t\t\t\t\t\turl : \"data2.js\",\n\t\t\t\t\t\t\tsuccess : function(_data) {\n\t\t\t\t\t\t\t\tvar data = eval('('+_data+')');\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif(data.code) {\n\t\t\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(data) {\n\t\t\t\t\t\t\t\t\tfor (var i = 0; i < data.list.length; i++) {\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tvar img = new Image();\n\t\t\t\t\t\t\t\t\t\timg.onload = (function(i){\n\t\t\t\t\t\t\t\t\t\t\tvar li = document.createElement('li');\n\t\t\t\t\t\t\t\t\t\t\tli.innerHTML = '<img  src=\"'+data.list[i].src+'\" /><p>'+data.list[i].title+'</p>';\n\t\t\t\t\t\t\t\t\t\t\toUL[0].appendChild(li);\n\t\t\t\t\t\t\t\t\t\t\tposition(oli.length - 1);\n\t\t\t\t\t\t\t\t\t\t})(i)\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\timg.src = data.list[i].src;\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction position(i) {\n\t\t\t\t\t//行\n\t\t\t\t\tvar cell = i % 3;\n\t\t\t\t\t\n\t\t\t\t\tswitch(cell) {\n\t\t\t\t\t\tcase 0 : \n\t\t\t\t\t\t\tpositionItem(i, 'left');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1 : \n\t\t\t\t\t\t\tpositionItem(i, 'middle');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2 : \n\t\t\t\t\t\t\tpositionItem(i, 'right');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfunction positionItem(i, type) {\n\t\t\t\t\tvar oli = document.getElementsByTagName('li');\n\t\t\t\t\t//列\n\t\t\t\t\tvar row = Math.floor(i / 3);\n\t\t\t\t\t//算在那一列\n\t\t\t\t\toli[i].style.left = 10 * (i%3 +1) + 310*(i%3)+ 'px';\n\t\t\t\t\titemHeight[type].push(oli[i].offsetHeight);\n\t\t\t\t\tif(!row) {\n\t\t\t\t\t\toli[i].style.top = 0 + 'px';\n\t\t\t\t\t}else {\n\t\t\t\t\t\tvar sum = 0;\n\t\t\t\t\t\t\n\t\t\t\t\t\tfor(var j = 0; j < row; j++) {\n\t\t\t\t\t\t\tsum +=itemHeight[type][j] + 5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//算在哪一行\n\t\t\t\t\t\toli[i].style.top = sum + 'px';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdiv1.onmouseover = function() {\n\t\t\t\t\t\n\t\t\t\t\tvar e = event || window.event;\n\t\t\t\t\tvar target = e.target || e.srcElement;\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\tif(target.nodeName = 'IMG') {\n\t\t\t\t\t\tvar imgs = document.images;\n\t\t\t\t\t\tfor (var i = 0; i < imgs.length; i++) {\n\t\t\t\t\t\t\tstartMove(imgs[i], 100);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tstartMove(target, 40);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdiv1.onmouseout = function() {\n\t\t\t\t\tvar imgs = document.images;\n\t\t\t\t\tfor (var i = 0; i < imgs.length; i++) {\n\t\t\t\t\t\t\tstartMove(imgs[i], 100);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t//获取当前元素与页面顶部的距离\n\t\t\tfunction getTop(obj) {\n\t\t\t\tvar top = 0;\n\t\t\t\twhile(obj) {\n\t\t\t\t\ttop += obj.offsetTop;\n\t\t\t\t\tobj = obj.offsetParent;\n\t\t\t\t}\n\t\t\t\treturn top;\n\t\t\t}\n\t\t\n\t\t\t\n\t\t\t//缓冲运动\n\t\t\tfunction startMove(obj, iTarget) {\n\t\t\t\tclearInterval(obj.timer);\n\t\t\t\t\n\t\t\t\tobj.timer = setInterval(function(){\n\t\t\t\t\tvar curOpacity = parseInt(100 * parseFloat(getStyle(obj, 'opacity')));\n\t\t\t\t\tvar speed = (iTarget - curOpacity) / 8;\n\t\t\t\t\tspeed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);\n\t\t\t\t\tif(Math.abs(iTarget - curOpacity) < speed) {\n\t\t\t\t\t\tclearInterval(obj.timer);\n\t\t\t\t\t\tobj.style.filter = \"alpha(opacity:\" + iTarget + \")\";\n\t\t\t\t\t\tobj.style.opacity = iTarget / 100;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tobj.style.filter = \"alpha(opacity:\" + (curOpacity + speed) + \")\";\n\t\t\t\t\tobj.style.opacity = (curOpacity + speed) / 100;\n\t\t\t\t},30);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t//获取样式\n\t\t\tfunction getStyle(obj, attr) {\n\t\t\t\treturn obj.currentStyle? obj.currentStyle(attr) : getComputedStyle(obj, false)[attr];\n\t\t\t}\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<div id=\"div1\">\n\t\t\t<ul>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/1.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/2.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/3.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/4.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/5.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/6.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/7.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/8.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<img src=\"img/9.jpg\" />\n\t\t\t\t\t<p>1111111111111111</p>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "works/index.html",
    "content": "<!DOCTYPE html>\n<html ng-app=\"show\">\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>前端小练习</title>\n\t\t<link href=\"http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.css\" rel=\"stylesheet\">\n\t\t<style>\n\t\t\t.h100 {\n\t\t\t\theight: 600px;\n\t\t\t}\n\t\t\ta.list-group-item{\n\t\t\t\ttransition:all 0.6s;\n\t\t\t}\n\t\t\ta.list-group-item:hover{\n\t\t\t\tcolor: #fff;background-color: gray;\n\t\t\t}\n\t\t</style>\n\t\t<script src=\"http://cdn.bootcss.com/angular.js/1.3.0-beta.8/angular.min.js\"></script>\n\t\t<script src=\"http://cdn.bootcss.com/angular.js/1.3.0-beta.8/angular-route.js\"></script>\n\t\t<script src=\"http://libs.baidu.com/jquery/1.9.0/jquery.js\"></script>\n\t\t<script src=\"js/data.js\"></script>\n\t\t<script src=\"js/index.js\"></script>\n\t</head>\n\n\t<body>\n\t\t<!--\n        \t作者：hacke2@qq.com\n        \t时间：2014-09-20\n        \t描述：导航\n        -->\n\t\t<header>\n\t\t\t<nav class=\"navbar navbar-inverse\">\n\t\t\t\t<div class=\"container\">\n\t\t\t\t\t<div class=\"navbar-header\">\n\t\t\t\t\t\t<a class=\"navbar-brand\" href=\"#\">前端小练习</a>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ul class=\"nav navbar-nav navbar-right\">\n\t\t\t\t\t\t<li><a href=\"#\">首页</a></li>\n\t\t\t\t\t\t<li><a href=\"#mobile\">移动WEB</a></li>\n\t\t\t\t\t\t<li><a href=\"#hot-site\">模仿名站</a></li>\n\t\t\t\t\t\t<li><a href=\"#base\">基础练习</a></li>\n\t\t\t\t\t\t<li><a href=\"#project\">开源项目</a></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</div>\n\t\t\t</nav>\n\t\t</header>\n\t\t<!--\n        \t作者：hacke2@qq.com\n        \t时间：2014-09-20\n        \t描述：视图模板\n        -->\n\t\t<div class=\"container\">\n\t\t\t<div ng-view></div>\n\t\t</div>\n\t</div>\n\t</body>\n\n</html>\n\n\n"
  },
  {
    "path": "works/index_v1.html",
    "content": "<!DOCTYPE html>\n<html>\n\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>前端小练习</title>\n\t\t<link href=\"http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.css\" rel=\"stylesheet\">\n\t\t<style>\n\t\t\t.row a {\n\t\t\t\tdisplay: block;\n\t\t\t\tfont-family: \"微软雅黑\";\n\t\t\t\tfont-size: 18px;\n\t\t\t\tbackground: grey;\n\t\t\t\topacity: 1;\n\t\t\t\theight: 100px;\n\t\t\t\ttext-decoration: none;\n\t\t\t\tline-height: 100px;\n\t\t\t\tborder-radius: 10px;\n\t\t\t\t\n\t\t\t\tcolor: #fff;\n\t\t\t\t-webkit-border-radius: 10px;\n\t\t\t\t-moz-border-radius: 10px;\n\t\t\t\tmargin: 5px 48px;\n\t\t\t\ttransition:background 1s, color 1s;\n\t\t\t\t-moz-transition:background 1s, color 1s; \n\t\t\t\t-webkit-transition:background 1s, color 1s; \n\t\t\t\t-o-transition:background 1s, color 1s;\n\t\t\t}\n\t\t\t\n\t\t\t.row a:hover{\n\t\t\t\tcolor: #000000;\n\t\t\t\tbackground:#eeeeee;\n\t\t\t\tborder: 2px solid #000000;\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\t\n\t\t</style>\n\t</head>\n\n\t<body>\n\n\t\t<div class=\"container\">\n\t\t\t<div class=\"jumbotron\">\n\t\t\t\t<h1>前端小练习</h1>\n\t\t\t\t<p>有自己平时做的，也有豪哥给的题目,努力追赶大师的脚步！</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a class=\"btn btn-lg btn-primary\" target=\"_blank\" href=\"https://github.com/hacke2/frontcode\" role=\"button\">查看github项目</a>\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t\t<div id='tests'class=\"row text-center\">\n\t\t\t\t<a class=\"col-md-3\" href=\"/works/demo/04/\" desc=\"模仿联想招聘\" target=\"_blank\">CSS3弹窗&切换</p></a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/demo/javascript-seamless-handover/slide/bd01.html\" desc=\"模仿百度爱玩\" target=\"_blank\">无缝切换图片 </p></a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/works/demo/03/bd03.html\" desc=\"模仿百度爱玩\" target=\"_blank\">榜单tab切换</a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/works/demo/08/\" desc=\"百度微购\" target=\"_blank\">电商菜单导航</a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/demo/cqut-paging/demo.html\" desc=\"刷新整个页面，非AJAX\" target=\"_blank\">模仿实验室分页组件</a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/works/demo/qqzone-img\" desc=\"模仿QQ空间\" target=\"_blank\">查看长图</a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/works/demo/07/\" desc=\"百度微购图片轮播\" target=\"_blank\">中秋送好礼</a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/works/demo/06/\" desc=\"模仿百度爱玩\" target=\"_blank\">层次图片轮播</a>\n\t\t\t\t<a class=\"col-md-3\" href=\"/demo/my-show-4-angularjs/\" desc=\"BootStarp + AngularJs\" target=\"_blank\">项目展示页面</a>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<script src=\"http://libs.baidu.com/jquery/1.9.0/jquery.js\"></script>\n\t\t<script src=\"http://libs.baidu.com/bootstrap/3.0.3/js/bootstrap.js\"></script>\n\t\t<script>\n\t\t\t$('#tests a').bind('mouseover',function(){\n\t\t\t\tvar $this = $(this);\n\t\t\t\t$this.data('name',$this.html());\n\t\t\t\t$this.html($this.attr('desc'));\n\t\t\t})\n\t\t\t$('#tests a').bind('mouseout',function(){\n\t\t\t\tvar $this = $(this);\n\t\t\t\t$this.attr('desc',$this.html());\n\t\t\t\t$this.html($this.data('name'));\n\t\t\t})\n\t\t</script>\n\t</body>\n\n</html>\n\n\n"
  },
  {
    "path": "works/index_v2.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>hacke2-前端作品集合</title>\n    <meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no\" />\n    <meta name=\"keywords\" content=\"hacke2-前端作品集合\"/>\n    <meta name=\"description\" content=\"hacke2-前端作品集合\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/common.css\"/>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/home.css\"/>\n    <script type=\"text/javascript\">\n        if (top.location !== self.location) {\n            top.location=self.location;\n        }\n    </script>\n</head>\n<body>\n<div class=\"container\">\n    <div id=\"sideBar\" class=\"sidebar\">\n        <div class=\"sider-title\">\n            <h1>hacke2-前端作品集合</h1>\n        </div>\n        <div class=\"sider-content\">\n            <ul id=\"siderList\" class=\"sider-list\">\n                <li>\n                    <a href=\"#\" class=\"root\">名站</a>\n                    <ul class=\"sub-menu\">\n                        <li><a target=\"iframe\" href=\"/works/demo/04/\" title=\"模仿联想招聘\" desc=\"模仿联想招聘\" target=\"_blank\">CSS3弹窗&切换</a></li>\n\t\t\t\t\t\t<li><a target=\"iframe\" href=\"/demo/javascript-seamless-handover/slide/bd01.html\" title=\"模仿百度爱玩\" desc=\"模仿百度爱玩\" target=\"_blank\">无缝切换图片</a></li>\n\t\t\t\t\t\t<li><a target=\"iframe\" href=\"/works/demo/03/bd03.html\" title=\"模仿百度爱玩\" desc=\"模仿百度爱玩\" target=\"_blank\">榜单tab切换</a></li>\n\t\t\t\t\t\t<li><a target=\"iframe\" href=\"/works/demo/08/\" title=\"百度微购\" desc=\"百度微购\" target=\"_blank\">电商菜单导航</a></li>\n\t\t\t\t\t\t<li><a target=\"iframe\" href=\"/works/demo/qqzone-img\" title=\"模仿QQ空间\" desc=\"模仿QQ空间\" target=\"_blank\">查看长图</a></li>\n\t\t\t\t\t\t<li><a target=\"iframe\" href=\"/works/demo/07/\" title=\"百度微购图片轮播\"  desc=\"百度微购图片轮播\" target=\"_blank\">中秋送好礼</a></li>\n\t\t\t\t\t\t<li><a target=\"iframe\" href=\"/works/demo/06/\" title=\"模仿百度爱玩\" desc=\"模仿百度爱玩\" target=\"_blank\">层次图片轮播</a></li>\n\t\t\t\t\t\t\n                    </ul>\n                </li>\n                <li>\n                    <a href=\"#\" class=\"root\">前端小作品</a>\n                    <ul class=\"sub-menu\">\n                        <li><a target=\"iframe\" href=\"/demo/my-show-4-angularjs/\" title=\"BootStarp + AngularJs\" desc=\"BootStarp + AngularJs\" target=\"_blank\">项目展示页面</a></li>\n                        <li><a target=\"iframe\" href=\"/demo/cqut-paging/demo.html\" title=\"刷新整个页面，非AJAX\" desc=\"刷新整个页面，非AJAX\" target=\"_blank\">模仿实验室分页组件</a></li>\n                    </ul>\n                </li>\n            </ul>\n        </div>\n    </div>\n    <!--/siderbar-->\n    <div class=\"main\">\n        <!--<iframe id=\"mainIframe\" name=\"iframe\" style=\"width: 100%;height: 100%;\" scroll=\"no\" src=\"main.html\" frameborder=\"0\"></iframe>-->\n        <iframe id=\"mainIframe\" name=\"iframe\" style=\"width: 100%;height: 100%;\" scroll=\"no\" src=\"main.html\" frameborder=\"0\"></iframe>\n    </div>\n    <!--/main-->\n</div>\n<!--/container-->\n<script type=\"text/javascript\" src=\"http://libs.baidu.com/jquery/1.9.0/jquery.js\"></script>\n<script>\n\n\t\n\t\n\tvar a = document.getElementsByTagName('a');\n\tfor(var i = 0; i < a.length; i++) {\n\t\tif(a[i].className != 'root') {\n\t\t\tvar li = a[i].parentNode;\n\t\t\ta[i].onmouseover = function() {\n\t\t\t\tthis.setAttribute('data', this.innerHTML);\n\t\t\t\tthis.innerHTML=this.getAttribute('desc');\n\t\t\t}\n\t\t\t\n\t\t\ta[i].onmouseout = function() {\n\t\t\t\tthis.setAttribute('desc', this.innerHTML);\n\t\t\t\tthis.innerHTML=this.getAttribute('data');\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n</script>\n</body>\n</html>\n\n\n"
  },
  {
    "path": "works/js/data.js",
    "content": "var data = {\n\thotSite : [\n\t    \t{\n\t    \t\tname : '榜单tab切换',\n\t    \t\tdesc : '模仿百度爱玩',\n\t    \t\turl : '/works/demo/03/bd03.html'\n\t    \t},\n\t    \t{\n\t    \t\tname : 'CSS3弹窗&切换',\n\t    \t\tdesc : '模仿联想招聘',\n\t    \t\turl : '/works/demo/04/'\n\t    \t},\n\t    \t{\n\t    \t\tname : '无缝切换图片',\n\t    \t\tdesc : '模仿百度爱玩',\n\t    \t\turl : '/demo/javascript-seamless-handover/slide/bd01.html'\n\t    \t},\n\t    \t{\n\t    \t\tname : '电商菜单导航',\n\t    \t\tdesc : '百度微购',\n\t    \t\turl : '/works/demo/08/'\n\t    \t},\n\t    \t{\n\t    \t\tname : '查看长图',\n\t    \t\tdesc : '模仿QQ空间',\n\t    \t\turl : '/works/demo/qqzone-img'\n\t    \t},\n\t    \t{\n\t    \t\tname : '中秋送好礼',\n\t    \t\tdesc : '百度微购图片轮播',\n\t    \t\turl : '/works/demo/07/'\n\t    \t},\n\t    \t{\n\t    \t\tname : '层次图片轮播',\n\t    \t\tdesc : '模仿百度爱玩',\n\t    \t\turl : '/works/demo/06/'\n\t    \t},\n\t    \t{\n\t    \t\tname : '阿里云开发者大会',\n\t    \t\tdesc : '拖动图片轮播',\n\t    \t\turl : '/works/demo/ali/actor.html'\n\t    \t}\n    \t],\n    base : [\n\t    \t{\n\t    \t\tname : '瀑布流-浮动',\n\t    \t\tdesc : '瀑布流-浮动',\n\t    \t\turl : '/works/demo/stream/float.html'\n\t    \t},{\n\t    \t\tname : '阿里响应式笔试题',\n\t    \t\tdesc : '响应式DEMO',\n\t    \t\turl : '/works/demo/html5/ali.html'\n\t    \t},\n\t    \t{\n\t    \t\tname : '创新实验室宣传网站',\n\t    \t\tdesc : '重理工软件工程',\n\t    \t\turl : '/works/demo/ee/index.htm'\n\t    \t}\n\t    \t\n\t    ],\n\t   \n\tmobile : [\n\t    \t{\n\t    \t\tname : '信息轮播',\n\t    \t\tdesc : '神马搜索美团信息轮播',\n\t    \t\turl : '/works/demo/sm-meituan'\n\t    \t}\n\t    ],\n\tproject : [\n\t    \t{\n\t    \t\tname : 'gokk',\n\t    \t\tdesc : '基于Node.js + jade + Mongoose 模仿gokk.tv ',\n\t    \t\turl : 'https://github.com/hacke2/gokk'\n\t    \t},\n\t    \t{\n\t    \t\tname : '动效平台',\n\t    \t\tdesc : '基于Node.js + Angular + fis3 + orm2的可视化代码编辑页面',\n\t    \t\turl : 'https://github.com/hacke2/inspiration'\n\t    \t}\n\t    ]\n    \n}\n"
  },
  {
    "path": "works/js/index.js",
    "content": "\n//将路由注入进来\nvar showApp= angular.module('show', ['ngRoute']);\n \n//配置路由\nshowApp.config(function($routeProvider) {\n    $routeProvider\n\t.when('/', {\n            templateUrl : 'main.html'\n        })\n\t\t.when('/hot-site/', {redirectTo: '/hot-site/0'})\n        .when('/hot-site/:index', {\n            templateUrl : 'template/show.html',\n            controller  : 'hotSiteController'\n        })\n        .when('/mobile', {redirectTo: '/mobile/0'})\n        .when('/mobile/:index', {\n            templateUrl : 'template/show-m.html',\n            controller  : 'mobileController'\n        })\n        .when('/project/', {\n            templateUrl : 'template/about.html',\n            controller  : 'projectController'\n        })\n        .when('/base/', {redirectTo: '/base/0'})\n        .when('/base/:index', {\n            templateUrl : 'template/show.html',\n            controller  : 'baseController'\n        })\n});\nshowApp.controller('hotSiteController', function($scope, $routeParams) {\n\t\n\tvar index = $routeParams.index;\n\t\n\t$scope.routeName = 'hot-site';\n\t\n    $scope.works = data.hotSite;\n    \n    document.getElementById('mainIframe').setAttribute('src', $scope.works[index].url);\n});\n \nshowApp.controller('baseController', function($scope, $routeParams) {\n\t\n\tvar index = $routeParams.index;\n\t\n\t$scope.routeName = 'base';\n\t\n    $scope.works = data.base;\n    \n    document.getElementById('mainIframe').setAttribute('src', $scope.works[index].url);\n});\n\nshowApp.controller('mobileController', function($scope, $routeParams) {\n\t\n\tvar index = $routeParams.index;\n\t\n\t$scope.routeName = 'mobile';\n\t\n    $scope.works = data.mobile;\n    \n    document.getElementById('mainIframe').setAttribute('src', $scope.works[index].url);\n});\n\nshowApp.controller('projectController', function($scope, $routeParams) {\n\t$scope.works = data.project;\n});"
  },
  {
    "path": "works/js/lib/angular-1.3.0.js",
    "content": "/**\n * @license AngularJS v1.3.0-beta.10\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, document, undefined) {'use strict';\n\n/**\n * @description\n *\n * This object provides a utility for producing rich Error messages within\n * Angular. It can be called as follows:\n *\n * var exampleMinErr = minErr('example');\n * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\n *\n * The above creates an instance of minErr in the example namespace. The\n * resulting error will have a namespaced error code of example.one.  The\n * resulting error will replace {0} with the value of foo, and {1} with the\n * value of bar. The object is not restricted in the number of arguments it can\n * take.\n *\n * If fewer arguments are specified than necessary for interpolation, the extra\n * interpolation markers will be preserved in the final string.\n *\n * Since data will be parsed statically during a build step, some restrictions\n * are applied with respect to how minErr instances are created and called.\n * Instances should have names of the form namespaceMinErr for a minErr created\n * using minErr('namespace') . Error codes, namespaces and template strings\n * should all be static strings, not variables or general expressions.\n *\n * @param {string} module The namespace to use for the new minErr instance.\n * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\n */\n\nfunction minErr(module) {\n  return function () {\n    var code = arguments[0],\n      prefix = '[' + (module ? module + ':' : '') + code + '] ',\n      template = arguments[1],\n      templateArgs = arguments,\n      stringify = function (obj) {\n        if (typeof obj === 'function') {\n          return obj.toString().replace(/ \\{[\\s\\S]*$/, '');\n        } else if (typeof obj === 'undefined') {\n          return 'undefined';\n        } else if (typeof obj !== 'string') {\n          return JSON.stringify(obj);\n        }\n        return obj;\n      },\n      message, i;\n\n    message = prefix + template.replace(/\\{\\d+\\}/g, function (match) {\n      var index = +match.slice(1, -1), arg;\n\n      if (index + 2 < templateArgs.length) {\n        arg = templateArgs[index + 2];\n        if (typeof arg === 'function') {\n          return arg.toString().replace(/ ?\\{[\\s\\S]*$/, '');\n        } else if (typeof arg === 'undefined') {\n          return 'undefined';\n        } else if (typeof arg !== 'string') {\n          return toJson(arg);\n        }\n        return arg;\n      }\n      return match;\n    });\n\n    message = message + '\\nhttp://errors.angularjs.org/1.3.0-beta.10/' +\n      (module ? module + '/' : '') + code;\n    for (i = 2; i < arguments.length; i++) {\n      message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +\n        encodeURIComponent(stringify(arguments[i]));\n    }\n\n    return new Error(message);\n  };\n}\n\n/* We need to tell jshint what variables are being exported */\n/* global\n    -angular,\n    -msie,\n    -jqLite,\n    -jQuery,\n    -slice,\n    -push,\n    -toString,\n    -ngMinErr,\n    -angularModule,\n    -nodeName_,\n    -uid,\n\n    -lowercase,\n    -uppercase,\n    -manualLowercase,\n    -manualUppercase,\n    -nodeName_,\n    -isArrayLike,\n    -forEach,\n    -sortedKeys,\n    -forEachSorted,\n    -reverseParams,\n    -nextUid,\n    -setHashKey,\n    -extend,\n    -int,\n    -inherit,\n    -noop,\n    -identity,\n    -valueFn,\n    -isUndefined,\n    -isDefined,\n    -isObject,\n    -isString,\n    -isNumber,\n    -isDate,\n    -isArray,\n    -isFunction,\n    -isRegExp,\n    -isWindow,\n    -isScope,\n    -isFile,\n    -isBlob,\n    -isBoolean,\n    -trim,\n    -isElement,\n    -makeMap,\n    -map,\n    -size,\n    -includes,\n    -indexOf,\n    -arrayRemove,\n    -isLeafNode,\n    -copy,\n    -shallowCopy,\n    -equals,\n    -csp,\n    -concat,\n    -sliceArgs,\n    -bind,\n    -toJsonReplacer,\n    -toJson,\n    -fromJson,\n    -toBoolean,\n    -startingTag,\n    -tryDecodeURIComponent,\n    -parseKeyValue,\n    -toKeyValue,\n    -encodeUriSegment,\n    -encodeUriQuery,\n    -angularInit,\n    -bootstrap,\n    -snake_case,\n    -bindJQuery,\n    -assertArg,\n    -assertArgFn,\n    -assertNotHasOwnProperty,\n    -getter,\n    -getBlockElements,\n    -hasOwnProperty,\n\n*/\n\n////////////////////////////////////\n\n/**\n * @ngdoc module\n * @name ng\n * @module ng\n * @description\n *\n * # ng (core module)\n * The ng module is loaded by default when an AngularJS application is started. The module itself\n * contains the essential components for an AngularJS application to function. The table below\n * lists a high level breakdown of each of the services/factories, filters, directives and testing\n * components available within this core module.\n *\n * <div doc-module-components=\"ng\"></div>\n */\n\n/**\n * @ngdoc function\n * @name angular.lowercase\n * @module ng\n * @function\n *\n * @description Converts the specified string to lowercase.\n * @param {string} string String to be converted to lowercase.\n * @returns {string} Lowercased string.\n */\nvar lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * @ngdoc function\n * @name angular.uppercase\n * @module ng\n * @function\n *\n * @description Converts the specified string to uppercase.\n * @param {string} string String to be converted to uppercase.\n * @returns {string} Uppercased string.\n */\nvar uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};\n\n\nvar manualLowercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})\n      : s;\n};\nvar manualUppercase = function(s) {\n  /* jshint bitwise: false */\n  return isString(s)\n      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})\n      : s;\n};\n\n\n// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\n// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\n// with correct but slower alternatives.\nif ('i' !== 'I'.toLowerCase()) {\n  lowercase = manualLowercase;\n  uppercase = manualUppercase;\n}\n\n\nvar /** holds major version number for IE or NaN for real browsers */\n    msie,\n    jqLite,           // delay binding since jQuery could be loaded after us.\n    jQuery,           // delay binding\n    slice             = [].slice,\n    push              = [].push,\n    toString          = Object.prototype.toString,\n    ngMinErr          = minErr('ng'),\n\n    /** @name angular */\n    angular           = window.angular || (window.angular = {}),\n    angularModule,\n    nodeName_,\n    uid               = ['0', '0', '0'];\n\n/**\n * IE 11 changed the format of the UserAgent string.\n * See http://msdn.microsoft.com/en-us/library/ms537503.aspx\n */\nmsie = int((/msie (\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);\nif (isNaN(msie)) {\n  msie = int((/trident\\/.*; rv:(\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);\n}\n\n\n/**\n * @private\n * @param {*} obj\n * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,\n *                   String ...)\n */\nfunction isArrayLike(obj) {\n  if (obj == null || isWindow(obj)) {\n    return false;\n  }\n\n  var length = obj.length;\n\n  if (obj.nodeType === 1 && length) {\n    return true;\n  }\n\n  return isString(obj) || isArray(obj) || length === 0 ||\n         typeof length === 'number' && length > 0 && (length - 1) in obj;\n}\n\n/**\n * @ngdoc function\n * @name angular.forEach\n * @module ng\n * @function\n *\n * @description\n * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\n * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`\n * is the value of an object property or an array element and `key` is the object property key or\n * array element index. Specifying a `context` for the function is optional.\n *\n * It is worth noting that `.forEach` does not iterate over inherited properties because it filters\n * using the `hasOwnProperty` method.\n *\n   ```js\n     var values = {name: 'misko', gender: 'male'};\n     var log = [];\n     angular.forEach(values, function(value, key) {\n       this.push(key + ': ' + value);\n     }, log);\n     expect(log).toEqual(['name: misko', 'gender: male']);\n   ```\n *\n * @param {Object|Array} obj Object to iterate over.\n * @param {Function} iterator Iterator function.\n * @param {Object=} context Object to become context (`this`) for the iterator function.\n * @returns {Object|Array} Reference to `obj`.\n */\nfunction forEach(obj, iterator, context) {\n  var key;\n  if (obj) {\n    if (isFunction(obj)) {\n      for (key in obj) {\n        // Need to check if hasOwnProperty exists,\n        // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function\n        if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {\n          iterator.call(context, obj[key], key);\n        }\n      }\n    } else if (obj.forEach && obj.forEach !== forEach) {\n      obj.forEach(iterator, context);\n    } else if (isArrayLike(obj)) {\n      for (key = 0; key < obj.length; key++)\n        iterator.call(context, obj[key], key);\n    } else {\n      for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n          iterator.call(context, obj[key], key);\n        }\n      }\n    }\n  }\n  return obj;\n}\n\nfunction sortedKeys(obj) {\n  var keys = [];\n  for (var key in obj) {\n    if (obj.hasOwnProperty(key)) {\n      keys.push(key);\n    }\n  }\n  return keys.sort();\n}\n\nfunction forEachSorted(obj, iterator, context) {\n  var keys = sortedKeys(obj);\n  for ( var i = 0; i < keys.length; i++) {\n    iterator.call(context, obj[keys[i]], keys[i]);\n  }\n  return keys;\n}\n\n\n/**\n * when using forEach the params are value, key, but it is often useful to have key, value.\n * @param {function(string, *)} iteratorFn\n * @returns {function(*, string)}\n */\nfunction reverseParams(iteratorFn) {\n  return function(value, key) { iteratorFn(key, value); };\n}\n\n/**\n * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\n * characters such as '012ABC'. The reason why we are not using simply a number counter is that\n * the number string gets longer over time, and it can also overflow, where as the nextId\n * will grow much slower, it is a string, and it will never overflow.\n *\n * @returns {string} an unique alpha-numeric string\n */\nfunction nextUid() {\n  var index = uid.length;\n  var digit;\n\n  while(index) {\n    index--;\n    digit = uid[index].charCodeAt(0);\n    if (digit == 57 /*'9'*/) {\n      uid[index] = 'A';\n      return uid.join('');\n    }\n    if (digit == 90  /*'Z'*/) {\n      uid[index] = '0';\n    } else {\n      uid[index] = String.fromCharCode(digit + 1);\n      return uid.join('');\n    }\n  }\n  uid.unshift('0');\n  return uid.join('');\n}\n\n\n/**\n * Set or clear the hashkey for an object.\n * @param obj object\n * @param h the hashkey (!truthy to delete the hashkey)\n */\nfunction setHashKey(obj, h) {\n  if (h) {\n    obj.$$hashKey = h;\n  }\n  else {\n    delete obj.$$hashKey;\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.extend\n * @module ng\n * @function\n *\n * @description\n * Extends the destination object `dst` by copying all of the properties from the `src` object(s)\n * to `dst`. You can specify multiple `src` objects.\n *\n * @param {Object} dst Destination object.\n * @param {...Object} src Source object(s).\n * @returns {Object} Reference to `dst`.\n */\nfunction extend(dst) {\n  var h = dst.$$hashKey;\n  forEach(arguments, function(obj) {\n    if (obj !== dst) {\n      forEach(obj, function(value, key) {\n        dst[key] = value;\n      });\n    }\n  });\n\n  setHashKey(dst,h);\n  return dst;\n}\n\nfunction int(str) {\n  return parseInt(str, 10);\n}\n\n\nfunction inherit(parent, extra) {\n  return extend(new (extend(function() {}, {prototype:parent}))(), extra);\n}\n\n/**\n * @ngdoc function\n * @name angular.noop\n * @module ng\n * @function\n *\n * @description\n * A function that performs no operations. This function can be useful when writing code in the\n * functional style.\n   ```js\n     function foo(callback) {\n       var result = calculateResult();\n       (callback || angular.noop)(result);\n     }\n   ```\n */\nfunction noop() {}\nnoop.$inject = [];\n\n\n/**\n * @ngdoc function\n * @name angular.identity\n * @module ng\n * @function\n *\n * @description\n * A function that returns its first argument. This function is useful when writing code in the\n * functional style.\n *\n   ```js\n     function transformer(transformationFn, value) {\n       return (transformationFn || angular.identity)(value);\n     };\n   ```\n */\nfunction identity($) {return $;}\nidentity.$inject = [];\n\n\nfunction valueFn(value) {return function() {return value;};}\n\n/**\n * @ngdoc function\n * @name angular.isUndefined\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is undefined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is undefined.\n */\nfunction isUndefined(value){return typeof value === 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDefined\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is defined.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is defined.\n */\nfunction isDefined(value){return typeof value !== 'undefined';}\n\n\n/**\n * @ngdoc function\n * @name angular.isObject\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\n * considered to be objects. Note that JavaScript arrays are objects.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Object` but not `null`.\n */\nfunction isObject(value){return value != null && typeof value === 'object';}\n\n\n/**\n * @ngdoc function\n * @name angular.isString\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a `String`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `String`.\n */\nfunction isString(value){return typeof value === 'string';}\n\n\n/**\n * @ngdoc function\n * @name angular.isNumber\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a `Number`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Number`.\n */\nfunction isNumber(value){return typeof value === 'number';}\n\n\n/**\n * @ngdoc function\n * @name angular.isDate\n * @module ng\n * @function\n *\n * @description\n * Determines if a value is a date.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Date`.\n */\nfunction isDate(value) {\n  return toString.call(value) === '[object Date]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isArray\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is an `Array`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is an `Array`.\n */\nfunction isArray(value) {\n  return toString.call(value) === '[object Array]';\n}\n\n\n/**\n * @ngdoc function\n * @name angular.isFunction\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a `Function`.\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `Function`.\n */\nfunction isFunction(value){return typeof value === 'function';}\n\n\n/**\n * Determines if a value is a regular expression object.\n *\n * @private\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a `RegExp`.\n */\nfunction isRegExp(value) {\n  return toString.call(value) === '[object RegExp]';\n}\n\n\n/**\n * Checks if `obj` is a window object.\n *\n * @private\n * @param {*} obj Object to check\n * @returns {boolean} True if `obj` is a window obj.\n */\nfunction isWindow(obj) {\n  return obj && obj.document && obj.location && obj.alert && obj.setInterval;\n}\n\n\nfunction isScope(obj) {\n  return obj && obj.$evalAsync && obj.$watch;\n}\n\n\nfunction isFile(obj) {\n  return toString.call(obj) === '[object File]';\n}\n\n\nfunction isBlob(obj) {\n  return toString.call(obj) === '[object Blob]';\n}\n\n\nfunction isBoolean(value) {\n  return typeof value === 'boolean';\n}\n\n\nvar trim = (function() {\n  // native trim is way faster: http://jsperf.com/angular-trim-test\n  // but IE doesn't have it... :-(\n  // TODO: we should move this into IE/ES5 polyfill\n  if (!String.prototype.trim) {\n    return function(value) {\n      return isString(value) ? value.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '') : value;\n    };\n  }\n  return function(value) {\n    return isString(value) ? value.trim() : value;\n  };\n})();\n\n\n/**\n * @ngdoc function\n * @name angular.isElement\n * @module ng\n * @function\n *\n * @description\n * Determines if a reference is a DOM element (or wrapped jQuery element).\n *\n * @param {*} value Reference to check.\n * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\n */\nfunction isElement(node) {\n  return !!(node &&\n    (node.nodeName  // we are a direct element\n    || (node.prop && node.attr && node.find)));  // we have an on and find method part of jQuery API\n}\n\n/**\n * @param str 'key1,key2,...'\n * @returns {object} in the form of {key1:true, key2:true, ...}\n */\nfunction makeMap(str) {\n  var obj = {}, items = str.split(\",\"), i;\n  for ( i = 0; i < items.length; i++ )\n    obj[ items[i] ] = true;\n  return obj;\n}\n\n\nif (msie < 9) {\n  nodeName_ = function(element) {\n    element = element.nodeName ? element : element[0];\n    return (element.scopeName && element.scopeName != 'HTML')\n      ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;\n  };\n} else {\n  nodeName_ = function(element) {\n    return element.nodeName ? element.nodeName : element[0].nodeName;\n  };\n}\n\n\nfunction map(obj, iterator, context) {\n  var results = [];\n  forEach(obj, function(value, index, list) {\n    results.push(iterator.call(context, value, index, list));\n  });\n  return results;\n}\n\n\n/**\n * @description\n * Determines the number of elements in an array, the number of properties an object has, or\n * the length of a string.\n *\n * Note: This function is used to augment the Object type in Angular expressions. See\n * {@link angular.Object} for more information about Angular arrays.\n *\n * @param {Object|Array|string} obj Object, array, or string to inspect.\n * @param {boolean} [ownPropsOnly=false] Count only \"own\" properties in an object\n * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.\n */\nfunction size(obj, ownPropsOnly) {\n  var count = 0, key;\n\n  if (isArray(obj) || isString(obj)) {\n    return obj.length;\n  } else if (isObject(obj)) {\n    for (key in obj)\n      if (!ownPropsOnly || obj.hasOwnProperty(key))\n        count++;\n  }\n\n  return count;\n}\n\n\nfunction includes(array, obj) {\n  return indexOf(array, obj) != -1;\n}\n\nfunction indexOf(array, obj) {\n  if (array.indexOf) return array.indexOf(obj);\n\n  for (var i = 0; i < array.length; i++) {\n    if (obj === array[i]) return i;\n  }\n  return -1;\n}\n\nfunction arrayRemove(array, value) {\n  var index = indexOf(array, value);\n  if (index >=0)\n    array.splice(index, 1);\n  return value;\n}\n\nfunction isLeafNode (node) {\n  if (node) {\n    switch (node.nodeName) {\n    case \"OPTION\":\n    case \"PRE\":\n    case \"TITLE\":\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * @ngdoc function\n * @name angular.copy\n * @module ng\n * @function\n *\n * @description\n * Creates a deep copy of `source`, which should be an object or an array.\n *\n * * If no destination is supplied, a copy of the object or array is created.\n * * If a destination is provided, all of its elements (for array) or properties (for objects)\n *   are deleted and then all elements/properties from the source are copied to it.\n * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.\n * * If `source` is identical to 'destination' an exception will be thrown.\n *\n * @param {*} source The source that will be used to make a copy.\n *                   Can be any type, including primitives, `null`, and `undefined`.\n * @param {(Object|Array)=} destination Destination into which the source is copied. If\n *     provided, must be of the same type as `source`.\n * @returns {*} The copy or updated `destination`, if `destination` was specified.\n *\n * @example\n <example>\n <file name=\"index.html\">\n <div ng-controller=\"Controller\">\n <form novalidate class=\"simple-form\">\n Name: <input type=\"text\" ng-model=\"user.name\" /><br />\n E-mail: <input type=\"email\" ng-model=\"user.email\" /><br />\n Gender: <input type=\"radio\" ng-model=\"user.gender\" value=\"male\" />male\n <input type=\"radio\" ng-model=\"user.gender\" value=\"female\" />female<br />\n <button ng-click=\"reset()\">RESET</button>\n <button ng-click=\"update(user)\">SAVE</button>\n </form>\n <pre>form = {{user | json}}</pre>\n <pre>master = {{master | json}}</pre>\n </div>\n\n <script>\n function Controller($scope) {\n    $scope.master= {};\n\n    $scope.update = function(user) {\n      // Example with 1 argument\n      $scope.master= angular.copy(user);\n    };\n\n    $scope.reset = function() {\n      // Example with 2 arguments\n      angular.copy($scope.master, $scope.user);\n    };\n\n    $scope.reset();\n  }\n </script>\n </file>\n </example>\n */\nfunction copy(source, destination) {\n  if (isWindow(source) || isScope(source)) {\n    throw ngMinErr('cpws',\n      \"Can't copy! Making copies of Window or Scope instances is not supported.\");\n  }\n\n  if (!destination) {\n    destination = source;\n    if (source) {\n      if (isArray(source)) {\n        destination = copy(source, []);\n      } else if (isDate(source)) {\n        destination = new Date(source.getTime());\n      } else if (isRegExp(source)) {\n        destination = new RegExp(source.source);\n      } else if (isObject(source)) {\n        destination = copy(source, {});\n      }\n    }\n  } else {\n    if (source === destination) throw ngMinErr('cpi',\n      \"Can't copy! Source and destination are identical.\");\n    if (isArray(source)) {\n      destination.length = 0;\n      for ( var i = 0; i < source.length; i++) {\n        destination.push(copy(source[i]));\n      }\n    } else {\n      var h = destination.$$hashKey;\n      forEach(destination, function(value, key) {\n        delete destination[key];\n      });\n      for ( var key in source) {\n        destination[key] = copy(source[key]);\n      }\n      setHashKey(destination,h);\n    }\n  }\n  return destination;\n}\n\n/**\n * Create a shallow copy of an object\n */\nfunction shallowCopy(src, dst) {\n  dst = dst || {};\n\n  for(var key in src) {\n    // shallowCopy is only ever called by $compile nodeLinkFn, which has control over src\n    // so we don't need to worry about using our custom hasOwnProperty here\n    if (src.hasOwnProperty(key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {\n      dst[key] = src[key];\n    }\n  }\n\n  return dst;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.equals\n * @module ng\n * @function\n *\n * @description\n * Determines if two objects or two values are equivalent. Supports value types, regular\n * expressions, arrays and objects.\n *\n * Two objects or values are considered equivalent if at least one of the following is true:\n *\n * * Both objects or values pass `===` comparison.\n * * Both objects or values are of the same type and all of their properties are equal by\n *   comparing them with `angular.equals`.\n * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)\n * * Both values represent the same regular expression (In JavaScript,\n *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual\n *   representation matches).\n *\n * During a property comparison, properties of `function` type and properties with names\n * that begin with `$` are ignored.\n *\n * Scope and DOMWindow objects are being compared only by identify (`===`).\n *\n * @param {*} o1 Object or value to compare.\n * @param {*} o2 Object or value to compare.\n * @returns {boolean} True if arguments are equal.\n */\nfunction equals(o1, o2) {\n  if (o1 === o2) return true;\n  if (o1 === null || o2 === null) return false;\n  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\n  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;\n  if (t1 == t2) {\n    if (t1 == 'object') {\n      if (isArray(o1)) {\n        if (!isArray(o2)) return false;\n        if ((length = o1.length) == o2.length) {\n          for(key=0; key<length; key++) {\n            if (!equals(o1[key], o2[key])) return false;\n          }\n          return true;\n        }\n      } else if (isDate(o1)) {\n        return isDate(o2) && o1.getTime() == o2.getTime();\n      } else if (isRegExp(o1) && isRegExp(o2)) {\n        return o1.toString() == o2.toString();\n      } else {\n        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;\n        keySet = {};\n        for(key in o1) {\n          if (key.charAt(0) === '$' || isFunction(o1[key])) continue;\n          if (!equals(o1[key], o2[key])) return false;\n          keySet[key] = true;\n        }\n        for(key in o2) {\n          if (!keySet.hasOwnProperty(key) &&\n              key.charAt(0) !== '$' &&\n              o2[key] !== undefined &&\n              !isFunction(o2[key])) return false;\n        }\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n\nfunction csp() {\n  return (document.securityPolicy && document.securityPolicy.isActive) ||\n      (document.querySelector &&\n      !!(document.querySelector('[ng-csp]') || document.querySelector('[data-ng-csp]')));\n}\n\n\nfunction concat(array1, array2, index) {\n  return array1.concat(slice.call(array2, index));\n}\n\nfunction sliceArgs(args, startIndex) {\n  return slice.call(args, startIndex || 0);\n}\n\n\n/* jshint -W101 */\n/**\n * @ngdoc function\n * @name angular.bind\n * @module ng\n * @function\n *\n * @description\n * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\n * `fn`). You can supply optional `args` that are prebound to the function. This feature is also\n * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as\n * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).\n *\n * @param {Object} self Context which `fn` should be evaluated in.\n * @param {function()} fn Function to be bound.\n * @param {...*} args Optional arguments to be prebound to the `fn` function call.\n * @returns {function()} Function that wraps the `fn` with all the specified bindings.\n */\n/* jshint +W101 */\nfunction bind(self, fn) {\n  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\n  if (isFunction(fn) && !(fn instanceof RegExp)) {\n    return curryArgs.length\n      ? function() {\n          return arguments.length\n            ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))\n            : fn.apply(self, curryArgs);\n        }\n      : function() {\n          return arguments.length\n            ? fn.apply(self, arguments)\n            : fn.call(self);\n        };\n  } else {\n    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)\n    return fn;\n  }\n}\n\n\nfunction toJsonReplacer(key, value) {\n  var val = value;\n\n  if (typeof key === 'string' && key.charAt(0) === '$') {\n    val = undefined;\n  } else if (isWindow(value)) {\n    val = '$WINDOW';\n  } else if (value &&  document === value) {\n    val = '$DOCUMENT';\n  } else if (isScope(value)) {\n    val = '$SCOPE';\n  }\n\n  return val;\n}\n\n\n/**\n * @ngdoc function\n * @name angular.toJson\n * @module ng\n * @function\n *\n * @description\n * Serializes input into a JSON-formatted string. Properties with leading $ characters will be\n * stripped since angular uses this notation internally.\n *\n * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.\n * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.\n * @returns {string|undefined} JSON-ified string representing `obj`.\n */\nfunction toJson(obj, pretty) {\n  if (typeof obj === 'undefined') return undefined;\n  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);\n}\n\n\n/**\n * @ngdoc function\n * @name angular.fromJson\n * @module ng\n * @function\n *\n * @description\n * Deserializes a JSON string.\n *\n * @param {string} json JSON string to deserialize.\n * @returns {Object|Array|string|number} Deserialized thingy.\n */\nfunction fromJson(json) {\n  return isString(json)\n      ? JSON.parse(json)\n      : json;\n}\n\n\nfunction toBoolean(value) {\n  if (typeof value === 'function') {\n    value = true;\n  } else if (value && value.length !== 0) {\n    var v = lowercase(\"\" + value);\n    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');\n  } else {\n    value = false;\n  }\n  return value;\n}\n\n/**\n * @returns {string} Returns the string representation of the element.\n */\nfunction startingTag(element) {\n  element = jqLite(element).clone();\n  try {\n    // turns out IE does not let you set .html() on elements which\n    // are not allowed to have children. So we just ignore it.\n    element.empty();\n  } catch(e) {}\n  // As Per DOM Standards\n  var TEXT_NODE = 3;\n  var elemHtml = jqLite('<div>').append(element).html();\n  try {\n    return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) :\n        elemHtml.\n          match(/^(<[^>]+>)/)[1].\n          replace(/^<([\\w\\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });\n  } catch(e) {\n    return lowercase(elemHtml);\n  }\n\n}\n\n\n/////////////////////////////////////////////////\n\n/**\n * Tries to decode the URI component without throwing an exception.\n *\n * @private\n * @param str value potential URI component to check.\n * @returns {boolean} True if `value` can be decoded\n * with the decodeURIComponent function.\n */\nfunction tryDecodeURIComponent(value) {\n  try {\n    return decodeURIComponent(value);\n  } catch(e) {\n    // Ignore any invalid uri component\n  }\n}\n\n\n/**\n * Parses an escaped url query string into key-value pairs.\n * @returns {Object.<string,boolean|Array>}\n */\nfunction parseKeyValue(/**string*/keyValue) {\n  var obj = {}, key_value, key;\n  forEach((keyValue || \"\").split('&'), function(keyValue) {\n    if ( keyValue ) {\n      key_value = keyValue.split('=');\n      key = tryDecodeURIComponent(key_value[0]);\n      if ( isDefined(key) ) {\n        var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;\n        if (!obj[key]) {\n          obj[key] = val;\n        } else if(isArray(obj[key])) {\n          obj[key].push(val);\n        } else {\n          obj[key] = [obj[key],val];\n        }\n      }\n    }\n  });\n  return obj;\n}\n\nfunction toKeyValue(obj) {\n  var parts = [];\n  forEach(obj, function(value, key) {\n    if (isArray(value)) {\n      forEach(value, function(arrayValue) {\n        parts.push(encodeUriQuery(key, true) +\n                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));\n      });\n    } else {\n    parts.push(encodeUriQuery(key, true) +\n               (value === true ? '' : '=' + encodeUriQuery(value, true)));\n    }\n  });\n  return parts.length ? parts.join('&') : '';\n}\n\n\n/**\n * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\n * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\n * segments:\n *    segment       = *pchar\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriSegment(val) {\n  return encodeUriQuery(val, true).\n             replace(/%26/gi, '&').\n             replace(/%3D/gi, '=').\n             replace(/%2B/gi, '+');\n}\n\n\n/**\n * This method is intended for encoding *key* or *value* parts of query component. We need a custom\n * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\n * encoded per http://tools.ietf.org/html/rfc3986:\n *    query       = *( pchar / \"/\" / \"?\" )\n *    pchar         = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n *    unreserved    = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n *    pct-encoded   = \"%\" HEXDIG HEXDIG\n *    sub-delims    = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\n *                     / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n */\nfunction encodeUriQuery(val, pctEncodeSpaces) {\n  return encodeURIComponent(val).\n             replace(/%40/gi, '@').\n             replace(/%3A/gi, ':').\n             replace(/%24/g, '$').\n             replace(/%2C/gi, ',').\n             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\n}\n\nvar ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];\n\nfunction getNgAttribute(element, ngAttr) {\n  var attr, i, ii = ngAttrPrefixes.length, j, jj;\n  element = jqLite(element);\n  for (i=0; i<ii; ++i) {\n    attr = ngAttrPrefixes[i] + ngAttr;\n    if (isString(attr = element.attr(attr))) {\n      return attr;\n    }\n  }\n  return null;\n}\n\n/**\n * @ngdoc directive\n * @name ngApp\n * @module ng\n *\n * @element ANY\n * @param {angular.Module} ngApp an optional application\n *   {@link angular.module module} name to load.\n * @param {boolean=} ngStrictDi if this attribute is present on the app element, the injector will be\n *   created in \"strict-di\" mode. This means that the application will fail to invoke functions which\n *   do not use explicit function annotation (and are thus unsuitable for minification), as described\n *   in {@link guide/di the Dependency Injection guide}, and useful debugging info will assist in\n *   tracking down the root of these bugs.\n *\n * @description\n *\n * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive\n * designates the **root element** of the application and is typically placed near the root element\n * of the page - e.g. on the `<body>` or `<html>` tags.\n *\n * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`\n * found in the document will be used to define the root element to auto-bootstrap as an\n * application. To run multiple applications in an HTML document you must manually bootstrap them using\n * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.\n *\n * You can specify an **AngularJS module** to be used as the root module for the application.  This\n * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and\n * should contain the application code needed or have dependencies on other modules that will\n * contain the code. See {@link angular.module} for more information.\n *\n * In the example below if the `ngApp` directive were not placed on the `html` element then the\n * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`\n * would not be resolved to `3`.\n *\n * `ngApp` is the easiest, and most common, way to bootstrap an application.\n *\n <example module=\"ngAppDemo\">\n   <file name=\"index.html\">\n   <div ng-controller=\"ngAppDemoController\">\n     I can add: {{a}} + {{b}} =  {{ a+b }}\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {\n     $scope.a = 1;\n     $scope.b = 2;\n   });\n   </file>\n </example>\n *\n * Using `ngStrictDi`, you would see something like this:\n *\n <example ng-app-included=\"true\">\n   <file name=\"index.html\">\n   <div ng-app=\"ngAppStrictDemo\" ng-strict-di>\n       <div ng-controller=\"GoodController1\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style (see\n              script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"GoodController2\">\n           Name: <input ng-model=\"name\"><br />\n           Hello, {{name}}!\n\n           <p>This renders because the controller does not fail to\n              instantiate, by using explicit annotation style\n              (see script.js for details)\n           </p>\n       </div>\n\n       <div ng-controller=\"BadController\">\n           I can add: {{a}} + {{b}} =  {{ a+b }}\n\n           <p>The controller could not be instantiated, due to relying\n              on automatic function annotations (which are disabled in\n              strict mode). As such, the content of this section is not\n              interpolated, and there should be an error in your web console.\n           </p>\n       </div>\n   </div>\n   </file>\n   <file name=\"script.js\">\n   angular.module('ngAppStrictDemo', [])\n     // BadController will fail to instantiate, due to relying on automatic function annotation,\n     // rather than an explicit annotation\n     .controller('BadController', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     })\n     // Unlike BadController, GoodController1 and GoodController2 will not fail to be instantiated,\n     // due to using explicit annotations using the array style and $inject property, respectively.\n     .controller('GoodController1', ['$scope', function($scope) {\n       $scope.a = 1;\n       $scope.b = 2;\n     }])\n     .controller('GoodController2', GoodController2);\n     function GoodController2($scope) {\n       $scope.name = \"World\";\n     }\n     GoodController2.$inject = ['$scope'];\n   </file>\n   <file name=\"style.css\">\n   div[ng-controller] {\n       margin-bottom: 1em;\n       -webkit-border-radius: 4px;\n       border-radius: 4px;\n       border: 1px solid;\n       padding: .5em;\n   }\n   div[ng-controller^=Good] {\n       border-color: #d6e9c6;\n       background-color: #dff0d8;\n       color: #3c763d;\n   }\n   div[ng-controller^=Bad] {\n       border-color: #ebccd1;\n       background-color: #f2dede;\n       color: #a94442;\n       margin-bottom: 0;\n   }\n   </file>\n </example>\n */\nfunction angularInit(element, bootstrap) {\n  var elements = [element],\n      appElement,\n      module,\n      config = {},\n      names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],\n      options = {\n        'boolean': ['strict-di']\n      },\n      NG_APP_CLASS_REGEXP = /\\sng[:\\-]app(:\\s*([\\w\\d_]+);?)?\\s/;\n\n  function append(element) {\n    element && elements.push(element);\n  }\n\n  forEach(names, function(name) {\n    names[name] = true;\n    append(document.getElementById(name));\n    name = name.replace(':', '\\\\:');\n    if (element.querySelectorAll) {\n      forEach(element.querySelectorAll('.' + name), append);\n      forEach(element.querySelectorAll('.' + name + '\\\\:'), append);\n      forEach(element.querySelectorAll('[' + name + ']'), append);\n    }\n  });\n\n  forEach(elements, function(element) {\n    if (!appElement) {\n      var className = ' ' + element.className + ' ';\n      var match = NG_APP_CLASS_REGEXP.exec(className);\n      if (match) {\n        appElement = element;\n        module = (match[2] || '').replace(/\\s+/g, ',');\n      } else {\n        forEach(element.attributes, function(attr) {\n          if (!appElement && names[attr.name]) {\n            appElement = element;\n            module = attr.value;\n          }\n        });\n      }\n    }\n  });\n  if (appElement) {\n    config.strictDi = getNgAttribute(appElement, \"strict-di\") !== null;\n    bootstrap(appElement, module ? [module] : [], config);\n  }\n}\n\n/**\n * @ngdoc function\n * @name angular.bootstrap\n * @module ng\n * @description\n * Use this function to manually start up angular application.\n *\n * See: {@link guide/bootstrap Bootstrap}\n *\n * Note that Protractor based end-to-end tests cannot use this function to bootstrap manually.\n * They must use {@link ng.directive:ngApp ngApp}.\n *\n * Angular will detect if it has been loaded into the browser more than once and only allow the\n * first loaded script to be bootstrapped and will report a warning to the browser console for\n * each of the subsequent scripts.   This prevents strange results in applications, where otherwise\n * multiple instances of Angular try to work on the DOM.\n *\n * ```html\n * <!doctype html>\n * <html>\n * <body>\n * <div ng-controller=\"WelcomeController\">\n *   {{greeting}}\n * </div>\n *\n * <script src=\"angular.js\"></script>\n * <script>\n *   var app = angular.module('demo', [])\n *   .controller('WelcomeController', function($scope) {\n *       $scope.greeting = 'Welcome!';\n *   });\n *   angular.bootstrap(document, ['demo']);\n * </script>\n * </body>\n * </html>\n * ```\n *\n * @param {DOMElement} element DOM element which is the root of angular application.\n * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.\n *     Each item in the array should be the name of a predefined module or a (DI annotated)\n *     function that will be invoked by the injector as a run block.\n *     See: {@link angular.module modules}\n * @param {Object=} config an object for defining configuration options for the application. The\n *     following keys are supported:\n *\n *     - `strictDi`: disable automatic function annotation for the application. This is meant to\n *       assist in finding bugs which break minified code.\n *\n * @returns {auto.$injector} Returns the newly created injector for this app.\n */\nfunction bootstrap(element, modules, config) {\n  if (!isObject(config)) config = {};\n  var defaultConfig = {\n    strictDi: false\n  };\n  config = extend(defaultConfig, config);\n  var doBootstrap = function() {\n    element = jqLite(element);\n\n    if (element.injector()) {\n      var tag = (element[0] === document) ? 'document' : startingTag(element);\n      throw ngMinErr('btstrpd', \"App Already Bootstrapped with this Element '{0}'\", tag);\n    }\n\n    modules = modules || [];\n    modules.unshift(['$provide', function($provide) {\n      $provide.value('$rootElement', element);\n    }]);\n    modules.unshift('ng');\n    var injector = createInjector(modules, config.strictDi);\n    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animate',\n       function(scope, element, compile, injector, animate) {\n        scope.$apply(function() {\n          element.data('$injector', injector);\n          compile(element)(scope);\n        });\n      }]\n    );\n    return injector;\n  };\n\n  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;\n\n  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {\n    return doBootstrap();\n  }\n\n  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');\n  angular.resumeBootstrap = function(extraModules) {\n    forEach(extraModules, function(module) {\n      modules.push(module);\n    });\n    doBootstrap();\n  };\n}\n\nvar SNAKE_CASE_REGEXP = /[A-Z]/g;\nfunction snake_case(name, separator) {\n  separator = separator || '_';\n  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {\n    return (pos ? separator : '') + letter.toLowerCase();\n  });\n}\n\nfunction bindJQuery() {\n  var originalCleanData;\n  // bind to jQuery if present;\n  jQuery = window.jQuery;\n  // Use jQuery if it exists with proper functionality, otherwise default to us.\n  // Angular 1.2+ requires jQuery 1.7.1+ for on()/off() support.\n  if (jQuery && jQuery.fn.on) {\n    jqLite = jQuery;\n    extend(jQuery.fn, {\n      scope: JQLitePrototype.scope,\n      isolateScope: JQLitePrototype.isolateScope,\n      controller: JQLitePrototype.controller,\n      injector: JQLitePrototype.injector,\n      inheritedData: JQLitePrototype.inheritedData\n    });\n\n    originalCleanData = jQuery.cleanData;\n    // Prevent double-proxying.\n    originalCleanData = originalCleanData.$$original || originalCleanData;\n\n    // All nodes removed from the DOM via various jQuery APIs like .remove()\n    // are passed through jQuery.cleanData. Monkey-patch this method to fire\n    // the $destroy event on all removed nodes.\n    jQuery.cleanData = function(elems) {\n      for (var i = 0, elem; (elem = elems[i]) != null; i++) {\n        jQuery(elem).triggerHandler('$destroy');\n      }\n      originalCleanData(elems);\n    };\n    jQuery.cleanData.$$original = originalCleanData;\n  } else {\n    jqLite = JQLite;\n  }\n\n  angular.element = jqLite;\n}\n\n/**\n * throw error if the argument is falsy.\n */\nfunction assertArg(arg, name, reason) {\n  if (!arg) {\n    throw ngMinErr('areq', \"Argument '{0}' is {1}\", (name || '?'), (reason || \"required\"));\n  }\n  return arg;\n}\n\nfunction assertArgFn(arg, name, acceptArrayAnnotation) {\n  if (acceptArrayAnnotation && isArray(arg)) {\n      arg = arg[arg.length - 1];\n  }\n\n  assertArg(isFunction(arg), name, 'not a function, got ' +\n      (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg));\n  return arg;\n}\n\n/**\n * throw error if the name given is hasOwnProperty\n * @param  {String} name    the name to test\n * @param  {String} context the context in which the name is used, such as module or directive\n */\nfunction assertNotHasOwnProperty(name, context) {\n  if (name === 'hasOwnProperty') {\n    throw ngMinErr('badname', \"hasOwnProperty is not a valid {0} name\", context);\n  }\n}\n\n/**\n * Return the value accessible from the object by path. Any undefined traversals are ignored\n * @param {Object} obj starting object\n * @param {String} path path to traverse\n * @param {boolean} [bindFnToScope=true]\n * @returns {Object} value as accessible by path\n */\n//TODO(misko): this function needs to be removed\nfunction getter(obj, path, bindFnToScope) {\n  if (!path) return obj;\n  var keys = path.split('.');\n  var key;\n  var lastInstance = obj;\n  var len = keys.length;\n\n  for (var i = 0; i < len; i++) {\n    key = keys[i];\n    if (obj) {\n      obj = (lastInstance = obj)[key];\n    }\n  }\n  if (!bindFnToScope && isFunction(obj)) {\n    return bind(lastInstance, obj);\n  }\n  return obj;\n}\n\n/**\n * Return the DOM siblings between the first and last node in the given array.\n * @param {Array} array like object\n * @returns {DOMElement} object containing the elements\n */\nfunction getBlockElements(nodes) {\n  var startNode = nodes[0],\n      endNode = nodes[nodes.length - 1];\n  if (startNode === endNode) {\n    return jqLite(startNode);\n  }\n\n  var element = startNode;\n  var elements = [element];\n\n  do {\n    element = element.nextSibling;\n    if (!element) break;\n    elements.push(element);\n  } while (element !== endNode);\n\n  return jqLite(elements);\n}\n\n/**\n * @ngdoc type\n * @name angular.Module\n * @module ng\n * @description\n *\n * Interface for configuring angular {@link angular.module modules}.\n */\n\nfunction setupModuleLoader(window) {\n\n  var $injectorMinErr = minErr('$injector');\n  var ngMinErr = minErr('ng');\n\n  function ensure(obj, name, factory) {\n    return obj[name] || (obj[name] = factory());\n  }\n\n  var angular = ensure(window, 'angular', Object);\n\n  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\n  angular.$$minErr = angular.$$minErr || minErr;\n\n  return ensure(angular, 'module', function() {\n    /** @type {Object.<string, angular.Module>} */\n    var modules = {};\n\n    /**\n     * @ngdoc function\n     * @name angular.module\n     * @module ng\n     * @description\n     *\n     * The `angular.module` is a global place for creating, registering and retrieving Angular\n     * modules.\n     * All modules (angular core or 3rd party) that should be available to an application must be\n     * registered using this mechanism.\n     *\n     * When passed two or more arguments, a new module is created.  If passed only one argument, an\n     * existing module (the name passed as the first argument to `module`) is retrieved.\n     *\n     *\n     * # Module\n     *\n     * A module is a collection of services, directives, filters, and configuration information.\n     * `angular.module` is used to configure the {@link auto.$injector $injector}.\n     *\n     * ```js\n     * // Create a new module\n     * var myModule = angular.module('myModule', []);\n     *\n     * // register a new service\n     * myModule.value('appName', 'MyCoolApp');\n     *\n     * // configure existing services inside initialization blocks.\n     * myModule.config(['$locationProvider', function($locationProvider) {\n     *   // Configure existing providers\n     *   $locationProvider.hashPrefix('!');\n     * }]);\n     * ```\n     *\n     * Then you can create an injector and load your modules like this:\n     *\n     * ```js\n     * var injector = angular.injector(['ng', 'myModule'])\n     * ```\n     *\n     * However it's more likely that you'll just use\n     * {@link ng.directive:ngApp ngApp} or\n     * {@link angular.bootstrap} to simplify this process for you.\n     *\n     * @param {!string} name The name of the module to create or retrieve.\n     * @param {!Array.<string>=} requires If specified then new module is being created. If\n     *        unspecified then the module is being retrieved for further configuration.\n     * @param {Function=} configFn Optional configuration function for the module. Same as\n     *        {@link angular.Module#config Module#config()}.\n     * @returns {module} new module with the {@link angular.Module} api.\n     */\n    return function module(name, requires, configFn) {\n      var assertNotHasOwnProperty = function(name, context) {\n        if (name === 'hasOwnProperty') {\n          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\n        }\n      };\n\n      assertNotHasOwnProperty(name, 'module');\n      if (requires && modules.hasOwnProperty(name)) {\n        modules[name] = null;\n      }\n      return ensure(modules, name, function() {\n        if (!requires) {\n          throw $injectorMinErr('nomod', \"Module '{0}' is not available! You either misspelled \" +\n             \"the module name or forgot to load it. If registering a module ensure that you \" +\n             \"specify the dependencies as the second argument.\", name);\n        }\n\n        /** @type {!Array.<Array.<*>>} */\n        var invokeQueue = [];\n\n        /** @type {!Array.<Function>} */\n        var configBlocks = [];\n\n        /** @type {!Array.<Function>} */\n        var runBlocks = [];\n\n        var config = invokeLater('$injector', 'invoke', 'push', configBlocks);\n\n        /** @type {angular.Module} */\n        var moduleInstance = {\n          // Private state\n          _invokeQueue: invokeQueue,\n          _configBlocks: configBlocks,\n          _runBlocks: runBlocks,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#requires\n           * @module ng\n           * @returns {Array.<string>} List of module names which must be loaded before this module.\n           * @description\n           * Holds the list of modules which the injector will load before the current module is\n           * loaded.\n           */\n          requires: requires,\n\n          /**\n           * @ngdoc property\n           * @name angular.Module#name\n           * @module ng\n           * @returns {string} Name of the module.\n           * @description\n           */\n          name: name,\n\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#provider\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerType Construction function for creating new instance of the\n           *                                service.\n           * @description\n           * See {@link auto.$provide#provider $provide.provider()}.\n           */\n          provider: invokeLater('$provide', 'provider'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#factory\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} providerFunction Function for creating new instance of the service.\n           * @description\n           * See {@link auto.$provide#factory $provide.factory()}.\n           */\n          factory: invokeLater('$provide', 'factory'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#service\n           * @module ng\n           * @param {string} name service name\n           * @param {Function} constructor A constructor function that will be instantiated.\n           * @description\n           * See {@link auto.$provide#service $provide.service()}.\n           */\n          service: invokeLater('$provide', 'service'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#value\n           * @module ng\n           * @param {string} name service name\n           * @param {*} object Service instance object.\n           * @description\n           * See {@link auto.$provide#value $provide.value()}.\n           */\n          value: invokeLater('$provide', 'value'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#constant\n           * @module ng\n           * @param {string} name constant name\n           * @param {*} object Constant value.\n           * @description\n           * Because the constant are fixed, they get applied before other provide methods.\n           * See {@link auto.$provide#constant $provide.constant()}.\n           */\n          constant: invokeLater('$provide', 'constant', 'unshift'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#animation\n           * @module ng\n           * @param {string} name animation name\n           * @param {Function} animationFactory Factory function for creating new instance of an\n           *                                    animation.\n           * @description\n           *\n           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\n           *\n           *\n           * Defines an animation hook that can be later used with\n           * {@link ngAnimate.$animate $animate} service and directives that use this service.\n           *\n           * ```js\n           * module.animation('.animation-name', function($inject1, $inject2) {\n           *   return {\n           *     eventName : function(element, done) {\n           *       //code to run the animation\n           *       //once complete, then run done()\n           *       return function cancellationFunction(element) {\n           *         //code to cancel the animation\n           *       }\n           *     }\n           *   }\n           * })\n           * ```\n           *\n           * See {@link ngAnimate.$animateProvider#register $animateProvider.register()} and\n           * {@link ngAnimate ngAnimate module} for more information.\n           */\n          animation: invokeLater('$animateProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#filter\n           * @module ng\n           * @param {string} name Filter name.\n           * @param {Function} filterFactory Factory function for creating new instance of filter.\n           * @description\n           * See {@link ng.$filterProvider#register $filterProvider.register()}.\n           */\n          filter: invokeLater('$filterProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#controller\n           * @module ng\n           * @param {string|Object} name Controller name, or an object map of controllers where the\n           *    keys are the names and the values are the constructors.\n           * @param {Function} constructor Controller constructor function.\n           * @description\n           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\n           */\n          controller: invokeLater('$controllerProvider', 'register'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#directive\n           * @module ng\n           * @param {string|Object} name Directive name, or an object map of directives where the\n           *    keys are the names and the values are the factories.\n           * @param {Function} directiveFactory Factory function for creating new instance of\n           * directives.\n           * @description\n           * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\n           */\n          directive: invokeLater('$compileProvider', 'directive'),\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#config\n           * @module ng\n           * @param {Function} configFn Execute this function on module load. Useful for service\n           *    configuration.\n           * @description\n           * Use this method to register work which needs to be performed on module loading.\n           * For more about how to configure services, see\n           * {@link providers#providers_provider-recipe Provider Recipe}.\n           */\n          config: config,\n\n          /**\n           * @ngdoc method\n           * @name angular.Module#run\n           * @module ng\n           * @param {Function} initializationFn Execute this function after injector creation.\n           *    Useful for application initialization.\n           * @description\n           * Use this method to register work which should be performed when the injector is done\n           * loading all modules.\n           */\n          run: function(block) {\n            runBlocks.push(block);\n            return this;\n          }\n        };\n\n        if (configFn) {\n          config(configFn);\n        }\n\n        return  moduleInstance;\n\n        /**\n         * @param {string} provider\n         * @param {string} method\n         * @param {String=} insertMethod\n         * @returns {angular.Module}\n         */\n        function invokeLater(provider, method, insertMethod, queue) {\n          if (!queue) queue = invokeQueue;\n          return function() {\n            queue[insertMethod || 'push']([provider, method, arguments]);\n            return moduleInstance;\n          };\n        }\n      });\n    };\n  });\n\n}\n\n/* global\n    angularModule: true,\n    version: true,\n\n    $LocaleProvider,\n    $CompileProvider,\n\n    htmlAnchorDirective,\n    inputDirective,\n    inputDirective,\n    formDirective,\n    scriptDirective,\n    selectDirective,\n    styleDirective,\n    optionDirective,\n    ngBindDirective,\n    ngBindHtmlDirective,\n    ngBindTemplateDirective,\n    ngClassDirective,\n    ngClassEvenDirective,\n    ngClassOddDirective,\n    ngCspDirective,\n    ngCloakDirective,\n    ngControllerDirective,\n    ngFormDirective,\n    ngHideDirective,\n    ngIfDirective,\n    ngIncludeDirective,\n    ngIncludeFillContentDirective,\n    ngInitDirective,\n    ngNonBindableDirective,\n    ngPluralizeDirective,\n    ngRepeatDirective,\n    ngShowDirective,\n    ngStyleDirective,\n    ngSwitchDirective,\n    ngSwitchWhenDirective,\n    ngSwitchDefaultDirective,\n    ngOptionsDirective,\n    ngTranscludeDirective,\n    ngModelDirective,\n    ngListDirective,\n    ngChangeDirective,\n    requiredDirective,\n    requiredDirective,\n    ngValueDirective,\n    ngModelOptionsDirective,\n    ngAttributeAliasDirectives,\n    ngEventDirectives,\n\n    $AnchorScrollProvider,\n    $AnimateProvider,\n    $BrowserProvider,\n    $CacheFactoryProvider,\n    $ControllerProvider,\n    $DocumentProvider,\n    $ExceptionHandlerProvider,\n    $FilterProvider,\n    $InterpolateProvider,\n    $IntervalProvider,\n    $HttpProvider,\n    $HttpBackendProvider,\n    $LocationProvider,\n    $LogProvider,\n    $ParseProvider,\n    $RootScopeProvider,\n    $QProvider,\n    $$SanitizeUriProvider,\n    $SceProvider,\n    $SceDelegateProvider,\n    $SnifferProvider,\n    $TemplateCacheProvider,\n    $TimeoutProvider,\n    $$RAFProvider,\n    $$AsyncCallbackProvider,\n    $WindowProvider\n*/\n\n\n/**\n * @ngdoc object\n * @name angular.version\n * @module ng\n * @description\n * An object that contains information about the current AngularJS version. This object has the\n * following properties:\n *\n * - `full` – `{string}` – Full version string, such as \"0.9.18\".\n * - `major` – `{number}` – Major version number, such as \"0\".\n * - `minor` – `{number}` – Minor version number, such as \"9\".\n * - `dot` – `{number}` – Dot version number, such as \"18\".\n * - `codeName` – `{string}` – Code name of the release, such as \"jiggling-armfat\".\n */\nvar version = {\n  full: '1.3.0-beta.10',    // all of these placeholder strings will be replaced by grunt's\n  major: 1,    // package task\n  minor: 3,\n  dot: 0,\n  codeName: 'excessive-clarification'\n};\n\n\nfunction publishExternalAPI(angular){\n  extend(angular, {\n    'bootstrap': bootstrap,\n    'copy': copy,\n    'extend': extend,\n    'equals': equals,\n    'element': jqLite,\n    'forEach': forEach,\n    'injector': createInjector,\n    'noop':noop,\n    'bind':bind,\n    'toJson': toJson,\n    'fromJson': fromJson,\n    'identity':identity,\n    'isUndefined': isUndefined,\n    'isDefined': isDefined,\n    'isString': isString,\n    'isFunction': isFunction,\n    'isObject': isObject,\n    'isNumber': isNumber,\n    'isElement': isElement,\n    'isArray': isArray,\n    'version': version,\n    'isDate': isDate,\n    'lowercase': lowercase,\n    'uppercase': uppercase,\n    'callbacks': {counter: 0},\n    '$$minErr': minErr,\n    '$$csp': csp\n  });\n\n  angularModule = setupModuleLoader(window);\n  try {\n    angularModule('ngLocale');\n  } catch (e) {\n    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);\n  }\n\n  angularModule('ng', ['ngLocale'], ['$provide',\n    function ngModule($provide) {\n      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.\n      $provide.provider({\n        $$sanitizeUri: $$SanitizeUriProvider\n      });\n      $provide.provider('$compile', $CompileProvider).\n        directive({\n            a: htmlAnchorDirective,\n            input: inputDirective,\n            textarea: inputDirective,\n            form: formDirective,\n            script: scriptDirective,\n            select: selectDirective,\n            style: styleDirective,\n            option: optionDirective,\n            ngBind: ngBindDirective,\n            ngBindHtml: ngBindHtmlDirective,\n            ngBindTemplate: ngBindTemplateDirective,\n            ngClass: ngClassDirective,\n            ngClassEven: ngClassEvenDirective,\n            ngClassOdd: ngClassOddDirective,\n            ngCloak: ngCloakDirective,\n            ngController: ngControllerDirective,\n            ngForm: ngFormDirective,\n            ngHide: ngHideDirective,\n            ngIf: ngIfDirective,\n            ngInclude: ngIncludeDirective,\n            ngInit: ngInitDirective,\n            ngNonBindable: ngNonBindableDirective,\n            ngPluralize: ngPluralizeDirective,\n            ngRepeat: ngRepeatDirective,\n            ngShow: ngShowDirective,\n            ngStyle: ngStyleDirective,\n            ngSwitch: ngSwitchDirective,\n            ngSwitchWhen: ngSwitchWhenDirective,\n            ngSwitchDefault: ngSwitchDefaultDirective,\n            ngOptions: ngOptionsDirective,\n            ngTransclude: ngTranscludeDirective,\n            ngModel: ngModelDirective,\n            ngList: ngListDirective,\n            ngChange: ngChangeDirective,\n            required: requiredDirective,\n            ngRequired: requiredDirective,\n            ngValue: ngValueDirective,\n            ngModelOptions: ngModelOptionsDirective\n        }).\n        directive({\n          ngInclude: ngIncludeFillContentDirective\n        }).\n        directive(ngAttributeAliasDirectives).\n        directive(ngEventDirectives);\n      $provide.provider({\n        $anchorScroll: $AnchorScrollProvider,\n        $animate: $AnimateProvider,\n        $browser: $BrowserProvider,\n        $cacheFactory: $CacheFactoryProvider,\n        $controller: $ControllerProvider,\n        $document: $DocumentProvider,\n        $exceptionHandler: $ExceptionHandlerProvider,\n        $filter: $FilterProvider,\n        $interpolate: $InterpolateProvider,\n        $interval: $IntervalProvider,\n        $http: $HttpProvider,\n        $httpBackend: $HttpBackendProvider,\n        $location: $LocationProvider,\n        $log: $LogProvider,\n        $parse: $ParseProvider,\n        $rootScope: $RootScopeProvider,\n        $q: $QProvider,\n        $sce: $SceProvider,\n        $sceDelegate: $SceDelegateProvider,\n        $sniffer: $SnifferProvider,\n        $templateCache: $TemplateCacheProvider,\n        $timeout: $TimeoutProvider,\n        $window: $WindowProvider,\n        $$rAF: $$RAFProvider,\n        $$asyncCallback : $$AsyncCallbackProvider\n      });\n    }\n  ]);\n}\n\n/* global\n\n  -JQLitePrototype,\n  -addEventListenerFn,\n  -removeEventListenerFn,\n  -BOOLEAN_ATTR\n*/\n\n//////////////////////////////////\n//JQLite\n//////////////////////////////////\n\n/**\n * @ngdoc function\n * @name angular.element\n * @module ng\n * @function\n *\n * @description\n * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\n *\n * If jQuery is available, `angular.element` is an alias for the\n * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`\n * delegates to Angular's built-in subset of jQuery, called \"jQuery lite\" or \"jqLite.\"\n *\n * <div class=\"alert alert-success\">jqLite is a tiny, API-compatible subset of jQuery that allows\n * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most\n * commonly needed functionality with the goal of having a very small footprint.</div>\n *\n * To use jQuery, simply load it before `DOMContentLoaded` event fired.\n *\n * <div class=\"alert\">**Note:** all element references in Angular are always wrapped with jQuery or\n * jqLite; they are never raw DOM references.</div>\n *\n * ## Angular's jqLite\n * jqLite provides only the following jQuery methods:\n *\n * - [`addClass()`](http://api.jquery.com/addClass/)\n * - [`after()`](http://api.jquery.com/after/)\n * - [`append()`](http://api.jquery.com/append/)\n * - [`attr()`](http://api.jquery.com/attr/)\n * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData\n * - [`children()`](http://api.jquery.com/children/) - Does not support selectors\n * - [`clone()`](http://api.jquery.com/clone/)\n * - [`contents()`](http://api.jquery.com/contents/)\n * - [`css()`](http://api.jquery.com/css/)\n * - [`data()`](http://api.jquery.com/data/)\n * - [`empty()`](http://api.jquery.com/empty/)\n * - [`eq()`](http://api.jquery.com/eq/)\n * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name\n * - [`hasClass()`](http://api.jquery.com/hasClass/)\n * - [`html()`](http://api.jquery.com/html/)\n * - [`next()`](http://api.jquery.com/next/) - Does not support selectors\n * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData\n * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors\n * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors\n * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors\n * - [`prepend()`](http://api.jquery.com/prepend/)\n * - [`prop()`](http://api.jquery.com/prop/)\n * - [`ready()`](http://api.jquery.com/ready/)\n * - [`remove()`](http://api.jquery.com/remove/)\n * - [`removeAttr()`](http://api.jquery.com/removeAttr/)\n * - [`removeClass()`](http://api.jquery.com/removeClass/)\n * - [`removeData()`](http://api.jquery.com/removeData/)\n * - [`replaceWith()`](http://api.jquery.com/replaceWith/)\n * - [`text()`](http://api.jquery.com/text/)\n * - [`toggleClass()`](http://api.jquery.com/toggleClass/)\n * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.\n * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces\n * - [`val()`](http://api.jquery.com/val/)\n * - [`wrap()`](http://api.jquery.com/wrap/)\n *\n * ## jQuery/jqLite Extras\n * Angular also provides the following additional methods and events to both jQuery and jqLite:\n *\n * ### Events\n * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event\n *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM\n *    element before it is removed.\n *\n * ### Methods\n * - `controller(name)` - retrieves the controller of the current element or its parent. By default\n *   retrieves controller associated with the `ngController` directive. If `name` is provided as\n *   camelCase directive name, then the controller for this directive will be retrieved (e.g.\n *   `'ngModel'`).\n * - `injector()` - retrieves the injector of the current element or its parent.\n * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current\n *   element or its parent.\n * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the\n *   current element. This getter should be used only on elements that contain a directive which starts a new isolate\n *   scope. Calling `scope()` on this element always returns the original non-isolate scope.\n * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\n *   parent element is reached.\n *\n * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\n * @returns {Object} jQuery object.\n */\n\nvar jqCache = JQLite.cache = {},\n    jqName = JQLite.expando = 'ng-' + new Date().getTime(),\n    jqId = 1,\n    addEventListenerFn = (window.document.addEventListener\n      ? function(element, type, fn) {element.addEventListener(type, fn, false);}\n      : function(element, type, fn) {element.attachEvent('on' + type, fn);}),\n    removeEventListenerFn = (window.document.removeEventListener\n      ? function(element, type, fn) {element.removeEventListener(type, fn, false); }\n      : function(element, type, fn) {element.detachEvent('on' + type, fn); });\n\n/*\n * !!! This is an undocumented \"private\" function !!!\n */\nvar jqData = JQLite._data = function(node) {\n  //jQuery always returns an object on cache miss\n  return this.cache[node[this.expando]] || {};\n};\n\nfunction jqNextId() { return ++jqId; }\n\n\nvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\nvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\nvar jqLiteMinErr = minErr('jqLite');\n\n/**\n * Converts snake_case to camelCase.\n * Also there is special case for Moz prefix starting with upper case letter.\n * @param name Name to normalize\n */\nfunction camelCase(name) {\n  return name.\n    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {\n      return offset ? letter.toUpperCase() : letter;\n    }).\n    replace(MOZ_HACK_REGEXP, 'Moz$1');\n}\n\nvar SINGLE_TAG_REGEXP = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/;\nvar HTML_REGEXP = /<|&#?\\w+;/;\nvar TAG_NAME_REGEXP = /<([\\w:]+)/;\nvar XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi;\n\nvar wrapMap = {\n  'option': [1, '<select multiple=\"multiple\">', '</select>'],\n\n  'thead': [1, '<table>', '</table>'],\n  'col': [2, '<table><colgroup>', '</colgroup></table>'],\n  'tr': [2, '<table><tbody>', '</tbody></table>'],\n  'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],\n  '_default': [0, \"\", \"\"]\n};\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\nfunction jqLiteIsTextNode(html) {\n  return !HTML_REGEXP.test(html);\n}\n\nfunction jqLiteBuildFragment(html, context) {\n  var elem, tmp, tag, wrap,\n      fragment = context.createDocumentFragment(),\n      nodes = [], i;\n\n  if (jqLiteIsTextNode(html)) {\n    // Convert non-html into a text node\n    nodes.push(context.createTextNode(html));\n  } else {\n    // Convert html into DOM nodes\n    tmp = tmp || fragment.appendChild(context.createElement(\"div\"));\n    tag = (TAG_NAME_REGEXP.exec(html) || [\"\", \"\"])[1].toLowerCase();\n    wrap = wrapMap[tag] || wrapMap._default;\n    tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, \"<$1></$2>\") + wrap[2];\n\n    // Descend through wrappers to the right content\n    i = wrap[0];\n    while (i--) {\n      tmp = tmp.lastChild;\n    }\n\n    nodes = concat(nodes, tmp.childNodes);\n\n    tmp = fragment.firstChild;\n    tmp.textContent = \"\";\n  }\n\n  // Remove wrapper from fragment\n  fragment.textContent = \"\";\n  fragment.innerHTML = \"\"; // Clear inner HTML\n  forEach(nodes, function(node) {\n    fragment.appendChild(node);\n  });\n\n  return fragment;\n}\n\nfunction jqLiteParseHTML(html, context) {\n  context = context || document;\n  var parsed;\n\n  if ((parsed = SINGLE_TAG_REGEXP.exec(html))) {\n    return [context.createElement(parsed[1])];\n  }\n\n  if ((parsed = jqLiteBuildFragment(html, context))) {\n    return parsed.childNodes;\n  }\n\n  return [];\n}\n\n/////////////////////////////////////////////\nfunction JQLite(element) {\n  if (element instanceof JQLite) {\n    return element;\n  }\n  if (isString(element)) {\n    element = trim(element);\n  }\n  if (!(this instanceof JQLite)) {\n    if (isString(element) && element.charAt(0) != '<') {\n      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');\n    }\n    return new JQLite(element);\n  }\n\n  if (isString(element)) {\n    jqLiteAddNodes(this, jqLiteParseHTML(element));\n  } else {\n    jqLiteAddNodes(this, element);\n  }\n}\n\nfunction jqLiteClone(element) {\n  return element.cloneNode(true);\n}\n\nfunction jqLiteDealoc(element){\n  jqLiteRemoveData(element);\n  for ( var i = 0, children = element.childNodes || []; i < children.length; i++) {\n    jqLiteDealoc(children[i]);\n  }\n}\n\nfunction jqLiteOff(element, type, fn, unsupported) {\n  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');\n\n  var events = jqLiteExpandoStore(element, 'events'),\n      handle = jqLiteExpandoStore(element, 'handle');\n\n  if (!handle) return; //no listeners registered\n\n  if (isUndefined(type)) {\n    forEach(events, function(eventHandler, type) {\n      removeEventListenerFn(element, type, eventHandler);\n      delete events[type];\n    });\n  } else {\n    forEach(type.split(' '), function(type) {\n      if (isUndefined(fn)) {\n        removeEventListenerFn(element, type, events[type]);\n        delete events[type];\n      } else {\n        arrayRemove(events[type] || [], fn);\n      }\n    });\n  }\n}\n\nfunction jqLiteRemoveData(element, name) {\n  var expandoId = element[jqName],\n      expandoStore = jqCache[expandoId];\n\n  if (expandoStore) {\n    if (name) {\n      delete jqCache[expandoId].data[name];\n      return;\n    }\n\n    if (expandoStore.handle) {\n      expandoStore.events.$destroy && expandoStore.handle({}, '$destroy');\n      jqLiteOff(element);\n    }\n    delete jqCache[expandoId];\n    element[jqName] = undefined; // ie does not allow deletion of attributes on elements.\n  }\n}\n\nfunction jqLiteExpandoStore(element, key, value) {\n  var expandoId = element[jqName],\n      expandoStore = jqCache[expandoId || -1];\n\n  if (isDefined(value)) {\n    if (!expandoStore) {\n      element[jqName] = expandoId = jqNextId();\n      expandoStore = jqCache[expandoId] = {};\n    }\n    expandoStore[key] = value;\n  } else {\n    return expandoStore && expandoStore[key];\n  }\n}\n\nfunction jqLiteData(element, key, value) {\n  var data = jqLiteExpandoStore(element, 'data'),\n      isSetter = isDefined(value),\n      keyDefined = !isSetter && isDefined(key),\n      isSimpleGetter = keyDefined && !isObject(key);\n\n  if (!data && !isSimpleGetter) {\n    jqLiteExpandoStore(element, 'data', data = {});\n  }\n\n  if (isSetter) {\n    data[key] = value;\n  } else {\n    if (keyDefined) {\n      if (isSimpleGetter) {\n        // don't create data in this case.\n        return data && data[key];\n      } else {\n        extend(data, key);\n      }\n    } else {\n      return data;\n    }\n  }\n}\n\nfunction jqLiteHasClass(element, selector) {\n  if (!element.getAttribute) return false;\n  return ((\" \" + (element.getAttribute('class') || '') + \" \").replace(/[\\n\\t]/g, \" \").\n      indexOf( \" \" + selector + \" \" ) > -1);\n}\n\nfunction jqLiteRemoveClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    forEach(cssClasses.split(' '), function(cssClass) {\n      element.setAttribute('class', trim(\n          (\" \" + (element.getAttribute('class') || '') + \" \")\n          .replace(/[\\n\\t]/g, \" \")\n          .replace(\" \" + trim(cssClass) + \" \", \" \"))\n      );\n    });\n  }\n}\n\nfunction jqLiteAddClass(element, cssClasses) {\n  if (cssClasses && element.setAttribute) {\n    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\n                            .replace(/[\\n\\t]/g, \" \");\n\n    forEach(cssClasses.split(' '), function(cssClass) {\n      cssClass = trim(cssClass);\n      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {\n        existingClasses += cssClass + ' ';\n      }\n    });\n\n    element.setAttribute('class', trim(existingClasses));\n  }\n}\n\nfunction jqLiteAddNodes(root, elements) {\n  if (elements) {\n    elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))\n      ? elements\n      : [ elements ];\n    for(var i=0; i < elements.length; i++) {\n      root.push(elements[i]);\n    }\n  }\n}\n\nfunction jqLiteController(element, name) {\n  return jqLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');\n}\n\nfunction jqLiteInheritedData(element, name, value) {\n  element = jqLite(element);\n\n  // if element is the document object work with the html element instead\n  // this makes $(document).scope() possible\n  if(element[0].nodeType == 9) {\n    element = element.find('html');\n  }\n  var names = isArray(name) ? name : [name];\n\n  while (element.length) {\n    var node = element[0];\n    for (var i = 0, ii = names.length; i < ii; i++) {\n      if ((value = element.data(names[i])) !== undefined) return value;\n    }\n\n    // If dealing with a document fragment node with a host element, and no parent, use the host\n    // element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM\n    // to lookup parent controllers.\n    element = jqLite(node.parentNode || (node.nodeType === 11 && node.host));\n  }\n}\n\nfunction jqLiteEmpty(element) {\n  for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\n    jqLiteDealoc(childNodes[i]);\n  }\n  while (element.firstChild) {\n    element.removeChild(element.firstChild);\n  }\n}\n\n//////////////////////////////////////////\n// Functions which are declared directly.\n//////////////////////////////////////////\nvar JQLitePrototype = JQLite.prototype = {\n  ready: function(fn) {\n    var fired = false;\n\n    function trigger() {\n      if (fired) return;\n      fired = true;\n      fn();\n    }\n\n    // check if document already is loaded\n    if (document.readyState === 'complete'){\n      setTimeout(trigger);\n    } else {\n      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9\n      // we can not use jqLite since we are not done loading and jQuery could be loaded later.\n      // jshint -W064\n      JQLite(window).on('load', trigger); // fallback to window.onload for others\n      // jshint +W064\n    }\n  },\n  toString: function() {\n    var value = [];\n    forEach(this, function(e){ value.push('' + e);});\n    return '[' + value.join(', ') + ']';\n  },\n\n  eq: function(index) {\n      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\n  },\n\n  length: 0,\n  push: push,\n  sort: [].sort,\n  splice: [].splice\n};\n\n//////////////////////////////////////////\n// Functions iterating getter/setters.\n// these functions return self on setter and\n// value on get.\n//////////////////////////////////////////\nvar BOOLEAN_ATTR = {};\nforEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {\n  BOOLEAN_ATTR[lowercase(value)] = value;\n});\nvar BOOLEAN_ELEMENTS = {};\nforEach('input,select,option,textarea,button,form,details'.split(','), function(value) {\n  BOOLEAN_ELEMENTS[uppercase(value)] = true;\n});\n\nfunction getBooleanAttrName(element, name) {\n  // check dom last since we will most likely fail on name\n  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\n\n  // booleanAttr is here twice to minimize DOM access\n  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;\n}\n\nforEach({\n  data: jqLiteData,\n  inheritedData: jqLiteInheritedData,\n\n  scope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);\n  },\n\n  isolateScope: function(element) {\n    // Can't use jqLiteData here directly so we stay compatible with jQuery!\n    return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');\n  },\n\n  controller: jqLiteController,\n\n  injector: function(element) {\n    return jqLiteInheritedData(element, '$injector');\n  },\n\n  removeAttr: function(element,name) {\n    element.removeAttribute(name);\n  },\n\n  hasClass: jqLiteHasClass,\n\n  css: function(element, name, value) {\n    name = camelCase(name);\n\n    if (isDefined(value)) {\n      element.style[name] = value;\n    } else {\n      var val;\n\n      if (msie <= 8) {\n        // this is some IE specific weirdness that jQuery 1.6.4 does not sure why\n        val = element.currentStyle && element.currentStyle[name];\n        if (val === '') val = 'auto';\n      }\n\n      val = val || element.style[name];\n\n      if (msie <= 8) {\n        // jquery weirdness :-/\n        val = (val === '') ? undefined : val;\n      }\n\n      return  val;\n    }\n  },\n\n  attr: function(element, name, value){\n    var lowercasedName = lowercase(name);\n    if (BOOLEAN_ATTR[lowercasedName]) {\n      if (isDefined(value)) {\n        if (!!value) {\n          element[name] = true;\n          element.setAttribute(name, lowercasedName);\n        } else {\n          element[name] = false;\n          element.removeAttribute(lowercasedName);\n        }\n      } else {\n        return (element[name] ||\n                 (element.attributes.getNamedItem(name)|| noop).specified)\n               ? lowercasedName\n               : undefined;\n      }\n    } else if (isDefined(value)) {\n      element.setAttribute(name, value);\n    } else if (element.getAttribute) {\n      // the extra argument \"2\" is to get the right thing for a.href in IE, see jQuery code\n      // some elements (e.g. Document) don't have get attribute, so return undefined\n      var ret = element.getAttribute(name, 2);\n      // normalize non-existing attributes to undefined (as jQuery)\n      return ret === null ? undefined : ret;\n    }\n  },\n\n  prop: function(element, name, value) {\n    if (isDefined(value)) {\n      element[name] = value;\n    } else {\n      return element[name];\n    }\n  },\n\n  text: (function() {\n    var NODE_TYPE_TEXT_PROPERTY = [];\n    if (msie < 9) {\n      NODE_TYPE_TEXT_PROPERTY[1] = 'innerText';    /** Element **/\n      NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue';    /** Text **/\n    } else {\n      NODE_TYPE_TEXT_PROPERTY[1] =                 /** Element **/\n      NODE_TYPE_TEXT_PROPERTY[3] = 'textContent';  /** Text **/\n    }\n    getText.$dv = '';\n    return getText;\n\n    function getText(element, value) {\n      var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType];\n      if (isUndefined(value)) {\n        return textProp ? element[textProp] : '';\n      }\n      element[textProp] = value;\n    }\n  })(),\n\n  val: function(element, value) {\n    if (isUndefined(value)) {\n      if (nodeName_(element) === 'SELECT' && element.multiple) {\n        var result = [];\n        forEach(element.options, function (option) {\n          if (option.selected) {\n            result.push(option.value || option.text);\n          }\n        });\n        return result.length === 0 ? null : result;\n      }\n      return element.value;\n    }\n    element.value = value;\n  },\n\n  html: function(element, value) {\n    if (isUndefined(value)) {\n      return element.innerHTML;\n    }\n    for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\n      jqLiteDealoc(childNodes[i]);\n    }\n    element.innerHTML = value;\n  },\n\n  empty: jqLiteEmpty\n}, function(fn, name){\n  /**\n   * Properties: writes return selection, reads return first value\n   */\n  JQLite.prototype[name] = function(arg1, arg2) {\n    var i, key;\n\n    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\n    // in a way that survives minification.\n    // jqLiteEmpty takes no arguments but is a setter.\n    if (fn !== jqLiteEmpty &&\n        (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {\n      if (isObject(arg1)) {\n\n        // we are a write, but the object properties are the key/values\n        for (i = 0; i < this.length; i++) {\n          if (fn === jqLiteData) {\n            // data() takes the whole object in jQuery\n            fn(this[i], arg1);\n          } else {\n            for (key in arg1) {\n              fn(this[i], key, arg1[key]);\n            }\n          }\n        }\n        // return self for chaining\n        return this;\n      } else {\n        // we are a read, so read the first child.\n        var value = fn.$dv;\n        // Only if we have $dv do we iterate over all, otherwise it is just the first element.\n        var jj = (value === undefined) ? Math.min(this.length, 1) : this.length;\n        for (var j = 0; j < jj; j++) {\n          var nodeValue = fn(this[j], arg1, arg2);\n          value = value ? value + nodeValue : nodeValue;\n        }\n        return value;\n      }\n    } else {\n      // we are a write, so apply to all children\n      for (i = 0; i < this.length; i++) {\n        fn(this[i], arg1, arg2);\n      }\n      // return self for chaining\n      return this;\n    }\n  };\n});\n\nfunction createEventHandler(element, events) {\n  var eventHandler = function (event, type) {\n    if (!event.preventDefault) {\n      event.preventDefault = function() {\n        event.returnValue = false; //ie\n      };\n    }\n\n    if (!event.stopPropagation) {\n      event.stopPropagation = function() {\n        event.cancelBubble = true; //ie\n      };\n    }\n\n    if (!event.target) {\n      event.target = event.srcElement || document;\n    }\n\n    if (isUndefined(event.defaultPrevented)) {\n      var prevent = event.preventDefault;\n      event.preventDefault = function() {\n        event.defaultPrevented = true;\n        prevent.call(event);\n      };\n      event.defaultPrevented = false;\n    }\n\n    event.isDefaultPrevented = function() {\n      return event.defaultPrevented || event.returnValue === false;\n    };\n\n    // Copy event handlers in case event handlers array is modified during execution.\n    var eventHandlersCopy = shallowCopy(events[type || event.type] || []);\n\n    forEach(eventHandlersCopy, function(fn) {\n      fn.call(element, event);\n    });\n\n    // Remove monkey-patched methods (IE),\n    // as they would cause memory leaks in IE8.\n    if (msie <= 8) {\n      // IE7/8 does not allow to delete property on native object\n      event.preventDefault = null;\n      event.stopPropagation = null;\n      event.isDefaultPrevented = null;\n    } else {\n      // It shouldn't affect normal browsers (native methods are defined on prototype).\n      delete event.preventDefault;\n      delete event.stopPropagation;\n      delete event.isDefaultPrevented;\n    }\n  };\n  eventHandler.elem = element;\n  return eventHandler;\n}\n\n//////////////////////////////////////////\n// Functions iterating traversal.\n// These functions chain results into a single\n// selector.\n//////////////////////////////////////////\nforEach({\n  removeData: jqLiteRemoveData,\n\n  dealoc: jqLiteDealoc,\n\n  on: function onFn(element, type, fn, unsupported){\n    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');\n\n    var events = jqLiteExpandoStore(element, 'events'),\n        handle = jqLiteExpandoStore(element, 'handle');\n\n    if (!events) jqLiteExpandoStore(element, 'events', events = {});\n    if (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));\n\n    forEach(type.split(' '), function(type){\n      var eventFns = events[type];\n\n      if (!eventFns) {\n        if (type == 'mouseenter' || type == 'mouseleave') {\n          var contains = document.body.contains || document.body.compareDocumentPosition ?\n          function( a, b ) {\n            // jshint bitwise: false\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 = b.parentNode) ) {\n                  if ( b === a ) {\n                    return true;\n                  }\n                }\n              }\n              return false;\n            };\n\n          events[type] = [];\n\n          // Refer to jQuery's implementation of mouseenter & mouseleave\n          // Read about mouseenter and mouseleave:\n          // http://www.quirksmode.org/js/events_mouse.html#link8\n          var eventmap = { mouseleave : \"mouseout\", mouseenter : \"mouseover\"};\n\n          onFn(element, eventmap[type], function(event) {\n            var target = this, related = event.relatedTarget;\n            // For mousenter/leave call the handler if related is outside the target.\n            // NB: No relatedTarget if the mouse left/entered the browser window\n            if ( !related || (related !== target && !contains(target, related)) ){\n              handle(event, type);\n            }\n          });\n\n        } else {\n          addEventListenerFn(element, type, handle);\n          events[type] = [];\n        }\n        eventFns = events[type];\n      }\n      eventFns.push(fn);\n    });\n  },\n\n  off: jqLiteOff,\n\n  one: function(element, type, fn) {\n    element = jqLite(element);\n\n    //add the listener twice so that when it is called\n    //you can remove the original function and still be\n    //able to call element.off(ev, fn) normally\n    element.on(type, function onFn() {\n      element.off(type, fn);\n      element.off(type, onFn);\n    });\n    element.on(type, fn);\n  },\n\n  replaceWith: function(element, replaceNode) {\n    var index, parent = element.parentNode;\n    jqLiteDealoc(element);\n    forEach(new JQLite(replaceNode), function(node){\n      if (index) {\n        parent.insertBefore(node, index.nextSibling);\n      } else {\n        parent.replaceChild(node, element);\n      }\n      index = node;\n    });\n  },\n\n  children: function(element) {\n    var children = [];\n    forEach(element.childNodes, function(element){\n      if (element.nodeType === 1)\n        children.push(element);\n    });\n    return children;\n  },\n\n  contents: function(element) {\n    return element.contentDocument || element.childNodes || [];\n  },\n\n  append: function(element, node) {\n    forEach(new JQLite(node), function(child){\n      if (element.nodeType === 1 || element.nodeType === 11) {\n        element.appendChild(child);\n      }\n    });\n  },\n\n  prepend: function(element, node) {\n    if (element.nodeType === 1) {\n      var index = element.firstChild;\n      forEach(new JQLite(node), function(child){\n        element.insertBefore(child, index);\n      });\n    }\n  },\n\n  wrap: function(element, wrapNode) {\n    wrapNode = jqLite(wrapNode)[0];\n    var parent = element.parentNode;\n    if (parent) {\n      parent.replaceChild(wrapNode, element);\n    }\n    wrapNode.appendChild(element);\n  },\n\n  remove: function(element) {\n    jqLiteDealoc(element);\n    var parent = element.parentNode;\n    if (parent) parent.removeChild(element);\n  },\n\n  after: function(element, newElement) {\n    var index = element, parent = element.parentNode;\n    forEach(new JQLite(newElement), function(node){\n      parent.insertBefore(node, index.nextSibling);\n      index = node;\n    });\n  },\n\n  addClass: jqLiteAddClass,\n  removeClass: jqLiteRemoveClass,\n\n  toggleClass: function(element, selector, condition) {\n    if (selector) {\n      forEach(selector.split(' '), function(className){\n        var classCondition = condition;\n        if (isUndefined(classCondition)) {\n          classCondition = !jqLiteHasClass(element, className);\n        }\n        (classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);\n      });\n    }\n  },\n\n  parent: function(element) {\n    var parent = element.parentNode;\n    return parent && parent.nodeType !== 11 ? parent : null;\n  },\n\n  next: function(element) {\n    if (element.nextElementSibling) {\n      return element.nextElementSibling;\n    }\n\n    // IE8 doesn't have nextElementSibling\n    var elm = element.nextSibling;\n    while (elm != null && elm.nodeType !== 1) {\n      elm = elm.nextSibling;\n    }\n    return elm;\n  },\n\n  find: function(element, selector) {\n    if (element.getElementsByTagName) {\n      return element.getElementsByTagName(selector);\n    } else {\n      return [];\n    }\n  },\n\n  clone: jqLiteClone,\n\n  triggerHandler: function(element, eventName, eventData) {\n    var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];\n\n    eventData = eventData || [];\n\n    var event = [{\n      preventDefault: noop,\n      stopPropagation: noop\n    }];\n\n    forEach(eventFns, function(fn) {\n      fn.apply(element, event.concat(eventData));\n    });\n  }\n}, function(fn, name){\n  /**\n   * chaining functions\n   */\n  JQLite.prototype[name] = function(arg1, arg2, arg3) {\n    var value;\n    for(var i=0; i < this.length; i++) {\n      if (isUndefined(value)) {\n        value = fn(this[i], arg1, arg2, arg3);\n        if (isDefined(value)) {\n          // any function which returns a value needs to be wrapped\n          value = jqLite(value);\n        }\n      } else {\n        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));\n      }\n    }\n    return isDefined(value) ? value : this;\n  };\n\n  // bind legacy bind/unbind to on/off\n  JQLite.prototype.bind = JQLite.prototype.on;\n  JQLite.prototype.unbind = JQLite.prototype.off;\n});\n\n/**\n * Computes a hash of an 'obj'.\n * Hash of a:\n *  string is string\n *  number is number as string\n *  object is either result of calling $$hashKey function on the object or uniquely generated id,\n *         that is also assigned to the $$hashKey property of the object.\n *\n * @param obj\n * @returns {string} hash string such that the same input will have the same hash string.\n *         The resulting string key is in 'type:hashKey' format.\n */\nfunction hashKey(obj) {\n  var objType = typeof obj,\n      key;\n\n  if (objType == 'object' && obj !== null) {\n    if (typeof (key = obj.$$hashKey) == 'function') {\n      // must invoke on object to keep the right this\n      key = obj.$$hashKey();\n    } else if (key === undefined) {\n      key = obj.$$hashKey = nextUid();\n    }\n  } else {\n    key = obj;\n  }\n\n  return objType + ':' + key;\n}\n\n/**\n * HashMap which can use objects as keys\n */\nfunction HashMap(array){\n  forEach(array, this.put, this);\n}\nHashMap.prototype = {\n  /**\n   * Store key value pair\n   * @param key key to store can be any type\n   * @param value value to store can be any type\n   */\n  put: function(key, value) {\n    this[hashKey(key)] = value;\n  },\n\n  /**\n   * @param key\n   * @returns {Object} the value for the key\n   */\n  get: function(key) {\n    return this[hashKey(key)];\n  },\n\n  /**\n   * Remove the key/value pair\n   * @param key\n   */\n  remove: function(key) {\n    var value = this[key = hashKey(key)];\n    delete this[key];\n    return value;\n  }\n};\n\n/**\n * @ngdoc function\n * @module ng\n * @name angular.injector\n * @function\n *\n * @description\n * Creates an injector function that can be used for retrieving services as well as for\n * dependency injection (see {@link guide/di dependency injection}).\n *\n\n * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\n *        {@link angular.module}. The `ng` module must be explicitly added.\n * @returns {function()} Injector function. See {@link auto.$injector $injector}.\n *\n * @example\n * Typical usage\n * ```js\n *   // create an injector\n *   var $injector = angular.injector(['ng']);\n *\n *   // use the injector to kick off your application\n *   // use the type inference to auto inject arguments, or use implicit injection\n *   $injector.invoke(function($rootScope, $compile, $document){\n *     $compile($document)($rootScope);\n *     $rootScope.$digest();\n *   });\n * ```\n *\n * Sometimes you want to get access to the injector of a currently running Angular app\n * from outside Angular. Perhaps, you want to inject and compile some markup after the\n * application has been bootstrapped. You can do this using the extra `injector()` added\n * to JQuery/jqLite elements. See {@link angular.element}.\n *\n * *This is fairly rare but could be the case if a third party library is injecting the\n * markup.*\n *\n * In the following example a new block of HTML containing a `ng-controller`\n * directive is added to the end of the document body by JQuery. We then compile and link\n * it into the current AngularJS scope.\n *\n * ```js\n * var $div = $('<div ng-controller=\"MyCtrl\">{{content.label}}</div>');\n * $(document.body).append($div);\n *\n * angular.element(document).injector().invoke(function($compile) {\n *   var scope = angular.element($div).scope();\n *   $compile($div)(scope);\n * });\n * ```\n */\n\n\n/**\n * @ngdoc module\n * @name auto\n * @description\n *\n * Implicit module which gets automatically added to each {@link auto.$injector $injector}.\n */\n\nvar FN_ARGS = /^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\nvar FN_ARG_SPLIT = /,/;\nvar FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\nvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\nvar $injectorMinErr = minErr('$injector');\n\nfunction anonFn(fn) {\n  // For anonymous functions, showing at the very least the function signature can help in\n  // debugging.\n  var fnText = fn.toString().replace(STRIP_COMMENTS, ''),\n      args = fnText.match(FN_ARGS);\n  if (args) {\n    return 'function(' + (args[1] || '').replace(/[\\s\\r\\n]+/, ' ') + ')';\n  }\n  return 'fn';\n}\n\nfunction annotate(fn, strictDi, name) {\n  var $inject,\n      fnText,\n      argDecl,\n      last;\n\n  if (typeof fn == 'function') {\n    if (!($inject = fn.$inject)) {\n      $inject = [];\n      if (fn.length) {\n        if (strictDi) {\n          if (!isString(name) || !name) {\n            name = fn.name || anonFn(fn);\n          }\n          throw $injectorMinErr('strictdi',\n            '{0} is not using explicit annotation and cannot be invoked in strict mode', name);\n        }\n        fnText = fn.toString().replace(STRIP_COMMENTS, '');\n        argDecl = fnText.match(FN_ARGS);\n        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){\n          arg.replace(FN_ARG, function(all, underscore, name){\n            $inject.push(name);\n          });\n        });\n      }\n      fn.$inject = $inject;\n    }\n  } else if (isArray(fn)) {\n    last = fn.length - 1;\n    assertArgFn(fn[last], 'fn');\n    $inject = fn.slice(0, last);\n  } else {\n    assertArgFn(fn, 'fn', true);\n  }\n  return $inject;\n}\n\n///////////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $injector\n * @function\n *\n * @description\n *\n * `$injector` is used to retrieve object instances as defined by\n * {@link auto.$provide provider}, instantiate types, invoke methods,\n * and load modules.\n *\n * The following always holds true:\n *\n * ```js\n *   var $injector = angular.injector();\n *   expect($injector.get('$injector')).toBe($injector);\n *   expect($injector.invoke(function($injector){\n *     return $injector;\n *   }).toBe($injector);\n * ```\n *\n * # Injection Function Annotation\n *\n * JavaScript does not have annotations, and annotations are needed for dependency injection. The\n * following are all valid ways of annotating function with injection arguments and are equivalent.\n *\n * ```js\n *   // inferred (only works if code not minified/obfuscated)\n *   $injector.invoke(function(serviceA){});\n *\n *   // annotated\n *   function explicit(serviceA) {};\n *   explicit.$inject = ['serviceA'];\n *   $injector.invoke(explicit);\n *\n *   // inline\n *   $injector.invoke(['serviceA', function(serviceA){}]);\n * ```\n *\n * ## Inference\n *\n * In JavaScript calling `toString()` on a function returns the function definition. The definition\n * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with\n * minification, and obfuscation tools since these tools change the argument names.\n *\n * ## `$inject` Annotation\n * By adding an `$inject` property onto a function the injection parameters can be specified.\n *\n * ## Inline\n * As an array of injection names, where the last item in the array is the function to call.\n */\n\n/**\n * @ngdoc method\n * @name $injector#get\n *\n * @description\n * Return an instance of the service.\n *\n * @param {string} name The name of the instance to retrieve.\n * @return {*} The instance.\n */\n\n/**\n * @ngdoc method\n * @name $injector#invoke\n *\n * @description\n * Invoke the method and supply the method arguments from the `$injector`.\n *\n * @param {!Function} fn The function to invoke. Function parameters are injected according to the\n *   {@link guide/di $inject Annotation} rules.\n * @param {Object=} self The `this` for the invoked method.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n *                         object first, before the `$injector` is consulted.\n * @returns {*} the value returned by the invoked `fn` function.\n */\n\n/**\n * @ngdoc method\n * @name $injector#has\n *\n * @description\n * Allows the user to query if the particular service exists.\n *\n * @param {string} Name of the service to query.\n * @returns {boolean} returns true if injector has given service.\n */\n\n/**\n * @ngdoc method\n * @name $injector#instantiate\n * @description\n * Create a new instance of JS type. The method takes a constructor function, invokes the new\n * operator, and supplies all of the arguments to the constructor function as specified by the\n * constructor annotation.\n *\n * @param {Function} Type Annotated constructor function.\n * @param {Object=} locals Optional object. If preset then any argument names are read from this\n * object first, before the `$injector` is consulted.\n * @returns {Object} new instance of `Type`.\n */\n\n/**\n * @ngdoc method\n * @name $injector#annotate\n *\n * @description\n * Returns an array of service names which the function is requesting for injection. This API is\n * used by the injector to determine which services need to be injected into the function when the\n * function is invoked. There are three ways in which the function can be annotated with the needed\n * dependencies.\n *\n * # Argument names\n *\n * The simplest form is to extract the dependencies from the arguments of the function. This is done\n * by converting the function into a string using `toString()` method and extracting the argument\n * names.\n * ```js\n *   // Given\n *   function MyController($scope, $route) {\n *     // ...\n *   }\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * This method does not work with code minification / obfuscation. For this reason the following\n * annotation strategies are supported.\n *\n * # The `$inject` property\n *\n * If a function has an `$inject` property and its value is an array of strings, then the strings\n * represent names of services to be injected into the function.\n * ```js\n *   // Given\n *   var MyController = function(obfuscatedScope, obfuscatedRoute) {\n *     // ...\n *   }\n *   // Define function dependencies\n *   MyController['$inject'] = ['$scope', '$route'];\n *\n *   // Then\n *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\n * ```\n *\n * # The array notation\n *\n * It is often desirable to inline Injected functions and that's when setting the `$inject` property\n * is very inconvenient. In these situations using the array notation to specify the dependencies in\n * a way that survives minification is a better choice:\n *\n * ```js\n *   // We wish to write this (not minification / obfuscation safe)\n *   injector.invoke(function($compile, $rootScope) {\n *     // ...\n *   });\n *\n *   // We are forced to write break inlining\n *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\n *     // ...\n *   };\n *   tmpFn.$inject = ['$compile', '$rootScope'];\n *   injector.invoke(tmpFn);\n *\n *   // To better support inline function the inline annotation is supported\n *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\n *     // ...\n *   }]);\n *\n *   // Therefore\n *   expect(injector.annotate(\n *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\n *    ).toEqual(['$compile', '$rootScope']);\n * ```\n *\n * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to\n * be retrieved as described above.\n *\n * @returns {Array.<string>} The names of the services which the function requires.\n */\n\n\n\n\n/**\n * @ngdoc object\n * @name $provide\n *\n * @description\n *\n * The {@link auto.$provide $provide} service has a number of methods for registering components\n * with the {@link auto.$injector $injector}. Many of these functions are also exposed on\n * {@link angular.Module}.\n *\n * An Angular **service** is a singleton object created by a **service factory**.  These **service\n * factories** are functions which, in turn, are created by a **service provider**.\n * The **service providers** are constructor functions. When instantiated they must contain a\n * property called `$get`, which holds the **service factory** function.\n *\n * When you request a service, the {@link auto.$injector $injector} is responsible for finding the\n * correct **service provider**, instantiating it and then calling its `$get` **service factory**\n * function to get the instance of the **service**.\n *\n * Often services have no configuration options and there is no need to add methods to the service\n * provider.  The provider will be no more than a constructor function with a `$get` property. For\n * these cases the {@link auto.$provide $provide} service has additional helper methods to register\n * services without specifying a provider.\n *\n * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the\n *     {@link auto.$injector $injector}\n * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by\n *     providers and services.\n * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by\n *     services, not providers.\n * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,\n *     that will be wrapped in a **service provider** object, whose `$get` property will contain the\n *     given factory function.\n * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`\n *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate\n *      a new object using the given constructor function.\n *\n * See the individual methods for more information and examples.\n */\n\n/**\n * @ngdoc method\n * @name $provide#provider\n * @description\n *\n * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions\n * are constructor functions, whose instances are responsible for \"providing\" a factory for a\n * service.\n *\n * Service provider names start with the name of the service they provide followed by `Provider`.\n * For example, the {@link ng.$log $log} service has a provider called\n * {@link ng.$logProvider $logProvider}.\n *\n * Service provider objects can have additional methods which allow configuration of the provider\n * and its service. Importantly, you can configure what kind of service is created by the `$get`\n * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a\n * method {@link ng.$logProvider#debugEnabled debugEnabled}\n * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the\n * console or not.\n *\n * @param {string} name The name of the instance. NOTE: the provider will be available under `name +\n                        'Provider'` key.\n * @param {(Object|function())} provider If the provider is:\n *\n *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\n *     {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.\n *   - `Constructor`: a new instance of the provider will be created using\n *     {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.\n *\n * @returns {Object} registered provider instance\n\n * @example\n *\n * The following example shows how to create a simple event tracking service and register it using\n * {@link auto.$provide#provider $provide.provider()}.\n *\n * ```js\n *  // Define the eventTracker provider\n *  function EventTrackerProvider() {\n *    var trackingUrl = '/track';\n *\n *    // A provider method for configuring where the tracked events should been saved\n *    this.setTrackingUrl = function(url) {\n *      trackingUrl = url;\n *    };\n *\n *    // The service factory function\n *    this.$get = ['$http', function($http) {\n *      var trackedEvents = {};\n *      return {\n *        // Call this to track an event\n *        event: function(event) {\n *          var count = trackedEvents[event] || 0;\n *          count += 1;\n *          trackedEvents[event] = count;\n *          return count;\n *        },\n *        // Call this to save the tracked events to the trackingUrl\n *        save: function() {\n *          $http.post(trackingUrl, trackedEvents);\n *        }\n *      };\n *    }];\n *  }\n *\n *  describe('eventTracker', function() {\n *    var postSpy;\n *\n *    beforeEach(module(function($provide) {\n *      // Register the eventTracker provider\n *      $provide.provider('eventTracker', EventTrackerProvider);\n *    }));\n *\n *    beforeEach(module(function(eventTrackerProvider) {\n *      // Configure eventTracker provider\n *      eventTrackerProvider.setTrackingUrl('/custom-track');\n *    }));\n *\n *    it('tracks events', inject(function(eventTracker) {\n *      expect(eventTracker.event('login')).toEqual(1);\n *      expect(eventTracker.event('login')).toEqual(2);\n *    }));\n *\n *    it('saves to the tracking url', inject(function(eventTracker, $http) {\n *      postSpy = spyOn($http, 'post');\n *      eventTracker.event('login');\n *      eventTracker.save();\n *      expect(postSpy).toHaveBeenCalled();\n *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');\n *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');\n *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });\n *    }));\n *  });\n * ```\n */\n\n/**\n * @ngdoc method\n * @name $provide#factory\n * @description\n *\n * Register a **service factory**, which will be called to return the service instance.\n * This is short for registering a service where its provider consists of only a `$get` property,\n * which is the given service factory function.\n * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to\n * configure your service in a provider.\n *\n * @param {string} name The name of the instance.\n * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand\n *                            for `$provide.provider(name, {$get: $getFn})`.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service\n * ```js\n *   $provide.factory('ping', ['$http', function($http) {\n *     return function ping() {\n *       return $http.send('/ping');\n *     };\n *   }]);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#service\n * @description\n *\n * Register a **service constructor**, which will be invoked with `new` to create the service\n * instance.\n * This is short for registering a service where its provider's `$get` property is the service\n * constructor function that will be used to instantiate the service instance.\n *\n * You should use {@link auto.$provide#service $provide.service(class)} if you define your service\n * as a type/class.\n *\n * @param {string} name The name of the instance.\n * @param {Function} constructor A class (constructor function) that will be instantiated.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here is an example of registering a service using\n * {@link auto.$provide#service $provide.service(class)}.\n * ```js\n *   var Ping = function($http) {\n *     this.$http = $http;\n *   };\n *\n *   Ping.$inject = ['$http'];\n *\n *   Ping.prototype.send = function() {\n *     return this.$http.get('/ping');\n *   };\n *   $provide.service('ping', Ping);\n * ```\n * You would then inject and use this service like this:\n * ```js\n *   someModule.controller('Ctrl', ['ping', function(ping) {\n *     ping.send();\n *   }]);\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#value\n * @description\n *\n * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a\n * number, an array, an object or a function.  This is short for registering a service where its\n * provider's `$get` property is a factory function that takes no arguments and returns the **value\n * service**.\n *\n * Value services are similar to constant services, except that they cannot be injected into a\n * module configuration function (see {@link angular.Module#config}) but they can be overridden by\n * an Angular\n * {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the instance.\n * @param {*} value The value.\n * @returns {Object} registered provider instance\n *\n * @example\n * Here are some examples of creating value services.\n * ```js\n *   $provide.value('ADMIN_USER', 'admin');\n *\n *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });\n *\n *   $provide.value('halfOf', function(value) {\n *     return value / 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#constant\n * @description\n *\n * Register a **constant service**, such as a string, a number, an array, an object or a function,\n * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be\n * injected into a module configuration function (see {@link angular.Module#config}) and it cannot\n * be overridden by an Angular {@link auto.$provide#decorator decorator}.\n *\n * @param {string} name The name of the constant.\n * @param {*} value The constant value.\n * @returns {Object} registered instance\n *\n * @example\n * Here a some examples of creating constants:\n * ```js\n *   $provide.constant('SHARD_HEIGHT', 306);\n *\n *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);\n *\n *   $provide.constant('double', function(value) {\n *     return value * 2;\n *   });\n * ```\n */\n\n\n/**\n * @ngdoc method\n * @name $provide#decorator\n * @description\n *\n * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator\n * intercepts the creation of a service, allowing it to override or modify the behaviour of the\n * service. The object returned by the decorator may be the original service, or a new service\n * object which replaces or wraps and delegates to the original service.\n *\n * @param {string} name The name of the service to decorate.\n * @param {function()} decorator This function will be invoked when the service needs to be\n *    instantiated and should return the decorated service instance. The function is called using\n *    the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.\n *    Local injection arguments:\n *\n *    * `$delegate` - The original service instance, which can be monkey patched, configured,\n *      decorated or delegated to.\n *\n * @example\n * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting\n * calls to {@link ng.$log#error $log.warn()}.\n * ```js\n *   $provide.decorator('$log', ['$delegate', function($delegate) {\n *     $delegate.warn = $delegate.error;\n *     return $delegate;\n *   }]);\n * ```\n */\n\n\nfunction createInjector(modulesToLoad, strictDi) {\n  strictDi = (strictDi === true);\n  var INSTANTIATING = {},\n      providerSuffix = 'Provider',\n      path = [],\n      loadedModules = new HashMap(),\n      providerCache = {\n        $provide: {\n            provider: supportObject(provider),\n            factory: supportObject(factory),\n            service: supportObject(service),\n            value: supportObject(value),\n            constant: supportObject(constant),\n            decorator: decorator\n          }\n      },\n      providerInjector = (providerCache.$injector =\n          createInternalInjector(providerCache, function() {\n            throw $injectorMinErr('unpr', \"Unknown provider: {0}\", path.join(' <- '));\n          }, strictDi)),\n      instanceCache = {},\n      instanceInjector = (instanceCache.$injector =\n          createInternalInjector(instanceCache, function(servicename) {\n            var provider = providerInjector.get(servicename + providerSuffix);\n            return instanceInjector.invoke(provider.$get, provider, undefined, servicename);\n          }, strictDi));\n\n\n  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });\n\n  return instanceInjector;\n\n  ////////////////////////////////////\n  // $provider\n  ////////////////////////////////////\n\n  function supportObject(delegate) {\n    return function(key, value) {\n      if (isObject(key)) {\n        forEach(key, reverseParams(delegate));\n      } else {\n        return delegate(key, value);\n      }\n    };\n  }\n\n  function provider(name, provider_) {\n    assertNotHasOwnProperty(name, 'service');\n    if (isFunction(provider_) || isArray(provider_)) {\n      provider_ = providerInjector.instantiate(provider_);\n    }\n    if (!provider_.$get) {\n      throw $injectorMinErr('pget', \"Provider '{0}' must define $get factory method.\", name);\n    }\n    return providerCache[name + providerSuffix] = provider_;\n  }\n\n  function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }\n\n  function service(name, constructor) {\n    return factory(name, ['$injector', function($injector) {\n      return $injector.instantiate(constructor);\n    }]);\n  }\n\n  function value(name, val) { return factory(name, valueFn(val)); }\n\n  function constant(name, value) {\n    assertNotHasOwnProperty(name, 'constant');\n    providerCache[name] = value;\n    instanceCache[name] = value;\n  }\n\n  function decorator(serviceName, decorFn) {\n    var origProvider = providerInjector.get(serviceName + providerSuffix),\n        orig$get = origProvider.$get;\n\n    origProvider.$get = function() {\n      var origInstance = instanceInjector.invoke(orig$get, origProvider);\n      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});\n    };\n  }\n\n  ////////////////////////////////////\n  // Module Loading\n  ////////////////////////////////////\n  function loadModules(modulesToLoad){\n    var runBlocks = [], moduleFn, invokeQueue;\n    forEach(modulesToLoad, function(module) {\n      if (loadedModules.get(module)) return;\n      loadedModules.put(module, true);\n\n      function runInvokeQueue(queue) {\n        var i, ii;\n        for(i = 0, ii = queue.length; i < ii; i++) {\n          var invokeArgs = queue[i],\n              provider = providerInjector.get(invokeArgs[0]);\n\n          provider[invokeArgs[1]].apply(provider, invokeArgs[2]);\n        }\n      }\n\n      try {\n        if (isString(module)) {\n          moduleFn = angularModule(module);\n          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\n          runInvokeQueue(moduleFn._invokeQueue);\n          runInvokeQueue(moduleFn._configBlocks);\n        } else if (isFunction(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else if (isArray(module)) {\n            runBlocks.push(providerInjector.invoke(module));\n        } else {\n          assertArgFn(module, 'module');\n        }\n      } catch (e) {\n        if (isArray(module)) {\n          module = module[module.length - 1];\n        }\n        if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {\n          // Safari & FF's stack traces don't contain error.message content\n          // unlike those of Chrome and IE\n          // So if stack doesn't contain message, we create a new string that contains both.\n          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.\n          /* jshint -W022 */\n          e = e.message + '\\n' + e.stack;\n        }\n        throw $injectorMinErr('modulerr', \"Failed to instantiate module {0} due to:\\n{1}\",\n                  module, e.stack || e.message || e);\n      }\n    });\n    return runBlocks;\n  }\n\n  ////////////////////////////////////\n  // internal Injector\n  ////////////////////////////////////\n\n  function createInternalInjector(cache, factory) {\n\n    function getService(serviceName) {\n      if (cache.hasOwnProperty(serviceName)) {\n        if (cache[serviceName] === INSTANTIATING) {\n          throw $injectorMinErr('cdep', 'Circular dependency found: {0}', path.join(' <- '));\n        }\n        return cache[serviceName];\n      } else {\n        try {\n          path.unshift(serviceName);\n          cache[serviceName] = INSTANTIATING;\n          return cache[serviceName] = factory(serviceName);\n        } catch (err) {\n          if (cache[serviceName] === INSTANTIATING) {\n            delete cache[serviceName];\n          }\n          throw err;\n        } finally {\n          path.shift();\n        }\n      }\n    }\n\n    function invoke(fn, self, locals, serviceName){\n      if (typeof locals === 'string') {\n        serviceName = locals;\n        locals = null;\n      }\n\n      var args = [],\n          $inject = annotate(fn, strictDi, serviceName),\n          length, i,\n          key;\n\n      for(i = 0, length = $inject.length; i < length; i++) {\n        key = $inject[i];\n        if (typeof key !== 'string') {\n          throw $injectorMinErr('itkn',\n                  'Incorrect injection token! Expected service name as string, got {0}', key);\n        }\n        args.push(\n          locals && locals.hasOwnProperty(key)\n          ? locals[key]\n          : getService(key)\n        );\n      }\n      if (!fn.$inject) {\n        // this means that we must be an array.\n        fn = fn[length];\n      }\n\n      // http://jsperf.com/angularjs-invoke-apply-vs-switch\n      // #5388\n      return fn.apply(self, args);\n    }\n\n    function instantiate(Type, locals, serviceName) {\n      var Constructor = function() {},\n          instance, returnedValue;\n\n      // Check if Type is annotated and use just the given function at n-1 as parameter\n      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);\n      Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;\n      instance = new Constructor();\n      returnedValue = invoke(Type, instance, locals, serviceName);\n\n      return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;\n    }\n\n    return {\n      invoke: invoke,\n      instantiate: instantiate,\n      get: getService,\n      annotate: annotate,\n      has: function(name) {\n        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);\n      }\n    };\n  }\n}\n\ncreateInjector.$$annotate = annotate;\n\n/**\n * @ngdoc service\n * @name $anchorScroll\n * @kind function\n * @requires $window\n * @requires $location\n * @requires $rootScope\n *\n * @description\n * When called, it checks current value of `$location.hash()` and scrolls to the related element,\n * according to rules specified in\n * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).\n *\n * It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor.\n * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div id=\"scrollArea\" ng-controller=\"ScrollCtrl\">\n         <a ng-click=\"gotoBottom()\">Go to bottom</a>\n         <a id=\"bottom\"></a> You're at the bottom!\n       </div>\n     </file>\n     <file name=\"script.js\">\n       function ScrollCtrl($scope, $location, $anchorScroll) {\n         $scope.gotoBottom = function (){\n           // set the location.hash to the id of\n           // the element you wish to scroll to.\n           $location.hash('bottom');\n\n           // call $anchorScroll()\n           $anchorScroll();\n         };\n       }\n     </file>\n     <file name=\"style.css\">\n       #scrollArea {\n         height: 350px;\n         overflow: auto;\n       }\n\n       #bottom {\n         display: block;\n         margin-top: 2000px;\n       }\n     </file>\n   </example>\n */\nfunction $AnchorScrollProvider() {\n\n  var autoScrollingEnabled = true;\n\n  this.disableAutoScrolling = function() {\n    autoScrollingEnabled = false;\n  };\n\n  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {\n    var document = $window.document;\n\n    // helper function to get first anchor from a NodeList\n    // can't use filter.filter, as it accepts only instances of Array\n    // and IE can't convert NodeList to an array using [].slice\n    // TODO(vojta): use filter if we change it to accept lists as well\n    function getFirstAnchor(list) {\n      var result = null;\n      forEach(list, function(element) {\n        if (!result && lowercase(element.nodeName) === 'a') result = element;\n      });\n      return result;\n    }\n\n    function scroll() {\n      var hash = $location.hash(), elm;\n\n      // empty hash, scroll to the top of the page\n      if (!hash) $window.scrollTo(0, 0);\n\n      // element with given id\n      else if ((elm = document.getElementById(hash))) elm.scrollIntoView();\n\n      // first anchor with given name :-D\n      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();\n\n      // no element and hash == 'top', scroll to the top of the page\n      else if (hash === 'top') $window.scrollTo(0, 0);\n    }\n\n    // does not scroll when user clicks on anchor link that is currently on\n    // (no url change, no $location.hash() change), browser native does scroll\n    if (autoScrollingEnabled) {\n      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},\n        function autoScrollWatchAction() {\n          $rootScope.$evalAsync(scroll);\n        });\n    }\n\n    return scroll;\n  }];\n}\n\nvar $animateMinErr = minErr('$animate');\n\n/**\n * @ngdoc provider\n * @name $animateProvider\n *\n * @description\n * Default implementation of $animate that doesn't perform any animations, instead just\n * synchronously performs DOM\n * updates and calls done() callbacks.\n *\n * In order to enable animations the ngAnimate module has to be loaded.\n *\n * To see the functional implementation check out src/ngAnimate/animate.js\n */\nvar $AnimateProvider = ['$provide', function($provide) {\n\n\n  this.$$selectors = {};\n\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#register\n   *\n   * @description\n   * Registers a new injectable animation factory function. The factory function produces the\n   * animation object which contains callback functions for each event that is expected to be\n   * animated.\n   *\n   *   * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`\n   *   must be called once the element animation is complete. If a function is returned then the\n   *   animation service will use this function to cancel the animation whenever a cancel event is\n   *   triggered.\n   *\n   *\n   * ```js\n   *   return {\n     *     eventFn : function(element, done) {\n     *       //code to run the animation\n     *       //once complete, then run done()\n     *       return function cancellationFunction() {\n     *         //code to cancel the animation\n     *       }\n     *     }\n     *   }\n   * ```\n   *\n   * @param {string} name The name of the animation.\n   * @param {Function} factory The factory function that will be executed to return the animation\n   *                           object.\n   */\n  this.register = function(name, factory) {\n    var key = name + '-animation';\n    if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',\n        \"Expecting class selector starting with '.' got '{0}'.\", name);\n    this.$$selectors[name.substr(1)] = key;\n    $provide.factory(key, factory);\n  };\n\n  /**\n   * @ngdoc method\n   * @name $animateProvider#classNameFilter\n   *\n   * @description\n   * Sets and/or returns the CSS class regular expression that is checked when performing\n   * an animation. Upon bootstrap the classNameFilter value is not set at all and will\n   * therefore enable $animate to attempt to perform an animation on any element.\n   * When setting the classNameFilter value, animations will only be performed on elements\n   * that successfully match the filter expression. This in turn can boost performance\n   * for low-powered devices as well as applications containing a lot of structural operations.\n   * @param {RegExp=} expression The className expression which will be checked against all animations\n   * @return {RegExp} The current CSS className expression value. If null then there is no expression value\n   */\n  this.classNameFilter = function(expression) {\n    if(arguments.length === 1) {\n      this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;\n    }\n    return this.$$classNameFilter;\n  };\n\n  this.$get = ['$timeout', '$$asyncCallback', function($timeout, $$asyncCallback) {\n\n    function async(fn) {\n      fn && $$asyncCallback(fn);\n    }\n\n    /**\n     *\n     * @ngdoc service\n     * @name $animate\n     * @description The $animate service provides rudimentary DOM manipulation functions to\n     * insert, remove and move elements within the DOM, as well as adding and removing classes.\n     * This service is the core service used by the ngAnimate $animator service which provides\n     * high-level animation hooks for CSS and JavaScript.\n     *\n     * $animate is available in the AngularJS core, however, the ngAnimate module must be included\n     * to enable full out animation support. Otherwise, $animate will only perform simple DOM\n     * manipulation operations.\n     *\n     * To learn more about enabling animation support, click here to visit the {@link ngAnimate\n     * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service\n     * page}.\n     */\n    return {\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#enter\n       * @function\n       * @description Inserts the element into the DOM either after the `after` element or\n       * as the first child within the `parent` element. Once complete, the done() callback\n       * will be fired (if provided).\n       * @param {DOMElement} element the element which will be inserted into the DOM\n       * @param {DOMElement} parent the parent element which will append the element as\n       *   a child (if the after element is not present)\n       * @param {DOMElement} after the sibling element which will append the element\n       *   after itself\n       * @param {Function=} done callback function that will be called after the element has been\n       *   inserted into the DOM\n       */\n      enter : function(element, parent, after, done) {\n        after\n            ? after.after(element)\n            : parent.prepend(element);\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#leave\n       * @function\n       * @description Removes the element from the DOM. Once complete, the done() callback will be\n       *   fired (if provided).\n       * @param {DOMElement} element the element which will be removed from the DOM\n       * @param {Function=} done callback function that will be called after the element has been\n       *   removed from the DOM\n       */\n      leave : function(element, done) {\n        element.remove();\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#move\n       * @function\n       * @description Moves the position of the provided element within the DOM to be placed\n       * either after the `after` element or inside of the `parent` element. Once complete, the\n       * done() callback will be fired (if provided).\n       *\n       * @param {DOMElement} element the element which will be moved around within the\n       *   DOM\n       * @param {DOMElement} parent the parent element where the element will be\n       *   inserted into (if the after element is not present)\n       * @param {DOMElement} after the sibling element where the element will be\n       *   positioned next to\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   element has been moved to its new position\n       */\n      move : function(element, parent, after, done) {\n        // Do not remove element before insert. Removing will cause data associated with the\n        // element to be dropped. Insert will implicitly do the remove.\n        this.enter(element, parent, after, done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#addClass\n       * @function\n       * @description Adds the provided className CSS class value to the provided element. Once\n       * complete, the done() callback will be fired (if provided).\n       * @param {DOMElement} element the element which will have the className value\n       *   added to it\n       * @param {string} className the CSS class which will be added to the element\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   className value has been added to the element\n       */\n      addClass : function(element, className, done) {\n        className = isString(className) ?\n                      className :\n                      isArray(className) ? className.join(' ') : '';\n        forEach(element, function (element) {\n          jqLiteAddClass(element, className);\n        });\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#removeClass\n       * @function\n       * @description Removes the provided className CSS class value from the provided element.\n       * Once complete, the done() callback will be fired (if provided).\n       * @param {DOMElement} element the element which will have the className value\n       *   removed from it\n       * @param {string} className the CSS class which will be removed from the element\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   className value has been removed from the element\n       */\n      removeClass : function(element, className, done) {\n        className = isString(className) ?\n                      className :\n                      isArray(className) ? className.join(' ') : '';\n        forEach(element, function (element) {\n          jqLiteRemoveClass(element, className);\n        });\n        async(done);\n      },\n\n      /**\n       *\n       * @ngdoc method\n       * @name $animate#setClass\n       * @function\n       * @description Adds and/or removes the given CSS classes to and from the element.\n       * Once complete, the done() callback will be fired (if provided).\n       * @param {DOMElement} element the element which will it's CSS classes changed\n       *   removed from it\n       * @param {string} add the CSS classes which will be added to the element\n       * @param {string} remove the CSS class which will be removed from the element\n       * @param {Function=} done the callback function (if provided) that will be fired after the\n       *   CSS classes have been set on the element\n       */\n      setClass : function(element, add, remove, done) {\n        forEach(element, function (element) {\n          jqLiteAddClass(element, add);\n          jqLiteRemoveClass(element, remove);\n        });\n        async(done);\n      },\n\n      enabled : noop\n    };\n  }];\n}];\n\nfunction $$AsyncCallbackProvider(){\n  this.$get = ['$$rAF', '$timeout', function($$rAF, $timeout) {\n    return $$rAF.supported\n      ? function(fn) { return $$rAF(fn); }\n      : function(fn) {\n        return $timeout(fn, 0, false);\n      };\n  }];\n}\n\n/**\n * ! This is a private undocumented service !\n *\n * @name $browser\n * @requires $log\n * @description\n * This object has two goals:\n *\n * - hide all the global state in the browser caused by the window object\n * - abstract away all the browser specific features and inconsistencies\n *\n * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\n * service, which can be used for convenient testing of the application without the interaction with\n * the real browser apis.\n */\n/**\n * @param {object} window The global window object.\n * @param {object} document jQuery wrapped document.\n * @param {function()} XHR XMLHttpRequest constructor.\n * @param {object} $log console.log or an object with the same interface.\n * @param {object} $sniffer $sniffer service\n */\nfunction Browser(window, document, $log, $sniffer) {\n  var self = this,\n      rawDocument = document[0],\n      location = window.location,\n      history = window.history,\n      setTimeout = window.setTimeout,\n      clearTimeout = window.clearTimeout,\n      pendingDeferIds = {};\n\n  self.isMock = false;\n\n  var outstandingRequestCount = 0;\n  var outstandingRequestCallbacks = [];\n\n  // TODO(vojta): remove this temporary api\n  self.$$completeOutstandingRequest = completeOutstandingRequest;\n  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };\n\n  /**\n   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\n   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\n   */\n  function completeOutstandingRequest(fn) {\n    try {\n      fn.apply(null, sliceArgs(arguments, 1));\n    } finally {\n      outstandingRequestCount--;\n      if (outstandingRequestCount === 0) {\n        while(outstandingRequestCallbacks.length) {\n          try {\n            outstandingRequestCallbacks.pop()();\n          } catch (e) {\n            $log.error(e);\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * @private\n   * Note: this method is used only by scenario runner\n   * TODO(vojta): prefix this method with $$ ?\n   * @param {function()} callback Function that will be called when no outstanding request\n   */\n  self.notifyWhenNoOutstandingRequests = function(callback) {\n    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire\n    // at some deterministic time in respect to the test runner's actions. Leaving things up to the\n    // regular poller would result in flaky tests.\n    forEach(pollFns, function(pollFn){ pollFn(); });\n\n    if (outstandingRequestCount === 0) {\n      callback();\n    } else {\n      outstandingRequestCallbacks.push(callback);\n    }\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Poll Watcher API\n  //////////////////////////////////////////////////////////////\n  var pollFns = [],\n      pollTimeout;\n\n  /**\n   * @name $browser#addPollFn\n   *\n   * @param {function()} fn Poll function to add\n   *\n   * @description\n   * Adds a function to the list of functions that poller periodically executes,\n   * and starts polling if not started yet.\n   *\n   * @returns {function()} the added function\n   */\n  self.addPollFn = function(fn) {\n    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);\n    pollFns.push(fn);\n    return fn;\n  };\n\n  /**\n   * @param {number} interval How often should browser call poll functions (ms)\n   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.\n   *\n   * @description\n   * Configures the poller to run in the specified intervals, using the specified\n   * setTimeout fn and kicks it off.\n   */\n  function startPoller(interval, setTimeout) {\n    (function check() {\n      forEach(pollFns, function(pollFn){ pollFn(); });\n      pollTimeout = setTimeout(check, interval);\n    })();\n  }\n\n  //////////////////////////////////////////////////////////////\n  // URL API\n  //////////////////////////////////////////////////////////////\n\n  var lastBrowserUrl = location.href,\n      baseElement = document.find('base'),\n      newLocation = null;\n\n  /**\n   * @name $browser#url\n   *\n   * @description\n   * GETTER:\n   * Without any argument, this method just returns current value of location.href.\n   *\n   * SETTER:\n   * With at least one argument, this method sets url to new value.\n   * If html5 history api supported, pushState/replaceState is used, otherwise\n   * location.href/location.replace is used.\n   * Returns its own instance to allow chaining\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to change url.\n   *\n   * @param {string} url New url (when used as setter)\n   * @param {boolean=} replace Should new url replace current history record ?\n   */\n  self.url = function(url, replace) {\n    // Android Browser BFCache causes location, history reference to become stale.\n    if (location !== window.location) location = window.location;\n    if (history !== window.history) history = window.history;\n\n    // setter\n    if (url) {\n      if (lastBrowserUrl == url) return;\n      lastBrowserUrl = url;\n      if ($sniffer.history) {\n        if (replace) history.replaceState(null, '', url);\n        else {\n          history.pushState(null, '', url);\n          // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462\n          baseElement.attr('href', baseElement.attr('href'));\n        }\n      } else {\n        newLocation = url;\n        if (replace) {\n          location.replace(url);\n        } else {\n          location.href = url;\n        }\n      }\n      return self;\n    // getter\n    } else {\n      // - newLocation is a workaround for an IE7-9 issue with location.replace and location.href\n      //   methods not updating location.href synchronously.\n      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\n      return newLocation || location.href.replace(/%27/g,\"'\");\n    }\n  };\n\n  var urlChangeListeners = [],\n      urlChangeInit = false;\n\n  function fireUrlChange() {\n    newLocation = null;\n    if (lastBrowserUrl == self.url()) return;\n\n    lastBrowserUrl = self.url();\n    forEach(urlChangeListeners, function(listener) {\n      listener(self.url());\n    });\n  }\n\n  /**\n   * @name $browser#onUrlChange\n   *\n   * @description\n   * Register callback function that will be called, when url changes.\n   *\n   * It's only called when the url is changed from outside of angular:\n   * - user types different url into address bar\n   * - user clicks on history (forward/back) button\n   * - user clicks on a link\n   *\n   * It's not called when url is changed by $browser.url() method\n   *\n   * The listener gets called with new url as parameter.\n   *\n   * NOTE: this api is intended for use only by the $location service. Please use the\n   * {@link ng.$location $location service} to monitor url changes in angular apps.\n   *\n   * @param {function(string)} listener Listener function to be called when url changes.\n   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\n   */\n  self.onUrlChange = function(callback) {\n    // TODO(vojta): refactor to use node's syntax for events\n    if (!urlChangeInit) {\n      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)\n      // don't fire popstate when user change the address bar and don't fire hashchange when url\n      // changed by push/replaceState\n\n      // html5 history api - popstate event\n      if ($sniffer.history) jqLite(window).on('popstate', fireUrlChange);\n      // hashchange event\n      if ($sniffer.hashchange) jqLite(window).on('hashchange', fireUrlChange);\n      // polling\n      else self.addPollFn(fireUrlChange);\n\n      urlChangeInit = true;\n    }\n\n    urlChangeListeners.push(callback);\n    return callback;\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Misc API\n  //////////////////////////////////////////////////////////////\n\n  /**\n   * @name $browser#baseHref\n   *\n   * @description\n   * Returns current <base href>\n   * (always relative - without domain)\n   *\n   * @returns {string} The current base href\n   */\n  self.baseHref = function() {\n    var href = baseElement.attr('href');\n    return href ? href.replace(/^(https?\\:)?\\/\\/[^\\/]*/, '') : '';\n  };\n\n  //////////////////////////////////////////////////////////////\n  // Cookies API\n  //////////////////////////////////////////////////////////////\n  var lastCookies = {};\n  var lastCookieString = '';\n  var cookiePath = self.baseHref();\n\n  /**\n   * @name $browser#cookies\n   *\n   * @param {string=} name Cookie name\n   * @param {string=} value Cookie value\n   *\n   * @description\n   * The cookies method provides a 'private' low level access to browser cookies.\n   * It is not meant to be used directly, use the $cookie service instead.\n   *\n   * The return values vary depending on the arguments that the method was called with as follows:\n   *\n   * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify\n   *   it\n   * - cookies(name, value) -> set name to value, if value is undefined delete the cookie\n   * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that\n   *   way)\n   *\n   * @returns {Object} Hash of all cookies (if called without any parameter)\n   */\n  self.cookies = function(name, value) {\n    /* global escape: false, unescape: false */\n    var cookieLength, cookieArray, cookie, i, index;\n\n    if (name) {\n      if (value === undefined) {\n        rawDocument.cookie = escape(name) + \"=;path=\" + cookiePath +\n                                \";expires=Thu, 01 Jan 1970 00:00:00 GMT\";\n      } else {\n        if (isString(value)) {\n          cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) +\n                                ';path=' + cookiePath).length + 1;\n\n          // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:\n          // - 300 cookies\n          // - 20 cookies per unique domain\n          // - 4096 bytes per cookie\n          if (cookieLength > 4096) {\n            $log.warn(\"Cookie '\"+ name +\n              \"' possibly not set or overflowed because it was too large (\"+\n              cookieLength + \" > 4096 bytes)!\");\n          }\n        }\n      }\n    } else {\n      if (rawDocument.cookie !== lastCookieString) {\n        lastCookieString = rawDocument.cookie;\n        cookieArray = lastCookieString.split(\"; \");\n        lastCookies = {};\n\n        for (i = 0; i < cookieArray.length; i++) {\n          cookie = cookieArray[i];\n          index = cookie.indexOf('=');\n          if (index > 0) { //ignore nameless cookies\n            name = unescape(cookie.substring(0, index));\n            // the first value that is seen for a cookie is the most\n            // specific one.  values for the same cookie name that\n            // follow are for less specific paths.\n            if (lastCookies[name] === undefined) {\n              lastCookies[name] = unescape(cookie.substring(index + 1));\n            }\n          }\n        }\n      }\n      return lastCookies;\n    }\n  };\n\n\n  /**\n   * @name $browser#defer\n   * @param {function()} fn A function, who's execution should be deferred.\n   * @param {number=} [delay=0] of milliseconds to defer the function execution.\n   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\n   *\n   * @description\n   * Executes a fn asynchronously via `setTimeout(fn, delay)`.\n   *\n   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\n   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\n   * via `$browser.defer.flush()`.\n   *\n   */\n  self.defer = function(fn, delay) {\n    var timeoutId;\n    outstandingRequestCount++;\n    timeoutId = setTimeout(function() {\n      delete pendingDeferIds[timeoutId];\n      completeOutstandingRequest(fn);\n    }, delay || 0);\n    pendingDeferIds[timeoutId] = true;\n    return timeoutId;\n  };\n\n\n  /**\n   * @name $browser#defer.cancel\n   *\n   * @description\n   * Cancels a deferred task identified with `deferId`.\n   *\n   * @param {*} deferId Token returned by the `$browser.defer` function.\n   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n   *                    canceled.\n   */\n  self.defer.cancel = function(deferId) {\n    if (pendingDeferIds[deferId]) {\n      delete pendingDeferIds[deferId];\n      clearTimeout(deferId);\n      completeOutstandingRequest(noop);\n      return true;\n    }\n    return false;\n  };\n\n}\n\nfunction $BrowserProvider(){\n  this.$get = ['$window', '$log', '$sniffer', '$document',\n      function( $window,   $log,   $sniffer,   $document){\n        return new Browser($window, $document, $log, $sniffer);\n      }];\n}\n\n/**\n * @ngdoc service\n * @name $cacheFactory\n *\n * @description\n * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to\n * them.\n *\n * ```js\n *\n *  var cache = $cacheFactory('cacheId');\n *  expect($cacheFactory.get('cacheId')).toBe(cache);\n *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();\n *\n *  cache.put(\"key\", \"value\");\n *  cache.put(\"another key\", \"another value\");\n *\n *  // We've specified no options on creation\n *  expect(cache.info()).toEqual({id: 'cacheId', size: 2});\n *\n * ```\n *\n *\n * @param {string} cacheId Name or id of the newly created cache.\n * @param {object=} options Options object that specifies the cache behavior. Properties:\n *\n *   - `{number=}` `capacity` — turns the cache into LRU cache.\n *\n * @returns {object} Newly created cache object with the following set of methods:\n *\n * - `{object}` `info()` — Returns id, size, and options of cache.\n * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns\n *   it.\n * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.\n * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.\n * - `{void}` `removeAll()` — Removes all cached values.\n * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.\n *\n * @example\n   <example module=\"cacheExampleApp\">\n     <file name=\"index.html\">\n       <div ng-controller=\"CacheController\">\n         <input ng-model=\"newCacheKey\" placeholder=\"Key\">\n         <input ng-model=\"newCacheValue\" placeholder=\"Value\">\n         <button ng-click=\"put(newCacheKey, newCacheValue)\">Cache</button>\n\n         <p ng-if=\"keys.length\">Cached Values</p>\n         <div ng-repeat=\"key in keys\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"cache.get(key)\"></b>\n         </div>\n\n         <p>Cache Info</p>\n         <div ng-repeat=\"(key, value) in cache.info()\">\n           <span ng-bind=\"key\"></span>\n           <span>: </span>\n           <b ng-bind=\"value\"></b>\n         </div>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       angular.module('cacheExampleApp', []).\n         controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {\n           $scope.keys = [];\n           $scope.cache = $cacheFactory('cacheId');\n           $scope.put = function(key, value) {\n             $scope.cache.put(key, value);\n             $scope.keys.push(key);\n           };\n         }]);\n     </file>\n     <file name=\"style.css\">\n       p {\n         margin: 10px 0 3px;\n       }\n     </file>\n   </example>\n */\nfunction $CacheFactoryProvider() {\n\n  this.$get = function() {\n    var caches = {};\n\n    function cacheFactory(cacheId, options) {\n      if (cacheId in caches) {\n        throw minErr('$cacheFactory')('iid', \"CacheId '{0}' is already taken!\", cacheId);\n      }\n\n      var size = 0,\n          stats = extend({}, options, {id: cacheId}),\n          data = {},\n          capacity = (options && options.capacity) || Number.MAX_VALUE,\n          lruHash = {},\n          freshEnd = null,\n          staleEnd = null;\n\n      /**\n       * @ngdoc type\n       * @name $cacheFactory.Cache\n       *\n       * @description\n       * A cache object used to store and retrieve data, primarily used by\n       * {@link $http $http} and the {@link ng.directive:script script} directive to cache\n       * templates and other data.\n       *\n       * ```js\n       *  angular.module('superCache')\n       *    .factory('superCache', ['$cacheFactory', function($cacheFactory) {\n       *      return $cacheFactory('super-cache');\n       *    }]);\n       * ```\n       *\n       * Example test:\n       *\n       * ```js\n       *  it('should behave like a cache', inject(function(superCache) {\n       *    superCache.put('key', 'value');\n       *    superCache.put('another key', 'another value');\n       *\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 2\n       *    });\n       *\n       *    superCache.remove('another key');\n       *    expect(superCache.get('another key')).toBeUndefined();\n       *\n       *    superCache.removeAll();\n       *    expect(superCache.info()).toEqual({\n       *      id: 'super-cache',\n       *      size: 0\n       *    });\n       *  }));\n       * ```\n       */\n      return caches[cacheId] = {\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#put\n         * @function\n         *\n         * @description\n         * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be\n         * retrieved later, and incrementing the size of the cache if the key was not already\n         * present in the cache. If behaving like an LRU cache, it will also remove stale\n         * entries from the set.\n         *\n         * It will not insert undefined values into the cache.\n         *\n         * @param {string} key the key under which the cached data is stored.\n         * @param {*} value the value to store alongside the key. If it is undefined, the key\n         *    will not be stored.\n         * @returns {*} the value stored.\n         */\n        put: function(key, value) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key] || (lruHash[key] = {key: key});\n\n            refresh(lruEntry);\n          }\n\n          if (isUndefined(value)) return;\n          if (!(key in data)) size++;\n          data[key] = value;\n\n          if (size > capacity) {\n            this.remove(staleEnd.key);\n          }\n\n          return value;\n        },\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#get\n         * @function\n         *\n         * @description\n         * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the data to be retrieved\n         * @returns {*} the value stored.\n         */\n        get: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            refresh(lruEntry);\n          }\n\n          return data[key];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#remove\n         * @function\n         *\n         * @description\n         * Removes an entry from the {@link $cacheFactory.Cache Cache} object.\n         *\n         * @param {string} key the key of the entry to be removed\n         */\n        remove: function(key) {\n          if (capacity < Number.MAX_VALUE) {\n            var lruEntry = lruHash[key];\n\n            if (!lruEntry) return;\n\n            if (lruEntry == freshEnd) freshEnd = lruEntry.p;\n            if (lruEntry == staleEnd) staleEnd = lruEntry.n;\n            link(lruEntry.n,lruEntry.p);\n\n            delete lruHash[key];\n          }\n\n          delete data[key];\n          size--;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#removeAll\n         * @function\n         *\n         * @description\n         * Clears the cache object of any entries.\n         */\n        removeAll: function() {\n          data = {};\n          size = 0;\n          lruHash = {};\n          freshEnd = staleEnd = null;\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#destroy\n         * @function\n         *\n         * @description\n         * Destroys the {@link $cacheFactory.Cache Cache} object entirely,\n         * removing it from the {@link $cacheFactory $cacheFactory} set.\n         */\n        destroy: function() {\n          data = null;\n          stats = null;\n          lruHash = null;\n          delete caches[cacheId];\n        },\n\n\n        /**\n         * @ngdoc method\n         * @name $cacheFactory.Cache#info\n         * @function\n         *\n         * @description\n         * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.\n         *\n         * @returns {object} an object with the following properties:\n         *   <ul>\n         *     <li>**id**: the id of the cache instance</li>\n         *     <li>**size**: the number of entries kept in the cache instance</li>\n         *     <li>**...**: any additional properties from the options object when creating the\n         *       cache.</li>\n         *   </ul>\n         */\n        info: function() {\n          return extend({}, stats, {size: size});\n        }\n      };\n\n\n      /**\n       * makes the `entry` the freshEnd of the LRU linked list\n       */\n      function refresh(entry) {\n        if (entry != freshEnd) {\n          if (!staleEnd) {\n            staleEnd = entry;\n          } else if (staleEnd == entry) {\n            staleEnd = entry.n;\n          }\n\n          link(entry.n, entry.p);\n          link(entry, freshEnd);\n          freshEnd = entry;\n          freshEnd.n = null;\n        }\n      }\n\n\n      /**\n       * bidirectionally links two entries of the LRU linked list\n       */\n      function link(nextEntry, prevEntry) {\n        if (nextEntry != prevEntry) {\n          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\n          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\n        }\n      }\n    }\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#info\n   *\n   * @description\n   * Get information about all the caches that have been created\n   *\n   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`\n   */\n    cacheFactory.info = function() {\n      var info = {};\n      forEach(caches, function(cache, cacheId) {\n        info[cacheId] = cache.info();\n      });\n      return info;\n    };\n\n\n  /**\n   * @ngdoc method\n   * @name $cacheFactory#get\n   *\n   * @description\n   * Get access to a cache object by the `cacheId` used when it was created.\n   *\n   * @param {string} cacheId Name or id of a cache to access.\n   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.\n   */\n    cacheFactory.get = function(cacheId) {\n      return caches[cacheId];\n    };\n\n\n    return cacheFactory;\n  };\n}\n\n/**\n * @ngdoc service\n * @name $templateCache\n *\n * @description\n * The first time a template is used, it is loaded in the template cache for quick retrieval. You\n * can load templates directly into the cache in a `script` tag, or by consuming the\n * `$templateCache` service directly.\n *\n * Adding via the `script` tag:\n *\n * ```html\n *   <script type=\"text/ng-template\" id=\"templateId.html\">\n *     <p>This is the content of the template</p>\n *   </script>\n * ```\n *\n * **Note:** the `script` tag containing the template does not need to be included in the `head` of\n * the document, but it must be below the `ng-app` definition.\n *\n * Adding via the $templateCache service:\n *\n * ```js\n * var myApp = angular.module('myApp', []);\n * myApp.run(function($templateCache) {\n *   $templateCache.put('templateId.html', 'This is the content of the template');\n * });\n * ```\n *\n * To retrieve the template later, simply use it in your HTML:\n * ```html\n * <div ng-include=\" 'templateId.html' \"></div>\n * ```\n *\n * or get it via Javascript:\n * ```js\n * $templateCache.get('templateId.html')\n * ```\n *\n * See {@link ng.$cacheFactory $cacheFactory}.\n *\n */\nfunction $TemplateCacheProvider() {\n  this.$get = ['$cacheFactory', function($cacheFactory) {\n    return $cacheFactory('templates');\n  }];\n}\n\n/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\n *\n * DOM-related variables:\n *\n * - \"node\" - DOM Node\n * - \"element\" - DOM Element or Node\n * - \"$node\" or \"$element\" - jqLite-wrapped node or element\n *\n *\n * Compiler related stuff:\n *\n * - \"linkFn\" - linking fn of a single directive\n * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\n * - \"childLinkFn\" -  function that aggregates all linking fns for child nodes of a particular node\n * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\n */\n\n\n/**\n * @ngdoc service\n * @name $compile\n * @function\n *\n * @description\n * Compiles an HTML string or DOM into a template and produces a template function, which\n * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.\n *\n * The compilation is a process of walking the DOM tree and matching DOM elements to\n * {@link ng.$compileProvider#directive directives}.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** This document is an in-depth reference of all directive options.\n * For a gentle introduction to directives with examples of common use cases,\n * see the {@link guide/directive directive guide}.\n * </div>\n *\n * ## Comprehensive Directive API\n *\n * There are many different options for a directive.\n *\n * The difference resides in the return value of the factory function.\n * You can either return a \"Directive Definition Object\" (see below) that defines the directive properties,\n * or just the `postLink` function (all other properties will have the default values).\n *\n * <div class=\"alert alert-success\">\n * **Best Practice:** It's recommended to use the \"directive definition object\" form.\n * </div>\n *\n * Here's an example directive declared with a Directive Definition Object:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       priority: 0,\n *       template: '<div></div>', // or // function(tElement, tAttrs) { ... },\n *       // or\n *       // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },\n *       transclude: false,\n *       restrict: 'A',\n *       scope: false,\n *       controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },\n *       controllerAs: 'stringAlias',\n *       require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],\n *       compile: function compile(tElement, tAttrs, transclude) {\n *         return {\n *           pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *           post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *         }\n *         // or\n *         // return function postLink( ... ) { ... }\n *       },\n *       // or\n *       // link: {\n *       //  pre: function preLink(scope, iElement, iAttrs, controller) { ... },\n *       //  post: function postLink(scope, iElement, iAttrs, controller) { ... }\n *       // }\n *       // or\n *       // link: function postLink( ... ) { ... }\n *     };\n *     return directiveDefinitionObject;\n *   });\n * ```\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Any unspecified options will use the default value. You can see the default values below.\n * </div>\n *\n * Therefore the above can be simplified as:\n *\n * ```js\n *   var myModule = angular.module(...);\n *\n *   myModule.directive('directiveName', function factory(injectables) {\n *     var directiveDefinitionObject = {\n *       link: function postLink(scope, iElement, iAttrs) { ... }\n *     };\n *     return directiveDefinitionObject;\n *     // or\n *     // return function postLink(scope, iElement, iAttrs) { ... }\n *   });\n * ```\n *\n *\n *\n * ### Directive Definition Object\n *\n * The directive definition object provides instructions to the {@link ng.$compile\n * compiler}. The attributes are:\n *\n * #### `priority`\n * When there are multiple directives defined on a single DOM element, sometimes it\n * is necessary to specify the order in which the directives are applied. The `priority` is used\n * to sort the directives before their `compile` functions get called. Priority is defined as a\n * number. Directives with greater numerical `priority` are compiled first. Pre-link functions\n * are also run in priority order, but post-link functions are run in reverse order. The order\n * of directives with the same priority is undefined. The default priority is `0`.\n *\n * #### `terminal`\n * If set to true then the current `priority` will be the last set of directives\n * which will execute (any directives at the current priority will still execute\n * as the order of execution on same `priority` is undefined).\n *\n * #### `scope`\n * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the\n * same element request a new scope, only one new scope is created. The new scope rule does not\n * apply for the root of the template since the root of the template always gets a new scope.\n *\n * **If set to `{}` (object hash),** then a new \"isolate\" scope is created. The 'isolate' scope differs from\n * normal scope in that it does not prototypically inherit from the parent scope. This is useful\n * when creating reusable components, which should not accidentally read or modify data in the\n * parent scope.\n *\n * The 'isolate' scope takes an object hash which defines a set of local scope properties\n * derived from the parent scope. These local properties are useful for aliasing values for\n * templates. Locals definition is a hash of local scope property to its source:\n *\n * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is\n *   always a string since DOM attributes are strings. If no `attr` name is specified  then the\n *   attribute name is assumed to be the same as the local name.\n *   Given `<widget my-attr=\"hello {{name}}\">` and widget definition\n *   of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect\n *   the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the\n *   `localName` property on the widget scope. The `name` is read from the parent scope (not\n *   component scope).\n *\n * * `=` or `=attr` - set up bi-directional binding between a local scope property and the\n *   parent scope property of name defined via the value of the `attr` attribute. If no `attr`\n *   name is specified then the attribute name is assumed to be the same as the local name.\n *   Given `<widget my-attr=\"parentModel\">` and widget definition of\n *   `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the\n *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected\n *   in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent\n *   scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You\n *   can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional.\n *\n * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.\n *   If no `attr` name is specified then the attribute name is assumed to be the same as the\n *   local name. Given `<widget my-attr=\"count = count + value\">` and widget definition of\n *   `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to\n *   a function wrapper for the `count = count + value` expression. Often it's desirable to\n *   pass data from the isolated scope via an expression and to the parent scope, this can be\n *   done by passing a map of local variable names and values into the expression wrapper fn.\n *   For example, if the expression is `increment(amount)` then we can specify the amount value\n *   by calling the `localFn` as `localFn({amount: 22})`.\n *\n *\n *\n * #### `controller`\n * Controller constructor function. The controller is instantiated before the\n * pre-linking phase and it is shared with other directives (see\n * `require` attribute). This allows the directives to communicate with each other and augment\n * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:\n *\n * * `$scope` - Current scope associated with the element\n * * `$element` - Current element\n * * `$attrs` - Current attributes object for the element\n * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope.\n *    The scope can be overridden by an optional first argument.\n *   `function([scope], cloneLinkingFn)`.\n *\n *\n * #### `require`\n * Require another directive and inject its controller as the fourth argument to the linking function. The\n * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the\n * injected argument will be an array in corresponding order. If no such directive can be\n * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with:\n *\n * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.\n * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.\n * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.\n * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the\n *   `link` fn if not found.\n *\n *\n * #### `controllerAs`\n * Controller alias at the directive scope. An alias for the controller so it\n * can be referenced at the directive template. The directive needs to define a scope for this\n * configuration to be used. Useful in the case when directive is used as component.\n *\n *\n * #### `restrict`\n * String of subset of `EACM` which restricts the directive to a specific directive\n * declaration style. If omitted, the default (attributes only) is used.\n *\n * * `E` - Element name: `<my-directive></my-directive>`\n * * `A` - Attribute (default): `<div my-directive=\"exp\"></div>`\n * * `C` - Class: `<div class=\"my-directive: exp;\"></div>`\n * * `M` - Comment: `<!-- directive: my-directive exp -->`\n *\n *\n * #### `type`\n * String representing the document type used by the markup. This is useful for templates where the root\n * node is non-HTML content (such as SVG or MathML). The default value is \"html\".\n *\n * * `html` - All root template nodes are HTML, and don't need to be wrapped. Root nodes may also be\n *   top-level elements such as `<svg>` or `<math>`.\n * * `svg` - The template contains only SVG content, and must be wrapped in an `<svg>` node prior to\n *   processing.\n * * `math` - The template contains only MathML content, and must be wrapped in an `<math>` node prior to\n *   processing.\n *\n * If no `type` is specified, then the type is considered to be html.\n *\n * #### `template`\n * replace the current element with the contents of the HTML. The replacement process\n * migrates all of the attributes / classes from the old element to the new one. See the\n * {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive\n * Directives Guide} for an example.\n *\n * You can specify `template` as a string representing the template or as a function which takes\n * two arguments `tElement` and `tAttrs` (described in the `compile` function api below) and\n * returns a string value representing the template.\n *\n *\n * #### `templateUrl`\n * Same as `template` but the template is loaded from the specified URL. Because\n * the template loading is asynchronous the compilation/linking is suspended until the template\n * is loaded.\n *\n * You can specify `templateUrl` as a string representing the URL or as a function which takes two\n * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns\n * a string value representing the url.  In either case, the template URL is passed through {@link\n * api/ng.$sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.\n *\n *\n * #### `replace` ([*DEPRECATED*!], will be removed in next major release)\n * specify where the template should be inserted. Defaults to `false`.\n *\n * * `true` - the template will replace the current element.\n * * `false` - the template will replace the contents of the current element.\n *\n *\n * #### `transclude`\n * compile the content of the element and make it available to the directive.\n * Typically used with {@link ng.directive:ngTransclude\n * ngTransclude}. The advantage of transclusion is that the linking function receives a\n * transclusion function which is pre-bound to the correct scope. In a typical setup the widget\n * creates an `isolate` scope, but the transclusion is not a child, but a sibling of the `isolate`\n * scope. This makes it possible for the widget to have private state, and the transclusion to\n * be bound to the parent (pre-`isolate`) scope.\n *\n * * `true` - transclude the content of the directive.\n * * `'element'` - transclude the whole element including any directives defined at lower priority.\n *\n *\n * #### `compile`\n *\n * ```js\n *   function compile(tElement, tAttrs, transclude) { ... }\n * ```\n *\n * The compile function deals with transforming the template DOM. Since most directives do not do\n * template transformation, it is not used often. The compile function takes the following arguments:\n *\n *   * `tElement` - template element - The element where the directive has been declared. It is\n *     safe to do template transformation on the element and child elements only.\n *\n *   * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared\n *     between all directive compile functions.\n *\n *   * `transclude` -  [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`\n *\n * <div class=\"alert alert-warning\">\n * **Note:** The template instance and the link instance may be different objects if the template has\n * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that\n * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration\n * should be done in a linking function rather than in a compile function.\n * </div>\n\n * <div class=\"alert alert-warning\">\n * **Note:** The compile function cannot handle directives that recursively use themselves in their\n * own templates or compile functions. Compiling these directives results in an infinite loop and a\n * stack overflow errors.\n *\n * This can be avoided by manually using $compile in the postLink function to imperatively compile\n * a directive's template instead of relying on automatic template compilation via `template` or\n * `templateUrl` declaration or manual compilation inside the compile function.\n * </div>\n *\n * <div class=\"alert alert-error\">\n * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it\n *   e.g. does not know about the right outer scope. Please use the transclude function that is passed\n *   to the link function instead.\n * </div>\n\n * A compile function can have a return value which can be either a function or an object.\n *\n * * returning a (post-link) function - is equivalent to registering the linking function via the\n *   `link` property of the config object when the compile function is empty.\n *\n * * returning an object with function(s) registered via `pre` and `post` properties - allows you to\n *   control when a linking function should be called during the linking phase. See info about\n *   pre-linking and post-linking functions below.\n *\n *\n * #### `link`\n * This property is used only if the `compile` property is not defined.\n *\n * ```js\n *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }\n * ```\n *\n * The link function is responsible for registering DOM listeners as well as updating the DOM. It is\n * executed after the template has been cloned. This is where most of the directive logic will be\n * put.\n *\n *   * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the\n *     directive for registering {@link ng.$rootScope.Scope#$watch watches}.\n *\n *   * `iElement` - instance element - The element where the directive is to be used. It is safe to\n *     manipulate the children of the element only in `postLink` function since the children have\n *     already been linked.\n *\n *   * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared\n *     between all directive linking functions.\n *\n *   * `controller` - a controller instance - A controller instance if at least one directive on the\n *     element defines a controller. The controller is shared among all the directives, which allows\n *     the directives to use the controllers as a communication channel.\n *\n *   * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.\n *     The scope can be overridden by an optional first argument. This is the same as the `$transclude`\n *     parameter of directive controllers.\n *     `function([scope], cloneLinkingFn)`.\n *\n *\n * #### Pre-linking function\n *\n * Executed before the child elements are linked. Not safe to do DOM transformation since the\n * compiler linking function will fail to locate the correct elements for linking.\n *\n * #### Post-linking function\n *\n * Executed after the child elements are linked. It is safe to do DOM transformation in the post-linking function.\n *\n * <a name=\"Attributes\"></a>\n * ### Attributes\n *\n * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the\n * `link()` or `compile()` functions. It has a variety of uses.\n *\n * accessing *Normalized attribute names:*\n * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'.\n * the attributes object allows for normalized access to\n *   the attributes.\n *\n * * *Directive inter-communication:* All directives share the same instance of the attributes\n *   object which allows the directives to use the attributes object as inter directive\n *   communication.\n *\n * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object\n *   allowing other directives to read the interpolated value.\n *\n * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes\n *   that contain interpolation (e.g. `src=\"{{bar}}\"`). Not only is this very efficient but it's also\n *   the only way to easily get the actual value because during the linking phase the interpolation\n *   hasn't been evaluated yet and so the value is at this time set to `undefined`.\n *\n * ```js\n * function linkingFn(scope, elm, attrs, ctrl) {\n *   // get the attribute value\n *   console.log(attrs.ngModel);\n *\n *   // change the attribute\n *   attrs.$set('ngModel', 'new value');\n *\n *   // observe changes to interpolated attribute\n *   attrs.$observe('ngModel', function(value) {\n *     console.log('ngModel has changed value to ' + value);\n *   });\n * }\n * ```\n *\n * Below is an example using `$compileProvider`.\n *\n * <div class=\"alert alert-warning\">\n * **Note**: Typically directives are registered with `module.directive`. The example below is\n * to illustrate how `$compile` works.\n * </div>\n *\n <example module=\"compile\">\n   <file name=\"index.html\">\n    <script>\n      angular.module('compile', [], function($compileProvider) {\n        // configure new 'compile' directive by passing a directive\n        // factory function. The factory function injects the '$compile'\n        $compileProvider.directive('compile', function($compile) {\n          // directive factory creates a link function\n          return function(scope, element, attrs) {\n            scope.$watch(\n              function(scope) {\n                 // watch the 'compile' expression for changes\n                return scope.$eval(attrs.compile);\n              },\n              function(value) {\n                // when the 'compile' expression changes\n                // assign it into the current DOM\n                element.html(value);\n\n                // compile the new DOM and link it to the current\n                // scope.\n                // NOTE: we only compile .childNodes so that\n                // we don't get into infinite loop compiling ourselves\n                $compile(element.contents())(scope);\n              }\n            );\n          };\n        })\n      });\n\n      function Ctrl($scope) {\n        $scope.name = 'Angular';\n        $scope.html = 'Hello {{name}}';\n      }\n    </script>\n    <div ng-controller=\"Ctrl\">\n      <input ng-model=\"name\"> <br>\n      <textarea ng-model=\"html\"></textarea> <br>\n      <div compile=\"html\"></div>\n    </div>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n     it('should auto compile', function() {\n       var textarea = $('textarea');\n       var output = $('div[compile]');\n       // The initial state reads 'Hello Angular'.\n       expect(output.getText()).toBe('Hello Angular');\n       textarea.clear();\n       textarea.sendKeys('{{name}}!');\n       expect(output.getText()).toBe('Angular!');\n     });\n   </file>\n </example>\n\n *\n *\n * @param {string|DOMElement} element Element or HTML string to compile into a template function.\n * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives.\n * @param {number} maxPriority only apply directives lower than given priority (Only effects the\n *                 root element(s), not their children)\n * @returns {function(scope, cloneAttachFn=)} a link function which is used to bind template\n * (a DOM element/tree) to a scope. Where:\n *\n *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\n *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\n *  `template` and call the `cloneAttachFn` function allowing the caller to attach the\n *  cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\n *  called as: <br> `cloneAttachFn(clonedElement, scope)` where:\n *\n *      * `clonedElement` - is a clone of the original `element` passed into the compiler.\n *      * `scope` - is the current scope with which the linking function is working with.\n *\n * Calling the linking function returns the element of the template. It is either the original\n * element passed in, or the clone of the element if the `cloneAttachFn` is provided.\n *\n * After linking the view is not updated until after a call to $digest which typically is done by\n * Angular automatically.\n *\n * If you need access to the bound view, there are two ways to do it:\n *\n * - If you are not asking the linking function to clone the template, create the DOM element(s)\n *   before you send them to the compiler and keep this reference around.\n *   ```js\n *     var element = $compile('<p>{{total}}</p>')(scope);\n *   ```\n *\n * - if on the other hand, you need the element to be cloned, the view reference from the original\n *   example would not point to the clone, but rather to the original template that was cloned. In\n *   this case, you can access the clone via the cloneAttachFn:\n *   ```js\n *     var templateElement = angular.element('<p>{{total}}</p>'),\n *         scope = ....;\n *\n *     var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {\n *       //attach the clone to DOM document at the right place\n *     });\n *\n *     //now we have reference to the cloned DOM via `clonedElement`\n *   ```\n *\n *\n * For information on how the compiler works, see the\n * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\n */\n\nvar $compileMinErr = minErr('$compile');\n\n/**\n * @ngdoc provider\n * @name $compileProvider\n * @function\n *\n * @description\n */\n$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];\nfunction $CompileProvider($provide, $$sanitizeUriProvider) {\n  var hasDirectives = {},\n      Suffix = 'Directive',\n      COMMENT_DIRECTIVE_REGEXP = /^\\s*directive\\:\\s*([\\d\\w_\\-]+)\\s+(.*)$/,\n      CLASS_DIRECTIVE_REGEXP = /(([\\d\\w_\\-]+)(?:\\:([^;]+))?;?)/,\n      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset');\n\n  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes\n  // The assumption is that future DOM event attribute names will begin with\n  // 'on' and be composed of only English letters.\n  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#directive\n   * @function\n   *\n   * @description\n   * Register a new directive with the compiler.\n   *\n   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which\n   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the\n   *    names and the values are the factories.\n   * @param {Function|Array} directiveFactory An injectable directive factory function. See\n   *    {@link guide/directive} for more info.\n   * @returns {ng.$compileProvider} Self for chaining.\n   */\n   this.directive = function registerDirective(name, directiveFactory) {\n    assertNotHasOwnProperty(name, 'directive');\n    if (isString(name)) {\n      assertArg(directiveFactory, 'directiveFactory');\n      if (!hasDirectives.hasOwnProperty(name)) {\n        hasDirectives[name] = [];\n        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\n          function($injector, $exceptionHandler) {\n            var directives = [];\n            forEach(hasDirectives[name], function(directiveFactory, index) {\n              try {\n                var directive = $injector.invoke(directiveFactory);\n                if (isFunction(directive)) {\n                  directive = { compile: valueFn(directive) };\n                } else if (!directive.compile && directive.link) {\n                  directive.compile = valueFn(directive.link);\n                }\n                directive.priority = directive.priority || 0;\n                directive.index = index;\n                directive.name = directive.name || name;\n                directive.require = directive.require || (directive.controller && directive.name);\n                directive.restrict = directive.restrict || 'A';\n                directives.push(directive);\n              } catch (e) {\n                $exceptionHandler(e);\n              }\n            });\n            return directives;\n          }]);\n      }\n      hasDirectives[name].push(directiveFactory);\n    } else {\n      forEach(name, reverseParams(registerDirective));\n    }\n    return this;\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#aHrefSanitizationWhitelist\n   * @function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();\n    }\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $compileProvider#imgSrcSanitizationWhitelist\n   * @function\n   *\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);\n      return this;\n    } else {\n      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();\n    }\n  };\n\n  this.$get = [\n            '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',\n            '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',\n    function($injector,   $interpolate,   $exceptionHandler,   $http,   $templateCache,   $parse,\n             $controller,   $rootScope,   $document,   $sce,   $animate,   $$sanitizeUri) {\n\n    var Attributes = function(element, attr) {\n      this.$$element = element;\n      this.$attr = attr || {};\n    };\n\n    Attributes.prototype = {\n      $normalize: directiveNormalize,\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$addClass\n       * @function\n       *\n       * @description\n       * Adds the CSS class value specified by the classVal parameter to the element. If animations\n       * are enabled then an animation will be triggered for the class addition.\n       *\n       * @param {string} classVal The className value that will be added to the element\n       */\n      $addClass : function(classVal) {\n        if(classVal && classVal.length > 0) {\n          $animate.addClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$removeClass\n       * @function\n       *\n       * @description\n       * Removes the CSS class value specified by the classVal parameter from the element. If\n       * animations are enabled then an animation will be triggered for the class removal.\n       *\n       * @param {string} classVal The className value that will be removed from the element\n       */\n      $removeClass : function(classVal) {\n        if(classVal && classVal.length > 0) {\n          $animate.removeClass(this.$$element, classVal);\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$updateClass\n       * @function\n       *\n       * @description\n       * Adds and removes the appropriate CSS class values to the element based on the difference\n       * between the new and old CSS class values (specified as newClasses and oldClasses).\n       *\n       * @param {string} newClasses The current CSS className value\n       * @param {string} oldClasses The former CSS className value\n       */\n      $updateClass : function(newClasses, oldClasses) {\n        var toAdd = tokenDifference(newClasses, oldClasses);\n        var toRemove = tokenDifference(oldClasses, newClasses);\n\n        if(toAdd.length === 0) {\n          $animate.removeClass(this.$$element, toRemove);\n        } else if(toRemove.length === 0) {\n          $animate.addClass(this.$$element, toAdd);\n        } else {\n          $animate.setClass(this.$$element, toAdd, toRemove);\n        }\n      },\n\n      /**\n       * Set a normalized attribute on the element in a way such that all directives\n       * can share the attribute. This function properly handles boolean attributes.\n       * @param {string} key Normalized key. (ie ngAttribute)\n       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\n       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\n       *     Defaults to true.\n       * @param {string=} attrName Optional none normalized name. Defaults to key.\n       */\n      $set: function(key, value, writeAttr, attrName) {\n        // TODO: decide whether or not to throw an error if \"class\"\n        //is set through this function since it may cause $updateClass to\n        //become unstable.\n\n        var booleanKey = getBooleanAttrName(this.$$element[0], key),\n            normalizedVal,\n            nodeName;\n\n        if (booleanKey) {\n          this.$$element.prop(key, value);\n          attrName = booleanKey;\n        }\n\n        this[key] = value;\n\n        // translate normalized key to actual key\n        if (attrName) {\n          this.$attr[key] = attrName;\n        } else {\n          attrName = this.$attr[key];\n          if (!attrName) {\n            this.$attr[key] = attrName = snake_case(key, '-');\n          }\n        }\n\n        nodeName = nodeName_(this.$$element);\n\n        // sanitize a[href] and img[src] values\n        if ((nodeName === 'A' && key === 'href') ||\n            (nodeName === 'IMG' && key === 'src')) {\n          this[key] = value = $$sanitizeUri(value, key === 'src');\n        }\n\n        if (writeAttr !== false) {\n          if (value === null || value === undefined) {\n            this.$$element.removeAttr(attrName);\n          } else {\n            this.$$element.attr(attrName, value);\n          }\n        }\n\n        // fire observers\n        var $$observers = this.$$observers;\n        $$observers && forEach($$observers[key], function(fn) {\n          try {\n            fn(value);\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        });\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $compile.directive.Attributes#$observe\n       * @function\n       *\n       * @description\n       * Observes an interpolated attribute.\n       *\n       * The observer function will be invoked once during the next `$digest` following\n       * compilation. The observer is then invoked whenever the interpolated value\n       * changes.\n       *\n       * @param {string} key Normalized key. (ie ngAttribute) .\n       * @param {function(interpolatedValue)} fn Function that will be called whenever\n                the interpolated value of the attribute changes.\n       *        See the {@link guide/directive#Attributes Directives} guide for more info.\n       * @returns {function()} Returns a deregistration function for this observer.\n       */\n      $observe: function(key, fn) {\n        var attrs = this,\n            $$observers = (attrs.$$observers || (attrs.$$observers = {})),\n            listeners = ($$observers[key] || ($$observers[key] = []));\n\n        listeners.push(fn);\n        $rootScope.$evalAsync(function() {\n          if (!listeners.$$inter) {\n            // no one registered attribute interpolation function, so lets call it manually\n            fn(attrs[key]);\n          }\n        });\n\n        return function() {\n          arrayRemove(listeners, fn);\n        };\n      }\n    };\n\n    var startSymbol = $interpolate.startSymbol(),\n        endSymbol = $interpolate.endSymbol(),\n        denormalizeTemplate = (startSymbol == '{{' || endSymbol  == '}}')\n            ? identity\n            : function denormalizeTemplate(template) {\n              return template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\n        },\n        NG_ATTR_BINDING = /^ngAttr[A-Z]/;\n\n\n    return compile;\n\n    //================================\n\n    function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,\n                        previousCompileContext) {\n      if (!($compileNodes instanceof jqLite)) {\n        // jquery always rewraps, whereas we need to preserve the original selector so that we can\n        // modify it.\n        $compileNodes = jqLite($compileNodes);\n      }\n      // We can not compile top level text elements since text nodes can be merged and we will\n      // not be able to attach scope data to them, so we will wrap them in <span>\n      forEach($compileNodes, function(node, index){\n        if (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\\S+/) /* non-empty */ ) {\n          $compileNodes[index] = node = jqLite(node).wrap('<span></span>').parent()[0];\n        }\n      });\n      var compositeLinkFn =\n              compileNodes($compileNodes, transcludeFn, $compileNodes,\n                           maxPriority, ignoreDirective, previousCompileContext);\n      safeAddClass($compileNodes, 'ng-scope');\n      return function publicLinkFn(scope, cloneConnectFn, transcludeControllers){\n        assertArg(scope, 'scope');\n        // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\n        // and sometimes changes the structure of the DOM.\n        var $linkNode = cloneConnectFn\n          ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!!\n          : $compileNodes;\n\n        forEach(transcludeControllers, function(instance, name) {\n          $linkNode.data('$' + name + 'Controller', instance);\n        });\n\n        // Attach scope only to non-text nodes.\n        for(var i = 0, ii = $linkNode.length; i<ii; i++) {\n          var node = $linkNode[i],\n              nodeType = node.nodeType;\n          if (nodeType === 1 /* element */ || nodeType === 9 /* document */) {\n            $linkNode.eq(i).data('$scope', scope);\n          }\n        }\n\n        if (cloneConnectFn) cloneConnectFn($linkNode, scope);\n        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);\n        return $linkNode;\n      };\n    }\n\n    function safeAddClass($element, className) {\n      try {\n        $element.addClass(className);\n      } catch(e) {\n        // ignore, since it means that we are trying to set class on\n        // SVG element, where class name is read-only.\n      }\n    }\n\n    /**\n     * Compile function matches each node in nodeList against the directives. Once all directives\n     * for a particular node are collected their compile functions are executed. The compile\n     * functions return values - the linking functions - are combined into a composite linking\n     * function, which is the a linking function for the node.\n     *\n     * @param {NodeList} nodeList an array of nodes or NodeList to compile\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *        scope argument is auto-generated to the new child of the transcluded parent scope.\n     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then\n     *        the rootElement must be set the jqLite collection of the compile root. This is\n     *        needed so that the jqLite collection items can be replaced with widgets.\n     * @param {number=} maxPriority Max directive priority.\n     * @returns {Function} A composite linking function of all of the matched directives or null.\n     */\n    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,\n                            previousCompileContext) {\n      var linkFns = [],\n          attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound;\n\n      for (var i = 0; i < nodeList.length; i++) {\n        attrs = new Attributes();\n\n        // we must always refer to nodeList[i] since the nodes can be replaced underneath us.\n        directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,\n                                        ignoreDirective);\n\n        nodeLinkFn = (directives.length)\n            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,\n                                      null, [], [], previousCompileContext)\n            : null;\n\n        if (nodeLinkFn && nodeLinkFn.scope) {\n          safeAddClass(jqLite(nodeList[i]), 'ng-scope');\n        }\n\n        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||\n                      !(childNodes = nodeList[i].childNodes) ||\n                      !childNodes.length)\n            ? null\n            : compileNodes(childNodes,\n                 nodeLinkFn ? nodeLinkFn.transclude : transcludeFn);\n\n        linkFns.push(nodeLinkFn, childLinkFn);\n        linkFnFound = linkFnFound || nodeLinkFn || childLinkFn;\n        //use the previous context only for the first element in the virtual group\n        previousCompileContext = null;\n      }\n\n      // return a linking function if we have found anything, null otherwise\n      return linkFnFound ? compositeLinkFn : null;\n\n      function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) {\n        var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n;\n\n        // copy nodeList so that linking doesn't break due to live list updates.\n        var nodeListLength = nodeList.length,\n            stableNodeList = new Array(nodeListLength);\n        for (i = 0; i < nodeListLength; i++) {\n          stableNodeList[i] = nodeList[i];\n        }\n\n        for(i = 0, n = 0, ii = linkFns.length; i < ii; n++) {\n          node = stableNodeList[n];\n          nodeLinkFn = linkFns[i++];\n          childLinkFn = linkFns[i++];\n          $node = jqLite(node);\n\n          if (nodeLinkFn) {\n            if (nodeLinkFn.scope) {\n              childScope = scope.$new();\n              $node.data('$scope', childScope);\n            } else {\n              childScope = scope;\n            }\n            childTranscludeFn = nodeLinkFn.transclude;\n            if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) {\n              nodeLinkFn(childLinkFn, childScope, node, $rootElement,\n                createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn)\n              );\n            } else {\n              nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn);\n            }\n          } else if (childLinkFn) {\n            childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);\n          }\n        }\n      }\n    }\n\n    function createBoundTranscludeFn(scope, transcludeFn) {\n      return function boundTranscludeFn(transcludedScope, cloneFn, controllers) {\n        var scopeCreated = false;\n\n        if (!transcludedScope) {\n          transcludedScope = scope.$new();\n          transcludedScope.$$transcluded = true;\n          scopeCreated = true;\n        }\n\n        var clone = transcludeFn(transcludedScope, cloneFn, controllers);\n        if (scopeCreated) {\n          clone.on('$destroy', bind(transcludedScope, transcludedScope.$destroy));\n        }\n        return clone;\n      };\n    }\n\n    /**\n     * Looks for directives on the given node and adds them to the directive collection which is\n     * sorted.\n     *\n     * @param node Node to search.\n     * @param directives An array to which the directives are added to. This array is sorted before\n     *        the function returns.\n     * @param attrs The shared attrs object which is used to populate the normalized attributes.\n     * @param {number=} maxPriority Max directive priority.\n     */\n    function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\n      var nodeType = node.nodeType,\n          attrsMap = attrs.$attr,\n          match,\n          className;\n\n      switch(nodeType) {\n        case 1: /* Element */\n          // use the node name: <directive>\n          addDirective(directives,\n              directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);\n\n          // iterate over the attributes\n          for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,\n                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\n            var attrStartName = false;\n            var attrEndName = false;\n\n            attr = nAttrs[j];\n            if (!msie || msie >= 8 || attr.specified) {\n              name = attr.name;\n              // support ngAttr attribute binding\n              ngAttrName = directiveNormalize(name);\n              if (NG_ATTR_BINDING.test(ngAttrName)) {\n                name = snake_case(ngAttrName.substr(6), '-');\n              }\n\n              var directiveNName = ngAttrName.replace(/(Start|End)$/, '');\n              if (ngAttrName === directiveNName + 'Start') {\n                attrStartName = name;\n                attrEndName = name.substr(0, name.length - 5) + 'end';\n                name = name.substr(0, name.length - 6);\n              }\n\n              nName = directiveNormalize(name.toLowerCase());\n              attrsMap[nName] = name;\n              attrs[nName] = value = trim(attr.value);\n              if (getBooleanAttrName(node, nName)) {\n                attrs[nName] = true; // presence means true\n              }\n              addAttrInterpolateDirective(node, directives, value, nName);\n              addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,\n                            attrEndName);\n            }\n          }\n\n          // use class as directive\n          className = node.className;\n          if (isString(className) && className !== '') {\n            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {\n              nName = directiveNormalize(match[2]);\n              if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[3]);\n              }\n              className = className.substr(match.index + match[0].length);\n            }\n          }\n          break;\n        case 3: /* Text Node */\n          addTextInterpolateDirective(directives, node.nodeValue);\n          break;\n        case 8: /* Comment */\n          try {\n            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\n            if (match) {\n              nName = directiveNormalize(match[1]);\n              if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {\n                attrs[nName] = trim(match[2]);\n              }\n            }\n          } catch (e) {\n            // turns out that under some circumstances IE9 throws errors when one attempts to read\n            // comment's node value.\n            // Just ignore it and continue. (Can't seem to reproduce in test case.)\n          }\n          break;\n      }\n\n      directives.sort(byPriority);\n      return directives;\n    }\n\n    /**\n     * Given a node with an directive-start it collects all of the siblings until it finds\n     * directive-end.\n     * @param node\n     * @param attrStart\n     * @param attrEnd\n     * @returns {*}\n     */\n    function groupScan(node, attrStart, attrEnd) {\n      var nodes = [];\n      var depth = 0;\n      if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {\n        var startNode = node;\n        do {\n          if (!node) {\n            throw $compileMinErr('uterdir',\n                      \"Unterminated attribute, found '{0}' but no matching '{1}' found.\",\n                      attrStart, attrEnd);\n          }\n          if (node.nodeType == 1 /** Element **/) {\n            if (node.hasAttribute(attrStart)) depth++;\n            if (node.hasAttribute(attrEnd)) depth--;\n          }\n          nodes.push(node);\n          node = node.nextSibling;\n        } while (depth > 0);\n      } else {\n        nodes.push(node);\n      }\n\n      return jqLite(nodes);\n    }\n\n    /**\n     * Wrapper for linking function which converts normal linking function into a grouped\n     * linking function.\n     * @param linkFn\n     * @param attrStart\n     * @param attrEnd\n     * @returns {Function}\n     */\n    function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {\n      return function(scope, element, attrs, controllers, transcludeFn) {\n        element = groupScan(element[0], attrStart, attrEnd);\n        return linkFn(scope, element, attrs, controllers, transcludeFn);\n      };\n    }\n\n    /**\n     * Once the directives have been collected, their compile functions are executed. This method\n     * is responsible for inlining directive templates as well as terminating the application\n     * of the directives if the terminal directive has been reached.\n     *\n     * @param {Array} directives Array of collected directives to execute their compile function.\n     *        this needs to be pre-sorted by priority order.\n     * @param {Node} compileNode The raw DOM node to apply the compile functions to\n     * @param {Object} templateAttrs The shared attribute function\n     * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\n     *                                                  scope argument is auto-generated to the new\n     *                                                  child of the transcluded parent scope.\n     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this\n     *                              argument has the root jqLite array so that we can replace nodes\n     *                              on it.\n     * @param {Object=} originalReplaceDirective An optional directive that will be ignored when\n     *                                           compiling the transclusion.\n     * @param {Array.<Function>} preLinkFns\n     * @param {Array.<Function>} postLinkFns\n     * @param {Object} previousCompileContext Context used for previous compilation of the current\n     *                                        node\n     * @returns {Function} linkFn\n     */\n    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,\n                                   jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,\n                                   previousCompileContext) {\n      previousCompileContext = previousCompileContext || {};\n\n      var terminalPriority = -Number.MAX_VALUE,\n          newScopeDirective,\n          controllerDirectives = previousCompileContext.controllerDirectives,\n          newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,\n          templateDirective = previousCompileContext.templateDirective,\n          nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,\n          hasTranscludeDirective = false,\n          hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,\n          $compileNode = templateAttrs.$$element = jqLite(compileNode),\n          directive,\n          directiveName,\n          $template,\n          replaceDirective = originalReplaceDirective,\n          childTranscludeFn = transcludeFn,\n          linkFn,\n          directiveValue;\n\n      // executes all directives on the current element\n      for(var i = 0, ii = directives.length; i < ii; i++) {\n        directive = directives[i];\n        var attrStart = directive.$$start;\n        var attrEnd = directive.$$end;\n\n        // collect multiblock sections\n        if (attrStart) {\n          $compileNode = groupScan(compileNode, attrStart, attrEnd);\n        }\n        $template = undefined;\n\n        if (terminalPriority > directive.priority) {\n          break; // prevent further processing of directives\n        }\n\n        if (directiveValue = directive.scope) {\n          newScopeDirective = newScopeDirective || directive;\n\n          // skip the check for directives with async templates, we'll check the derived sync\n          // directive when the template arrives\n          if (!directive.templateUrl) {\n            assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,\n                              $compileNode);\n            if (isObject(directiveValue)) {\n              newIsolateScopeDirective = directive;\n            }\n          }\n        }\n\n        directiveName = directive.name;\n\n        if (!directive.templateUrl && directive.controller) {\n          directiveValue = directive.controller;\n          controllerDirectives = controllerDirectives || {};\n          assertNoDuplicate(\"'\" + directiveName + \"' controller\",\n              controllerDirectives[directiveName], directive, $compileNode);\n          controllerDirectives[directiveName] = directive;\n        }\n\n        if (directiveValue = directive.transclude) {\n          hasTranscludeDirective = true;\n\n          // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.\n          // This option should only be used by directives that know how to safely handle element transclusion,\n          // where the transcluded nodes are added or replaced after linking.\n          if (!directive.$$tlb) {\n            assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);\n            nonTlbTranscludeDirective = directive;\n          }\n\n          if (directiveValue == 'element') {\n            hasElementTranscludeDirective = true;\n            terminalPriority = directive.priority;\n            $template = groupScan(compileNode, attrStart, attrEnd);\n            $compileNode = templateAttrs.$$element =\n                jqLite(document.createComment(' ' + directiveName + ': ' +\n                                              templateAttrs[directiveName] + ' '));\n            compileNode = $compileNode[0];\n            replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode);\n\n            childTranscludeFn = compile($template, transcludeFn, terminalPriority,\n                                        replaceDirective && replaceDirective.name, {\n                                          // Don't pass in:\n                                          // - controllerDirectives - otherwise we'll create duplicates controllers\n                                          // - newIsolateScopeDirective or templateDirective - combining templates with\n                                          //   element transclusion doesn't make sense.\n                                          //\n                                          // We need only nonTlbTranscludeDirective so that we prevent putting transclusion\n                                          // on the same element more than once.\n                                          nonTlbTranscludeDirective: nonTlbTranscludeDirective\n                                        });\n          } else {\n            $template = jqLite(jqLiteClone(compileNode)).contents();\n            $compileNode.empty(); // clear contents\n            childTranscludeFn = compile($template, transcludeFn);\n          }\n        }\n\n        if (directive.template) {\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          directiveValue = (isFunction(directive.template))\n              ? directive.template($compileNode, templateAttrs)\n              : directive.template;\n\n          directiveValue = denormalizeTemplate(directiveValue);\n\n          if (directive.replace) {\n            replaceDirective = directive;\n            if (jqLiteIsTextNode(directiveValue)) {\n              $template = [];\n            } else {\n              $template = jqLite(wrapTemplate(directive.type, trim(directiveValue)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  directiveName, '');\n            }\n\n            replaceWith(jqCollection, $compileNode, compileNode);\n\n            var newTemplateAttrs = {$attr: {}};\n\n            // combine directives from the original node and from the template:\n            // - take the array of directives for this element\n            // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)\n            // - collect directives from the template and sort them by priority\n            // - combine directives as: processed + template + unprocessed\n            var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);\n            var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));\n\n            if (newIsolateScopeDirective) {\n              markDirectivesAsIsolate(templateDirectives);\n            }\n            directives = directives.concat(templateDirectives).concat(unprocessedDirectives);\n            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);\n\n            ii = directives.length;\n          } else {\n            $compileNode.html(directiveValue);\n          }\n        }\n\n        if (directive.templateUrl) {\n          assertNoDuplicate('template', templateDirective, directive, $compileNode);\n          templateDirective = directive;\n\n          if (directive.replace) {\n            replaceDirective = directive;\n          }\n\n          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,\n              templateAttrs, jqCollection, childTranscludeFn, preLinkFns, postLinkFns, {\n                controllerDirectives: controllerDirectives,\n                newIsolateScopeDirective: newIsolateScopeDirective,\n                templateDirective: templateDirective,\n                nonTlbTranscludeDirective: nonTlbTranscludeDirective\n              });\n          ii = directives.length;\n        } else if (directive.compile) {\n          try {\n            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\n            if (isFunction(linkFn)) {\n              addLinkFns(null, linkFn, attrStart, attrEnd);\n            } else if (linkFn) {\n              addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);\n            }\n          } catch (e) {\n            $exceptionHandler(e, startingTag($compileNode));\n          }\n        }\n\n        if (directive.terminal) {\n          nodeLinkFn.terminal = true;\n          terminalPriority = Math.max(terminalPriority, directive.priority);\n        }\n\n      }\n\n      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;\n      nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn;\n      previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;\n\n      // might be normal or delayed nodeLinkFn depending on if templateUrl is present\n      return nodeLinkFn;\n\n      ////////////////////\n\n      function addLinkFns(pre, post, attrStart, attrEnd) {\n        if (pre) {\n          if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);\n          pre.require = directive.require;\n          pre.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            pre = cloneAndAnnotateFn(pre, {isolateScope: true});\n          }\n          preLinkFns.push(pre);\n        }\n        if (post) {\n          if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);\n          post.require = directive.require;\n          post.directiveName = directiveName;\n          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {\n            post = cloneAndAnnotateFn(post, {isolateScope: true});\n          }\n          postLinkFns.push(post);\n        }\n      }\n\n\n      function getControllers(directiveName, require, $element, elementControllers) {\n        var value, retrievalMethod = 'data', optional = false;\n        if (isString(require)) {\n          while((value = require.charAt(0)) == '^' || value == '?') {\n            require = require.substr(1);\n            if (value == '^') {\n              retrievalMethod = 'inheritedData';\n            }\n            optional = optional || value == '?';\n          }\n          value = null;\n\n          if (elementControllers && retrievalMethod === 'data') {\n            value = elementControllers[require];\n          }\n          value = value || $element[retrievalMethod]('$' + require + 'Controller');\n\n          if (!value && !optional) {\n            throw $compileMinErr('ctreq',\n                \"Controller '{0}', required by directive '{1}', can't be found!\",\n                require, directiveName);\n          }\n          return value;\n        } else if (isArray(require)) {\n          value = [];\n          forEach(require, function(require) {\n            value.push(getControllers(directiveName, require, $element, elementControllers));\n          });\n        }\n        return value;\n      }\n\n\n      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\n        var attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = {}, transcludeFn;\n\n        if (compileNode === linkNode) {\n          attrs = templateAttrs;\n        } else {\n          attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));\n        }\n        $element = attrs.$$element;\n\n        if (newIsolateScopeDirective) {\n          var LOCAL_REGEXP = /^\\s*([@=&])(\\??)\\s*(\\w*)\\s*$/;\n          var $linkNode = jqLite(linkNode);\n\n          isolateScope = scope.$new(true);\n\n          if (templateDirective && (templateDirective === newIsolateScopeDirective ||\n              templateDirective === newIsolateScopeDirective.$$originalDirective)) {\n            $linkNode.data('$isolateScope', isolateScope) ;\n          } else {\n            $linkNode.data('$isolateScopeNoTemplate', isolateScope);\n          }\n\n\n\n          safeAddClass($linkNode, 'ng-isolate-scope');\n\n          forEach(newIsolateScopeDirective.scope, function(definition, scopeName) {\n            var match = definition.match(LOCAL_REGEXP) || [],\n                attrName = match[3] || scopeName,\n                optional = (match[2] == '?'),\n                mode = match[1], // @, =, or &\n                lastValue,\n                parentGet, parentSet, compare;\n\n            isolateScope.$$isolateBindings[scopeName] = mode + attrName;\n\n            switch (mode) {\n\n              case '@':\n                attrs.$observe(attrName, function(value) {\n                  isolateScope[scopeName] = value;\n                });\n                attrs.$$observers[attrName].$$scope = scope;\n                if( attrs[attrName] ) {\n                  // If the attribute has been provided then we trigger an interpolation to ensure\n                  // the value is there for use in the link fn\n                  isolateScope[scopeName] = $interpolate(attrs[attrName])(scope);\n                }\n                break;\n\n              case '=':\n                if (optional && !attrs[attrName]) {\n                  return;\n                }\n                parentGet = $parse(attrs[attrName]);\n                if (parentGet.literal) {\n                  compare = equals;\n                } else {\n                  compare = function(a,b) { return a === b; };\n                }\n                parentSet = parentGet.assign || function() {\n                  // reset the change, or we will throw this exception on every $digest\n                  lastValue = isolateScope[scopeName] = parentGet(scope);\n                  throw $compileMinErr('nonassign',\n                      \"Expression '{0}' used with directive '{1}' is non-assignable!\",\n                      attrs[attrName], newIsolateScopeDirective.name);\n                };\n                lastValue = isolateScope[scopeName] = parentGet(scope);\n                isolateScope.$watch(function parentValueWatch() {\n                  var parentValue = parentGet(scope);\n                  if (!compare(parentValue, isolateScope[scopeName])) {\n                    // we are out of sync and need to copy\n                    if (!compare(parentValue, lastValue)) {\n                      // parent changed and it has precedence\n                      isolateScope[scopeName] = parentValue;\n                    } else {\n                      // if the parent can be assigned then do so\n                      parentSet(scope, parentValue = isolateScope[scopeName]);\n                    }\n                  }\n                  parentValueWatch.$$unwatch = parentGet.$$unwatch;\n                  return lastValue = parentValue;\n                }, null, parentGet.literal);\n                break;\n\n              case '&':\n                parentGet = $parse(attrs[attrName]);\n                isolateScope[scopeName] = function(locals) {\n                  return parentGet(scope, locals);\n                };\n                break;\n\n              default:\n                throw $compileMinErr('iscp',\n                    \"Invalid isolate scope definition for directive '{0}'.\" +\n                    \" Definition: {... {1}: '{2}' ...}\",\n                    newIsolateScopeDirective.name, scopeName, definition);\n            }\n          });\n        }\n        transcludeFn = boundTranscludeFn && controllersBoundTransclude;\n        if (controllerDirectives) {\n          forEach(controllerDirectives, function(directive) {\n            var locals = {\n              $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,\n              $element: $element,\n              $attrs: attrs,\n              $transclude: transcludeFn\n            }, controllerInstance;\n\n            controller = directive.controller;\n            if (controller == '@') {\n              controller = attrs[directive.name];\n            }\n\n            controllerInstance = $controller(controller, locals);\n            // For directives with element transclusion the element is a comment,\n            // but jQuery .data doesn't support attaching data to comment nodes as it's hard to\n            // clean up (http://bugs.jquery.com/ticket/8335).\n            // Instead, we save the controllers for the element in a local hash and attach to .data\n            // later, once we have the actual element.\n            elementControllers[directive.name] = controllerInstance;\n            if (!hasElementTranscludeDirective) {\n              $element.data('$' + directive.name + 'Controller', controllerInstance);\n            }\n\n            if (directive.controllerAs) {\n              locals.$scope[directive.controllerAs] = controllerInstance;\n            }\n          });\n        }\n\n        // PRELINKING\n        for(i = 0, ii = preLinkFns.length; i < ii; i++) {\n          try {\n            linkFn = preLinkFns[i];\n            linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,\n                linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);\n          } catch (e) {\n            $exceptionHandler(e, startingTag($element));\n          }\n        }\n\n        // RECURSION\n        // We only pass the isolate scope, if the isolate directive has a template,\n        // otherwise the child elements do not belong to the isolate directive.\n        var scopeToChild = scope;\n        if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {\n          scopeToChild = isolateScope;\n        }\n        childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);\n\n        // POSTLINKING\n        for(i = postLinkFns.length - 1; i >= 0; i--) {\n          try {\n            linkFn = postLinkFns[i];\n            linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,\n                linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);\n          } catch (e) {\n            $exceptionHandler(e, startingTag($element));\n          }\n        }\n\n        // This is the function that is injected as `$transclude`.\n        function controllersBoundTransclude(scope, cloneAttachFn) {\n          var transcludeControllers;\n\n          // no scope passed\n          if (arguments.length < 2) {\n            cloneAttachFn = scope;\n            scope = undefined;\n          }\n\n          if (hasElementTranscludeDirective) {\n            transcludeControllers = elementControllers;\n          }\n\n          return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers);\n        }\n      }\n    }\n\n    function markDirectivesAsIsolate(directives) {\n      // mark all directives as needing isolate scope.\n      for (var j = 0, jj = directives.length; j < jj; j++) {\n        directives[j] = inherit(directives[j], {$$isolateScope: true});\n      }\n    }\n\n    /**\n     * looks up the directive and decorates it with exception handling and proper parameters. We\n     * call this the boundDirective.\n     *\n     * @param {string} name name of the directive to look up.\n     * @param {string} location The directive must be found in specific format.\n     *   String containing any of theses characters:\n     *\n     *   * `E`: element name\n     *   * `A': attribute\n     *   * `C`: class\n     *   * `M`: comment\n     * @returns {boolean} true if directive was added.\n     */\n    function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,\n                          endAttrName) {\n      if (name === ignoreDirective) return null;\n      var match = null;\n      if (hasDirectives.hasOwnProperty(name)) {\n        for(var directive, directives = $injector.get(name + Suffix),\n            i = 0, ii = directives.length; i<ii; i++) {\n          try {\n            directive = directives[i];\n            if ( (maxPriority === undefined || maxPriority > directive.priority) &&\n                 directive.restrict.indexOf(location) != -1) {\n              if (startAttrName) {\n                directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});\n              }\n              tDirectives.push(directive);\n              match = directive;\n            }\n          } catch(e) { $exceptionHandler(e); }\n        }\n      }\n      return match;\n    }\n\n\n    /**\n     * When the element is replaced with HTML template then the new attributes\n     * on the template need to be merged with the existing attributes in the DOM.\n     * The desired effect is to have both of the attributes present.\n     *\n     * @param {object} dst destination attributes (original DOM)\n     * @param {object} src source attributes (from the directive template)\n     */\n    function mergeTemplateAttributes(dst, src) {\n      var srcAttr = src.$attr,\n          dstAttr = dst.$attr,\n          $element = dst.$$element;\n\n      // reapply the old attributes to the new element\n      forEach(dst, function(value, key) {\n        if (key.charAt(0) != '$') {\n          if (src[key] && src[key] !== value) {\n            value += (key === 'style' ? ';' : ' ') + src[key];\n          }\n          dst.$set(key, value, true, srcAttr[key]);\n        }\n      });\n\n      // copy the new attributes on the old attrs object\n      forEach(src, function(value, key) {\n        if (key == 'class') {\n          safeAddClass($element, value);\n          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;\n        } else if (key == 'style') {\n          $element.attr('style', $element.attr('style') + ';' + value);\n          dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;\n          // `dst` will never contain hasOwnProperty as DOM parser won't let it.\n          // You will get an \"InvalidCharacterError: DOM Exception 5\" error if you\n          // have an attribute like \"has-own-property\" or \"data-has-own-property\", etc.\n        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {\n          dst[key] = value;\n          dstAttr[key] = srcAttr[key];\n        }\n      });\n    }\n\n\n    function compileTemplateUrl(directives, $compileNode, tAttrs,\n        $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {\n      var linkQueue = [],\n          afterTemplateNodeLinkFn,\n          afterTemplateChildLinkFn,\n          beforeTemplateCompileNode = $compileNode[0],\n          origAsyncDirective = directives.shift(),\n          // The fact that we have to copy and patch the directive seems wrong!\n          derivedSyncDirective = extend({}, origAsyncDirective, {\n            templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective\n          }),\n          templateUrl = (isFunction(origAsyncDirective.templateUrl))\n              ? origAsyncDirective.templateUrl($compileNode, tAttrs)\n              : origAsyncDirective.templateUrl,\n          type = origAsyncDirective.type;\n\n      $compileNode.empty();\n\n      $http.get($sce.getTrustedResourceUrl(templateUrl), {cache: $templateCache}).\n        success(function(content) {\n          var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;\n\n          content = denormalizeTemplate(content);\n\n          if (origAsyncDirective.replace) {\n            if (jqLiteIsTextNode(content)) {\n              $template = [];\n            } else {\n              $template = jqLite(wrapTemplate(type, trim(content)));\n            }\n            compileNode = $template[0];\n\n            if ($template.length != 1 || compileNode.nodeType !== 1) {\n              throw $compileMinErr('tplrt',\n                  \"Template for directive '{0}' must have exactly one root element. {1}\",\n                  origAsyncDirective.name, templateUrl);\n            }\n\n            tempTemplateAttrs = {$attr: {}};\n            replaceWith($rootElement, $compileNode, compileNode);\n            var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);\n\n            if (isObject(origAsyncDirective.scope)) {\n              markDirectivesAsIsolate(templateDirectives);\n            }\n            directives = templateDirectives.concat(directives);\n            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);\n          } else {\n            compileNode = beforeTemplateCompileNode;\n            $compileNode.html(content);\n          }\n\n          directives.unshift(derivedSyncDirective);\n\n          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,\n              childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,\n              previousCompileContext);\n          forEach($rootElement, function(node, i) {\n            if (node == compileNode) {\n              $rootElement[i] = $compileNode[0];\n            }\n          });\n          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);\n\n\n          while(linkQueue.length) {\n            var scope = linkQueue.shift(),\n                beforeTemplateLinkNode = linkQueue.shift(),\n                linkRootElement = linkQueue.shift(),\n                boundTranscludeFn = linkQueue.shift(),\n                linkNode = $compileNode[0];\n\n            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\n              var oldClasses = beforeTemplateLinkNode.className;\n\n              if (!(previousCompileContext.hasElementTranscludeDirective &&\n                  origAsyncDirective.replace)) {\n                // it was cloned therefore we have to clone as well.\n                linkNode = jqLiteClone(compileNode);\n              }\n\n              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\n\n              // Copy in CSS classes from original node\n              safeAddClass(jqLite(linkNode), oldClasses);\n            }\n            if (afterTemplateNodeLinkFn.transclude) {\n              childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude);\n            } else {\n              childBoundTranscludeFn = boundTranscludeFn;\n            }\n            afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,\n              childBoundTranscludeFn);\n          }\n          linkQueue = null;\n        }).\n        error(function(response, code, headers, config) {\n          throw $compileMinErr('tpload', 'Failed to load template: {0}', config.url);\n        });\n\n      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {\n        if (linkQueue) {\n          linkQueue.push(scope);\n          linkQueue.push(node);\n          linkQueue.push(rootElement);\n          linkQueue.push(boundTranscludeFn);\n        } else {\n          afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, boundTranscludeFn);\n        }\n      };\n    }\n\n\n    /**\n     * Sorting function for bound directives.\n     */\n    function byPriority(a, b) {\n      var diff = b.priority - a.priority;\n      if (diff !== 0) return diff;\n      if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;\n      return a.index - b.index;\n    }\n\n\n    function assertNoDuplicate(what, previousDirective, directive, element) {\n      if (previousDirective) {\n        throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',\n            previousDirective.name, directive.name, what, startingTag(element));\n      }\n    }\n\n\n    function addTextInterpolateDirective(directives, text) {\n      var interpolateFn = $interpolate(text, true);\n      if (interpolateFn) {\n        directives.push({\n          priority: 0,\n          compile: valueFn(function textInterpolateLinkFn(scope, node) {\n            var parent = node.parent(),\n                bindings = parent.data('$binding') || [];\n            // Need to interpolate again in case this is using one-time bindings in multiple clones\n            // of transcluded templates.\n            interpolateFn = $interpolate(text);\n            bindings.push(interpolateFn);\n            safeAddClass(parent.data('$binding', bindings), 'ng-binding');\n            scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {\n              node[0].nodeValue = value;\n            });\n          })\n        });\n      }\n    }\n\n\n    function wrapTemplate(type, template) {\n      type = lowercase(type || 'html');\n      switch(type) {\n      case 'svg':\n      case 'math':\n        var wrapper = document.createElement('div');\n        wrapper.innerHTML = '<'+type+'>'+template+'</'+type+'>';\n        return wrapper.childNodes[0].childNodes;\n      default:\n        return template;\n      }\n    }\n\n\n    function getTrustedContext(node, attrNormalizedName) {\n      if (attrNormalizedName == \"srcdoc\") {\n        return $sce.HTML;\n      }\n      var tag = nodeName_(node);\n      // maction[xlink:href] can source SVG.  It's not limited to <maction>.\n      if (attrNormalizedName == \"xlinkHref\" ||\n          (tag == \"FORM\" && attrNormalizedName == \"action\") ||\n          (tag != \"IMG\" && (attrNormalizedName == \"src\" ||\n                            attrNormalizedName == \"ngSrc\"))) {\n        return $sce.RESOURCE_URL;\n      }\n    }\n\n\n    function addAttrInterpolateDirective(node, directives, value, name) {\n      var interpolateFn = $interpolate(value, true);\n\n      // no interpolation found -> ignore\n      if (!interpolateFn) return;\n\n\n      if (name === \"multiple\" && nodeName_(node) === \"SELECT\") {\n        throw $compileMinErr(\"selmulti\",\n            \"Binding to the 'multiple' attribute is not supported. Element: {0}\",\n            startingTag(node));\n      }\n\n      directives.push({\n        priority: 100,\n        compile: function() {\n            return {\n              pre: function attrInterpolatePreLinkFn(scope, element, attr) {\n                var $$observers = (attr.$$observers || (attr.$$observers = {}));\n\n                if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {\n                  throw $compileMinErr('nodomevents',\n                      \"Interpolations for HTML DOM event attributes are disallowed.  Please use the \" +\n                          \"ng- versions (such as ng-click instead of onclick) instead.\");\n                }\n\n                // we need to interpolate again, in case the attribute value has been updated\n                // (e.g. by another directive's compile function)\n                interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name),\n                    ALL_OR_NOTHING_ATTRS[name]);\n\n                // if attribute was updated so that there is no interpolation going on we don't want to\n                // register any observers\n                if (!interpolateFn) return;\n\n                // initialize attr object so that it's ready in case we need the value for isolate\n                // scope initialization, otherwise the value would not be available from isolate\n                // directive's linking fn during linking phase\n                attr[name] = interpolateFn(scope);\n\n                ($$observers[name] || ($$observers[name] = [])).$$inter = true;\n                (attr.$$observers && attr.$$observers[name].$$scope || scope).\n                  $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {\n                    //special case for class attribute addition + removal\n                    //so that class changes can tap into the animation\n                    //hooks provided by the $animate service. Be sure to\n                    //skip animations when the first digest occurs (when\n                    //both the new and the old values are the same) since\n                    //the CSS classes are the non-interpolated values\n                    if(name === 'class' && newValue != oldValue) {\n                      attr.$updateClass(newValue, oldValue);\n                    } else {\n                      attr.$set(name, newValue);\n                    }\n                  });\n              }\n            };\n          }\n      });\n    }\n\n\n    /**\n     * This is a special jqLite.replaceWith, which can replace items which\n     * have no parents, provided that the containing jqLite collection is provided.\n     *\n     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\n     *                               in the root of the tree.\n     * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep\n     *                                  the shell, but replace its DOM node reference.\n     * @param {Node} newNode The new DOM node.\n     */\n    function replaceWith($rootElement, elementsToRemove, newNode) {\n      var firstElementToRemove = elementsToRemove[0],\n          removeCount = elementsToRemove.length,\n          parent = firstElementToRemove.parentNode,\n          i, ii;\n\n      if ($rootElement) {\n        for(i = 0, ii = $rootElement.length; i < ii; i++) {\n          if ($rootElement[i] == firstElementToRemove) {\n            $rootElement[i++] = newNode;\n            for (var j = i, j2 = j + removeCount - 1,\n                     jj = $rootElement.length;\n                 j < jj; j++, j2++) {\n              if (j2 < jj) {\n                $rootElement[j] = $rootElement[j2];\n              } else {\n                delete $rootElement[j];\n              }\n            }\n            $rootElement.length -= removeCount - 1;\n            break;\n          }\n        }\n      }\n\n      if (parent) {\n        parent.replaceChild(newNode, firstElementToRemove);\n      }\n      var fragment = document.createDocumentFragment();\n      fragment.appendChild(firstElementToRemove);\n      newNode[jqLite.expando] = firstElementToRemove[jqLite.expando];\n      for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {\n        var element = elementsToRemove[k];\n        jqLite(element).remove(); // must do this way to clean up expando\n        fragment.appendChild(element);\n        delete elementsToRemove[k];\n      }\n\n      elementsToRemove[0] = newNode;\n      elementsToRemove.length = 1;\n    }\n\n\n    function cloneAndAnnotateFn(fn, annotation) {\n      return extend(function() { return fn.apply(null, arguments); }, fn, annotation);\n    }\n  }];\n}\n\nvar PREFIX_REGEXP = /^(x[\\:\\-_]|data[\\:\\-_])/i;\n/**\n * Converts all accepted directives format into proper directive name.\n * All of these will become 'myDirective':\n *   my:Directive\n *   my-directive\n *   x-my-directive\n *   data-my:directive\n *\n * Also there is special case for Moz prefix starting with upper case letter.\n * @param name Name to normalize\n */\nfunction directiveNormalize(name) {\n  return camelCase(name.replace(PREFIX_REGEXP, ''));\n}\n\n/**\n * @ngdoc type\n * @name $compile.directive.Attributes\n *\n * @description\n * A shared object between directive compile / linking functions which contains normalized DOM\n * element attributes. The values reflect current binding state `{{ }}`. The normalization is\n * needed since all of these are treated as equivalent in Angular:\n *\n * ```\n *    <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\n * ```\n */\n\n/**\n * @ngdoc property\n * @name $compile.directive.Attributes#$attr\n * @returns {object} A map of DOM element attribute names to the normalized name. This is\n *                   needed to do reverse lookup from normalized name back to actual name.\n */\n\n\n/**\n * @ngdoc method\n * @name $compile.directive.Attributes#$set\n * @function\n *\n * @description\n * Set DOM element attribute value.\n *\n *\n * @param {string} name Normalized element attribute name of the property to modify. The name is\n *          reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\n *          property to the original name.\n * @param {string} value Value to set the attribute to. The value can be an interpolated string.\n */\n\n\n\n/**\n * Closure compiler type information\n */\n\nfunction nodesetLinkingFn(\n  /* angular.Scope */ scope,\n  /* NodeList */ nodeList,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n){}\n\nfunction directiveLinkingFn(\n  /* nodesetLinkingFn */ nodesetLinkingFn,\n  /* angular.Scope */ scope,\n  /* Node */ node,\n  /* Element */ rootElement,\n  /* function(Function) */ boundTranscludeFn\n){}\n\nfunction tokenDifference(str1, str2) {\n  var values = '',\n      tokens1 = str1.split(/\\s+/),\n      tokens2 = str2.split(/\\s+/);\n\n  outer:\n  for(var i = 0; i < tokens1.length; i++) {\n    var token = tokens1[i];\n    for(var j = 0; j < tokens2.length; j++) {\n      if(token == tokens2[j]) continue outer;\n    }\n    values += (values.length > 0 ? ' ' : '') + token;\n  }\n  return values;\n}\n\n/**\n * @ngdoc provider\n * @name $controllerProvider\n * @description\n * The {@link ng.$controller $controller service} is used by Angular to create new\n * controllers.\n *\n * This provider allows controller registration via the\n * {@link ng.$controllerProvider#register register} method.\n */\nfunction $ControllerProvider() {\n  var controllers = {},\n      CNTRL_REG = /^(\\S+)(\\s+as\\s+(\\w+))?$/;\n\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Controller name, or an object map of controllers where the keys are\n   *    the names and the values are the constructors.\n   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\n   *    annotations in the array notation).\n   */\n  this.register = function(name, constructor) {\n    assertNotHasOwnProperty(name, 'controller');\n    if (isObject(name)) {\n      extend(controllers, name);\n    } else {\n      controllers[name] = constructor;\n    }\n  };\n\n\n  this.$get = ['$injector', '$window', function($injector, $window) {\n\n    /**\n     * @ngdoc service\n     * @name $controller\n     * @requires $injector\n     *\n     * @param {Function|string} constructor If called with a function then it's considered to be the\n     *    controller constructor function. Otherwise it's considered to be a string which is used\n     *    to retrieve the controller constructor using the following steps:\n     *\n     *    * check if a controller with given name is registered via `$controllerProvider`\n     *    * check if evaluating the string on the current scope returns a constructor\n     *    * check `window[constructor]` on the global `window` object\n     *\n     * @param {Object} locals Injection locals for Controller.\n     * @return {Object} Instance of given controller.\n     *\n     * @description\n     * `$controller` service is responsible for instantiating controllers.\n     *\n     * It's just a simple call to {@link auto.$injector $injector}, but extracted into\n     * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).\n     */\n    return function(expression, locals) {\n      var instance, match, constructor, identifier;\n\n      if(isString(expression)) {\n        match = expression.match(CNTRL_REG),\n        constructor = match[1],\n        identifier = match[3];\n        expression = controllers.hasOwnProperty(constructor)\n            ? controllers[constructor]\n            : getter(locals.$scope, constructor, true) || getter($window, constructor, true);\n\n        assertArgFn(expression, constructor, true);\n      }\n\n      instance = $injector.instantiate(expression, locals, constructor);\n\n      if (identifier) {\n        if (!(locals && typeof locals.$scope == 'object')) {\n          throw minErr('$controller')('noscp',\n              \"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\",\n              constructor || expression.name, identifier);\n        }\n\n        locals.$scope[identifier] = instance;\n      }\n\n      return instance;\n    };\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $document\n * @requires $window\n *\n * @description\n * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div ng-controller=\"MainCtrl\">\n         <p>$document title: <b ng-bind=\"title\"></b></p>\n         <p>window.document title: <b ng-bind=\"windowTitle\"></b></p>\n       </div>\n     </file>\n     <file name=\"script.js\">\n       function MainCtrl($scope, $document) {\n         $scope.title = $document[0].title;\n         $scope.windowTitle = angular.element(window.document)[0].title;\n       }\n     </file>\n   </example>\n */\nfunction $DocumentProvider(){\n  this.$get = ['$window', function(window){\n    return jqLite(window.document);\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $exceptionHandler\n * @requires ng.$log\n *\n * @description\n * Any uncaught exception in angular expressions is delegated to this service.\n * The default implementation simply delegates to `$log.error` which logs it into\n * the browser console.\n *\n * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\n * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.\n *\n * ## Example:\n *\n * ```js\n *   angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {\n *     return function (exception, cause) {\n *       exception.message += ' (caused by \"' + cause + '\")';\n *       throw exception;\n *     };\n *   });\n * ```\n *\n * This example will override the normal action of `$exceptionHandler`, to make angular\n * exceptions fail hard when they happen, instead of just logging to the console.\n *\n * @param {Error} exception Exception associated with the error.\n * @param {string=} cause optional information about the context in which\n *       the error was thrown.\n *\n */\nfunction $ExceptionHandlerProvider() {\n  this.$get = ['$log', function($log) {\n    return function(exception, cause) {\n      $log.error.apply($log, arguments);\n    };\n  }];\n}\n\n/**\n * Parse headers into key value object\n *\n * @param {string} headers Raw headers as a string\n * @returns {Object} Parsed headers as key value object\n */\nfunction parseHeaders(headers) {\n  var parsed = {}, key, val, i;\n\n  if (!headers) return parsed;\n\n  forEach(headers.split('\\n'), function(line) {\n    i = line.indexOf(':');\n    key = lowercase(trim(line.substr(0, i)));\n    val = trim(line.substr(i + 1));\n\n    if (key) {\n      if (parsed[key]) {\n        parsed[key] += ', ' + val;\n      } else {\n        parsed[key] = val;\n      }\n    }\n  });\n\n  return parsed;\n}\n\n\n/**\n * Returns a function that provides access to parsed headers.\n *\n * Headers are lazy parsed when first requested.\n * @see parseHeaders\n *\n * @param {(string|Object)} headers Headers to provide access to.\n * @returns {function(string=)} Returns a getter function which if called with:\n *\n *   - if called with single an argument returns a single header value or null\n *   - if called with no arguments returns an object containing all headers.\n */\nfunction headersGetter(headers) {\n  var headersObj = isObject(headers) ? headers : undefined;\n\n  return function(name) {\n    if (!headersObj) headersObj =  parseHeaders(headers);\n\n    if (name) {\n      return headersObj[lowercase(name)] || null;\n    }\n\n    return headersObj;\n  };\n}\n\n\n/**\n * Chain all given functions\n *\n * This function is used for both request and response transforming\n *\n * @param {*} data Data to transform.\n * @param {function(string=)} headers Http headers getter fn.\n * @param {(Function|Array.<Function>)} fns Function or an array of functions.\n * @returns {*} Transformed data.\n */\nfunction transformData(data, headers, fns) {\n  if (isFunction(fns))\n    return fns(data, headers);\n\n  forEach(fns, function(fn) {\n    data = fn(data, headers);\n  });\n\n  return data;\n}\n\n\nfunction isSuccess(status) {\n  return 200 <= status && status < 300;\n}\n\n\nfunction $HttpProvider() {\n  var JSON_START = /^\\s*(\\[|\\{[^\\{])/,\n      JSON_END = /[\\}\\]]\\s*$/,\n      PROTECTION_PREFIX = /^\\)\\]\\}',?\\n/,\n      CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'};\n\n  var defaults = this.defaults = {\n    // transform incoming response data\n    transformResponse: [function(data) {\n      if (isString(data)) {\n        // strip json vulnerability protection prefix\n        data = data.replace(PROTECTION_PREFIX, '');\n        if (JSON_START.test(data) && JSON_END.test(data))\n          data = fromJson(data);\n      }\n      return data;\n    }],\n\n    // transform outgoing request data\n    transformRequest: [function(d) {\n      return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;\n    }],\n\n    // default headers\n    headers: {\n      common: {\n        'Accept': 'application/json, text/plain, */*'\n      },\n      post:   copy(CONTENT_TYPE_APPLICATION_JSON),\n      put:    copy(CONTENT_TYPE_APPLICATION_JSON),\n      patch:  copy(CONTENT_TYPE_APPLICATION_JSON)\n    },\n\n    xsrfCookieName: 'XSRF-TOKEN',\n    xsrfHeaderName: 'X-XSRF-TOKEN'\n  };\n\n  /**\n   * Are ordered by request, i.e. they are applied in the same order as the\n   * array, on request, but reverse order, on response.\n   */\n  var interceptorFactories = this.interceptors = [];\n\n  this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',\n      function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {\n\n    var defaultCache = $cacheFactory('$http');\n\n    /**\n     * Interceptors stored in reverse order. Inner interceptors before outer interceptors.\n     * The reversal is needed so that we can build up the interception chain around the\n     * server request.\n     */\n    var reversedInterceptors = [];\n\n    forEach(interceptorFactories, function(interceptorFactory) {\n      reversedInterceptors.unshift(isString(interceptorFactory)\n          ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\n    });\n\n    /**\n     * @ngdoc service\n     * @kind function\n     * @name $http\n     * @requires ng.$httpBackend\n     * @requires $cacheFactory\n     * @requires $rootScope\n     * @requires $q\n     * @requires $injector\n     *\n     * @description\n     * The `$http` service is a core Angular service that facilitates communication with the remote\n     * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)\n     * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).\n     *\n     * For unit testing applications that use `$http` service, see\n     * {@link ngMock.$httpBackend $httpBackend mock}.\n     *\n     * For a higher level of abstraction, please check out the {@link ngResource.$resource\n     * $resource} service.\n     *\n     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\n     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage\n     * it is important to familiarize yourself with these APIs and the guarantees they provide.\n     *\n     *\n     * # General usage\n     * The `$http` service is a function which takes a single argument — a configuration object —\n     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}\n     * with two $http specific methods: `success` and `error`.\n     *\n     * ```js\n     *   $http({method: 'GET', url: '/someUrl'}).\n     *     success(function(data, status, headers, config) {\n     *       // this callback will be called asynchronously\n     *       // when the response is available\n     *     }).\n     *     error(function(data, status, headers, config) {\n     *       // called asynchronously if an error occurs\n     *       // or server returns response with an error status.\n     *     });\n     * ```\n     *\n     * Since the returned value of calling the $http function is a `promise`, you can also use\n     * the `then` method to register callbacks, and these callbacks will receive a single argument –\n     * an object representing the response. See the API signature and type info below for more\n     * details.\n     *\n     * A response status code between 200 and 299 is considered a success status and\n     * will result in the success callback being called. Note that if the response is a redirect,\n     * XMLHttpRequest will transparently follow it, meaning that the error callback will not be\n     * called for such responses.\n     *\n     * # Writing Unit Tests that use $http\n     * When unit testing (using {@link ngMock ngMock}), it is necessary to call\n     * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending\n     * request using trained responses.\n     *\n     * ```\n     * $httpBackend.expectGET(...);\n     * $http.get(...);\n     * $httpBackend.flush();\n     * ```\n     *\n     * # Shortcut methods\n     *\n     * Shortcut methods are also available. All shortcut methods require passing in the URL, and\n     * request data must be passed in for POST/PUT requests.\n     *\n     * ```js\n     *   $http.get('/someUrl').success(successCallback);\n     *   $http.post('/someUrl', data).success(successCallback);\n     * ```\n     *\n     * Complete list of shortcut methods:\n     *\n     * - {@link ng.$http#get $http.get}\n     * - {@link ng.$http#head $http.head}\n     * - {@link ng.$http#post $http.post}\n     * - {@link ng.$http#put $http.put}\n     * - {@link ng.$http#delete $http.delete}\n     * - {@link ng.$http#jsonp $http.jsonp}\n     *\n     *\n     * # Setting HTTP Headers\n     *\n     * The $http service will automatically add certain HTTP headers to all requests. These defaults\n     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\n     * object, which currently contains this default configuration:\n     *\n     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\n     *   - `Accept: application/json, text/plain, * / *`\n     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)\n     *   - `Content-Type: application/json`\n     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)\n     *   - `Content-Type: application/json`\n     *\n     * To add or overwrite these defaults, simply add or remove a property from these configuration\n     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\n     * with the lowercased HTTP method name as the key, e.g.\n     * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.\n     *\n     * The defaults can also be set at runtime via the `$http.defaults` object in the same\n     * fashion. For example:\n     *\n     * ```\n     * module.run(function($http) {\n     *   $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'\n     * });\n     * ```\n     *\n     * In addition, you can supply a `headers` property in the config object passed when\n     * calling `$http(config)`, which overrides the defaults without changing them globally.\n     *\n     *\n     * # Transforming Requests and Responses\n     *\n     * Both requests and responses can be transformed using transform functions. By default, Angular\n     * applies these transformations:\n     *\n     * Request transformations:\n     *\n     * - If the `data` property of the request configuration object contains an object, serialize it\n     *   into JSON format.\n     *\n     * Response transformations:\n     *\n     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).\n     *  - If JSON response is detected, deserialize it using a JSON parser.\n     *\n     * To globally augment or override the default transforms, modify the\n     * `$httpProvider.defaults.transformRequest` and `$httpProvider.defaults.transformResponse`\n     * properties. These properties are by default an array of transform functions, which allows you\n     * to `push` or `unshift` a new transformation function into the transformation chain. You can\n     * also decide to completely override any default transformations by assigning your\n     * transformation functions to these properties directly without the array wrapper.  These defaults\n     * are again available on the $http factory at run-time, which may be useful if you have run-time\n     * services you wish to be involved in your transformations.\n     *\n     * Similarly, to locally override the request/response transforms, augment the\n     * `transformRequest` and/or `transformResponse` properties of the configuration object passed\n     * into `$http`.\n     *\n     *\n     * # Caching\n     *\n     * To enable caching, set the request configuration `cache` property to `true` (to use default\n     * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}).\n     * When the cache is enabled, `$http` stores the response from the server in the specified\n     * cache. The next time the same request is made, the response is served from the cache without\n     * sending a request to the server.\n     *\n     * Note that even if the response is served from cache, delivery of the data is asynchronous in\n     * the same way that real requests are.\n     *\n     * If there are multiple GET requests for the same URL that should be cached using the same\n     * cache, but the cache is not populated yet, only one request to the server will be made and\n     * the remaining requests will be fulfilled using the response from the first request.\n     *\n     * You can change the default cache to a new object (built with\n     * {@link ng.$cacheFactory `$cacheFactory`}) by updating the\n     * {@link ng.$http#properties_defaults `$http.defaults.cache`} property. All requests who set\n     * their `cache` property to `true` will now use this cache object.\n     *\n     * If you set the default cache to `false` then only requests that specify their own custom\n     * cache object will be cached.\n     *\n     * # Interceptors\n     *\n     * Before you start creating interceptors, be sure to understand the\n     * {@link ng.$q $q and deferred/promise APIs}.\n     *\n     * For purposes of global error handling, authentication, or any kind of synchronous or\n     * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be\n     * able to intercept requests before they are handed to the server and\n     * responses before they are handed over to the application code that\n     * initiated these requests. The interceptors leverage the {@link ng.$q\n     * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.\n     *\n     * The interceptors are service factories that are registered with the `$httpProvider` by\n     * adding them to the `$httpProvider.interceptors` array. The factory is called and\n     * injected with dependencies (if specified) and returns the interceptor.\n     *\n     * There are two kinds of interceptors (and two kinds of rejection interceptors):\n     *\n     *   * `request`: interceptors get called with a http `config` object. The function is free to\n     *     modify the `config` object or create a new one. The function needs to return the `config`\n     *     object directly, or a promise containing the `config` or a new `config` object.\n     *   * `requestError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *   * `response`: interceptors get called with http `response` object. The function is free to\n     *     modify the `response` object or create a new one. The function needs to return the `response`\n     *     object directly, or as a promise containing the `response` or a new `response` object.\n     *   * `responseError`: interceptor gets called when a previous interceptor threw an error or\n     *     resolved with a rejection.\n     *\n     *\n     * ```js\n     *   // register the interceptor as a service\n     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\n     *     return {\n     *       // optional method\n     *       'request': function(config) {\n     *         // do something on success\n     *         return config;\n     *       },\n     *\n     *       // optional method\n     *      'requestError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       },\n     *\n     *\n     *\n     *       // optional method\n     *       'response': function(response) {\n     *         // do something on success\n     *         return response;\n     *       },\n     *\n     *       // optional method\n     *      'responseError': function(rejection) {\n     *         // do something on error\n     *         if (canRecover(rejection)) {\n     *           return responseOrNewPromise\n     *         }\n     *         return $q.reject(rejection);\n     *       }\n     *     };\n     *   });\n     *\n     *   $httpProvider.interceptors.push('myHttpInterceptor');\n     *\n     *\n     *   // alternatively, register the interceptor via an anonymous factory\n     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {\n     *     return {\n     *      'request': function(config) {\n     *          // same as above\n     *       },\n     *\n     *       'response': function(response) {\n     *          // same as above\n     *       }\n     *     };\n     *   });\n     * ```\n     *\n     * # Security Considerations\n     *\n     * When designing web applications, consider security threats from:\n     *\n     * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\n     *\n     * Both server and the client must cooperate in order to eliminate these threats. Angular comes\n     * pre-configured with strategies that address these issues, but for this to work backend server\n     * cooperation is required.\n     *\n     * ## JSON Vulnerability Protection\n     *\n     * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\n     * allows third party website to turn your JSON resource URL into\n     * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To\n     * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\n     * Angular will automatically strip the prefix before processing it as JSON.\n     *\n     * For example if your server needs to return:\n     * ```js\n     * ['one','two']\n     * ```\n     *\n     * which is vulnerable to attack, your server can return:\n     * ```js\n     * )]}',\n     * ['one','two']\n     * ```\n     *\n     * Angular will strip the prefix, before processing the JSON.\n     *\n     *\n     * ## Cross Site Request Forgery (XSRF) Protection\n     *\n     * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which\n     * an unauthorized site can gain your user's private data. Angular provides a mechanism\n     * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie\n     * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only\n     * JavaScript that runs on your domain could read the cookie, your server can be assured that\n     * the XHR came from JavaScript running on your domain. The header will not be set for\n     * cross-domain requests.\n     *\n     * To take advantage of this, your server needs to set a token in a JavaScript readable session\n     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the\n     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\n     * that only JavaScript running on your domain could have sent the request. The token must be\n     * unique for each user and must be verifiable by the server (to prevent the JavaScript from\n     * making up its own tokens). We recommend that the token is a digest of your site's\n     * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography))\n     * for added security.\n     *\n     * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName\n     * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,\n     * or the per-request config object.\n     *\n     *\n     * @param {object} config Object describing the request to be made and how it should be\n     *    processed. The object has following properties:\n     *\n     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)\n     *    - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.\n     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned\n     *      to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be\n     *      JSONified.\n     *    - **data** – `{string|Object}` – Data to be sent as the request message data.\n     *    - **headers** – `{Object}` – Map of strings or functions which return strings representing\n     *      HTTP headers to send to the server. If the return value of a function is null, the\n     *      header will not be sent.\n     *    - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.\n     *    - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.\n     *    - **transformRequest** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      request body and headers and returns its transformed (typically serialized) version.\n     *    - **transformResponse** –\n     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\n     *      transform function or an array of such functions. The transform function takes the http\n     *      response body and headers and returns its transformed (typically deserialized) version.\n     *    - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the\n     *      GET request, otherwise if a cache instance built with\n     *      {@link ng.$cacheFactory $cacheFactory}, this cache will be used for\n     *      caching.\n     *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}\n     *      that should abort the request when resolved.\n     *    - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the\n     *      XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5\n     *      for more information.\n     *    - **responseType** - `{string}` - see\n     *      [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).\n     *\n     * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the\n     *   standard `then` method and two http specific methods: `success` and `error`. The `then`\n     *   method takes two arguments a success and an error callback which will be called with a\n     *   response object. The `success` and `error` methods take a single argument - a function that\n     *   will be called when the request succeeds or fails respectively. The arguments passed into\n     *   these functions are destructured representation of the response object passed into the\n     *   `then` method. The response object has these properties:\n     *\n     *   - **data** – `{string|Object}` – The response body transformed with the transform\n     *     functions.\n     *   - **status** – `{number}` – HTTP status code of the response.\n     *   - **headers** – `{function([headerName])}` – Header getter function.\n     *   - **config** – `{Object}` – The configuration object that was used to generate the request.\n     *   - **statusText** – `{string}` – HTTP status text of the response.\n     *\n     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\n     *   requests. This is primarily meant to be used for debugging purposes.\n     *\n     *\n     * @example\n<example>\n<file name=\"index.html\">\n  <div ng-controller=\"FetchCtrl\">\n    <select ng-model=\"method\">\n      <option>GET</option>\n      <option>JSONP</option>\n    </select>\n    <input type=\"text\" ng-model=\"url\" size=\"80\"/>\n    <button id=\"fetchbtn\" ng-click=\"fetch()\">fetch</button><br>\n    <button id=\"samplegetbtn\" ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\n    <button id=\"samplejsonpbtn\"\n      ng-click=\"updateModel('JSONP',\n                    'http://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')\">\n      Sample JSONP\n    </button>\n    <button id=\"invalidjsonpbtn\"\n      ng-click=\"updateModel('JSONP', 'http://angularjs.org/doesntexist&callback=JSON_CALLBACK')\">\n        Invalid JSONP\n      </button>\n    <pre>http status code: {{status}}</pre>\n    <pre>http response data: {{data}}</pre>\n  </div>\n</file>\n<file name=\"script.js\">\n  function FetchCtrl($scope, $http, $templateCache) {\n    $scope.method = 'GET';\n    $scope.url = 'http-hello.html';\n\n    $scope.fetch = function() {\n      $scope.code = null;\n      $scope.response = null;\n\n      $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\n        success(function(data, status) {\n          $scope.status = status;\n          $scope.data = data;\n        }).\n        error(function(data, status) {\n          $scope.data = data || \"Request failed\";\n          $scope.status = status;\n      });\n    };\n\n    $scope.updateModel = function(method, url) {\n      $scope.method = method;\n      $scope.url = url;\n    };\n  }\n</file>\n<file name=\"http-hello.html\">\n  Hello, $http!\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  var status = element(by.binding('status'));\n  var data = element(by.binding('data'));\n  var fetchBtn = element(by.id('fetchbtn'));\n  var sampleGetBtn = element(by.id('samplegetbtn'));\n  var sampleJsonpBtn = element(by.id('samplejsonpbtn'));\n  var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));\n\n  it('should make an xhr GET request', function() {\n    sampleGetBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Hello, \\$http!/);\n  });\n\n  it('should make a JSONP request to angularjs.org', function() {\n    sampleJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('200');\n    expect(data.getText()).toMatch(/Super Hero!/);\n  });\n\n  it('should make JSONP request to invalid URL and invoke the error handler',\n      function() {\n    invalidJsonpBtn.click();\n    fetchBtn.click();\n    expect(status.getText()).toMatch('0');\n    expect(data.getText()).toMatch('Request failed');\n  });\n</file>\n</example>\n     */\n    function $http(requestConfig) {\n      var config = {\n        method: 'get',\n        transformRequest: defaults.transformRequest,\n        transformResponse: defaults.transformResponse\n      };\n      var headers = mergeHeaders(requestConfig);\n\n      extend(config, requestConfig);\n      config.headers = headers;\n      config.method = uppercase(config.method);\n\n      var xsrfValue = urlIsSameOrigin(config.url)\n          ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]\n          : undefined;\n      if (xsrfValue) {\n        headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;\n      }\n\n\n      var serverRequest = function(config) {\n        headers = config.headers;\n        var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);\n\n        // strip content-type if data is undefined\n        if (isUndefined(config.data)) {\n          forEach(headers, function(value, header) {\n            if (lowercase(header) === 'content-type') {\n                delete headers[header];\n            }\n          });\n        }\n\n        if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {\n          config.withCredentials = defaults.withCredentials;\n        }\n\n        // send request\n        return sendReq(config, reqData, headers).then(transformResponse, transformResponse);\n      };\n\n      var chain = [serverRequest, undefined];\n      var promise = $q.when(config);\n\n      // apply interceptors\n      forEach(reversedInterceptors, function(interceptor) {\n        if (interceptor.request || interceptor.requestError) {\n          chain.unshift(interceptor.request, interceptor.requestError);\n        }\n        if (interceptor.response || interceptor.responseError) {\n          chain.push(interceptor.response, interceptor.responseError);\n        }\n      });\n\n      while(chain.length) {\n        var thenFn = chain.shift();\n        var rejectFn = chain.shift();\n\n        promise = promise.then(thenFn, rejectFn);\n      }\n\n      promise.success = function(fn) {\n        promise.then(function(response) {\n          fn(response.data, response.status, response.headers, config);\n        });\n        return promise;\n      };\n\n      promise.error = function(fn) {\n        promise.then(null, function(response) {\n          fn(response.data, response.status, response.headers, config);\n        });\n        return promise;\n      };\n\n      return promise;\n\n      function transformResponse(response) {\n        // make a copy since the response must be cacheable\n        var resp = extend({}, response, {\n          data: transformData(response.data, response.headers, config.transformResponse)\n        });\n        return (isSuccess(response.status))\n          ? resp\n          : $q.reject(resp);\n      }\n\n      function mergeHeaders(config) {\n        var defHeaders = defaults.headers,\n            reqHeaders = extend({}, config.headers),\n            defHeaderName, lowercaseDefHeaderName, reqHeaderName;\n\n        defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);\n\n        // execute if header value is function\n        execHeaders(defHeaders);\n        execHeaders(reqHeaders);\n\n        // using for-in instead of forEach to avoid unecessary iteration after header has been found\n        defaultHeadersIteration:\n        for (defHeaderName in defHeaders) {\n          lowercaseDefHeaderName = lowercase(defHeaderName);\n\n          for (reqHeaderName in reqHeaders) {\n            if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {\n              continue defaultHeadersIteration;\n            }\n          }\n\n          reqHeaders[defHeaderName] = defHeaders[defHeaderName];\n        }\n\n        return reqHeaders;\n\n        function execHeaders(headers) {\n          var headerContent;\n\n          forEach(headers, function(headerFn, header) {\n            if (isFunction(headerFn)) {\n              headerContent = headerFn();\n              if (headerContent != null) {\n                headers[header] = headerContent;\n              } else {\n                delete headers[header];\n              }\n            }\n          });\n        }\n      }\n    }\n\n    $http.pendingRequests = [];\n\n    /**\n     * @ngdoc method\n     * @name $http#get\n     *\n     * @description\n     * Shortcut method to perform `GET` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#delete\n     *\n     * @description\n     * Shortcut method to perform `DELETE` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#head\n     *\n     * @description\n     * Shortcut method to perform `HEAD` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#jsonp\n     *\n     * @description\n     * Shortcut method to perform `JSONP` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request.\n     *                     Should contain `JSON_CALLBACK` string.\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n    createShortMethods('get', 'delete', 'head', 'jsonp');\n\n    /**\n     * @ngdoc method\n     * @name $http#post\n     *\n     * @description\n     * Shortcut method to perform `POST` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n\n    /**\n     * @ngdoc method\n     * @name $http#put\n     *\n     * @description\n     * Shortcut method to perform `PUT` request.\n     *\n     * @param {string} url Relative or absolute URL specifying the destination of the request\n     * @param {*} data Request content\n     * @param {Object=} config Optional configuration object\n     * @returns {HttpPromise} Future object\n     */\n    createShortMethodsWithData('post', 'put');\n\n        /**\n         * @ngdoc property\n         * @name $http#defaults\n         *\n         * @description\n         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\n         * default headers, withCredentials as well as request and response transformations.\n         *\n         * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\n         */\n    $http.defaults = defaults;\n\n\n    return $http;\n\n\n    function createShortMethods(names) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, config) {\n          return $http(extend(config || {}, {\n            method: name,\n            url: url\n          }));\n        };\n      });\n    }\n\n\n    function createShortMethodsWithData(name) {\n      forEach(arguments, function(name) {\n        $http[name] = function(url, data, config) {\n          return $http(extend(config || {}, {\n            method: name,\n            url: url,\n            data: data\n          }));\n        };\n      });\n    }\n\n\n    /**\n     * Makes the request.\n     *\n     * !!! ACCESSES CLOSURE VARS:\n     * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests\n     */\n    function sendReq(config, reqData, reqHeaders) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          cache,\n          cachedResp,\n          url = buildUrl(config.url, config.params);\n\n      $http.pendingRequests.push(config);\n      promise.then(removePendingReq, removePendingReq);\n\n\n      if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') {\n        cache = isObject(config.cache) ? config.cache\n              : isObject(defaults.cache) ? defaults.cache\n              : defaultCache;\n      }\n\n      if (cache) {\n        cachedResp = cache.get(url);\n        if (isDefined(cachedResp)) {\n          if (cachedResp.then) {\n            // cached request has already been sent, but there is no response yet\n            cachedResp.then(removePendingReq, removePendingReq);\n            return cachedResp;\n          } else {\n            // serving from cache\n            if (isArray(cachedResp)) {\n              resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2]), cachedResp[3]);\n            } else {\n              resolvePromise(cachedResp, 200, {}, 'OK');\n            }\n          }\n        } else {\n          // put the promise for the non-transformed response into cache as a placeholder\n          cache.put(url, promise);\n        }\n      }\n\n      // if we won't have the response in cache, send the request to the backend\n      if (isUndefined(cachedResp)) {\n        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\n            config.withCredentials, config.responseType);\n      }\n\n      return promise;\n\n\n      /**\n       * Callback registered to $httpBackend():\n       *  - caches the response if desired\n       *  - resolves the raw $http promise\n       *  - calls $apply\n       */\n      function done(status, response, headersString, statusText) {\n        if (cache) {\n          if (isSuccess(status)) {\n            cache.put(url, [status, response, parseHeaders(headersString), statusText]);\n          } else {\n            // remove promise from the cache\n            cache.remove(url);\n          }\n        }\n\n        resolvePromise(response, status, headersString, statusText);\n        if (!$rootScope.$$phase) $rootScope.$apply();\n      }\n\n\n      /**\n       * Resolves the raw $http promise.\n       */\n      function resolvePromise(response, status, headers, statusText) {\n        // normalize internal statuses to 0\n        status = Math.max(status, 0);\n\n        (isSuccess(status) ? deferred.resolve : deferred.reject)({\n          data: response,\n          status: status,\n          headers: headersGetter(headers),\n          config: config,\n          statusText : statusText\n        });\n      }\n\n\n      function removePendingReq() {\n        var idx = indexOf($http.pendingRequests, config);\n        if (idx !== -1) $http.pendingRequests.splice(idx, 1);\n      }\n    }\n\n\n    function buildUrl(url, params) {\n          if (!params) return url;\n          var parts = [];\n          forEachSorted(params, function(value, key) {\n            if (value === null || isUndefined(value)) return;\n            if (!isArray(value)) value = [value];\n\n            forEach(value, function(v) {\n              if (isObject(v)) {\n                v = toJson(v);\n              }\n              parts.push(encodeUriQuery(key) + '=' +\n                         encodeUriQuery(v));\n            });\n          });\n          if(parts.length > 0) {\n            url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');\n          }\n          return url;\n        }\n\n\n  }];\n}\n\nfunction createXhr(method) {\n    //if IE and the method is not RFC2616 compliant, or if XMLHttpRequest\n    //is not available, try getting an ActiveXObject. Otherwise, use XMLHttpRequest\n    //if it is available\n    if (msie <= 8 && (!method.match(/^(get|post|head|put|delete|options)$/i) ||\n      !window.XMLHttpRequest)) {\n      return new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n    } else if (window.XMLHttpRequest) {\n      return new window.XMLHttpRequest();\n    }\n\n    throw minErr('$httpBackend')('noxhr', \"This browser does not support XMLHttpRequest.\");\n}\n\n/**\n * @ngdoc service\n * @name $httpBackend\n * @requires $window\n * @requires $document\n *\n * @description\n * HTTP backend used by the {@link ng.$http service} that delegates to\n * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\n *\n * You should never need to use this service directly, instead use the higher-level abstractions:\n * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\n *\n * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\n * $httpBackend} which can be trained with responses.\n */\nfunction $HttpBackendProvider() {\n  this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {\n    return createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]);\n  }];\n}\n\nfunction createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {\n  var ABORTED = -1;\n\n  // TODO(vojta): fix the signature\n  return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {\n    var status;\n    $browser.$$incOutstandingRequestCount();\n    url = url || $browser.url();\n\n    if (lowercase(method) == 'jsonp') {\n      var callbackId = '_' + (callbacks.counter++).toString(36);\n      callbacks[callbackId] = function(data) {\n        callbacks[callbackId].data = data;\n        callbacks[callbackId].called = true;\n      };\n\n      var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),\n          callbackId, function(status, text) {\n        completeRequest(callback, status, callbacks[callbackId].data, \"\", text);\n        callbacks[callbackId] = noop;\n      });\n    } else {\n\n      var xhr = createXhr(method);\n\n      xhr.open(method, url, true);\n      forEach(headers, function(value, key) {\n        if (isDefined(value)) {\n            xhr.setRequestHeader(key, value);\n        }\n      });\n\n      // In IE6 and 7, this might be called synchronously when xhr.send below is called and the\n      // response is in the cache. the promise api will ensure that to the app code the api is\n      // always async\n      xhr.onreadystatechange = function() {\n        // onreadystatechange might get called multiple times with readyState === 4 on mobile webkit caused by\n        // xhrs that are resolved while the app is in the background (see #5426).\n        // since calling completeRequest sets the `xhr` variable to null, we just check if it's not null before\n        // continuing\n        //\n        // we can't set xhr.onreadystatechange to undefined or delete it because that breaks IE8 (method=PATCH) and\n        // Safari respectively.\n        if (xhr && xhr.readyState == 4) {\n          var responseHeaders = null,\n              response = null;\n\n          if(status !== ABORTED) {\n            responseHeaders = xhr.getAllResponseHeaders();\n\n            // responseText is the old-school way of retrieving response (supported by IE8 & 9)\n            // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)\n            response = ('response' in xhr) ? xhr.response : xhr.responseText;\n          }\n\n          completeRequest(callback,\n              status || xhr.status,\n              response,\n              responseHeaders,\n              xhr.statusText || '');\n        }\n      };\n\n      if (withCredentials) {\n        xhr.withCredentials = true;\n      }\n\n      if (responseType) {\n        try {\n          xhr.responseType = responseType;\n        } catch (e) {\n          // WebKit added support for the json responseType value on 09/03/2013\n          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are\n          // known to throw when setting the value \"json\" as the response type. Other older\n          // browsers implementing the responseType\n          //\n          // The json response type can be ignored if not supported, because JSON payloads are\n          // parsed on the client-side regardless.\n          if (responseType !== 'json') {\n            throw e;\n          }\n        }\n      }\n\n      xhr.send(post || null);\n    }\n\n    if (timeout > 0) {\n      var timeoutId = $browserDefer(timeoutRequest, timeout);\n    } else if (timeout && timeout.then) {\n      timeout.then(timeoutRequest);\n    }\n\n\n    function timeoutRequest() {\n      status = ABORTED;\n      jsonpDone && jsonpDone();\n      xhr && xhr.abort();\n    }\n\n    function completeRequest(callback, status, response, headersString, statusText) {\n      // cancel timeout and subsequent timeout promise resolution\n      timeoutId && $browserDefer.cancel(timeoutId);\n      jsonpDone = xhr = null;\n\n      // fix status code when it is 0 (0 status is undocumented).\n      // Occurs when accessing file resources or on Android 4.1 stock browser\n      // while retrieving files from application cache.\n      if (status === 0) {\n        status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;\n      }\n\n      // normalize IE bug (http://bugs.jquery.com/ticket/1450)\n      status = status === 1223 ? 204 : status;\n      statusText = statusText || '';\n\n      callback(status, response, headersString, statusText);\n      $browser.$$completeOutstandingRequest(noop);\n    }\n  };\n\n  function jsonpReq(url, callbackId, done) {\n    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:\n    // - fetches local scripts via XHR and evals them\n    // - adds and immediately removes script elements from the document\n    var script = rawDocument.createElement('script'), callback = null;\n    script.type = \"text/javascript\";\n    script.src = url;\n    script.async = true;\n\n    callback = function(event) {\n      removeEventListenerFn(script, \"load\", callback);\n      removeEventListenerFn(script, \"error\", callback);\n      rawDocument.body.removeChild(script);\n      script = null;\n      var status = -1;\n      var text = \"unknown\";\n\n      if (event) {\n        if (event.type === \"load\" && !callbacks[callbackId].called) {\n          event = { type: \"error\" };\n        }\n        text = event.type;\n        status = event.type === \"error\" ? 404 : 200;\n      }\n\n      if (done) {\n        done(status, text);\n      }\n    };\n\n    addEventListenerFn(script, \"load\", callback);\n    addEventListenerFn(script, \"error\", callback);\n    rawDocument.body.appendChild(script);\n    return callback;\n  }\n}\n\nvar $interpolateMinErr = minErr('$interpolate');\n\n/**\n * @ngdoc provider\n * @name $interpolateProvider\n * @function\n *\n * @description\n *\n * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.\n *\n * @example\n<example module=\"customInterpolationApp\">\n<file name=\"index.html\">\n<script>\n  var customInterpolationApp = angular.module('customInterpolationApp', []);\n\n  customInterpolationApp.config(function($interpolateProvider) {\n    $interpolateProvider.startSymbol('//');\n    $interpolateProvider.endSymbol('//');\n  });\n\n\n  customInterpolationApp.controller('DemoController', function() {\n      this.label = \"This binding is brought you by // interpolation symbols.\";\n  });\n</script>\n<div ng-app=\"App\" ng-controller=\"DemoController as demo\">\n    //demo.label//\n</div>\n</file>\n<file name=\"protractor.js\" type=\"protractor\">\n  it('should interpolate binding with custom symbols', function() {\n    expect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');\n  });\n</file>\n</example>\n */\nfunction $InterpolateProvider() {\n  var startSymbol = '{{';\n  var endSymbol = '}}';\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#startSymbol\n   * @description\n   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\n   *\n   * @param {string=} value new value to set the starting symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.startSymbol = function(value){\n    if (value) {\n      startSymbol = value;\n      return this;\n    } else {\n      return startSymbol;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name $interpolateProvider#endSymbol\n   * @description\n   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n   *\n   * @param {string=} value new value to set the ending symbol to.\n   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\n   */\n  this.endSymbol = function(value){\n    if (value) {\n      endSymbol = value;\n      return this;\n    } else {\n      return endSymbol;\n    }\n  };\n\n\n  this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {\n    var startSymbolLength = startSymbol.length,\n        endSymbolLength = endSymbol.length,\n        escapedStartRegexp = new RegExp(startSymbol.replace(/./g, escape), 'g'),\n        escapedEndRegexp = new RegExp(endSymbol.replace(/./g, escape), 'g');\n\n    function escape(ch) {\n      return '\\\\\\\\\\\\' + ch;\n    }\n\n    /**\n     * @ngdoc service\n     * @name $interpolate\n     * @function\n     *\n     * @requires $parse\n     * @requires $sce\n     *\n     * @description\n     *\n     * Compiles a string with markup into an interpolation function. This service is used by the\n     * HTML {@link ng.$compile $compile} service for data binding. See\n     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\n     * interpolation markup.\n     *\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var exp = $interpolate('Hello {{name | uppercase}}!');\n     *   expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');\n     * ```\n     *\n     * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is\n     * `true`, the interpolation function will return `undefined` unless all embedded expressions\n     * evaluate to a value other than `undefined`.\n     *\n     * ```js\n     *   var $interpolate = ...; // injected\n     *   var context = {greeting: 'Hello', name: undefined };\n     *\n     *   // default \"forgiving\" mode\n     *   var exp = $interpolate('{{greeting}} {{name}}!');\n     *   expect(exp(context)).toEqual('Hello !');\n     *\n     *   // \"allOrNothing\" mode\n     *   exp = $interpolate('{{greeting}} {{name}}!', false, null, true);\n     *   expect(exp(context, true)).toBeUndefined();\n     *   context.name = 'Angular';\n     *   expect(exp(context, true)).toEqual('Hello Angular!');\n     * ```\n     *\n     * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.\n     *\n     * ####Escaped Interpolation\n     * $interpolate provides a mechanism for escaping interpolation markers. Start and end markers\n     * can be escaped by preceding each of their characters with a REVERSE SOLIDUS U+005C (backslash).\n     * It will be rendered as a regular start/end marker, and will not be interpreted as an expression\n     * or binding.\n     *\n     * This enables web-servers to prevent script injection attacks and defacing attacks, to some\n     * degree, while also enabling code examples to work without relying on the\n     * {@link ng.directive:ngNonBindable ngNonBindable} directive.\n     *\n     * **For security purposes, it is strongly encouraged that web servers escape user-supplied data,\n     * replacing angle brackets (&lt;, &gt;) with &amp;lt; and &amp;gt; respectively, and replacing all\n     * interpolation start/end markers with their escaped counterparts.**\n     *\n     * Escaped interpolation markers are only replaced with the actual interpolation markers in rendered\n     * output when the $interpolate service processes the text. So, for HTML elements interpolated\n     * by {@link ng.$compile $compile}, or otherwise interpolated with the `mustHaveExpression` parameter\n     * set to `true`, the interpolated text must contain an unescaped interpolation expression. As such,\n     * this is typically useful only when user-data is used in rendering a template from the server, or\n     * when otherwise untrusted data is used by a directive.\n     *\n     * <example>\n     *  <file name=\"index.html\">\n     *    <div ng-init=\"username='A user'\">\n     *      <p ng-init=\"apptitle='Escaping demo'\">{{apptitle}}: \\{\\{ username = \"defaced value\"; \\}\\}\n     *        </p>\n     *      <p><strong>{{username}}</strong> attempts to inject code which will deface the\n     *        application, but fails to accomplish their task, because the server has correctly\n     *        escaped the interpolation start/end markers with REVERSE SOLIDUS U+005C (backslash)\n     *        characters.</p>\n     *      <p>Instead, the result of the attempted script injection is visible, and can be removed\n     *        from the database by an administrator.</p>\n     *    </div>\n     *  </file>\n     * </example>\n     *\n     * @param {string} text The text with markup to interpolate.\n     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\n     *    embedded expression in order to return an interpolation function. Strings with no\n     *    embedded expression will return null for the interpolation function.\n     * @param {string=} trustedContext when provided, the returned function passes the interpolated\n     *    result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,\n     *    trustedContext)} before returning it.  Refer to the {@link ng.$sce $sce} service that\n     *    provides Strict Contextual Escaping for details.\n     * @param {boolean=} allOrNothing if `true`, then the returned function returns undefined\n     *    unless all embedded expressions evaluate to a value other than `undefined`.\n     * @returns {function(context)} an interpolation function which is used to compute the\n     *    interpolated string. The function has these parameters:\n     *\n     * - `context`: evaluation context for all expressions embedded in the interpolated text\n     */\n    function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {\n      allOrNothing = !!allOrNothing;\n      var startIndex,\n          endIndex,\n          index = 0,\n          separators = [],\n          expressions = [],\n          parseFns = [],\n          textLength = text.length,\n          hasInterpolation = false,\n          hasText = false,\n          exp,\n          concat = [],\n          lastValuesCache = { values: {}, results: {}};\n\n      while(index < textLength) {\n        if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&\n             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) {\n          if (index !== startIndex) hasText = true;\n          separators.push(text.substring(index, startIndex));\n          exp = text.substring(startIndex + startSymbolLength, endIndex);\n          expressions.push(exp);\n          parseFns.push($parse(exp));\n          index = endIndex + endSymbolLength;\n          hasInterpolation = true;\n        } else {\n          // we did not find an interpolation, so we have to add the remainder to the separators array\n          if (index !== textLength) {\n            hasText = true;\n            separators.push(text.substring(index));\n          }\n          break;\n        }\n      }\n\n      forEach(separators, function(key, i) {\n        separators[i] = separators[i].\n          replace(escapedStartRegexp, startSymbol).\n          replace(escapedEndRegexp, endSymbol);\n      });\n\n      if (separators.length === expressions.length) {\n        separators.push('');\n      }\n\n      // Concatenating expressions makes it hard to reason about whether some combination of\n      // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a\n      // single expression be used for iframe[src], object[src], etc., we ensure that the value\n      // that's used is assigned or constructed by some JS code somewhere that is more testable or\n      // make it obvious that you bound the value to some user controlled value.  This helps reduce\n      // the load when auditing for XSS issues.\n      if (trustedContext && hasInterpolation && (hasText || expressions.length > 1)) {\n          throw $interpolateMinErr('noconcat',\n              \"Error while interpolating: {0}\\nStrict Contextual Escaping disallows \" +\n              \"interpolations that concatenate multiple expressions when a trusted value is \" +\n              \"required.  See http://docs.angularjs.org/api/ng.$sce\", text);\n      }\n\n      if (!mustHaveExpression || hasInterpolation) {\n        concat.length = separators.length + expressions.length;\n\n        var compute = function(values) {\n          for(var i = 0, ii = expressions.length; i < ii; i++) {\n            concat[2*i] = separators[i];\n            concat[(2*i)+1] = values[i];\n          }\n          concat[2*ii] = separators[ii];\n          return concat.join('');\n        };\n\n        var getValue = function (value) {\n          if (trustedContext) {\n            value = $sce.getTrusted(trustedContext, value);\n          } else {\n            value = $sce.valueOf(value);\n          }\n\n          return value;\n        };\n\n        var stringify = function (value) {\n          if (value == null) { // null || undefined\n            return '';\n          }\n          switch (typeof value) {\n            case 'string': {\n              break;\n            }\n            case 'number': {\n              value = '' + value;\n              break;\n            }\n            default: {\n              value = toJson(value);\n            }\n          }\n\n          return value;\n        };\n\n        return extend(function interpolationFn(context) {\n            var scopeId = (context && context.$id) || 'notAScope';\n            var lastValues = lastValuesCache.values[scopeId];\n            var lastResult = lastValuesCache.results[scopeId];\n            var i = 0;\n            var ii = expressions.length;\n            var values = new Array(ii);\n            var val;\n            var inputsChanged = lastResult === undefined ? true: false;\n\n\n            // if we haven't seen this context before, initialize the cache and try to setup\n            // a cleanup routine that purges the cache when the scope goes away.\n            if (!lastValues) {\n              lastValues = [];\n              inputsChanged = true;\n              if (context && context.$on) {\n                context.$on('$destroy', function() {\n                  lastValuesCache.values[scopeId] = null;\n                  lastValuesCache.results[scopeId] = null;\n                });\n              }\n            }\n\n\n            try {\n              interpolationFn.$$unwatch = true;\n              for (; i < ii; i++) {\n                val = getValue(parseFns[i](context));\n                if (allOrNothing && isUndefined(val)) {\n                  interpolationFn.$$unwatch = undefined;\n                  return;\n                }\n                val = stringify(val);\n                if (val !== lastValues[i]) {\n                  inputsChanged = true;\n                }\n                values[i] = val;\n                interpolationFn.$$unwatch = interpolationFn.$$unwatch && parseFns[i].$$unwatch;\n              }\n\n              if (inputsChanged) {\n                lastValuesCache.values[scopeId] = values;\n                lastValuesCache.results[scopeId] = lastResult = compute(values);\n              }\n            } catch(err) {\n              var newErr = $interpolateMinErr('interr', \"Can't interpolate: {0}\\n{1}\", text,\n                  err.toString());\n              $exceptionHandler(newErr);\n            }\n\n            return lastResult;\n          }, {\n          // all of these properties are undocumented for now\n          exp: text, //just for compatibility with regular watchers created via $watch\n          separators: separators,\n          expressions: expressions\n        });\n      }\n    }\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#startSymbol\n     * @description\n     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.\n     *\n     * Use {@link ng.$interpolateProvider#startSymbol $interpolateProvider#startSymbol} to change\n     * the symbol.\n     *\n     * @returns {string} start symbol.\n     */\n    $interpolate.startSymbol = function() {\n      return startSymbol;\n    };\n\n\n    /**\n     * @ngdoc method\n     * @name $interpolate#endSymbol\n     * @description\n     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\n     *\n     * Use {@link ng.$interpolateProvider#endSymbol $interpolateProvider#endSymbol} to change\n     * the symbol.\n     *\n     * @returns {string} end symbol.\n     */\n    $interpolate.endSymbol = function() {\n      return endSymbol;\n    };\n\n    return $interpolate;\n  }];\n}\n\nfunction $IntervalProvider() {\n  this.$get = ['$rootScope', '$window', '$q',\n       function($rootScope,   $window,   $q) {\n    var intervals = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $interval\n      *\n      * @description\n      * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`\n      * milliseconds.\n      *\n      * The return value of registering an interval function is a promise. This promise will be\n      * notified upon each tick of the interval, and will be resolved after `count` iterations, or\n      * run indefinitely if `count` is not defined. The value of the notification will be the\n      * number of iterations that have run.\n      * To cancel an interval, call `$interval.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\n      * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\n      * time.\n      *\n      * <div class=\"alert alert-warning\">\n      * **Note**: Intervals created by this service must be explicitly destroyed when you are finished\n      * with them.  In particular they are not automatically destroyed when a controller's scope or a\n      * directive's element are destroyed.\n      * You should take this into consideration and make sure to always cancel the interval at the\n      * appropriate moment.  See the example below for more details on how and when to do this.\n      * </div>\n      *\n      * @param {function()} fn A function that should be called repeatedly.\n      * @param {number} delay Number of milliseconds between each function call.\n      * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\n      *   indefinitely.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @returns {promise} A promise which will be notified on each iteration.\n      *\n      * @example\n      * <example module=\"time\">\n      *   <file name=\"index.html\">\n      *     <script>\n      *       function Ctrl2($scope,$interval) {\n      *         $scope.format = 'M/d/yy h:mm:ss a';\n      *         $scope.blood_1 = 100;\n      *         $scope.blood_2 = 120;\n      *\n      *         var stop;\n      *         $scope.fight = function() {\n      *           // Don't start a new fight if we are already fighting\n      *           if ( angular.isDefined(stop) ) return;\n      *\n      *           stop = $interval(function() {\n      *             if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {\n      *                 $scope.blood_1 = $scope.blood_1 - 3;\n      *                 $scope.blood_2 = $scope.blood_2 - 4;\n      *             } else {\n      *                 $scope.stopFight();\n      *             }\n      *           }, 100);\n      *         };\n      *\n      *         $scope.stopFight = function() {\n      *           if (angular.isDefined(stop)) {\n      *             $interval.cancel(stop);\n      *             stop = undefined;\n      *           }\n      *         };\n      *\n      *         $scope.resetFight = function() {\n      *           $scope.blood_1 = 100;\n      *           $scope.blood_2 = 120;\n      *         }\n      *\n      *         $scope.$on('$destroy', function() {\n      *           // Make sure that the interval is destroyed too\n      *           $scope.stopFight();\n      *         });\n      *       }\n      *\n      *       angular.module('time', [])\n      *         // Register the 'myCurrentTime' directive factory method.\n      *         // We inject $interval and dateFilter service since the factory method is DI.\n      *         .directive('myCurrentTime', function($interval, dateFilter) {\n      *           // return the directive link function. (compile function not needed)\n      *           return function(scope, element, attrs) {\n      *             var format,  // date format\n      *             stopTime; // so that we can cancel the time updates\n      *\n      *             // used to update the UI\n      *             function updateTime() {\n      *               element.text(dateFilter(new Date(), format));\n      *             }\n      *\n      *             // watch the expression, and update the UI on change.\n      *             scope.$watch(attrs.myCurrentTime, function(value) {\n      *               format = value;\n      *               updateTime();\n      *             });\n      *\n      *             stopTime = $interval(updateTime, 1000);\n      *\n      *             // listen on DOM destroy (removal) event, and cancel the next UI update\n      *             // to prevent updating time ofter the DOM element was removed.\n      *             element.on('$destroy', function() {\n      *               $interval.cancel(stopTime);\n      *             });\n      *           }\n      *         });\n      *     </script>\n      *\n      *     <div>\n      *       <div ng-controller=\"Ctrl2\">\n      *         Date format: <input ng-model=\"format\"> <hr/>\n      *         Current time is: <span my-current-time=\"format\"></span>\n      *         <hr/>\n      *         Blood 1 : <font color='red'>{{blood_1}}</font>\n      *         Blood 2 : <font color='red'>{{blood_2}}</font>\n      *         <button type=\"button\" data-ng-click=\"fight()\">Fight</button>\n      *         <button type=\"button\" data-ng-click=\"stopFight()\">StopFight</button>\n      *         <button type=\"button\" data-ng-click=\"resetFight()\">resetFight</button>\n      *       </div>\n      *     </div>\n      *\n      *   </file>\n      * </example>\n      */\n    function interval(fn, delay, count, invokeApply) {\n      var setInterval = $window.setInterval,\n          clearInterval = $window.clearInterval,\n          deferred = $q.defer(),\n          promise = deferred.promise,\n          iteration = 0,\n          skipApply = (isDefined(invokeApply) && !invokeApply);\n\n      count = isDefined(count) ? count : 0;\n\n      promise.then(null, null, fn);\n\n      promise.$$intervalId = setInterval(function tick() {\n        deferred.notify(iteration++);\n\n        if (count > 0 && iteration >= count) {\n          deferred.resolve(iteration);\n          clearInterval(promise.$$intervalId);\n          delete intervals[promise.$$intervalId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n\n      }, delay);\n\n      intervals[promise.$$intervalId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $interval#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`.\n      *\n      * @param {promise} promise returned by the `$interval` function.\n      * @returns {boolean} Returns `true` if the task was successfully canceled.\n      */\n    interval.cancel = function(promise) {\n      if (promise && promise.$$intervalId in intervals) {\n        intervals[promise.$$intervalId].reject('canceled');\n        clearInterval(promise.$$intervalId);\n        delete intervals[promise.$$intervalId];\n        return true;\n      }\n      return false;\n    };\n\n    return interval;\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $locale\n *\n * @description\n * $locale service provides localization rules for various Angular components. As of right now the\n * only public api is:\n *\n * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)\n */\nfunction $LocaleProvider(){\n  this.$get = function() {\n    return {\n      id: 'en-us',\n\n      NUMBER_FORMATS: {\n        DECIMAL_SEP: '.',\n        GROUP_SEP: ',',\n        PATTERNS: [\n          { // Decimal Pattern\n            minInt: 1,\n            minFrac: 0,\n            maxFrac: 3,\n            posPre: '',\n            posSuf: '',\n            negPre: '-',\n            negSuf: '',\n            gSize: 3,\n            lgSize: 3\n          },{ //Currency Pattern\n            minInt: 1,\n            minFrac: 2,\n            maxFrac: 2,\n            posPre: '\\u00A4',\n            posSuf: '',\n            negPre: '(\\u00A4',\n            negSuf: ')',\n            gSize: 3,\n            lgSize: 3\n          }\n        ],\n        CURRENCY_SYM: '$'\n      },\n\n      DATETIME_FORMATS: {\n        MONTH:\n            'January,February,March,April,May,June,July,August,September,October,November,December'\n            .split(','),\n        SHORTMONTH:  'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),\n        DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),\n        SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),\n        AMPMS: ['AM','PM'],\n        medium: 'MMM d, y h:mm:ss a',\n        short: 'M/d/yy h:mm a',\n        fullDate: 'EEEE, MMMM d, y',\n        longDate: 'MMMM d, y',\n        mediumDate: 'MMM d, y',\n        shortDate: 'M/d/yy',\n        mediumTime: 'h:mm:ss a',\n        shortTime: 'h:mm a'\n      },\n\n      pluralCat: function(num) {\n        if (num === 1) {\n          return 'one';\n        }\n        return 'other';\n      }\n    };\n  };\n}\n\nvar PATH_MATCH = /^([^\\?#]*)(\\?([^#]*))?(#(.*))?$/,\n    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};\nvar $locationMinErr = minErr('$location');\n\n\n/**\n * Encode path using encodeUriSegment, ignoring forward slashes\n *\n * @param {string} path Path to encode\n * @returns {string}\n */\nfunction encodePath(path) {\n  var segments = path.split('/'),\n      i = segments.length;\n\n  while (i--) {\n    segments[i] = encodeUriSegment(segments[i]);\n  }\n\n  return segments.join('/');\n}\n\nfunction parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {\n  var parsedUrl = urlResolve(absoluteUrl, appBase);\n\n  locationObj.$$protocol = parsedUrl.protocol;\n  locationObj.$$host = parsedUrl.hostname;\n  locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\n}\n\n\nfunction parseAppUrl(relativeUrl, locationObj, appBase) {\n  var prefixed = (relativeUrl.charAt(0) !== '/');\n  if (prefixed) {\n    relativeUrl = '/' + relativeUrl;\n  }\n  var match = urlResolve(relativeUrl, appBase);\n  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?\n      match.pathname.substring(1) : match.pathname);\n  locationObj.$$search = parseKeyValue(match.search);\n  locationObj.$$hash = decodeURIComponent(match.hash);\n\n  // make sure path starts with '/';\n  if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {\n    locationObj.$$path = '/' + locationObj.$$path;\n  }\n}\n\n\n/**\n *\n * @param {string} begin\n * @param {string} whole\n * @returns {string} returns text from whole after begin or undefined if it does not begin with\n *                   expected string.\n */\nfunction beginsWith(begin, whole) {\n  if (whole.indexOf(begin) === 0) {\n    return whole.substr(begin.length);\n  }\n}\n\n\nfunction stripHash(url) {\n  var index = url.indexOf('#');\n  return index == -1 ? url : url.substr(0, index);\n}\n\n\nfunction stripFile(url) {\n  return url.substr(0, stripHash(url).lastIndexOf('/') + 1);\n}\n\n/* return the server only (scheme://host:port) */\nfunction serverBase(url) {\n  return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));\n}\n\n\n/**\n * LocationHtml5Url represents an url\n * This object is exposed as $location service when HTML5 mode is enabled and supported\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} basePrefix url path prefix\n */\nfunction LocationHtml5Url(appBase, basePrefix) {\n  this.$$html5 = true;\n  basePrefix = basePrefix || '';\n  var appBaseNoFile = stripFile(appBase);\n  parseAbsoluteUrl(appBase, this, appBase);\n\n\n  /**\n   * Parse given html5 (regular) url string into properties\n   * @param {string} newAbsoluteUrl HTML5 url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var pathUrl = beginsWith(appBaseNoFile, url);\n    if (!isString(pathUrl)) {\n      throw $locationMinErr('ipthprfx', 'Invalid url \"{0}\", missing path prefix \"{1}\".', url,\n          appBaseNoFile);\n    }\n\n    parseAppUrl(pathUrl, this, appBase);\n\n    if (!this.$$path) {\n      this.$$path = '/';\n    }\n\n    this.$$compose();\n  };\n\n  /**\n   * Compose url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'\n  };\n\n  this.$$rewrite = function(url) {\n    var appUrl, prevAppUrl;\n\n    if ( (appUrl = beginsWith(appBase, url)) !== undefined ) {\n      prevAppUrl = appUrl;\n      if ( (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ) {\n        return appBaseNoFile + (beginsWith('/', appUrl) || appUrl);\n      } else {\n        return appBase + prevAppUrl;\n      }\n    } else if ( (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ) {\n      return appBaseNoFile + appUrl;\n    } else if (appBaseNoFile == url + '/') {\n      return appBaseNoFile;\n    }\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when developer doesn't opt into html5 mode.\n * It also serves as the base class for html5 mode fallback on legacy browsers.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangUrl(appBase, hashPrefix) {\n  var appBaseNoFile = stripFile(appBase);\n\n  parseAbsoluteUrl(appBase, this, appBase);\n\n\n  /**\n   * Parse given hashbang url into properties\n   * @param {string} url Hashbang url\n   * @private\n   */\n  this.$$parse = function(url) {\n    var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);\n    var withoutHashUrl = withoutBaseUrl.charAt(0) == '#'\n        ? beginsWith(hashPrefix, withoutBaseUrl)\n        : (this.$$html5)\n          ? withoutBaseUrl\n          : '';\n\n    if (!isString(withoutHashUrl)) {\n      throw $locationMinErr('ihshprfx', 'Invalid url \"{0}\", missing hash prefix \"{1}\".', url,\n          hashPrefix);\n    }\n    parseAppUrl(withoutHashUrl, this, appBase);\n\n    this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);\n\n    this.$$compose();\n\n    /*\n     * In Windows, on an anchor node on documents loaded from\n     * the filesystem, the browser will return a pathname\n     * prefixed with the drive name ('/C:/path') when a\n     * pathname without a drive is set:\n     *  * a.setAttribute('href', '/foo')\n     *   * a.pathname === '/C:/foo' //true\n     *\n     * Inside of Angular, we're always using pathnames that\n     * do not include drive names for routing.\n     */\n    function removeWindowsDriveName (path, url, base) {\n      /*\n      Matches paths for file protocol on windows,\n      such as /C:/foo/bar, and captures only /foo/bar.\n      */\n      var windowsFilePathExp = /^\\/[A-Z]:(\\/.*)/;\n\n      var firstPathSegmentMatch;\n\n      //Get the relative path from the input URL.\n      if (url.indexOf(base) === 0) {\n        url = url.replace(base, '');\n      }\n\n      // The input URL intentionally contains a first path segment that ends with a colon.\n      if (windowsFilePathExp.exec(url)) {\n        return path;\n      }\n\n      firstPathSegmentMatch = windowsFilePathExp.exec(path);\n      return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;\n    }\n  };\n\n  /**\n   * Compose hashbang url and update `absUrl` property\n   * @private\n   */\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');\n  };\n\n  this.$$rewrite = function(url) {\n    if(stripHash(appBase) == stripHash(url)) {\n      return url;\n    }\n  };\n}\n\n\n/**\n * LocationHashbangUrl represents url\n * This object is exposed as $location service when html5 history api is enabled but the browser\n * does not support it.\n *\n * @constructor\n * @param {string} appBase application base URL\n * @param {string} hashPrefix hashbang prefix\n */\nfunction LocationHashbangInHtml5Url(appBase, hashPrefix) {\n  this.$$html5 = true;\n  LocationHashbangUrl.apply(this, arguments);\n\n  var appBaseNoFile = stripFile(appBase);\n\n  this.$$rewrite = function(url) {\n    var appUrl;\n\n    if ( appBase == stripHash(url) ) {\n      return url;\n    } else if ( (appUrl = beginsWith(appBaseNoFile, url)) ) {\n      return appBase + hashPrefix + appUrl;\n    } else if ( appBaseNoFile === url + '/') {\n      return appBaseNoFile;\n    }\n  };\n\n  this.$$compose = function() {\n    var search = toKeyValue(this.$$search),\n        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\n\n    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\n    // include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'\n    this.$$absUrl = appBase + hashPrefix + this.$$url;\n  };\n\n}\n\n\nLocationHashbangInHtml5Url.prototype =\n  LocationHashbangUrl.prototype =\n  LocationHtml5Url.prototype = {\n\n  /**\n   * Are we in html5 mode?\n   * @private\n   */\n  $$html5: false,\n\n  /**\n   * Has any change been replacing ?\n   * @private\n   */\n  $$replace: false,\n\n  /**\n   * @ngdoc method\n   * @name $location#absUrl\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return full url representation with all segments encoded according to rules specified in\n   * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).\n   *\n   * @return {string} full url\n   */\n  absUrl: locationGetter('$$absUrl'),\n\n  /**\n   * @ngdoc method\n   * @name $location#url\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.\n   *\n   * Change path, search and hash, when called with parameter and return `$location`.\n   *\n   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)\n   * @param {string=} replace The path that will be changed\n   * @return {string} url\n   */\n  url: function(url, replace) {\n    if (isUndefined(url))\n      return this.$$url;\n\n    var match = PATH_MATCH.exec(url);\n    if (match[1]) this.path(decodeURIComponent(match[1]));\n    if (match[2] || match[1]) this.search(match[3] || '');\n    this.hash(match[5] || '', replace);\n\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#protocol\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return protocol of current url.\n   *\n   * @return {string} protocol of current url\n   */\n  protocol: locationGetter('$$protocol'),\n\n  /**\n   * @ngdoc method\n   * @name $location#host\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return host of current url.\n   *\n   * @return {string} host of current url.\n   */\n  host: locationGetter('$$host'),\n\n  /**\n   * @ngdoc method\n   * @name $location#port\n   *\n   * @description\n   * This method is getter only.\n   *\n   * Return port of current url.\n   *\n   * @return {Number} port\n   */\n  port: locationGetter('$$port'),\n\n  /**\n   * @ngdoc method\n   * @name $location#path\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return path of current url when called without any parameter.\n   *\n   * Change path when called with parameter and return `$location`.\n   *\n   * Note: Path should always begin with forward slash (/), this method will add the forward slash\n   * if it is missing.\n   *\n   * @param {string=} path New path\n   * @return {string} path\n   */\n  path: locationGetterSetter('$$path', function(path) {\n    return path.charAt(0) == '/' ? path : '/' + path;\n  }),\n\n  /**\n   * @ngdoc method\n   * @name $location#search\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return search part (as object) of current url when called without any parameter.\n   *\n   * Change search part when called with parameter and return `$location`.\n   *\n   *\n   * ```js\n   * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\n   * var searchObject = $location.search();\n   * // => {foo: 'bar', baz: 'xoxo'}\n   *\n   *\n   * // set foo to 'yipee'\n   * $location.search('foo', 'yipee');\n   * // => $location\n   * ```\n   *\n   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\n   * hash object.\n   *\n   * When called with a single argument the method acts as a setter, setting the `search` component\n   * of `$location` to the specified value.\n   *\n   * If the argument is a hash object containing an array of values, these values will be encoded\n   * as duplicate search parameters in the url.\n   *\n   * @param {(string|Array<string>)=} paramValue If `search` is a string, then `paramValue` will\n   * override only a single search property.\n   *\n   * If `paramValue` is an array, it will override the property of the `search` component of\n   * `$location` specified via the first argument.\n   *\n   * If `paramValue` is `null`, the property specified via the first argument will be deleted.\n   *\n   * @return {Object} If called with no arguments returns the parsed `search` object. If called with\n   * one or more arguments returns `$location` object itself.\n   */\n  search: function(search, paramValue) {\n    switch (arguments.length) {\n      case 0:\n        return this.$$search;\n      case 1:\n        if (isString(search)) {\n          this.$$search = parseKeyValue(search);\n        } else if (isObject(search)) {\n          this.$$search = search;\n        } else {\n          throw $locationMinErr('isrcharg',\n              'The first argument of the `$location#search()` call must be a string or an object.');\n        }\n        break;\n      default:\n        if (isUndefined(paramValue) || paramValue === null) {\n          delete this.$$search[search];\n        } else {\n          this.$$search[search] = paramValue;\n        }\n    }\n\n    this.$$compose();\n    return this;\n  },\n\n  /**\n   * @ngdoc method\n   * @name $location#hash\n   *\n   * @description\n   * This method is getter / setter.\n   *\n   * Return hash fragment when called without any parameter.\n   *\n   * Change hash fragment when called with parameter and return `$location`.\n   *\n   * @param {string=} hash New hash fragment\n   * @return {string} hash\n   */\n  hash: locationGetterSetter('$$hash', identity),\n\n  /**\n   * @ngdoc method\n   * @name $location#replace\n   *\n   * @description\n   * If called, all changes to $location during current `$digest` will be replacing current history\n   * record, instead of adding new one.\n   */\n  replace: function() {\n    this.$$replace = true;\n    return this;\n  }\n};\n\nfunction locationGetter(property) {\n  return function() {\n    return this[property];\n  };\n}\n\n\nfunction locationGetterSetter(property, preprocess) {\n  return function(value) {\n    if (isUndefined(value))\n      return this[property];\n\n    this[property] = preprocess(value);\n    this.$$compose();\n\n    return this;\n  };\n}\n\n\n/**\n * @ngdoc service\n * @name $location\n *\n * @requires $rootElement\n *\n * @description\n * The $location service parses the URL in the browser address bar (based on the\n * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL\n * available to your application. Changes to the URL in the address bar are reflected into\n * $location service and changes to $location are reflected into the browser address bar.\n *\n * **The $location service:**\n *\n * - Exposes the current URL in the browser address bar, so you can\n *   - Watch and observe the URL.\n *   - Change the URL.\n * - Synchronizes the URL with the browser when the user\n *   - Changes the address bar.\n *   - Clicks the back or forward button (or clicks a History link).\n *   - Clicks on a link.\n * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\n *\n * For more information see {@link guide/$location Developer Guide: Using $location}\n */\n\n/**\n * @ngdoc provider\n * @name $locationProvider\n * @description\n * Use the `$locationProvider` to configure how the application deep linking paths are stored.\n */\nfunction $LocationProvider(){\n  var hashPrefix = '',\n      html5Mode = false;\n\n  /**\n   * @ngdoc property\n   * @name $locationProvider#hashPrefix\n   * @description\n   * @param {string=} prefix Prefix for hash part (containing path and search)\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.hashPrefix = function(prefix) {\n    if (isDefined(prefix)) {\n      hashPrefix = prefix;\n      return this;\n    } else {\n      return hashPrefix;\n    }\n  };\n\n  /**\n   * @ngdoc property\n   * @name $locationProvider#html5Mode\n   * @description\n   * @param {boolean=} mode Use HTML5 strategy if available.\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.html5Mode = function(mode) {\n    if (isDefined(mode)) {\n      html5Mode = mode;\n      return this;\n    } else {\n      return html5Mode;\n    }\n  };\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeStart\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted before a URL will change. This change can be prevented by calling\n   * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more\n   * details about event object. Upon successful change\n   * {@link ng.$location#events_$locationChangeSuccess $locationChangeSuccess} is fired.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   */\n\n  /**\n   * @ngdoc event\n   * @name $location#$locationChangeSuccess\n   * @eventType broadcast on root scope\n   * @description\n   * Broadcasted after a URL was changed.\n   *\n   * @param {Object} angularEvent Synthetic event object.\n   * @param {string} newUrl New URL\n   * @param {string=} oldUrl URL that was before it was changed.\n   */\n\n  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',\n      function( $rootScope,   $browser,   $sniffer,   $rootElement) {\n    var $location,\n        LocationMode,\n        baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''\n        initialUrl = $browser.url(),\n        appBase;\n\n    if (html5Mode) {\n      appBase = serverBase(initialUrl) + (baseHref || '/');\n      LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;\n    } else {\n      appBase = stripHash(initialUrl);\n      LocationMode = LocationHashbangUrl;\n    }\n    $location = new LocationMode(appBase, '#' + hashPrefix);\n    $location.$$parse($location.$$rewrite(initialUrl));\n\n    $rootElement.on('click', function(event) {\n      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\n      // currently we open nice url link and redirect then\n\n      if (event.ctrlKey || event.metaKey || event.which == 2) return;\n\n      var elm = jqLite(event.target);\n\n      // traverse the DOM up to find first A tag\n      while (lowercase(elm[0].nodeName) !== 'a') {\n        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)\n        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\n      }\n\n      var absHref = elm.prop('href');\n\n      if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {\n        // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during\n        // an animation.\n        absHref = urlResolve(absHref.animVal).href;\n      }\n\n      // Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9)\n      // The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or\n      // somewhere#anchor or http://example.com/somewhere\n      if (LocationMode === LocationHashbangInHtml5Url) {\n        // get the actual href attribute - see\n        // http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx\n        var href = elm.attr('href') || elm.attr('xlink:href');\n\n        if (href.indexOf('://') < 0) {         // Ignore absolute URLs\n          var prefix = '#' + hashPrefix;\n          if (href[0] == '/') {\n            // absolute path - replace old path\n            absHref = appBase + prefix + href;\n          } else if (href[0] == '#') {\n            // local anchor\n            absHref = appBase + prefix + ($location.path() || '/') + href;\n          } else {\n            // relative path - join with current path\n            var stack = $location.path().split(\"/\"),\n              parts = href.split(\"/\");\n            for (var i=0; i<parts.length; i++) {\n              if (parts[i] == \".\")\n                continue;\n              else if (parts[i] == \"..\")\n                stack.pop();\n              else if (parts[i].length)\n                stack.push(parts[i]);\n            }\n            absHref = appBase + prefix + stack.join('/');\n          }\n        }\n      }\n\n      var rewrittenUrl = $location.$$rewrite(absHref);\n\n      if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {\n        event.preventDefault();\n        if (rewrittenUrl != $browser.url()) {\n          // update location manually\n          $location.$$parse(rewrittenUrl);\n          $rootScope.$apply();\n          // hack to work around FF6 bug 684208 when scenario runner clicks on links\n          window.angular['ff-684208-preventDefault'] = true;\n        }\n      }\n    });\n\n\n    // rewrite hashbang url <> html5 url\n    if ($location.absUrl() != initialUrl) {\n      $browser.url($location.absUrl(), true);\n    }\n\n    // update $location when $browser url changes\n    $browser.onUrlChange(function(newUrl) {\n      if ($location.absUrl() != newUrl) {\n        $rootScope.$evalAsync(function() {\n          var oldUrl = $location.absUrl();\n\n          $location.$$parse(newUrl);\n          if ($rootScope.$broadcast('$locationChangeStart', newUrl,\n                                    oldUrl).defaultPrevented) {\n            $location.$$parse(oldUrl);\n            $browser.url(oldUrl);\n          } else {\n            afterLocationChange(oldUrl);\n          }\n        });\n        if (!$rootScope.$$phase) $rootScope.$digest();\n      }\n    });\n\n    // update browser\n    var changeCounter = 0;\n    $rootScope.$watch(function $locationWatch() {\n      var oldUrl = $browser.url();\n      var currentReplace = $location.$$replace;\n\n      if (!changeCounter || oldUrl != $location.absUrl()) {\n        changeCounter++;\n        $rootScope.$evalAsync(function() {\n          if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\n              defaultPrevented) {\n            $location.$$parse(oldUrl);\n          } else {\n            $browser.url($location.absUrl(), currentReplace);\n            afterLocationChange(oldUrl);\n          }\n        });\n      }\n      $location.$$replace = false;\n\n      return changeCounter;\n    });\n\n    return $location;\n\n    function afterLocationChange(oldUrl) {\n      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);\n    }\n}];\n}\n\n/**\n * @ngdoc service\n * @name $log\n * @requires $window\n *\n * @description\n * Simple service for logging. Default implementation safely writes the message\n * into the browser's console (if present).\n *\n * The main purpose of this service is to simplify debugging and troubleshooting.\n *\n * The default is to log `debug` messages. You can use\n * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.\n *\n * @example\n   <example>\n     <file name=\"script.js\">\n       function LogCtrl($scope, $log) {\n         $scope.$log = $log;\n         $scope.message = 'Hello World!';\n       }\n     </file>\n     <file name=\"index.html\">\n       <div ng-controller=\"LogCtrl\">\n         <p>Reload this page with open console, enter text and hit the log button...</p>\n         Message:\n         <input type=\"text\" ng-model=\"message\"/>\n         <button ng-click=\"$log.log(message)\">log</button>\n         <button ng-click=\"$log.warn(message)\">warn</button>\n         <button ng-click=\"$log.info(message)\">info</button>\n         <button ng-click=\"$log.error(message)\">error</button>\n       </div>\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc provider\n * @name $logProvider\n * @description\n * Use the `$logProvider` to configure how the application logs messages\n */\nfunction $LogProvider(){\n  var debug = true,\n      self = this;\n\n  /**\n   * @ngdoc property\n   * @name $logProvider#debugEnabled\n   * @description\n   * @param {boolean=} flag enable or disable debug level messages\n   * @returns {*} current value if used as getter or itself (chaining) if used as setter\n   */\n  this.debugEnabled = function(flag) {\n    if (isDefined(flag)) {\n      debug = flag;\n    return this;\n    } else {\n      return debug;\n    }\n  };\n\n  this.$get = ['$window', function($window){\n    return {\n      /**\n       * @ngdoc method\n       * @name $log#log\n       *\n       * @description\n       * Write a log message\n       */\n      log: consoleLog('log'),\n\n      /**\n       * @ngdoc method\n       * @name $log#info\n       *\n       * @description\n       * Write an information message\n       */\n      info: consoleLog('info'),\n\n      /**\n       * @ngdoc method\n       * @name $log#warn\n       *\n       * @description\n       * Write a warning message\n       */\n      warn: consoleLog('warn'),\n\n      /**\n       * @ngdoc method\n       * @name $log#error\n       *\n       * @description\n       * Write an error message\n       */\n      error: consoleLog('error'),\n\n      /**\n       * @ngdoc method\n       * @name $log#debug\n       *\n       * @description\n       * Write a debug message\n       */\n      debug: (function () {\n        var fn = consoleLog('debug');\n\n        return function() {\n          if (debug) {\n            fn.apply(self, arguments);\n          }\n        };\n      }())\n    };\n\n    function formatError(arg) {\n      if (arg instanceof Error) {\n        if (arg.stack) {\n          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)\n              ? 'Error: ' + arg.message + '\\n' + arg.stack\n              : arg.stack;\n        } else if (arg.sourceURL) {\n          arg = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\n        }\n      }\n      return arg;\n    }\n\n    function consoleLog(type) {\n      var console = $window.console || {},\n          logFn = console[type] || console.log || noop,\n          hasApply = false;\n\n      // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.\n      // The reason behind this is that console.log has type \"object\" in IE8...\n      try {\n        hasApply = !!logFn.apply;\n      } catch (e) {}\n\n      if (hasApply) {\n        return function() {\n          var args = [];\n          forEach(arguments, function(arg) {\n            args.push(formatError(arg));\n          });\n          return logFn.apply(console, args);\n        };\n      }\n\n      // we are IE which either doesn't have window.console => this is noop and we do nothing,\n      // or we are IE where console.log doesn't have apply so we log at least first 2 args\n      return function(arg1, arg2) {\n        logFn(arg1, arg2 == null ? '' : arg2);\n      };\n    }\n  }];\n}\n\nvar $parseMinErr = minErr('$parse');\n\n// Sandboxing Angular Expressions\n// ------------------------------\n// Angular expressions are generally considered safe because these expressions only have direct\n// access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by\n// obtaining a reference to native JS functions such as the Function constructor.\n//\n// As an example, consider the following Angular expression:\n//\n//   {}.toString.constructor(alert(\"evil JS code\"))\n//\n// We want to prevent this type of access. For the sake of performance, during the lexing phase we\n// disallow any \"dotted\" access to any member named \"constructor\".\n//\n// For reflective calls (a[b]) we check that the value of the lookup is not the Function constructor\n// while evaluating the expression, which is a stronger but more expensive test. Since reflective\n// calls are expensive anyway, this is not such a big deal compared to static dereferencing.\n//\n// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits\n// against the expression language, but not to prevent exploits that were enabled by exposing\n// sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good\n// practice and therefore we are not even trying to protect against interaction with an object\n// explicitly exposed in this way.\n//\n// A developer could foil the name check by aliasing the Function constructor under a different\n// name on the scope.\n//\n// In general, it is not possible to access a Window object from an angular expression unless a\n// window or some DOM object that has a reference to window is published onto a Scope.\n\nfunction ensureSafeMemberName(name, fullExpression) {\n  if (name === \"constructor\") {\n    throw $parseMinErr('isecfld',\n        'Referencing \"constructor\" field in Angular expressions is disallowed! Expression: {0}',\n        fullExpression);\n  }\n  return name;\n}\n\nfunction ensureSafeObject(obj, fullExpression) {\n  // nifty check if obj is Function that is fast and works across iframes and other contexts\n  if (obj) {\n    if (obj.constructor === obj) {\n      throw $parseMinErr('isecfn',\n          'Referencing Function in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isWindow(obj)\n        obj.document && obj.location && obj.alert && obj.setInterval) {\n      throw $parseMinErr('isecwindow',\n          'Referencing the Window in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    } else if (// isElement(obj)\n        obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {\n      throw $parseMinErr('isecdom',\n          'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',\n          fullExpression);\n    }\n  }\n  return obj;\n}\n\nvar OPERATORS = {\n    /* jshint bitwise : false */\n    'null':function(){return null;},\n    'true':function(){return true;},\n    'false':function(){return false;},\n    undefined:noop,\n    '+':function(self, locals, a,b){\n      a=a(self, locals); b=b(self, locals);\n      if (isDefined(a)) {\n        if (isDefined(b)) {\n          return a + b;\n        }\n        return a;\n      }\n      return isDefined(b)?b:undefined;},\n    '-':function(self, locals, a,b){\n          a=a(self, locals); b=b(self, locals);\n          return (isDefined(a)?a:0)-(isDefined(b)?b:0);\n        },\n    '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);},\n    '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);},\n    '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},\n    '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);},\n    '=':noop,\n    '===':function(self, locals, a, b){return a(self, locals)===b(self, locals);},\n    '!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);},\n    '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},\n    '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},\n    '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},\n    '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);},\n    '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);},\n    '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);},\n    '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);},\n    '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);},\n    '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);},\n//    '|':function(self, locals, a,b){return a|b;},\n    '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));},\n    '!':function(self, locals, a){return !a(self, locals);}\n};\n/* jshint bitwise: true */\nvar ESCAPE = {\"n\":\"\\n\", \"f\":\"\\f\", \"r\":\"\\r\", \"t\":\"\\t\", \"v\":\"\\v\", \"'\":\"'\", '\"':'\"'};\n\n\n/////////////////////////////////////////\n\n\n/**\n * @constructor\n */\nvar Lexer = function (options) {\n  this.options = options;\n};\n\nLexer.prototype = {\n  constructor: Lexer,\n\n  lex: function (text) {\n    this.text = text;\n\n    this.index = 0;\n    this.ch = undefined;\n    this.lastCh = ':'; // can start regexp\n\n    this.tokens = [];\n\n    while (this.index < this.text.length) {\n      this.ch = this.text.charAt(this.index);\n      if (this.is('\"\\'')) {\n        this.readString(this.ch);\n      } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) {\n        this.readNumber();\n      } else if (this.isIdent(this.ch)) {\n        this.readIdent();\n      } else if (this.is('(){}[].,;:?')) {\n        this.tokens.push({\n          index: this.index,\n          text: this.ch\n        });\n        this.index++;\n      } else if (this.isWhitespace(this.ch)) {\n        this.index++;\n        continue;\n      } else {\n        var ch2 = this.ch + this.peek();\n        var ch3 = ch2 + this.peek(2);\n        var fn = OPERATORS[this.ch];\n        var fn2 = OPERATORS[ch2];\n        var fn3 = OPERATORS[ch3];\n        if (fn3) {\n          this.tokens.push({index: this.index, text: ch3, fn: fn3});\n          this.index += 3;\n        } else if (fn2) {\n          this.tokens.push({index: this.index, text: ch2, fn: fn2});\n          this.index += 2;\n        } else if (fn) {\n          this.tokens.push({\n            index: this.index,\n            text: this.ch,\n            fn: fn\n          });\n          this.index += 1;\n        } else {\n          this.throwError('Unexpected next character ', this.index, this.index + 1);\n        }\n      }\n      this.lastCh = this.ch;\n    }\n    return this.tokens;\n  },\n\n  is: function(chars) {\n    return chars.indexOf(this.ch) !== -1;\n  },\n\n  was: function(chars) {\n    return chars.indexOf(this.lastCh) !== -1;\n  },\n\n  peek: function(i) {\n    var num = i || 1;\n    return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;\n  },\n\n  isNumber: function(ch) {\n    return ('0' <= ch && ch <= '9');\n  },\n\n  isWhitespace: function(ch) {\n    // IE treats non-breaking space as \\u00A0\n    return (ch === ' ' || ch === '\\r' || ch === '\\t' ||\n            ch === '\\n' || ch === '\\v' || ch === '\\u00A0');\n  },\n\n  isIdent: function(ch) {\n    return ('a' <= ch && ch <= 'z' ||\n            'A' <= ch && ch <= 'Z' ||\n            '_' === ch || ch === '$');\n  },\n\n  isExpOperator: function(ch) {\n    return (ch === '-' || ch === '+' || this.isNumber(ch));\n  },\n\n  throwError: function(error, start, end) {\n    end = end || this.index;\n    var colStr = (isDefined(start)\n            ? 's ' + start +  '-' + this.index + ' [' + this.text.substring(start, end) + ']'\n            : ' ' + end);\n    throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',\n        error, colStr, this.text);\n  },\n\n  readNumber: function() {\n    var number = '';\n    var start = this.index;\n    while (this.index < this.text.length) {\n      var ch = lowercase(this.text.charAt(this.index));\n      if (ch == '.' || this.isNumber(ch)) {\n        number += ch;\n      } else {\n        var peekCh = this.peek();\n        if (ch == 'e' && this.isExpOperator(peekCh)) {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            peekCh && this.isNumber(peekCh) &&\n            number.charAt(number.length - 1) == 'e') {\n          number += ch;\n        } else if (this.isExpOperator(ch) &&\n            (!peekCh || !this.isNumber(peekCh)) &&\n            number.charAt(number.length - 1) == 'e') {\n          this.throwError('Invalid exponent');\n        } else {\n          break;\n        }\n      }\n      this.index++;\n    }\n    number = 1 * number;\n    this.tokens.push({\n      index: start,\n      text: number,\n      literal: true,\n      constant: true,\n      fn: function() { return number; }\n    });\n  },\n\n  readIdent: function() {\n    var parser = this;\n\n    var ident = '';\n    var start = this.index;\n\n    var lastDot, peekIndex, methodName, ch;\n\n    while (this.index < this.text.length) {\n      ch = this.text.charAt(this.index);\n      if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) {\n        if (ch === '.') lastDot = this.index;\n        ident += ch;\n      } else {\n        break;\n      }\n      this.index++;\n    }\n\n    //check if this is not a method invocation and if it is back out to last dot\n    if (lastDot) {\n      peekIndex = this.index;\n      while (peekIndex < this.text.length) {\n        ch = this.text.charAt(peekIndex);\n        if (ch === '(') {\n          methodName = ident.substr(lastDot - start + 1);\n          ident = ident.substr(0, lastDot - start);\n          this.index = peekIndex;\n          break;\n        }\n        if (this.isWhitespace(ch)) {\n          peekIndex++;\n        } else {\n          break;\n        }\n      }\n    }\n\n\n    var token = {\n      index: start,\n      text: ident\n    };\n\n    // OPERATORS is our own object so we don't need to use special hasOwnPropertyFn\n    if (OPERATORS.hasOwnProperty(ident)) {\n      token.fn = OPERATORS[ident];\n      token.literal = true;\n      token.constant = true;\n    } else {\n      var getter = getterFn(ident, this.options, this.text);\n      token.fn = extend(function(self, locals) {\n        return (getter(self, locals));\n      }, {\n        assign: function(self, value) {\n          return setter(self, ident, value, parser.text, parser.options);\n        }\n      });\n    }\n\n    this.tokens.push(token);\n\n    if (methodName) {\n      this.tokens.push({\n        index:lastDot,\n        text: '.'\n      });\n      this.tokens.push({\n        index: lastDot + 1,\n        text: methodName\n      });\n    }\n  },\n\n  readString: function(quote) {\n    var start = this.index;\n    this.index++;\n    var string = '';\n    var rawString = quote;\n    var escape = false;\n    while (this.index < this.text.length) {\n      var ch = this.text.charAt(this.index);\n      rawString += ch;\n      if (escape) {\n        if (ch === 'u') {\n          var hex = this.text.substring(this.index + 1, this.index + 5);\n          if (!hex.match(/[\\da-f]{4}/i))\n            this.throwError('Invalid unicode escape [\\\\u' + hex + ']');\n          this.index += 4;\n          string += String.fromCharCode(parseInt(hex, 16));\n        } else {\n          var rep = ESCAPE[ch];\n          if (rep) {\n            string += rep;\n          } else {\n            string += ch;\n          }\n        }\n        escape = false;\n      } else if (ch === '\\\\') {\n        escape = true;\n      } else if (ch === quote) {\n        this.index++;\n        this.tokens.push({\n          index: start,\n          text: rawString,\n          string: string,\n          literal: true,\n          constant: true,\n          fn: function() { return string; }\n        });\n        return;\n      } else {\n        string += ch;\n      }\n      this.index++;\n    }\n    this.throwError('Unterminated quote', start);\n  }\n};\n\n\n/**\n * @constructor\n */\nvar Parser = function (lexer, $filter, options) {\n  this.lexer = lexer;\n  this.$filter = $filter;\n  this.options = options;\n};\n\nParser.ZERO = extend(function () {\n  return 0;\n}, {\n  constant: true\n});\n\nParser.prototype = {\n  constructor: Parser,\n\n  parse: function (text) {\n    this.text = text;\n\n    this.tokens = this.lexer.lex(text);\n\n    var value = this.statements();\n\n    if (this.tokens.length !== 0) {\n      this.throwError('is an unexpected token', this.tokens[0]);\n    }\n\n    value.literal = !!value.literal;\n    value.constant = !!value.constant;\n\n    return value;\n  },\n\n  primary: function () {\n    var primary;\n    if (this.expect('(')) {\n      primary = this.filterChain();\n      this.consume(')');\n    } else if (this.expect('[')) {\n      primary = this.arrayDeclaration();\n    } else if (this.expect('{')) {\n      primary = this.object();\n    } else {\n      var token = this.expect();\n      primary = token.fn;\n      if (!primary) {\n        this.throwError('not a primary expression', token);\n      }\n      primary.literal = !!token.literal;\n      primary.constant = !!token.constant;\n    }\n\n    var next, context;\n    while ((next = this.expect('(', '[', '.'))) {\n      if (next.text === '(') {\n        primary = this.functionCall(primary, context);\n        context = null;\n      } else if (next.text === '[') {\n        context = primary;\n        primary = this.objectIndex(primary);\n      } else if (next.text === '.') {\n        context = primary;\n        primary = this.fieldAccess(primary);\n      } else {\n        this.throwError('IMPOSSIBLE');\n      }\n    }\n    return primary;\n  },\n\n  throwError: function(msg, token) {\n    throw $parseMinErr('syntax',\n        'Syntax Error: Token \\'{0}\\' {1} at column {2} of the expression [{3}] starting at [{4}].',\n          token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));\n  },\n\n  peekToken: function() {\n    if (this.tokens.length === 0)\n      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\n    return this.tokens[0];\n  },\n\n  peek: function(e1, e2, e3, e4) {\n    if (this.tokens.length > 0) {\n      var token = this.tokens[0];\n      var t = token.text;\n      if (t === e1 || t === e2 || t === e3 || t === e4 ||\n          (!e1 && !e2 && !e3 && !e4)) {\n        return token;\n      }\n    }\n    return false;\n  },\n\n  expect: function(e1, e2, e3, e4){\n    var token = this.peek(e1, e2, e3, e4);\n    if (token) {\n      this.tokens.shift();\n      return token;\n    }\n    return false;\n  },\n\n  consume: function(e1){\n    if (!this.expect(e1)) {\n      this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());\n    }\n  },\n\n  unaryFn: function(fn, right) {\n    return extend(function(self, locals) {\n      return fn(self, locals, right);\n    }, {\n      constant:right.constant\n    });\n  },\n\n  ternaryFn: function(left, middle, right){\n    return extend(function(self, locals){\n      return left(self, locals) ? middle(self, locals) : right(self, locals);\n    }, {\n      constant: left.constant && middle.constant && right.constant\n    });\n  },\n\n  binaryFn: function(left, fn, right) {\n    return extend(function(self, locals) {\n      return fn(self, locals, left, right);\n    }, {\n      constant:left.constant && right.constant\n    });\n  },\n\n  statements: function() {\n    var statements = [];\n    while (true) {\n      if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))\n        statements.push(this.filterChain());\n      if (!this.expect(';')) {\n        // optimize for the common case where there is only one statement.\n        // TODO(size): maybe we should not support multiple statements?\n        return (statements.length === 1)\n            ? statements[0]\n            : function(self, locals) {\n                var value;\n                for (var i = 0; i < statements.length; i++) {\n                  var statement = statements[i];\n                  if (statement) {\n                    value = statement(self, locals);\n                  }\n                }\n                return value;\n              };\n      }\n    }\n  },\n\n  filterChain: function() {\n    var left = this.expression();\n    var token;\n    while (true) {\n      if ((token = this.expect('|'))) {\n        left = this.binaryFn(left, token.fn, this.filter());\n      } else {\n        return left;\n      }\n    }\n  },\n\n  filter: function() {\n    var token = this.expect();\n    var fn = this.$filter(token.text);\n    var argsFn = [];\n    while (true) {\n      if ((token = this.expect(':'))) {\n        argsFn.push(this.expression());\n      } else {\n        var fnInvoke = function(self, locals, input) {\n          var args = [input];\n          for (var i = 0; i < argsFn.length; i++) {\n            args.push(argsFn[i](self, locals));\n          }\n          return fn.apply(self, args);\n        };\n        return function() {\n          return fnInvoke;\n        };\n      }\n    }\n  },\n\n  expression: function() {\n    return this.assignment();\n  },\n\n  assignment: function() {\n    var left = this.ternary();\n    var right;\n    var token;\n    if ((token = this.expect('='))) {\n      if (!left.assign) {\n        this.throwError('implies assignment but [' +\n            this.text.substring(0, token.index) + '] can not be assigned to', token);\n      }\n      right = this.ternary();\n      return function(scope, locals) {\n        return left.assign(scope, right(scope, locals), locals);\n      };\n    }\n    return left;\n  },\n\n  ternary: function() {\n    var left = this.logicalOR();\n    var middle;\n    var token;\n    if ((token = this.expect('?'))) {\n      middle = this.ternary();\n      if ((token = this.expect(':'))) {\n        return this.ternaryFn(left, middle, this.ternary());\n      } else {\n        this.throwError('expected :', token);\n      }\n    } else {\n      return left;\n    }\n  },\n\n  logicalOR: function() {\n    var left = this.logicalAND();\n    var token;\n    while (true) {\n      if ((token = this.expect('||'))) {\n        left = this.binaryFn(left, token.fn, this.logicalAND());\n      } else {\n        return left;\n      }\n    }\n  },\n\n  logicalAND: function() {\n    var left = this.equality();\n    var token;\n    if ((token = this.expect('&&'))) {\n      left = this.binaryFn(left, token.fn, this.logicalAND());\n    }\n    return left;\n  },\n\n  equality: function() {\n    var left = this.relational();\n    var token;\n    if ((token = this.expect('==','!=','===','!=='))) {\n      left = this.binaryFn(left, token.fn, this.equality());\n    }\n    return left;\n  },\n\n  relational: function() {\n    var left = this.additive();\n    var token;\n    if ((token = this.expect('<', '>', '<=', '>='))) {\n      left = this.binaryFn(left, token.fn, this.relational());\n    }\n    return left;\n  },\n\n  additive: function() {\n    var left = this.multiplicative();\n    var token;\n    while ((token = this.expect('+','-'))) {\n      left = this.binaryFn(left, token.fn, this.multiplicative());\n    }\n    return left;\n  },\n\n  multiplicative: function() {\n    var left = this.unary();\n    var token;\n    while ((token = this.expect('*','/','%'))) {\n      left = this.binaryFn(left, token.fn, this.unary());\n    }\n    return left;\n  },\n\n  unary: function() {\n    var token;\n    if (this.expect('+')) {\n      return this.primary();\n    } else if ((token = this.expect('-'))) {\n      return this.binaryFn(Parser.ZERO, token.fn, this.unary());\n    } else if ((token = this.expect('!'))) {\n      return this.unaryFn(token.fn, this.unary());\n    } else {\n      return this.primary();\n    }\n  },\n\n  fieldAccess: function(object) {\n    var parser = this;\n    var field = this.expect().text;\n    var getter = getterFn(field, this.options, this.text);\n\n    return extend(function(scope, locals, self) {\n      return getter(self || object(scope, locals));\n    }, {\n      assign: function(scope, value, locals) {\n        return setter(object(scope, locals), field, value, parser.text, parser.options);\n      }\n    });\n  },\n\n  objectIndex: function(obj) {\n    var parser = this;\n\n    var indexFn = this.expression();\n    this.consume(']');\n\n    return extend(function(self, locals) {\n      var o = obj(self, locals),\n          i = indexFn(self, locals),\n          v, p;\n\n      if (!o) return undefined;\n      v = ensureSafeObject(o[i], parser.text);\n      return v;\n    }, {\n      assign: function(self, value, locals) {\n        var key = indexFn(self, locals);\n        // prevent overwriting of Function.constructor which would break ensureSafeObject check\n        var safe = ensureSafeObject(obj(self, locals), parser.text);\n        return safe[key] = value;\n      }\n    });\n  },\n\n  functionCall: function(fn, contextGetter) {\n    var argsFn = [];\n    if (this.peekToken().text !== ')') {\n      do {\n        argsFn.push(this.expression());\n      } while (this.expect(','));\n    }\n    this.consume(')');\n\n    var parser = this;\n\n    return function(scope, locals) {\n      var args = [];\n      var context = contextGetter ? contextGetter(scope, locals) : scope;\n\n      for (var i = 0; i < argsFn.length; i++) {\n        args.push(argsFn[i](scope, locals));\n      }\n      var fnPtr = fn(scope, locals, context) || noop;\n\n      ensureSafeObject(context, parser.text);\n      ensureSafeObject(fnPtr, parser.text);\n\n      // IE stupidity! (IE doesn't have apply for some native functions)\n      var v = fnPtr.apply\n            ? fnPtr.apply(context, args)\n            : fnPtr(args[0], args[1], args[2], args[3], args[4]);\n\n      return ensureSafeObject(v, parser.text);\n    };\n  },\n\n  // This is used with json array declaration\n  arrayDeclaration: function () {\n    var elementFns = [];\n    var allConstant = true;\n    if (this.peekToken().text !== ']') {\n      do {\n        if (this.peek(']')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        var elementFn = this.expression();\n        elementFns.push(elementFn);\n        if (!elementFn.constant) {\n          allConstant = false;\n        }\n      } while (this.expect(','));\n    }\n    this.consume(']');\n\n    return extend(function(self, locals) {\n      var array = [];\n      for (var i = 0; i < elementFns.length; i++) {\n        array.push(elementFns[i](self, locals));\n      }\n      return array;\n    }, {\n      literal: true,\n      constant: allConstant\n    });\n  },\n\n  object: function () {\n    var keyValues = [];\n    var allConstant = true;\n    if (this.peekToken().text !== '}') {\n      do {\n        if (this.peek('}')) {\n          // Support trailing commas per ES5.1.\n          break;\n        }\n        var token = this.expect(),\n        key = token.string || token.text;\n        this.consume(':');\n        var value = this.expression();\n        keyValues.push({key: key, value: value});\n        if (!value.constant) {\n          allConstant = false;\n        }\n      } while (this.expect(','));\n    }\n    this.consume('}');\n\n    return extend(function(self, locals) {\n      var object = {};\n      for (var i = 0; i < keyValues.length; i++) {\n        var keyValue = keyValues[i];\n        object[keyValue.key] = keyValue.value(self, locals);\n      }\n      return object;\n    }, {\n      literal: true,\n      constant: allConstant\n    });\n  }\n};\n\n\n//////////////////////////////////////////////////\n// Parser helper functions\n//////////////////////////////////////////////////\n\nfunction setter(obj, path, setValue, fullExp, options) {\n  //needed?\n  options = options || {};\n\n  var element = path.split('.'), key;\n  for (var i = 0; element.length > 1; i++) {\n    key = ensureSafeMemberName(element.shift(), fullExp);\n    var propertyObj = obj[key];\n    if (!propertyObj) {\n      propertyObj = {};\n      obj[key] = propertyObj;\n    }\n    obj = propertyObj;\n  }\n  key = ensureSafeMemberName(element.shift(), fullExp);\n  obj[key] = setValue;\n  return setValue;\n}\n\nvar getterFnCache = {};\n\n/**\n * Implementation of the \"Black Hole\" variant from:\n * - http://jsperf.com/angularjs-parse-getter/4\n * - http://jsperf.com/path-evaluation-simplified/7\n */\nfunction cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {\n  ensureSafeMemberName(key0, fullExp);\n  ensureSafeMemberName(key1, fullExp);\n  ensureSafeMemberName(key2, fullExp);\n  ensureSafeMemberName(key3, fullExp);\n  ensureSafeMemberName(key4, fullExp);\n\n  return function cspSafeGetter(scope, locals) {\n    var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope;\n\n    if (pathVal == null) return pathVal;\n    pathVal = pathVal[key0];\n\n    if (!key1) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key1];\n\n    if (!key2) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key2];\n\n    if (!key3) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key3];\n\n    if (!key4) return pathVal;\n    if (pathVal == null) return undefined;\n    pathVal = pathVal[key4];\n\n    return pathVal;\n  };\n}\n\nfunction simpleGetterFn1(key0, fullExp) {\n  ensureSafeMemberName(key0, fullExp);\n\n  return function simpleGetterFn1(scope, locals) {\n    if (scope == null) return undefined;\n    return ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];\n  };\n}\n\nfunction simpleGetterFn2(key0, key1, fullExp) {\n  ensureSafeMemberName(key0, fullExp);\n  ensureSafeMemberName(key1, fullExp);\n\n  return function simpleGetterFn2(scope, locals) {\n    if (scope == null) return undefined;\n    scope = ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];\n    return scope == null ? undefined : scope[key1];\n  };\n}\n\nfunction getterFn(path, options, fullExp) {\n  // Check whether the cache has this getter already.\n  // We can use hasOwnProperty directly on the cache because we ensure,\n  // see below, that the cache never stores a path called 'hasOwnProperty'\n  if (getterFnCache.hasOwnProperty(path)) {\n    return getterFnCache[path];\n  }\n\n  var pathKeys = path.split('.'),\n      pathKeysLength = pathKeys.length,\n      fn;\n\n  // When we have only 1 or 2 tokens, use optimized special case closures.\n  // http://jsperf.com/angularjs-parse-getter/6\n  if (pathKeysLength === 1) {\n    fn = simpleGetterFn1(pathKeys[0], fullExp);\n  } else if (pathKeysLength === 2) {\n    fn = simpleGetterFn2(pathKeys[0], pathKeys[1], fullExp);\n  } else if (options.csp) {\n    if (pathKeysLength < 6) {\n      fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp,\n                          options);\n    } else {\n      fn = function(scope, locals) {\n        var i = 0, val;\n        do {\n          val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++],\n                                pathKeys[i++], fullExp, options)(scope, locals);\n\n          locals = undefined; // clear after first iteration\n          scope = val;\n        } while (i < pathKeysLength);\n        return val;\n      };\n    }\n  } else {\n    var code = 'var p;\\n';\n    forEach(pathKeys, function(key, index) {\n      ensureSafeMemberName(key, fullExp);\n      code += 'if(s == null) return undefined;\\n' +\n              's='+ (index\n                      // we simply dereference 's' on any .dot notation\n                      ? 's'\n                      // but if we are first then we check locals first, and if so read it first\n                      : '((k&&k.hasOwnProperty(\"' + key + '\"))?k:s)') + '[\"' + key + '\"]' + ';\\n';\n    });\n    code += 'return s;';\n\n    /* jshint -W054 */\n    var evaledFnGetter = new Function('s', 'k', code); // s=scope, k=locals\n    /* jshint +W054 */\n    evaledFnGetter.toString = valueFn(code);\n    fn = evaledFnGetter;\n  }\n\n  // Only cache the value if it's not going to mess up the cache object\n  // This is more performant that using Object.prototype.hasOwnProperty.call\n  if (path !== 'hasOwnProperty') {\n    getterFnCache[path] = fn;\n  }\n  return fn;\n}\n\n///////////////////////////////////\n\n/**\n * @ngdoc service\n * @name $parse\n * @kind function\n *\n * @description\n *\n * Converts Angular {@link guide/expression expression} into a function.\n *\n * ```js\n *   var getter = $parse('user.name');\n *   var setter = getter.assign;\n *   var context = {user:{name:'angular'}};\n *   var locals = {user:{name:'local'}};\n *\n *   expect(getter(context)).toEqual('angular');\n *   setter(context, 'newValue');\n *   expect(context.user.name).toEqual('newValue');\n *   expect(getter(context, locals)).toEqual('local');\n * ```\n *\n *\n * @param {string} expression String expression to compile.\n * @returns {function(context, locals)} a function which represents the compiled expression:\n *\n *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n *      are evaluated against (typically a scope object).\n *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n *      `context`.\n *\n *    The returned function also has the following properties:\n *      * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript\n *        literal.\n *      * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript\n *        constant literals.\n *      * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be\n *        set to a function to change its value on the given context.\n *\n */\n\n\n/**\n * @ngdoc provider\n * @name $parseProvider\n * @function\n *\n * @description\n * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}\n *  service.\n */\nfunction $ParseProvider() {\n  var cache = {};\n\n  var $parseOptions = {\n    csp: false\n  };\n\n\n  this.$get = ['$filter', '$sniffer', '$log', function($filter, $sniffer, $log) {\n    $parseOptions.csp = $sniffer.csp;\n\n    return function(exp) {\n      var parsedExpression,\n          oneTime;\n\n      switch (typeof exp) {\n        case 'string':\n\n          if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {\n            oneTime = true;\n            exp = exp.substring(2);\n          }\n\n          if (cache.hasOwnProperty(exp)) {\n            return oneTime ? oneTimeWrapper(cache[exp]) : cache[exp];\n          }\n\n          var lexer = new Lexer($parseOptions);\n          var parser = new Parser(lexer, $filter, $parseOptions);\n          parsedExpression = parser.parse(exp);\n\n          if (exp !== 'hasOwnProperty') {\n            // Only cache the value if it's not going to mess up the cache object\n            // This is more performant that using Object.prototype.hasOwnProperty.call\n            cache[exp] = parsedExpression;\n          }\n\n          if (parsedExpression.constant) {\n            parsedExpression.$$unwatch = true;\n          }\n\n          return oneTime ? oneTimeWrapper(parsedExpression) : parsedExpression;\n\n        case 'function':\n          return exp;\n\n        default:\n          return noop;\n      }\n\n      function oneTimeWrapper(expression) {\n        var stable = false,\n            lastValue;\n        oneTimeParseFn.literal = expression.literal;\n        oneTimeParseFn.constant = expression.constant;\n        oneTimeParseFn.assign = expression.assign;\n        return oneTimeParseFn;\n\n        function oneTimeParseFn(self, locals) {\n          if (!stable) {\n            lastValue = expression(self, locals);\n            oneTimeParseFn.$$unwatch = isDefined(lastValue);\n            if (oneTimeParseFn.$$unwatch && self && self.$$postDigestQueue) {\n              self.$$postDigestQueue.push(function () {\n                // create a copy if the value is defined and it is not a $sce value\n                if ((stable = isDefined(lastValue)) && !lastValue.$$unwrapTrustedValue) {\n                  lastValue = copy(lastValue);\n                }\n              });\n            }\n          }\n          return lastValue;\n        }\n      }\n    };\n  }];\n}\n\n/**\n * @ngdoc service\n * @name $q\n * @requires $rootScope\n *\n * @description\n * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).\n *\n * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\n * interface for interacting with an object that represents the result of an action that is\n * performed asynchronously, and may or may not be finished at any given point in time.\n *\n * From the perspective of dealing with error handling, deferred and promise APIs are to\n * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.\n *\n * ```js\n *   // for the purpose of this example let's assume that variables `$q`, `scope` and `okToGreet`\n *   // are available in the current lexical scope (they could have been injected or passed in).\n *\n *   function asyncGreet(name) {\n *     var deferred = $q.defer();\n *\n *     setTimeout(function() {\n *       // since this fn executes async in a future turn of the event loop, we need to wrap\n *       // our code into an $apply call so that the model changes are properly observed.\n *       scope.$apply(function() {\n *         deferred.notify('About to greet ' + name + '.');\n *\n *         if (okToGreet(name)) {\n *           deferred.resolve('Hello, ' + name + '!');\n *         } else {\n *           deferred.reject('Greeting ' + name + ' is not allowed.');\n *         }\n *       });\n *     }, 1000);\n *\n *     return deferred.promise;\n *   }\n *\n *   var promise = asyncGreet('Robin Hood');\n *   promise.then(function(greeting) {\n *     alert('Success: ' + greeting);\n *   }, function(reason) {\n *     alert('Failed: ' + reason);\n *   }, function(update) {\n *     alert('Got notification: ' + update);\n *   });\n * ```\n *\n * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\n * comes in the way of guarantees that promise and deferred APIs make, see\n * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.\n *\n * Additionally the promise api allows for composition that is very hard to do with the\n * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\n * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\n * section on serial or parallel joining of promises.\n *\n *\n * # The Deferred API\n *\n * A new instance of deferred is constructed by calling `$q.defer()`.\n *\n * The purpose of the deferred object is to expose the associated Promise instance as well as APIs\n * that can be used for signaling the successful or unsuccessful completion, as well as the status\n * of the task.\n *\n * **Methods**\n *\n * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection\n *   constructed via `$q.reject`, the promise will be rejected instead.\n * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to\n *   resolving it with a rejection constructed via `$q.reject`.\n * - `notify(value)` - provides updates on the status of the promise's execution. This may be called\n *   multiple times before the promise is either resolved or rejected.\n *\n * **Properties**\n *\n * - promise – `{Promise}` – promise object associated with this deferred.\n *\n *\n * # The Promise API\n *\n * A new promise instance is created when a deferred instance is created and can be retrieved by\n * calling `deferred.promise`.\n *\n * The purpose of the promise object is to allow for interested parties to get access to the result\n * of the deferred task when it completes.\n *\n * **Methods**\n *\n * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or\n *   will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously\n *   as soon as the result is available. The callbacks are called with a single argument: the result\n *   or rejection reason. Additionally, the notify callback may be called zero or more times to\n *   provide a progress indication, before the promise is resolved or rejected.\n *\n *   This method *returns a new promise* which is resolved or rejected via the return value of the\n *   `successCallback`, `errorCallback`. It also notifies via the return value of the\n *   `notifyCallback` method. The promise can not be resolved or rejected from the notifyCallback\n *   method.\n *\n * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`\n *\n * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,\n *   but to do so without modifying the final value. This is useful to release resources or do some\n *   clean-up that needs to be done whether the promise was rejected or resolved. See the [full\n *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for\n *   more information.\n *\n *   Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as\n *   property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to\n *   make your code IE8 and Android 2.x compatible.\n *\n * # Chaining promises\n *\n * Because calling the `then` method of a promise returns a new derived promise, it is easily\n * possible to create a chain of promises:\n *\n * ```js\n *   promiseB = promiseA.then(function(result) {\n *     return result + 1;\n *   });\n *\n *   // promiseB will be resolved immediately after promiseA is resolved and its value\n *   // will be the result of promiseA incremented by 1\n * ```\n *\n * It is possible to create chains of any length and since a promise can be resolved with another\n * promise (which will defer its resolution further), it is possible to pause/defer resolution of\n * the promises at any point in the chain. This makes it possible to implement powerful APIs like\n * $http's response interceptors.\n *\n *\n * # Differences between Kris Kowal's Q and $q\n *\n *  There are two main differences:\n *\n * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\n *   mechanism in angular, which means faster propagation of resolution or rejection into your\n *   models and avoiding unnecessary browser repaints, which would result in flickering UI.\n * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains\n *   all the important functionality needed for common async tasks.\n *\n *  # Testing\n *\n *  ```js\n *    it('should simulate promise', inject(function($q, $rootScope) {\n *      var deferred = $q.defer();\n *      var promise = deferred.promise;\n *      var resolvedValue;\n *\n *      promise.then(function(value) { resolvedValue = value; });\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Simulate resolving of promise\n *      deferred.resolve(123);\n *      // Note that the 'then' function does not get called synchronously.\n *      // This is because we want the promise API to always be async, whether or not\n *      // it got called synchronously or asynchronously.\n *      expect(resolvedValue).toBeUndefined();\n *\n *      // Propagate promise resolution to 'then' functions using $apply().\n *      $rootScope.$apply();\n *      expect(resolvedValue).toEqual(123);\n *    }));\n *  ```\n */\nfunction $QProvider() {\n\n  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {\n    return qFactory(function(callback) {\n      $rootScope.$evalAsync(callback);\n    }, $exceptionHandler);\n  }];\n}\n\n\n/**\n * Constructs a promise manager.\n *\n * @param {function(Function)} nextTick Function for executing functions in the next turn.\n * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\n *     debugging purposes.\n * @returns {object} Promise manager.\n */\nfunction qFactory(nextTick, exceptionHandler) {\n\n  /**\n   * @ngdoc method\n   * @name $q#defer\n   * @function\n   *\n   * @description\n   * Creates a `Deferred` object which represents a task which will finish in the future.\n   *\n   * @returns {Deferred} Returns a new instance of deferred.\n   */\n  var defer = function() {\n    var pending = [],\n        value, deferred;\n\n    deferred = {\n\n      resolve: function(val) {\n        if (pending) {\n          var callbacks = pending;\n          pending = undefined;\n          value = ref(val);\n\n          if (callbacks.length) {\n            nextTick(function() {\n              var callback;\n              for (var i = 0, ii = callbacks.length; i < ii; i++) {\n                callback = callbacks[i];\n                value.then(callback[0], callback[1], callback[2]);\n              }\n            });\n          }\n        }\n      },\n\n\n      reject: function(reason) {\n        deferred.resolve(createInternalRejectedPromise(reason));\n      },\n\n\n      notify: function(progress) {\n        if (pending) {\n          var callbacks = pending;\n\n          if (pending.length) {\n            nextTick(function() {\n              var callback;\n              for (var i = 0, ii = callbacks.length; i < ii; i++) {\n                callback = callbacks[i];\n                callback[2](progress);\n              }\n            });\n          }\n        }\n      },\n\n\n      promise: {\n        then: function(callback, errback, progressback) {\n          var result = defer();\n\n          var wrappedCallback = function(value) {\n            try {\n              result.resolve((isFunction(callback) ? callback : defaultCallback)(value));\n            } catch(e) {\n              result.reject(e);\n              exceptionHandler(e);\n            }\n          };\n\n          var wrappedErrback = function(reason) {\n            try {\n              result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));\n            } catch(e) {\n              result.reject(e);\n              exceptionHandler(e);\n            }\n          };\n\n          var wrappedProgressback = function(progress) {\n            try {\n              result.notify((isFunction(progressback) ? progressback : defaultCallback)(progress));\n            } catch(e) {\n              exceptionHandler(e);\n            }\n          };\n\n          if (pending) {\n            pending.push([wrappedCallback, wrappedErrback, wrappedProgressback]);\n          } else {\n            value.then(wrappedCallback, wrappedErrback, wrappedProgressback);\n          }\n\n          return result.promise;\n        },\n\n        \"catch\": function(callback) {\n          return this.then(null, callback);\n        },\n\n        \"finally\": function(callback) {\n\n          function makePromise(value, resolved) {\n            var result = defer();\n            if (resolved) {\n              result.resolve(value);\n            } else {\n              result.reject(value);\n            }\n            return result.promise;\n          }\n\n          function handleCallback(value, isResolved) {\n            var callbackOutput = null;\n            try {\n              callbackOutput = (callback ||defaultCallback)();\n            } catch(e) {\n              return makePromise(e, false);\n            }\n            if (callbackOutput && isFunction(callbackOutput.then)) {\n              return callbackOutput.then(function() {\n                return makePromise(value, isResolved);\n              }, function(error) {\n                return makePromise(error, false);\n              });\n            } else {\n              return makePromise(value, isResolved);\n            }\n          }\n\n          return this.then(function(value) {\n            return handleCallback(value, true);\n          }, function(error) {\n            return handleCallback(error, false);\n          });\n        }\n      }\n    };\n\n    return deferred;\n  };\n\n\n  var ref = function(value) {\n    if (value && isFunction(value.then)) return value;\n    return {\n      then: function(callback) {\n        var result = defer();\n        nextTick(function() {\n          result.resolve(callback(value));\n        });\n        return result.promise;\n      }\n    };\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $q#reject\n   * @function\n   *\n   * @description\n   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\n   * used to forward rejection in a chain of promises. If you are dealing with the last promise in\n   * a promise chain, you don't need to worry about it.\n   *\n   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\n   * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\n   * a promise error callback and you want to forward the error to the promise derived from the\n   * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\n   * `reject`.\n   *\n   * ```js\n   *   promiseB = promiseA.then(function(result) {\n   *     // success: do something and resolve promiseB\n   *     //          with the old or a new result\n   *     return result;\n   *   }, function(reason) {\n   *     // error: handle the error if possible and\n   *     //        resolve promiseB with newPromiseOrValue,\n   *     //        otherwise forward the rejection to promiseB\n   *     if (canHandle(reason)) {\n   *      // handle the error and recover\n   *      return newPromiseOrValue;\n   *     }\n   *     return $q.reject(reason);\n   *   });\n   * ```\n   *\n   * @param {*} reason Constant, message, exception or an object representing the rejection reason.\n   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\n   */\n  var reject = function(reason) {\n    var result = defer();\n    result.reject(reason);\n    return result.promise;\n  };\n\n  var createInternalRejectedPromise = function(reason) {\n    return {\n      then: function(callback, errback) {\n        var result = defer();\n        nextTick(function() {\n          try {\n            result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));\n          } catch(e) {\n            result.reject(e);\n            exceptionHandler(e);\n          }\n        });\n        return result.promise;\n      }\n    };\n  };\n\n\n  /**\n   * @ngdoc method\n   * @name $q#when\n   * @function\n   *\n   * @description\n   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\n   * This is useful when you are dealing with an object that might or might not be a promise, or if\n   * the promise comes from a source that can't be trusted.\n   *\n   * @param {*} value Value or a promise\n   * @returns {Promise} Returns a promise of the passed value or promise\n   */\n  var when = function(value, callback, errback, progressback) {\n    var result = defer(),\n        done;\n\n    var wrappedCallback = function(value) {\n      try {\n        return (isFunction(callback) ? callback : defaultCallback)(value);\n      } catch (e) {\n        exceptionHandler(e);\n        return reject(e);\n      }\n    };\n\n    var wrappedErrback = function(reason) {\n      try {\n        return (isFunction(errback) ? errback : defaultErrback)(reason);\n      } catch (e) {\n        exceptionHandler(e);\n        return reject(e);\n      }\n    };\n\n    var wrappedProgressback = function(progress) {\n      try {\n        return (isFunction(progressback) ? progressback : defaultCallback)(progress);\n      } catch (e) {\n        exceptionHandler(e);\n      }\n    };\n\n    nextTick(function() {\n      ref(value).then(function(value) {\n        if (done) return;\n        done = true;\n        result.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback));\n      }, function(reason) {\n        if (done) return;\n        done = true;\n        result.resolve(wrappedErrback(reason));\n      }, function(progress) {\n        if (done) return;\n        result.notify(wrappedProgressback(progress));\n      });\n    });\n\n    return result.promise;\n  };\n\n\n  function defaultCallback(value) {\n    return value;\n  }\n\n\n  function defaultErrback(reason) {\n    return reject(reason);\n  }\n\n\n  /**\n   * @ngdoc method\n   * @name $q#all\n   * @function\n   *\n   * @description\n   * Combines multiple promises into a single promise that is resolved when all of the input\n   * promises are resolved.\n   *\n   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\n   * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,\n   *   each value corresponding to the promise at the same index/key in the `promises` array/hash.\n   *   If any of the promises is resolved with a rejection, this resulting promise will be rejected\n   *   with the same rejection value.\n   */\n  function all(promises) {\n    var deferred = defer(),\n        counter = 0,\n        results = isArray(promises) ? [] : {};\n\n    forEach(promises, function(promise, key) {\n      counter++;\n      ref(promise).then(function(value) {\n        if (results.hasOwnProperty(key)) return;\n        results[key] = value;\n        if (!(--counter)) deferred.resolve(results);\n      }, function(reason) {\n        if (results.hasOwnProperty(key)) return;\n        deferred.reject(reason);\n      });\n    });\n\n    if (counter === 0) {\n      deferred.resolve(results);\n    }\n\n    return deferred.promise;\n  }\n\n  return {\n    defer: defer,\n    reject: reject,\n    when: when,\n    all: all\n  };\n}\n\nfunction $$RAFProvider(){ //rAF\n  this.$get = ['$window', '$timeout', function($window, $timeout) {\n    var requestAnimationFrame = $window.requestAnimationFrame ||\n                                $window.webkitRequestAnimationFrame ||\n                                $window.mozRequestAnimationFrame;\n\n    var cancelAnimationFrame = $window.cancelAnimationFrame ||\n                               $window.webkitCancelAnimationFrame ||\n                               $window.mozCancelAnimationFrame ||\n                               $window.webkitCancelRequestAnimationFrame;\n\n    var rafSupported = !!requestAnimationFrame;\n    var raf = rafSupported\n      ? function(fn) {\n          var id = requestAnimationFrame(fn);\n          return function() {\n            cancelAnimationFrame(id);\n          };\n        }\n      : function(fn) {\n          var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\n          return function() {\n            $timeout.cancel(timer);\n          };\n        };\n\n    raf.supported = rafSupported;\n\n    return raf;\n  }];\n}\n\n/**\n * DESIGN NOTES\n *\n * The design decisions behind the scope are heavily favored for speed and memory consumption.\n *\n * The typical use of scope is to watch the expressions, which most of the time return the same\n * value as last time so we optimize the operation.\n *\n * Closures construction is expensive in terms of speed as well as memory:\n *   - No closures, instead use prototypical inheritance for API\n *   - Internal state needs to be stored on scope directly, which means that private state is\n *     exposed as $$____ properties\n *\n * Loop operations are optimized by using while(count--) { ... }\n *   - this means that in order to keep the same order of execution as addition we have to add\n *     items to the array at the beginning (unshift) instead of at the end (push)\n *\n * Child scopes are created and removed often\n *   - Using an array would be slow since inserts in middle are expensive so we use linked list\n *\n * There are few watches then a lot of observers. This is why you don't want the observer to be\n * implemented in the same way as watch. Watch requires return of initialization function which\n * are expensive to construct.\n */\n\n\n/**\n * @ngdoc provider\n * @name $rootScopeProvider\n * @description\n *\n * Provider for the $rootScope service.\n */\n\n/**\n * @ngdoc method\n * @name $rootScopeProvider#digestTtl\n * @description\n *\n * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and\n * assuming that the model is unstable.\n *\n * The current default is 10 iterations.\n *\n * In complex applications it's possible that the dependencies between `$watch`s will result in\n * several digest iterations. However if an application needs more than the default 10 digest\n * iterations for its model to stabilize then you should investigate what is causing the model to\n * continuously change during the digest.\n *\n * Increasing the TTL could have performance implications, so you should not change it without\n * proper justification.\n *\n * @param {number} limit The number of digest iterations.\n */\n\n\n/**\n * @ngdoc service\n * @name $rootScope\n * @description\n *\n * Every application has a single root {@link ng.$rootScope.Scope scope}.\n * All other scopes are descendant scopes of the root scope. Scopes provide separation\n * between the model and the view, via a mechanism for watching the model for changes.\n * They also provide an event emission/broadcast and subscription facility. See the\n * {@link guide/scope developer guide on scopes}.\n */\nfunction $RootScopeProvider(){\n  var TTL = 10;\n  var $rootScopeMinErr = minErr('$rootScope');\n  var lastDirtyWatch = null;\n\n  this.digestTtl = function(value) {\n    if (arguments.length) {\n      TTL = value;\n    }\n    return TTL;\n  };\n\n  this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',\n      function( $injector,   $exceptionHandler,   $parse,   $browser) {\n\n    /**\n     * @ngdoc type\n     * @name $rootScope.Scope\n     *\n     * @description\n     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\n     * {@link auto.$injector $injector}. Child scopes are created using the\n     * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\n     * compiled HTML template is executed.)\n     *\n     * Here is a simple scope snippet to show how you can interact with the scope.\n     * ```html\n     * <file src=\"./test/ng/rootScopeSpec.js\" tag=\"docs1\" />\n     * ```\n     *\n     * # Inheritance\n     * A scope can inherit from a parent scope, as in this example:\n     * ```js\n         var parent = $rootScope;\n         var child = parent.$new();\n\n         parent.salutation = \"Hello\";\n         child.name = \"World\";\n         expect(child.salutation).toEqual('Hello');\n\n         child.salutation = \"Welcome\";\n         expect(child.salutation).toEqual('Welcome');\n         expect(parent.salutation).toEqual('Hello');\n     * ```\n     *\n     *\n     * @param {Object.<string, function()>=} providers Map of service factory which need to be\n     *                                       provided for the current scope. Defaults to {@link ng}.\n     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\n     *                              append/override services provided by `providers`. This is handy\n     *                              when unit-testing and having the need to override a default\n     *                              service.\n     * @returns {Object} Newly created scope.\n     *\n     */\n    function Scope() {\n      this.$id = nextUid();\n      this.$$phase = this.$parent = this.$$watchers =\n                     this.$$nextSibling = this.$$prevSibling =\n                     this.$$childHead = this.$$childTail = null;\n      this['this'] = this.$root =  this;\n      this.$$destroyed = false;\n      this.$$asyncQueue = [];\n      this.$$postDigestQueue = [];\n      this.$$listeners = {};\n      this.$$listenerCount = {};\n      this.$$isolateBindings = {};\n    }\n\n    /**\n     * @ngdoc property\n     * @name $rootScope.Scope#$id\n     * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for\n     *   debugging.\n     */\n\n\n    Scope.prototype = {\n      constructor: Scope,\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$new\n       * @function\n       *\n       * @description\n       * Creates a new child {@link ng.$rootScope.Scope scope}.\n       *\n       * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and\n       * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the\n       * scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\n       *\n       * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is\n       * desired for the scope and its child scopes to be permanently detached from the parent and\n       * thus stop participating in model change detection and listener notification by invoking.\n       *\n       * @param {boolean} isolate If true, then the scope does not prototypically inherit from the\n       *         parent scope. The scope is isolated, as it can not see parent scope properties.\n       *         When creating widgets, it is useful for the widget to not accidentally read parent\n       *         state.\n       *\n       * @returns {Object} The newly created child scope.\n       *\n       */\n      $new: function(isolate) {\n        var ChildScope,\n            child;\n\n        if (isolate) {\n          child = new Scope();\n          child.$root = this.$root;\n          // ensure that there is just one async queue per $rootScope and its children\n          child.$$asyncQueue = this.$$asyncQueue;\n          child.$$postDigestQueue = this.$$postDigestQueue;\n        } else {\n          // Only create a child scope class if somebody asks for one,\n          // but cache it to allow the VM to optimize lookups.\n          if (!this.$$childScopeClass) {\n            this.$$childScopeClass = function() {\n              this.$$watchers = this.$$nextSibling =\n                  this.$$childHead = this.$$childTail = null;\n              this.$$listeners = {};\n              this.$$listenerCount = {};\n              this.$id = nextUid();\n              this.$$childScopeClass = null;\n            };\n            this.$$childScopeClass.prototype = this;\n          }\n          child = new this.$$childScopeClass();\n        }\n        child['this'] = child;\n        child.$parent = this;\n        child.$$prevSibling = this.$$childTail;\n        if (this.$$childHead) {\n          this.$$childTail.$$nextSibling = child;\n          this.$$childTail = child;\n        } else {\n          this.$$childHead = this.$$childTail = child;\n        }\n        return child;\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watch\n       * @function\n       *\n       * @description\n       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\n       *\n       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest\n       *   $digest()} and should return the value that will be watched. (Since\n       *   {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the\n       *   `watchExpression` can execute multiple times per\n       *   {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)\n       * - The `listener` is called only when the value from the current `watchExpression` and the\n       *   previous call to `watchExpression` are not equal (with the exception of the initial run,\n       *   see below). The inequality is determined according to\n       *   {@link angular.equals} function. To save the value of the object for later comparison,\n       *   the {@link angular.copy} function is used. It also means that watching complex options\n       *   will have adverse memory and performance implications.\n       * - The watch `listener` may change the model, which may trigger other `listener`s to fire.\n       *   This is achieved by rerunning the watchers until no changes are detected. The rerun\n       *   iteration limit is 10 to prevent an infinite loop deadlock.\n       *\n       *\n       * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\n       * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`\n       * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a\n       * change is detected, be prepared for multiple calls to your listener.)\n       *\n       * After a watcher is registered with the scope, the `listener` fn is called asynchronously\n       * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\n       * watcher. In rare cases, this is undesirable because the listener is called when the result\n       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\n       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\n       * listener was called due to initialization.\n       *\n       * The example below contains an illustration of using a function as your $watch listener\n       *\n       *\n       * # Example\n       * ```js\n           // let's assume that scope was dependency injected as the $rootScope\n           var scope = $rootScope;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // no variable change\n           expect(scope.counter).toEqual(0);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(1);\n\n\n\n           // Using a listener function\n           var food;\n           scope.foodCounter = 0;\n           expect(scope.foodCounter).toEqual(0);\n           scope.$watch(\n             // This is the listener function\n             function() { return food; },\n             // This is the change handler\n             function(newValue, oldValue) {\n               if ( newValue !== oldValue ) {\n                 // Only increment the counter if the value changed\n                 scope.foodCounter = scope.foodCounter + 1;\n               }\n             }\n           );\n           // No digest has been run so the counter will be zero\n           expect(scope.foodCounter).toEqual(0);\n\n           // Run the digest but since food has not changed count will still be zero\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(0);\n\n           // Update food and run digest.  Now the counter will increment\n           food = 'cheeseburger';\n           scope.$digest();\n           expect(scope.foodCounter).toEqual(1);\n\n       * ```\n       *\n       *\n       *\n       * @param {(function()|string)} watchExpression Expression that is evaluated on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers\n       *    a call to the `listener`.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(scope)`: called with current `scope` as a parameter.\n       * @param {(function()|string)=} listener Callback called whenever the return value of\n       *   the `watchExpression` changes.\n       *\n       *    - `string`: Evaluated as {@link guide/expression expression}\n       *    - `function(newValue, oldValue, scope)`: called with current and previous values as\n       *      parameters.\n       *\n       * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of\n       *     comparing for reference equality.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $watch: function(watchExp, listener, objectEquality) {\n        var scope = this,\n            get = compileToFn(watchExp, 'watch'),\n            array = scope.$$watchers,\n            watcher = {\n              fn: listener,\n              last: initWatchVal,\n              get: get,\n              exp: watchExp,\n              eq: !!objectEquality\n            };\n\n        lastDirtyWatch = null;\n\n        // in the case user pass string, we need to compile it, do we really need this ?\n        if (!isFunction(listener)) {\n          var listenFn = compileToFn(listener || noop, 'listener');\n          watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);};\n        }\n\n        if (!array) {\n          array = scope.$$watchers = [];\n        }\n        // we use unshift since we use a while loop in $digest for speed.\n        // the while loop reads in reverse order.\n        array.unshift(watcher);\n\n        return function deregisterWatch() {\n          arrayRemove(array, watcher);\n          lastDirtyWatch = null;\n        };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchGroup\n       * @function\n       *\n       * @description\n       * A variant of {@link ng.$rootScope.Scope#$watch $watch()} where it watches an array of `watchExpressions`.\n       * If any one expression in the collection changes the `listener` is executed.\n       *\n       * - The items in the `watchCollection` array are observed via standard $watch operation and are examined on every\n       *   call to $digest() to see if any items changes.\n       * - The `listener` is called whenever any expression in the `watchExpressions` array changes.\n       *\n       * @param {Array.<string|Function(scope)>} watchExpressions Array of expressions that will be individually\n       * watched using {@link ng.$rootScope.Scope#$watch $watch()}\n       *\n       * @param {function(newValues, oldValues, scope)} listener Callback called whenever the return value of any\n       *    expression in `watchExpressions` changes\n       *    The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching\n       *    those of `watchExpression`\n       *    The `scope` refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for all listeners.\n       */\n      $watchGroup: function(watchExpressions, listener) {\n        var oldValues = new Array(watchExpressions.length);\n        var newValues = new Array(watchExpressions.length);\n        var deregisterFns = [];\n        var changeCount = 0;\n        var self = this;\n        var unwatchFlags = new Array(watchExpressions.length);\n        var unwatchCount = watchExpressions.length;\n\n        forEach(watchExpressions, function (expr, i) {\n          var exprFn = $parse(expr);\n          deregisterFns.push(self.$watch(exprFn, function (value, oldValue) {\n            newValues[i] = value;\n            oldValues[i] = oldValue;\n            changeCount++;\n            if (unwatchFlags[i] && !exprFn.$$unwatch) unwatchCount++;\n            if (!unwatchFlags[i] && exprFn.$$unwatch) unwatchCount--;\n            unwatchFlags[i] = exprFn.$$unwatch;\n          }));\n        }, this);\n\n        deregisterFns.push(self.$watch(watchGroupFn, function () {\n          listener(newValues, oldValues, self);\n          if (unwatchCount === 0) {\n            watchGroupFn.$$unwatch = true;\n          } else {\n            watchGroupFn.$$unwatch = false;\n          }\n        }));\n\n        return function deregisterWatchGroup() {\n          forEach(deregisterFns, function (fn) {\n            fn();\n          });\n        };\n\n        function watchGroupFn() {return changeCount;}\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$watchCollection\n       * @function\n       *\n       * @description\n       * Shallow watches the properties of an object and fires whenever any of the properties change\n       * (for arrays, this implies watching the array items; for object maps, this implies watching\n       * the properties). If a change is detected, the `listener` callback is fired.\n       *\n       * - The `obj` collection is observed via standard $watch operation and is examined on every\n       *   call to $digest() to see if any items have been added, removed, or moved.\n       * - The `listener` is called whenever anything within the `obj` has changed. Examples include\n       *   adding, removing, and moving items belonging to an object or array.\n       *\n       *\n       * # Example\n       * ```js\n          $scope.names = ['igor', 'matias', 'misko', 'james'];\n          $scope.dataCount = 4;\n\n          $scope.$watchCollection('names', function(newNames, oldNames) {\n            $scope.dataCount = newNames.length;\n          });\n\n          expect($scope.dataCount).toEqual(4);\n          $scope.$digest();\n\n          //still at 4 ... no changes\n          expect($scope.dataCount).toEqual(4);\n\n          $scope.names.pop();\n          $scope.$digest();\n\n          //now there's been a change\n          expect($scope.dataCount).toEqual(3);\n       * ```\n       *\n       *\n       * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The\n       *    expression value should evaluate to an object or an array which is observed on each\n       *    {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the\n       *    collection will trigger a call to the `listener`.\n       *\n       * @param {function(newCollection, oldCollection, scope)} listener a callback function called\n       *    when a change is detected.\n       *    - The `newCollection` object is the newly modified data obtained from the `obj` expression\n       *    - The `oldCollection` object is a copy of the former collection data.\n       *      Due to performance considerations, the`oldCollection` value is computed only if the\n       *      `listener` function declares two or more arguments.\n       *    - The `scope` argument refers to the current scope.\n       *\n       * @returns {function()} Returns a de-registration function for this listener. When the\n       *    de-registration function is executed, the internal watch operation is terminated.\n       */\n      $watchCollection: function(obj, listener) {\n        var self = this;\n        // the current value, updated on each dirty-check run\n        var newValue;\n        // a shallow copy of the newValue from the last dirty-check run,\n        // updated to match newValue during dirty-check run\n        var oldValue;\n        // a shallow copy of the newValue from when the last change happened\n        var veryOldValue;\n        // only track veryOldValue if the listener is asking for it\n        var trackVeryOldValue = (listener.length > 1);\n        var changeDetected = 0;\n        var objGetter = $parse(obj);\n        var internalArray = [];\n        var internalObject = {};\n        var initRun = true;\n        var oldLength = 0;\n\n        function $watchCollectionWatch() {\n          newValue = objGetter(self);\n          var newLength, key;\n\n          if (!isObject(newValue)) { // if primitive\n            if (oldValue !== newValue) {\n              oldValue = newValue;\n              changeDetected++;\n            }\n          } else if (isArrayLike(newValue)) {\n            if (oldValue !== internalArray) {\n              // we are transitioning from something which was not an array into array.\n              oldValue = internalArray;\n              oldLength = oldValue.length = 0;\n              changeDetected++;\n            }\n\n            newLength = newValue.length;\n\n            if (oldLength !== newLength) {\n              // if lengths do not match we need to trigger change notification\n              changeDetected++;\n              oldValue.length = oldLength = newLength;\n            }\n            // copy the items to oldValue and look for changes.\n            for (var i = 0; i < newLength; i++) {\n              var bothNaN = (oldValue[i] !== oldValue[i]) &&\n                  (newValue[i] !== newValue[i]);\n              if (!bothNaN && (oldValue[i] !== newValue[i])) {\n                changeDetected++;\n                oldValue[i] = newValue[i];\n              }\n            }\n          } else {\n            if (oldValue !== internalObject) {\n              // we are transitioning from something which was not an object into object.\n              oldValue = internalObject = {};\n              oldLength = 0;\n              changeDetected++;\n            }\n            // copy the items to oldValue and look for changes.\n            newLength = 0;\n            for (key in newValue) {\n              if (newValue.hasOwnProperty(key)) {\n                newLength++;\n                if (oldValue.hasOwnProperty(key)) {\n                  if (oldValue[key] !== newValue[key]) {\n                    changeDetected++;\n                    oldValue[key] = newValue[key];\n                  }\n                } else {\n                  oldLength++;\n                  oldValue[key] = newValue[key];\n                  changeDetected++;\n                }\n              }\n            }\n            if (oldLength > newLength) {\n              // we used to have more keys, need to find them and destroy them.\n              changeDetected++;\n              for(key in oldValue) {\n                if (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) {\n                  oldLength--;\n                  delete oldValue[key];\n                }\n              }\n            }\n          }\n          $watchCollectionWatch.$$unwatch = objGetter.$$unwatch;\n          return changeDetected;\n        }\n\n        function $watchCollectionAction() {\n          if (initRun) {\n            initRun = false;\n            listener(newValue, newValue, self);\n          } else {\n            listener(newValue, veryOldValue, self);\n          }\n\n          // make a copy for the next time a collection is changed\n          if (trackVeryOldValue) {\n            if (!isObject(newValue)) {\n              //primitive\n              veryOldValue = newValue;\n            } else if (isArrayLike(newValue)) {\n              veryOldValue = new Array(newValue.length);\n              for (var i = 0; i < newValue.length; i++) {\n                veryOldValue[i] = newValue[i];\n              }\n            } else { // if object\n              veryOldValue = {};\n              for (var key in newValue) {\n                if (hasOwnProperty.call(newValue, key)) {\n                  veryOldValue[key] = newValue[key];\n                }\n              }\n            }\n          }\n        }\n\n        return this.$watch($watchCollectionWatch, $watchCollectionAction);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$digest\n       * @function\n       *\n       * @description\n       * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and\n       * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change\n       * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}\n       * until no more listeners are firing. This means that it is possible to get into an infinite\n       * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of\n       * iterations exceeds 10.\n       *\n       * Usually, you don't call `$digest()` directly in\n       * {@link ng.directive:ngController controllers} or in\n       * {@link ng.$compileProvider#directive directives}.\n       * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within\n       * a {@link ng.$compileProvider#directive directive}), which will force a `$digest()`.\n       *\n       * If you want to be notified whenever `$digest()` is called,\n       * you can register a `watchExpression` function with\n       * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.\n       *\n       * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.\n       *\n       * # Example\n       * ```js\n           var scope = ...;\n           scope.name = 'misko';\n           scope.counter = 0;\n\n           expect(scope.counter).toEqual(0);\n           scope.$watch('name', function(newValue, oldValue) {\n             scope.counter = scope.counter + 1;\n           });\n           expect(scope.counter).toEqual(0);\n\n           scope.$digest();\n           // no variable change\n           expect(scope.counter).toEqual(0);\n\n           scope.name = 'adam';\n           scope.$digest();\n           expect(scope.counter).toEqual(1);\n       * ```\n       *\n       */\n      $digest: function() {\n        var watch, value, last,\n            watchers,\n            asyncQueue = this.$$asyncQueue,\n            postDigestQueue = this.$$postDigestQueue,\n            length,\n            dirty, ttl = TTL,\n            next, current, target = this,\n            watchLog = [],\n            stableWatchesCandidates = [],\n            logIdx, logMsg, asyncTask;\n\n        beginPhase('$digest');\n\n        lastDirtyWatch = null;\n\n        do { // \"while dirty\" loop\n          dirty = false;\n          current = target;\n\n          while(asyncQueue.length) {\n            try {\n              asyncTask = asyncQueue.shift();\n              asyncTask.scope.$eval(asyncTask.expression);\n            } catch (e) {\n              clearPhase();\n              $exceptionHandler(e);\n            }\n            lastDirtyWatch = null;\n          }\n\n          traverseScopesLoop:\n          do { // \"traverse the scopes\" loop\n            if ((watchers = current.$$watchers)) {\n              // process our watches\n              length = watchers.length;\n              while (length--) {\n                try {\n                  watch = watchers[length];\n                  // Most common watches are on primitives, in which case we can short\n                  // circuit it with === operator, only when === fails do we use .equals\n                  if (watch) {\n                    if ((value = watch.get(current)) !== (last = watch.last) &&\n                        !(watch.eq\n                            ? equals(value, last)\n                            : (typeof value == 'number' && typeof last == 'number'\n                               && isNaN(value) && isNaN(last)))) {\n                      dirty = true;\n                      lastDirtyWatch = watch;\n                      watch.last = watch.eq ? copy(value) : value;\n                      watch.fn(value, ((last === initWatchVal) ? value : last), current);\n                      if (ttl < 5) {\n                        logIdx = 4 - ttl;\n                        if (!watchLog[logIdx]) watchLog[logIdx] = [];\n                        logMsg = (isFunction(watch.exp))\n                            ? 'fn: ' + (watch.exp.name || watch.exp.toString())\n                            : watch.exp;\n                        logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);\n                        watchLog[logIdx].push(logMsg);\n                      }\n                      if (watch.get.$$unwatch) stableWatchesCandidates.push({watch: watch, array: watchers});\n                    } else if (watch === lastDirtyWatch) {\n                      // If the most recently dirty watcher is now clean, short circuit since the remaining watchers\n                      // have already been tested.\n                      dirty = false;\n                      break traverseScopesLoop;\n                    }\n                  }\n                } catch (e) {\n                  clearPhase();\n                  $exceptionHandler(e);\n                }\n              }\n            }\n\n            // Insanity Warning: scope depth-first traversal\n            // yes, this code is a bit crazy, but it works and we have tests to prove it!\n            // this piece should be kept in sync with the traversal in $broadcast\n            if (!(next = (current.$$childHead ||\n                (current !== target && current.$$nextSibling)))) {\n              while(current !== target && !(next = current.$$nextSibling)) {\n                current = current.$parent;\n              }\n            }\n          } while ((current = next));\n\n          // `break traverseScopesLoop;` takes us to here\n\n          if((dirty || asyncQueue.length) && !(ttl--)) {\n            clearPhase();\n            throw $rootScopeMinErr('infdig',\n                '{0} $digest() iterations reached. Aborting!\\n' +\n                'Watchers fired in the last 5 iterations: {1}',\n                TTL, toJson(watchLog));\n          }\n\n        } while (dirty || asyncQueue.length);\n\n        clearPhase();\n\n        while(postDigestQueue.length) {\n          try {\n            postDigestQueue.shift()();\n          } catch (e) {\n            $exceptionHandler(e);\n          }\n        }\n\n        for (length = stableWatchesCandidates.length - 1; length >= 0; --length) {\n          var candidate = stableWatchesCandidates[length];\n          if (candidate.watch.get.$$unwatch) {\n            arrayRemove(candidate.array, candidate.watch);\n          }\n        }\n      },\n\n\n      /**\n       * @ngdoc event\n       * @name $rootScope.Scope#$destroy\n       * @eventType broadcast on scope being destroyed\n       *\n       * @description\n       * Broadcasted when a scope and its children are being destroyed.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$destroy\n       * @function\n       *\n       * @description\n       * Removes the current scope (and all of its children) from the parent scope. Removal implies\n       * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\n       * propagate to the current scope and its children. Removal also implies that the current\n       * scope is eligible for garbage collection.\n       *\n       * The `$destroy()` is usually used by directives such as\n       * {@link ng.directive:ngRepeat ngRepeat} for managing the\n       * unrolling of the loop.\n       *\n       * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.\n       * Application code can register a `$destroy` event handler that will give it a chance to\n       * perform any necessary cleanup.\n       *\n       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\n       * clean up DOM bindings before an element is removed from the DOM.\n       */\n      $destroy: function() {\n        // we can't destroy the root scope or a scope that has been already destroyed\n        if (this.$$destroyed) return;\n        var parent = this.$parent;\n\n        this.$broadcast('$destroy');\n        this.$$destroyed = true;\n        if (this === $rootScope) return;\n\n        forEach(this.$$listenerCount, bind(null, decrementListenerCount, this));\n\n        // sever all the references to parent scopes (after this cleanup, the current scope should\n        // not be retained by any of our references and should be eligible for garbage collection)\n        if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;\n        if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;\n        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\n        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\n\n\n        // All of the code below is bogus code that works around V8's memory leak via optimized code\n        // and inline caches.\n        //\n        // see:\n        // - https://code.google.com/p/v8/issues/detail?id=2073#c26\n        // - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909\n        // - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451\n\n        this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =\n            this.$$childTail = this.$root = null;\n\n        // don't reset these to null in case some async task tries to register a listener/watch/task\n        this.$$listeners = {};\n        this.$$watchers = this.$$asyncQueue = this.$$postDigestQueue = [];\n\n        // prevent NPEs since these methods have references to properties we nulled out\n        this.$destroy = this.$digest = this.$apply = noop;\n        this.$on = this.$watch = this.$watchGroup = function() { return noop; };\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$eval\n       * @function\n       *\n       * @description\n       * Executes the `expression` on the current scope and returns the result. Any exceptions in\n       * the expression are propagated (uncaught). This is useful when evaluating Angular\n       * expressions.\n       *\n       * # Example\n       * ```js\n           var scope = ng.$rootScope.Scope();\n           scope.a = 1;\n           scope.b = 2;\n\n           expect(scope.$eval('a+b')).toEqual(3);\n           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\n       * ```\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       * @param {(object)=} locals Local variables object, useful for overriding values in scope.\n       * @returns {*} The result of evaluating the expression.\n       */\n      $eval: function(expr, locals) {\n        return $parse(expr)(this, locals);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$evalAsync\n       * @function\n       *\n       * @description\n       * Executes the expression on the current scope at a later point in time.\n       *\n       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only\n       * that:\n       *\n       *   - it will execute after the function that scheduled the evaluation (preferably before DOM\n       *     rendering).\n       *   - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\n       *     `expression` execution.\n       *\n       * Any exceptions from the execution of the expression are forwarded to the\n       * {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle\n       * will be scheduled. However, it is encouraged to always call code that changes the model\n       * from within an `$apply` call. That includes code evaluated via `$evalAsync`.\n       *\n       * @param {(string|function())=} expression An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with the current `scope` parameter.\n       *\n       */\n      $evalAsync: function(expr) {\n        // if we are outside of an $digest loop and this is the first time we are scheduling async\n        // task also schedule async auto-flush\n        if (!$rootScope.$$phase && !$rootScope.$$asyncQueue.length) {\n          $browser.defer(function() {\n            if ($rootScope.$$asyncQueue.length) {\n              $rootScope.$digest();\n            }\n          });\n        }\n\n        this.$$asyncQueue.push({scope: this, expression: expr});\n      },\n\n      $$postDigest : function(fn) {\n        this.$$postDigestQueue.push(fn);\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$apply\n       * @function\n       *\n       * @description\n       * `$apply()` is used to execute an expression in angular from outside of the angular\n       * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).\n       * Because we are calling into the angular framework we need to perform proper scope life\n       * cycle of {@link ng.$exceptionHandler exception handling},\n       * {@link ng.$rootScope.Scope#$digest executing watches}.\n       *\n       * ## Life cycle\n       *\n       * # Pseudo-Code of `$apply()`\n       * ```js\n           function $apply(expr) {\n             try {\n               return $eval(expr);\n             } catch (e) {\n               $exceptionHandler(e);\n             } finally {\n               $root.$digest();\n             }\n           }\n       * ```\n       *\n       *\n       * Scope's `$apply()` method transitions through the following stages:\n       *\n       * 1. The {@link guide/expression expression} is executed using the\n       *    {@link ng.$rootScope.Scope#$eval $eval()} method.\n       * 2. Any exceptions from the execution of the expression are forwarded to the\n       *    {@link ng.$exceptionHandler $exceptionHandler} service.\n       * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the\n       *    expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\n       *\n       *\n       * @param {(string|function())=} exp An angular expression to be executed.\n       *\n       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.\n       *    - `function(scope)`: execute the function with current `scope` parameter.\n       *\n       * @returns {*} The result of evaluating the expression.\n       */\n      $apply: function(expr) {\n        try {\n          beginPhase('$apply');\n          return this.$eval(expr);\n        } catch (e) {\n          $exceptionHandler(e);\n        } finally {\n          clearPhase();\n          try {\n            $rootScope.$digest();\n          } catch (e) {\n            $exceptionHandler(e);\n            throw e;\n          }\n        }\n      },\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$on\n       * @function\n       *\n       * @description\n       * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for\n       * discussion of event life cycle.\n       *\n       * The event listener function format is: `function(event, args...)`. The `event` object\n       * passed into the listener has the following attributes:\n       *\n       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or\n       *     `$broadcast`-ed.\n       *   - `currentScope` - `{Scope}`: the scope that is currently handling the event. Once the\n       *     event propagates through the scope hierarchy, this property is set to null.\n       *   - `name` - `{string}`: name of the event.\n       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel\n       *     further event propagation (available only for events that were `$emit`-ed).\n       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag\n       *     to true.\n       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.\n       *\n       * @param {string} name Event name to listen on.\n       * @param {function(event, ...args)} listener Function to call when the event is emitted.\n       * @returns {function()} Returns a deregistration function for this listener.\n       */\n      $on: function(name, listener) {\n        var namedListeners = this.$$listeners[name];\n        if (!namedListeners) {\n          this.$$listeners[name] = namedListeners = [];\n        }\n        namedListeners.push(listener);\n\n        var current = this;\n        do {\n          if (!current.$$listenerCount[name]) {\n            current.$$listenerCount[name] = 0;\n          }\n          current.$$listenerCount[name]++;\n        } while ((current = current.$parent));\n\n        var self = this;\n        return function() {\n          namedListeners[indexOf(namedListeners, listener)] = null;\n          decrementListenerCount(self, 1, name);\n        };\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$emit\n       * @function\n       *\n       * @description\n       * Dispatches an event `name` upwards through the scope hierarchy notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$emit` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event traverses upwards toward the root scope and calls all\n       * registered listeners along the way. The event will stop propagating if one of the listeners\n       * cancels it.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to emit.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).\n       */\n      $emit: function(name, args) {\n        var empty = [],\n            namedListeners,\n            scope = this,\n            stopPropagation = false,\n            event = {\n              name: name,\n              targetScope: scope,\n              stopPropagation: function() {stopPropagation = true;},\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            i, length;\n\n        do {\n          namedListeners = scope.$$listeners[name] || empty;\n          event.currentScope = scope;\n          for (i=0, length=namedListeners.length; i<length; i++) {\n\n            // if listeners were deregistered, defragment the array\n            if (!namedListeners[i]) {\n              namedListeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n            try {\n              //allow all listeners attached to the current scope to run\n              namedListeners[i].apply(null, listenerArgs);\n            } catch (e) {\n              $exceptionHandler(e);\n            }\n          }\n          //if any listener on the current scope stops propagation, prevent bubbling\n          if (stopPropagation) {\n            event.currentScope = null;\n            return event;\n          }\n          //traverse upwards\n          scope = scope.$parent;\n        } while (scope);\n\n        event.currentScope = null;\n\n        return event;\n      },\n\n\n      /**\n       * @ngdoc method\n       * @name $rootScope.Scope#$broadcast\n       * @function\n       *\n       * @description\n       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\n       * registered {@link ng.$rootScope.Scope#$on} listeners.\n       *\n       * The event life cycle starts at the scope on which `$broadcast` was called. All\n       * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\n       * notified. Afterwards, the event propagates to all direct and indirect scopes of the current\n       * scope and calls all registered listeners along the way. The event cannot be canceled.\n       *\n       * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\n       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\n       *\n       * @param {string} name Event name to broadcast.\n       * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\n       * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\n       */\n      $broadcast: function(name, args) {\n        var target = this,\n            current = target,\n            next = target,\n            event = {\n              name: name,\n              targetScope: target,\n              preventDefault: function() {\n                event.defaultPrevented = true;\n              },\n              defaultPrevented: false\n            },\n            listenerArgs = concat([event], arguments, 1),\n            listeners, i, length;\n\n        //down while you can, then up and next sibling or up and next sibling until back at root\n        while ((current = next)) {\n          event.currentScope = current;\n          listeners = current.$$listeners[name] || [];\n          for (i=0, length = listeners.length; i<length; i++) {\n            // if listeners were deregistered, defragment the array\n            if (!listeners[i]) {\n              listeners.splice(i, 1);\n              i--;\n              length--;\n              continue;\n            }\n\n            try {\n              listeners[i].apply(null, listenerArgs);\n            } catch(e) {\n              $exceptionHandler(e);\n            }\n          }\n\n          // Insanity Warning: scope depth-first traversal\n          // yes, this code is a bit crazy, but it works and we have tests to prove it!\n          // this piece should be kept in sync with the traversal in $digest\n          // (though it differs due to having the extra check for $$listenerCount)\n          if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||\n              (current !== target && current.$$nextSibling)))) {\n            while(current !== target && !(next = current.$$nextSibling)) {\n              current = current.$parent;\n            }\n          }\n        }\n\n        event.currentScope = null;\n        return event;\n      }\n    };\n\n    var $rootScope = new Scope();\n\n    return $rootScope;\n\n\n    function beginPhase(phase) {\n      if ($rootScope.$$phase) {\n        throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);\n      }\n\n      $rootScope.$$phase = phase;\n    }\n\n    function clearPhase() {\n      $rootScope.$$phase = null;\n    }\n\n    function compileToFn(exp, name) {\n      var fn = $parse(exp);\n      assertArgFn(fn, name);\n      return fn;\n    }\n\n    function decrementListenerCount(current, count, name) {\n      do {\n        current.$$listenerCount[name] -= count;\n\n        if (current.$$listenerCount[name] === 0) {\n          delete current.$$listenerCount[name];\n        }\n      } while ((current = current.$parent));\n    }\n\n    /**\n     * function used as an initial value for watchers.\n     * because it's unique we can easily tell it apart from other values\n     */\n    function initWatchVal() {}\n  }];\n}\n\n/**\n * @description\n * Private service to sanitize uris for links and images. Used by $compile and $sanitize.\n */\nfunction $$SanitizeUriProvider() {\n  var aHrefSanitizationWhitelist = /^\\s*(https?|ftp|mailto|tel|file):/,\n    imgSrcSanitizationWhitelist = /^\\s*(https?|ftp|file|blob):|data:image\\//;\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during a[href] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.aHrefSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      aHrefSanitizationWhitelist = regexp;\n      return this;\n    }\n    return aHrefSanitizationWhitelist;\n  };\n\n\n  /**\n   * @description\n   * Retrieves or overrides the default regular expression that is used for whitelisting of safe\n   * urls during img[src] sanitization.\n   *\n   * The sanitization is a security measure aimed at prevent XSS attacks via html links.\n   *\n   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\n   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\n   * regular expression. If a match is found, the original url is written into the dom. Otherwise,\n   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\n   *\n   * @param {RegExp=} regexp New regexp to whitelist urls with.\n   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\n   *    chaining otherwise.\n   */\n  this.imgSrcSanitizationWhitelist = function(regexp) {\n    if (isDefined(regexp)) {\n      imgSrcSanitizationWhitelist = regexp;\n      return this;\n    }\n    return imgSrcSanitizationWhitelist;\n  };\n\n  this.$get = function() {\n    return function sanitizeUri(uri, isImage) {\n      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;\n      var normalizedVal;\n      // NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case.\n      if (!msie || msie >= 8 ) {\n        normalizedVal = urlResolve(uri).href;\n        if (normalizedVal !== '' && !normalizedVal.match(regex)) {\n          return 'unsafe:'+normalizedVal;\n        }\n      }\n      return uri;\n    };\n  };\n}\n\nvar $sceMinErr = minErr('$sce');\n\nvar SCE_CONTEXTS = {\n  HTML: 'html',\n  CSS: 'css',\n  URL: 'url',\n  // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a\n  // url.  (e.g. ng-include, script src, templateUrl)\n  RESOURCE_URL: 'resourceUrl',\n  JS: 'js'\n};\n\n// Helper functions follow.\n\n// Copied from:\n// http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962\n// Prereq: s is a string.\nfunction escapeForRegexp(s) {\n  return s.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g, '\\\\$1').\n           replace(/\\x08/g, '\\\\x08');\n}\n\n\nfunction adjustMatcher(matcher) {\n  if (matcher === 'self') {\n    return matcher;\n  } else if (isString(matcher)) {\n    // Strings match exactly except for 2 wildcards - '*' and '**'.\n    // '*' matches any character except those from the set ':/.?&'.\n    // '**' matches any character (like .* in a RegExp).\n    // More than 2 *'s raises an error as it's ill defined.\n    if (matcher.indexOf('***') > -1) {\n      throw $sceMinErr('iwcard',\n          'Illegal sequence *** in string matcher.  String: {0}', matcher);\n    }\n    matcher = escapeForRegexp(matcher).\n                  replace('\\\\*\\\\*', '.*').\n                  replace('\\\\*', '[^:/.?&;]*');\n    return new RegExp('^' + matcher + '$');\n  } else if (isRegExp(matcher)) {\n    // The only other type of matcher allowed is a Regexp.\n    // Match entire URL / disallow partial matches.\n    // Flags are reset (i.e. no global, ignoreCase or multiline)\n    return new RegExp('^' + matcher.source + '$');\n  } else {\n    throw $sceMinErr('imatcher',\n        'Matchers may only be \"self\", string patterns or RegExp objects');\n  }\n}\n\n\nfunction adjustMatchers(matchers) {\n  var adjustedMatchers = [];\n  if (isDefined(matchers)) {\n    forEach(matchers, function(matcher) {\n      adjustedMatchers.push(adjustMatcher(matcher));\n    });\n  }\n  return adjustedMatchers;\n}\n\n\n/**\n * @ngdoc service\n * @name $sceDelegate\n * @function\n *\n * @description\n *\n * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict\n * Contextual Escaping (SCE)} services to AngularJS.\n *\n * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of\n * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is\n * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to\n * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things\n * work because `$sce` delegates to `$sceDelegate` for these operations.\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.\n *\n * The default instance of `$sceDelegate` should work out of the box with little pain.  While you\n * can override it completely to change the behavior of `$sce`, the common case would\n * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting\n * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as\n * templates.  Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist\n * $sceDelegateProvider.resourceUrlWhitelist} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n */\n\n/**\n * @ngdoc provider\n * @name $sceDelegateProvider\n * @description\n *\n * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate\n * $sceDelegate} service.  This allows one to get/set the whitelists and blacklists used to ensure\n * that the URLs used for sourcing Angular templates are safe.  Refer {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and\n * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\n *\n * For the general details about this service in Angular, read the main page for {@link ng.$sce\n * Strict Contextual Escaping (SCE)}.\n *\n * **Example**:  Consider the following case. <a name=\"example\"></a>\n *\n * - your app is hosted at url `http://myapp.example.com/`\n * - but some of your templates are hosted on other domains you control such as\n *   `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc.\n * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.\n *\n * Here is what a secure configuration for this scenario might look like:\n *\n * <pre class=\"prettyprint\">\n *    angular.module('myApp', []).config(function($sceDelegateProvider) {\n *      $sceDelegateProvider.resourceUrlWhitelist([\n *        // Allow same origin resource loads.\n *        'self',\n *        // Allow loading from our assets domain.  Notice the difference between * and **.\n *        'http://srv*.assets.example.com/**']);\n *\n *      // The blacklist overrides the whitelist so the open redirect here is blocked.\n *      $sceDelegateProvider.resourceUrlBlacklist([\n *        'http://myapp.example.com/clickThru**']);\n *      });\n * </pre>\n */\n\nfunction $SceDelegateProvider() {\n  this.SCE_CONTEXTS = SCE_CONTEXTS;\n\n  // Resource URLs can also be trusted by policy.\n  var resourceUrlWhitelist = ['self'],\n      resourceUrlBlacklist = [];\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlWhitelist\n   * @function\n   *\n   * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   *     Note: **an empty whitelist array will block all URLs**!\n   *\n   * @return {Array} the currently set whitelist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is `['self']` allowing only\n   * same origin resource requests.\n   *\n   * @description\n   * Sets/Gets the whitelist of trusted resource URLs.\n   */\n  this.resourceUrlWhitelist = function (value) {\n    if (arguments.length) {\n      resourceUrlWhitelist = adjustMatchers(value);\n    }\n    return resourceUrlWhitelist;\n  };\n\n  /**\n   * @ngdoc method\n   * @name $sceDelegateProvider#resourceUrlBlacklist\n   * @function\n   *\n   * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value\n   *     provided.  This must be an array or null.  A snapshot of this array is used so further\n   *     changes to the array are ignored.\n   *\n   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\n   *     allowed in this array.\n   *\n   *     The typical usage for the blacklist is to **block\n   *     [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as\n   *     these would otherwise be trusted but actually return content from the redirected domain.\n   *\n   *     Finally, **the blacklist overrides the whitelist** and has the final say.\n   *\n   * @return {Array} the currently set blacklist array.\n   *\n   * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there\n   * is no blacklist.)\n   *\n   * @description\n   * Sets/Gets the blacklist of trusted resource URLs.\n   */\n\n  this.resourceUrlBlacklist = function (value) {\n    if (arguments.length) {\n      resourceUrlBlacklist = adjustMatchers(value);\n    }\n    return resourceUrlBlacklist;\n  };\n\n  this.$get = ['$injector', function($injector) {\n\n    var htmlSanitizer = function htmlSanitizer(html) {\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    };\n\n    if ($injector.has('$sanitize')) {\n      htmlSanitizer = $injector.get('$sanitize');\n    }\n\n\n    function matchUrl(matcher, parsedUrl) {\n      if (matcher === 'self') {\n        return urlIsSameOrigin(parsedUrl);\n      } else {\n        // definitely a regex.  See adjustMatchers()\n        return !!matcher.exec(parsedUrl.href);\n      }\n    }\n\n    function isResourceUrlAllowedByPolicy(url) {\n      var parsedUrl = urlResolve(url.toString());\n      var i, n, allowed = false;\n      // Ensure that at least one item from the whitelist allows this url.\n      for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {\n        if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {\n          allowed = true;\n          break;\n        }\n      }\n      if (allowed) {\n        // Ensure that no item from the blacklist blocked this url.\n        for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {\n          if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {\n            allowed = false;\n            break;\n          }\n        }\n      }\n      return allowed;\n    }\n\n    function generateHolderType(Base) {\n      var holderType = function TrustedValueHolderType(trustedValue) {\n        this.$$unwrapTrustedValue = function() {\n          return trustedValue;\n        };\n      };\n      if (Base) {\n        holderType.prototype = new Base();\n      }\n      holderType.prototype.valueOf = function sceValueOf() {\n        return this.$$unwrapTrustedValue();\n      };\n      holderType.prototype.toString = function sceToString() {\n        return this.$$unwrapTrustedValue().toString();\n      };\n      return holderType;\n    }\n\n    var trustedValueHolderBase = generateHolderType(),\n        byType = {};\n\n    byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);\n    byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#trustAs\n     *\n     * @description\n     * Returns an object that is trusted by angular for use in specified strict\n     * contextual escaping contexts (such as ng-bind-html, ng-include, any src\n     * attribute interpolation, any dom event binding attribute interpolation\n     * such as for onclick,  etc.) that uses the provided value.\n     * See {@link ng.$sce $sce} for enabling strict contextual escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resourceUrl, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n    function trustAs(type, trustedValue) {\n      var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (!Constructor) {\n        throw $sceMinErr('icontext',\n            'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',\n            type, trustedValue);\n      }\n      if (trustedValue === null || trustedValue === undefined || trustedValue === '') {\n        return trustedValue;\n      }\n      // All the current contexts in SCE_CONTEXTS happen to be strings.  In order to avoid trusting\n      // mutable objects, we ensure here that the value passed in is actually a string.\n      if (typeof trustedValue !== 'string') {\n        throw $sceMinErr('itype',\n            'Attempted to trust a non-string value in a content requiring a string: Context: {0}',\n            type);\n      }\n      return new Constructor(trustedValue);\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#valueOf\n     *\n     * @description\n     * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs\n     * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.\n     *\n     * If the passed parameter is not a value that had been returned by {@link\n     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.\n     *\n     * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}\n     *      call or anything else.\n     * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns\n     *     `value` unchanged.\n     */\n    function valueOf(maybeTrusted) {\n      if (maybeTrusted instanceof trustedValueHolderBase) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      } else {\n        return maybeTrusted;\n      }\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sceDelegate#getTrusted\n     *\n     * @description\n     * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and\n     * returns the originally supplied value if the queried context type is a supertype of the\n     * created type.  If this condition isn't satisfied, throws an exception.\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} call.\n     * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs\n     *     `$sceDelegate.trustAs`} if valid in this context.  Otherwise, throws an exception.\n     */\n    function getTrusted(type, maybeTrusted) {\n      if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') {\n        return maybeTrusted;\n      }\n      var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\n      if (constructor && maybeTrusted instanceof constructor) {\n        return maybeTrusted.$$unwrapTrustedValue();\n      }\n      // If we get here, then we may only take one of two actions.\n      // 1. sanitize the value for the requested type, or\n      // 2. throw an exception.\n      if (type === SCE_CONTEXTS.RESOURCE_URL) {\n        if (isResourceUrlAllowedByPolicy(maybeTrusted)) {\n          return maybeTrusted;\n        } else {\n          throw $sceMinErr('insecurl',\n              'Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}',\n              maybeTrusted.toString());\n        }\n      } else if (type === SCE_CONTEXTS.HTML) {\n        return htmlSanitizer(maybeTrusted);\n      }\n      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\n    }\n\n    return { trustAs: trustAs,\n             getTrusted: getTrusted,\n             valueOf: valueOf };\n  }];\n}\n\n\n/**\n * @ngdoc provider\n * @name $sceProvider\n * @description\n *\n * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.\n * -   enable/disable Strict Contextual Escaping (SCE) in a module\n * -   override the default implementation with a custom delegate\n *\n * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.\n */\n\n/* jshint maxlen: false*/\n\n/**\n * @ngdoc service\n * @name $sce\n * @function\n *\n * @description\n *\n * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.\n *\n * # Strict Contextual Escaping\n *\n * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain\n * contexts to result in a value that is marked as safe to use for that context.  One example of\n * such a context is binding arbitrary html controlled by the user via `ng-bind-html`.  We refer\n * to these contexts as privileged or SCE contexts.\n *\n * As of version 1.2, Angular ships with SCE enabled by default.\n *\n * Note:  When enabled (the default), IE8 in quirks mode is not supported.  In this mode, IE8 allows\n * one to execute arbitrary javascript by the use of the expression() syntax.  Refer\n * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.\n * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`\n * to the top of your HTML document.\n *\n * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for\n * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.\n *\n * Here's an example of a binding in a privileged context:\n *\n * <pre class=\"prettyprint\">\n *     <input ng-model=\"userHtml\">\n *     <div ng-bind-html=\"userHtml\">\n * </pre>\n *\n * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE\n * disabled, this application allows the user to render arbitrary HTML into the DIV.\n * In a more realistic example, one may be rendering user comments, blog articles, etc. via\n * bindings.  (HTML is just one example of a context where rendering user controlled input creates\n * security vulnerabilities.)\n *\n * For the case of HTML, you might use a library, either on the client side, or on the server side,\n * to sanitize unsafe HTML before binding to the value and rendering it in the document.\n *\n * How would you ensure that every place that used these types of bindings was bound to a value that\n * was sanitized by your library (or returned as safe for rendering by your server?)  How can you\n * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some\n * properties/fields and forgot to update the binding to the sanitized value?\n *\n * To be secure by default, you want to ensure that any such bindings are disallowed unless you can\n * determine that something explicitly says it's safe to use a value for binding in that\n * context.  You can then audit your code (a simple grep would do) to ensure that this is only done\n * for those values that you can easily tell are safe - because they were received from your server,\n * sanitized by your library, etc.  You can organize your codebase to help with this - perhaps\n * allowing only the files in a specific directory to do this.  Ensuring that the internal API\n * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.\n *\n * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}\n * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to\n * obtain values that will be accepted by SCE / privileged contexts.\n *\n *\n * ## How does it work?\n *\n * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted\n * $sce.getTrusted(context, value)} rather than to the value directly.  Directives use {@link\n * ng.$sce#parse $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the\n * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.\n *\n * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link\n * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly\n * simplified):\n *\n * <pre class=\"prettyprint\">\n *   var ngBindHtmlDirective = ['$sce', function($sce) {\n *     return function(scope, element, attr) {\n *       scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {\n *         element.html(value || '');\n *       });\n *     };\n *   }];\n * </pre>\n *\n * ## Impact on loading templates\n *\n * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as\n * `templateUrl`'s specified by {@link guide/directive directives}.\n *\n * By default, Angular only loads templates from the same domain and protocol as the application\n * document.  This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or\n * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist\n * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.\n *\n * *Please note*:\n * The browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy apply in addition to this and may further restrict whether the template is successfully\n * loaded.  This means that without the right CORS policy, loading templates from a different domain\n * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some\n * browsers.\n *\n * ## This feels like too much overhead\n *\n * It's important to remember that SCE only applies to interpolation expressions.\n *\n * If your expressions are constant literals, they're automatically trusted and you don't need to\n * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.\n * `<div ng-bind-html=\"'<b>implicitly trusted</b>'\"></div>`) just works.\n *\n * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them\n * through {@link ng.$sce#getTrusted $sce.getTrusted}.  SCE doesn't play a role here.\n *\n * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load\n * templates in `ng-include` from your application's domain without having to even know about SCE.\n * It blocks loading templates from other domains or loading templates over http from an https\n * served document.  You can change these by setting your own custom {@link\n * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link\n * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.\n *\n * This significantly reduces the overhead.  It is far easier to pay the small overhead and have an\n * application that's secure and can be audited to verify that with much more ease than bolting\n * security onto an application later.\n *\n * <a name=\"contexts\"></a>\n * ## What trusted context types are supported?\n *\n * | Context             | Notes          |\n * |---------------------|----------------|\n * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |\n * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently unused.  Feel free to use it in your own directives. |\n * | `$sce.URL`          | For URLs that are safe to follow as links.  Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |\n * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |\n * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently unused.  Feel free to use it in your own directives. |\n *\n * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name=\"resourceUrlPatternItem\"></a>\n *\n *  Each element in these arrays must be one of the following:\n *\n *  - **'self'**\n *    - The special **string**, `'self'`, can be used to match against all URLs of the **same\n *      domain** as the application document using the **same protocol**.\n *  - **String** (except the special value `'self'`)\n *    - The string is matched against the full *normalized / absolute URL* of the resource\n *      being tested (substring matches are not good enough.)\n *    - There are exactly **two wildcard sequences** - `*` and `**`.  All other characters\n *      match themselves.\n *    - `*`: matches zero or more occurrences of any character other than one of the following 6\n *      characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'.  It's a useful wildcard for use\n *      in a whitelist.\n *    - `**`: matches zero or more occurrences of *any* character.  As such, it's not\n *      not appropriate to use in for a scheme, domain, etc. as it would match too much.  (e.g.\n *      http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might\n *      not have been the intention.)  It's usage at the very end of the path is ok.  (e.g.\n *      http://foo.example.com/templates/**).\n *  - **RegExp** (*see caveat below*)\n *    - *Caveat*:  While regular expressions are powerful and offer great flexibility,  their syntax\n *      (and all the inevitable escaping) makes them *harder to maintain*.  It's easy to\n *      accidentally introduce a bug when one updates a complex expression (imho, all regexes should\n *      have good test coverage.).  For instance, the use of `.` in the regex is correct only in a\n *      small number of cases.  A `.` character in the regex used when matching the scheme or a\n *      subdomain could be matched against a `:` or literal `.` that was likely not intended.   It\n *      is highly recommended to use the string patterns and only fall back to regular expressions\n *      if they as a last resort.\n *    - The regular expression must be an instance of RegExp (i.e. not a string.)  It is\n *      matched against the **entire** *normalized / absolute URL* of the resource being tested\n *      (even when the RegExp did not have the `^` and `$` codes.)  In addition, any flags\n *      present on the RegExp (such as multiline, global, ignoreCase) are ignored.\n *    - If you are generating your JavaScript from some other templating engine (not\n *      recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),\n *      remember to escape your regular expression (and be aware that you might need more than\n *      one level of escaping depending on your templating engine and the way you interpolated\n *      the value.)  Do make use of your platform's escaping mechanism as it might be good\n *      enough before coding your own.  e.g. Ruby has\n *      [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)\n *      and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).\n *      Javascript lacks a similar built in function for escaping.  Take a look at Google\n *      Closure library's [goog.string.regExpEscape(s)](\n *      http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).\n *\n * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.\n *\n * ## Show me an example using SCE.\n *\n * @example\n<example module=\"mySceApp\" deps=\"angular-sanitize.js\">\n<file name=\"index.html\">\n  <div ng-controller=\"myAppController as myCtrl\">\n    <i ng-bind-html=\"myCtrl.explicitlyTrustedHtml\" id=\"explicitlyTrustedHtml\"></i><br><br>\n    <b>User comments</b><br>\n    By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when\n    $sanitize is available.  If $sanitize isn't available, this results in an error instead of an\n    exploit.\n    <div class=\"well\">\n      <div ng-repeat=\"userComment in myCtrl.userComments\">\n        <b>{{userComment.name}}</b>:\n        <span ng-bind-html=\"userComment.htmlComment\" class=\"htmlComment\"></span>\n        <br>\n      </div>\n    </div>\n  </div>\n</file>\n\n<file name=\"script.js\">\n  var mySceApp = angular.module('mySceApp', ['ngSanitize']);\n\n  mySceApp.controller(\"myAppController\", function myAppController($http, $templateCache, $sce) {\n    var self = this;\n    $http.get(\"test_data.json\", {cache: $templateCache}).success(function(userComments) {\n      self.userComments = userComments;\n    });\n    self.explicitlyTrustedHtml = $sce.trustAsHtml(\n        '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n        'sanitization.&quot;\">Hover over this text.</span>');\n  });\n</file>\n\n<file name=\"test_data.json\">\n[\n  { \"name\": \"Alice\",\n    \"htmlComment\":\n        \"<span onmouseover='this.textContent=\\\"PWN3D!\\\"'>Is <i>anyone</i> reading this?</span>\"\n  },\n  { \"name\": \"Bob\",\n    \"htmlComment\": \"<i>Yes!</i>  Am I the only other one?\"\n  }\n]\n</file>\n\n<file name=\"protractor.js\" type=\"protractor\">\n  describe('SCE doc demo', function() {\n    it('should sanitize untrusted values', function() {\n      expect(element(by.css('.htmlComment')).getInnerHtml())\n          .toBe('<span>Is <i>anyone</i> reading this?</span>');\n    });\n\n    it('should NOT sanitize explicitly trusted values', function() {\n      expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(\n          '<span onmouseover=\"this.textContent=&quot;Explicitly trusted HTML bypasses ' +\n          'sanitization.&quot;\">Hover over this text.</span>');\n    });\n  });\n</file>\n</example>\n *\n *\n *\n * ## Can I disable SCE completely?\n *\n * Yes, you can.  However, this is strongly discouraged.  SCE gives you a lot of security benefits\n * for little coding overhead.  It will be much harder to take an SCE disabled application and\n * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE\n * for cases where you have a lot of existing code that was written before SCE was introduced and\n * you're migrating them a module at a time.\n *\n * That said, here's how you can completely disable SCE:\n *\n * <pre class=\"prettyprint\">\n *   angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {\n *     // Completely disable SCE.  For demonstration purposes only!\n *     // Do not use in new projects.\n *     $sceProvider.enabled(false);\n *   });\n * </pre>\n *\n */\n/* jshint maxlen: 100 */\n\nfunction $SceProvider() {\n  var enabled = true;\n\n  /**\n   * @ngdoc method\n   * @name $sceProvider#enabled\n   * @function\n   *\n   * @param {boolean=} value If provided, then enables/disables SCE.\n   * @return {boolean} true if SCE is enabled, false otherwise.\n   *\n   * @description\n   * Enables/disables SCE and returns the current value.\n   */\n  this.enabled = function (value) {\n    if (arguments.length) {\n      enabled = !!value;\n    }\n    return enabled;\n  };\n\n\n  /* Design notes on the default implementation for SCE.\n   *\n   * The API contract for the SCE delegate\n   * -------------------------------------\n   * The SCE delegate object must provide the following 3 methods:\n   *\n   * - trustAs(contextEnum, value)\n   *     This method is used to tell the SCE service that the provided value is OK to use in the\n   *     contexts specified by contextEnum.  It must return an object that will be accepted by\n   *     getTrusted() for a compatible contextEnum and return this value.\n   *\n   * - valueOf(value)\n   *     For values that were not produced by trustAs(), return them as is.  For values that were\n   *     produced by trustAs(), return the corresponding input value to trustAs.  Basically, if\n   *     trustAs is wrapping the given values into some type, this operation unwraps it when given\n   *     such a value.\n   *\n   * - getTrusted(contextEnum, value)\n   *     This function should return the a value that is safe to use in the context specified by\n   *     contextEnum or throw and exception otherwise.\n   *\n   * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be\n   * opaque or wrapped in some holder object.  That happens to be an implementation detail.  For\n   * instance, an implementation could maintain a registry of all trusted objects by context.  In\n   * such a case, trustAs() would return the same object that was passed in.  getTrusted() would\n   * return the same object passed in if it was found in the registry under a compatible context or\n   * throw an exception otherwise.  An implementation might only wrap values some of the time based\n   * on some criteria.  getTrusted() might return a value and not throw an exception for special\n   * constants or objects even if not wrapped.  All such implementations fulfill this contract.\n   *\n   *\n   * A note on the inheritance model for SCE contexts\n   * ------------------------------------------------\n   * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types.  This\n   * is purely an implementation details.\n   *\n   * The contract is simply this:\n   *\n   *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)\n   *     will also succeed.\n   *\n   * Inheritance happens to capture this in a natural way.  In some future, we\n   * may not use inheritance anymore.  That is OK because no code outside of\n   * sce.js and sceSpecs.js would need to be aware of this detail.\n   */\n\n  this.$get = ['$parse', '$sniffer', '$sceDelegate', function(\n                $parse,   $sniffer,   $sceDelegate) {\n    // Prereq: Ensure that we're not running in IE8 quirks mode.  In that mode, IE allows\n    // the \"expression(javascript expression)\" syntax which is insecure.\n    if (enabled && $sniffer.msie && $sniffer.msieDocumentMode < 8) {\n      throw $sceMinErr('iequirks',\n        'Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks ' +\n        'mode.  You can fix this by adding the text <!doctype html> to the top of your HTML ' +\n        'document.  See http://docs.angularjs.org/api/ng.$sce for more information.');\n    }\n\n    var sce = copy(SCE_CONTEXTS);\n\n    /**\n     * @ngdoc method\n     * @name $sce#isEnabled\n     * @function\n     *\n     * @return {Boolean} true if SCE is enabled, false otherwise.  If you want to set the value, you\n     * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.\n     *\n     * @description\n     * Returns a boolean indicating if SCE is enabled.\n     */\n    sce.isEnabled = function () {\n      return enabled;\n    };\n    sce.trustAs = $sceDelegate.trustAs;\n    sce.getTrusted = $sceDelegate.getTrusted;\n    sce.valueOf = $sceDelegate.valueOf;\n\n    if (!enabled) {\n      sce.trustAs = sce.getTrusted = function(type, value) { return value; };\n      sce.valueOf = identity;\n    }\n\n    /**\n     * @ngdoc method\n     * @name $sce#parse\n     *\n     * @description\n     * Converts Angular {@link guide/expression expression} into a function.  This is like {@link\n     * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it\n     * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,\n     * *result*)}\n     *\n     * @param {string} type The kind of SCE context in which this result will be used.\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n    sce.parseAs = function sceParseAs(type, expr) {\n      var parsed = $parse(expr);\n      if (parsed.literal && parsed.constant) {\n        return parsed;\n      } else {\n        return function sceParseAsTrusted(self, locals) {\n          var result = sce.getTrusted(type, parsed(self, locals));\n          sceParseAsTrusted.$$unwatch = parsed.$$unwatch;\n          return result;\n        };\n      }\n    };\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAs\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.  As such,\n     * returns an object that is trusted by angular for use in specified strict contextual\n     * escaping contexts (such as ng-bind-html, ng-include, any src attribute\n     * interpolation, any dom event binding attribute interpolation such as for onclick,  etc.)\n     * that uses the provided value.  See * {@link ng.$sce $sce} for enabling strict contextual\n     * escaping.\n     *\n     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,\n     *   resource_url, html, js and css.\n     * @param {*} value The value that that should be considered trusted/safe.\n     * @returns {*} A value that can be used to stand in for the provided `value` in places\n     * where Angular expects a $sce.trustAs() return value.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsHtml(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml\n     *     $sce.getTrustedHtml(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl\n     *     $sce.getTrustedUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl\n     *     $sce.getTrustedResourceUrl(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the return\n     *     value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#trustAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.trustAsJs(value)` →\n     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}\n     *\n     * @param {*} value The value to trustAs.\n     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs\n     *     $sce.getTrustedJs(value)} to obtain the original value.  (privileged directives\n     *     only accept expressions that are either literal constants or are the\n     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrusted\n     *\n     * @description\n     * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}.  As such,\n     * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the\n     * originally supplied value if the queried context type is a supertype of the created type.\n     * If this condition isn't satisfied, throws an exception.\n     *\n     * @param {string} type The kind of context in which this value is to be used.\n     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}\n     *                         call.\n     * @returns {*} The value the was originally provided to\n     *              {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.\n     *              Otherwise, throws an exception.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedHtml(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedCss\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedCss(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedResourceUrl(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}\n     *\n     * @param {*} value The value to pass to `$sceDelegate.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#getTrustedJs\n     *\n     * @description\n     * Shorthand method.  `$sce.getTrustedJs(value)` →\n     *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}\n     *\n     * @param {*} value The value to pass to `$sce.getTrusted`.\n     * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsHtml\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsHtml(expression string)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.HTML, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsCss\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsCss(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.CSS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsUrl(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsResourceUrl\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsResourceUrl(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.RESOURCE_URL, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    /**\n     * @ngdoc method\n     * @name $sce#parseAsJs\n     *\n     * @description\n     * Shorthand method.  `$sce.parseAsJs(value)` →\n     *     {@link ng.$sce#parse `$sce.parseAs($sce.JS, value)`}\n     *\n     * @param {string} expression String expression to compile.\n     * @returns {function(context, locals)} a function which represents the compiled expression:\n     *\n     *    * `context` – `{object}` – an object against which any expressions embedded in the strings\n     *      are evaluated against (typically a scope object).\n     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in\n     *      `context`.\n     */\n\n    // Shorthand delegations.\n    var parse = sce.parseAs,\n        getTrusted = sce.getTrusted,\n        trustAs = sce.trustAs;\n\n    forEach(SCE_CONTEXTS, function (enumValue, name) {\n      var lName = lowercase(name);\n      sce[camelCase(\"parse_as_\" + lName)] = function (expr) {\n        return parse(enumValue, expr);\n      };\n      sce[camelCase(\"get_trusted_\" + lName)] = function (value) {\n        return getTrusted(enumValue, value);\n      };\n      sce[camelCase(\"trust_as_\" + lName)] = function (value) {\n        return trustAs(enumValue, value);\n      };\n    });\n\n    return sce;\n  }];\n}\n\n/**\n * !!! This is an undocumented \"private\" service !!!\n *\n * @name $sniffer\n * @requires $window\n * @requires $document\n *\n * @property {boolean} history Does the browser support html5 history api ?\n * @property {boolean} hashchange Does the browser support hashchange event ?\n * @property {boolean} transitions Does the browser support CSS transition events ?\n * @property {boolean} animations Does the browser support CSS animation events ?\n *\n * @description\n * This is very simple implementation of testing browser's features.\n */\nfunction $SnifferProvider() {\n  this.$get = ['$window', '$document', function($window, $document) {\n    var eventSupport = {},\n        android =\n          int((/android (\\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),\n        boxee = /Boxee/i.test(($window.navigator || {}).userAgent),\n        document = $document[0] || {},\n        documentMode = document.documentMode,\n        vendorPrefix,\n        vendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/,\n        bodyStyle = document.body && document.body.style,\n        transitions = false,\n        animations = false,\n        match;\n\n    if (bodyStyle) {\n      for(var prop in bodyStyle) {\n        if(match = vendorRegex.exec(prop)) {\n          vendorPrefix = match[0];\n          vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);\n          break;\n        }\n      }\n\n      if(!vendorPrefix) {\n        vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';\n      }\n\n      transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));\n      animations  = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));\n\n      if (android && (!transitions||!animations)) {\n        transitions = isString(document.body.style.webkitTransition);\n        animations = isString(document.body.style.webkitAnimation);\n      }\n    }\n\n\n    return {\n      // Android has history.pushState, but it does not update location correctly\n      // so let's not use the history API at all.\n      // http://code.google.com/p/android/issues/detail?id=17471\n      // https://github.com/angular/angular.js/issues/904\n\n      // older webkit browser (533.9) on Boxee box has exactly the same problem as Android has\n      // so let's not use the history API also\n      // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined\n      // jshint -W018\n      history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee),\n      // jshint +W018\n      hashchange: 'onhashchange' in $window &&\n                  // IE8 compatible mode lies\n                  (!documentMode || documentMode > 7),\n      hasEvent: function(event) {\n        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\n        // it. In particular the event is not fired when backspace or delete key are pressed or\n        // when cut operation is performed.\n        if (event == 'input' && msie == 9) return false;\n\n        if (isUndefined(eventSupport[event])) {\n          var divElm = document.createElement('div');\n          eventSupport[event] = 'on' + event in divElm;\n        }\n\n        return eventSupport[event];\n      },\n      csp: csp(),\n      vendorPrefix: vendorPrefix,\n      transitions : transitions,\n      animations : animations,\n      android: android,\n      msie : msie,\n      msieDocumentMode: documentMode\n    };\n  }];\n}\n\nfunction $TimeoutProvider() {\n  this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',\n       function($rootScope,   $browser,   $q,   $exceptionHandler) {\n    var deferreds = {};\n\n\n     /**\n      * @ngdoc service\n      * @name $timeout\n      *\n      * @description\n      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\n      * block and delegates any exceptions to\n      * {@link ng.$exceptionHandler $exceptionHandler} service.\n      *\n      * The return value of registering a timeout function is a promise, which will be resolved when\n      * the timeout is reached and the timeout function is executed.\n      *\n      * To cancel a timeout request, call `$timeout.cancel(promise)`.\n      *\n      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\n      * synchronously flush the queue of deferred functions.\n      *\n      * @param {function()} fn A function, whose execution should be delayed.\n      * @param {number=} [delay=0] Delay in milliseconds.\n      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\n      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\n      * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this\n      *   promise will be resolved with is the return value of the `fn` function.\n      *\n      */\n    function timeout(fn, delay, invokeApply) {\n      var deferred = $q.defer(),\n          promise = deferred.promise,\n          skipApply = (isDefined(invokeApply) && !invokeApply),\n          timeoutId;\n\n      timeoutId = $browser.defer(function() {\n        try {\n          deferred.resolve(fn());\n        } catch(e) {\n          deferred.reject(e);\n          $exceptionHandler(e);\n        }\n        finally {\n          delete deferreds[promise.$$timeoutId];\n        }\n\n        if (!skipApply) $rootScope.$apply();\n      }, delay);\n\n      promise.$$timeoutId = timeoutId;\n      deferreds[timeoutId] = deferred;\n\n      return promise;\n    }\n\n\n     /**\n      * @ngdoc method\n      * @name $timeout#cancel\n      *\n      * @description\n      * Cancels a task associated with the `promise`. As a result of this, the promise will be\n      * resolved with a rejection.\n      *\n      * @param {Promise=} promise Promise returned by the `$timeout` function.\n      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\n      *   canceled.\n      */\n    timeout.cancel = function(promise) {\n      if (promise && promise.$$timeoutId in deferreds) {\n        deferreds[promise.$$timeoutId].reject('canceled');\n        delete deferreds[promise.$$timeoutId];\n        return $browser.defer.cancel(promise.$$timeoutId);\n      }\n      return false;\n    };\n\n    return timeout;\n  }];\n}\n\n// NOTE:  The usage of window and document instead of $window and $document here is\n// deliberate.  This service depends on the specific behavior of anchor nodes created by the\n// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\n// cause us to break tests.  In addition, when the browser resolves a URL for XHR, it\n// doesn't know about mocked locations and resolves URLs to the real document - which is\n// exactly the behavior needed here.  There is little value is mocking these out for this\n// service.\nvar urlParsingNode = document.createElement(\"a\");\nvar originUrl = urlResolve(window.location.href, true);\n\n\n/**\n *\n * Implementation Notes for non-IE browsers\n * ----------------------------------------\n * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\n * results both in the normalizing and parsing of the URL.  Normalizing means that a relative\n * URL will be resolved into an absolute URL in the context of the application document.\n * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related\n * properties are all populated to reflect the normalized URL.  This approach has wide\n * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc.  See\n * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *\n * Implementation Notes for IE\n * ---------------------------\n * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other\n * browsers.  However, the parsed components will not be set if the URL assigned did not specify\n * them.  (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.)  We\n * work around that by performing the parsing in a 2nd step by taking a previously normalized\n * URL (e.g. by assigning to a.href) and assigning it a.href again.  This correctly populates the\n * properties such as protocol, hostname, port, etc.\n *\n * IE7 does not normalize the URL when assigned to an anchor node.  (Apparently, it does, if one\n * uses the inner HTML approach to assign the URL as part of an HTML snippet -\n * http://stackoverflow.com/a/472729)  However, setting img[src] does normalize the URL.\n * Unfortunately, setting img[src] to something like \"javascript:foo\" on IE throws an exception.\n * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that\n * method and IE < 8 is unsupported.\n *\n * References:\n *   http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\n *   http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\n *   http://url.spec.whatwg.org/#urlutils\n *   https://github.com/angular/angular.js/pull/2902\n *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\n *\n * @function\n * @param {string} url The URL to be parsed.\n * @description Normalizes and parses a URL.\n * @returns {object} Returns the normalized URL as a dictionary.\n *\n *   | member name   | Description    |\n *   |---------------|----------------|\n *   | href          | A normalized version of the provided URL if it was not an absolute URL |\n *   | protocol      | The protocol including the trailing colon                              |\n *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |\n *   | search        | The search params, minus the question mark                             |\n *   | hash          | The hash string, minus the hash symbol\n *   | hostname      | The hostname\n *   | port          | The port, without \":\"\n *   | pathname      | The pathname, beginning with \"/\"\n *\n */\nfunction urlResolve(url, base) {\n  var href = url;\n\n  if (msie) {\n    // Normalize before parse.  Refer Implementation Notes on why this is\n    // done in two steps on IE.\n    urlParsingNode.setAttribute(\"href\", href);\n    href = urlParsingNode.href;\n  }\n\n  urlParsingNode.setAttribute('href', href);\n\n  // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n  return {\n    href: urlParsingNode.href,\n    protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n    host: urlParsingNode.host,\n    search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n    hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n    hostname: urlParsingNode.hostname,\n    port: urlParsingNode.port,\n    pathname: (urlParsingNode.pathname.charAt(0) === '/')\n      ? urlParsingNode.pathname\n      : '/' + urlParsingNode.pathname\n  };\n}\n\n/**\n * Parse a request URL and determine whether this is a same-origin request as the application document.\n *\n * @param {string|object} requestUrl The url of the request as a string that will be resolved\n * or a parsed URL object.\n * @returns {boolean} Whether the request is for the same origin as the application document.\n */\nfunction urlIsSameOrigin(requestUrl) {\n  var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;\n  return (parsed.protocol === originUrl.protocol &&\n          parsed.host === originUrl.host);\n}\n\n/**\n * @ngdoc service\n * @name $window\n *\n * @description\n * A reference to the browser's `window` object. While `window`\n * is globally available in JavaScript, it causes testability problems, because\n * it is a global variable. In angular we always refer to it through the\n * `$window` service, so it may be overridden, removed or mocked for testing.\n *\n * Expressions, like the one defined for the `ngClick` directive in the example\n * below, are evaluated with respect to the current scope.  Therefore, there is\n * no risk of inadvertently coding in a dependency on a global value in such an\n * expression.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope, $window) {\n           $scope.greeting = 'Hello, World!';\n           $scope.doGreeting = function(greeting) {\n               $window.alert(greeting);\n           };\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <input type=\"text\" ng-model=\"greeting\" />\n         <button ng-click=\"doGreeting(greeting)\">ALERT</button>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n      it('should display the greeting in the input box', function() {\n       element(by.model('greeting')).sendKeys('Hello, E2E Tests');\n       // If we click the button it will block the test runner\n       // element(':button').click();\n      });\n     </file>\n   </example>\n */\nfunction $WindowProvider(){\n  this.$get = valueFn(window);\n}\n\n/**\n * @ngdoc provider\n * @name $filterProvider\n * @description\n *\n * Filters are just functions which transform input to an output. However filters need to be\n * Dependency Injected. To achieve this a filter definition consists of a factory function which is\n * annotated with dependencies and is responsible for creating a filter function.\n *\n * ```js\n *   // Filter registration\n *   function MyModule($provide, $filterProvider) {\n *     // create a service to demonstrate injection (not always needed)\n *     $provide.value('greet', function(name){\n *       return 'Hello ' + name + '!';\n *     });\n *\n *     // register a filter factory which uses the\n *     // greet service to demonstrate DI.\n *     $filterProvider.register('greet', function(greet){\n *       // return the filter function which uses the greet service\n *       // to generate salutation\n *       return function(text) {\n *         // filters need to be forgiving so check input validity\n *         return text && greet(text) || text;\n *       };\n *     });\n *   }\n * ```\n *\n * The filter function is registered with the `$injector` under the filter name suffix with\n * `Filter`.\n *\n * ```js\n *   it('should be the same instance', inject(\n *     function($filterProvider) {\n *       $filterProvider.register('reverse', function(){\n *         return ...;\n *       });\n *     },\n *     function($filter, reverseFilter) {\n *       expect($filter('reverse')).toBe(reverseFilter);\n *     });\n * ```\n *\n *\n * For more information about how angular filters work, and how to create your own filters, see\n * {@link guide/filter Filters} in the Angular Developer Guide.\n */\n/**\n * @ngdoc method\n * @name $filterProvider#register\n * @description\n * Register filter factory function.\n *\n * @param {String} name Name of the filter.\n * @param {Function} fn The filter factory function which is injectable.\n */\n\n\n/**\n * @ngdoc service\n * @name $filter\n * @function\n * @description\n * Filters are used for formatting data displayed to the user.\n *\n * The general syntax in templates is as follows:\n *\n *         {{ expression [| filter_name[:parameter_value] ... ] }}\n *\n * @param {String} name Name of the filter function to retrieve\n * @return {Function} the filter function\n * @example\n   <example name=\"$filter\" module=\"filterExample\">\n     <file name=\"index.html\">\n       <div ng-controller=\"MainCtrl\">\n        <h3>{{ originalText }}</h3>\n        <h3>{{ filteredText }}</h3>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n      angular.module('filterExample', [])\n      .controller('MainCtrl', function($scope, $filter) {\n        $scope.originalText = 'hello';\n        $scope.filteredText = $filter('uppercase')($scope.originalText);\n      });\n     </file>\n   </example>\n  */\n$FilterProvider.$inject = ['$provide'];\nfunction $FilterProvider($provide) {\n  var suffix = 'Filter';\n\n  /**\n   * @ngdoc method\n   * @name $controllerProvider#register\n   * @param {string|Object} name Name of the filter function, or an object map of filters where\n   *    the keys are the filter names and the values are the filter factories.\n   * @returns {Object} Registered filter instance, or if a map of filters was provided then a map\n   *    of the registered filter instances.\n   */\n  function register(name, factory) {\n    if(isObject(name)) {\n      var filters = {};\n      forEach(name, function(filter, key) {\n        filters[key] = register(key, filter);\n      });\n      return filters;\n    } else {\n      return $provide.factory(name + suffix, factory);\n    }\n  }\n  this.register = register;\n\n  this.$get = ['$injector', function($injector) {\n    return function(name) {\n      return $injector.get(name + suffix);\n    };\n  }];\n\n  ////////////////////////////////////////\n\n  /* global\n    currencyFilter: false,\n    dateFilter: false,\n    filterFilter: false,\n    jsonFilter: false,\n    limitToFilter: false,\n    lowercaseFilter: false,\n    numberFilter: false,\n    orderByFilter: false,\n    uppercaseFilter: false,\n  */\n\n  register('currency', currencyFilter);\n  register('date', dateFilter);\n  register('filter', filterFilter);\n  register('json', jsonFilter);\n  register('limitTo', limitToFilter);\n  register('lowercase', lowercaseFilter);\n  register('number', numberFilter);\n  register('orderBy', orderByFilter);\n  register('uppercase', uppercaseFilter);\n}\n\n/**\n * @ngdoc filter\n * @name filter\n * @function\n *\n * @description\n * Selects a subset of items from `array` and returns it as a new array.\n *\n * @param {Array} array The source array.\n * @param {string|Object|function()} expression The predicate to be used for selecting items from\n *   `array`.\n *\n *   Can be one of:\n *\n *   - `string`: The string is evaluated as an expression and the resulting value is used for substring match against\n *     the contents of the `array`. All strings or objects with string properties in `array` that contain this string\n *     will be returned. The predicate can be negated by prefixing the string with `!`.\n *\n *   - `Object`: A pattern object can be used to filter specific properties on objects contained\n *     by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\n *     which have property `name` containing \"M\" and property `phone` containing \"1\". A special\n *     property name `$` can be used (as in `{$:\"text\"}`) to accept a match against any\n *     property of the object. That's equivalent to the simple substring match with a `string`\n *     as described above.\n *\n *   - `function(value)`: A predicate function can be used to write arbitrary filters. The function is\n *     called for each element of `array`. The final result is an array of those elements that\n *     the predicate returned true for.\n *\n * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in\n *     determining if the expected value (from the filter expression) and actual value (from\n *     the object in the array) should be considered a match.\n *\n *   Can be one of:\n *\n *   - `function(actual, expected)`:\n *     The function will be given the object value and the predicate value to compare and\n *     should return true if the item should be included in filtered result.\n *\n *   - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`.\n *     this is essentially strict comparison of expected and actual.\n *\n *   - `false|undefined`: A short hand for a function which will look for a substring match in case\n *     insensitive way.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\n                                {name:'Mary', phone:'800-BIG-MARY'},\n                                {name:'Mike', phone:'555-4321'},\n                                {name:'Adam', phone:'555-5678'},\n                                {name:'Julie', phone:'555-8765'},\n                                {name:'Juliette', phone:'555-5678'}]\"></div>\n\n       Search: <input ng-model=\"searchText\">\n       <table id=\"searchTextResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friend in friends | filter:searchText\">\n           <td>{{friend.name}}</td>\n           <td>{{friend.phone}}</td>\n         </tr>\n       </table>\n       <hr>\n       Any: <input ng-model=\"search.$\"> <br>\n       Name only <input ng-model=\"search.name\"><br>\n       Phone only <input ng-model=\"search.phone\"><br>\n       Equality <input type=\"checkbox\" ng-model=\"strict\"><br>\n       <table id=\"searchObjResults\">\n         <tr><th>Name</th><th>Phone</th></tr>\n         <tr ng-repeat=\"friendObj in friends | filter:search:strict\">\n           <td>{{friendObj.name}}</td>\n           <td>{{friendObj.phone}}</td>\n         </tr>\n       </table>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var expectFriendNames = function(expectedNames, key) {\n         element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {\n           arr.forEach(function(wd, i) {\n             expect(wd.getText()).toMatch(expectedNames[i]);\n           });\n         });\n       };\n\n       it('should search across all fields when filtering with a string', function() {\n         var searchText = element(by.model('searchText'));\n         searchText.clear();\n         searchText.sendKeys('m');\n         expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');\n\n         searchText.clear();\n         searchText.sendKeys('76');\n         expectFriendNames(['John', 'Julie'], 'friend');\n       });\n\n       it('should search in specific fields when filtering with a predicate object', function() {\n         var searchAny = element(by.model('search.$'));\n         searchAny.clear();\n         searchAny.sendKeys('i');\n         expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');\n       });\n       it('should use a equal comparison when comparator is true', function() {\n         var searchName = element(by.model('search.name'));\n         var strict = element(by.model('strict'));\n         searchName.clear();\n         searchName.sendKeys('Julie');\n         strict.click();\n         expectFriendNames(['Julie'], 'friendObj');\n       });\n     </file>\n   </example>\n */\nfunction filterFilter() {\n  return function(array, expression, comparator) {\n    if (!isArray(array)) return array;\n\n    var comparatorType = typeof(comparator),\n        predicates = [];\n\n    predicates.check = function(value) {\n      for (var j = 0; j < predicates.length; j++) {\n        if(!predicates[j](value)) {\n          return false;\n        }\n      }\n      return true;\n    };\n\n    if (comparatorType !== 'function') {\n      if (comparatorType === 'boolean' && comparator) {\n        comparator = function(obj, text) {\n          return angular.equals(obj, text);\n        };\n      } else {\n        comparator = function(obj, text) {\n          if (obj && text && typeof obj === 'object' && typeof text === 'object') {\n            for (var objKey in obj) {\n              if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&\n                  comparator(obj[objKey], text[objKey])) {\n                return true;\n              }\n            }\n            return false;\n          }\n          text = (''+text).toLowerCase();\n          return (''+obj).toLowerCase().indexOf(text) > -1;\n        };\n      }\n    }\n\n    var search = function(obj, text){\n      if (typeof text == 'string' && text.charAt(0) === '!') {\n        return !search(obj, text.substr(1));\n      }\n      switch (typeof obj) {\n        case \"boolean\":\n        case \"number\":\n        case \"string\":\n          return comparator(obj, text);\n        case \"object\":\n          switch (typeof text) {\n            case \"object\":\n              return comparator(obj, text);\n            default:\n              for ( var objKey in obj) {\n                if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {\n                  return true;\n                }\n              }\n              break;\n          }\n          return false;\n        case \"array\":\n          for ( var i = 0; i < obj.length; i++) {\n            if (search(obj[i], text)) {\n              return true;\n            }\n          }\n          return false;\n        default:\n          return false;\n      }\n    };\n    switch (typeof expression) {\n      case \"boolean\":\n      case \"number\":\n      case \"string\":\n        // Set up expression object and fall through\n        expression = {$:expression};\n        // jshint -W086\n      case \"object\":\n        // jshint +W086\n        for (var key in expression) {\n          (function(path) {\n            if (typeof expression[path] == 'undefined') return;\n            predicates.push(function(value) {\n              return search(path == '$' ? value : (value && value[path]), expression[path]);\n            });\n          })(key);\n        }\n        break;\n      case 'function':\n        predicates.push(expression);\n        break;\n      default:\n        return array;\n    }\n    var filtered = [];\n    for ( var j = 0; j < array.length; j++) {\n      var value = array[j];\n      if (predicates.check(value)) {\n        filtered.push(value);\n      }\n    }\n    return filtered;\n  };\n}\n\n/**\n * @ngdoc filter\n * @name currency\n * @function\n *\n * @description\n * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\n * symbol for current locale is used.\n *\n * @param {number} amount Input to filter.\n * @param {string=} symbol Currency symbol or identifier to be displayed.\n * @returns {string} Formatted number.\n *\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.amount = 1234.56;\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <input type=\"number\" ng-model=\"amount\"> <br>\n         default currency symbol ($): <span id=\"currency-default\">{{amount | currency}}</span><br>\n         custom currency identifier (USD$): <span>{{amount | currency:\"USD$\"}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should init with 1234.56', function() {\n         expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');\n         expect(element(by.binding('amount | currency:\"USD$\"')).getText()).toBe('USD$1,234.56');\n       });\n       it('should update', function() {\n         if (browser.params.browser == 'safari') {\n           // Safari does not understand the minus key. See\n           // https://github.com/angular/protractor/issues/481\n           return;\n         }\n         element(by.model('amount')).clear();\n         element(by.model('amount')).sendKeys('-1234');\n         expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');\n         expect(element(by.binding('amount | currency:\"USD$\"')).getText()).toBe('(USD$1,234.00)');\n       });\n     </file>\n   </example>\n */\ncurrencyFilter.$inject = ['$locale'];\nfunction currencyFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(amount, currencySymbol){\n    if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM;\n    return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).\n                replace(/\\u00A4/g, currencySymbol);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name number\n * @function\n *\n * @description\n * Formats a number as text.\n *\n * If the input is not a number an empty string is returned.\n *\n * @param {number|string} number Number to format.\n * @param {(number|string)=} fractionSize Number of decimal places to round the number to.\n * If this is not provided then the fraction size is computed from the current locale's number\n * formatting pattern. In the case of the default locale, it will be 3.\n * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.val = 1234.56789;\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         Enter number: <input ng-model='val'><br>\n         Default formatting: <span id='number-default'>{{val | number}}</span><br>\n         No fractions: <span>{{val | number:0}}</span><br>\n         Negative number: <span>{{-val | number:4}}</span>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format numbers', function() {\n         expect(element(by.id('number-default')).getText()).toBe('1,234.568');\n         expect(element(by.binding('val | number:0')).getText()).toBe('1,235');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');\n       });\n\n       it('should update', function() {\n         element(by.model('val')).clear();\n         element(by.model('val')).sendKeys('3374.333');\n         expect(element(by.id('number-default')).getText()).toBe('3,374.333');\n         expect(element(by.binding('val | number:0')).getText()).toBe('3,374');\n         expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');\n      });\n     </file>\n   </example>\n */\n\n\nnumberFilter.$inject = ['$locale'];\nfunction numberFilter($locale) {\n  var formats = $locale.NUMBER_FORMATS;\n  return function(number, fractionSize) {\n    return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\n      fractionSize);\n  };\n}\n\nvar DECIMAL_SEP = '.';\nfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\n  if (number == null || !isFinite(number) || isObject(number)) return '';\n\n  var isNegative = number < 0;\n  number = Math.abs(number);\n  var numStr = number + '',\n      formatedText = '',\n      parts = [];\n\n  var hasExponent = false;\n  if (numStr.indexOf('e') !== -1) {\n    var match = numStr.match(/([\\d\\.]+)e(-?)(\\d+)/);\n    if (match && match[2] == '-' && match[3] > fractionSize + 1) {\n      numStr = '0';\n    } else {\n      formatedText = numStr;\n      hasExponent = true;\n    }\n  }\n\n  if (!hasExponent) {\n    var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;\n\n    // determine fractionSize if it is not specified\n    if (isUndefined(fractionSize)) {\n      fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);\n    }\n\n    var pow = Math.pow(10, fractionSize + 1);\n    number = Math.floor(number * pow + 5) / pow;\n    var fraction = ('' + number).split(DECIMAL_SEP);\n    var whole = fraction[0];\n    fraction = fraction[1] || '';\n\n    var i, pos = 0,\n        lgroup = pattern.lgSize,\n        group = pattern.gSize;\n\n    if (whole.length >= (lgroup + group)) {\n      pos = whole.length - lgroup;\n      for (i = 0; i < pos; i++) {\n        if ((pos - i)%group === 0 && i !== 0) {\n          formatedText += groupSep;\n        }\n        formatedText += whole.charAt(i);\n      }\n    }\n\n    for (i = pos; i < whole.length; i++) {\n      if ((whole.length - i)%lgroup === 0 && i !== 0) {\n        formatedText += groupSep;\n      }\n      formatedText += whole.charAt(i);\n    }\n\n    // format fraction part.\n    while(fraction.length < fractionSize) {\n      fraction += '0';\n    }\n\n    if (fractionSize && fractionSize !== \"0\") formatedText += decimalSep + fraction.substr(0, fractionSize);\n  } else {\n\n    if (fractionSize > 0 && number > -1 && number < 1) {\n      formatedText = number.toFixed(fractionSize);\n    }\n  }\n\n  parts.push(isNegative ? pattern.negPre : pattern.posPre);\n  parts.push(formatedText);\n  parts.push(isNegative ? pattern.negSuf : pattern.posSuf);\n  return parts.join('');\n}\n\nfunction padNumber(num, digits, trim) {\n  var neg = '';\n  if (num < 0) {\n    neg =  '-';\n    num = -num;\n  }\n  num = '' + num;\n  while(num.length < digits) num = '0' + num;\n  if (trim)\n    num = num.substr(num.length - digits);\n  return neg + num;\n}\n\n\nfunction dateGetter(name, size, offset, trim) {\n  offset = offset || 0;\n  return function(date) {\n    var value = date['get' + name]();\n    if (offset > 0 || value > -offset)\n      value += offset;\n    if (value === 0 && offset == -12 ) value = 12;\n    return padNumber(value, size, trim);\n  };\n}\n\nfunction dateStrGetter(name, shortForm) {\n  return function(date, formats) {\n    var value = date['get' + name]();\n    var get = uppercase(shortForm ? ('SHORT' + name) : name);\n\n    return formats[get][value];\n  };\n}\n\nfunction timeZoneGetter(date) {\n  var zone = -1 * date.getTimezoneOffset();\n  var paddedZone = (zone >= 0) ? \"+\" : \"\";\n\n  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +\n                padNumber(Math.abs(zone % 60), 2);\n\n  return paddedZone;\n}\n\nfunction getFirstThursdayOfYear(year) {\n    // 0 = index of January\n    var dayOfWeekOnFirst = (new Date(year, 0, 1)).getDay();\n    // 4 = index of Thursday (+1 to account for 1st = 5)\n    // 11 = index of *next* Thursday (+1 account for 1st = 12)\n    return new Date(year, 0, ((dayOfWeekOnFirst <= 4) ? 5 : 12) - dayOfWeekOnFirst);\n}\n\nfunction getThursdayThisWeek(datetime) {\n    return new Date(datetime.getFullYear(), datetime.getMonth(),\n      // 4 = index of Thursday\n      datetime.getDate() + (4 - datetime.getDay()));\n}\n\nfunction weekGetter(size) {\n   return function(date) {\n      var firstThurs = getFirstThursdayOfYear(date.getFullYear()),\n         thisThurs = getThursdayThisWeek(date);\n\n      var diff = +thisThurs - +firstThurs,\n         result = 1 + Math.round(diff / 6.048e8); // 6.048e8 ms per week\n\n      return padNumber(result, size);\n   };\n}\n\nfunction ampmGetter(date, formats) {\n  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\n}\n\nvar DATE_FORMATS = {\n  yyyy: dateGetter('FullYear', 4),\n    yy: dateGetter('FullYear', 2, 0, true),\n     y: dateGetter('FullYear', 1),\n  MMMM: dateStrGetter('Month'),\n   MMM: dateStrGetter('Month', true),\n    MM: dateGetter('Month', 2, 1),\n     M: dateGetter('Month', 1, 1),\n    dd: dateGetter('Date', 2),\n     d: dateGetter('Date', 1),\n    HH: dateGetter('Hours', 2),\n     H: dateGetter('Hours', 1),\n    hh: dateGetter('Hours', 2, -12),\n     h: dateGetter('Hours', 1, -12),\n    mm: dateGetter('Minutes', 2),\n     m: dateGetter('Minutes', 1),\n    ss: dateGetter('Seconds', 2),\n     s: dateGetter('Seconds', 1),\n     // while ISO 8601 requires fractions to be prefixed with `.` or `,`\n     // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions\n   sss: dateGetter('Milliseconds', 3),\n  EEEE: dateStrGetter('Day'),\n   EEE: dateStrGetter('Day', true),\n     a: ampmGetter,\n     Z: timeZoneGetter,\n    ww: weekGetter(2),\n     w: weekGetter(1)\n};\n\nvar DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|w+))(.*)/,\n    NUMBER_STRING = /^\\-?\\d+$/;\n\n/**\n * @ngdoc filter\n * @name date\n * @function\n *\n * @description\n *   Formats `date` to a string based on the requested `format`.\n *\n *   `format` string can be composed of the following elements:\n *\n *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\n *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\n *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\n *   * `'MMMM'`: Month in year (January-December)\n *   * `'MMM'`: Month in year (Jan-Dec)\n *   * `'MM'`: Month in year, padded (01-12)\n *   * `'M'`: Month in year (1-12)\n *   * `'dd'`: Day in month, padded (01-31)\n *   * `'d'`: Day in month (1-31)\n *   * `'EEEE'`: Day in Week,(Sunday-Saturday)\n *   * `'EEE'`: Day in Week, (Sun-Sat)\n *   * `'HH'`: Hour in day, padded (00-23)\n *   * `'H'`: Hour in day (0-23)\n *   * `'hh'`: Hour in am/pm, padded (01-12)\n *   * `'h'`: Hour in am/pm, (1-12)\n *   * `'mm'`: Minute in hour, padded (00-59)\n *   * `'m'`: Minute in hour (0-59)\n *   * `'ss'`: Second in minute, padded (00-59)\n *   * `'s'`: Second in minute (0-59)\n *   * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)\n *   * `'a'`: am/pm marker\n *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)\n *   * `'ww'`: ISO-8601 week of year (00-53)\n *   * `'w'`: ISO-8601 week of year (0-53)\n *\n *   `format` string can also be one of the following predefined\n *   {@link guide/i18n localizable formats}:\n *\n *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\n *     (e.g. Sep 3, 2010 12:05:08 pm)\n *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 pm)\n *   * `'fullDate'`: equivalent to `'EEEE, MMMM d, y'` for en_US  locale\n *     (e.g. Friday, September 3, 2010)\n *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)\n *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)\n *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\n *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)\n *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)\n *\n *   `format` string can contain literal values. These need to be quoted with single quotes (e.g.\n *   `\"h 'in the morning'\"`). In order to output single quote, use two single quotes in a sequence\n *   (e.g. `\"h 'o''clock'\"`).\n *\n * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\n *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its\n *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is\n *    specified in the string input, the time is considered to be in the local timezone.\n * @param {string=} format Formatting rules (see Description). If not specified,\n *    `mediumDate` is used.\n * @returns {string} Formatted string or the input if input is not recognized as date/millis.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\n           <span>{{1288323623006 | date:'medium'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\n          <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>\n       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\n          <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should format date', function() {\n         expect(element(by.binding(\"1288323623006 | date:'medium'\")).getText()).\n            toMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\n         expect(element(by.binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).getText()).\n            toMatch(/2010\\-10\\-2\\d \\d{2}:\\d{2}:\\d{2} (\\-|\\+)?\\d{4}/);\n         expect(element(by.binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).getText()).\n            toMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\n       });\n     </file>\n   </example>\n */\ndateFilter.$inject = ['$locale'];\nfunction dateFilter($locale) {\n\n\n  var R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\n                     // 1        2       3         4          5          6          7          8  9     10      11\n  function jsonStringToDate(string) {\n    var match;\n    if (match = string.match(R_ISO8601_STR)) {\n      var date = new Date(0),\n          tzHour = 0,\n          tzMin  = 0,\n          dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,\n          timeSetter = match[8] ? date.setUTCHours : date.setHours;\n\n      if (match[9]) {\n        tzHour = int(match[9] + match[10]);\n        tzMin = int(match[9] + match[11]);\n      }\n      dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));\n      var h = int(match[4]||0) - tzHour;\n      var m = int(match[5]||0) - tzMin;\n      var s = int(match[6]||0);\n      var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);\n      timeSetter.call(date, h, m, s, ms);\n      return date;\n    }\n    return string;\n  }\n\n\n  return function(date, format) {\n    var text = '',\n        parts = [],\n        fn, match;\n\n    format = format || 'mediumDate';\n    format = $locale.DATETIME_FORMATS[format] || format;\n    if (isString(date)) {\n      if (NUMBER_STRING.test(date)) {\n        date = int(date);\n      } else {\n        date = jsonStringToDate(date);\n      }\n    }\n\n    if (isNumber(date)) {\n      date = new Date(date);\n    }\n\n    if (!isDate(date)) {\n      return date;\n    }\n\n    while(format) {\n      match = DATE_FORMATS_SPLIT.exec(format);\n      if (match) {\n        parts = concat(parts, match, 1);\n        format = parts.pop();\n      } else {\n        parts.push(format);\n        format = null;\n      }\n    }\n\n    forEach(parts, function(value){\n      fn = DATE_FORMATS[value];\n      text += fn ? fn(date, $locale.DATETIME_FORMATS)\n                 : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\n    });\n\n    return text;\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name json\n * @function\n *\n * @description\n *   Allows you to convert a JavaScript object into JSON string.\n *\n *   This filter is mostly useful for debugging. When using the double curly {{value}} notation\n *   the binding is automatically converted to JSON.\n *\n * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\n * @returns {string} JSON string.\n *\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <pre>{{ {'name':'value'} | json }}</pre>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should jsonify filtered objects', function() {\n         expect(element(by.binding(\"{'name':'value'}\")).getText()).toMatch(/\\{\\n  \"name\": ?\"value\"\\n}/);\n       });\n     </file>\n   </example>\n *\n */\nfunction jsonFilter() {\n  return function(object) {\n    return toJson(object, true);\n  };\n}\n\n\n/**\n * @ngdoc filter\n * @name lowercase\n * @function\n * @description\n * Converts string to lowercase.\n * @see angular.lowercase\n */\nvar lowercaseFilter = valueFn(lowercase);\n\n\n/**\n * @ngdoc filter\n * @name uppercase\n * @function\n * @description\n * Converts string to uppercase.\n * @see angular.uppercase\n */\nvar uppercaseFilter = valueFn(uppercase);\n\n/**\n * @ngdoc filter\n * @name limitTo\n * @function\n *\n * @description\n * Creates a new array or string containing only a specified number of elements. The elements\n * are taken from either the beginning or the end of the source array or string, as specified by\n * the value and sign (positive or negative) of `limit`.\n *\n * @param {Array|string} input Source array or string to be limited.\n * @param {string|number} limit The length of the returned array or string. If the `limit` number\n *     is positive, `limit` number of items from the beginning of the source array/string are copied.\n *     If the number is negative, `limit` number  of items from the end of the source array/string\n *     are copied. The `limit` will be trimmed if it exceeds `array.length`\n * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array\n *     had less than `limit` elements.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.numbers = [1,2,3,4,5,6,7,8,9];\n           $scope.letters = \"abcdefghi\";\n           $scope.numLimit = 3;\n           $scope.letterLimit = 3;\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         Limit {{numbers}} to: <input type=\"integer\" ng-model=\"numLimit\">\n         <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>\n         Limit {{letters}} to: <input type=\"integer\" ng-model=\"letterLimit\">\n         <p>Output letters: {{ letters | limitTo:letterLimit }}</p>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var numLimitInput = element(by.model('numLimit'));\n       var letterLimitInput = element(by.model('letterLimit'));\n       var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));\n       var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));\n\n       it('should limit the number array to first three items', function() {\n         expect(numLimitInput.getAttribute('value')).toBe('3');\n         expect(letterLimitInput.getAttribute('value')).toBe('3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abc');\n       });\n\n       it('should update the output when -3 is entered', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('-3');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('-3');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: ghi');\n       });\n\n       it('should not exceed the maximum size of input array', function() {\n         numLimitInput.clear();\n         numLimitInput.sendKeys('100');\n         letterLimitInput.clear();\n         letterLimitInput.sendKeys('100');\n         expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');\n         expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');\n       });\n     </file>\n   </example>\n */\nfunction limitToFilter(){\n  return function(input, limit) {\n    if (!isArray(input) && !isString(input)) return input;\n\n    if (Math.abs(Number(limit)) === Infinity) {\n      limit = Number(limit);\n    } else {\n      limit = int(limit);\n    }\n\n    if (isString(input)) {\n      //NaN check on limit\n      if (limit) {\n        return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);\n      } else {\n        return \"\";\n      }\n    }\n\n    var out = [],\n      i, n;\n\n    // if abs(limit) exceeds maximum length, trim it\n    if (limit > input.length)\n      limit = input.length;\n    else if (limit < -input.length)\n      limit = -input.length;\n\n    if (limit > 0) {\n      i = 0;\n      n = limit;\n    } else {\n      i = input.length + limit;\n      n = input.length;\n    }\n\n    for (; i<n; i++) {\n      out.push(input[i]);\n    }\n\n    return out;\n  };\n}\n\n/**\n * @ngdoc filter\n * @name orderBy\n * @function\n *\n * @description\n * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically\n * for strings and numerically for numbers. Note: if you notice numbers are not being sorted\n * correctly, make sure they are actually being saved as numbers and not strings.\n *\n * @param {Array} array The array to sort.\n * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be\n *    used by the comparator to determine the order of elements.\n *\n *    Can be one of:\n *\n *    - `function`: Getter function. The result of this function will be sorted using the\n *      `<`, `=`, `>` operator.\n *    - `string`: An Angular expression which evaluates to an object to order by, such as 'name'\n *      to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control\n *      ascending or descending sort order (for example, +name or -name).\n *    - `Array`: An array of function or string predicates. The first predicate in the array\n *      is used for sorting, but when two items are equivalent, the next predicate is used.\n *\n * @param {boolean=} reverse Reverse the order of the array.\n * @returns {Array} Sorted copy of the source array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.friends =\n               [{name:'John', phone:'555-1212', age:10},\n                {name:'Mary', phone:'555-9876', age:19},\n                {name:'Mike', phone:'555-4321', age:21},\n                {name:'Adam', phone:'555-5678', age:35},\n                {name:'Julie', phone:'555-8765', age:29}]\n           $scope.predicate = '-age';\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\n         <hr/>\n         [ <a href=\"\" ng-click=\"predicate=''\">unsorted</a> ]\n         <table class=\"friend\">\n           <tr>\n             <th><a href=\"\" ng-click=\"predicate = 'name'; reverse=false\">Name</a>\n                 (<a href=\"\" ng-click=\"predicate = '-name'; reverse=false\">^</a>)</th>\n             <th><a href=\"\" ng-click=\"predicate = 'phone'; reverse=!reverse\">Phone Number</a></th>\n             <th><a href=\"\" ng-click=\"predicate = 'age'; reverse=!reverse\">Age</a></th>\n           </tr>\n           <tr ng-repeat=\"friend in friends | orderBy:predicate:reverse\">\n             <td>{{friend.name}}</td>\n             <td>{{friend.phone}}</td>\n             <td>{{friend.age}}</td>\n           </tr>\n         </table>\n       </div>\n     </file>\n   </example>\n */\norderByFilter.$inject = ['$parse'];\nfunction orderByFilter($parse){\n  return function(array, sortPredicate, reverseOrder) {\n    if (!isArray(array)) return array;\n    if (!sortPredicate) return array;\n    sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];\n    sortPredicate = map(sortPredicate, function(predicate){\n      var descending = false, get = predicate || identity;\n      if (isString(predicate)) {\n        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {\n          descending = predicate.charAt(0) == '-';\n          predicate = predicate.substring(1);\n        }\n        get = $parse(predicate);\n        if (get.constant) {\n          var key = get();\n          return reverseComparator(function(a,b) {\n            return compare(a[key], b[key]);\n          }, descending);\n        }\n      }\n      return reverseComparator(function(a,b){\n        return compare(get(a),get(b));\n      }, descending);\n    });\n    var arrayCopy = [];\n    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }\n    return arrayCopy.sort(reverseComparator(comparator, reverseOrder));\n\n    function comparator(o1, o2){\n      for ( var i = 0; i < sortPredicate.length; i++) {\n        var comp = sortPredicate[i](o1, o2);\n        if (comp !== 0) return comp;\n      }\n      return 0;\n    }\n    function reverseComparator(comp, descending) {\n      return toBoolean(descending)\n          ? function(a,b){return comp(b,a);}\n          : comp;\n    }\n    function compare(v1, v2){\n      var t1 = typeof v1;\n      var t2 = typeof v2;\n      if (t1 == t2) {\n        if (t1 == \"string\") {\n           v1 = v1.toLowerCase();\n           v2 = v2.toLowerCase();\n        }\n        if (v1 === v2) return 0;\n        return v1 < v2 ? -1 : 1;\n      } else {\n        return t1 < t2 ? -1 : 1;\n      }\n    }\n  };\n}\n\nfunction ngDirective(directive) {\n  if (isFunction(directive)) {\n    directive = {\n      link: directive\n    };\n  }\n  directive.restrict = directive.restrict || 'AC';\n  return valueFn(directive);\n}\n\n/**\n * @ngdoc directive\n * @name a\n * @restrict E\n *\n * @description\n * Modifies the default behavior of the html A tag so that the default action is prevented when\n * the href attribute is empty.\n *\n * This change permits the easy creation of action links with the `ngClick` directive\n * without changing the location or causing page reloads, e.g.:\n * `<a href=\"\" ng-click=\"list.addItem()\">Add Item</a>`\n */\nvar htmlAnchorDirective = valueFn({\n  restrict: 'E',\n  compile: function(element, attr) {\n\n    if (msie <= 8) {\n\n      // turn <a href ng-click=\"..\">link</a> into a stylable link in IE\n      // but only if it doesn't have name attribute, in which case it's an anchor\n      if (!attr.href && !attr.name) {\n        attr.$set('href', '');\n      }\n\n      // add a comment node to anchors to workaround IE bug that causes element content to be reset\n      // to new attribute content if attribute is updated with value containing @ and element also\n      // contains value with @\n      // see issue #1949\n      element.append(document.createComment('IE fix'));\n    }\n\n    if (!attr.href && !attr.xlinkHref && !attr.name) {\n      return function(scope, element) {\n        // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\n        var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?\n                   'xlink:href' : 'href';\n        element.on('click', function(event){\n          // if we have no href url, then don't navigate anywhere.\n          if (!element.attr(href)) {\n            event.preventDefault();\n          }\n        });\n      };\n    }\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngHref\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in an href attribute will\n * make the link go to the wrong URL if the user clicks it before\n * Angular has a chance to replace the `{{hash}}` markup with its\n * value. Until Angular replaces the markup the link will be broken\n * and will most likely return a 404 error.\n *\n * The `ngHref` directive solves this problem.\n *\n * The wrong way to write it:\n * ```html\n * <a href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * @element A\n * @param {template} ngHref any string which can contain `{{}}` markup.\n *\n * @example\n * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes\n * in links and their different behaviors:\n    <example>\n      <file name=\"index.html\">\n        <input ng-model=\"value\" /><br />\n        <a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\n        <a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\n        <a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\n        <a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\n        <a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\n        <a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should execute ng-click but not reload when href without value', function() {\n          element(by.id('link-1')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('1');\n          expect(element(by.id('link-1')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when href empty string', function() {\n          element(by.id('link-2')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('2');\n          expect(element(by.id('link-2')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click and change url when ng-href specified', function() {\n          expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\\/123$/);\n\n          element(by.id('link-3')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/123$/);\n            });\n          }, 1000, 'page should navigate to /123');\n        });\n\n        xit('should execute ng-click but not reload when href empty string and name specified', function() {\n          element(by.id('link-4')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('4');\n          expect(element(by.id('link-4')).getAttribute('href')).toBe('');\n        });\n\n        it('should execute ng-click but not reload when no href but name specified', function() {\n          element(by.id('link-5')).click();\n          expect(element(by.model('value')).getAttribute('value')).toEqual('5');\n          expect(element(by.id('link-5')).getAttribute('href')).toBe(null);\n        });\n\n        it('should only change url when only ng-href', function() {\n          element(by.model('value')).clear();\n          element(by.model('value')).sendKeys('6');\n          expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\\/6$/);\n\n          element(by.id('link-6')).click();\n\n          // At this point, we navigate away from an Angular page, so we need\n          // to use browser.driver to get the base webdriver.\n          browser.wait(function() {\n            return browser.driver.getCurrentUrl().then(function(url) {\n              return url.match(/\\/6$/);\n            });\n          }, 1000, 'page should navigate to /6');\n        });\n      </file>\n    </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngSrc\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrc` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\n * ```\n *\n * @element IMG\n * @param {template} ngSrc any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngSrcset\n * @restrict A\n * @priority 99\n *\n * @description\n * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't\n * work right: The browser will fetch from the URL with the literal\n * text `{{hash}}` until Angular replaces the expression inside\n * `{{hash}}`. The `ngSrcset` directive solves this problem.\n *\n * The buggy way to write it:\n * ```html\n * <img srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\n * ```\n *\n * The correct way to write it:\n * ```html\n * <img ng-srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\n * ```\n *\n * @element IMG\n * @param {template} ngSrcset any string which can contain `{{}}` markup.\n */\n\n/**\n * @ngdoc directive\n * @name ngDisabled\n * @restrict A\n * @priority 100\n *\n * @description\n *\n * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:\n * ```html\n * <div ng-init=\"scope = { isDisabled: false }\">\n *  <button disabled=\"{{scope.isDisabled}}\">Disabled</button>\n * </div>\n * ```\n *\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as disabled. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngDisabled` directive solves this problem for the `disabled` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        Click me to toggle: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n        <button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle button', function() {\n          expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,\n *     then special attribute \"disabled\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngChecked\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as checked. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngChecked` directive solves this problem for the `checked` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to check both: <input type=\"checkbox\" ng-model=\"master\"><br/>\n        <input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\">\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should check both checkBoxes', function() {\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();\n          element(by.model('master')).click();\n          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,\n *     then special attribute \"checked\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngReadonly\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as readonly. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngReadonly` directive solves this problem for the `readonly` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n        <input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\"/>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should toggle readonly attr', function() {\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeFalsy();\n          element(by.model('checked')).click();\n          expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element INPUT\n * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,\n *     then special attribute \"readonly\" will be set on the element\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSelected\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as selected. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngSelected` directive solves this problem for the `selected` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        Check me to select: <input type=\"checkbox\" ng-model=\"selected\"><br/>\n        <select>\n          <option>Hello!</option>\n          <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\n        </select>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should select Greetings!', function() {\n          expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();\n          element(by.model('selected')).click();\n          expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();\n        });\n      </file>\n    </example>\n *\n * @element OPTION\n * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,\n *     then special attribute \"selected\" will be set on the element\n */\n\n/**\n * @ngdoc directive\n * @name ngOpen\n * @restrict A\n * @priority 100\n *\n * @description\n * The HTML specification does not require browsers to preserve the values of boolean attributes\n * such as open. (Their presence means true and their absence means false.)\n * If we put an Angular interpolation expression into such an attribute then the\n * binding information would be lost when the browser removes the attribute.\n * The `ngOpen` directive solves this problem for the `open` attribute.\n * This complementary directive is not removed by the browser and so provides\n * a permanent reliable place to store the binding information.\n * @example\n     <example>\n       <file name=\"index.html\">\n         Check me check multiple: <input type=\"checkbox\" ng-model=\"open\"><br/>\n         <details id=\"details\" ng-open=\"open\">\n            <summary>Show/Hide me</summary>\n         </details>\n       </file>\n       <file name=\"protractor.js\" type=\"protractor\">\n         it('should toggle open', function() {\n           expect(element(by.id('details')).getAttribute('open')).toBeFalsy();\n           element(by.model('open')).click();\n           expect(element(by.id('details')).getAttribute('open')).toBeTruthy();\n         });\n       </file>\n     </example>\n *\n * @element DETAILS\n * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,\n *     then special attribute \"open\" will be set on the element\n */\n\nvar ngAttributeAliasDirectives = {};\n\n\n// boolean attrs are evaluated\nforEach(BOOLEAN_ATTR, function(propName, attrName) {\n  // binding to multiple is not supported\n  if (propName == \"multiple\") return;\n\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      priority: 100,\n      link: function(scope, element, attr) {\n        scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {\n          attr.$set(attrName, !!value);\n        });\n      }\n    };\n  };\n});\n\n\n// ng-src, ng-srcset, ng-href are interpolated\nforEach(['src', 'srcset', 'href'], function(attrName) {\n  var normalized = directiveNormalize('ng-' + attrName);\n  ngAttributeAliasDirectives[normalized] = function() {\n    return {\n      priority: 99, // it needs to run after the attributes are interpolated\n      link: function(scope, element, attr) {\n        var propName = attrName,\n            name = attrName;\n\n        if (attrName === 'href' &&\n            toString.call(element.prop('href')) === '[object SVGAnimatedString]') {\n          name = 'xlinkHref';\n          attr.$attr[name] = 'xlink:href';\n          propName = null;\n        }\n\n        attr.$observe(normalized, function(value) {\n          if (!value)\n             return;\n\n          attr.$set(name, value);\n\n          // on IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\n          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\n          // to set the property as well to achieve the desired effect.\n          // we use attr[attrName] value since $set can sanitize the url.\n          if (msie && propName) element.prop(propName, attr[name]);\n        });\n      }\n    };\n  };\n});\n\n/* global -nullFormCtrl */\nvar nullFormCtrl = {\n  $addControl: noop,\n  $removeControl: noop,\n  $setValidity: noop,\n  $setDirty: noop,\n  $setPristine: noop\n};\n\n/**\n * @ngdoc type\n * @name form.FormController\n *\n * @property {boolean} $pristine True if user has not interacted with the form yet.\n * @property {boolean} $dirty True if user has already interacted with the form.\n * @property {boolean} $valid True if all of the containing forms and controls are valid.\n * @property {boolean} $invalid True if at least one containing control or form is invalid.\n *\n * @property {Object} $error Is an object hash, containing references to all invalid controls or\n *  forms, where:\n *\n *  - keys are validation tokens (error names),\n *  - values are arrays of controls or forms that are invalid for given error name.\n *\n *\n *  Built-in validation tokens:\n *\n *  - `email`\n *  - `max`\n *  - `maxlength`\n *  - `min`\n *  - `minlength`\n *  - `number`\n *  - `pattern`\n *  - `required`\n *  - `url`\n *\n * @description\n * `FormController` keeps track of all its controls and nested forms as well as the state of them,\n * such as being valid/invalid or dirty/pristine.\n *\n * Each {@link ng.directive:form form} directive creates an instance\n * of `FormController`.\n *\n */\n//asks for $scope to fool the BC controller module\nFormController.$inject = ['$element', '$attrs', '$scope', '$animate'];\nfunction FormController(element, attrs, $scope, $animate) {\n  var form = this,\n      parentForm = element.parent().controller('form') || nullFormCtrl,\n      invalidCount = 0, // used to easily determine if we are valid\n      errors = form.$error = {},\n      controls = [];\n\n  // init state\n  form.$name = attrs.name || attrs.ngForm;\n  form.$dirty = false;\n  form.$pristine = true;\n  form.$valid = true;\n  form.$invalid = false;\n\n  parentForm.$addControl(form);\n\n  // Setup initial state of the control\n  element.addClass(PRISTINE_CLASS);\n  toggleValidCss(true);\n\n  // convenience method for easy toggling of classes\n  function toggleValidCss(isValid, validationErrorKey) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n    $animate.removeClass(element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);\n    $animate.addClass(element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\n  }\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$commitViewValue\n   *\n   * @description\n   * Commit all form controls pending updates to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  form.$commitViewValue = function() {\n    forEach(controls, function(control) {\n      control.$commitViewValue();\n    });\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$addControl\n   *\n   * @description\n   * Register a control with the form.\n   *\n   * Input elements using ngModelController do this automatically when they are linked.\n   */\n  form.$addControl = function(control) {\n    // Breaking change - before, inputs whose name was \"hasOwnProperty\" were quietly ignored\n    // and not added to the scope.  Now we throw an error.\n    assertNotHasOwnProperty(control.$name, 'input');\n    controls.push(control);\n\n    if (control.$name) {\n      form[control.$name] = control;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$removeControl\n   *\n   * @description\n   * Deregister a control from the form.\n   *\n   * Input elements using ngModelController do this automatically when they are destroyed.\n   */\n  form.$removeControl = function(control) {\n    if (control.$name && form[control.$name] === control) {\n      delete form[control.$name];\n    }\n    forEach(errors, function(queue, validationToken) {\n      form.$setValidity(validationToken, true, control);\n    });\n\n    arrayRemove(controls, control);\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setValidity\n   *\n   * @description\n   * Sets the validity of a form control.\n   *\n   * This method will also propagate to parent forms.\n   */\n  form.$setValidity = function(validationToken, isValid, control) {\n    var queue = errors[validationToken];\n\n    if (isValid) {\n      if (queue) {\n        arrayRemove(queue, control);\n        if (!queue.length) {\n          invalidCount--;\n          if (!invalidCount) {\n            toggleValidCss(isValid);\n            form.$valid = true;\n            form.$invalid = false;\n          }\n          errors[validationToken] = false;\n          toggleValidCss(true, validationToken);\n          parentForm.$setValidity(validationToken, true, form);\n        }\n      }\n\n    } else {\n      if (!invalidCount) {\n        toggleValidCss(isValid);\n      }\n      if (queue) {\n        if (includes(queue, control)) return;\n      } else {\n        errors[validationToken] = queue = [];\n        invalidCount++;\n        toggleValidCss(false, validationToken);\n        parentForm.$setValidity(validationToken, false, form);\n      }\n      queue.push(control);\n\n      form.$valid = false;\n      form.$invalid = true;\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setDirty\n   *\n   * @description\n   * Sets the form to a dirty state.\n   *\n   * This method can be called to add the 'ng-dirty' class and set the form to a dirty\n   * state (ng-dirty class). This method will also propagate to parent forms.\n   */\n  form.$setDirty = function() {\n    $animate.removeClass(element, PRISTINE_CLASS);\n    $animate.addClass(element, DIRTY_CLASS);\n    form.$dirty = true;\n    form.$pristine = false;\n    parentForm.$setDirty();\n  };\n\n  /**\n   * @ngdoc method\n   * @name form.FormController#$setPristine\n   *\n   * @description\n   * Sets the form to its pristine state.\n   *\n   * This method can be called to remove the 'ng-dirty' class and set the form to its pristine\n   * state (ng-pristine class). This method will also propagate to all the controls contained\n   * in this form.\n   *\n   * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after\n   * saving or resetting it.\n   */\n  form.$setPristine = function () {\n    $animate.removeClass(element, DIRTY_CLASS);\n    $animate.addClass(element, PRISTINE_CLASS);\n    form.$dirty = false;\n    form.$pristine = true;\n    forEach(controls, function(control) {\n      control.$setPristine();\n    });\n  };\n}\n\n\n/**\n * @ngdoc directive\n * @name ngForm\n * @restrict EAC\n *\n * @description\n * Nestable alias of {@link ng.directive:form `form`} directive. HTML\n * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\n * sub-group of controls needs to be determined.\n *\n * Note: the purpose of `ngForm` is to group controls,\n * but not to be a replacement for the `<form>` tag with all of its capabilities\n * (e.g. posting to the server, ...).\n *\n * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n *\n */\n\n /**\n * @ngdoc directive\n * @name form\n * @restrict E\n *\n * @description\n * Directive that instantiates\n * {@link form.FormController FormController}.\n *\n * If the `name` attribute is specified, the form controller is published onto the current scope under\n * this name.\n *\n * # Alias: {@link ng.directive:ngForm `ngForm`}\n *\n * In Angular forms can be nested. This means that the outer form is valid when all of the child\n * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so\n * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to\n * `<form>` but can be nested.  This allows you to have nested forms, which is very useful when\n * using Angular validation directives in forms that are dynamically generated using the\n * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name`\n * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an\n * `ngForm` directive and nest these in an outer `form` element.\n *\n *\n * # CSS classes\n *  - `ng-valid` is set if the form is valid.\n *  - `ng-invalid` is set if the form is invalid.\n *  - `ng-pristine` is set if the form is pristine.\n *  - `ng-dirty` is set if the form is dirty.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n *\n * # Submitting a form and preventing the default action\n *\n * Since the role of forms in client-side Angular applications is different than in classical\n * roundtrip apps, it is desirable for the browser not to translate the form submission into a full\n * page reload that sends the data to the server. Instead some javascript logic should be triggered\n * to handle the form submission in an application-specific way.\n *\n * For this reason, Angular prevents the default action (form submission to the server) unless the\n * `<form>` element has an `action` attribute specified.\n *\n * You can use one of the following two ways to specify what javascript method should be called when\n * a form is submitted:\n *\n * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\n * - {@link ng.directive:ngClick ngClick} directive on the first\n  *  button or input field of type submit (input[type=submit])\n *\n * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}\n * or {@link ng.directive:ngClick ngClick} directives.\n * This is because of the following form submission rules in the HTML specification:\n *\n * - If a form has only one input field then hitting enter in this field triggers form submit\n * (`ngSubmit`)\n * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter\n * doesn't trigger submit\n * - if a form has one or more input fields and one or more buttons or input[type=submit] then\n * hitting enter in any of the input fields will trigger the click handler on the *first* button or\n * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\n *\n * Any pending `ngModelOptions` changes will take place immediately when an enclosing form is\n * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * @param {string=} name Name of the form. If specified, the form controller will be published into\n *                       related scope, under this name.\n *\n * ## Animation Hooks\n *\n * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.\n * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any\n * other validations that are performed within the form. Animations in ngForm are similar to how\n * they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well\n * as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style a form element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-form {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-form.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n    <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.userType = 'guest';\n         }\n       </script>\n       <style>\n        .my-form {\n          -webkit-transition:all linear 0.5s;\n          transition:all linear 0.5s;\n          background: transparent;\n        }\n        .my-form.ng-invalid {\n          background: red;\n        }\n       </style>\n       <form name=\"myForm\" ng-controller=\"Ctrl\" class=\"my-form\">\n         userType: <input name=\"input\" ng-model=\"userType\" required>\n         <span class=\"error\" ng-show=\"myForm.input.$error.required\">Required!</span><br>\n         <tt>userType = {{userType}}</tt><br>\n         <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>\n         <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should initialize to model', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n\n          expect(userType.getText()).toContain('guest');\n          expect(valid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty', function() {\n          var userType = element(by.binding('userType'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var userInput = element(by.model('userType'));\n\n          userInput.clear();\n          userInput.sendKeys('');\n\n          expect(userType.getText()).toEqual('userType =');\n          expect(valid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n *\n */\nvar formDirectiveFactory = function(isNgForm) {\n  return ['$timeout', function($timeout) {\n    var formDirective = {\n      name: 'form',\n      restrict: isNgForm ? 'EAC' : 'E',\n      controller: FormController,\n      compile: function() {\n        return {\n          pre: function(scope, formElement, attr, controller) {\n            if (!attr.action) {\n              // we can't use jq events because if a form is destroyed during submission the default\n              // action is not prevented. see #1238\n              //\n              // IE 9 is not affected because it doesn't fire a submit event and try to do a full\n              // page reload if the form was destroyed by submission of the form via a click handler\n              // on a button in the form. Looks like an IE9 specific bug.\n              var handleFormSubmission = function(event) {\n                scope.$apply(function() {\n                  controller.$commitViewValue();\n                });\n\n                event.preventDefault\n                  ? event.preventDefault()\n                  : event.returnValue = false; // IE\n              };\n\n              addEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n\n              // unregister the preventDefault listener so that we don't not leak memory but in a\n              // way that will achieve the prevention of the default action.\n              formElement.on('$destroy', function() {\n                $timeout(function() {\n                  removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);\n                }, 0, false);\n              });\n            }\n\n            var parentFormCtrl = formElement.parent().controller('form'),\n                alias = attr.name || attr.ngForm;\n\n            if (alias) {\n              setter(scope, alias, controller, alias);\n            }\n            if (parentFormCtrl) {\n              formElement.on('$destroy', function() {\n                parentFormCtrl.$removeControl(controller);\n                if (alias) {\n                  setter(scope, alias, undefined, alias);\n                }\n                extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\n              });\n            }\n          }\n        };\n      }\n    };\n\n    return formDirective;\n  }];\n};\n\nvar formDirective = formDirectiveFactory();\nvar ngFormDirective = formDirectiveFactory(true);\n\n/* global\n\n    -VALID_CLASS,\n    -INVALID_CLASS,\n    -PRISTINE_CLASS,\n    -DIRTY_CLASS\n*/\n\nvar URL_REGEXP = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/;\nvar EMAIL_REGEXP = /^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\\.[a-z0-9-]+)*$/i;\nvar NUMBER_REGEXP = /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/;\nvar DATE_REGEXP = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\nvar DATETIMELOCAL_REGEXP = /^(\\d{4})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d)$/;\nvar WEEK_REGEXP = /^(\\d{4})-W(\\d\\d)$/;\nvar MONTH_REGEXP = /^(\\d{4})-(\\d\\d)$/;\nvar TIME_REGEXP = /^(\\d\\d):(\\d\\d)$/;\nvar DEFAULT_REGEXP = /(\\s+|^)default(\\s+|$)/;\n\nvar inputType = {\n\n  /**\n   * @ngdoc input\n   * @name input[text]\n   *\n   * @description\n   * Standard HTML text input with angular data binding.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Adds `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\n   *\n   * @example\n      <example name=\"text-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.text = 'guest';\n             $scope.word = /^\\s*\\w*\\s*$/;\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           Single word: <input type=\"text\" name=\"input\" ng-model=\"text\"\n                               ng-pattern=\"word\" required ng-trim=\"false\">\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\n             Single word only!</span>\n\n           <tt>text = {{text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('guest');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if multi word', function() {\n            input.clear();\n            input.sendKeys('hello world');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'text': textInputType,\n\n    /**\n     * @ngdoc input\n     * @name input[date]\n     *\n     * @description\n     * Input with date validation and transformation. In browsers that do not yet support\n     * the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601\n     * date format (yyyy-MM-dd), for example: `2009-01-06`. The model must always be a Date object.\n     *\n     * @param {string} ngModel Assignable angular expression to data-bind to.\n     * @param {string=} name Property name of the form under which the control is published.\n     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n     * valid ISO date string (yyyy-MM-dd).\n     * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n     * a valid ISO date string (yyyy-MM-dd).\n     * @param {string=} required Sets `required` validation error key if the value is not entered.\n     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n     *    `required` when you want to data-bind to the `required` attribute.\n     * @param {string=} ngChange Angular expression to be executed when input changes due to user\n     *    interaction with the input element.\n     *\n     * @example\n     <example name=\"date-input-directive\">\n     <file name=\"index.html\">\n       <script>\n          function Ctrl($scope) {\n            $scope.value = new Date(2013, 9, 22);\n          }\n       </script>\n       <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n          Pick a date between in 2013:\n          <input type=\"date\" id=\"exampleInput\" name=\"input\" ng-model=\"value\"\n              placeholder=\"yyyy-MM-dd\" min=\"2013-01-01\" max=\"2013-12-31\" required />\n          <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n              Required!</span>\n          <span class=\"error\" ng-show=\"myForm.input.$error.date\">\n              Not a valid date!</span>\n           <tt>value = {{value | date: \"yyyy-MM-dd\"}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n       </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        var value = element(by.binding('value | date: \"yyyy-MM-dd\"'));\n        var valid = element(by.binding('myForm.input.$valid'));\n        var input = element(by.model('value'));\n\n        // currently protractor/webdriver does not support\n        // sending keys to all known HTML5 input controls\n        // for various browsers (see https://github.com/angular/protractor/issues/562).\n        function setInput(val) {\n          // set the value of the element and force validation.\n          var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n          \"ipt.value = '\" + val + \"';\" +\n          \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n          browser.executeScript(scr);\n        }\n\n        it('should initialize to model', function() {\n          expect(value.getText()).toContain('2013-10-22');\n          expect(valid.getText()).toContain('myForm.input.$valid = true');\n        });\n\n        it('should be invalid if empty', function() {\n          setInput('');\n          expect(value.getText()).toEqual('value =');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n\n        it('should be invalid if over max', function() {\n          setInput('2015-01-01');\n          expect(value.getText()).toContain('');\n          expect(valid.getText()).toContain('myForm.input.$valid = false');\n        });\n     </file>\n     </example>f\n     */\n  'date': createDateInputType('date', DATE_REGEXP,\n         createDateParser(DATE_REGEXP, ['yyyy', 'MM', 'dd']),\n         'yyyy-MM-dd'),\n\n   /**\n    * @ngdoc input\n    * @name input[dateTimeLocal]\n    *\n    * @description\n    * Input with datetime validation and transformation. In browsers that do not yet support\n    * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * local datetime format (yyyy-MM-ddTHH:mm), for example: `2010-12-28T14:57`. The model must be a Date object.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n    * valid ISO datetime format (yyyy-MM-ddTHH:mm).\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n    * a valid ISO datetime format (yyyy-MM-ddTHH:mm).\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"datetimelocal-input-directive\">\n    <file name=\"index.html\">\n      <script>\n        function Ctrl($scope) {\n          $scope.value = new Date(2010, 11, 28, 14, 57);\n        }\n      </script>\n      <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n        Pick a date between in 2013:\n        <input type=\"datetime-local\" id=\"exampleInput\" name=\"input\" ng-model=\"value\"\n            placeholder=\"yyyy-MM-ddTHH:mm\" min=\"2001-01-01T00:00\" max=\"2013-12-31T00:00\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.datetimelocal\">\n            Not a valid date!</span>\n        <tt>value = {{value | date: \"yyyy-MM-ddTHH:mm\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"yyyy-MM-ddTHH:mm\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2010-12-28T14:57');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01-01T23:59');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'datetime-local': createDateInputType('datetimelocal', DATETIMELOCAL_REGEXP,\n      createDateParser(DATETIMELOCAL_REGEXP, ['yyyy', 'MM', 'dd', 'HH', 'mm']),\n      'yyyy-MM-ddTHH:mm'),\n\n  /**\n   * @ngdoc input\n   * @name input[time]\n   *\n   * @description\n   * Input with time validation and transformation. In browsers that do not yet support\n   * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * local time format (HH:mm), for example: `14:57`. Model must be a Date object. This binding will always output a\n   * Date object to the model of January 1, 1900, or local date `new Date(0, 0, 1, HH, mm)`.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n   * valid ISO time format (HH:mm).\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be a\n   * valid ISO time format (HH:mm).\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"time-input-directive\">\n   <file name=\"index.html\">\n     <script>\n      function Ctrl($scope) {\n        $scope.value = new Date(0, 0, 1, 14, 57);\n      }\n     </script>\n     <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n        Pick a between 8am and 5pm:\n        <input type=\"time\" id=\"exampleInput\" name=\"input\" ng-model=\"value\"\n            placeholder=\"HH:mm\" min=\"08:00\" max=\"17:00\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.time\">\n            Not a valid date!</span>\n        <tt>value = {{value | date: \"HH:mm\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"HH:mm\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('14:57');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('23:59');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'time': createDateInputType('time', TIME_REGEXP,\n      createDateParser(TIME_REGEXP, ['HH', 'mm']),\n     'HH:mm'),\n\n   /**\n    * @ngdoc input\n    * @name input[week]\n    *\n    * @description\n    * Input with week-of-the-year validation and transformation to Date. In browsers that do not yet support\n    * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n    * week format (yyyy-W##), for example: `2013-W02`. The model must always be a Date object.\n    *\n    * @param {string} ngModel Assignable angular expression to data-bind to.\n    * @param {string=} name Property name of the form under which the control is published.\n    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a\n    * valid ISO week format (yyyy-W##).\n    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be\n    * a valid ISO week format (yyyy-W##).\n    * @param {string=} required Sets `required` validation error key if the value is not entered.\n    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n    *    `required` when you want to data-bind to the `required` attribute.\n    * @param {string=} ngChange Angular expression to be executed when input changes due to user\n    *    interaction with the input element.\n    *\n    * @example\n    <example name=\"week-input-directive\">\n    <file name=\"index.html\">\n      <script>\n      function Ctrl($scope) {\n        $scope.value = new Date(2013, 0, 3);\n      }\n      </script>\n      <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n        Pick a date between in 2013:\n        <input id=\"exampleInput\" type=\"week\" name=\"input\" ng-model=\"value\"\n            placeholder=\"YYYY-W##\" min=\"2012-W32\" max=\"2013-W52\" required />\n        <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n            Required!</span>\n        <span class=\"error\" ng-show=\"myForm.input.$error.week\">\n            Not a valid date!</span>\n        <tt>value = {{value | date: \"yyyy-Www\"}}</tt><br/>\n        <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n        <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n        <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n        <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"yyyy-Www\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-W01');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-W01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n    </file>\n    </example>\n    */\n  'week': createDateInputType('week', WEEK_REGEXP, weekParser, 'yyyy-Www'),\n\n  /**\n   * @ngdoc input\n   * @name input[month]\n   *\n   * @description\n   * Input with month validation and transformation. In browsers that do not yet support\n   * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601\n   * month format (yyyy-MM), for example: `2009-01`. The model must always be a Date object. In the event the model is\n   * not set to the first of the month, the first of that model's month is assumed.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be\n   * a valid ISO month format (yyyy-MM).\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must\n   * be a valid ISO month format (yyyy-MM).\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n   <example name=\"month-input-directive\">\n   <file name=\"index.html\">\n     <script>\n      function Ctrl($scope) {\n        $scope.value = new Date(2013, 9, 1);\n      }\n     </script>\n     <form name=\"myForm\" ng-controller=\"Ctrl as dateCtrl\">\n       Pick a month int 2013:\n       <input id=\"exampleInput\" type=\"month\" name=\"input\" ng-model=\"value\"\n          placeholder=\"yyyy-MM\" min=\"2013-01\" max=\"2013-12\" required />\n       <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n          Required!</span>\n       <span class=\"error\" ng-show=\"myForm.input.$error.month\">\n          Not a valid month!</span>\n       <tt>value = {{value | date: \"yyyy-MM\"}}</tt><br/>\n       <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n       <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n       <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n       <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n     </form>\n   </file>\n   <file name=\"protractor.js\" type=\"protractor\">\n      var value = element(by.binding('value | date: \"yyyy-MM\"'));\n      var valid = element(by.binding('myForm.input.$valid'));\n      var input = element(by.model('value'));\n\n      // currently protractor/webdriver does not support\n      // sending keys to all known HTML5 input controls\n      // for various browsers (https://github.com/angular/protractor/issues/562).\n      function setInput(val) {\n        // set the value of the element and force validation.\n        var scr = \"var ipt = document.getElementById('exampleInput'); \" +\n        \"ipt.value = '\" + val + \"';\" +\n        \"angular.element(ipt).scope().$apply(function(s) { s.myForm[ipt.name].$setViewValue('\" + val + \"'); });\";\n        browser.executeScript(scr);\n      }\n\n      it('should initialize to model', function() {\n        expect(value.getText()).toContain('2013-10');\n        expect(valid.getText()).toContain('myForm.input.$valid = true');\n      });\n\n      it('should be invalid if empty', function() {\n        setInput('');\n        expect(value.getText()).toEqual('value =');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n\n      it('should be invalid if over max', function() {\n        setInput('2015-01');\n        expect(value.getText()).toContain('');\n        expect(valid.getText()).toContain('myForm.input.$valid = false');\n      });\n   </file>\n   </example>\n   */\n  'month': createDateInputType('month', MONTH_REGEXP,\n     createDateParser(MONTH_REGEXP, ['yyyy', 'MM']),\n     'yyyy-MM'),\n\n  /**\n   * @ngdoc input\n   * @name input[number]\n   *\n   * @description\n   * Text input with number validation and transformation. Sets the `number` validation\n   * error if not a valid number.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\n   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"number-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.value = 12;\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           Number: <input type=\"number\" name=\"input\" ng-model=\"value\"\n                          min=\"0\" max=\"99\" required>\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.number\">\n             Not valid number!</span>\n           <tt>value = {{value}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var value = element(by.binding('value'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('value'));\n\n          it('should initialize to model', function() {\n            expect(value.getText()).toContain('12');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if over max', function() {\n            input.clear();\n            input.sendKeys('123');\n            expect(value.getText()).toEqual('value =');\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'number': numberInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[url]\n   *\n   * @description\n   * Text input with URL validation. Sets the `url` validation error key if the content is not a\n   * valid URL.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"url-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.text = 'http://google.com';\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           URL: <input type=\"url\" name=\"input\" ng-model=\"text\" required>\n           <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n             Required!</span>\n           <span class=\"error\" ng-show=\"myForm.input.$error.url\">\n             Not valid url!</span>\n           <tt>text = {{text}}</tt><br/>\n           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('http://google.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not url', function() {\n            input.clear();\n            input.sendKeys('box');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'url': urlInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[email]\n   *\n   * @description\n   * Text input with email validation. Sets the `email` validation error key if not a valid email\n   * address.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} required Sets `required` validation error key if the value is not entered.\n   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n   *    `required` when you want to data-bind to the `required` attribute.\n   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n   *    minlength.\n   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n   *    maxlength.\n   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n   *    patterns defined as scope expressions.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"email-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.text = 'me@example.com';\n           }\n         </script>\n           <form name=\"myForm\" ng-controller=\"Ctrl\">\n             Email: <input type=\"email\" name=\"input\" ng-model=\"text\" required>\n             <span class=\"error\" ng-show=\"myForm.input.$error.required\">\n               Required!</span>\n             <span class=\"error\" ng-show=\"myForm.input.$error.email\">\n               Not valid email!</span>\n             <tt>text = {{text}}</tt><br/>\n             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\n             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\n             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\n           </form>\n         </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          var text = element(by.binding('text'));\n          var valid = element(by.binding('myForm.input.$valid'));\n          var input = element(by.model('text'));\n\n          it('should initialize to model', function() {\n            expect(text.getText()).toContain('me@example.com');\n            expect(valid.getText()).toContain('true');\n          });\n\n          it('should be invalid if empty', function() {\n            input.clear();\n            input.sendKeys('');\n            expect(text.getText()).toEqual('text =');\n            expect(valid.getText()).toContain('false');\n          });\n\n          it('should be invalid if not email', function() {\n            input.clear();\n            input.sendKeys('xxx');\n\n            expect(valid.getText()).toContain('false');\n          });\n        </file>\n      </example>\n   */\n  'email': emailInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[radio]\n   *\n   * @description\n   * HTML radio button.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string} value The value to which the expression should be set when selected.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   * @param {string} ngValue Angular expression which sets the value to which the expression should\n   *    be set when selected.\n   *\n   * @example\n      <example name=\"radio-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.color = 'blue';\n             $scope.specialValue = {\n               \"id\": \"12345\",\n               \"value\": \"green\"\n             };\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           <input type=\"radio\" ng-model=\"color\" value=\"red\">  Red <br/>\n           <input type=\"radio\" ng-model=\"color\" ng-value=\"specialValue\"> Green <br/>\n           <input type=\"radio\" ng-model=\"color\" value=\"blue\"> Blue <br/>\n           <tt>color = {{color | json}}</tt><br/>\n          </form>\n          Note that `ng-value=\"specialValue\"` sets radio item's value to be the value of `$scope.specialValue`.\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var color = element(by.binding('color'));\n\n            expect(color.getText()).toContain('blue');\n\n            element.all(by.model('color')).get(0).click();\n\n            expect(color.getText()).toContain('red');\n          });\n        </file>\n      </example>\n   */\n  'radio': radioInputType,\n\n\n  /**\n   * @ngdoc input\n   * @name input[checkbox]\n   *\n   * @description\n   * HTML checkbox.\n   *\n   * @param {string} ngModel Assignable angular expression to data-bind to.\n   * @param {string=} name Property name of the form under which the control is published.\n   * @param {string=} ngTrueValue The value to which the expression should be set when selected.\n   * @param {string=} ngFalseValue The value to which the expression should be set when not selected.\n   * @param {string=} ngChange Angular expression to be executed when input changes due to user\n   *    interaction with the input element.\n   *\n   * @example\n      <example name=\"checkbox-input-directive\">\n        <file name=\"index.html\">\n         <script>\n           function Ctrl($scope) {\n             $scope.value1 = true;\n             $scope.value2 = 'YES'\n           }\n         </script>\n         <form name=\"myForm\" ng-controller=\"Ctrl\">\n           Value1: <input type=\"checkbox\" ng-model=\"value1\"> <br/>\n           Value2: <input type=\"checkbox\" ng-model=\"value2\"\n                          ng-true-value=\"YES\" ng-false-value=\"NO\"> <br/>\n           <tt>value1 = {{value1}}</tt><br/>\n           <tt>value2 = {{value2}}</tt><br/>\n          </form>\n        </file>\n        <file name=\"protractor.js\" type=\"protractor\">\n          it('should change state', function() {\n            var value1 = element(by.binding('value1'));\n            var value2 = element(by.binding('value2'));\n\n            expect(value1.getText()).toContain('true');\n            expect(value2.getText()).toContain('YES');\n\n            element(by.model('value1')).click();\n            element(by.model('value2')).click();\n\n            expect(value1.getText()).toContain('false');\n            expect(value2.getText()).toContain('NO');\n          });\n        </file>\n      </example>\n   */\n  'checkbox': checkboxInputType,\n\n  'hidden': noop,\n  'button': noop,\n  'submit': noop,\n  'reset': noop,\n  'file': noop\n};\n\n// A helper function to call $setValidity and return the value / undefined,\n// a pattern that is repeated a lot in the input validation logic.\nfunction validate(ctrl, validatorName, validity, value){\n  ctrl.$setValidity(validatorName, validity);\n  return validity ? value : undefined;\n}\n\n\nfunction addNativeHtml5Validators(ctrl, validatorName, element) {\n  var validity = element.prop('validity');\n  if (isObject(validity)) {\n    var validator = function(value) {\n      // Don't overwrite previous validation, don't consider valueMissing to apply (ng-required can\n      // perform the required validation)\n      if (!ctrl.$error[validatorName] && (validity.badInput || validity.customError ||\n          validity.typeMismatch) && !validity.valueMissing) {\n        ctrl.$setValidity(validatorName, false);\n        return;\n      }\n      return value;\n    };\n    ctrl.$parsers.push(validator);\n  }\n}\n\nfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  var validity = element.prop('validity');\n  var placeholder = element[0].placeholder, noevent = {};\n\n  // In composition mode, users are still inputing intermediate text buffer,\n  // hold the listener until composition is done.\n  // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent\n  if (!$sniffer.android) {\n    var composing = false;\n\n    element.on('compositionstart', function(data) {\n      composing = true;\n    });\n\n    element.on('compositionend', function() {\n      composing = false;\n      listener();\n    });\n  }\n\n  var listener = function(ev) {\n    if (composing) return;\n    var value = element.val(),\n        event = ev && ev.type;\n\n    // IE (11 and under) seem to emit an 'input' event if the placeholder value changes.\n    // We don't want to dirty the value when this happens, so we abort here. Unfortunately,\n    // IE also sends input events for other non-input-related things, (such as focusing on a\n    // form control), so this change is not entirely enough to solve this.\n    if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {\n      placeholder = element[0].placeholder;\n      return;\n    }\n\n    // By default we will trim the value\n    // If the attribute ng-trim exists we will avoid trimming\n    // e.g. <input ng-model=\"foo\" ng-trim=\"false\">\n    if (toBoolean(attr.ngTrim || 'T')) {\n      value = trim(value);\n    }\n\n    if (ctrl.$viewValue !== value ||\n        // If the value is still empty/falsy, and there is no `required` error, run validators\n        // again. This enables HTML5 constraint validation errors to affect Angular validation\n        // even when the first character entered causes an error.\n        (validity && value === '' && !validity.valueMissing)) {\n      if (scope.$$phase) {\n        ctrl.$setViewValue(value, event);\n      } else {\n        scope.$apply(function() {\n          ctrl.$setViewValue(value, event);\n        });\n      }\n    }\n  };\n\n  // if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\n  // input event on backspace, delete or cut\n  if ($sniffer.hasEvent('input')) {\n    element.on('input', listener);\n  } else {\n    var timeout;\n\n    var deferListener = function(ev) {\n      if (!timeout) {\n        timeout = $browser.defer(function() {\n          listener(ev);\n          timeout = null;\n        });\n      }\n    };\n\n    element.on('keydown', function(event) {\n      var key = event.keyCode;\n\n      // ignore\n      //    command            modifiers                   arrows\n      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\n\n      deferListener(event);\n    });\n\n    // if user modifies input value using context menu in IE, we need \"paste\" and \"cut\" events to catch it\n    if ($sniffer.hasEvent('paste')) {\n      element.on('paste cut', deferListener);\n    }\n  }\n\n  // if user paste into input using mouse on older browser\n  // or form autocomplete on newer browser, we need \"change\" event to catch it\n  element.on('change', listener);\n\n  ctrl.$render = function() {\n    element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);\n  };\n\n  // pattern validator\n  var pattern = attr.ngPattern,\n      patternValidator,\n      match;\n\n  if (pattern) {\n    var validateRegex = function(regexp, value) {\n      return validate(ctrl, 'pattern', ctrl.$isEmpty(value) || regexp.test(value), value);\n    };\n    match = pattern.match(/^\\/(.*)\\/([gim]*)$/);\n    if (match) {\n      pattern = new RegExp(match[1], match[2]);\n      patternValidator = function(value) {\n        return validateRegex(pattern, value);\n      };\n    } else {\n      patternValidator = function(value) {\n        var patternObj = scope.$eval(pattern);\n\n        if (!patternObj || !patternObj.test) {\n          throw minErr('ngPattern')('noregexp',\n            'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern,\n            patternObj, startingTag(element));\n        }\n        return validateRegex(patternObj, value);\n      };\n    }\n\n    ctrl.$formatters.push(patternValidator);\n    ctrl.$parsers.push(patternValidator);\n  }\n\n  // min length validator\n  if (attr.ngMinlength) {\n    var minlength = int(attr.ngMinlength);\n    var minLengthValidator = function(value) {\n      return validate(ctrl, 'minlength', ctrl.$isEmpty(value) || value.length >= minlength, value);\n    };\n\n    ctrl.$parsers.push(minLengthValidator);\n    ctrl.$formatters.push(minLengthValidator);\n  }\n\n  // max length validator\n  if (attr.ngMaxlength) {\n    var maxlength = int(attr.ngMaxlength);\n    var maxLengthValidator = function(value) {\n      return validate(ctrl, 'maxlength', ctrl.$isEmpty(value) || value.length <= maxlength, value);\n    };\n\n    ctrl.$parsers.push(maxLengthValidator);\n    ctrl.$formatters.push(maxLengthValidator);\n  }\n}\n\nfunction weekParser(isoWeek) {\n   if(isDate(isoWeek)) {\n      return isoWeek;\n   }\n\n   if(isString(isoWeek)) {\n      WEEK_REGEXP.lastIndex = 0;\n      var parts = WEEK_REGEXP.exec(isoWeek);\n      if(parts) {\n         var year = +parts[1],\n            week = +parts[2],\n            firstThurs = getFirstThursdayOfYear(year),\n            addDays = (week - 1) * 7;\n         return new Date(year, 0, firstThurs.getDate() + addDays);\n      }\n   }\n\n   return NaN;\n}\n\nfunction createDateParser(regexp, mapping) {\n   return function(iso) {\n      var parts, map;\n\n      if(isDate(iso)) {\n         return iso;\n      }\n\n      if(isString(iso)) {\n         regexp.lastIndex = 0;\n         parts = regexp.exec(iso);\n\n         if(parts) {\n            parts.shift();\n            map = { yyyy: 0, MM: 1, dd: 1, HH: 0, mm: 0 };\n\n            forEach(parts, function(part, index) {\n               if(index < mapping.length) {\n                  map[mapping[index]] = +part;\n               }\n            });\n\n            return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm);\n         }\n      }\n\n      return NaN;\n   };\n}\n\nfunction createDateInputType(type, regexp, parseDate, format) {\n   return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {\n      textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n      ctrl.$parsers.push(function(value) {\n         if(ctrl.$isEmpty(value)) {\n            ctrl.$setValidity(type, true);\n            return null;\n         }\n\n         if(regexp.test(value)) {\n            ctrl.$setValidity(type, true);\n            return parseDate(value);\n         }\n\n         ctrl.$setValidity(type, false);\n         return undefined;\n      });\n\n      ctrl.$formatters.push(function(value) {\n         if(isDate(value)) {\n            return $filter('date')(value, format);\n         }\n         return '';\n      });\n\n      if(attr.min) {\n         var minValidator = function(value) {\n            var valid = ctrl.$isEmpty(value) ||\n               (parseDate(value) >= parseDate(attr.min));\n            ctrl.$setValidity('min', valid);\n            return valid ? value : undefined;\n         };\n\n         ctrl.$parsers.push(minValidator);\n         ctrl.$formatters.push(minValidator);\n      }\n\n      if(attr.max) {\n         var maxValidator = function(value) {\n            var valid = ctrl.$isEmpty(value) ||\n               (parseDate(value) <= parseDate(attr.max));\n            ctrl.$setValidity('max', valid);\n            return valid ? value : undefined;\n         };\n\n         ctrl.$parsers.push(maxValidator);\n         ctrl.$formatters.push(maxValidator);\n      }\n   };\n}\n\nfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  ctrl.$parsers.push(function(value) {\n    var empty = ctrl.$isEmpty(value);\n    if (empty || NUMBER_REGEXP.test(value)) {\n      ctrl.$setValidity('number', true);\n      return value === '' ? null : (empty ? value : parseFloat(value));\n    } else {\n      ctrl.$setValidity('number', false);\n      return undefined;\n    }\n  });\n\n  addNativeHtml5Validators(ctrl, 'number', element);\n\n  ctrl.$formatters.push(function(value) {\n    return ctrl.$isEmpty(value) ? '' : '' + value;\n  });\n\n  if (attr.min) {\n    var minValidator = function(value) {\n      var min = parseFloat(attr.min);\n      return validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value);\n    };\n\n    ctrl.$parsers.push(minValidator);\n    ctrl.$formatters.push(minValidator);\n  }\n\n  if (attr.max) {\n    var maxValidator = function(value) {\n      var max = parseFloat(attr.max);\n      return validate(ctrl, 'max', ctrl.$isEmpty(value) || value <= max, value);\n    };\n\n    ctrl.$parsers.push(maxValidator);\n    ctrl.$formatters.push(maxValidator);\n  }\n\n  ctrl.$formatters.push(function(value) {\n    return validate(ctrl, 'number', ctrl.$isEmpty(value) || isNumber(value), value);\n  });\n}\n\nfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var urlValidator = function(value) {\n    return validate(ctrl, 'url', ctrl.$isEmpty(value) || URL_REGEXP.test(value), value);\n  };\n\n  ctrl.$formatters.push(urlValidator);\n  ctrl.$parsers.push(urlValidator);\n}\n\nfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\n  textInputType(scope, element, attr, ctrl, $sniffer, $browser);\n\n  var emailValidator = function(value) {\n    return validate(ctrl, 'email', ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value), value);\n  };\n\n  ctrl.$formatters.push(emailValidator);\n  ctrl.$parsers.push(emailValidator);\n}\n\nfunction radioInputType(scope, element, attr, ctrl) {\n  // make the name unique, if not defined\n  if (isUndefined(attr.name)) {\n    element.attr('name', nextUid());\n  }\n\n  var listener = function(ev) {\n    if (element[0].checked) {\n      scope.$apply(function() {\n        ctrl.$setViewValue(attr.value, ev && ev.type);\n      });\n    }\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    var value = attr.value;\n    element[0].checked = (value == ctrl.$viewValue);\n  };\n\n  attr.$observe('value', ctrl.$render);\n}\n\nfunction checkboxInputType(scope, element, attr, ctrl) {\n  var trueValue = attr.ngTrueValue,\n      falseValue = attr.ngFalseValue;\n\n  if (!isString(trueValue)) trueValue = true;\n  if (!isString(falseValue)) falseValue = false;\n\n  var listener = function(ev) {\n    scope.$apply(function() {\n      ctrl.$setViewValue(element[0].checked, ev && ev.type);\n    });\n  };\n\n  element.on('click', listener);\n\n  ctrl.$render = function() {\n    element[0].checked = ctrl.$viewValue;\n  };\n\n  // Override the standard `$isEmpty` because a value of `false` means empty in a checkbox.\n  ctrl.$isEmpty = function(value) {\n    return value !== trueValue;\n  };\n\n  ctrl.$formatters.push(function(value) {\n    return value === trueValue;\n  });\n\n  ctrl.$parsers.push(function(value) {\n    return value ? trueValue : falseValue;\n  });\n}\n\n\n/**\n * @ngdoc directive\n * @name textarea\n * @restrict E\n *\n * @description\n * HTML textarea element control with angular data-binding. The data-binding and validation\n * properties of this element are exactly the same as those of the\n * {@link ng.directive:input input element}.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength.\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n *    patterns defined as scope expressions.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n */\n\n\n/**\n * @ngdoc directive\n * @name input\n * @restrict E\n *\n * @description\n * HTML input element control with angular data-binding. Input control follows HTML5 input types\n * and polyfills the HTML5 validation behavior for older browsers.\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required Sets `required` validation error key if the value is not entered.\n * @param {boolean=} ngRequired Sets `required` attribute if set to true\n * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\n *    minlength.\n * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\n *    maxlength.\n * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\n *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\n *    patterns defined as scope expressions.\n * @param {string=} ngChange Angular expression to be executed when input changes due to user\n *    interaction with the input element.\n *\n * @example\n    <example name=\"input-directive\">\n      <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.user = {name: 'guest', last: 'visitor'};\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <form name=\"myForm\">\n           User name: <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\n           <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\n             Required!</span><br>\n           Last name: <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\n             ng-minlength=\"3\" ng-maxlength=\"10\">\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\n             Too short!</span>\n           <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\n             Too long!</span><br>\n         </form>\n         <hr>\n         <tt>user = {{user}}</tt><br/>\n         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>\n         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>\n         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>\n         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\n         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>\n         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>\n       </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var user = element(by.binding('{{user}}'));\n        var userNameValid = element(by.binding('myForm.userName.$valid'));\n        var lastNameValid = element(by.binding('myForm.lastName.$valid'));\n        var lastNameError = element(by.binding('myForm.lastName.$error'));\n        var formValid = element(by.binding('myForm.$valid'));\n        var userNameInput = element(by.model('user.name'));\n        var userLastInput = element(by.model('user.last'));\n\n        it('should initialize to model', function() {\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if empty when required', function() {\n          userNameInput.clear();\n          userNameInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"last\":\"visitor\"}');\n          expect(userNameValid.getText()).toContain('false');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be valid if empty when min length is set', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"\"}');\n          expect(lastNameValid.getText()).toContain('true');\n          expect(formValid.getText()).toContain('true');\n        });\n\n        it('should be invalid if less than required min length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('xx');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('minlength');\n          expect(formValid.getText()).toContain('false');\n        });\n\n        it('should be invalid if longer than max length', function() {\n          userLastInput.clear();\n          userLastInput.sendKeys('some ridiculously long name');\n\n          expect(user.getText()).toContain('{\"name\":\"guest\"}');\n          expect(lastNameValid.getText()).toContain('false');\n          expect(lastNameError.getText()).toContain('maxlength');\n          expect(formValid.getText()).toContain('false');\n        });\n      </file>\n    </example>\n */\nvar inputDirective = ['$browser', '$sniffer', '$filter', function($browser, $sniffer, $filter) {\n  return {\n    restrict: 'E',\n    require: ['?ngModel'],\n    link: function(scope, element, attr, ctrls) {\n      if (ctrls[0]) {\n        (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,\n                                                            $browser, $filter);\n      }\n    }\n  };\n}];\n\nvar VALID_CLASS = 'ng-valid',\n    INVALID_CLASS = 'ng-invalid',\n    PRISTINE_CLASS = 'ng-pristine',\n    DIRTY_CLASS = 'ng-dirty';\n\n/**\n * @ngdoc type\n * @name ngModel.NgModelController\n *\n * @property {string} $viewValue Actual string value in the view.\n * @property {*} $modelValue The value in the model, that the control is bound to.\n * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever\n       the control reads value from the DOM.  Each function is called, in turn, passing the value\n       through to the next. The last return value is used to populate the model.\n       Used to sanitize / convert the value as well as validation. For validation,\n       the parsers should update the validity state using\n       {@link ngModel.NgModelController#$setValidity $setValidity()},\n       and return `undefined` for invalid values.\n\n *\n * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever\n       the model value changes. Each function is called, in turn, passing the value through to the\n       next. Used to format / convert values for display in the control and validation.\n * ```js\n * function formatter(value) {\n *   if (value) {\n *     return value.toUpperCase();\n *   }\n * }\n * ngModel.$formatters.push(formatter);\n * ```\n *\n * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the\n *     view value has changed. It is called with no arguments, and its return value is ignored.\n *     This can be used in place of additional $watches against the model value.\n *\n * @property {Object} $error An object hash with all errors as keys.\n *\n * @property {boolean} $pristine True if user has not interacted with the control yet.\n * @property {boolean} $dirty True if user has already interacted with the control.\n * @property {boolean} $valid True if there is no error.\n * @property {boolean} $invalid True if at least one error on the control.\n *\n * @description\n *\n * `NgModelController` provides API for the `ng-model` directive. The controller contains\n * services for data-binding, validation, CSS updates, and value formatting and parsing. It\n * purposefully does not contain any logic which deals with DOM rendering or listening to\n * DOM events. Such DOM related logic should be provided by other directives which make use of\n * `NgModelController` for data-binding.\n *\n * ## Custom Control Example\n * This example shows how to use `NgModelController` with a custom control to achieve\n * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\n * collaborate together to achieve the desired result.\n *\n * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element\n * contents be edited in place by the user.  This will not work on older browsers.\n *\n * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}\n * module to automatically remove \"bad\" content like inline event listener (e.g. `<span onclick=\"...\">`).\n * However, as we are using `$sce` the model can still decide to to provide unsafe content if it marks\n * that content using the `$sce` service.\n *\n * <example name=\"NgModelController\" module=\"customControl\" deps=\"angular-sanitize.js\">\n    <file name=\"style.css\">\n      [contenteditable] {\n        border: 1px solid black;\n        background-color: white;\n        min-height: 20px;\n      }\n\n      .ng-invalid {\n        border: 1px solid red;\n      }\n\n    </file>\n    <file name=\"script.js\">\n      angular.module('customControl', ['ngSanitize']).\n        directive('contenteditable', ['$sce', function($sce) {\n          return {\n            restrict: 'A', // only activate on element attribute\n            require: '?ngModel', // get a hold of NgModelController\n            link: function(scope, element, attrs, ngModel) {\n              if(!ngModel) return; // do nothing if no ng-model\n\n              // Specify how UI should be updated\n              ngModel.$render = function() {\n                element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));\n              };\n\n              // Listen for change events to enable binding\n              element.on('blur keyup change', function() {\n                scope.$apply(read);\n              });\n              read(); // initialize\n\n              // Write data to the model\n              function read() {\n                var html = element.html();\n                // When we clear the content editable the browser leaves a <br> behind\n                // If strip-br attribute is provided then we strip this out\n                if( attrs.stripBr && html == '<br>' ) {\n                  html = '';\n                }\n                ngModel.$setViewValue(html);\n              }\n            }\n          };\n        }]);\n    </file>\n    <file name=\"index.html\">\n      <form name=\"myForm\">\n       <div contenteditable\n            name=\"myWidget\" ng-model=\"userContent\"\n            strip-br=\"true\"\n            required>Change me!</div>\n        <span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\n       <hr>\n       <textarea ng-model=\"userContent\"></textarea>\n      </form>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n    it('should data-bind and become invalid', function() {\n      if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') {\n        // SafariDriver can't handle contenteditable\n        // and Firefox driver can't clear contenteditables very well\n        return;\n      }\n      var contentEditable = element(by.css('[contenteditable]'));\n      var content = 'Change me!';\n\n      expect(contentEditable.getText()).toEqual(content);\n\n      contentEditable.clear();\n      contentEditable.sendKeys(protractor.Key.BACK_SPACE);\n      expect(contentEditable.getText()).toEqual('');\n      expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);\n    });\n    </file>\n * </example>\n *\n *\n */\nvar NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout',\n    function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout) {\n  this.$viewValue = Number.NaN;\n  this.$modelValue = Number.NaN;\n  this.$parsers = [];\n  this.$formatters = [];\n  this.$viewChangeListeners = [];\n  this.$pristine = true;\n  this.$dirty = false;\n  this.$valid = true;\n  this.$invalid = false;\n  this.$name = $attr.name;\n\n\n  var ngModelGet = $parse($attr.ngModel),\n      ngModelSet = ngModelGet.assign,\n      pendingDebounce = null,\n      ctrl = this;\n\n  if (!ngModelSet) {\n    throw minErr('ngModel')('nonassign', \"Expression '{0}' is non-assignable. Element: {1}\",\n        $attr.ngModel, startingTag($element));\n  }\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$render\n   *\n   * @description\n   * Called when the view needs to be updated. It is expected that the user of the ng-model\n   * directive will implement this method.\n   */\n  this.$render = noop;\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$isEmpty\n   *\n   * @description\n   * This is called when we need to determine if the value of the input is empty.\n   *\n   * For instance, the required directive does this to work out if the input has data or not.\n   * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.\n   *\n   * You can override this for input directives whose concept of being empty is different to the\n   * default. The `checkboxInputType` directive does this because in its case a value of `false`\n   * implies empty.\n   *\n   * @param {*} value Reference to check.\n   * @returns {boolean} True if `value` is empty.\n   */\n  this.$isEmpty = function(value) {\n    return isUndefined(value) || value === '' || value === null || value !== value;\n  };\n\n  var parentForm = $element.inheritedData('$formController') || nullFormCtrl,\n      invalidCount = 0, // used to easily determine if we are valid\n      $error = this.$error = {}; // keep invalid keys here\n\n\n  // Setup initial state of the control\n  $element.addClass(PRISTINE_CLASS);\n  toggleValidCss(true);\n\n  // convenience method for easy toggling of classes\n  function toggleValidCss(isValid, validationErrorKey) {\n    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\n    $animate.removeClass($element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);\n    $animate.addClass($element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\n  }\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setValidity\n   *\n   * @description\n   * Change the validity state, and notifies the form when the control changes validity. (i.e. it\n   * does not notify form if given validator is already marked as invalid).\n   *\n   * This method should be called by validators - i.e. the parser or formatter functions.\n   *\n   * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign\n   *        to `$error[validationErrorKey]=isValid` so that it is available for data-binding.\n   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case\n   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\n   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .\n   * @param {boolean} isValid Whether the current state is valid (true) or invalid (false).\n   */\n  this.$setValidity = function(validationErrorKey, isValid) {\n    // Purposeful use of ! here to cast isValid to boolean in case it is undefined\n    // jshint -W018\n    if ($error[validationErrorKey] === !isValid) return;\n    // jshint +W018\n\n    if (isValid) {\n      if ($error[validationErrorKey]) invalidCount--;\n      if (!invalidCount) {\n        toggleValidCss(true);\n        ctrl.$valid = true;\n        ctrl.$invalid = false;\n      }\n    } else {\n      toggleValidCss(false);\n      ctrl.$invalid = true;\n      ctrl.$valid = false;\n      invalidCount++;\n    }\n\n    $error[validationErrorKey] = !isValid;\n    toggleValidCss(isValid, validationErrorKey);\n\n    parentForm.$setValidity(validationErrorKey, isValid, ctrl);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setPristine\n   *\n   * @description\n   * Sets the control to its pristine state.\n   *\n   * This method can be called to remove the 'ng-dirty' class and set the control to its pristine\n   * state (ng-pristine class).\n   */\n  this.$setPristine = function () {\n    ctrl.$dirty = false;\n    ctrl.$pristine = true;\n    $animate.removeClass($element, DIRTY_CLASS);\n    $animate.addClass($element, PRISTINE_CLASS);\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$rollbackViewValue\n   *\n   * @description\n   * Cancel an update and reset the input element's value to prevent an update to the `$modelValue`,\n   * which may be caused by a pending debounced event or because the input is waiting for a some\n   * future event.\n   *\n   * If you have an input that uses `ng-model-options` to set up debounced events or events such\n   * as blur you can have a situation where there is a period when the `$viewValue`\n   * is out of synch with the ngModel's `$modelValue`.\n   *\n   * In this case, you can run into difficulties if you try to update the ngModel's `$modelValue`\n   * programmatically before these debounced/future events have resolved/occurred, because Angular's\n   * dirty checking mechanism is not able to tell whether the model has actually changed or not.\n   *\n   * The `$rollbackViewValue()` method should be called before programmatically changing the model of an\n   * input which may have such events pending. This is important in order to make sure that the\n   * input field will be updated with the new model value and any pending operations are cancelled.\n   *\n   * <example name=\"ng-model-cancel-update\" module=\"cancel-update-example\">\n   *   <file name=\"app.js\">\n   *     angular.module('cancel-update-example', [])\n   *\n   *     .controller('CancelUpdateCtrl', function($scope) {\n   *       $scope.resetWithCancel = function (e) {\n   *         if (e.keyCode == 27) {\n   *           $scope.myForm.myInput1.$rollbackViewValue();\n   *           $scope.myValue = '';\n   *         }\n   *       };\n   *       $scope.resetWithoutCancel = function (e) {\n   *         if (e.keyCode == 27) {\n   *           $scope.myValue = '';\n   *         }\n   *       };\n   *     });\n   *   </file>\n   *   <file name=\"index.html\">\n   *     <div ng-controller=\"CancelUpdateCtrl\">\n   *       <p>Try typing something in each input.  See that the model only updates when you\n   *          blur off the input.\n   *        </p>\n   *        <p>Now see what happens if you start typing then press the Escape key</p>\n   *\n   *       <form name=\"myForm\" ng-model-options=\"{ updateOn: 'blur' }\">\n   *         <p>With $rollbackViewValue()</p>\n   *         <input name=\"myInput1\" ng-model=\"myValue\" ng-keydown=\"resetWithCancel($event)\"><br/>\n   *         myValue: \"{{ myValue }}\"\n   *\n   *         <p>Without $rollbackViewValue()</p>\n   *         <input name=\"myInput2\" ng-model=\"myValue\" ng-keydown=\"resetWithoutCancel($event)\"><br/>\n   *         myValue: \"{{ myValue }}\"\n   *       </form>\n   *     </div>\n   *   </file>\n   * </example>\n   */\n  this.$rollbackViewValue = function() {\n    $timeout.cancel(pendingDebounce);\n    ctrl.$viewValue = ctrl.$$lastCommittedViewValue;\n    ctrl.$render();\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$commitViewValue\n   *\n   * @description\n   * Commit a pending update to the `$modelValue`.\n   *\n   * Updates may be pending by a debounced event or because the input is waiting for a some future\n   * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`\n   * usually handles calling this in response to input events.\n   */\n  this.$commitViewValue = function() {\n    var value = ctrl.$viewValue;\n    $timeout.cancel(pendingDebounce);\n    if (ctrl.$$lastCommittedViewValue === value) {\n      return;\n    }\n    ctrl.$$lastCommittedViewValue = value;\n\n    // change to dirty\n    if (ctrl.$pristine) {\n      ctrl.$dirty = true;\n      ctrl.$pristine = false;\n      $animate.removeClass($element, PRISTINE_CLASS);\n      $animate.addClass($element, DIRTY_CLASS);\n      parentForm.$setDirty();\n    }\n\n    forEach(ctrl.$parsers, function(fn) {\n      value = fn(value);\n    });\n\n    if (ctrl.$modelValue !== value) {\n      ctrl.$modelValue = value;\n      ngModelSet($scope, value);\n      forEach(ctrl.$viewChangeListeners, function(listener) {\n        try {\n          listener();\n        } catch(e) {\n          $exceptionHandler(e);\n        }\n      });\n    }\n  };\n\n  /**\n   * @ngdoc method\n   * @name ngModel.NgModelController#$setViewValue\n   *\n   * @description\n   * Update the view value.\n   *\n   * This method should be called when the view value changes, typically from within a DOM event handler.\n   * For example {@link ng.directive:input input} and\n   * {@link ng.directive:select select} directives call it.\n   *\n   * It will update the $viewValue, then pass this value through each of the functions in `$parsers`,\n   * which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to\n   * `$modelValue` and the **expression** specified in the `ng-model` attribute.\n   *\n   * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.\n   *\n   * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`\n   * and the `default` trigger is not listed, all those actions will remain pending until one of the\n   * `updateOn` events is triggered on the DOM element.\n   * All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}\n   * directive is used with a custom debounce for this particular event.\n   *\n   * Note that calling this function does not trigger a `$digest`.\n   *\n   * @param {string} value Value from the view.\n   * @param {string} trigger Event that triggered the update.\n   */\n  this.$setViewValue = function(value, trigger) {\n    ctrl.$viewValue = value;\n    if (!ctrl.$options || ctrl.$options.updateOnDefault) {\n      ctrl.$$debounceViewValueCommit(trigger);\n    }\n  };\n\n  this.$$debounceViewValueCommit = function(trigger) {\n    var debounceDelay = 0,\n        options = ctrl.$options,\n        debounce;\n\n    if(options && isDefined(options.debounce)) {\n      debounce = options.debounce;\n      if(isNumber(debounce)) {\n        debounceDelay = debounce;\n      } else if(isNumber(debounce[trigger])) {\n        debounceDelay = debounce[trigger];\n      } else if (isNumber(debounce['default'])) {\n        debounceDelay = debounce['default'];\n      }\n    }\n\n    $timeout.cancel(pendingDebounce);\n    if (debounceDelay) {\n      pendingDebounce = $timeout(function() {\n        ctrl.$commitViewValue();\n      }, debounceDelay);\n    } else {\n      ctrl.$commitViewValue();\n    }\n  };\n\n  // model -> value\n  $scope.$watch(function ngModelWatch() {\n    var value = ngModelGet($scope);\n\n    // if scope model value and ngModel value are out of sync\n    if (ctrl.$modelValue !== value) {\n\n      var formatters = ctrl.$formatters,\n          idx = formatters.length;\n\n      ctrl.$modelValue = value;\n      while(idx--) {\n        value = formatters[idx](value);\n      }\n\n      if (ctrl.$viewValue !== value) {\n        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = value;\n        ctrl.$render();\n      }\n    }\n\n    return value;\n  });\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngModel\n *\n * @element input\n *\n * @description\n * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a\n * property on the scope using {@link ngModel.NgModelController NgModelController},\n * which is created and exposed by this directive.\n *\n * `ngModel` is responsible for:\n *\n * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`\n *   require.\n * - Providing validation behavior (i.e. required, number, email, url).\n * - Keeping the state of the control (valid/invalid, dirty/pristine, validation errors).\n * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`) including animations.\n * - Registering the control with its parent {@link ng.directive:form form}.\n *\n * Note: `ngModel` will try to bind to the property given by evaluating the expression on the\n * current scope. If the property doesn't already exist on this scope, it will be created\n * implicitly and added to the scope.\n *\n * For best practices on using `ngModel`, see:\n *\n *  - [https://github.com/angular/angular.js/wiki/Understanding-Scopes]\n *\n * For basic examples, how to use `ngModel`, see:\n *\n *  - {@link ng.directive:input input}\n *    - {@link input[text] text}\n *    - {@link input[checkbox] checkbox}\n *    - {@link input[radio] radio}\n *    - {@link input[number] number}\n *    - {@link input[email] email}\n *    - {@link input[url] url}\n *    - {@link input[date] date}\n *    - {@link input[dateTimeLocal] dateTimeLocal}\n *    - {@link input[time] time}\n *    - {@link input[month] month}\n *    - {@link input[week] week}\n *  - {@link ng.directive:select select}\n *  - {@link ng.directive:textarea textarea}\n *\n * # CSS classes\n * The following CSS classes are added and removed on the associated input/select/textarea element\n * depending on the validity of the model.\n *\n *  - `ng-valid` is set if the model is valid.\n *  - `ng-invalid` is set if the model is invalid.\n *  - `ng-pristine` is set if the model is pristine.\n *  - `ng-dirty` is set if the model is dirty.\n *\n * Keep in mind that ngAnimate can detect each of these classes when added and removed.\n *\n * ## Animation Hooks\n *\n * Animations within models are triggered when any of the associated CSS classes are added and removed\n * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`,\n * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.\n * The animations that are triggered within ngModel are similar to how they work in ngClass and\n * animations can be hooked into using CSS transitions, keyframes as well as JS animations.\n *\n * The following example shows a simple way to utilize CSS transitions to style an input element\n * that has been rendered as invalid after it has been validated:\n *\n * <pre>\n * //be sure to include ngAnimate as a module to hook into more\n * //advanced animations\n * .my-input {\n *   transition:0.5s linear all;\n *   background: white;\n * }\n * .my-input.ng-invalid {\n *   background: red;\n *   color:white;\n * }\n * </pre>\n *\n * @example\n * <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\">\n     <file name=\"index.html\">\n       <script>\n        function Ctrl($scope) {\n          $scope.val = '1';\n        }\n       </script>\n       <style>\n         .my-input {\n           -webkit-transition:all linear 0.5s;\n           transition:all linear 0.5s;\n           background: transparent;\n         }\n         .my-input.ng-invalid {\n           color:white;\n           background: red;\n         }\n       </style>\n       Update input to see transitions when valid/invalid.\n       Integer is a valid value.\n       <form name=\"testForm\" ng-controller=\"Ctrl\">\n         <input ng-model=\"val\" ng-pattern=\"/^\\d+$/\" name=\"anim\" class=\"my-input\" />\n       </form>\n     </file>\n * </example>\n */\nvar ngModelDirective = function() {\n  return {\n    require: ['ngModel', '^?form', '^?ngModelOptions'],\n    controller: NgModelController,\n    link: {\n      pre: function(scope, element, attr, ctrls) {\n        // Pass the ng-model-options to the ng-model controller\n        if (ctrls[2]) {\n          ctrls[0].$options = ctrls[2].$options;\n        }\n\n        // notify others, especially parent forms\n\n        var modelCtrl = ctrls[0],\n            formCtrl = ctrls[1] || nullFormCtrl;\n\n        formCtrl.$addControl(modelCtrl);\n\n        scope.$on('$destroy', function() {\n          formCtrl.$removeControl(modelCtrl);\n        });\n      },\n      post: function(scope, element, attr, ctrls) {\n        var modelCtrl = ctrls[0];\n        if (modelCtrl.$options && modelCtrl.$options.updateOn) {\n          element.on(modelCtrl.$options.updateOn, function(ev) {\n            scope.$apply(function() {\n              modelCtrl.$$debounceViewValueCommit(ev && ev.type);\n            });\n          });\n        }\n      }\n    }\n  };\n};\n\n\n/**\n * @ngdoc directive\n * @name ngChange\n *\n * @description\n * Evaluate the given expression when the user changes the input.\n * The expression is evaluated immediately, unlike the JavaScript onchange event\n * which only triggers at the end of a change (usually, when the user leaves the\n * form element or presses the return key).\n * The expression is not evaluated when the value change is coming from the model.\n *\n * Note, this directive requires `ngModel` to be present.\n *\n * @element input\n * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change\n * in input value.\n *\n * @example\n * <example name=\"ngChange-directive\">\n *   <file name=\"index.html\">\n *     <script>\n *       function Controller($scope) {\n *         $scope.counter = 0;\n *         $scope.change = function() {\n *           $scope.counter++;\n *         };\n *       }\n *     </script>\n *     <div ng-controller=\"Controller\">\n *       <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\n *       <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\n *       <label for=\"ng-change-example2\">Confirmed</label><br />\n *       <tt>debug = {{confirmed}}</tt><br/>\n *       <tt>counter = {{counter}}</tt><br/>\n *     </div>\n *   </file>\n *   <file name=\"protractor.js\" type=\"protractor\">\n *     var counter = element(by.binding('counter'));\n *     var debug = element(by.binding('confirmed'));\n *\n *     it('should evaluate the expression if changing from view', function() {\n *       expect(counter.getText()).toContain('0');\n *\n *       element(by.id('ng-change-example1')).click();\n *\n *       expect(counter.getText()).toContain('1');\n *       expect(debug.getText()).toContain('true');\n *     });\n *\n *     it('should not evaluate the expression if changing from model', function() {\n *       element(by.id('ng-change-example2')).click();\n\n *       expect(counter.getText()).toContain('0');\n *       expect(debug.getText()).toContain('true');\n *     });\n *   </file>\n * </example>\n */\nvar ngChangeDirective = valueFn({\n  require: 'ngModel',\n  link: function(scope, element, attr, ctrl) {\n    ctrl.$viewChangeListeners.push(function() {\n      scope.$eval(attr.ngChange);\n    });\n  }\n});\n\n\nvar requiredDirective = function() {\n  return {\n    require: '?ngModel',\n    link: function(scope, elm, attr, ctrl) {\n      if (!ctrl) return;\n      attr.required = true; // force truthy in case we are on non input element\n\n      var validator = function(value) {\n        if (attr.required && ctrl.$isEmpty(value)) {\n          ctrl.$setValidity('required', false);\n          return;\n        } else {\n          ctrl.$setValidity('required', true);\n          return value;\n        }\n      };\n\n      ctrl.$formatters.push(validator);\n      ctrl.$parsers.unshift(validator);\n\n      attr.$observe('required', function() {\n        validator(ctrl.$viewValue);\n      });\n    }\n  };\n};\n\n\n/**\n * @ngdoc directive\n * @name ngList\n *\n * @description\n * Text input that converts between a delimited string and an array of strings. The delimiter\n * can be a fixed string (by default a comma) or a regular expression.\n *\n * @element input\n * @param {string=} ngList optional delimiter that should be used to split the value. If\n *   specified in form `/something/` then the value will be converted into a regular expression.\n *\n * @example\n    <example name=\"ngList-directive\">\n      <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.names = ['igor', 'misko', 'vojta'];\n         }\n       </script>\n       <form name=\"myForm\" ng-controller=\"Ctrl\">\n         List: <input name=\"namesInput\" ng-model=\"names\" ng-list required>\n         <span class=\"error\" ng-show=\"myForm.namesInput.$error.required\">\n           Required!</span>\n         <br>\n         <tt>names = {{names}}</tt><br/>\n         <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\n         <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\n         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\n         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var listInput = element(by.model('names'));\n        var names = element(by.binding('{{names}}'));\n        var valid = element(by.binding('myForm.namesInput.$valid'));\n        var error = element(by.css('span.error'));\n\n        it('should initialize to model', function() {\n          expect(names.getText()).toContain('[\"igor\",\"misko\",\"vojta\"]');\n          expect(valid.getText()).toContain('true');\n          expect(error.getCssValue('display')).toBe('none');\n        });\n\n        it('should be invalid if empty', function() {\n          listInput.clear();\n          listInput.sendKeys('');\n\n          expect(names.getText()).toContain('');\n          expect(valid.getText()).toContain('false');\n          expect(error.getCssValue('display')).not.toBe('none');        });\n      </file>\n    </example>\n */\nvar ngListDirective = function() {\n  return {\n    require: 'ngModel',\n    link: function(scope, element, attr, ctrl) {\n      var match = /\\/(.*)\\//.exec(attr.ngList),\n          separator = match && new RegExp(match[1]) || attr.ngList || ',';\n\n      var parse = function(viewValue) {\n        // If the viewValue is invalid (say required but empty) it will be `undefined`\n        if (isUndefined(viewValue)) return;\n\n        var list = [];\n\n        if (viewValue) {\n          forEach(viewValue.split(separator), function(value) {\n            if (value) list.push(trim(value));\n          });\n        }\n\n        return list;\n      };\n\n      ctrl.$parsers.push(parse);\n      ctrl.$formatters.push(function(value) {\n        if (isArray(value)) {\n          return value.join(', ');\n        }\n\n        return undefined;\n      });\n\n      // Override the standard $isEmpty because an empty array means the input is empty.\n      ctrl.$isEmpty = function(value) {\n        return !value || !value.length;\n      };\n    }\n  };\n};\n\n\nvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\n/**\n * @ngdoc directive\n * @name ngValue\n *\n * @description\n * Binds the given expression to the value of `input[select]` or `input[radio]`, so\n * that when the element is selected, the `ngModel` of that element is set to the\n * bound value.\n *\n * `ngValue` is useful when dynamically generating lists of radio buttons using `ng-repeat`, as\n * shown below.\n *\n * @element input\n * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute\n *   of the `input` element\n *\n * @example\n    <example name=\"ngValue-directive\">\n      <file name=\"index.html\">\n       <script>\n          function Ctrl($scope) {\n            $scope.names = ['pizza', 'unicorns', 'robots'];\n            $scope.my = { favorite: 'unicorns' };\n          }\n       </script>\n        <form ng-controller=\"Ctrl\">\n          <h2>Which is your favorite?</h2>\n            <label ng-repeat=\"name in names\" for=\"{{name}}\">\n              {{name}}\n              <input type=\"radio\"\n                     ng-model=\"my.favorite\"\n                     ng-value=\"name\"\n                     id=\"{{name}}\"\n                     name=\"favorite\">\n            </label>\n          <div>You chose {{my.favorite}}</div>\n        </form>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        var favorite = element(by.binding('my.favorite'));\n\n        it('should initialize to model', function() {\n          expect(favorite.getText()).toContain('unicorns');\n        });\n        it('should bind the values to the inputs', function() {\n          element.all(by.model('my.favorite')).get(0).click();\n          expect(favorite.getText()).toContain('pizza');\n        });\n      </file>\n    </example>\n */\nvar ngValueDirective = function() {\n  return {\n    priority: 100,\n    compile: function(tpl, tplAttr) {\n      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\n        return function ngValueConstantLink(scope, elm, attr) {\n          attr.$set('value', scope.$eval(attr.ngValue));\n        };\n      } else {\n        return function ngValueLink(scope, elm, attr) {\n          scope.$watch(attr.ngValue, function valueWatchAction(value) {\n            attr.$set('value', value);\n          });\n        };\n      }\n    }\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngModelOptions\n *\n * @description\n * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of\n * events that will trigger a model update and/or a debouncing delay so that the actual update only\n * takes place when a timer expires; this timer will be reset after another change takes place.\n *\n * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might\n * be different than the value in the actual model. This means that if you update the model you\n * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in\n * order to make sure it is synchronized with the model and that any debounced action is canceled.\n *\n * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`}\n * method is by making sure the input is placed inside a form that has a `name` attribute. This is\n * important because `form` controllers are published to the related scope under the name in their\n * `name` attribute.\n *\n * Any pending changes will take place immediately when an enclosing form is submitted via the\n * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`\n * to have access to the updated model.\n *\n * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:\n *   - `updateOn`: string specifying which event should be the input bound to. You can set several\n *     events using an space delimited list. There is a special event called `default` that\n *     matches the default events belonging of the control.\n *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A\n *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a\n *     custom value for each event. For example:\n *     `ngModelOptions=\"{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }\"`\n *\n * @example\n\n  The following example shows how to override immediate updates. Changes on the inputs within the\n  form will update the model only when the control loses focus (blur event). If `escape` key is\n  pressed while the input field is focused, the value is reset to the value in the current model.\n\n  <example name=\"ngModelOptions-directive-blur\">\n    <file name=\"index.html\">\n      <div ng-controller=\"Ctrl\">\n        <form name=\"userForm\">\n          Name:\n          <input type=\"text\" name=\"userName\"\n                 ng-model=\"user.name\"\n                 ng-model-options=\"{ updateOn: 'blur' }\"\n                 ng-keyup=\"cancel($event)\" /><br />\n\n          Other data:\n          <input type=\"text\" ng-model=\"user.data\" /><br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      function Ctrl($scope) {\n        $scope.user = { name: 'say', data: '' };\n\n        $scope.cancel = function (e) {\n          if (e.keyCode == 27) {\n            $scope.userForm.userName.$rollbackViewValue();\n          }\n        };\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var model = element(by.binding('user.name'));\n      var input = element(by.model('user.name'));\n      var other = element(by.model('user.data'));\n\n      it('should allow custom events', function() {\n        input.sendKeys(' hello');\n        input.click();\n        expect(model.getText()).toEqual('say');\n        other.click();\n        expect(model.getText()).toEqual('say hello');\n      });\n\n      it('should $rollbackViewValue when model changes', function() {\n        input.sendKeys(' hello');\n        expect(input.getAttribute('value')).toEqual('say hello');\n        input.sendKeys(protractor.Key.ESCAPE);\n        expect(input.getAttribute('value')).toEqual('say');\n        other.click();\n        expect(model.getText()).toEqual('say');\n      });\n    </file>\n  </example>\n\n  This one shows how to debounce model changes. Model will be updated only 1 sec after last change.\n  If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.\n\n  <example name=\"ngModelOptions-directive-debounce\">\n    <file name=\"index.html\">\n      <div ng-controller=\"Ctrl\">\n        <form name=\"userForm\">\n          Name:\n          <input type=\"text\" name=\"userName\"\n                 ng-model=\"user.name\"\n                 ng-model-options=\"{ debounce: 1000 }\" />\n          <button ng-click=\"userForm.userName.$rollbackViewValue(); user.name=''\">Clear</button><br />\n        </form>\n        <pre>user.name = <span ng-bind=\"user.name\"></span></pre>\n      </div>\n    </file>\n    <file name=\"app.js\">\n      function Ctrl($scope) {\n        $scope.user = { name: 'say' };\n      }\n    </file>\n  </example>\n */\nvar ngModelOptionsDirective = function() {\n  return {\n    controller: ['$scope', '$attrs', function($scope, $attrs) {\n      var that = this;\n      this.$options = $scope.$eval($attrs.ngModelOptions);\n      // Allow adding/overriding bound events\n      if (this.$options.updateOn !== undefined) {\n        this.$options.updateOnDefault = false;\n        // extract \"default\" pseudo-event from list of events that can trigger a model update\n        this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {\n          that.$options.updateOnDefault = true;\n          return ' ';\n        }));\n      } else {\n        this.$options.updateOnDefault = true;\n      }\n    }]\n  };\n};\n\n/**\n * @ngdoc directive\n * @name ngBind\n * @restrict AC\n *\n * @description\n * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\n * with the value of a given expression, and to update the text content when the value of that\n * expression changes.\n *\n * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\n * `{{ expression }}` which is similar but less verbose.\n *\n * It is preferable to use `ngBind` instead of `{{ expression }}` when a template is momentarily\n * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an\n * element attribute, it makes the bindings invisible to the user while the page is loading.\n *\n * An alternative solution to this problem would be using the\n * {@link ng.directive:ngCloak ngCloak} directive.\n *\n *\n * @element ANY\n * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\n *\n * @example\n * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.name = 'Whirled';\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n         Enter name: <input type=\"text\" ng-model=\"name\"><br>\n         Hello <span ng-bind=\"name\"></span>!\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var nameInput = element(by.model('name'));\n\n         expect(element(by.binding('name')).getText()).toBe('Whirled');\n         nameInput.clear();\n         nameInput.sendKeys('world');\n         expect(element(by.binding('name')).getText()).toBe('world');\n       });\n     </file>\n   </example>\n */\nvar ngBindDirective = ngDirective(function(scope, element, attr) {\n  element.addClass('ng-binding').data('$binding', attr.ngBind);\n  scope.$watch(attr.ngBind, function ngBindWatchAction(value) {\n    // We are purposefully using == here rather than === because we want to\n    // catch when value is \"null or undefined\"\n    // jshint -W041\n    element.text(value == undefined ? '' : value);\n  });\n});\n\n\n/**\n * @ngdoc directive\n * @name ngBindTemplate\n *\n * @description\n * The `ngBindTemplate` directive specifies that the element\n * text content should be replaced with the interpolation of the template\n * in the `ngBindTemplate` attribute.\n * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`\n * expressions. This directive is needed since some HTML elements\n * (such as TITLE and OPTION) cannot contain SPAN elements.\n *\n * @element ANY\n * @param {string} ngBindTemplate template of form\n *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\n *\n * @example\n * Try it here: enter text in text box and watch the greeting change.\n   <example>\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.salutation = 'Hello';\n           $scope.name = 'World';\n         }\n       </script>\n       <div ng-controller=\"Ctrl\">\n        Salutation: <input type=\"text\" ng-model=\"salutation\"><br>\n        Name: <input type=\"text\" ng-model=\"name\"><br>\n        <pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind', function() {\n         var salutationElem = element(by.binding('salutation'));\n         var salutationInput = element(by.model('salutation'));\n         var nameInput = element(by.model('name'));\n\n         expect(salutationElem.getText()).toBe('Hello World!');\n\n         salutationInput.clear();\n         salutationInput.sendKeys('Greetings');\n         nameInput.clear();\n         nameInput.sendKeys('user');\n\n         expect(salutationElem.getText()).toBe('Greetings user!');\n       });\n     </file>\n   </example>\n */\nvar ngBindTemplateDirective = ['$interpolate', function($interpolate) {\n  return function(scope, element, attr) {\n    // TODO: move this to scenario runner\n    var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\n    element.addClass('ng-binding').data('$binding', interpolateFn);\n    attr.$observe('ngBindTemplate', function(value) {\n      element.text(value);\n    });\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngBindHtml\n *\n * @description\n * Creates a binding that will innerHTML the result of evaluating the `expression` into the current\n * element in a secure way.  By default, the innerHTML-ed content will be sanitized using the {@link\n * ngSanitize.$sanitize $sanitize} service.  To utilize this functionality, ensure that `$sanitize`\n * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in\n * core Angular.)  You may also bypass sanitization for values you know are safe. To do so, bind to\n * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}.  See the example\n * under {@link ng.$sce#Example Strict Contextual Escaping (SCE)}.\n *\n * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you\n * will have an exception (instead of an exploit.)\n *\n * @element ANY\n * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\n *\n * @example\n   Try it here: enter text in text box and watch the greeting change.\n\n   <example module=\"ngBindHtmlExample\" deps=\"angular-sanitize.js\">\n     <file name=\"index.html\">\n       <div ng-controller=\"ngBindHtmlCtrl\">\n        <p ng-bind-html=\"myHTML\"></p>\n       </div>\n     </file>\n\n     <file name=\"script.js\">\n       angular.module('ngBindHtmlExample', ['ngSanitize'])\n\n       .controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) {\n         $scope.myHTML =\n            'I am an <code>HTML</code>string with <a href=\"#\">links!</a> and other <em>stuff</em>';\n       }]);\n     </file>\n\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-bind-html', function() {\n         expect(element(by.binding('myHTML')).getText()).toBe(\n             'I am an HTMLstring with links! and other stuff');\n       });\n     </file>\n   </example>\n */\nvar ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {\n  return function(scope, element, attr) {\n    element.addClass('ng-binding').data('$binding', attr.ngBindHtml);\n\n    var parsed = $parse(attr.ngBindHtml);\n    function getStringValue() {\n      var value = parsed(scope);\n      getStringValue.$$unwatch = parsed.$$unwatch;\n      return (value || '').toString();\n    }\n\n    scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {\n      element.html($sce.getTrustedHtml(parsed(scope)) || '');\n    });\n  };\n}];\n\nfunction classDirective(name, selector) {\n  name = 'ngClass' + name;\n  return ['$animate', function($animate) {\n    return {\n      restrict: 'AC',\n      link: function(scope, element, attr) {\n        var oldVal;\n\n        scope.$watch(attr[name], ngClassWatchAction, true);\n\n        attr.$observe('class', function(value) {\n          ngClassWatchAction(scope.$eval(attr[name]));\n        });\n\n\n        if (name !== 'ngClass') {\n          scope.$watch('$index', function($index, old$index) {\n            // jshint bitwise: false\n            var mod = $index & 1;\n            if (mod !== (old$index & 1)) {\n              var classes = arrayClasses(scope.$eval(attr[name]));\n              mod === selector ?\n                addClasses(classes) :\n                removeClasses(classes);\n            }\n          });\n        }\n\n        function addClasses(classes) {\n          var newClasses = digestClassCounts(classes, 1);\n          attr.$addClass(newClasses);\n        }\n\n        function removeClasses(classes) {\n          var newClasses = digestClassCounts(classes, -1);\n          attr.$removeClass(newClasses);\n        }\n\n        function digestClassCounts (classes, count) {\n          var classCounts = element.data('$classCounts') || {};\n          var classesToUpdate = [];\n          forEach(classes, function (className) {\n            if (count > 0 || classCounts[className]) {\n              classCounts[className] = (classCounts[className] || 0) + count;\n              if (classCounts[className] === +(count > 0)) {\n                classesToUpdate.push(className);\n              }\n            }\n          });\n          element.data('$classCounts', classCounts);\n          return classesToUpdate.join(' ');\n        }\n\n        function updateClasses (oldClasses, newClasses) {\n          var toAdd = arrayDifference(newClasses, oldClasses);\n          var toRemove = arrayDifference(oldClasses, newClasses);\n          toRemove = digestClassCounts(toRemove, -1);\n          toAdd = digestClassCounts(toAdd, 1);\n\n          if (toAdd.length === 0) {\n            $animate.removeClass(element, toRemove);\n          } else if (toRemove.length === 0) {\n            $animate.addClass(element, toAdd);\n          } else {\n            $animate.setClass(element, toAdd, toRemove);\n          }\n        }\n\n        function ngClassWatchAction(newVal) {\n          if (selector === true || scope.$index % 2 === selector) {\n            var newClasses = arrayClasses(newVal || []);\n            if (!oldVal) {\n              addClasses(newClasses);\n            } else if (!equals(newVal,oldVal)) {\n              var oldClasses = arrayClasses(oldVal);\n              updateClasses(oldClasses, newClasses);\n            }\n          }\n          oldVal = copy(newVal);\n        }\n      }\n    };\n\n    function arrayDifference(tokens1, tokens2) {\n      var values = [];\n\n      outer:\n      for(var i = 0; i < tokens1.length; i++) {\n        var token = tokens1[i];\n        for(var j = 0; j < tokens2.length; j++) {\n          if(token == tokens2[j]) continue outer;\n        }\n        values.push(token);\n      }\n      return values;\n    }\n\n    function arrayClasses (classVal) {\n      if (isArray(classVal)) {\n        return classVal;\n      } else if (isString(classVal)) {\n        return classVal.split(' ');\n      } else if (isObject(classVal)) {\n        var classes = [], i = 0;\n        forEach(classVal, function(v, k) {\n          if (v) {\n            classes.push(k);\n          }\n        });\n        return classes;\n      }\n      return classVal;\n    }\n  }];\n}\n\n/**\n * @ngdoc directive\n * @name ngClass\n * @restrict AC\n *\n * @description\n * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding\n * an expression that represents all classes to be added.\n *\n * The directive operates in three different ways, depending on which of three types the expression\n * evaluates to:\n *\n * 1. If the expression evaluates to a string, the string should be one or more space-delimited class\n * names.\n *\n * 2. If the expression evaluates to an array, each element of the array should be a string that is\n * one or more space-delimited class names.\n *\n * 3. If the expression evaluates to an object, then for each key-value pair of the\n * object with a truthy value the corresponding key is used as a class name.\n *\n * The directive won't add duplicate classes if a particular class was already set.\n *\n * When the expression changes, the previously added classes are removed and only then the\n * new classes are added.\n *\n * @animations\n * add - happens just before the class is applied to the element\n * remove - happens just before the class is removed from the element\n *\n * @element ANY\n * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class\n *   names, an array, or a map of class names to boolean values. In the case of a map, the\n *   names of the properties whose values are truthy will be added as css classes to the\n *   element.\n *\n * @example Example that demonstrates basic bindings via ngClass directive.\n   <example>\n     <file name=\"index.html\">\n       <p ng-class=\"{strike: deleted, bold: important, red: error}\">Map Syntax Example</p>\n       <input type=\"checkbox\" ng-model=\"deleted\"> deleted (apply \"strike\" class)<br>\n       <input type=\"checkbox\" ng-model=\"important\"> important (apply \"bold\" class)<br>\n       <input type=\"checkbox\" ng-model=\"error\"> error (apply \"red\" class)\n       <hr>\n       <p ng-class=\"style\">Using String Syntax</p>\n       <input type=\"text\" ng-model=\"style\" placeholder=\"Type: bold strike red\">\n       <hr>\n       <p ng-class=\"[style1, style2, style3]\">Using Array Syntax</p>\n       <input ng-model=\"style1\" placeholder=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style2\" placeholder=\"Type: bold, strike or red\"><br>\n       <input ng-model=\"style3\" placeholder=\"Type: bold, strike or red\"><br>\n     </file>\n     <file name=\"style.css\">\n       .strike {\n         text-decoration: line-through;\n       }\n       .bold {\n           font-weight: bold;\n       }\n       .red {\n           color: red;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var ps = element.all(by.css('p'));\n\n       it('should let you toggle the class', function() {\n\n         expect(ps.first().getAttribute('class')).not.toMatch(/bold/);\n         expect(ps.first().getAttribute('class')).not.toMatch(/red/);\n\n         element(by.model('important')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/bold/);\n\n         element(by.model('error')).click();\n         expect(ps.first().getAttribute('class')).toMatch(/red/);\n       });\n\n       it('should let you toggle string example', function() {\n         expect(ps.get(1).getAttribute('class')).toBe('');\n         element(by.model('style')).clear();\n         element(by.model('style')).sendKeys('red');\n         expect(ps.get(1).getAttribute('class')).toBe('red');\n       });\n\n       it('array example should have 3 classes', function() {\n         expect(ps.last().getAttribute('class')).toBe('');\n         element(by.model('style1')).sendKeys('bold');\n         element(by.model('style2')).sendKeys('strike');\n         element(by.model('style3')).sendKeys('red');\n         expect(ps.last().getAttribute('class')).toBe('bold strike red');\n       });\n     </file>\n   </example>\n\n   ## Animations\n\n   The example below demonstrates how to perform animations using ngClass.\n\n   <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n     <file name=\"index.html\">\n      <input id=\"setbtn\" type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\n      <input id=\"clearbtn\" type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\n      <br>\n      <span class=\"base-class\" ng-class=\"myVar\">Sample Text</span>\n     </file>\n     <file name=\"style.css\">\n       .base-class {\n         -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n         transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n       }\n\n       .base-class.my-class {\n         color: red;\n         font-size:3em;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class', function() {\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n\n         element(by.id('setbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).\n           toMatch(/my-class/);\n\n         element(by.id('clearbtn')).click();\n\n         expect(element(by.css('.base-class')).getAttribute('class')).not.\n           toMatch(/my-class/);\n       });\n     </file>\n   </example>\n\n\n   ## ngClass and pre-existing CSS3 Transitions/Animations\n   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.\n   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder\n   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure\n   to view the step by step details of {@link ngAnimate.$animate#addclass $animate.addClass} and\n   {@link ngAnimate.$animate#removeclass $animate.removeClass}.\n */\nvar ngClassDirective = classDirective('', true);\n\n/**\n * @ngdoc directive\n * @name ngClassOdd\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\n *   of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}}\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassOddDirective = classDirective('Odd', 0);\n\n/**\n * @ngdoc directive\n * @name ngClassEven\n * @restrict AC\n *\n * @description\n * The `ngClassOdd` and `ngClassEven` directives work exactly as\n * {@link ng.directive:ngClass ngClass}, except they work in\n * conjunction with `ngRepeat` and take effect only on odd (even) rows.\n *\n * This directive can be applied only within the scope of an\n * {@link ng.directive:ngRepeat ngRepeat}.\n *\n * @element ANY\n * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\n *   result of the evaluation can be a string representing space delimited class names or an array.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\n          <li ng-repeat=\"name in names\">\n           <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\n             {{name}} &nbsp; &nbsp; &nbsp;\n           </span>\n          </li>\n        </ol>\n     </file>\n     <file name=\"style.css\">\n       .odd {\n         color: red;\n       }\n       .even {\n         color: blue;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-class-odd and ng-class-even', function() {\n         expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\n           toMatch(/odd/);\n         expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\n           toMatch(/even/);\n       });\n     </file>\n   </example>\n */\nvar ngClassEvenDirective = classDirective('Even', 1);\n\n/**\n * @ngdoc directive\n * @name ngCloak\n * @restrict AC\n *\n * @description\n * The `ngCloak` directive is used to prevent the Angular html template from being briefly\n * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\n * directive to avoid the undesirable flicker effect caused by the html template display.\n *\n * The directive can be applied to the `<body>` element, but the preferred usage is to apply\n * multiple `ngCloak` directives to small portions of the page to permit progressive rendering\n * of the browser view.\n *\n * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and\n * `angular.min.js`.\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```css\n * [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\n *   display: none !important;\n * }\n * ```\n *\n * When this css rule is loaded by the browser, all html elements (including their children) that\n * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive\n * during the compilation of the template it deletes the `ngCloak` element attribute, making\n * the compiled element visible.\n *\n * For the best result, the `angular.js` script must be loaded in the head section of the html\n * document; alternatively, the css rule above must be included in the external stylesheet of the\n * application.\n *\n * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they\n * cannot match the `[ng\\:cloak]` selector. To work around this limitation, you must add the css\n * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below.\n *\n * @element ANY\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\n        <div id=\"template2\" ng-cloak class=\"ng-cloak\">{{ 'hello IE7' }}</div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should remove the template directive and css class', function() {\n         expect($('#template1').getAttribute('ng-cloak')).\n           toBeNull();\n         expect($('#template2').getAttribute('ng-cloak')).\n           toBeNull();\n       });\n     </file>\n   </example>\n *\n */\nvar ngCloakDirective = ngDirective({\n  compile: function(element, attr) {\n    attr.$set('ngCloak', undefined);\n    element.removeClass('ng-cloak');\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngController\n *\n * @description\n * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular\n * supports the principles behind the Model-View-Controller design pattern.\n *\n * MVC components in angular:\n *\n * * Model — The Model is scope properties; scopes are attached to the DOM where scope properties\n *   are accessed through bindings.\n * * View — The template (HTML with data bindings) that is rendered into the View.\n * * Controller — The `ngController` directive specifies a Controller class; the class contains business\n *   logic behind the application to decorate the scope with functions and values\n *\n * Note that you can also attach controllers to the DOM by declaring it in a route definition\n * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller\n * again using `ng-controller` in the template itself.  This will cause the controller to be attached\n * and executed twice.\n *\n * @element ANY\n * @scope\n * @param {expression} ngController Name of a globally accessible constructor function or an\n *     {@link guide/expression expression} that on the current scope evaluates to a\n *     constructor function. The controller instance can be published into a scope property\n *     by specifying `as propertyName`.\n *\n * @example\n * Here is a simple form for editing user contact information. Adding, removing, clearing, and\n * greeting are methods declared on the controller (see source tab). These methods can\n * easily be called from the angular markup. Notice that the scope becomes the `this` for the\n * controller's instance. This allows for easy access to the view data from the controller. Also\n * notice that any changes to the data are automatically reflected in the View without the need\n * for a manual update. The example is shown in two different declaration styles you may use\n * according to preference.\n   <example>\n     <file name=\"index.html\">\n      <script>\n        function SettingsController1() {\n          this.name = \"John Smith\";\n          this.contacts = [\n            {type: 'phone', value: '408 555 1212'},\n            {type: 'email', value: 'john.smith@example.org'} ];\n          };\n\n        SettingsController1.prototype.greet = function() {\n          alert(this.name);\n        };\n\n        SettingsController1.prototype.addContact = function() {\n          this.contacts.push({type: 'email', value: 'yourname@example.org'});\n        };\n\n        SettingsController1.prototype.removeContact = function(contactToRemove) {\n         var index = this.contacts.indexOf(contactToRemove);\n          this.contacts.splice(index, 1);\n        };\n\n        SettingsController1.prototype.clearContact = function(contact) {\n          contact.type = 'phone';\n          contact.value = '';\n        };\n      </script>\n      <div id=\"ctrl-as-exmpl\" ng-controller=\"SettingsController1 as settings\">\n        Name: <input type=\"text\" ng-model=\"settings.name\"/>\n        [ <a href=\"\" ng-click=\"settings.greet()\">greet</a> ]<br/>\n        Contact:\n        <ul>\n          <li ng-repeat=\"contact in settings.contacts\">\n            <select ng-model=\"contact.type\">\n               <option>phone</option>\n               <option>email</option>\n            </select>\n            <input type=\"text\" ng-model=\"contact.value\"/>\n            [ <a href=\"\" ng-click=\"settings.clearContact(contact)\">clear</a>\n            | <a href=\"\" ng-click=\"settings.removeContact(contact)\">X</a> ]\n          </li>\n          <li>[ <a href=\"\" ng-click=\"settings.addContact()\">add</a> ]</li>\n       </ul>\n      </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check controller as', function() {\n         var container = element(by.id('ctrl-as-exmpl'));\n\n         expect(container.findElement(by.model('settings.name'))\n             .getAttribute('value')).toBe('John Smith');\n\n         var firstRepeat =\n             container.findElement(by.repeater('contact in settings.contacts').row(0));\n         var secondRepeat =\n             container.findElement(by.repeater('contact in settings.contacts').row(1));\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('408 555 1212');\n         expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('john.smith@example.org');\n\n         firstRepeat.findElement(by.linkText('clear')).click();\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('');\n\n         container.findElement(by.linkText('add')).click();\n\n         expect(container.findElement(by.repeater('contact in settings.contacts').row(2))\n             .findElement(by.model('contact.value'))\n             .getAttribute('value'))\n             .toBe('yourname@example.org');\n       });\n     </file>\n   </example>\n    <example>\n     <file name=\"index.html\">\n      <script>\n        function SettingsController2($scope) {\n          $scope.name = \"John Smith\";\n          $scope.contacts = [\n            {type:'phone', value:'408 555 1212'},\n            {type:'email', value:'john.smith@example.org'} ];\n\n          $scope.greet = function() {\n           alert($scope.name);\n          };\n\n          $scope.addContact = function() {\n           $scope.contacts.push({type:'email', value:'yourname@example.org'});\n          };\n\n          $scope.removeContact = function(contactToRemove) {\n           var index = $scope.contacts.indexOf(contactToRemove);\n           $scope.contacts.splice(index, 1);\n          };\n\n          $scope.clearContact = function(contact) {\n           contact.type = 'phone';\n           contact.value = '';\n          };\n        }\n      </script>\n      <div id=\"ctrl-exmpl\" ng-controller=\"SettingsController2\">\n        Name: <input type=\"text\" ng-model=\"name\"/>\n        [ <a href=\"\" ng-click=\"greet()\">greet</a> ]<br/>\n        Contact:\n        <ul>\n          <li ng-repeat=\"contact in contacts\">\n            <select ng-model=\"contact.type\">\n               <option>phone</option>\n               <option>email</option>\n            </select>\n            <input type=\"text\" ng-model=\"contact.value\"/>\n            [ <a href=\"\" ng-click=\"clearContact(contact)\">clear</a>\n            | <a href=\"\" ng-click=\"removeContact(contact)\">X</a> ]\n          </li>\n          <li>[ <a href=\"\" ng-click=\"addContact()\">add</a> ]</li>\n       </ul>\n      </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check controller', function() {\n         var container = element(by.id('ctrl-exmpl'));\n\n         expect(container.findElement(by.model('name'))\n             .getAttribute('value')).toBe('John Smith');\n\n         var firstRepeat =\n             container.findElement(by.repeater('contact in contacts').row(0));\n         var secondRepeat =\n             container.findElement(by.repeater('contact in contacts').row(1));\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('408 555 1212');\n         expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('john.smith@example.org');\n\n         firstRepeat.findElement(by.linkText('clear')).click();\n\n         expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\n             .toBe('');\n\n         container.findElement(by.linkText('add')).click();\n\n         expect(container.findElement(by.repeater('contact in contacts').row(2))\n             .findElement(by.model('contact.value'))\n             .getAttribute('value'))\n             .toBe('yourname@example.org');\n       });\n     </file>\n   </example>\n\n */\nvar ngControllerDirective = [function() {\n  return {\n    scope: true,\n    controller: '@',\n    priority: 500\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngCsp\n *\n * @element html\n * @description\n * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.\n *\n * This is necessary when developing things like Google Chrome Extensions.\n *\n * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).\n * For us to be compatible, we just need to implement the \"getterFn\" in $parse without violating\n * any of these restrictions.\n *\n * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`\n * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will\n * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will\n * be raised.\n *\n * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically\n * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).\n * To make those directives work in CSP mode, include the `angular-csp.css` manually.\n *\n * In order to use this feature put the `ngCsp` directive on the root element of the application.\n *\n * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*\n *\n * @example\n * This example shows how to apply the `ngCsp` directive to the `html` tag.\n   ```html\n     <!doctype html>\n     <html ng-app ng-csp>\n     ...\n     ...\n     </html>\n   ```\n */\n\n// ngCsp is not implemented as a proper directive any more, because we need it be processed while we bootstrap\n// the system (before $parse is instantiated), for this reason we just have a csp() fn that looks for ng-csp attribute\n// anywhere in the current doc\n\n/**\n * @ngdoc directive\n * @name ngClick\n *\n * @description\n * The ngClick directive allows you to specify custom behavior when\n * an element is clicked.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\n * click. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\n        Increment\n      </button>\n      count: {{count}}\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-click', function() {\n         expect(element(by.binding('count')).getText()).toMatch('0');\n         element(by.css('button')).click();\n         expect(element(by.binding('count')).getText()).toMatch('1');\n       });\n     </file>\n   </example>\n */\n/*\n * A directive that allows creation of custom onclick handlers that are defined as angular\n * expressions and are compiled and executed within the current scope.\n *\n * Events that are handled via these handler are always configured not to propagate further.\n */\nvar ngEventDirectives = {};\nforEach(\n  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),\n  function(name) {\n    var directiveName = directiveNormalize('ng-' + name);\n    ngEventDirectives[directiveName] = ['$parse', function($parse) {\n      return {\n        compile: function($element, attr) {\n          var fn = $parse(attr[directiveName]);\n          return function(scope, element, attr) {\n            element.on(lowercase(name), function(event) {\n              scope.$apply(function() {\n                fn(scope, {$event:event});\n              });\n            });\n          };\n        }\n      };\n    }];\n  }\n);\n\n/**\n * @ngdoc directive\n * @name ngDblclick\n *\n * @description\n * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\n * a dblclick. (The Event object is available as `$event`)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-dblclick=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on double click)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousedown\n *\n * @description\n * The ngMousedown directive allows you to specify custom behavior on mousedown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\n * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousedown=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse down)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseup\n *\n * @description\n * Specify custom behavior on mouseup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\n * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseup=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (on mouse up)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngMouseover\n *\n * @description\n * Specify custom behavior on mouseover event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\n * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseover=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse is over)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseenter\n *\n * @description\n * Specify custom behavior on mouseenter event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\n * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseenter=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse enters)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMouseleave\n *\n * @description\n * Specify custom behavior on mouseleave event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\n * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mouseleave=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse leaves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngMousemove\n *\n * @description\n * Specify custom behavior on mousemove event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\n * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <button ng-mousemove=\"count = count + 1\" ng-init=\"count=0\">\n        Increment (when mouse moves)\n      </button>\n      count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeydown\n *\n * @description\n * Specify custom behavior on keydown event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon\n * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keydown=\"count = count + 1\" ng-init=\"count=0\">\n      key down count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeyup\n *\n * @description\n * Specify custom behavior on keyup event.\n *\n * @element ANY\n * @priority 0\n * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon\n * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keyup=\"count = count + 1\" ng-init=\"count=0\">\n      key up count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngKeypress\n *\n * @description\n * Specify custom behavior on keypress event.\n *\n * @element ANY\n * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon\n * keypress. ({@link guide/expression#-event- Event object is available as `$event`}\n * and can be interrogated for keyCode, altKey, etc.)\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-keypress=\"count = count + 1\" ng-init=\"count=0\">\n      key press count: {{count}}\n     </file>\n   </example>\n */\n\n\n/**\n * @ngdoc directive\n * @name ngSubmit\n *\n * @description\n * Enables binding angular expressions to onsubmit events.\n *\n * Additionally it prevents the default action (which for form means sending the request to the\n * server and reloading the current page), but only if the form does not contain `action`,\n * `data-action`, or `x-action` attributes.\n *\n * @element form\n * @priority 0\n * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\n * ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <script>\n        function Ctrl($scope) {\n          $scope.list = [];\n          $scope.text = 'hello';\n          $scope.submit = function() {\n            if ($scope.text) {\n              $scope.list.push(this.text);\n              $scope.text = '';\n            }\n          };\n        }\n      </script>\n      <form ng-submit=\"submit()\" ng-controller=\"Ctrl\">\n        Enter text and hit enter:\n        <input type=\"text\" ng-model=\"text\" name=\"text\" />\n        <input type=\"submit\" id=\"submit\" value=\"Submit\" />\n        <pre>list={{list}}</pre>\n      </form>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-submit', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n         expect(element(by.input('text')).getAttribute('value')).toBe('');\n       });\n       it('should ignore empty strings', function() {\n         expect(element(by.binding('list')).getText()).toBe('list=[]');\n         element(by.css('#submit')).click();\n         element(by.css('#submit')).click();\n         expect(element(by.binding('list')).getText()).toContain('hello');\n        });\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngFocus\n *\n * @description\n * Specify custom behavior on focus event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon\n * focus. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngBlur\n *\n * @description\n * Specify custom behavior on blur event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon\n * blur. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n * See {@link ng.directive:ngClick ngClick}\n */\n\n/**\n * @ngdoc directive\n * @name ngCopy\n *\n * @description\n * Specify custom behavior on copy event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon\n * copy. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-copy=\"copied=true\" ng-init=\"copied=false; value='copy me'\" ng-model=\"value\">\n      copied: {{copied}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngCut\n *\n * @description\n * Specify custom behavior on cut event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon\n * cut. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-cut=\"cut=true\" ng-init=\"cut=false; value='cut me'\" ng-model=\"value\">\n      cut: {{cut}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngPaste\n *\n * @description\n * Specify custom behavior on paste event.\n *\n * @element window, input, select, textarea, a\n * @priority 0\n * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon\n * paste. ({@link guide/expression#-event- Event object is available as `$event`})\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n      <input ng-paste=\"paste=true\" ng-init=\"paste=false\" placeholder='paste here'>\n      pasted: {{paste}}\n     </file>\n   </example>\n */\n\n/**\n * @ngdoc directive\n * @name ngIf\n * @restrict A\n *\n * @description\n * The `ngIf` directive removes or recreates a portion of the DOM tree based on an\n * {expression}. If the expression assigned to `ngIf` evaluates to a false\n * value then the element is removed from the DOM, otherwise a clone of the\n * element is reinserted into the DOM.\n *\n * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the\n * element in the DOM rather than changing its visibility via the `display` css property.  A common\n * case when this difference is significant is when using css selectors that rely on an element's\n * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.\n *\n * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope\n * is created when the element is restored.  The scope created within `ngIf` inherits from\n * its parent scope using\n * [prototypal inheritance](https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance).\n * An important implication of this is if `ngModel` is used within `ngIf` to bind to\n * a javascript primitive defined in the parent scope. In this case any modifications made to the\n * variable within the child scope will override (hide) the value in the parent scope.\n *\n * Also, `ngIf` recreates elements using their compiled state. An example of this behavior\n * is if an element's class attribute is directly modified after it's compiled, using something like\n * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element\n * the added class will be lost because the original compiled state is used to regenerate the element.\n *\n * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`\n * and `leave` effects.\n *\n * @animations\n * enter - happens just after the ngIf contents change and a new DOM element is created and injected into the ngIf container\n * leave - happens just before the ngIf contents are removed from the DOM\n *\n * @element ANY\n * @scope\n * @priority 600\n * @param {expression} ngIf If the {@link guide/expression expression} is falsy then\n *     the element is removed from the DOM tree. If it is truthy a copy of the compiled\n *     element is added to the DOM tree.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\" ng-init=\"checked=true\" /><br/>\n      Show when checked:\n      <span ng-if=\"checked\" class=\"animate-if\">\n        I'm removed when the checkbox is unchecked.\n      </span>\n    </file>\n    <file name=\"animations.css\">\n      .animate-if {\n        background:white;\n        border:1px solid black;\n        padding:10px;\n      }\n\n      .animate-if.ng-enter, .animate-if.ng-leave {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n      }\n\n      .animate-if.ng-enter,\n      .animate-if.ng-leave.ng-leave-active {\n        opacity:0;\n      }\n\n      .animate-if.ng-leave,\n      .animate-if.ng-enter.ng-enter-active {\n        opacity:1;\n      }\n    </file>\n  </example>\n */\nvar ngIfDirective = ['$animate', function($animate) {\n  return {\n    transclude: 'element',\n    priority: 600,\n    terminal: true,\n    restrict: 'A',\n    $$tlb: true,\n    link: function ($scope, $element, $attr, ctrl, $transclude) {\n        var block, childScope, previousElements;\n        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {\n\n          if (toBoolean(value)) {\n            if (!childScope) {\n              childScope = $scope.$new();\n              $transclude(childScope, function (clone) {\n                clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when it's template arrives.\n                block = {\n                  clone: clone\n                };\n                $animate.enter(clone, $element.parent(), $element);\n              });\n            }\n          } else {\n            if(previousElements) {\n              previousElements.remove();\n              previousElements = null;\n            }\n            if(childScope) {\n              childScope.$destroy();\n              childScope = null;\n            }\n            if(block) {\n              previousElements = getBlockElements(block.clone);\n              $animate.leave(previousElements, function() {\n                previousElements = null;\n              });\n              block = null;\n            }\n          }\n        });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngInclude\n * @restrict ECA\n *\n * @description\n * Fetches, compiles and includes an external HTML fragment.\n *\n * By default, the template URL is restricted to the same domain and protocol as the\n * application document. This is done by calling {@link ng.$sce#getTrustedResourceUrl\n * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols\n * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or\n * [wrap them](ng.$sce#trustAsResourceUrl) as trusted values. Refer to Angular's {@link\n * ng.$sce Strict Contextual Escaping}.\n *\n * In addition, the browser's\n * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\n * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\n * policy may further restrict whether the template is successfully loaded.\n * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`\n * access on some browsers.\n *\n * @animations\n * enter - animation is used to bring new content into the browser.\n * leave - animation is used to animate existing content away.\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n *\n * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\n *                 make sure you wrap it in **single** quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\n * @param {string=} onload Expression to evaluate when a new partial is loaded.\n *\n * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the content is loaded.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n     <div ng-controller=\"Ctrl\">\n       <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\n        <option value=\"\">(blank)</option>\n       </select>\n       url of the template: <tt>{{template.url}}</tt>\n       <hr/>\n       <div class=\"slide-animate-container\">\n         <div class=\"slide-animate\" ng-include=\"template.url\"></div>\n       </div>\n     </div>\n    </file>\n    <file name=\"script.js\">\n      function Ctrl($scope) {\n        $scope.templates =\n          [ { name: 'template1.html', url: 'template1.html'},\n            { name: 'template2.html', url: 'template2.html'} ];\n        $scope.template = $scope.templates[0];\n      }\n     </file>\n    <file name=\"template1.html\">\n      Content of template1.html\n    </file>\n    <file name=\"template2.html\">\n      Content of template2.html\n    </file>\n    <file name=\"animations.css\">\n      .slide-animate-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .slide-animate {\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter, .slide-animate.ng-leave {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n        display:block;\n        padding:10px;\n      }\n\n      .slide-animate.ng-enter {\n        top:-50px;\n      }\n      .slide-animate.ng-enter.ng-enter-active {\n        top:0;\n      }\n\n      .slide-animate.ng-leave {\n        top:0;\n      }\n      .slide-animate.ng-leave.ng-leave-active {\n        top:50px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var templateSelect = element(by.model('template'));\n      var includeElem = element(by.css('[ng-include]'));\n\n      it('should load template1.html', function() {\n        expect(includeElem.getText()).toMatch(/Content of template1.html/);\n      });\n\n      it('should load template2.html', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          // See https://github.com/angular/protractor/issues/480\n          return;\n        }\n        templateSelect.click();\n        templateSelect.element.all(by.css('option')).get(2).click();\n        expect(includeElem.getText()).toMatch(/Content of template2.html/);\n      });\n\n      it('should change to blank', function() {\n        if (browser.params.browser == 'firefox') {\n          // Firefox can't handle using selects\n          return;\n        }\n        templateSelect.click();\n        templateSelect.element.all(by.css('option')).get(0).click();\n        expect(includeElem.isPresent()).toBe(false);\n      });\n    </file>\n  </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentRequested\n * @eventType emit on the scope ngInclude was declared in\n * @description\n * Emitted every time the ngInclude content is requested.\n */\n\n\n/**\n * @ngdoc event\n * @name ngInclude#$includeContentLoaded\n * @eventType emit on the current ngInclude scope\n * @description\n * Emitted every time the ngInclude content is reloaded.\n */\nvar ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce',\n                  function($http,   $templateCache,   $anchorScroll,   $animate,   $sce) {\n  return {\n    restrict: 'ECA',\n    priority: 400,\n    terminal: true,\n    transclude: 'element',\n    controller: angular.noop,\n    compile: function(element, attr) {\n      var srcExp = attr.ngInclude || attr.src,\n          onloadExp = attr.onload || '',\n          autoScrollExp = attr.autoscroll;\n\n      return function(scope, $element, $attr, ctrl, $transclude) {\n        var changeCounter = 0,\n            currentScope,\n            previousElement,\n            currentElement;\n\n        var cleanupLastIncludeContent = function() {\n          if(previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if(currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if(currentElement) {\n            $animate.leave(currentElement, function() {\n              previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        };\n\n        scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {\n          var afterAnimation = function() {\n            if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n              $anchorScroll();\n            }\n          };\n          var thisChangeId = ++changeCounter;\n\n          if (src) {\n            $http.get(src, {cache: $templateCache}).success(function(response) {\n              if (thisChangeId !== changeCounter) return;\n              var newScope = scope.$new();\n              ctrl.template = response;\n\n              // Note: This will also link all children of ng-include that were contained in the original\n              // html. If that content contains controllers, ... they could pollute/change the scope.\n              // However, using ng-include on an element with additional content does not make sense...\n              // Note: We can't remove them in the cloneAttchFn of $transclude as that\n              // function is called before linking the content, which would apply child\n              // directives to non existing elements.\n              var clone = $transclude(newScope, function(clone) {\n                cleanupLastIncludeContent();\n                $animate.enter(clone, null, $element, afterAnimation);\n              });\n\n              currentScope = newScope;\n              currentElement = clone;\n\n              currentScope.$emit('$includeContentLoaded');\n              scope.$eval(onloadExp);\n            }).error(function() {\n              if (thisChangeId === changeCounter) cleanupLastIncludeContent();\n            });\n            scope.$emit('$includeContentRequested');\n          } else {\n            cleanupLastIncludeContent();\n            ctrl.template = null;\n          }\n        });\n      };\n    }\n  };\n}];\n\n// This directive is called during the $transclude call of the first `ngInclude` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngInclude\n// is called.\nvar ngIncludeFillContentDirective = ['$compile',\n  function($compile) {\n    return {\n      restrict: 'ECA',\n      priority: -400,\n      require: 'ngInclude',\n      link: function(scope, $element, $attr, ctrl) {\n        $element.html(ctrl.template);\n        $compile($element.contents())(scope);\n      }\n    };\n  }];\n\n/**\n * @ngdoc directive\n * @name ngInit\n * @restrict AC\n *\n * @description\n * The `ngInit` directive allows you to evaluate an expression in the\n * current scope.\n *\n * <div class=\"alert alert-error\">\n * The only appropriate use of `ngInit` is for aliasing special properties of\n * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you\n * should use {@link guide/controller controllers} rather than `ngInit`\n * to initialize values on a scope.\n * </div>\n * <div class=\"alert alert-warning\">\n * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make\n * sure you have parenthesis for correct precedence:\n * <pre class=\"prettyprint\">\n *   <div ng-init=\"test1 = (data | orderBy:'name')\"></div>\n * </pre>\n * </div>\n *\n * @priority 450\n *\n * @element ANY\n * @param {expression} ngInit {@link guide/expression Expression} to eval.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n   <script>\n     function Ctrl($scope) {\n       $scope.list = [['a', 'b'], ['c', 'd']];\n     }\n   </script>\n   <div ng-controller=\"Ctrl\">\n     <div ng-repeat=\"innerList in list\" ng-init=\"outerIndex = $index\">\n       <div ng-repeat=\"value in innerList\" ng-init=\"innerIndex = $index\">\n          <span class=\"example-init\">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>\n       </div>\n     </div>\n   </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       it('should alias index positions', function() {\n         var elements = element.all(by.css('.example-init'));\n         expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');\n         expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');\n         expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');\n         expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');\n       });\n     </file>\n   </example>\n */\nvar ngInitDirective = ngDirective({\n  priority: 450,\n  compile: function() {\n    return {\n      pre: function(scope, element, attrs) {\n        scope.$eval(attrs.ngInit);\n      }\n    };\n  }\n});\n\n/**\n * @ngdoc directive\n * @name ngNonBindable\n * @restrict AC\n * @priority 1000\n *\n * @description\n * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current\n * DOM element. This is useful if the element contains what appears to be Angular directives and\n * bindings but which should be ignored by Angular. This could be the case if you have a site that\n * displays snippets of code, for instance.\n *\n * @element ANY\n *\n * @example\n * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\n * but the one wrapped in `ngNonBindable` is left alone.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <div>Normal: {{1 + 2}}</div>\n        <div ng-non-bindable>Ignored: {{1 + 2}}</div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n       it('should check ng-non-bindable', function() {\n         expect(element(by.binding('1 + 2')).getText()).toContain('3');\n         expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\n       });\n      </file>\n    </example>\n */\nvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\n\n/**\n * @ngdoc directive\n * @name ngPluralize\n * @restrict EA\n *\n * @description\n * `ngPluralize` is a directive that displays messages according to en-US localization rules.\n * These rules are bundled with angular.js, but can be overridden\n * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\n * by specifying the mappings between\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * and the strings to be displayed.\n *\n * # Plural categories and explicit number rules\n * There are two\n * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\n * in Angular's default en-US locale: \"one\" and \"other\".\n *\n * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\n * any number that is not 1), an explicit number rule can only match one number. For example, the\n * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\n * and explicit number rules throughout the rest of this documentation.\n *\n * # Configuring ngPluralize\n * You configure ngPluralize by providing 2 attributes: `count` and `when`.\n * You can also provide an optional attribute, `offset`.\n *\n * The value of the `count` attribute can be either a string or an {@link guide/expression\n * Angular expression}; these are evaluated on the current scope for its bound value.\n *\n * The `when` attribute specifies the mappings between plural categories and the actual\n * string to be displayed. The value of the attribute should be a JSON object.\n *\n * The following example shows how to configure ngPluralize:\n *\n * ```html\n * <ng-pluralize count=\"personCount\"\n                 when=\"{'0': 'Nobody is viewing.',\n *                      'one': '1 person is viewing.',\n *                      'other': '{} people are viewing.'}\">\n * </ng-pluralize>\n *```\n *\n * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\n * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\n * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\n * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\n * show \"a dozen people are viewing\".\n *\n * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\n * into pluralized strings. In the previous example, Angular will replace `{}` with\n * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\n * for <span ng-non-bindable>{{numberExpression}}</span>.\n *\n * # Configuring ngPluralize with offset\n * The `offset` attribute allows further customization of pluralized text, which can result in\n * a better user experience. For example, instead of the message \"4 people are viewing this document\",\n * you might display \"John, Kate and 2 others are viewing this document\".\n * The offset attribute allows you to offset a number by any desired value.\n * Let's take a look at an example:\n *\n * ```html\n * <ng-pluralize count=\"personCount\" offset=2\n *               when=\"{'0': 'Nobody is viewing.',\n *                      '1': '{{person1}} is viewing.',\n *                      '2': '{{person1}} and {{person2}} are viewing.',\n *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',\n *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n * </ng-pluralize>\n * ```\n *\n * Notice that we are still using two plural categories(one, other), but we added\n * three explicit number rules 0, 1 and 2.\n * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\n * When three people view the document, no explicit number rule is found, so\n * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\n * In this case, plural category 'one' is matched and \"John, Marry and one other person are viewing\"\n * is shown.\n *\n * Note that when you specify offsets, you must provide explicit number rules for\n * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\n * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\n * plural categories \"one\" and \"other\".\n *\n * @param {string|expression} count The variable to be bound to.\n * @param {string} when The mapping between plural category to its corresponding strings.\n * @param {number=} offset Offset to deduct from the total number.\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <script>\n          function Ctrl($scope) {\n            $scope.person1 = 'Igor';\n            $scope.person2 = 'Misko';\n            $scope.personCount = 1;\n          }\n        </script>\n        <div ng-controller=\"Ctrl\">\n          Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /><br/>\n          Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /><br/>\n          Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /><br/>\n\n          <!--- Example with simple pluralization rules for en locale --->\n          Without Offset:\n          <ng-pluralize count=\"personCount\"\n                        when=\"{'0': 'Nobody is viewing.',\n                               'one': '1 person is viewing.',\n                               'other': '{} people are viewing.'}\">\n          </ng-pluralize><br>\n\n          <!--- Example with offset --->\n          With Offset(2):\n          <ng-pluralize count=\"personCount\" offset=2\n                        when=\"{'0': 'Nobody is viewing.',\n                               '1': '{{person1}} is viewing.',\n                               '2': '{{person1}} and {{person2}} are viewing.',\n                               'one': '{{person1}}, {{person2}} and one other person are viewing.',\n                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\n          </ng-pluralize>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should show correct pluralized string', function() {\n          var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var countInput = element(by.model('personCount'));\n\n          expect(withoutOffset.getText()).toEqual('1 person is viewing.');\n          expect(withOffset.getText()).toEqual('Igor is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('0');\n\n          expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\n          expect(withOffset.getText()).toEqual('Nobody is viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('2');\n\n          expect(withoutOffset.getText()).toEqual('2 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('3');\n\n          expect(withoutOffset.getText()).toEqual('3 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\n\n          countInput.clear();\n          countInput.sendKeys('4');\n\n          expect(withoutOffset.getText()).toEqual('4 people are viewing.');\n          expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\n        });\n        it('should show data-bound names', function() {\n          var withOffset = element.all(by.css('ng-pluralize')).get(1);\n          var personCount = element(by.model('personCount'));\n          var person1 = element(by.model('person1'));\n          var person2 = element(by.model('person2'));\n          personCount.clear();\n          personCount.sendKeys('4');\n          person1.clear();\n          person1.sendKeys('Di');\n          person2.clear();\n          person2.sendKeys('Vojta');\n          expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\n        });\n      </file>\n    </example>\n */\nvar ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {\n  var BRACE = /{}/g;\n  return {\n    restrict: 'EA',\n    link: function(scope, element, attr) {\n      var numberExp = attr.count,\n          whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\n          offset = attr.offset || 0,\n          whens = scope.$eval(whenExp) || {},\n          whensExpFns = {},\n          startSymbol = $interpolate.startSymbol(),\n          endSymbol = $interpolate.endSymbol(),\n          isWhen = /^when(Minus)?(.+)$/;\n\n      forEach(attr, function(expression, attributeName) {\n        if (isWhen.test(attributeName)) {\n          whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] =\n            element.attr(attr.$attr[attributeName]);\n        }\n      });\n      forEach(whens, function(expression, key) {\n        whensExpFns[key] =\n          $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +\n            offset + endSymbol));\n      });\n\n      scope.$watch(function ngPluralizeWatch() {\n        var value = parseFloat(scope.$eval(numberExp));\n\n        if (!isNaN(value)) {\n          //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,\n          //check it against pluralization rules in $locale service\n          if (!(value in whens)) value = $locale.pluralCat(value - offset);\n           return whensExpFns[value](scope);\n        } else {\n          return '';\n        }\n      }, function ngPluralizeWatchAction(newVal) {\n        element.text(newVal);\n      });\n    }\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngRepeat\n *\n * @description\n * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\n * instance gets its own scope, where the given loop variable is set to the current collection item,\n * and `$index` is set to the item index or key.\n *\n * Special properties are exposed on the local scope of each template instance, including:\n *\n * | Variable  | Type            | Details                                                                     |\n * |-----------|-----------------|-----------------------------------------------------------------------------|\n * | `$index`  | {@type number}  | iterator offset of the repeated element (0..length-1)                       |\n * | `$first`  | {@type boolean} | true if the repeated element is first in the iterator.                      |\n * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\n * | `$last`   | {@type boolean} | true if the repeated element is last in the iterator.                       |\n * | `$even`   | {@type boolean} | true if the iterator position `$index` is even (otherwise false).           |\n * | `$odd`    | {@type boolean} | true if the iterator position `$index` is odd (otherwise false).            |\n *\n * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\n * This may be useful when, for instance, nesting ngRepeats.\n *\n * # Special repeat start and end points\n * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\n * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\n * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\n * up to and including the ending HTML tag where **ng-repeat-end** is placed.\n *\n * The example below makes use of this feature:\n * ```html\n *   <header ng-repeat-start=\"item in items\">\n *     Header {{ item }}\n *   </header>\n *   <div class=\"body\">\n *     Body {{ item }}\n *   </div>\n *   <footer ng-repeat-end>\n *     Footer {{ item }}\n *   </footer>\n * ```\n *\n * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\n * ```html\n *   <header>\n *     Header A\n *   </header>\n *   <div class=\"body\">\n *     Body A\n *   </div>\n *   <footer>\n *     Footer A\n *   </footer>\n *   <header>\n *     Header B\n *   </header>\n *   <div class=\"body\">\n *     Body B\n *   </div>\n *   <footer>\n *     Footer B\n *   </footer>\n * ```\n *\n * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\n * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\n *\n * @animations\n * **.enter** - when a new item is added to the list or when an item is revealed after a filter\n *\n * **.leave** - when an item is removed from the list or when an item is filtered out\n *\n * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered\n *\n * @element ANY\n * @scope\n * @priority 1000\n * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\n *   formats are currently supported:\n *\n *   * `variable in expression` – where variable is the user defined loop variable and `expression`\n *     is a scope expression giving the collection to enumerate.\n *\n *     For example: `album in artist.albums`.\n *\n *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\n *     and `expression` is the scope expression giving the collection to enumerate.\n *\n *     For example: `(name, age) in {'adam':10, 'amalie':12}`.\n *\n *   * `variable in expression track by tracking_expression` – You can also provide an optional tracking function\n *     which can be used to associate the objects in the collection with the DOM elements. If no tracking function\n *     is specified the ng-repeat associates elements by identity in the collection. It is an error to have\n *     more than one tracking function to resolve to the same key. (This would mean that two distinct objects are\n *     mapped to the same DOM element, which is not possible.)  Filters should be applied to the expression,\n *     before specifying a tracking expression.\n *\n *     For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements\n *     will be associated by item identity in the array.\n *\n *     For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique\n *     `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements\n *     with the corresponding item in the array by identity. Moving the same object in array would move the DOM\n *     element in the same way in the DOM.\n *\n *     For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this\n *     case the object identity does not matter. Two objects are considered equivalent as long as their `id`\n *     property is same.\n *\n *     For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter\n *     to items in conjunction with a tracking expression.\n *\n * @example\n * This example initializes the scope to a list of names and\n * then uses `ngRepeat` to display every person:\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-init=\"friends = [\n        {name:'John', age:25, gender:'boy'},\n        {name:'Jessie', age:30, gender:'girl'},\n        {name:'Johanna', age:28, gender:'girl'},\n        {name:'Joy', age:15, gender:'girl'},\n        {name:'Mary', age:28, gender:'girl'},\n        {name:'Peter', age:95, gender:'boy'},\n        {name:'Sebastian', age:50, gender:'boy'},\n        {name:'Erika', age:27, gender:'girl'},\n        {name:'Patrick', age:40, gender:'boy'},\n        {name:'Samantha', age:60, gender:'girl'}\n      ]\">\n        I have {{friends.length}} friends. They are:\n        <input type=\"search\" ng-model=\"q\" placeholder=\"filter friends...\" />\n        <ul class=\"example-animate-container\">\n          <li class=\"animate-repeat\" ng-repeat=\"friend in friends | filter:q\">\n            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\n          </li>\n        </ul>\n      </div>\n    </file>\n    <file name=\"animations.css\">\n      .example-animate-container {\n        background:white;\n        border:1px solid black;\n        list-style:none;\n        margin:0;\n        padding:0 10px;\n      }\n\n      .animate-repeat {\n        line-height:40px;\n        list-style:none;\n        box-sizing:border-box;\n      }\n\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter,\n      .animate-repeat.ng-leave {\n        -webkit-transition:all linear 0.5s;\n        transition:all linear 0.5s;\n      }\n\n      .animate-repeat.ng-leave.ng-leave-active,\n      .animate-repeat.ng-move,\n      .animate-repeat.ng-enter {\n        opacity:0;\n        max-height:0;\n      }\n\n      .animate-repeat.ng-leave,\n      .animate-repeat.ng-move.ng-move-active,\n      .animate-repeat.ng-enter.ng-enter-active {\n        opacity:1;\n        max-height:40px;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var friends = element.all(by.repeater('friend in friends'));\n\n      it('should render initial data set', function() {\n        expect(friends.count()).toBe(10);\n        expect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\n        expect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\n        expect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\n        expect(element(by.binding('friends.length')).getText())\n            .toMatch(\"I have 10 friends. They are:\");\n      });\n\n       it('should update repeater when filter predicate changes', function() {\n         expect(friends.count()).toBe(10);\n\n         element(by.model('q')).sendKeys('ma');\n\n         expect(friends.count()).toBe(2);\n         expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\n         expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\n       });\n      </file>\n    </example>\n */\nvar ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {\n  var NG_REMOVED = '$$NG_REMOVED';\n  var ngRepeatMinErr = minErr('ngRepeat');\n  return {\n    transclude: 'element',\n    priority: 1000,\n    terminal: true,\n    $$tlb: true,\n    link: function($scope, $element, $attr, ctrl, $transclude){\n        var expression = $attr.ngRepeat;\n        var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/),\n          trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn,\n          lhs, rhs, valueIdentifier, keyIdentifier,\n          hashFnLocals = {$id: hashKey};\n\n        if (!match) {\n          throw ngRepeatMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\n            expression);\n        }\n\n        lhs = match[1];\n        rhs = match[2];\n        trackByExp = match[3];\n\n        if (trackByExp) {\n          trackByExpGetter = $parse(trackByExp);\n          trackByIdExpFn = function(key, value, index) {\n            // assign key, value, and $index to the locals so that they can be used in hash functions\n            if (keyIdentifier) hashFnLocals[keyIdentifier] = key;\n            hashFnLocals[valueIdentifier] = value;\n            hashFnLocals.$index = index;\n            return trackByExpGetter($scope, hashFnLocals);\n          };\n        } else {\n          trackByIdArrayFn = function(key, value) {\n            return hashKey(value);\n          };\n          trackByIdObjFn = function(key) {\n            return key;\n          };\n        }\n\n        match = lhs.match(/^(?:([\\$\\w]+)|\\(([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\))$/);\n        if (!match) {\n          throw ngRepeatMinErr('iidexp', \"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",\n                                                                    lhs);\n        }\n        valueIdentifier = match[3] || match[1];\n        keyIdentifier = match[2];\n\n        // Store a list of elements from previous run. This is a hash where key is the item from the\n        // iterator, and the value is objects with following properties.\n        //   - scope: bound scope\n        //   - element: previous element.\n        //   - index: position\n        var lastBlockMap = {};\n\n        //watch props\n        $scope.$watchCollection(rhs, function ngRepeatAction(collection){\n          var index, length,\n              previousNode = $element[0],     // current position of the node\n              nextNode,\n              // Same as lastBlockMap but it has the current state. It will become the\n              // lastBlockMap on the next iteration.\n              nextBlockMap = {},\n              arrayLength,\n              childScope,\n              key, value, // key/value of iteration\n              trackById,\n              trackByIdFn,\n              collectionKeys,\n              block,       // last object information {scope, element, id}\n              nextBlockOrder = [],\n              elementsToRemove;\n\n\n          if (isArrayLike(collection)) {\n            collectionKeys = collection;\n            trackByIdFn = trackByIdExpFn || trackByIdArrayFn;\n          } else {\n            trackByIdFn = trackByIdExpFn || trackByIdObjFn;\n            // if object, extract keys, sort them and use to determine order of iteration over obj props\n            collectionKeys = [];\n            for (key in collection) {\n              if (collection.hasOwnProperty(key) && key.charAt(0) != '$') {\n                collectionKeys.push(key);\n              }\n            }\n            collectionKeys.sort();\n          }\n\n          arrayLength = collectionKeys.length;\n\n          // locate existing items\n          length = nextBlockOrder.length = collectionKeys.length;\n          for(index = 0; index < length; index++) {\n           key = (collection === collectionKeys) ? index : collectionKeys[index];\n           value = collection[key];\n           trackById = trackByIdFn(key, value, index);\n           assertNotHasOwnProperty(trackById, '`track by` id');\n           if(lastBlockMap.hasOwnProperty(trackById)) {\n             block = lastBlockMap[trackById];\n             delete lastBlockMap[trackById];\n             nextBlockMap[trackById] = block;\n             nextBlockOrder[index] = block;\n           } else if (nextBlockMap.hasOwnProperty(trackById)) {\n             // restore lastBlockMap\n             forEach(nextBlockOrder, function(block) {\n               if (block && block.scope) lastBlockMap[block.id] = block;\n             });\n             // This is a duplicate and we need to throw an error\n             throw ngRepeatMinErr('dupes', \"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}\",\n                                                                                                                                                    expression,       trackById);\n           } else {\n             // new never before seen block\n             nextBlockOrder[index] = { id: trackById };\n             nextBlockMap[trackById] = false;\n           }\n         }\n\n          // remove existing items\n          for (key in lastBlockMap) {\n            // lastBlockMap is our own object so we don't need to use special hasOwnPropertyFn\n            if (lastBlockMap.hasOwnProperty(key)) {\n              block = lastBlockMap[key];\n              elementsToRemove = getBlockElements(block.clone);\n              $animate.leave(elementsToRemove);\n              forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; });\n              block.scope.$destroy();\n            }\n          }\n\n          // we are not using forEach for perf reasons (trying to avoid #call)\n          for (index = 0, length = collectionKeys.length; index < length; index++) {\n            key = (collection === collectionKeys) ? index : collectionKeys[index];\n            value = collection[key];\n            block = nextBlockOrder[index];\n            if (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]);\n\n            if (block.scope) {\n              // if we have already seen this object, then we need to reuse the\n              // associated scope/element\n              childScope = block.scope;\n\n              nextNode = previousNode;\n              do {\n                nextNode = nextNode.nextSibling;\n              } while(nextNode && nextNode[NG_REMOVED]);\n\n              if (getBlockStart(block) != nextNode) {\n                // existing item which got moved\n                $animate.move(getBlockElements(block.clone), null, jqLite(previousNode));\n              }\n              previousNode = getBlockEnd(block);\n            } else {\n              // new item which we don't know about\n              childScope = $scope.$new();\n            }\n\n            childScope[valueIdentifier] = value;\n            if (keyIdentifier) childScope[keyIdentifier] = key;\n            childScope.$index = index;\n            childScope.$first = (index === 0);\n            childScope.$last = (index === (arrayLength - 1));\n            childScope.$middle = !(childScope.$first || childScope.$last);\n            // jshint bitwise: false\n            childScope.$odd = !(childScope.$even = (index&1) === 0);\n            // jshint bitwise: true\n\n            if (!block.scope) {\n              $transclude(childScope, function(clone) {\n                clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');\n                $animate.enter(clone, null, jqLite(previousNode));\n                previousNode = clone;\n                block.scope = childScope;\n                // Note: We only need the first/last node of the cloned nodes.\n                // However, we need to keep the reference to the jqlite wrapper as it might be changed later\n                // by a directive with templateUrl when it's template arrives.\n                block.clone = clone;\n                nextBlockMap[block.id] = block;\n              });\n            }\n          }\n          lastBlockMap = nextBlockMap;\n        });\n    }\n  };\n\n  function getBlockStart(block) {\n    return block.clone[0];\n  }\n\n  function getBlockEnd(block) {\n    return block.clone[block.clone.length - 1];\n  }\n}];\n\n/**\n * @ngdoc directive\n * @name ngShow\n *\n * @description\n * The `ngShow` directive shows or hides the given HTML element based on the expression\n * provided to the ngShow attribute. The element is shown or hidden by removing or adding\n * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is visible) -->\n * <div ng-show=\"myValue\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is hidden) -->\n * <div ng-show=\"myValue\" class=\"ng-hide\"></div>\n * ```\n *\n * When the ngShow expression evaluates to false then the ng-hide CSS class is added to the class attribute\n * on the element causing it to become hidden. When true, the ng-hide CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding .ng-hide\n *\n * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by\n * restating the styles for the .ng-hide class in CSS:\n * ```css\n * .ng-hide {\n *   /&#42; Not to worry, this will override the AngularJS default...\n *   display:block!important;\n *\n *   /&#42; this is just another form of hiding an element &#42;/\n *   position:absolute;\n *   top:-9999px;\n *   left:-9999px;\n * }\n * ```\n *\n * Just remember to include the important flag so the CSS override will function.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):<br />\n * \"f\" / \"0\" / \"false\" / \"no\" / \"n\" / \"[]\"\n * </div>\n *\n * ## A note about animations with ngShow\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass except that\n * you must also include the !important flag to override the display property\n * so that you can perform an animation when the element is hidden during the time of the animation.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   /&#42; this is required as of 1.3x to properly\n *      apply all styling in a show/hide animation &#42;/\n *   transition:0s linear all;\n *\n *   /&#42; this must be set as block so the animation is visible &#42;/\n *   display:block!important;\n * }\n *\n * .my-element.ng-hide-add-active,\n * .my-element.ng-hide-remove-active {\n *   /&#42; the transition is defined in the active class &#42;/\n *   transition:1s linear all;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * @animations\n * addClass: .ng-hide - happens after the ngShow expression evaluates to a truthy value and the just before contents are set to visible\n * removeClass: .ng-hide - happens after the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden\n *\n * @element ANY\n * @param {expression} ngShow If the {@link guide/expression expression} is truthy\n *     then the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-show\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-show\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-show {\n        line-height:20px;\n        opacity:1;\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n\n      .animate-show.ng-hide-add,\n      .animate-show.ng-hide-remove {\n        display:block!important;\n      }\n\n      .animate-show.ng-hide-add.ng-hide-add-active,\n      .animate-show.ng-hide-remove.ng-hide-remove-active {\n        -webkit-transition:all linear 0.5s;\n        transition:all linear 0.5s;\n      }\n\n      .animate-show.ng-hide {\n        line-height:0;\n        opacity:0;\n        padding:0 10px;\n      }\n\n      .check-element {\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngShowDirective = ['$animate', function($animate) {\n  return function(scope, element, attr) {\n    scope.$watch(attr.ngShow, function ngShowWatchAction(value){\n      $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');\n    });\n  };\n}];\n\n\n/**\n * @ngdoc directive\n * @name ngHide\n *\n * @description\n * The `ngHide` directive shows or hides the given HTML element based on the expression\n * provided to the ngHide attribute. The element is shown or hidden by removing or adding\n * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\n * in AngularJS and sets the display style to none (using an !important flag).\n * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\n *\n * ```html\n * <!-- when $scope.myValue is truthy (element is hidden) -->\n * <div ng-hide=\"myValue\" class=\"ng-hide\"></div>\n *\n * <!-- when $scope.myValue is falsy (element is visible) -->\n * <div ng-hide=\"myValue\"></div>\n * ```\n *\n * When the ngHide expression evaluates to true then the .ng-hide CSS class is added to the class attribute\n * on the element causing it to become hidden. When false, the ng-hide CSS class is removed\n * from the element causing the element not to appear hidden.\n *\n * ## Why is !important used?\n *\n * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector\n * can be easily overridden by heavier selectors. For example, something as simple\n * as changing the display style on a HTML list item would make hidden elements appear visible.\n * This also becomes a bigger issue when dealing with CSS frameworks.\n *\n * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\n * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\n * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\n *\n * ### Overriding .ng-hide\n *\n * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by\n * restating the styles for the .ng-hide class in CSS:\n * ```css\n * .ng-hide {\n *   //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...\n *   display:block!important;\n *\n *   //this is just another form of hiding an element\n *   position:absolute;\n *   top:-9999px;\n *   left:-9999px;\n * }\n * ```\n *\n * Just remember to include the important flag so the CSS override will function.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):<br />\n * \"f\" / \"0\" / \"false\" / \"no\" / \"n\" / \"[]\"\n * </div>\n *\n * ## A note about animations with ngHide\n *\n * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\n * is true and false. This system works like the animation system present with ngClass, except that\n * you must also include the !important flag to override the display property so\n * that you can perform an animation when the element is hidden during the time of the animation.\n *\n * ```css\n * //\n * //a working example can be found at the bottom of this page\n * //\n * .my-element.ng-hide-add, .my-element.ng-hide-remove {\n *   transition:0.5s linear all;\n *   display:block!important;\n * }\n *\n * .my-element.ng-hide-add { ... }\n * .my-element.ng-hide-add.ng-hide-add-active { ... }\n * .my-element.ng-hide-remove { ... }\n * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\n * ```\n *\n * @animations\n * removeClass: .ng-hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden\n * addClass: .ng-hide - happens after the ngHide expression evaluates to a non truthy value and just before the contents are set to visible\n *\n * @element ANY\n * @param {expression} ngHide If the {@link guide/expression expression} is truthy then\n *     the element is shown or hidden respectively.\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\n      <div>\n        Show:\n        <div class=\"check-element animate-hide\" ng-show=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\n        </div>\n      </div>\n      <div>\n        Hide:\n        <div class=\"check-element animate-hide\" ng-hide=\"checked\">\n          <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\n        </div>\n      </div>\n    </file>\n    <file name=\"glyphicons.css\">\n      @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);\n    </file>\n    <file name=\"animations.css\">\n      .animate-hide {\n        -webkit-transition:all linear 0.5s;\n        transition:all linear 0.5s;\n        line-height:20px;\n        opacity:1;\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n\n      .animate-hide.ng-hide-add,\n      .animate-hide.ng-hide-remove {\n        display:block!important;\n      }\n\n      .animate-hide.ng-hide {\n        line-height:0;\n        opacity:0;\n        padding:0 10px;\n      }\n\n      .check-element {\n        padding:10px;\n        border:1px solid black;\n        background:white;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\n      var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\n\n      it('should check ng-show / ng-hide', function() {\n        expect(thumbsUp.isDisplayed()).toBeFalsy();\n        expect(thumbsDown.isDisplayed()).toBeTruthy();\n\n        element(by.model('checked')).click();\n\n        expect(thumbsUp.isDisplayed()).toBeTruthy();\n        expect(thumbsDown.isDisplayed()).toBeFalsy();\n      });\n    </file>\n  </example>\n */\nvar ngHideDirective = ['$animate', function($animate) {\n  return function(scope, element, attr) {\n    scope.$watch(attr.ngHide, function ngHideWatchAction(value){\n      $animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'ng-hide');\n    });\n  };\n}];\n\n/**\n * @ngdoc directive\n * @name ngStyle\n * @restrict AC\n *\n * @description\n * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\n *\n * @element ANY\n * @param {expression} ngStyle\n *\n * {@link guide/expression Expression} which evals to an\n * object whose keys are CSS style names and values are corresponding values for those CSS\n * keys.\n *\n * Since some CSS style names are not valid keys for an object, they must be quoted.\n * See the 'background-color' style in the example below.\n *\n * @example\n   <example>\n     <file name=\"index.html\">\n        <input type=\"button\" value=\"set color\" ng-click=\"myStyle={color:'red'}\">\n        <input type=\"button\" value=\"set background\" ng-click=\"myStyle={'background-color':'blue'}\">\n        <input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\n        <br/>\n        <span ng-style=\"myStyle\">Sample Text</span>\n        <pre>myStyle={{myStyle}}</pre>\n     </file>\n     <file name=\"style.css\">\n       span {\n         color: black;\n       }\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n       var colorSpan = element(by.css('span'));\n\n       it('should check ng-style', function() {\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n         element(by.css('input[value=\\'set color\\']')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\n         element(by.css('input[value=clear]')).click();\n         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\n       });\n     </file>\n   </example>\n */\nvar ngStyleDirective = ngDirective(function(scope, element, attr) {\n  scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\n    if (oldStyles && (newStyles !== oldStyles)) {\n      forEach(oldStyles, function(val, style) { element.css(style, '');});\n    }\n    if (newStyles) element.css(newStyles);\n  }, true);\n});\n\n/**\n * @ngdoc directive\n * @name ngSwitch\n * @restrict EA\n *\n * @description\n * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\n * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\n * as specified in the template.\n *\n * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\n * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\n * matches the value obtained from the evaluated expression. In other words, you define a container element\n * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\n * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\n * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\n * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\n * attribute is displayed.\n *\n * <div class=\"alert alert-info\">\n * Be aware that the attribute values to match against cannot be expressions. They are interpreted\n * as literal string values to match against.\n * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\n * value of the expression `$scope.someVal`.\n * </div>\n\n * @animations\n * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container\n * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM\n *\n * @usage\n *\n * ```\n * <ANY ng-switch=\"expression\">\n *   <ANY ng-switch-when=\"matchValue1\">...</ANY>\n *   <ANY ng-switch-when=\"matchValue2\">...</ANY>\n *   <ANY ng-switch-default>...</ANY>\n * </ANY>\n * ```\n *\n *\n * @scope\n * @priority 800\n * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.\n * On child elements add:\n *\n * * `ngSwitchWhen`: the case statement to match against. If match then this\n *   case will be displayed. If the same match appears multiple times, all the\n *   elements will be displayed.\n * * `ngSwitchDefault`: the default case when no other case match. If there\n *   are multiple default cases, all of them will be displayed when no other\n *   case match.\n *\n *\n * @example\n  <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\n    <file name=\"index.html\">\n      <div ng-controller=\"Ctrl\">\n        <select ng-model=\"selection\" ng-options=\"item for item in items\">\n        </select>\n        <tt>selection={{selection}}</tt>\n        <hr/>\n        <div class=\"animate-switch-container\"\n          ng-switch on=\"selection\">\n            <div class=\"animate-switch\" ng-switch-when=\"settings\">Settings Div</div>\n            <div class=\"animate-switch\" ng-switch-when=\"home\">Home Span</div>\n            <div class=\"animate-switch\" ng-switch-default>default</div>\n        </div>\n      </div>\n    </file>\n    <file name=\"script.js\">\n      function Ctrl($scope) {\n        $scope.items = ['settings', 'home', 'other'];\n        $scope.selection = $scope.items[0];\n      }\n    </file>\n    <file name=\"animations.css\">\n      .animate-switch-container {\n        position:relative;\n        background:white;\n        border:1px solid black;\n        height:40px;\n        overflow:hidden;\n      }\n\n      .animate-switch {\n        padding:10px;\n      }\n\n      .animate-switch.ng-animate {\n        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\n\n        position:absolute;\n        top:0;\n        left:0;\n        right:0;\n        bottom:0;\n      }\n\n      .animate-switch.ng-leave.ng-leave-active,\n      .animate-switch.ng-enter {\n        top:-50px;\n      }\n      .animate-switch.ng-leave,\n      .animate-switch.ng-enter.ng-enter-active {\n        top:0;\n      }\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      var switchElem = element(by.css('[ng-switch]'));\n      var select = element(by.model('selection'));\n\n      it('should start in settings', function() {\n        expect(switchElem.getText()).toMatch(/Settings Div/);\n      });\n      it('should change to home', function() {\n        select.element.all(by.css('option')).get(1).click();\n        expect(switchElem.getText()).toMatch(/Home Span/);\n      });\n      it('should select default', function() {\n        select.element.all(by.css('option')).get(2).click();\n        expect(switchElem.getText()).toMatch(/default/);\n      });\n    </file>\n  </example>\n */\nvar ngSwitchDirective = ['$animate', function($animate) {\n  return {\n    restrict: 'EA',\n    require: 'ngSwitch',\n\n    // asks for $scope to fool the BC controller module\n    controller: ['$scope', function ngSwitchController() {\n     this.cases = {};\n    }],\n    link: function(scope, element, attr, ngSwitchController) {\n      var watchExpr = attr.ngSwitch || attr.on,\n          selectedTranscludes = [],\n          selectedElements = [],\n          previousElements = [],\n          selectedScopes = [];\n\n      scope.$watch(watchExpr, function ngSwitchWatchAction(value) {\n        var i, ii;\n        for (i = 0, ii = previousElements.length; i < ii; ++i) {\n          previousElements[i].remove();\n        }\n        previousElements.length = 0;\n\n        for (i = 0, ii = selectedScopes.length; i < ii; ++i) {\n          var selected = selectedElements[i];\n          selectedScopes[i].$destroy();\n          previousElements[i] = selected;\n          $animate.leave(selected, function() {\n            previousElements.splice(i, 1);\n          });\n        }\n\n        selectedElements.length = 0;\n        selectedScopes.length = 0;\n\n        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\n          scope.$eval(attr.change);\n          forEach(selectedTranscludes, function(selectedTransclude) {\n            var selectedScope = scope.$new();\n            selectedScopes.push(selectedScope);\n            selectedTransclude.transclude(selectedScope, function(caseElement) {\n              var anchor = selectedTransclude.element;\n\n              selectedElements.push(caseElement);\n              $animate.enter(caseElement, anchor.parent(), anchor);\n            });\n          });\n        }\n      });\n    }\n  };\n}];\n\nvar ngSwitchWhenDirective = ngDirective({\n  transclude: 'element',\n  priority: 800,\n  require: '^ngSwitch',\n  link: function(scope, element, attrs, ctrl, $transclude) {\n    ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);\n    ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });\n  }\n});\n\nvar ngSwitchDefaultDirective = ngDirective({\n  transclude: 'element',\n  priority: 800,\n  require: '^ngSwitch',\n  link: function(scope, element, attr, ctrl, $transclude) {\n    ctrl.cases['?'] = (ctrl.cases['?'] || []);\n    ctrl.cases['?'].push({ transclude: $transclude, element: element });\n   }\n});\n\n/**\n * @ngdoc directive\n * @name ngTransclude\n * @restrict AC\n *\n * @description\n * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\n *\n * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.\n *\n * @element ANY\n *\n * @example\n   <example module=\"transclude\">\n     <file name=\"index.html\">\n       <script>\n         function Ctrl($scope) {\n           $scope.title = 'Lorem Ipsum';\n           $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\n         }\n\n         angular.module('transclude', [])\n          .directive('pane', function(){\n             return {\n               restrict: 'E',\n               transclude: true,\n               scope: { title:'@' },\n               template: '<div style=\"border: 1px solid black;\">' +\n                           '<div style=\"background-color: gray\">{{title}}</div>' +\n                           '<div ng-transclude></div>' +\n                         '</div>'\n             };\n         });\n       </script>\n       <div ng-controller=\"Ctrl\">\n         <input ng-model=\"title\"><br>\n         <textarea ng-model=\"text\"></textarea> <br/>\n         <pane title=\"{{title}}\">{{text}}</pane>\n       </div>\n     </file>\n     <file name=\"protractor.js\" type=\"protractor\">\n        it('should have transcluded', function() {\n          var titleElement = element(by.model('title'));\n          titleElement.clear();\n          titleElement.sendKeys('TITLE');\n          var textElement = element(by.model('text'));\n          textElement.clear();\n          textElement.sendKeys('TEXT');\n          expect(element(by.binding('title')).getText()).toEqual('TITLE');\n          expect(element(by.binding('text')).getText()).toEqual('TEXT');\n        });\n     </file>\n   </example>\n *\n */\nvar ngTranscludeDirective = ngDirective({\n  link: function($scope, $element, $attrs, controller, $transclude) {\n    if (!$transclude) {\n      throw minErr('ngTransclude')('orphan',\n       'Illegal use of ngTransclude directive in the template! ' +\n       'No parent directive that requires a transclusion found. ' +\n       'Element: {0}',\n       startingTag($element));\n    }\n\n    $transclude(function(clone) {\n      $element.empty();\n      $element.append(clone);\n    });\n  }\n});\n\n/**\n * @ngdoc directive\n * @name script\n * @restrict E\n *\n * @description\n * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the\n * template can be used by {@link ng.directive:ngInclude `ngInclude`},\n * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the\n * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be\n * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.\n *\n * @param {string} type Must be set to `'text/ng-template'`.\n * @param {string} id Cache name of the template.\n *\n * @example\n  <example>\n    <file name=\"index.html\">\n      <script type=\"text/ng-template\" id=\"/tpl.html\">\n        Content of the template.\n      </script>\n\n      <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\n      <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\n    </file>\n    <file name=\"protractor.js\" type=\"protractor\">\n      it('should load template defined inside script tag', function() {\n        element(by.css('#tpl-link')).click();\n        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\n      });\n    </file>\n  </example>\n */\nvar scriptDirective = ['$templateCache', function($templateCache) {\n  return {\n    restrict: 'E',\n    terminal: true,\n    compile: function(element, attr) {\n      if (attr.type == 'text/ng-template') {\n        var templateUrl = attr.id,\n            // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent\n            text = element[0].text;\n\n        $templateCache.put(templateUrl, text);\n      }\n    }\n  };\n}];\n\nvar ngOptionsMinErr = minErr('ngOptions');\n/**\n * @ngdoc directive\n * @name select\n * @restrict E\n *\n * @description\n * HTML `SELECT` element with angular data-binding.\n *\n * # `ngOptions`\n *\n * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`\n * elements for the `<select>` element using the array or object obtained by evaluating the\n * `ngOptions` comprehension_expression.\n *\n * When an item in the `<select>` menu is selected, the array element or object property\n * represented by the selected option will be bound to the model identified by the `ngModel`\n * directive.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** `ngModel` compares by reference, not value. This is important when binding to an\n * array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).\n * </div>\n *\n * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\n * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\n * option. See example below for demonstration.\n *\n * <div class=\"alert alert-warning\">\n * **Note:** `ngOptions` provides an iterator facility for the `<option>` element which should be used instead\n * of {@link ng.directive:ngRepeat ngRepeat} when you want the\n * `select` model to be bound to a non-string value. This is because an option element can only\n * be bound to string values at present.\n * </div>\n *\n * @param {string} ngModel Assignable angular expression to data-bind to.\n * @param {string=} name Property name of the form under which the control is published.\n * @param {string=} required The control is considered valid only if value is entered.\n * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\n *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\n *    `required` when you want to data-bind to the `required` attribute.\n * @param {comprehension_expression=} ngOptions in one of the following forms:\n *\n *   * for array data sources:\n *     * `label` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`\n *     * `label`  **`group by`** `group` **`for`** `value` **`in`** `array`\n *     * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\n *   * for object data sources:\n *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\n *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\n *     * `select` **`as`** `label` **`group by`** `group`\n *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`\n *\n * Where:\n *\n *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.\n *   * `value`: local variable which will refer to each item in the `array` or each property value\n *      of `object` during iteration.\n *   * `key`: local variable which will refer to a property name in `object` during iteration.\n *   * `label`: The result of this expression will be the label for `<option>` element. The\n *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\n *   * `select`: The result of this expression will be bound to the model of the parent `<select>`\n *      element. If not specified, `select` expression will default to `value`.\n *   * `group`: The result of this expression will be used to group options using the `<optgroup>`\n *      DOM element.\n *   * `trackexpr`: Used when working with an array of objects. The result of this expression will be\n *      used to identify the objects in the array. The `trackexpr` will most likely refer to the\n *     `value` variable (e.g. `value.propertyName`).\n *\n * @example\n    <example>\n      <file name=\"index.html\">\n        <script>\n        function MyCntrl($scope) {\n          $scope.colors = [\n            {name:'black', shade:'dark'},\n            {name:'white', shade:'light'},\n            {name:'red', shade:'dark'},\n            {name:'blue', shade:'dark'},\n            {name:'yellow', shade:'light'}\n          ];\n          $scope.myColor = $scope.colors[2]; // red\n        }\n        </script>\n        <div ng-controller=\"MyCntrl\">\n          <ul>\n            <li ng-repeat=\"color in colors\">\n              Name: <input ng-model=\"color.name\">\n              [<a href ng-click=\"colors.splice($index, 1)\">X</a>]\n            </li>\n            <li>\n              [<a href ng-click=\"colors.push({})\">add</a>]\n            </li>\n          </ul>\n          <hr/>\n          Color (null not allowed):\n          <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\"></select><br>\n\n          Color (null allowed):\n          <span  class=\"nullable\">\n            <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\">\n              <option value=\"\">-- choose color --</option>\n            </select>\n          </span><br/>\n\n          Color grouped by shade:\n          <select ng-model=\"myColor\" ng-options=\"color.name group by color.shade for color in colors\">\n          </select><br/>\n\n\n          Select <a href ng-click=\"myColor = { name:'not in list', shade: 'other' }\">bogus</a>.<br>\n          <hr/>\n          Currently selected: {{ {selected_color:myColor}  }}\n          <div style=\"border:solid 1px black; height:20px\"\n               ng-style=\"{'background-color':myColor.name}\">\n          </div>\n        </div>\n      </file>\n      <file name=\"protractor.js\" type=\"protractor\">\n         it('should check ng-options', function() {\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\n           element.all(by.select('myColor')).first().click();\n           element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\n           element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\n           element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\n           expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\n         });\n      </file>\n    </example>\n */\n\nvar ngOptionsDirective = valueFn({ terminal: true });\n// jshint maxlen: false\nvar selectDirective = ['$compile', '$parse', function($compile,   $parse) {\n                         //000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888\n  var NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/,\n      nullModelCtrl = {$setViewValue: noop};\n// jshint maxlen: 100\n\n  return {\n    restrict: 'E',\n    require: ['select', '?ngModel'],\n    controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {\n      var self = this,\n          optionsMap = {},\n          ngModelCtrl = nullModelCtrl,\n          nullOption,\n          unknownOption;\n\n\n      self.databound = $attrs.ngModel;\n\n\n      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {\n        ngModelCtrl = ngModelCtrl_;\n        nullOption = nullOption_;\n        unknownOption = unknownOption_;\n      };\n\n\n      self.addOption = function(value) {\n        assertNotHasOwnProperty(value, '\"option value\"');\n        optionsMap[value] = true;\n\n        if (ngModelCtrl.$viewValue == value) {\n          $element.val(value);\n          if (unknownOption.parent()) unknownOption.remove();\n        }\n      };\n\n\n      self.removeOption = function(value) {\n        if (this.hasOption(value)) {\n          delete optionsMap[value];\n          if (ngModelCtrl.$viewValue == value) {\n            this.renderUnknownOption(value);\n          }\n        }\n      };\n\n\n      self.renderUnknownOption = function(val) {\n        var unknownVal = '? ' + hashKey(val) + ' ?';\n        unknownOption.val(unknownVal);\n        $element.prepend(unknownOption);\n        $element.val(unknownVal);\n        unknownOption.prop('selected', true); // needed for IE\n      };\n\n\n      self.hasOption = function(value) {\n        return optionsMap.hasOwnProperty(value);\n      };\n\n      $scope.$on('$destroy', function() {\n        // disable unknown option so that we don't do work when the whole select is being destroyed\n        self.renderUnknownOption = noop;\n      });\n    }],\n\n    link: function(scope, element, attr, ctrls) {\n      // if ngModel is not defined, we don't need to do anything\n      if (!ctrls[1]) return;\n\n      var selectCtrl = ctrls[0],\n          ngModelCtrl = ctrls[1],\n          multiple = attr.multiple,\n          optionsExp = attr.ngOptions,\n          nullOption = false, // if false, user will not be able to select it (used by ngOptions)\n          emptyOption,\n          // we can't just jqLite('<option>') since jqLite is not smart enough\n          // to create it in <select> and IE barfs otherwise.\n          optionTemplate = jqLite(document.createElement('option')),\n          optGroupTemplate =jqLite(document.createElement('optgroup')),\n          unknownOption = optionTemplate.clone();\n\n      // find \"null\" option\n      for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {\n        if (children[i].value === '') {\n          emptyOption = nullOption = children.eq(i);\n          break;\n        }\n      }\n\n      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);\n\n      // required validator\n      if (multiple) {\n        ngModelCtrl.$isEmpty = function(value) {\n          return !value || value.length === 0;\n        };\n      }\n\n      if (optionsExp) setupAsOptions(scope, element, ngModelCtrl);\n      else if (multiple) setupAsMultiple(scope, element, ngModelCtrl);\n      else setupAsSingle(scope, element, ngModelCtrl, selectCtrl);\n\n\n      ////////////////////////////\n\n\n\n      function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {\n        ngModelCtrl.$render = function() {\n          var viewValue = ngModelCtrl.$viewValue;\n\n          if (selectCtrl.hasOption(viewValue)) {\n            if (unknownOption.parent()) unknownOption.remove();\n            selectElement.val(viewValue);\n            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy\n          } else {\n            if (isUndefined(viewValue) && emptyOption) {\n              selectElement.val('');\n            } else {\n              selectCtrl.renderUnknownOption(viewValue);\n            }\n          }\n        };\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            if (unknownOption.parent()) unknownOption.remove();\n            ngModelCtrl.$setViewValue(selectElement.val());\n          });\n        });\n      }\n\n      function setupAsMultiple(scope, selectElement, ctrl) {\n        var lastView;\n        ctrl.$render = function() {\n          var items = new HashMap(ctrl.$viewValue);\n          forEach(selectElement.find('option'), function(option) {\n            option.selected = isDefined(items.get(option.value));\n          });\n        };\n\n        // we have to do it on each watch since ngModel watches reference, but\n        // we need to work of an array, so we need to see if anything was inserted/removed\n        scope.$watch(function selectMultipleWatch() {\n          if (!equals(lastView, ctrl.$viewValue)) {\n            lastView = copy(ctrl.$viewValue);\n            ctrl.$render();\n          }\n        });\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            var array = [];\n            forEach(selectElement.find('option'), function(option) {\n              if (option.selected) {\n                array.push(option.value);\n              }\n            });\n            ctrl.$setViewValue(array);\n          });\n        });\n      }\n\n      function setupAsOptions(scope, selectElement, ctrl) {\n        var match;\n\n        if (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) {\n          throw ngOptionsMinErr('iexp',\n            \"Expected expression in form of \" +\n            \"'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\" +\n            \" but got '{0}'. Element: {1}\",\n            optionsExp, startingTag(selectElement));\n        }\n\n        var displayFn = $parse(match[2] || match[1]),\n            valueName = match[4] || match[6],\n            keyName = match[5],\n            groupByFn = $parse(match[3] || ''),\n            valueFn = $parse(match[2] ? match[1] : valueName),\n            valuesFn = $parse(match[7]),\n            track = match[8],\n            trackFn = track ? $parse(match[8]) : null,\n            // This is an array of array of existing option groups in DOM.\n            // We try to reuse these if possible\n            // - optionGroupsCache[0] is the options with no option group\n            // - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element\n            optionGroupsCache = [[{element: selectElement, label:''}]];\n\n        if (nullOption) {\n          // compile the element since there might be bindings in it\n          $compile(nullOption)(scope);\n\n          // remove the class, which is added automatically because we recompile the element and it\n          // becomes the compilation root\n          nullOption.removeClass('ng-scope');\n\n          // we need to remove it before calling selectElement.empty() because otherwise IE will\n          // remove the label from the element. wtf?\n          nullOption.remove();\n        }\n\n        // clear contents, we'll add what's needed based on the model\n        selectElement.empty();\n\n        selectElement.on('change', function() {\n          scope.$apply(function() {\n            var optionGroup,\n                collection = valuesFn(scope) || [],\n                locals = {},\n                key, value, optionElement, index, groupIndex, length, groupLength, trackIndex;\n\n            if (multiple) {\n              value = [];\n              for (groupIndex = 0, groupLength = optionGroupsCache.length;\n                   groupIndex < groupLength;\n                   groupIndex++) {\n                // list of options for that group. (first item has the parent)\n                optionGroup = optionGroupsCache[groupIndex];\n\n                for(index = 1, length = optionGroup.length; index < length; index++) {\n                  if ((optionElement = optionGroup[index].element)[0].selected) {\n                    key = optionElement.val();\n                    if (keyName) locals[keyName] = key;\n                    if (trackFn) {\n                      for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {\n                        locals[valueName] = collection[trackIndex];\n                        if (trackFn(scope, locals) == key) break;\n                      }\n                    } else {\n                      locals[valueName] = collection[key];\n                    }\n                    value.push(valueFn(scope, locals));\n                  }\n                }\n              }\n            } else {\n              key = selectElement.val();\n              if (key == '?') {\n                value = undefined;\n              } else if (key === ''){\n                value = null;\n              } else {\n                if (trackFn) {\n                  for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {\n                    locals[valueName] = collection[trackIndex];\n                    if (trackFn(scope, locals) == key) {\n                      value = valueFn(scope, locals);\n                      break;\n                    }\n                  }\n                } else {\n                  locals[valueName] = collection[key];\n                  if (keyName) locals[keyName] = key;\n                  value = valueFn(scope, locals);\n                }\n              }\n              // Update the null option's selected property here so $render cleans it up correctly\n              if (optionGroupsCache[0].length > 1) {\n                if (optionGroupsCache[0][1].id !== key) {\n                  optionGroupsCache[0][1].selected = false;\n                }\n              }\n            }\n            ctrl.$setViewValue(value);\n          });\n        });\n\n        ctrl.$render = render;\n\n        // TODO(vojta): can't we optimize this ?\n        scope.$watch(render);\n\n        function render() {\n              // Temporary location for the option groups before we render them\n          var optionGroups = {'':[]},\n              optionGroupNames = [''],\n              optionGroupName,\n              optionGroup,\n              option,\n              existingParent, existingOptions, existingOption,\n              modelValue = ctrl.$modelValue,\n              values = valuesFn(scope) || [],\n              keys = keyName ? sortedKeys(values) : values,\n              key,\n              groupLength, length,\n              groupIndex, index,\n              locals = {},\n              selected,\n              selectedSet = false, // nothing is selected yet\n              lastElement,\n              element,\n              label;\n\n          if (multiple) {\n            if (trackFn && isArray(modelValue)) {\n              selectedSet = new HashMap([]);\n              for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {\n                locals[valueName] = modelValue[trackIndex];\n                selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);\n              }\n            } else {\n              selectedSet = new HashMap(modelValue);\n            }\n          }\n\n          // We now build up the list of options we need (we merge later)\n          for (index = 0; length = keys.length, index < length; index++) {\n\n            key = index;\n            if (keyName) {\n              key = keys[index];\n              if ( key.charAt(0) === '$' ) continue;\n              locals[keyName] = key;\n            }\n\n            locals[valueName] = values[key];\n\n            optionGroupName = groupByFn(scope, locals) || '';\n            if (!(optionGroup = optionGroups[optionGroupName])) {\n              optionGroup = optionGroups[optionGroupName] = [];\n              optionGroupNames.push(optionGroupName);\n            }\n            if (multiple) {\n              selected = isDefined(\n                selectedSet.remove(trackFn ? trackFn(scope, locals) : valueFn(scope, locals))\n              );\n            } else {\n              if (trackFn) {\n                var modelCast = {};\n                modelCast[valueName] = modelValue;\n                selected = trackFn(scope, modelCast) === trackFn(scope, locals);\n              } else {\n                selected = modelValue === valueFn(scope, locals);\n              }\n              selectedSet = selectedSet || selected; // see if at least one item is selected\n            }\n            label = displayFn(scope, locals); // what will be seen by the user\n\n            // doing displayFn(scope, locals) || '' overwrites zero values\n            label = isDefined(label) ? label : '';\n            optionGroup.push({\n              // either the index into array or key from object\n              id: trackFn ? trackFn(scope, locals) : (keyName ? keys[index] : index),\n              label: label,\n              selected: selected                   // determine if we should be selected\n            });\n          }\n          if (!multiple) {\n            if (nullOption || modelValue === null) {\n              // insert null option if we have a placeholder, or the model is null\n              optionGroups[''].unshift({id:'', label:'', selected:!selectedSet});\n            } else if (!selectedSet) {\n              // option could not be found, we have to insert the undefined item\n              optionGroups[''].unshift({id:'?', label:'', selected:true});\n            }\n          }\n\n          // Now we need to update the list of DOM nodes to match the optionGroups we computed above\n          for (groupIndex = 0, groupLength = optionGroupNames.length;\n               groupIndex < groupLength;\n               groupIndex++) {\n            // current option group name or '' if no group\n            optionGroupName = optionGroupNames[groupIndex];\n\n            // list of options for that group. (first item has the parent)\n            optionGroup = optionGroups[optionGroupName];\n\n            if (optionGroupsCache.length <= groupIndex) {\n              // we need to grow the optionGroups\n              existingParent = {\n                element: optGroupTemplate.clone().attr('label', optionGroupName),\n                label: optionGroup.label\n              };\n              existingOptions = [existingParent];\n              optionGroupsCache.push(existingOptions);\n              selectElement.append(existingParent.element);\n            } else {\n              existingOptions = optionGroupsCache[groupIndex];\n              existingParent = existingOptions[0];  // either SELECT (no group) or OPTGROUP element\n\n              // update the OPTGROUP label if not the same.\n              if (existingParent.label != optionGroupName) {\n                existingParent.element.attr('label', existingParent.label = optionGroupName);\n              }\n            }\n\n            lastElement = null;  // start at the beginning\n            for(index = 0, length = optionGroup.length; index < length; index++) {\n              option = optionGroup[index];\n              if ((existingOption = existingOptions[index+1])) {\n                // reuse elements\n                lastElement = existingOption.element;\n                if (existingOption.label !== option.label) {\n                  lastElement.text(existingOption.label = option.label);\n                }\n                if (existingOption.id !== option.id) {\n                  lastElement.val(existingOption.id = option.id);\n                }\n                // lastElement.prop('selected') provided by jQuery has side-effects\n                if (existingOption.selected !== option.selected) {\n                  lastElement.prop('selected', (existingOption.selected = option.selected));\n                }\n              } else {\n                // grow elements\n\n                // if it's a null option\n                if (option.id === '' && nullOption) {\n                  // put back the pre-compiled element\n                  element = nullOption;\n                } else {\n                  // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but\n                  // in this version of jQuery on some browser the .text() returns a string\n                  // rather then the element.\n                  (element = optionTemplate.clone())\n                      .val(option.id)\n                      .attr('selected', option.selected)\n                      .text(option.label);\n                }\n\n                existingOptions.push(existingOption = {\n                    element: element,\n                    label: option.label,\n                    id: option.id,\n                    selected: option.selected\n                });\n                if (lastElement) {\n                  lastElement.after(element);\n                } else {\n                  existingParent.element.append(element);\n                }\n                lastElement = element;\n              }\n            }\n            // remove any excessive OPTIONs in a group\n            index++; // increment since the existingOptions[0] is parent element not OPTION\n            while(existingOptions.length > index) {\n              existingOptions.pop().element.remove();\n            }\n          }\n          // remove any excessive OPTGROUPs from select\n          while(optionGroupsCache.length > groupIndex) {\n            optionGroupsCache.pop()[0].element.remove();\n          }\n        }\n      }\n    }\n  };\n}];\n\nvar optionDirective = ['$interpolate', function($interpolate) {\n  var nullSelectCtrl = {\n    addOption: noop,\n    removeOption: noop\n  };\n\n  return {\n    restrict: 'E',\n    priority: 100,\n    compile: function(element, attr) {\n      if (isUndefined(attr.value)) {\n        var interpolateFn = $interpolate(element.text(), true);\n        if (!interpolateFn) {\n          attr.$set('value', element.text());\n        }\n      }\n\n      return function (scope, element, attr) {\n        var selectCtrlName = '$selectController',\n            parent = element.parent(),\n            selectCtrl = parent.data(selectCtrlName) ||\n              parent.parent().data(selectCtrlName); // in case we are in optgroup\n\n        if (selectCtrl && selectCtrl.databound) {\n          // For some reason Opera defaults to true and if not overridden this messes up the repeater.\n          // We don't want the view to drive the initialization of the model anyway.\n          element.prop('selected', false);\n        } else {\n          selectCtrl = nullSelectCtrl;\n        }\n\n        if (interpolateFn) {\n          scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {\n            attr.$set('value', newVal);\n            if (oldVal !== newVal) {\n              selectCtrl.removeOption(oldVal);\n            }\n            selectCtrl.addOption(newVal);\n          });\n        } else {\n          selectCtrl.addOption(attr.value);\n        }\n\n        element.on('$destroy', function() {\n          selectCtrl.removeOption(attr.value);\n        });\n      };\n    }\n  };\n}];\n\nvar styleDirective = valueFn({\n  restrict: 'E',\n  terminal: false\n});\n\n  if (window.angular.bootstrap) {\n    //AngularJS is already loaded, so we can return here...\n    console.log('WARNING: Tried to load angular more than once.');\n    return;\n  }\n\n  //try to bind to jquery now so that one can write angular.element().read()\n  //but we will rebind on bootstrap again.\n  bindJQuery();\n\n  publishExternalAPI(angular);\n\n  jqLite(document).ready(function() {\n    angularInit(document, bootstrap);\n  });\n\n})(window, document);\n\n!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\\\:form{display:block;}</style>');"
  },
  {
    "path": "works/js/lib/angular-animate.js",
    "content": "/**\n * @license AngularJS v1.3.0-beta.14\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/* jshint maxlen: false */\n\n/**\n * @ngdoc module\n * @name ngAnimate\n * @description\n *\n * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives.\n *\n * <div doc-module-components=\"ngAnimate\"></div>\n *\n * # Usage\n *\n * To see animations in action, all that is required is to define the appropriate CSS classes\n * or to register a JavaScript animation via the myModule.animation() function. The directives that support animation automatically are:\n * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation\n * by using the `$animate` service.\n *\n * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives:\n *\n * | Directive                                                                                                 | Supported Animations                                                     |\n * |-----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|\n * | {@link ng.directive:ngRepeat#usage_animations ngRepeat}                                                   | enter, leave and move                                                    |\n * | {@link ngRoute.directive:ngView#usage_animations ngView}                                                  | enter and leave                                                          |\n * | {@link ng.directive:ngInclude#usage_animations ngInclude}                                                 | enter and leave                                                          |\n * | {@link ng.directive:ngSwitch#usage_animations ngSwitch}                                                   | enter and leave                                                          |\n * | {@link ng.directive:ngIf#usage_animations ngIf}                                                           | enter and leave                                                          |\n * | {@link ng.directive:ngClass#usage_animations ngClass}                                                     | add and remove (the CSS class(es) present)                               |\n * | {@link ng.directive:ngShow#usage_animations ngShow} & {@link ng.directive:ngHide#usage_animations ngHide} | add and remove (the ng-hide class value)                                 |\n * | {@link ng.directive:form#usage_animations form} & {@link ng.directive:ngModel#usage_animations ngModel}   | add and remove (dirty, pristine, valid, invalid & all other validations) |\n * | {@link ngMessages.directive:ngMessage#usage_animations ngMessages}                                        | add and remove (ng-active & ng-inactive)                                 |\n * | {@link ngMessages.directive:ngMessage#usage_animations ngMessage}                                         | enter and leave                                                          |\n *\n * You can find out more information about animations upon visiting each directive page.\n *\n * Below is an example of how to apply animations to a directive that supports animation hooks:\n *\n * ```html\n * <style type=\"text/css\">\n * .slide.ng-enter, .slide.ng-leave {\n *   -webkit-transition:0.5s linear all;\n *   transition:0.5s linear all;\n * }\n *\n * .slide.ng-enter { }        /&#42; starting animations for enter &#42;/\n * .slide.ng-enter-active { } /&#42; terminal animations for enter &#42;/\n * .slide.ng-leave { }        /&#42; starting animations for leave &#42;/\n * .slide.ng-leave-active { } /&#42; terminal animations for leave &#42;/\n * </style>\n *\n * <!--\n * the animate service will automatically add .ng-enter and .ng-leave to the element\n * to trigger the CSS transition/animations\n * -->\n * <ANY class=\"slide\" ng-include=\"...\"></ANY>\n * ```\n *\n * Keep in mind that if an animation is running, any child elements cannot be animated until the parent element's\n * animation has completed.\n *\n * <h2>CSS-defined Animations</h2>\n * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes\n * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported\n * and can be used to play along with this naming structure.\n *\n * The following code below demonstrates how to perform animations using **CSS transitions** with Angular:\n *\n * ```html\n * <style type=\"text/css\">\n * /&#42;\n *  The animate class is apart of the element and the ng-enter class\n *  is attached to the element once the enter animation event is triggered\n * &#42;/\n * .reveal-animation.ng-enter {\n *  -webkit-transition: 1s linear all; /&#42; Safari/Chrome &#42;/\n *  transition: 1s linear all; /&#42; All other modern browsers and IE10+ &#42;/\n *\n *  /&#42; The animation preparation code &#42;/\n *  opacity: 0;\n * }\n *\n * /&#42;\n *  Keep in mind that you want to combine both CSS\n *  classes together to avoid any CSS-specificity\n *  conflicts\n * &#42;/\n * .reveal-animation.ng-enter.ng-enter-active {\n *  /&#42; The animation code itself &#42;/\n *  opacity: 1;\n * }\n * </style>\n *\n * <div class=\"view-container\">\n *   <div ng-view class=\"reveal-animation\"></div>\n * </div>\n * ```\n *\n * The following code below demonstrates how to perform animations using **CSS animations** with Angular:\n *\n * ```html\n * <style type=\"text/css\">\n * .reveal-animation.ng-enter {\n *   -webkit-animation: enter_sequence 1s linear; /&#42; Safari/Chrome &#42;/\n *   animation: enter_sequence 1s linear; /&#42; IE10+ and Future Browsers &#42;/\n * }\n * @-webkit-keyframes enter_sequence {\n *   from { opacity:0; }\n *   to { opacity:1; }\n * }\n * @keyframes enter_sequence {\n *   from { opacity:0; }\n *   to { opacity:1; }\n * }\n * </style>\n *\n * <div class=\"view-container\">\n *   <div ng-view class=\"reveal-animation\"></div>\n * </div>\n * ```\n *\n * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing.\n *\n * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add\n * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically\n * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be\n * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end\n * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element\n * has no CSS transition/animation classes applied to it.\n *\n * ### Structural transition animations\n *\n * Structural transitions (such as enter, leave and move) will always apply a `0s none` transition\n * value to force the browser into rendering the styles defined in the setup (.ng-enter, .ng-leave\n * or .ng-move) class. This means that any active transition animations operating on the element\n * will be cut off to make way for the enter, leave or move animation.\n *\n * ### Class-based transition animations\n *\n * Class-based transitions refer to transition animations that are triggered when a CSS class is\n * added to or removed from the element (via `$animate.addClass`, `$animate.removeClass`,\n * `$animate.setClass`, or by directives such as `ngClass`, `ngModel` and `form`).\n * They are different when compared to structural animations since they **do not cancel existing\n * animations** nor do they **block successive transitions** from rendering on the same element.\n * This distinction allows for **multiple class-based transitions** to be performed on the same element.\n *\n * In addition to ngAnimate supporting the default (natural) functionality of class-based transition\n * animations, ngAnimate also decorates the element with starting and ending CSS classes to aid the\n * developer in further styling the element throughout the transition animation. Earlier versions\n * of ngAnimate may have caused natural CSS transitions to break and not render properly due to\n * $animate temporarily blocking transitions using `0s none` in order to allow the setup CSS class\n * (the `-add` or `-remove` class) to be applied without triggering an animation. However, as of\n * **version 1.3**, this workaround has been removed with ngAnimate and all non-ngAnimate CSS\n * class transitions are compatible with ngAnimate.\n *\n * There is, however, one special case when dealing with class-based transitions in ngAnimate.\n * When rendering class-based transitions that make use of the setup and active CSS classes\n * (e.g. `.fade-add` and `.fade-add-active` for when `.fade` is added) be sure to define\n * the transition value **on the active CSS class** and not the setup class.\n *\n * ```css\n * .fade-add {\n *   /&#42; remember to place a 0s transition here\n *      to ensure that the styles are applied instantly\n *      even if the element already has a transition style &#42;/\n *   transition:0s linear all;\n *\n *   /&#42; starting CSS styles &#42;/\n *   opacity:1;\n * }\n * .fade-add.fade-add-active {\n *   /&#42; this will be the length of the animation &#42;/\n *   transition:1s linear all;\n *   opacity:0;\n * }\n * ```\n *\n * The setup CSS class (in this case `.fade-add`) also has a transition style property, however, it\n * has a duration of zero. This may not be required, however, incase the browser is unable to render\n * the styling present in this CSS class instantly then it could be that the browser is attempting\n * to perform an unnecessary transition.\n *\n * This workaround, however, does not apply to  standard class-based transitions that are rendered\n * when a CSS class containing a transition is applied to an element:\n *\n * ```css\n * .fade {\n *   /&#42; this works as expected &#42;/\n *   transition:1s linear all;\n *   opacity:0;\n * }\n * ```\n *\n * Please keep this in mind when coding the CSS markup that will be used within class-based transitions.\n * Also, try not to mix the two class-based animation flavors together since the CSS code may become\n * overly complex.\n *\n * ### CSS Staggering Animations\n * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a\n * curtain-like effect. The ngAnimate module, as of 1.2.0, supports staggering animations and the stagger effect can be\n * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for\n * the animation. The style property expected within the stagger class can either be a **transition-delay** or an\n * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).\n *\n * ```css\n * .my-animation.ng-enter {\n *   /&#42; standard transition code &#42;/\n *   -webkit-transition: 1s linear all;\n *   transition: 1s linear all;\n *   opacity:0;\n * }\n * .my-animation.ng-enter-stagger {\n *   /&#42; this will have a 100ms delay between each successive leave animation &#42;/\n *   -webkit-transition-delay: 0.1s;\n *   transition-delay: 0.1s;\n *\n *   /&#42; in case the stagger doesn't work then these two values\n *    must be set to 0 to avoid an accidental CSS inheritance &#42;/\n *   -webkit-transition-duration: 0s;\n *   transition-duration: 0s;\n * }\n * .my-animation.ng-enter.ng-enter-active {\n *   /&#42; standard transition styles &#42;/\n *   opacity:1;\n * }\n * ```\n *\n * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations\n * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this\n * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation\n * will also be reset if more than 10ms has passed after the last animation has been fired.\n *\n * The following code will issue the **ng-leave-stagger** event on the element provided:\n *\n * ```js\n * var kids = parent.children();\n *\n * $animate.leave(kids[0]); //stagger index=0\n * $animate.leave(kids[1]); //stagger index=1\n * $animate.leave(kids[2]); //stagger index=2\n * $animate.leave(kids[3]); //stagger index=3\n * $animate.leave(kids[4]); //stagger index=4\n *\n * $timeout(function() {\n *   //stagger has reset itself\n *   $animate.leave(kids[5]); //stagger index=0\n *   $animate.leave(kids[6]); //stagger index=1\n * }, 100, false);\n * ```\n *\n * Stagger animations are currently only supported within CSS-defined animations.\n *\n * <h2>JavaScript-defined Animations</h2>\n * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not\n * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module.\n *\n * ```js\n * //!annotate=\"YourApp\" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application.\n * var ngModule = angular.module('YourApp', ['ngAnimate']);\n * ngModule.animation('.my-crazy-animation', function() {\n *   return {\n *     enter: function(element, done) {\n *       //run the animation here and call done when the animation is complete\n *       return function(cancelled) {\n *         //this (optional) function will be called when the animation\n *         //completes or when the animation is cancelled (the cancelled\n *         //flag will be set to true if cancelled).\n *       };\n *     },\n *     leave: function(element, done) { },\n *     move: function(element, done) { },\n *\n *     //animation that can be triggered before the class is added\n *     beforeAddClass: function(element, className, done) { },\n *\n *     //animation that can be triggered after the class is added\n *     addClass: function(element, className, done) { },\n *\n *     //animation that can be triggered before the class is removed\n *     beforeRemoveClass: function(element, className, done) { },\n *\n *     //animation that can be triggered after the class is removed\n *     removeClass: function(element, className, done) { }\n *   };\n * });\n * ```\n *\n * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run\n * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits\n * the element's CSS class attribute value and then run the matching animation event function (if found).\n * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will\n * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported).\n *\n * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned.\n * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run,\n * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation\n * or transition code that is defined via a stylesheet).\n *\n */\n\nangular.module('ngAnimate', ['ng'])\n\n  /**\n   * @ngdoc provider\n   * @name $animateProvider\n   * @description\n   *\n   * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module.\n   * When an animation is triggered, the $animate service will query the $animate service to find any animations that match\n   * the provided name value.\n   *\n   * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\n   *\n   * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\n   *\n   */\n\n  //this private service is only used within CSS-enabled animations\n  //IE8 + IE9 do not support rAF natively, but that is fine since they\n  //also don't support transitions and keyframes which means that the code\n  //below will never be used by the two browsers.\n  .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) {\n    var bod = $document[0].body;\n    return function(fn) {\n      //the returned function acts as the cancellation function\n      return $$rAF(function() {\n        //the line below will force the browser to perform a repaint\n        //so that all the animated elements within the animation frame\n        //will be properly updated and drawn on screen. This is\n        //required to perform multi-class CSS based animations with\n        //Firefox. DO NOT REMOVE THIS LINE.\n        var a = bod.offsetWidth + 1;\n        fn();\n      });\n    };\n  }])\n\n  .config(['$provide', '$animateProvider', function($provide, $animateProvider) {\n    var noop = angular.noop;\n    var forEach = angular.forEach;\n    var selectors = $animateProvider.$$selectors;\n\n    var ELEMENT_NODE = 1;\n    var NG_ANIMATE_STATE = '$$ngAnimateState';\n    var NG_ANIMATE_CLASS_NAME = 'ng-animate';\n    var rootAnimateState = {running: true};\n\n    function extractElementNode(element) {\n      for(var i = 0; i < element.length; i++) {\n        var elm = element[i];\n        if(elm.nodeType == ELEMENT_NODE) {\n          return elm;\n        }\n      }\n    }\n\n    function prepareElement(element) {\n      return element && angular.element(element);\n    }\n\n    function stripCommentsFromElement(element) {\n      return angular.element(extractElementNode(element));\n    }\n\n    function isMatchingElement(elm1, elm2) {\n      return extractElementNode(elm1) == extractElementNode(elm2);\n    }\n\n    $provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document',\n                            function($delegate,   $injector,   $sniffer,   $rootElement,   $$asyncCallback,    $rootScope,   $document) {\n\n      var globalAnimationCounter = 0;\n      $rootElement.data(NG_ANIMATE_STATE, rootAnimateState);\n\n      // disable animations during bootstrap, but once we bootstrapped, wait again\n      // for another digest until enabling animations. The reason why we digest twice\n      // is because all structural animations (enter, leave and move) all perform a\n      // post digest operation before animating. If we only wait for a single digest\n      // to pass then the structural animation would render its animation on page load.\n      // (which is what we're trying to avoid when the application first boots up.)\n      $rootScope.$$postDigest(function() {\n        $rootScope.$$postDigest(function() {\n          rootAnimateState.running = false;\n        });\n      });\n\n      var classNameFilter = $animateProvider.classNameFilter();\n      var isAnimatableClassName = !classNameFilter\n              ? function() { return true; }\n              : function(className) {\n                return classNameFilter.test(className);\n              };\n\n      function lookup(name) {\n        if (name) {\n          var matches = [],\n              flagMap = {},\n              classes = name.substr(1).split('.');\n\n          //the empty string value is the default animation\n          //operation which performs CSS transition and keyframe\n          //animations sniffing. This is always included for each\n          //element animation procedure if the browser supports\n          //transitions and/or keyframe animations. The default\n          //animation is added to the top of the list to prevent\n          //any previous animations from affecting the element styling\n          //prior to the element being animated.\n          if ($sniffer.transitions || $sniffer.animations) {\n            matches.push($injector.get(selectors['']));\n          }\n\n          for(var i=0; i < classes.length; i++) {\n            var klass = classes[i],\n                selectorFactoryName = selectors[klass];\n            if(selectorFactoryName && !flagMap[klass]) {\n              matches.push($injector.get(selectorFactoryName));\n              flagMap[klass] = true;\n            }\n          }\n          return matches;\n        }\n      }\n\n      function animationRunner(element, animationEvent, className) {\n        //transcluded directives may sometimes fire an animation using only comment nodes\n        //best to catch this early on to prevent any animation operations from occurring\n        var node = element[0];\n        if(!node) {\n          return;\n        }\n\n        var isSetClassOperation = animationEvent == 'setClass';\n        var isClassBased = isSetClassOperation ||\n                           animationEvent == 'addClass' ||\n                           animationEvent == 'removeClass';\n\n        var classNameAdd, classNameRemove;\n        if(angular.isArray(className)) {\n          classNameAdd = className[0];\n          classNameRemove = className[1];\n          className = classNameAdd + ' ' + classNameRemove;\n        }\n\n        var currentClassName = element.attr('class');\n        var classes = currentClassName + ' ' + className;\n        if(!isAnimatableClassName(classes)) {\n          return;\n        }\n\n        var beforeComplete = noop,\n            beforeCancel = [],\n            before = [],\n            afterComplete = noop,\n            afterCancel = [],\n            after = [];\n\n        var animationLookup = (' ' + classes).replace(/\\s+/g,'.');\n        forEach(lookup(animationLookup), function(animationFactory) {\n          var created = registerAnimation(animationFactory, animationEvent);\n          if(!created && isSetClassOperation) {\n            registerAnimation(animationFactory, 'addClass');\n            registerAnimation(animationFactory, 'removeClass');\n          }\n        });\n\n        function registerAnimation(animationFactory, event) {\n          var afterFn = animationFactory[event];\n          var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)];\n          if(afterFn || beforeFn) {\n            if(event == 'leave') {\n              beforeFn = afterFn;\n              //when set as null then animation knows to skip this phase\n              afterFn = null;\n            }\n            after.push({\n              event : event, fn : afterFn\n            });\n            before.push({\n              event : event, fn : beforeFn\n            });\n            return true;\n          }\n        }\n\n        function run(fns, cancellations, allCompleteFn) {\n          var animations = [];\n          forEach(fns, function(animation) {\n            animation.fn && animations.push(animation);\n          });\n\n          var count = 0;\n          function afterAnimationComplete(index) {\n            if(cancellations) {\n              (cancellations[index] || noop)();\n              if(++count < animations.length) return;\n              cancellations = null;\n            }\n            allCompleteFn();\n          }\n\n          //The code below adds directly to the array in order to work with\n          //both sync and async animations. Sync animations are when the done()\n          //operation is called right away. DO NOT REFACTOR!\n          forEach(animations, function(animation, index) {\n            var progress = function() {\n              afterAnimationComplete(index);\n            };\n            switch(animation.event) {\n              case 'setClass':\n                cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress));\n                break;\n              case 'addClass':\n                cancellations.push(animation.fn(element, classNameAdd || className,     progress));\n                break;\n              case 'removeClass':\n                cancellations.push(animation.fn(element, classNameRemove || className,  progress));\n                break;\n              default:\n                cancellations.push(animation.fn(element, progress));\n                break;\n            }\n          });\n\n          if(cancellations && cancellations.length === 0) {\n            allCompleteFn();\n          }\n        }\n\n        return {\n          node : node,\n          event : animationEvent,\n          className : className,\n          isClassBased : isClassBased,\n          isSetClassOperation : isSetClassOperation,\n          before : function(allCompleteFn) {\n            beforeComplete = allCompleteFn;\n            run(before, beforeCancel, function() {\n              beforeComplete = noop;\n              allCompleteFn();\n            });\n          },\n          after : function(allCompleteFn) {\n            afterComplete = allCompleteFn;\n            run(after, afterCancel, function() {\n              afterComplete = noop;\n              allCompleteFn();\n            });\n          },\n          cancel : function() {\n            if(beforeCancel) {\n              forEach(beforeCancel, function(cancelFn) {\n                (cancelFn || noop)(true);\n              });\n              beforeComplete(true);\n            }\n            if(afterCancel) {\n              forEach(afterCancel, function(cancelFn) {\n                (cancelFn || noop)(true);\n              });\n              afterComplete(true);\n            }\n          }\n        };\n      }\n\n      /**\n       * @ngdoc service\n       * @name $animate\n       * @kind function\n       *\n       * @description\n       * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations.\n       * When any of these operations are run, the $animate service\n       * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object)\n       * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run.\n       *\n       * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives\n       * will work out of the box without any extra configuration.\n       *\n       * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\n       *\n       * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\n       *\n       */\n      return {\n        /**\n         * @ngdoc method\n         * @name $animate#enter\n         * @kind function\n         *\n         * @description\n         * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once\n         * the animation is started, the following CSS classes will be present on the element for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during enter animation:\n         *\n         * | Animation Step                                                                                                    | What the element class attribute looks like              |\n         * |-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|\n         * | 1. $animate.enter(...) is called                                                                                  | class=\"my-animation\"                                     |\n         * | 2. element is inserted into the parentElement element or beside the afterElement element                          | class=\"my-animation\"                                     |\n         * | 3. $animate waits for the next digest to start the animation                                                      | class=\"my-animation ng-animate\"                          |\n         * | 4. $animate runs the JavaScript-defined animations detected on the element                                        | class=\"my-animation ng-animate\"                          |\n         * | 5. the .ng-enter class is added to the element                                                                    | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                       | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 7. $animate blocks all CSS transitions on the element to ensure the .ng-enter class styling is applied right away | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 8. $animate waits for a single animation frame (this performs a reflow)                                           | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 9. $animate removes the CSS transition block placed on the element                                                | class=\"my-animation ng-animate ng-enter\"                 |\n         * | 10. the .ng-enter-active class is added (this triggers the CSS transition/animation)                              | class=\"my-animation ng-animate ng-enter ng-enter-active\" |\n         * | 11. $animate waits for the animation to complete (via events and timeout)                                         | class=\"my-animation ng-animate ng-enter ng-enter-active\" |\n         * | 12. The animation ends and all generated CSS classes are removed from the element                                 | class=\"my-animation\"                                     |\n         * | 13. The doneCallback() callback is fired (if provided)                                                            | class=\"my-animation\"                                     |\n         *\n         * @param {DOMElement} element the element that will be the focus of the enter animation\n         * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation\n         * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        enter : function(element, parentElement, afterElement, doneCallback) {\n          element = angular.element(element);\n          parentElement = prepareElement(parentElement);\n          afterElement = prepareElement(afterElement);\n\n          this.enabled(false, element);\n          $delegate.enter(element, parentElement, afterElement);\n          $rootScope.$$postDigest(function() {\n            element = stripCommentsFromElement(element);\n            performAnimation('enter', 'ng-enter', element, parentElement, afterElement, noop, doneCallback);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#leave\n         * @kind function\n         *\n         * @description\n         * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once\n         * the animation is started, the following CSS classes will be added for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during leave animation:\n         *\n         * | Animation Step                                                                                                    | What the element class attribute looks like              |\n         * |-------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------|\n         * | 1. $animate.leave(...) is called                                                                                  | class=\"my-animation\"                                     |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                                        | class=\"my-animation ng-animate\"                          |\n         * | 3. $animate waits for the next digest to start the animation                                                      | class=\"my-animation ng-animate\"                          |\n         * | 4. the .ng-leave class is added to the element                                                                    | class=\"my-animation ng-animate ng-leave\"                 |\n         * | 5. $animate scans the element styles to get the CSS transition/animation duration and delay                       | class=\"my-animation ng-animate ng-leave\"                 |\n         * | 6. $animate blocks all CSS transitions on the element to ensure the .ng-leave class styling is applied right away | class=\"my-animation ng-animate ng-leave”                 |\n         * | 7. $animate waits for a single animation frame (this performs a reflow)                                           | class=\"my-animation ng-animate ng-leave\"                 |\n         * | 8. $animate removes the CSS transition block placed on the element                                                | class=\"my-animation ng-animate ng-leave”                 |\n         * | 9. the .ng-leave-active class is added (this triggers the CSS transition/animation)                               | class=\"my-animation ng-animate ng-leave ng-leave-active\" |\n         * | 10. $animate waits for the animation to complete (via events and timeout)                                         | class=\"my-animation ng-animate ng-leave ng-leave-active\" |\n         * | 11. The animation ends and all generated CSS classes are removed from the element                                 | class=\"my-animation\"                                     |\n         * | 12. The element is removed from the DOM                                                                           | ...                                                      |\n         * | 13. The doneCallback() callback is fired (if provided)                                                            | ...                                                      |\n         *\n         * @param {DOMElement} element the element that will be the focus of the leave animation\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        leave : function(element, doneCallback) {\n          element = angular.element(element);\n          cancelChildAnimations(element);\n          this.enabled(false, element);\n          $rootScope.$$postDigest(function() {\n            performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() {\n              $delegate.leave(element);\n            }, doneCallback);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#move\n         * @kind function\n         *\n         * @description\n         * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or\n         * add the element directly after the afterElement element if present. Then the move animation will be run. Once\n         * the animation is started, the following CSS classes will be added for the duration of the animation:\n         *\n         * Below is a breakdown of each step that occurs during move animation:\n         *\n         * | Animation Step                                                                                                   | What the element class attribute looks like            |\n         * |------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------|\n         * | 1. $animate.move(...) is called                                                                                  | class=\"my-animation\"                                   |\n         * | 2. element is moved into the parentElement element or beside the afterElement element                            | class=\"my-animation\"                                   |\n         * | 3. $animate waits for the next digest to start the animation                                                     | class=\"my-animation ng-animate\"                        |\n         * | 4. $animate runs the JavaScript-defined animations detected on the element                                       | class=\"my-animation ng-animate\"                        |\n         * | 5. the .ng-move class is added to the element                                                                    | class=\"my-animation ng-animate ng-move\"                |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                      | class=\"my-animation ng-animate ng-move\"                |\n         * | 7. $animate blocks all CSS transitions on the element to ensure the .ng-move class styling is applied right away | class=\"my-animation ng-animate ng-move”                |\n         * | 8. $animate waits for a single animation frame (this performs a reflow)                                          | class=\"my-animation ng-animate ng-move\"                |\n         * | 9. $animate removes the CSS transition block placed on the element                                               | class=\"my-animation ng-animate ng-move”                |\n         * | 10. the .ng-move-active class is added (this triggers the CSS transition/animation)                              | class=\"my-animation ng-animate ng-move ng-move-active\" |\n         * | 11. $animate waits for the animation to complete (via events and timeout)                                        | class=\"my-animation ng-animate ng-move ng-move-active\" |\n         * | 12. The animation ends and all generated CSS classes are removed from the element                                | class=\"my-animation\"                                   |\n         * | 13. The doneCallback() callback is fired (if provided)                                                           | class=\"my-animation\"                                   |\n         *\n         * @param {DOMElement} element the element that will be the focus of the move animation\n         * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation\n         * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        move : function(element, parentElement, afterElement, doneCallback) {\n          element = angular.element(element);\n          parentElement = prepareElement(parentElement);\n          afterElement = prepareElement(afterElement);\n\n          cancelChildAnimations(element);\n          this.enabled(false, element);\n          $delegate.move(element, parentElement, afterElement);\n          $rootScope.$$postDigest(function() {\n            element = stripCommentsFromElement(element);\n            performAnimation('move', 'ng-move', element, parentElement, afterElement, noop, doneCallback);\n          });\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#addClass\n         *\n         * @description\n         * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class.\n         * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide\n         * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions\n         * or keyframes are defined on the -add-active or base CSS class).\n         *\n         * Below is a breakdown of each step that occurs during addClass animation:\n         *\n         * | Animation Step                                                                                     | What the element class attribute looks like                      |\n         * |----------------------------------------------------------------------------------------------------|------------------------------------------------------------------|\n         * | 1. $animate.addClass(element, 'super') is called                                                   | class=\"my-animation\"                                             |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                         | class=\"my-animation ng-animate\"                                  |\n         * | 3. the .super-add class is added to the element                                                    | class=\"my-animation ng-animate super-add\"                        |\n         * | 4. $animate waits for a single animation frame (this performs a reflow)                            | class=\"my-animation ng-animate super-add\"                        |\n         * | 5. the .super and .super-add-active classes are added (this triggers the CSS transition/animation) | class=\"my-animation ng-animate super super-add super-add-active\" |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay        | class=\"my-animation ng-animate super-add\"                        |\n         * | 7. $animate waits for the animation to complete (via events and timeout)                           | class=\"my-animation super super-add super-add-active\"            |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                   | class=\"my-animation super\"                                       |\n         * | 9. The super class is kept on the element                                                          | class=\"my-animation super\"                                       |\n         * | 10. The doneCallback() callback is fired (if provided)                                             | class=\"my-animation super\"                                       |\n         *\n         * @param {DOMElement} element the element that will be animated\n         * @param {string} className the CSS class that will be added to the element and then animated\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        addClass : function(element, className, doneCallback) {\n          element = angular.element(element);\n          element = stripCommentsFromElement(element);\n          performAnimation('addClass', className, element, null, null, function() {\n            $delegate.addClass(element, className);\n          }, doneCallback);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#removeClass\n         *\n         * @description\n         * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value\n         * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in\n         * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if\n         * no CSS transitions or keyframes are defined on the -remove or base CSS classes).\n         *\n         * Below is a breakdown of each step that occurs during removeClass animation:\n         *\n         * | Animation Step                                                                                                   | What the element class attribute looks like                      |\n         * |------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------|\n         * | 1. $animate.removeClass(element, 'super') is called                                                              | class=\"my-animation super\"                                       |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                                       | class=\"my-animation super ng-animate\"                            |\n         * | 3. the .super-remove class is added to the element                                                               | class=\"my-animation super ng-animate super-remove\"               |\n         * | 4. $animate waits for a single animation frame (this performs a reflow)                                          | class=\"my-animation super ng-animate super-remove\"               |\n         * | 5. the .super-remove-active classes are added and .super is removed (this triggers the CSS transition/animation) | class=\"my-animation ng-animate super-remove super-remove-active\" |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                      | class=\"my-animation super ng-animate super-remove\"               |\n         * | 7. $animate waits for the animation to complete (via events and timeout)                                         | class=\"my-animation ng-animate super-remove super-remove-active\" |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                                 | class=\"my-animation\"                                             |\n         * | 9. The doneCallback() callback is fired (if provided)                                                            | class=\"my-animation\"                                             |\n         *\n         *\n         * @param {DOMElement} element the element that will be animated\n         * @param {string} className the CSS class that will be animated and then removed from the element\n         * @param {function()=} doneCallback the callback function that will be called once the animation is complete\n        */\n        removeClass : function(element, className, doneCallback) {\n          element = angular.element(element);\n          element = stripCommentsFromElement(element);\n          performAnimation('removeClass', className, element, null, null, function() {\n            $delegate.removeClass(element, className);\n          }, doneCallback);\n        },\n\n        /**\n         *\n         * @ngdoc method\n         * @name $animate#setClass\n         *\n         * @description Adds and/or removes the given CSS classes to and from the element.\n         * Once complete, the done() callback will be fired (if provided).\n         *\n         * | Animation Step                                                                                                                       | What the element class attribute looks like                                          |\n         * |--------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|\n         * | 1. $animate.removeClass(element, ‘on’, ‘off’) is called                                                                              | class=\"my-animation super off”                                                       |\n         * | 2. $animate runs the JavaScript-defined animations detected on the element                                                           | class=\"my-animation super ng-animate off”                                            |\n         * | 3. the .on-add and .off-remove classes are added to the element                                                                      | class=\"my-animation ng-animate on-add off-remove off”                                |\n         * | 4. $animate waits for a single animation frame (this performs a reflow)                                                              | class=\"my-animation ng-animate on-add off-remove off”                                |\n         * | 5. the .on, .on-add-active and .off-remove-active classes are added and .off is removed (this triggers the CSS transition/animation) | class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active” |\n         * | 6. $animate scans the element styles to get the CSS transition/animation duration and delay                                          | class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active\" |\n         * | 7. $animate waits for the animation to complete (via events and timeout)                                                             | class=\"my-animation ng-animate on on-add on-add-active off-remove off-remove-active\" |\n         * | 8. The animation ends and all generated CSS classes are removed from the element                                                     | class=\"my-animation\"                                                                 |\n         * | 9. The doneCallback() callback is fired (if provided)                                                                                | class=\"my-animation\"                                                                 |\n         *\n         * @param {DOMElement} element the element which will have its CSS classes changed\n         *   removed from it\n         * @param {string} add the CSS classes which will be added to the element\n         * @param {string} remove the CSS class which will be removed from the element\n         * @param {Function=} done the callback function (if provided) that will be fired after the\n         *   CSS classes have been set on the element\n         */\n        setClass : function(element, add, remove, doneCallback) {\n          element = angular.element(element);\n          element = stripCommentsFromElement(element);\n          performAnimation('setClass', [add, remove], element, null, null, function() {\n            $delegate.setClass(element, add, remove);\n          }, doneCallback);\n        },\n\n        /**\n         * @ngdoc method\n         * @name $animate#enabled\n         * @kind function\n         *\n         * @param {boolean=} value If provided then set the animation on or off.\n         * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation\n         * @return {boolean} Current animation state.\n         *\n         * @description\n         * Globally enables/disables animations.\n         *\n        */\n        enabled : function(value, element) {\n          switch(arguments.length) {\n            case 2:\n              if(value) {\n                cleanup(element);\n              } else {\n                var data = element.data(NG_ANIMATE_STATE) || {};\n                data.disabled = true;\n                element.data(NG_ANIMATE_STATE, data);\n              }\n            break;\n\n            case 1:\n              rootAnimateState.disabled = !value;\n            break;\n\n            default:\n              value = !rootAnimateState.disabled;\n            break;\n          }\n          return !!value;\n         }\n      };\n\n      /*\n        all animations call this shared animation triggering function internally.\n        The animationEvent variable refers to the JavaScript animation event that will be triggered\n        and the className value is the name of the animation that will be applied within the\n        CSS code. Element, parentElement and afterElement are provided DOM elements for the animation\n        and the onComplete callback will be fired once the animation is fully complete.\n      */\n      function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, doneCallback) {\n\n        var runner = animationRunner(element, animationEvent, className);\n        if(!runner) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          closeAnimation();\n          return;\n        }\n\n        className = runner.className;\n        var elementEvents = angular.element._data(runner.node);\n        elementEvents = elementEvents && elementEvents.events;\n\n        if (!parentElement) {\n          parentElement = afterElement ? afterElement.parent() : element.parent();\n        }\n\n        var ngAnimateState  = element.data(NG_ANIMATE_STATE) || {};\n        var runningAnimations     = ngAnimateState.active || {};\n        var totalActiveAnimations = ngAnimateState.totalActive || 0;\n        var lastAnimation         = ngAnimateState.last;\n\n        //only allow animations if the currently running animation is not structural\n        //or if there is no animation running at all\n        var skipAnimations = runner.isClassBased\n                ? ngAnimateState.disabled || (lastAnimation && !lastAnimation.isClassBased)\n                : false;\n\n        //skip the animation if animations are disabled, a parent is already being animated,\n        //the element is not currently attached to the document body or then completely close\n        //the animation if any matching animations are not found at all.\n        //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found.\n        if (skipAnimations || animationsDisabled(element, parentElement)) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          closeAnimation();\n          return;\n        }\n\n        var skipAnimation = false;\n        if(totalActiveAnimations > 0) {\n          var animationsToCancel = [];\n          if(!runner.isClassBased) {\n            if(animationEvent == 'leave' && runningAnimations['ng-leave']) {\n              skipAnimation = true;\n            } else {\n              //cancel all animations when a structural animation takes place\n              for(var klass in runningAnimations) {\n                animationsToCancel.push(runningAnimations[klass]);\n                cleanup(element, klass);\n              }\n              runningAnimations = {};\n              totalActiveAnimations = 0;\n            }\n          } else if(lastAnimation.event == 'setClass') {\n            animationsToCancel.push(lastAnimation);\n            cleanup(element, className);\n          }\n          else if(runningAnimations[className]) {\n            var current = runningAnimations[className];\n            if(current.event == animationEvent) {\n              skipAnimation = true;\n            } else {\n              animationsToCancel.push(current);\n              cleanup(element, className);\n            }\n          }\n\n          if(animationsToCancel.length > 0) {\n            forEach(animationsToCancel, function(operation) {\n              operation.cancel();\n            });\n          }\n        }\n\n        if(runner.isClassBased && !runner.isSetClassOperation && !skipAnimation) {\n          skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR\n        }\n\n        if(skipAnimation) {\n          fireDOMOperation();\n          fireBeforeCallbackAsync();\n          fireAfterCallbackAsync();\n          fireDoneCallbackAsync();\n          return;\n        }\n\n        if(animationEvent == 'leave') {\n          //there's no need to ever remove the listener since the element\n          //will be removed (destroyed) after the leave animation ends or\n          //is cancelled midway\n          element.one('$destroy', function(e) {\n            var element = angular.element(this);\n            var state = element.data(NG_ANIMATE_STATE);\n            if(state) {\n              var activeLeaveAnimation = state.active['ng-leave'];\n              if(activeLeaveAnimation) {\n                activeLeaveAnimation.cancel();\n                cleanup(element, 'ng-leave');\n              }\n            }\n          });\n        }\n\n        //the ng-animate class does nothing, but it's here to allow for\n        //parent animations to find and cancel child animations when needed\n        element.addClass(NG_ANIMATE_CLASS_NAME);\n\n        var localAnimationCount = globalAnimationCounter++;\n        totalActiveAnimations++;\n        runningAnimations[className] = runner;\n\n        element.data(NG_ANIMATE_STATE, {\n          last : runner,\n          active : runningAnimations,\n          index : localAnimationCount,\n          totalActive : totalActiveAnimations\n        });\n\n        //first we run the before animations and when all of those are complete\n        //then we perform the DOM operation and run the next set of animations\n        fireBeforeCallbackAsync();\n        runner.before(function(cancelled) {\n          var data = element.data(NG_ANIMATE_STATE);\n          cancelled = cancelled ||\n                        !data || !data.active[className] ||\n                        (runner.isClassBased && data.active[className].event != animationEvent);\n\n          fireDOMOperation();\n          if(cancelled === true) {\n            closeAnimation();\n          } else {\n            fireAfterCallbackAsync();\n            runner.after(closeAnimation);\n          }\n        });\n\n        function fireDOMCallback(animationPhase) {\n          var eventName = '$animate:' + animationPhase;\n          if(elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) {\n            $$asyncCallback(function() {\n              element.triggerHandler(eventName, {\n                event : animationEvent,\n                className : className\n              });\n            });\n          }\n        }\n\n        function fireBeforeCallbackAsync() {\n          fireDOMCallback('before');\n        }\n\n        function fireAfterCallbackAsync() {\n          fireDOMCallback('after');\n        }\n\n        function fireDoneCallbackAsync() {\n          fireDOMCallback('close');\n          if(doneCallback) {\n            $$asyncCallback(function() {\n              doneCallback();\n            });\n          }\n        }\n\n        //it is less complicated to use a flag than managing and canceling\n        //timeouts containing multiple callbacks.\n        function fireDOMOperation() {\n          if(!fireDOMOperation.hasBeenRun) {\n            fireDOMOperation.hasBeenRun = true;\n            domOperation();\n          }\n        }\n\n        function closeAnimation() {\n          if(!closeAnimation.hasBeenRun) {\n            closeAnimation.hasBeenRun = true;\n            var data = element.data(NG_ANIMATE_STATE);\n            if(data) {\n              /* only structural animations wait for reflow before removing an\n                 animation, but class-based animations don't. An example of this\n                 failing would be when a parent HTML tag has a ng-class attribute\n                 causing ALL directives below to skip animations during the digest */\n              if(runner && runner.isClassBased) {\n                cleanup(element, className);\n              } else {\n                $$asyncCallback(function() {\n                  var data = element.data(NG_ANIMATE_STATE) || {};\n                  if(localAnimationCount == data.index) {\n                    cleanup(element, className, animationEvent);\n                  }\n                });\n                element.data(NG_ANIMATE_STATE, data);\n              }\n            }\n            fireDoneCallbackAsync();\n          }\n        }\n      }\n\n      function cancelChildAnimations(element) {\n        var node = extractElementNode(element);\n        if (node) {\n          var nodes = angular.isFunction(node.getElementsByClassName) ?\n            node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) :\n            node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME);\n          forEach(nodes, function(element) {\n            element = angular.element(element);\n            var data = element.data(NG_ANIMATE_STATE);\n            if(data && data.active) {\n              forEach(data.active, function(runner) {\n                runner.cancel();\n              });\n            }\n          });\n        }\n      }\n\n      function cleanup(element, className) {\n        if(isMatchingElement(element, $rootElement)) {\n          if(!rootAnimateState.disabled) {\n            rootAnimateState.running = false;\n            rootAnimateState.structural = false;\n          }\n        } else if(className) {\n          var data = element.data(NG_ANIMATE_STATE) || {};\n\n          var removeAnimations = className === true;\n          if(!removeAnimations && data.active && data.active[className]) {\n            data.totalActive--;\n            delete data.active[className];\n          }\n\n          if(removeAnimations || !data.totalActive) {\n            element.removeClass(NG_ANIMATE_CLASS_NAME);\n            element.removeData(NG_ANIMATE_STATE);\n          }\n        }\n      }\n\n      function animationsDisabled(element, parentElement) {\n        if (rootAnimateState.disabled) return true;\n\n        if(isMatchingElement(element, $rootElement)) {\n          return rootAnimateState.disabled || rootAnimateState.running;\n        }\n\n        do {\n          //the element did not reach the root element which means that it\n          //is not apart of the DOM. Therefore there is no reason to do\n          //any animations on it\n          if(parentElement.length === 0) break;\n\n          var isRoot = isMatchingElement(parentElement, $rootElement);\n          var state = isRoot ? rootAnimateState : (parentElement.data(NG_ANIMATE_STATE) || {});\n          var result = state.disabled || state.running\n                  ? true\n                  : state.last && !state.last.isClassBased;\n\n          if(isRoot || result) {\n            return result;\n          }\n\n          if(isRoot) return true;\n        }\n        while(parentElement = parentElement.parent());\n\n        return true;\n      }\n    }]);\n\n    $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow',\n                           function($window,   $sniffer,   $timeout,   $$animateReflow) {\n      // Detect proper transitionend/animationend event names.\n      var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;\n\n      // If unprefixed events are not supported but webkit-prefixed are, use the latter.\n      // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.\n      // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`\n      // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.\n      // Register both events in case `window.onanimationend` is not supported because of that,\n      // do the same for `transitionend` as Safari is likely to exhibit similar behavior.\n      // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit\n      // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition\n      if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {\n        CSS_PREFIX = '-webkit-';\n        TRANSITION_PROP = 'WebkitTransition';\n        TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';\n      } else {\n        TRANSITION_PROP = 'transition';\n        TRANSITIONEND_EVENT = 'transitionend';\n      }\n\n      if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {\n        CSS_PREFIX = '-webkit-';\n        ANIMATION_PROP = 'WebkitAnimation';\n        ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';\n      } else {\n        ANIMATION_PROP = 'animation';\n        ANIMATIONEND_EVENT = 'animationend';\n      }\n\n      var DURATION_KEY = 'Duration';\n      var PROPERTY_KEY = 'Property';\n      var DELAY_KEY = 'Delay';\n      var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';\n      var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey';\n      var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data';\n      var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\n      var CLOSING_TIME_BUFFER = 1.5;\n      var ONE_SECOND = 1000;\n\n      var lookupCache = {};\n      var parentCounter = 0;\n      var animationReflowQueue = [];\n      var cancelAnimationReflow;\n      function afterReflow(element, callback) {\n        if(cancelAnimationReflow) {\n          cancelAnimationReflow();\n        }\n        animationReflowQueue.push(callback);\n        cancelAnimationReflow = $$animateReflow(function() {\n          forEach(animationReflowQueue, function(fn) {\n            fn();\n          });\n\n          animationReflowQueue = [];\n          cancelAnimationReflow = null;\n          lookupCache = {};\n        });\n      }\n\n      var closingTimer = null;\n      var closingTimestamp = 0;\n      var animationElementQueue = [];\n      function animationCloseHandler(element, totalTime) {\n        var node = extractElementNode(element);\n        element = angular.element(node);\n\n        //this item will be garbage collected by the closing\n        //animation timeout\n        animationElementQueue.push(element);\n\n        //but it may not need to cancel out the existing timeout\n        //if the timestamp is less than the previous one\n        var futureTimestamp = Date.now() + totalTime;\n        if(futureTimestamp <= closingTimestamp) {\n          return;\n        }\n\n        $timeout.cancel(closingTimer);\n\n        closingTimestamp = futureTimestamp;\n        closingTimer = $timeout(function() {\n          closeAllAnimations(animationElementQueue);\n          animationElementQueue = [];\n        }, totalTime, false);\n      }\n\n      function closeAllAnimations(elements) {\n        forEach(elements, function(element) {\n          var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\n          if(elementData) {\n            (elementData.closeAnimationFn || noop)();\n          }\n        });\n      }\n\n      function getElementAnimationDetails(element, cacheKey) {\n        var data = cacheKey ? lookupCache[cacheKey] : null;\n        if(!data) {\n          var transitionDuration = 0;\n          var transitionDelay = 0;\n          var animationDuration = 0;\n          var animationDelay = 0;\n          var transitionDelayStyle;\n          var animationDelayStyle;\n          var transitionDurationStyle;\n          var transitionPropertyStyle;\n\n          //we want all the styles defined before and after\n          forEach(element, function(element) {\n            if (element.nodeType == ELEMENT_NODE) {\n              var elementStyles = $window.getComputedStyle(element) || {};\n\n              transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY];\n\n              transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration);\n\n              transitionPropertyStyle = elementStyles[TRANSITION_PROP + PROPERTY_KEY];\n\n              transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY];\n\n              transitionDelay  = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay);\n\n              animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY];\n\n              animationDelay   = Math.max(parseMaxTime(animationDelayStyle), animationDelay);\n\n              var aDuration  = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]);\n\n              if(aDuration > 0) {\n                aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1;\n              }\n\n              animationDuration = Math.max(aDuration, animationDuration);\n            }\n          });\n          data = {\n            total : 0,\n            transitionPropertyStyle: transitionPropertyStyle,\n            transitionDurationStyle: transitionDurationStyle,\n            transitionDelayStyle: transitionDelayStyle,\n            transitionDelay: transitionDelay,\n            transitionDuration: transitionDuration,\n            animationDelayStyle: animationDelayStyle,\n            animationDelay: animationDelay,\n            animationDuration: animationDuration\n          };\n          if(cacheKey) {\n            lookupCache[cacheKey] = data;\n          }\n        }\n        return data;\n      }\n\n      function parseMaxTime(str) {\n        var maxValue = 0;\n        var values = angular.isString(str) ?\n          str.split(/\\s*,\\s*/) :\n          [];\n        forEach(values, function(value) {\n          maxValue = Math.max(parseFloat(value) || 0, maxValue);\n        });\n        return maxValue;\n      }\n\n      function getCacheKey(element) {\n        var parentElement = element.parent();\n        var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY);\n        if(!parentID) {\n          parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter);\n          parentID = parentCounter;\n        }\n        return parentID + '-' + extractElementNode(element).getAttribute('class');\n      }\n\n      function animateSetup(animationEvent, element, className) {\n        var structural = ['ng-enter','ng-leave','ng-move'].indexOf(className) >= 0;\n\n        var cacheKey = getCacheKey(element);\n        var eventCacheKey = cacheKey + ' ' + className;\n        var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0;\n\n        var stagger = {};\n        if(itemIndex > 0) {\n          var staggerClassName = className + '-stagger';\n          var staggerCacheKey = cacheKey + ' ' + staggerClassName;\n          var applyClasses = !lookupCache[staggerCacheKey];\n\n          applyClasses && element.addClass(staggerClassName);\n\n          stagger = getElementAnimationDetails(element, staggerCacheKey);\n\n          applyClasses && element.removeClass(staggerClassName);\n        }\n\n        element.addClass(className);\n\n        var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {};\n        var timings = getElementAnimationDetails(element, eventCacheKey);\n        var transitionDuration = timings.transitionDuration;\n        var animationDuration = timings.animationDuration;\n\n        if(structural && transitionDuration === 0 && animationDuration === 0) {\n          element.removeClass(className);\n          return false;\n        }\n\n        var blockTransition = structural && transitionDuration > 0;\n        var blockAnimation = animationDuration > 0 &&\n                             stagger.animationDelay > 0 &&\n                             stagger.animationDuration === 0;\n\n        element.data(NG_ANIMATE_CSS_DATA_KEY, {\n          stagger : stagger,\n          cacheKey : eventCacheKey,\n          running : formerData.running || 0,\n          itemIndex : itemIndex,\n          blockTransition : blockTransition,\n          blockAnimation : blockAnimation,\n          closeAnimationFn : noop\n        });\n\n        var node = extractElementNode(element);\n\n        if(blockTransition) {\n          node.style[TRANSITION_PROP + PROPERTY_KEY] = 'none';\n        }\n\n        if(blockAnimation) {\n          node.style[ANIMATION_PROP] = 'none 0s';\n        }\n\n        return true;\n      }\n\n      function animateRun(animationEvent, element, className, activeAnimationComplete) {\n        var node = extractElementNode(element);\n        var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\n        if(node.getAttribute('class').indexOf(className) == -1 || !elementData) {\n          activeAnimationComplete();\n          return;\n        }\n\n        if(elementData.blockTransition) {\n          node.style[TRANSITION_PROP + PROPERTY_KEY] = '';\n        }\n\n        if(elementData.blockAnimation) {\n          node.style[ANIMATION_PROP] = '';\n        }\n\n        var activeClassName = '';\n        forEach(className.split(' '), function(klass, i) {\n          activeClassName += (i > 0 ? ' ' : '') + klass + '-active';\n        });\n\n        element.addClass(activeClassName);\n        var eventCacheKey = elementData.cacheKey + ' ' + activeClassName;\n        var timings = getElementAnimationDetails(element, eventCacheKey);\n\n        var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration);\n        if(maxDuration === 0) {\n          element.removeClass(activeClassName);\n          animateClose(element, className);\n          activeAnimationComplete();\n          return;\n        }\n\n        var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay);\n        var stagger = elementData.stagger;\n        var itemIndex = elementData.itemIndex;\n        var maxDelayTime = maxDelay * ONE_SECOND;\n\n        var style = '', appliedStyles = [];\n        if(timings.transitionDuration > 0) {\n          var propertyStyle = timings.transitionPropertyStyle;\n          if(propertyStyle.indexOf('all') == -1) {\n            style += CSS_PREFIX + 'transition-property: ' + propertyStyle + ';';\n            style += CSS_PREFIX + 'transition-duration: ' + timings.transitionDurationStyle + ';';\n            appliedStyles.push(CSS_PREFIX + 'transition-property');\n            appliedStyles.push(CSS_PREFIX + 'transition-duration');\n          }\n        }\n\n        if(itemIndex > 0) {\n          if(stagger.transitionDelay > 0 && stagger.transitionDuration === 0) {\n            var delayStyle = timings.transitionDelayStyle;\n            style += CSS_PREFIX + 'transition-delay: ' +\n                     prepareStaggerDelay(delayStyle, stagger.transitionDelay, itemIndex) + '; ';\n            appliedStyles.push(CSS_PREFIX + 'transition-delay');\n          }\n\n          if(stagger.animationDelay > 0 && stagger.animationDuration === 0) {\n            style += CSS_PREFIX + 'animation-delay: ' +\n                     prepareStaggerDelay(timings.animationDelayStyle, stagger.animationDelay, itemIndex) + '; ';\n            appliedStyles.push(CSS_PREFIX + 'animation-delay');\n          }\n        }\n\n        if(appliedStyles.length > 0) {\n          //the element being animated may sometimes contain comment nodes in\n          //the jqLite object, so we're safe to use a single variable to house\n          //the styles since there is always only one element being animated\n          var oldStyle = node.getAttribute('style') || '';\n          node.setAttribute('style', oldStyle + '; ' + style);\n        }\n\n        var startTime = Date.now();\n        var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT;\n\n        element.on(css3AnimationEvents, onAnimationProgress);\n        elementData.closeAnimationFn = function() {\n          onEnd();\n          activeAnimationComplete();\n        };\n\n        var staggerTime       = itemIndex * (Math.max(stagger.animationDelay, stagger.transitionDelay) || 0);\n        var animationTime     = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER;\n        var totalTime         = (staggerTime + animationTime) * ONE_SECOND;\n\n        elementData.running++;\n        animationCloseHandler(element, totalTime);\n        return onEnd;\n\n        // This will automatically be called by $animate so\n        // there is no need to attach this internally to the\n        // timeout done method.\n        function onEnd(cancelled) {\n          element.off(css3AnimationEvents, onAnimationProgress);\n          element.removeClass(activeClassName);\n          animateClose(element, className);\n          var node = extractElementNode(element);\n          for (var i in appliedStyles) {\n            node.style.removeProperty(appliedStyles[i]);\n          }\n        }\n\n        function onAnimationProgress(event) {\n          event.stopPropagation();\n          var ev = event.originalEvent || event;\n          var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now();\n\n          /* Firefox (or possibly just Gecko) likes to not round values up\n           * when a ms measurement is used for the animation */\n          var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));\n\n          /* $manualTimeStamp is a mocked timeStamp value which is set\n           * within browserTrigger(). This is only here so that tests can\n           * mock animations properly. Real events fallback to event.timeStamp,\n           * or, if they don't, then a timeStamp is automatically created for them.\n           * We're checking to see if the timeStamp surpasses the expected delay,\n           * but we're using elapsedTime instead of the timeStamp on the 2nd\n           * pre-condition since animations sometimes close off early */\n          if(Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\n            activeAnimationComplete();\n          }\n        }\n      }\n\n      function prepareStaggerDelay(delayStyle, staggerDelay, index) {\n        var style = '';\n        forEach(delayStyle.split(','), function(val, i) {\n          style += (i > 0 ? ',' : '') +\n                   (index * staggerDelay + parseInt(val, 10)) + 's';\n        });\n        return style;\n      }\n\n      function animateBefore(animationEvent, element, className, calculationDecorator) {\n        if(animateSetup(animationEvent, element, className, calculationDecorator)) {\n          return function(cancelled) {\n            cancelled && animateClose(element, className);\n          };\n        }\n      }\n\n      function animateAfter(animationEvent, element, className, afterAnimationComplete) {\n        if(element.data(NG_ANIMATE_CSS_DATA_KEY)) {\n          return animateRun(animationEvent, element, className, afterAnimationComplete);\n        } else {\n          animateClose(element, className);\n          afterAnimationComplete();\n        }\n      }\n\n      function animate(animationEvent, element, className, animationComplete) {\n        //If the animateSetup function doesn't bother returning a\n        //cancellation function then it means that there is no animation\n        //to perform at all\n        var preReflowCancellation = animateBefore(animationEvent, element, className);\n        if(!preReflowCancellation) {\n          animationComplete();\n          return;\n        }\n\n        //There are two cancellation functions: one is before the first\n        //reflow animation and the second is during the active state\n        //animation. The first function will take care of removing the\n        //data from the element which will not make the 2nd animation\n        //happen in the first place\n        var cancel = preReflowCancellation;\n        afterReflow(element, function() {\n          //once the reflow is complete then we point cancel to\n          //the new cancellation function which will remove all of the\n          //animation properties from the active animation\n          cancel = animateAfter(animationEvent, element, className, animationComplete);\n        });\n\n        return function(cancelled) {\n          (cancel || noop)(cancelled);\n        };\n      }\n\n      function animateClose(element, className) {\n        element.removeClass(className);\n        var data = element.data(NG_ANIMATE_CSS_DATA_KEY);\n        if(data) {\n          if(data.running) {\n            data.running--;\n          }\n          if(!data.running || data.running === 0) {\n            element.removeData(NG_ANIMATE_CSS_DATA_KEY);\n          }\n        }\n      }\n\n      return {\n        enter : function(element, animationCompleted) {\n          return animate('enter', element, 'ng-enter', animationCompleted);\n        },\n\n        leave : function(element, animationCompleted) {\n          return animate('leave', element, 'ng-leave', animationCompleted);\n        },\n\n        move : function(element, animationCompleted) {\n          return animate('move', element, 'ng-move', animationCompleted);\n        },\n\n        beforeSetClass : function(element, add, remove, animationCompleted) {\n          var className = suffixClasses(remove, '-remove') + ' ' +\n                          suffixClasses(add, '-add');\n          var cancellationMethod = animateBefore('setClass', element, className);\n          if(cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          animationCompleted();\n        },\n\n        beforeAddClass : function(element, className, animationCompleted) {\n          var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'));\n          if(cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          animationCompleted();\n        },\n\n        beforeRemoveClass : function(element, className, animationCompleted) {\n          var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'));\n          if(cancellationMethod) {\n            afterReflow(element, animationCompleted);\n            return cancellationMethod;\n          }\n          animationCompleted();\n        },\n\n        setClass : function(element, add, remove, animationCompleted) {\n          remove = suffixClasses(remove, '-remove');\n          add = suffixClasses(add, '-add');\n          var className = remove + ' ' + add;\n          return animateAfter('setClass', element, className, animationCompleted);\n        },\n\n        addClass : function(element, className, animationCompleted) {\n          return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted);\n        },\n\n        removeClass : function(element, className, animationCompleted) {\n          return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted);\n        }\n      };\n\n      function suffixClasses(classes, suffix) {\n        var className = '';\n        classes = angular.isArray(classes) ? classes : classes.split(/\\s+/);\n        forEach(classes, function(klass, i) {\n          if(klass && klass.length > 0) {\n            className += (i > 0 ? ' ' : '') + klass + suffix;\n          }\n        });\n        return className;\n      }\n    }]);\n  }]);\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "works/js/lib/angular-route.js",
    "content": "/**\n * @license AngularJS v1.3.0-beta.14\n * (c) 2010-2014 Google, Inc. http://angularjs.org\n * License: MIT\n */\n(function(window, angular, undefined) {'use strict';\n\n/**\n * @ngdoc module\n * @name ngRoute\n * @description\n *\n * # ngRoute\n *\n * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.\n *\n * ## Example\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\n *\n *\n * <div doc-module-components=\"ngRoute\"></div>\n */\n /* global -ngRouteModule */\nvar ngRouteModule = angular.module('ngRoute', ['ng']).\n                        provider('$route', $RouteProvider);\n\n/**\n * @ngdoc provider\n * @name $routeProvider\n * @kind function\n *\n * @description\n *\n * Used for configuring routes.\n *\n * ## Example\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\n *\n * ## Dependencies\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n */\nfunction $RouteProvider(){\n  function inherit(parent, extra) {\n    return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra);\n  }\n\n  var routes = {};\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#when\n   *\n   * @param {string} path Route path (matched against `$location.path`). If `$location.path`\n   *    contains redundant trailing slash or is missing one, the route will still match and the\n   *    `$location.path` will be updated to add or drop the trailing slash to exactly match the\n   *    route definition.\n   *\n   *    * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up\n   *        to the next slash are matched and stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain named groups starting with a colon and ending with a star:\n   *        e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`\n   *        when the route matches.\n   *    * `path` can contain optional named groups with a question mark: e.g.`:name?`.\n   *\n   *    For example, routes like `/color/:color/largecode/:largecode*\\/edit` will match\n   *    `/color/brown/largecode/code/with/slashes/edit` and extract:\n   *\n   *    * `color: brown`\n   *    * `largecode: code/with/slashes`.\n   *\n   *\n   * @param {Object} route Mapping information to be assigned to `$route.current` on route\n   *    match.\n   *\n   *    Object properties:\n   *\n   *    - `controller` – `{(string|function()=}` – Controller fn that should be associated with\n   *      newly created scope or the name of a {@link angular.Module#controller registered\n   *      controller} if passed as a string.\n   *    - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be\n   *      published to scope under the `controllerAs` name.\n   *    - `template` – `{string=|function()=}` – html template as a string or a function that\n   *      returns an html template as a string which should be used by {@link\n   *      ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.\n   *      This property takes precedence over `templateUrl`.\n   *\n   *      If `template` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *    - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html\n   *      template that should be used by {@link ngRoute.directive:ngView ngView}.\n   *\n   *      If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *      - `{Array.<Object>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route\n   *\n   *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\n   *      be injected into the controller. If any of these dependencies are promises, the router\n   *      will wait for them all to be resolved or one to be rejected before the controller is\n   *      instantiated.\n   *      If all the promises are resolved successfully, the values of the resolved promises are\n   *      injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is\n   *      fired. If any of the promises are rejected the\n   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object\n   *      is:\n   *\n   *      - `key` – `{string}`: a name of a dependency to be injected into the controller.\n   *      - `factory` - `{string|function}`: If `string` then it is an alias for a service.\n   *        Otherwise if function, then it is {@link auto.$injector#invoke injected}\n   *        and the return value is treated as the dependency. If the result is a promise, it is\n   *        resolved before its value is injected into the controller. Be aware that\n   *        `ngRoute.$routeParams` will still refer to the previous route within these resolve\n   *        functions.  Use `$route.current.params` to access the new route parameters, instead.\n   *\n   *    - `redirectTo` – {(string|function())=} – value to update\n   *      {@link ng.$location $location} path with and trigger route redirection.\n   *\n   *      If `redirectTo` is a function, it will be called with the following parameters:\n   *\n   *      - `{Object.<string>}` - route parameters extracted from the current\n   *        `$location.path()` by applying the current route templateUrl.\n   *      - `{string}` - current `$location.path()`\n   *      - `{Object}` - current `$location.search()`\n   *\n   *      The custom `redirectTo` function is expected to return a string which will be used\n   *      to update `$location.path()` and `$location.search()`.\n   *\n   *    - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`\n   *      or `$location.hash()` changes.\n   *\n   *      If the option is set to `false` and url in the browser changes, then\n   *      `$routeUpdate` event is broadcasted on the root scope.\n   *\n   *    - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive\n   *\n   *      If the option is set to `true`, then the particular route can be matched without being\n   *      case sensitive\n   *\n   * @returns {Object} self\n   *\n   * @description\n   * Adds a new route definition to the `$route` service.\n   */\n  this.when = function(path, route) {\n    routes[path] = angular.extend(\n      {reloadOnSearch: true},\n      route,\n      path && pathRegExp(path, route)\n    );\n\n    // create redirection for trailing slashes\n    if (path) {\n      var redirectPath = (path[path.length-1] == '/')\n            ? path.substr(0, path.length-1)\n            : path +'/';\n\n      routes[redirectPath] = angular.extend(\n        {redirectTo: path},\n        pathRegExp(redirectPath, route)\n      );\n    }\n\n    return this;\n  };\n\n   /**\n    * @param path {string} path\n    * @param opts {Object} options\n    * @return {?Object}\n    *\n    * @description\n    * Normalizes the given path, returning a regular expression\n    * and the original path.\n    *\n    * Inspired by pathRexp in visionmedia/express/lib/utils.js.\n    */\n  function pathRegExp(path, opts) {\n    var insensitive = opts.caseInsensitiveMatch,\n        ret = {\n          originalPath: path,\n          regexp: path\n        },\n        keys = ret.keys = [];\n\n    path = path\n      .replace(/([().])/g, '\\\\$1')\n      .replace(/(\\/)?:(\\w+)([\\?\\*])?/g, function(_, slash, key, option){\n        var optional = option === '?' ? option : null;\n        var star = option === '*' ? option : null;\n        keys.push({ name: key, optional: !!optional });\n        slash = slash || '';\n        return ''\n          + (optional ? '' : slash)\n          + '(?:'\n          + (optional ? slash : '')\n          + (star && '(.+?)' || '([^/]+)')\n          + (optional || '')\n          + ')'\n          + (optional || '');\n      })\n      .replace(/([\\/$\\*])/g, '\\\\$1');\n\n    ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');\n    return ret;\n  }\n\n  /**\n   * @ngdoc method\n   * @name $routeProvider#otherwise\n   *\n   * @description\n   * Sets route definition that will be used on route change when no other route definition\n   * is matched.\n   *\n   * @param {Object} params Mapping information to be assigned to `$route.current`.\n   * @returns {Object} self\n   */\n  this.otherwise = function(params) {\n    this.when(null, params);\n    return this;\n  };\n\n\n  this.$get = ['$rootScope',\n               '$location',\n               '$routeParams',\n               '$q',\n               '$injector',\n               '$http',\n               '$templateCache',\n               '$sce',\n      function($rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {\n\n    /**\n     * @ngdoc service\n     * @name $route\n     * @requires $location\n     * @requires $routeParams\n     *\n     * @property {Object} current Reference to the current route definition.\n     * The route definition contains:\n     *\n     *   - `controller`: The controller constructor as define in route definition.\n     *   - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\n     *     controller instantiation. The `locals` contain\n     *     the resolved values of the `resolve` map. Additionally the `locals` also contain:\n     *\n     *     - `$scope` - The current route scope.\n     *     - `$template` - The current route template HTML.\n     *\n     * @property {Object} routes Object with all route configuration Objects as its properties.\n     *\n     * @description\n     * `$route` is used for deep-linking URLs to controllers and views (HTML partials).\n     * It watches `$location.url()` and tries to map the path to an existing route definition.\n     *\n     * Requires the {@link ngRoute `ngRoute`} module to be installed.\n     *\n     * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.\n     *\n     * The `$route` service is typically used in conjunction with the\n     * {@link ngRoute.directive:ngView `ngView`} directive and the\n     * {@link ngRoute.$routeParams `$routeParams`} service.\n     *\n     * @example\n     * This example shows how changing the URL hash causes the `$route` to match a route against the\n     * URL, and the `ngView` pulls in the partial.\n     *\n     * Note that this example is using {@link ng.directive:script inlined templates}\n     * to get it working on jsfiddle as well.\n     *\n     * <example name=\"$route-service\" module=\"ngRouteExample\"\n     *          deps=\"angular-route.js\" fixBase=\"true\">\n     *   <file name=\"index.html\">\n     *     <div ng-controller=\"MainController\">\n     *       Choose:\n     *       <a href=\"Book/Moby\">Moby</a> |\n     *       <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n     *       <a href=\"Book/Gatsby\">Gatsby</a> |\n     *       <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n     *       <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n     *\n     *       <div ng-view></div>\n     *\n     *       <hr />\n     *\n     *       <pre>$location.path() = {{$location.path()}}</pre>\n     *       <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\n     *       <pre>$route.current.params = {{$route.current.params}}</pre>\n     *       <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\n     *       <pre>$routeParams = {{$routeParams}}</pre>\n     *     </div>\n     *   </file>\n     *\n     *   <file name=\"book.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *   </file>\n     *\n     *   <file name=\"chapter.html\">\n     *     controller: {{name}}<br />\n     *     Book Id: {{params.bookId}}<br />\n     *     Chapter Id: {{params.chapterId}}\n     *   </file>\n     *\n     *   <file name=\"script.js\">\n     *     angular.module('ngRouteExample', ['ngRoute'])\n     *\n     *      .controller('MainController', function($scope, $route, $routeParams, $location) {\n     *          $scope.$route = $route;\n     *          $scope.$location = $location;\n     *          $scope.$routeParams = $routeParams;\n     *      })\n     *\n     *      .controller('BookController', function($scope, $routeParams) {\n     *          $scope.name = \"BookController\";\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *      .controller('ChapterController', function($scope, $routeParams) {\n     *          $scope.name = \"ChapterController\";\n     *          $scope.params = $routeParams;\n     *      })\n     *\n     *     .config(function($routeProvider, $locationProvider) {\n     *       $routeProvider\n     *        .when('/Book/:bookId', {\n     *         templateUrl: 'book.html',\n     *         controller: 'BookController',\n     *         resolve: {\n     *           // I will cause a 1 second delay\n     *           delay: function($q, $timeout) {\n     *             var delay = $q.defer();\n     *             $timeout(delay.resolve, 1000);\n     *             return delay.promise;\n     *           }\n     *         }\n     *       })\n     *       .when('/Book/:bookId/ch/:chapterId', {\n     *         templateUrl: 'chapter.html',\n     *         controller: 'ChapterController'\n     *       });\n     *\n     *       // configure html5 to get links working on jsfiddle\n     *       $locationProvider.html5Mode(true);\n     *     });\n     *\n     *   </file>\n     *\n     *   <file name=\"protractor.js\" type=\"protractor\">\n     *     it('should load and compile correct template', function() {\n     *       element(by.linkText('Moby: Ch1')).click();\n     *       var content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller\\: ChapterController/);\n     *       expect(content).toMatch(/Book Id\\: Moby/);\n     *       expect(content).toMatch(/Chapter Id\\: 1/);\n     *\n     *       element(by.partialLinkText('Scarlet')).click();\n     *\n     *       content = element(by.css('[ng-view]')).getText();\n     *       expect(content).toMatch(/controller\\: BookController/);\n     *       expect(content).toMatch(/Book Id\\: Scarlet/);\n     *     });\n     *   </file>\n     * </example>\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeStart\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted before a route change. At this  point the route services starts\n     * resolving all of the dependencies needed for the route change to occur.\n     * Typically this involves fetching the view template as well as any dependencies\n     * defined in `resolve` route property. Once  all of the dependencies are resolved\n     * `$routeChangeSuccess` is fired.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} next Future route information.\n     * @param {Route} current Current route information.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeSuccess\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted after a route dependencies are resolved.\n     * {@link ngRoute.directive:ngView ngView} listens for the directive\n     * to instantiate the controller and render the view.\n     *\n     * @param {Object} angularEvent Synthetic event object.\n     * @param {Route} current Current route information.\n     * @param {Route|Undefined} previous Previous route information, or undefined if current is\n     * first route entered.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeChangeError\n     * @eventType broadcast on root scope\n     * @description\n     * Broadcasted if any of the resolve promises are rejected.\n     *\n     * @param {Object} angularEvent Synthetic event object\n     * @param {Route} current Current route information.\n     * @param {Route} previous Previous route information.\n     * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.\n     */\n\n    /**\n     * @ngdoc event\n     * @name $route#$routeUpdate\n     * @eventType broadcast on root scope\n     * @description\n     *\n     * The `reloadOnSearch` property has been set to false, and we are reusing the same\n     * instance of the Controller.\n     */\n\n    var forceReload = false,\n        $route = {\n          routes: routes,\n\n          /**\n           * @ngdoc method\n           * @name $route#reload\n           *\n           * @description\n           * Causes `$route` service to reload the current route even if\n           * {@link ng.$location $location} hasn't changed.\n           *\n           * As a result of that, {@link ngRoute.directive:ngView ngView}\n           * creates new scope, reinstantiates the controller.\n           */\n          reload: function() {\n            forceReload = true;\n            $rootScope.$evalAsync(updateRoute);\n          }\n        };\n\n    $rootScope.$on('$locationChangeSuccess', updateRoute);\n\n    return $route;\n\n    /////////////////////////////////////////////////////\n\n    /**\n     * @param on {string} current url\n     * @param route {Object} route regexp to match the url against\n     * @return {?Object}\n     *\n     * @description\n     * Check if the route matches the current url.\n     *\n     * Inspired by match in\n     * visionmedia/express/lib/router/router.js.\n     */\n    function switchRouteMatcher(on, route) {\n      var keys = route.keys,\n          params = {};\n\n      if (!route.regexp) return null;\n\n      var m = route.regexp.exec(on);\n      if (!m) return null;\n\n      for (var i = 1, len = m.length; i < len; ++i) {\n        var key = keys[i - 1];\n\n        var val = 'string' == typeof m[i]\n              ? decodeURIComponent(m[i])\n              : m[i];\n\n        if (key && val) {\n          params[key.name] = val;\n        }\n      }\n      return params;\n    }\n\n    function updateRoute() {\n      var next = parseRoute(),\n          last = $route.current;\n\n      if (next && last && next.$$route === last.$$route\n          && angular.equals(next.pathParams, last.pathParams)\n          && !next.reloadOnSearch && !forceReload) {\n        last.params = next.params;\n        angular.copy(last.params, $routeParams);\n        $rootScope.$broadcast('$routeUpdate', last);\n      } else if (next || last) {\n        forceReload = false;\n        $rootScope.$broadcast('$routeChangeStart', next, last);\n        $route.current = next;\n        if (next) {\n          if (next.redirectTo) {\n            if (angular.isString(next.redirectTo)) {\n              $location.path(interpolate(next.redirectTo, next.params)).search(next.params)\n                       .replace();\n            } else {\n              $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))\n                       .replace();\n            }\n          }\n        }\n\n        $q.when(next).\n          then(function() {\n            if (next) {\n              var locals = angular.extend({}, next.resolve),\n                  template, templateUrl;\n\n              angular.forEach(locals, function(value, key) {\n                locals[key] = angular.isString(value) ?\n                    $injector.get(value) : $injector.invoke(value, null, null, key);\n              });\n\n              if (angular.isDefined(template = next.template)) {\n                if (angular.isFunction(template)) {\n                  template = template(next.params);\n                }\n              } else if (angular.isDefined(templateUrl = next.templateUrl)) {\n                if (angular.isFunction(templateUrl)) {\n                  templateUrl = templateUrl(next.params);\n                }\n                templateUrl = $sce.getTrustedResourceUrl(templateUrl);\n                if (angular.isDefined(templateUrl)) {\n                  next.loadedTemplateUrl = templateUrl;\n                  template = $http.get(templateUrl, {cache: $templateCache}).\n                      then(function(response) { return response.data; });\n                }\n              }\n              if (angular.isDefined(template)) {\n                locals['$template'] = template;\n              }\n              return $q.all(locals);\n            }\n          }).\n          // after route change\n          then(function(locals) {\n            if (next == $route.current) {\n              if (next) {\n                next.locals = locals;\n                angular.copy(next.params, $routeParams);\n              }\n              $rootScope.$broadcast('$routeChangeSuccess', next, last);\n            }\n          }, function(error) {\n            if (next == $route.current) {\n              $rootScope.$broadcast('$routeChangeError', next, last, error);\n            }\n          });\n      }\n    }\n\n\n    /**\n     * @returns {Object} the current active route, by matching it against the URL\n     */\n    function parseRoute() {\n      // Match a route\n      var params, match;\n      angular.forEach(routes, function(route, path) {\n        if (!match && (params = switchRouteMatcher($location.path(), route))) {\n          match = inherit(route, {\n            params: angular.extend({}, $location.search(), params),\n            pathParams: params});\n          match.$$route = route;\n        }\n      });\n      // No route matched; fallback to \"otherwise\" route\n      return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\n    }\n\n    /**\n     * @returns {string} interpolation of the redirect path with the parameters\n     */\n    function interpolate(string, params) {\n      var result = [];\n      angular.forEach((string||'').split(':'), function(segment, i) {\n        if (i === 0) {\n          result.push(segment);\n        } else {\n          var segmentMatch = segment.match(/(\\w+)(.*)/);\n          var key = segmentMatch[1];\n          result.push(params[key]);\n          result.push(segmentMatch[2] || '');\n          delete params[key];\n        }\n      });\n      return result.join('');\n    }\n  }];\n}\n\nngRouteModule.provider('$routeParams', $RouteParamsProvider);\n\n\n/**\n * @ngdoc service\n * @name $routeParams\n * @requires $route\n *\n * @description\n * The `$routeParams` service allows you to retrieve the current set of route parameters.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * The route parameters are a combination of {@link ng.$location `$location`}'s\n * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.\n * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.\n *\n * In case of parameter name collision, `path` params take precedence over `search` params.\n *\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\n * (but its properties will likely change) even when a route change occurs.\n *\n * Note that the `$routeParams` are only updated *after* a route change completes successfully.\n * This means that you cannot rely on `$routeParams` being correct in route resolve functions.\n * Instead you can use `$route.current.params` to access the new route's parameters.\n *\n * @example\n * ```js\n *  // Given:\n *  // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\n *  // Route: /Chapter/:chapterId/Section/:sectionId\n *  //\n *  // Then\n *  $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}\n * ```\n */\nfunction $RouteParamsProvider() {\n  this.$get = function() { return {}; };\n}\n\nngRouteModule.directive('ngView', ngViewFactory);\nngRouteModule.directive('ngView', ngViewFillContentFactory);\n\n\n/**\n * @ngdoc directive\n * @name ngView\n * @restrict ECA\n *\n * @description\n * # Overview\n * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by\n * including the rendered template of the current route into the main layout (`index.html`) file.\n * Every time the current route changes, the included view changes with it according to the\n * configuration of the `$route` service.\n *\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\n *\n * @animations\n * enter - animation is used to bring new content into the browser.\n * leave - animation is used to animate existing content away.\n *\n * The enter and leave animation occur concurrently.\n *\n * @scope\n * @priority 400\n * @param {string=} onload Expression to evaluate whenever the view updates.\n *\n * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll\n *                  $anchorScroll} to scroll the viewport after the view is updated.\n *\n *                  - If the attribute is not set, disable scrolling.\n *                  - If the attribute is set without value, enable scrolling.\n *                  - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated\n *                    as an expression yields a truthy value.\n * @example\n    <example name=\"ngView-directive\" module=\"ngViewExample\"\n             deps=\"angular-route.js;angular-animate.js\"\n             animations=\"true\" fixBase=\"true\">\n      <file name=\"index.html\">\n        <div ng-controller=\"MainCtrl as main\">\n          Choose:\n          <a href=\"Book/Moby\">Moby</a> |\n          <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\n          <a href=\"Book/Gatsby\">Gatsby</a> |\n          <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\n          <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\n\n          <div class=\"view-animate-container\">\n            <div ng-view class=\"view-animate\"></div>\n          </div>\n          <hr />\n\n          <pre>$location.path() = {{main.$location.path()}}</pre>\n          <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>\n          <pre>$route.current.params = {{main.$route.current.params}}</pre>\n          <pre>$routeParams = {{main.$routeParams}}</pre>\n        </div>\n      </file>\n\n      <file name=\"book.html\">\n        <div>\n          controller: {{book.name}}<br />\n          Book Id: {{book.params.bookId}}<br />\n        </div>\n      </file>\n\n      <file name=\"chapter.html\">\n        <div>\n          controller: {{chapter.name}}<br />\n          Book Id: {{chapter.params.bookId}}<br />\n          Chapter Id: {{chapter.params.chapterId}}\n        </div>\n      </file>\n\n      <file name=\"animations.css\">\n        .view-animate-container {\n          position:relative;\n          height:100px!important;\n          position:relative;\n          background:white;\n          border:1px solid black;\n          height:40px;\n          overflow:hidden;\n        }\n\n        .view-animate {\n          padding:10px;\n        }\n\n        .view-animate.ng-enter, .view-animate.ng-leave {\n          -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n          transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\n\n          display:block;\n          width:100%;\n          border-left:1px solid black;\n\n          position:absolute;\n          top:0;\n          left:0;\n          right:0;\n          bottom:0;\n          padding:10px;\n        }\n\n        .view-animate.ng-enter {\n          left:100%;\n        }\n        .view-animate.ng-enter.ng-enter-active {\n          left:0;\n        }\n        .view-animate.ng-leave.ng-leave-active {\n          left:-100%;\n        }\n      </file>\n\n      <file name=\"script.js\">\n        angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])\n          .config(['$routeProvider', '$locationProvider',\n            function($routeProvider, $locationProvider) {\n              $routeProvider\n                .when('/Book/:bookId', {\n                  templateUrl: 'book.html',\n                  controller: 'BookCtrl',\n                  controllerAs: 'book'\n                })\n                .when('/Book/:bookId/ch/:chapterId', {\n                  templateUrl: 'chapter.html',\n                  controller: 'ChapterCtrl',\n                  controllerAs: 'chapter'\n                });\n\n              // configure html5 to get links working on jsfiddle\n              $locationProvider.html5Mode(true);\n          }])\n          .controller('MainCtrl', ['$route', '$routeParams', '$location',\n            function($route, $routeParams, $location) {\n              this.$route = $route;\n              this.$location = $location;\n              this.$routeParams = $routeParams;\n          }])\n          .controller('BookCtrl', ['$routeParams', function($routeParams) {\n            this.name = \"BookCtrl\";\n            this.params = $routeParams;\n          }])\n          .controller('ChapterCtrl', ['$routeParams', function($routeParams) {\n            this.name = \"ChapterCtrl\";\n            this.params = $routeParams;\n          }]);\n\n      </file>\n\n      <file name=\"protractor.js\" type=\"protractor\">\n        it('should load and compile correct template', function() {\n          element(by.linkText('Moby: Ch1')).click();\n          var content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller\\: ChapterCtrl/);\n          expect(content).toMatch(/Book Id\\: Moby/);\n          expect(content).toMatch(/Chapter Id\\: 1/);\n\n          element(by.partialLinkText('Scarlet')).click();\n\n          content = element(by.css('[ng-view]')).getText();\n          expect(content).toMatch(/controller\\: BookCtrl/);\n          expect(content).toMatch(/Book Id\\: Scarlet/);\n        });\n      </file>\n    </example>\n */\n\n\n/**\n * @ngdoc event\n * @name ngView#$viewContentLoaded\n * @eventType emit on the current ngView scope\n * @description\n * Emitted every time the ngView content is reloaded.\n */\nngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];\nfunction ngViewFactory(   $route,   $anchorScroll,   $animate) {\n  return {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    link: function(scope, $element, attr, ctrl, $transclude) {\n        var currentScope,\n            currentElement,\n            previousElement,\n            autoScrollExp = attr.autoscroll,\n            onloadExp = attr.onload || '';\n\n        scope.$on('$routeChangeSuccess', update);\n        update();\n\n        function cleanupLastView() {\n          if(previousElement) {\n            previousElement.remove();\n            previousElement = null;\n          }\n          if(currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n          if(currentElement) {\n            $animate.leave(currentElement, function() {\n              previousElement = null;\n            });\n            previousElement = currentElement;\n            currentElement = null;\n          }\n        }\n\n        function update() {\n          var locals = $route.current && $route.current.locals,\n              template = locals && locals.$template;\n\n          if (angular.isDefined(template)) {\n            var newScope = scope.$new();\n            var current = $route.current;\n\n            // Note: This will also link all children of ng-view that were contained in the original\n            // html. If that content contains controllers, ... they could pollute/change the scope.\n            // However, using ng-view on an element with additional content does not make sense...\n            // Note: We can't remove them in the cloneAttchFn of $transclude as that\n            // function is called before linking the content, which would apply child\n            // directives to non existing elements.\n            var clone = $transclude(newScope, function(clone) {\n              $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {\n                if (angular.isDefined(autoScrollExp)\n                  && (!autoScrollExp || scope.$eval(autoScrollExp))) {\n                  $anchorScroll();\n                }\n              });\n              cleanupLastView();\n            });\n\n            currentElement = clone;\n            currentScope = current.scope = newScope;\n            currentScope.$emit('$viewContentLoaded');\n            currentScope.$eval(onloadExp);\n          } else {\n            cleanupLastView();\n          }\n        }\n    }\n  };\n}\n\n// This directive is called during the $transclude call of the first `ngView` directive.\n// It will replace and compile the content of the element with the loaded template.\n// We need this directive so that the element content is already filled when\n// the link function of another directive on the same element as ngView\n// is called.\nngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];\nfunction ngViewFillContentFactory($compile, $controller, $route) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    link: function(scope, $element) {\n      var current = $route.current,\n          locals = current.locals;\n\n      $element.html(locals.$template);\n\n      var link = $compile($element.contents());\n\n      if (current.controller) {\n        locals.$scope = scope;\n        var controller = $controller(current.controller, locals);\n        if (current.controllerAs) {\n          scope[current.controllerAs] = controller;\n        }\n        $element.data('$ngControllerController', controller);\n        $element.children().data('$ngControllerController', controller);\n      }\n\n      link(scope);\n    }\n  };\n}\n\n\n})(window, window.angular);\n"
  },
  {
    "path": "works/js/lib/angular-ui-router.js",
    "content": "/**\n * State-based routing for AngularJS\n * @version v0.2.10\n * @link http://angular-ui.github.com/\n * @license MIT License, http://www.opensource.org/licenses/MIT\n */\n\n/* commonjs package manager support (eg componentjs) */\nif (typeof module !== \"undefined\" && typeof exports !== \"undefined\" && module.exports === exports){\n  module.exports = 'ui.router';\n}\n\n(function (window, angular, undefined) {\n/*jshint globalstrict:true*/\n/*global angular:false*/\n'use strict';\n\nvar isDefined = angular.isDefined,\n    isFunction = angular.isFunction,\n    isString = angular.isString,\n    isObject = angular.isObject,\n    isArray = angular.isArray,\n    forEach = angular.forEach,\n    extend = angular.extend,\n    copy = angular.copy;\n\nfunction inherit(parent, extra) {\n  return extend(new (extend(function() {}, { prototype: parent }))(), extra);\n}\n\nfunction merge(dst) {\n  forEach(arguments, function(obj) {\n    if (obj !== dst) {\n      forEach(obj, function(value, key) {\n        if (!dst.hasOwnProperty(key)) dst[key] = value;\n      });\n    }\n  });\n  return dst;\n}\n\n/**\n * Finds the common ancestor path between two states.\n *\n * @param {Object} first The first state.\n * @param {Object} second The second state.\n * @return {Array} Returns an array of state names in descending order, not including the root.\n */\nfunction ancestors(first, second) {\n  var path = [];\n\n  for (var n in first.path) {\n    if (first.path[n] !== second.path[n]) break;\n    path.push(first.path[n]);\n  }\n  return path;\n}\n\n/**\n * IE8-safe wrapper for `Object.keys()`.\n *\n * @param {Object} object A JavaScript object.\n * @return {Array} Returns the keys of the object as an array.\n */\nfunction keys(object) {\n  if (Object.keys) {\n    return Object.keys(object);\n  }\n  var result = [];\n\n  angular.forEach(object, function(val, key) {\n    result.push(key);\n  });\n  return result;\n}\n\n/**\n * IE8-safe wrapper for `Array.prototype.indexOf()`.\n *\n * @param {Array} array A JavaScript array.\n * @param {*} value A value to search the array for.\n * @return {Number} Returns the array index value of `value`, or `-1` if not present.\n */\nfunction arraySearch(array, value) {\n  if (Array.prototype.indexOf) {\n    return array.indexOf(value, Number(arguments[2]) || 0);\n  }\n  var len = array.length >>> 0, from = Number(arguments[2]) || 0;\n  from = (from < 0) ? Math.ceil(from) : Math.floor(from);\n\n  if (from < 0) from += len;\n\n  for (; from < len; from++) {\n    if (from in array && array[from] === value) return from;\n  }\n  return -1;\n}\n\n/**\n * Merges a set of parameters with all parameters inherited between the common parents of the\n * current state and a given destination state.\n *\n * @param {Object} currentParams The value of the current state parameters ($stateParams).\n * @param {Object} newParams The set of parameters which will be composited with inherited params.\n * @param {Object} $current Internal definition of object representing the current state.\n * @param {Object} $to Internal definition of object representing state to transition to.\n */\nfunction inheritParams(currentParams, newParams, $current, $to) {\n  var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = [];\n\n  for (var i in parents) {\n    if (!parents[i].params || !parents[i].params.length) continue;\n    parentParams = parents[i].params;\n\n    for (var j in parentParams) {\n      if (arraySearch(inheritList, parentParams[j]) >= 0) continue;\n      inheritList.push(parentParams[j]);\n      inherited[parentParams[j]] = currentParams[parentParams[j]];\n    }\n  }\n  return extend({}, inherited, newParams);\n}\n\n/**\n * Normalizes a set of values to string or `null`, filtering them by a list of keys.\n *\n * @param {Array} keys The list of keys to normalize/return.\n * @param {Object} values An object hash of values to normalize.\n * @return {Object} Returns an object hash of normalized string values.\n */\nfunction normalize(keys, values) {\n  var normalized = {};\n\n  forEach(keys, function (name) {\n    var value = values[name];\n    normalized[name] = (value != null) ? String(value) : null;\n  });\n  return normalized;\n}\n\n/**\n * Performs a non-strict comparison of the subset of two objects, defined by a list of keys.\n *\n * @param {Object} a The first object.\n * @param {Object} b The second object.\n * @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified,\n *                     it defaults to the list of keys in `a`.\n * @return {Boolean} Returns `true` if the keys match, otherwise `false`.\n */\nfunction equalForKeys(a, b, keys) {\n  if (!keys) {\n    keys = [];\n    for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility\n  }\n\n  for (var i=0; i<keys.length; i++) {\n    var k = keys[i];\n    if (a[k] != b[k]) return false; // Not '===', values aren't necessarily normalized\n  }\n  return true;\n}\n\n/**\n * Returns the subset of an object, based on a list of keys.\n *\n * @param {Array} keys\n * @param {Object} values\n * @return {Boolean} Returns a subset of `values`.\n */\nfunction filterByKeys(keys, values) {\n  var filtered = {};\n\n  forEach(keys, function (name) {\n    filtered[name] = values[name];\n  });\n  return filtered;\n}\n/**\n * @ngdoc overview\n * @name ui.router.util\n *\n * @description\n * # ui.router.util sub-module\n *\n * This module is a dependency of other sub-modules. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n *\n */\nangular.module('ui.router.util', ['ng']);\n\n/**\n * @ngdoc overview\n * @name ui.router.router\n * \n * @requires ui.router.util\n *\n * @description\n * # ui.router.router sub-module\n *\n * This module is a dependency of other sub-modules. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n */\nangular.module('ui.router.router', ['ui.router.util']);\n\n/**\n * @ngdoc overview\n * @name ui.router.state\n * \n * @requires ui.router.router\n * @requires ui.router.util\n *\n * @description\n * # ui.router.state sub-module\n *\n * This module is a dependency of the main ui.router module. Do not include this module as a dependency\n * in your angular app (use {@link ui.router} module instead).\n * \n */\nangular.module('ui.router.state', ['ui.router.router', 'ui.router.util']);\n\n/**\n * @ngdoc overview\n * @name ui.router\n *\n * @requires ui.router.state\n *\n * @description\n * # ui.router\n * \n * ## The main module for ui.router \n * There are several sub-modules included with the ui.router module, however only this module is needed\n * as a dependency within your angular app. The other modules are for organization purposes. \n *\n * The modules are:\n * * ui.router - the main \"umbrella\" module\n * * ui.router.router - \n * \n * *You'll need to include **only** this module as the dependency within your angular app.*\n * \n * <pre>\n * <!doctype html>\n * <html ng-app=\"myApp\">\n * <head>\n *   <script src=\"js/angular.js\"></script>\n *   <!-- Include the ui-router script -->\n *   <script src=\"js/angular-ui-router.min.js\"></script>\n *   <script>\n *     // ...and add 'ui.router' as a dependency\n *     var myApp = angular.module('myApp', ['ui.router']);\n *   </script>\n * </head>\n * <body>\n * </body>\n * </html>\n * </pre>\n */\nangular.module('ui.router', ['ui.router.state']);\n\nangular.module('ui.router.compat', ['ui.router']);\n\n/**\n * @ngdoc object\n * @name ui.router.util.$resolve\n *\n * @requires $q\n * @requires $injector\n *\n * @description\n * Manages resolution of (acyclic) graphs of promises.\n */\n$Resolve.$inject = ['$q', '$injector'];\nfunction $Resolve(  $q,    $injector) {\n  \n  var VISIT_IN_PROGRESS = 1,\n      VISIT_DONE = 2,\n      NOTHING = {},\n      NO_DEPENDENCIES = [],\n      NO_LOCALS = NOTHING,\n      NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING });\n  \n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$resolve#study\n   * @methodOf ui.router.util.$resolve\n   *\n   * @description\n   * Studies a set of invocables that are likely to be used multiple times.\n   * <pre>\n   * $resolve.study(invocables)(locals, parent, self)\n   * </pre>\n   * is equivalent to\n   * <pre>\n   * $resolve.resolve(invocables, locals, parent, self)\n   * </pre>\n   * but the former is more efficient (in fact `resolve` just calls `study` \n   * internally).\n   *\n   * @param {object} invocables Invocable objects\n   * @return {function} a function to pass in locals, parent and self\n   */\n  this.study = function (invocables) {\n    if (!isObject(invocables)) throw new Error(\"'invocables' must be an object\");\n    \n    // Perform a topological sort of invocables to build an ordered plan\n    var plan = [], cycle = [], visited = {};\n    function visit(value, key) {\n      if (visited[key] === VISIT_DONE) return;\n      \n      cycle.push(key);\n      if (visited[key] === VISIT_IN_PROGRESS) {\n        cycle.splice(0, cycle.indexOf(key));\n        throw new Error(\"Cyclic dependency: \" + cycle.join(\" -> \"));\n      }\n      visited[key] = VISIT_IN_PROGRESS;\n      \n      if (isString(value)) {\n        plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES);\n      } else {\n        var params = $injector.annotate(value);\n        forEach(params, function (param) {\n          if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param);\n        });\n        plan.push(key, value, params);\n      }\n      \n      cycle.pop();\n      visited[key] = VISIT_DONE;\n    }\n    forEach(invocables, visit);\n    invocables = cycle = visited = null; // plan is all that's required\n    \n    function isResolve(value) {\n      return isObject(value) && value.then && value.$$promises;\n    }\n    \n    return function (locals, parent, self) {\n      if (isResolve(locals) && self === undefined) {\n        self = parent; parent = locals; locals = null;\n      }\n      if (!locals) locals = NO_LOCALS;\n      else if (!isObject(locals)) {\n        throw new Error(\"'locals' must be an object\");\n      }       \n      if (!parent) parent = NO_PARENT;\n      else if (!isResolve(parent)) {\n        throw new Error(\"'parent' must be a promise returned by $resolve.resolve()\");\n      }\n      \n      // To complete the overall resolution, we have to wait for the parent\n      // promise and for the promise for each invokable in our plan.\n      var resolution = $q.defer(),\n          result = resolution.promise,\n          promises = result.$$promises = {},\n          values = extend({}, locals),\n          wait = 1 + plan.length/3,\n          merged = false;\n          \n      function done() {\n        // Merge parent values we haven't got yet and publish our own $$values\n        if (!--wait) {\n          if (!merged) merge(values, parent.$$values); \n          result.$$values = values;\n          result.$$promises = true; // keep for isResolve()\n          resolution.resolve(values);\n        }\n      }\n      \n      function fail(reason) {\n        result.$$failure = reason;\n        resolution.reject(reason);\n      }\n      \n      // Short-circuit if parent has already failed\n      if (isDefined(parent.$$failure)) {\n        fail(parent.$$failure);\n        return result;\n      }\n      \n      // Merge parent values if the parent has already resolved, or merge\n      // parent promises and wait if the parent resolve is still in progress.\n      if (parent.$$values) {\n        merged = merge(values, parent.$$values);\n        done();\n      } else {\n        extend(promises, parent.$$promises);\n        parent.then(done, fail);\n      }\n      \n      // Process each invocable in the plan, but ignore any where a local of the same name exists.\n      for (var i=0, ii=plan.length; i<ii; i+=3) {\n        if (locals.hasOwnProperty(plan[i])) done();\n        else invoke(plan[i], plan[i+1], plan[i+2]);\n      }\n      \n      function invoke(key, invocable, params) {\n        // Create a deferred for this invocation. Failures will propagate to the resolution as well.\n        var invocation = $q.defer(), waitParams = 0;\n        function onfailure(reason) {\n          invocation.reject(reason);\n          fail(reason);\n        }\n        // Wait for any parameter that we have a promise for (either from parent or from this\n        // resolve; in that case study() will have made sure it's ordered before us in the plan).\n        forEach(params, function (dep) {\n          if (promises.hasOwnProperty(dep) && !locals.hasOwnProperty(dep)) {\n            waitParams++;\n            promises[dep].then(function (result) {\n              values[dep] = result;\n              if (!(--waitParams)) proceed();\n            }, onfailure);\n          }\n        });\n        if (!waitParams) proceed();\n        function proceed() {\n          if (isDefined(result.$$failure)) return;\n          try {\n            invocation.resolve($injector.invoke(invocable, self, values));\n            invocation.promise.then(function (result) {\n              values[key] = result;\n              done();\n            }, onfailure);\n          } catch (e) {\n            onfailure(e);\n          }\n        }\n        // Publish promise synchronously; invocations further down in the plan may depend on it.\n        promises[key] = invocation.promise;\n      }\n      \n      return result;\n    };\n  };\n  \n  /**\n   * @ngdoc function\n   * @name ui.router.util.$resolve#resolve\n   * @methodOf ui.router.util.$resolve\n   *\n   * @description\n   * Resolves a set of invocables. An invocable is a function to be invoked via \n   * `$injector.invoke()`, and can have an arbitrary number of dependencies. \n   * An invocable can either return a value directly,\n   * or a `$q` promise. If a promise is returned it will be resolved and the \n   * resulting value will be used instead. Dependencies of invocables are resolved \n   * (in this order of precedence)\n   *\n   * - from the specified `locals`\n   * - from another invocable that is part of this `$resolve` call\n   * - from an invocable that is inherited from a `parent` call to `$resolve` \n   *   (or recursively\n   * - from any ancestor `$resolve` of that parent).\n   *\n   * The return value of `$resolve` is a promise for an object that contains \n   * (in this order of precedence)\n   *\n   * - any `locals` (if specified)\n   * - the resolved return values of all injectables\n   * - any values inherited from a `parent` call to `$resolve` (if specified)\n   *\n   * The promise will resolve after the `parent` promise (if any) and all promises \n   * returned by injectables have been resolved. If any invocable \n   * (or `$injector.invoke`) throws an exception, or if a promise returned by an \n   * invocable is rejected, the `$resolve` promise is immediately rejected with the \n   * same error. A rejection of a `parent` promise (if specified) will likewise be \n   * propagated immediately. Once the `$resolve` promise has been rejected, no \n   * further invocables will be called.\n   * \n   * Cyclic dependencies between invocables are not permitted and will caues `$resolve`\n   * to throw an error. As a special case, an injectable can depend on a parameter \n   * with the same name as the injectable, which will be fulfilled from the `parent` \n   * injectable of the same name. This allows inherited values to be decorated. \n   * Note that in this case any other injectable in the same `$resolve` with the same\n   * dependency would see the decorated value, not the inherited value.\n   *\n   * Note that missing dependencies -- unlike cyclic dependencies -- will cause an \n   * (asynchronous) rejection of the `$resolve` promise rather than a (synchronous) \n   * exception.\n   *\n   * Invocables are invoked eagerly as soon as all dependencies are available. \n   * This is true even for dependencies inherited from a `parent` call to `$resolve`.\n   *\n   * As a special case, an invocable can be a string, in which case it is taken to \n   * be a service name to be passed to `$injector.get()`. This is supported primarily \n   * for backwards-compatibility with the `resolve` property of `$routeProvider` \n   * routes.\n   *\n   * @param {object} invocables functions to invoke or \n   * `$injector` services to fetch.\n   * @param {object} locals  values to make available to the injectables\n   * @param {object} parent  a promise returned by another call to `$resolve`.\n   * @param {object} self  the `this` for the invoked methods\n   * @return {object} Promise for an object that contains the resolved return value\n   * of all invocables, as well as any inherited and local values.\n   */\n  this.resolve = function (invocables, locals, parent, self) {\n    return this.study(invocables)(locals, parent, self);\n  };\n}\n\nangular.module('ui.router.util').service('$resolve', $Resolve);\n\n\n/**\n * @ngdoc object\n * @name ui.router.util.$templateFactory\n *\n * @requires $http\n * @requires $templateCache\n * @requires $injector\n *\n * @description\n * Service. Manages loading of templates.\n */\n$TemplateFactory.$inject = ['$http', '$templateCache', '$injector'];\nfunction $TemplateFactory(  $http,   $templateCache,   $injector) {\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromConfig\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template from a configuration object. \n   *\n   * @param {object} config Configuration object for which to load a template. \n   * The following properties are search in the specified order, and the first one \n   * that is defined is used to create the template:\n   *\n   * @param {string|object} config.template html string template or function to \n   * load via {@link ui.router.util.$templateFactory#fromString fromString}.\n   * @param {string|object} config.templateUrl url to load or a function returning \n   * the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}.\n   * @param {Function} config.templateProvider function to invoke via \n   * {@link ui.router.util.$templateFactory#fromProvider fromProvider}.\n   * @param {object} params  Parameters to pass to the template function.\n   * @param {object} locals Locals to pass to `invoke` if the template is loaded \n   * via a `templateProvider`. Defaults to `{ params: params }`.\n   *\n   * @return {string|object}  The template html as a string, or a promise for \n   * that string,or `null` if no template is configured.\n   */\n  this.fromConfig = function (config, params, locals) {\n    return (\n      isDefined(config.template) ? this.fromString(config.template, params) :\n      isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) :\n      isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) :\n      null\n    );\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromString\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template from a string or a function returning a string.\n   *\n   * @param {string|object} template html template as a string or function that \n   * returns an html template as a string.\n   * @param {object} params Parameters to pass to the template function.\n   *\n   * @return {string|object} The template html as a string, or a promise for that \n   * string.\n   */\n  this.fromString = function (template, params) {\n    return isFunction(template) ? template(params) : template;\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromUrl\n   * @methodOf ui.router.util.$templateFactory\n   * \n   * @description\n   * Loads a template from the a URL via `$http` and `$templateCache`.\n   *\n   * @param {string|Function} url url of the template to load, or a function \n   * that returns a url.\n   * @param {Object} params Parameters to pass to the url function.\n   * @return {string|Promise.<string>} The template html as a string, or a promise \n   * for that string.\n   */\n  this.fromUrl = function (url, params) {\n    if (isFunction(url)) url = url(params);\n    if (url == null) return null;\n    else return $http\n        .get(url, { cache: $templateCache })\n        .then(function(response) { return response.data; });\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$templateFactory#fromUrl\n   * @methodOf ui.router.util.$templateFactory\n   *\n   * @description\n   * Creates a template by invoking an injectable provider function.\n   *\n   * @param {Function} provider Function to invoke via `$injector.invoke`\n   * @param {Object} params Parameters for the template.\n   * @param {Object} locals Locals to pass to `invoke`. Defaults to \n   * `{ params: params }`.\n   * @return {string|Promise.<string>} The template html as a string, or a promise \n   * for that string.\n   */\n  this.fromProvider = function (provider, params, locals) {\n    return $injector.invoke(provider, null, locals || { params: params });\n  };\n}\n\nangular.module('ui.router.util').service('$templateFactory', $TemplateFactory);\n\n/**\n * @ngdoc object\n * @name ui.router.util.type:UrlMatcher\n *\n * @description\n * Matches URLs against patterns and extracts named parameters from the path or the search\n * part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list\n * of search parameters. Multiple search parameter names are separated by '&'. Search parameters\n * do not influence whether or not a URL is matched, but their values are passed through into\n * the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}.\n * \n * Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace\n * syntax, which optionally allows a regular expression for the parameter to be specified:\n *\n * * `':'` name - colon placeholder\n * * `'*'` name - catch-all placeholder\n * * `'{' name '}'` - curly placeholder\n * * `'{' name ':' regexp '}'` - curly placeholder with regexp. Should the regexp itself contain\n *   curly braces, they must be in matched pairs or escaped with a backslash.\n *\n * Parameter names may contain only word characters (latin letters, digits, and underscore) and\n * must be unique within the pattern (across both path and search parameters). For colon \n * placeholders or curly placeholders without an explicit regexp, a path parameter matches any\n * number of characters other than '/'. For catch-all placeholders the path parameter matches\n * any number of characters.\n * \n * Examples:\n * \n * * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for\n *   trailing slashes, and patterns have to match the entire path, not just a prefix.\n * * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or\n *   '/user/bob/details'. The second path segment will be captured as the parameter 'id'.\n * * `'/user/{id}'` - Same as the previous example, but using curly brace syntax.\n * * `'/user/{id:[^/]*}'` - Same as the previous example.\n * * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id\n *   parameter consists of 1 to 8 hex digits.\n * * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the\n *   path into the parameter 'path'.\n * * `'/files/*path'` - ditto.\n *\n * @param {string} pattern  the pattern to compile into a matcher.\n *\n * @property {string} prefix  A static prefix of this pattern. The matcher guarantees that any\n *   URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns\n *   non-null) will start with this prefix.\n *\n * @property {string} source  The pattern that was passed into the contructor\n *\n * @property {string} sourcePath  The path portion of the source property\n *\n * @property {string} sourceSearch  The search portion of the source property\n *\n * @property {string} regex  The constructed regex that will be used to match against the url when \n *   it is time to determine which url will match.\n *\n * @returns {Object}  New UrlMatcher object\n */\nfunction UrlMatcher(pattern) {\n\n  // Find all placeholders and create a compiled pattern, using either classic or curly syntax:\n  //   '*' name\n  //   ':' name\n  //   '{' name '}'\n  //   '{' name ':' regexp '}'\n  // The regular expression is somewhat complicated due to the need to allow curly braces\n  // inside the regular expression. The placeholder regexp breaks down as follows:\n  //    ([:*])(\\w+)               classic placeholder ($1 / $2)\n  //    \\{(\\w+)(?:\\:( ... ))?\\}   curly brace placeholder ($3) with optional regexp ... ($4)\n  //    (?: ... | ... | ... )+    the regexp consists of any number of atoms, an atom being either\n  //    [^{}\\\\]+                  - anything other than curly braces or backslash\n  //    \\\\.                       - a backslash escape\n  //    \\{(?:[^{}\\\\]+|\\\\.)*\\}     - a matched set of curly braces containing other atoms\n  var placeholder = /([:*])(\\w+)|\\{(\\w+)(?:\\:((?:[^{}\\\\]+|\\\\.|\\{(?:[^{}\\\\]+|\\\\.)*\\})+))?\\}/g,\n      names = {}, compiled = '^', last = 0, m,\n      segments = this.segments = [],\n      params = this.params = [];\n\n  function addParameter(id) {\n    if (!/^\\w+(-+\\w+)*$/.test(id)) throw new Error(\"Invalid parameter name '\" + id + \"' in pattern '\" + pattern + \"'\");\n    if (names[id]) throw new Error(\"Duplicate parameter name '\" + id + \"' in pattern '\" + pattern + \"'\");\n    names[id] = true;\n    params.push(id);\n  }\n\n  function quoteRegExp(string) {\n    return string.replace(/[\\\\\\[\\]\\^$*+?.()|{}]/g, \"\\\\$&\");\n  }\n\n  this.source = pattern;\n\n  // Split into static segments separated by path parameter placeholders.\n  // The number of segments is always 1 more than the number of parameters.\n  var id, regexp, segment;\n  while ((m = placeholder.exec(pattern))) {\n    id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null\n    regexp = m[4] || (m[1] == '*' ? '.*' : '[^/]*');\n    segment = pattern.substring(last, m.index);\n    if (segment.indexOf('?') >= 0) break; // we're into the search part\n    compiled += quoteRegExp(segment) + '(' + regexp + ')';\n    addParameter(id);\n    segments.push(segment);\n    last = placeholder.lastIndex;\n  }\n  segment = pattern.substring(last);\n\n  // Find any search parameter names and remove them from the last segment\n  var i = segment.indexOf('?');\n  if (i >= 0) {\n    var search = this.sourceSearch = segment.substring(i);\n    segment = segment.substring(0, i);\n    this.sourcePath = pattern.substring(0, last+i);\n\n    // Allow parameters to be separated by '?' as well as '&' to make concat() easier\n    forEach(search.substring(1).split(/[&?]/), addParameter);\n  } else {\n    this.sourcePath = pattern;\n    this.sourceSearch = '';\n  }\n\n  compiled += quoteRegExp(segment) + '$';\n  segments.push(segment);\n  this.regexp = new RegExp(compiled);\n  this.prefix = segments[0];\n}\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#concat\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Returns a new matcher for a pattern constructed by appending the path part and adding the\n * search parameters of the specified pattern to this pattern. The current pattern is not\n * modified. This can be understood as creating a pattern for URLs that are relative to (or\n * suffixes of) the current pattern.\n *\n * @example\n * The following two matchers are equivalent:\n * ```\n * new UrlMatcher('/user/{id}?q').concat('/details?date');\n * new UrlMatcher('/user/{id}/details?q&date');\n * ```\n *\n * @param {string} pattern  The pattern to append.\n * @returns {ui.router.util.type:UrlMatcher}  A matcher for the concatenated pattern.\n */\nUrlMatcher.prototype.concat = function (pattern) {\n  // Because order of search parameters is irrelevant, we can add our own search\n  // parameters to the end of the new pattern. Parse the new pattern by itself\n  // and then join the bits together, but it's much easier to do this on a string level.\n  return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch);\n};\n\nUrlMatcher.prototype.toString = function () {\n  return this.source;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#exec\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Tests the specified path against this matcher, and returns an object containing the captured\n * parameter values, or null if the path does not match. The returned object contains the values\n * of any search parameters that are mentioned in the pattern, but their value may be null if\n * they are not present in `searchParams`. This means that search parameters are always treated\n * as optional.\n *\n * @example\n * ```\n * new UrlMatcher('/user/{id}?q&r').exec('/user/bob', { x:'1', q:'hello' });\n * // returns { id:'bob', q:'hello', r:null }\n * ```\n *\n * @param {string} path  The URL path to match, e.g. `$location.path()`.\n * @param {Object} searchParams  URL search parameters, e.g. `$location.search()`.\n * @returns {Object}  The captured parameter values.\n */\nUrlMatcher.prototype.exec = function (path, searchParams) {\n  var m = this.regexp.exec(path);\n  if (!m) return null;\n\n  var params = this.params, nTotal = params.length,\n    nPath = this.segments.length-1,\n    values = {}, i;\n\n  if (nPath !== m.length - 1) throw new Error(\"Unbalanced capture group in route '\" + this.source + \"'\");\n\n  for (i=0; i<nPath; i++) values[params[i]] = m[i+1];\n  for (/**/; i<nTotal; i++) values[params[i]] = searchParams[params[i]];\n\n  return values;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#parameters\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Returns the names of all path and search parameters of this pattern in an unspecified order.\n * \n * @returns {Array.<string>}  An array of parameter names. Must be treated as read-only. If the\n *    pattern has no parameters, an empty array is returned.\n */\nUrlMatcher.prototype.parameters = function () {\n  return this.params;\n};\n\n/**\n * @ngdoc function\n * @name ui.router.util.type:UrlMatcher#format\n * @methodOf ui.router.util.type:UrlMatcher\n *\n * @description\n * Creates a URL that matches this pattern by substituting the specified values\n * for the path and search parameters. Null values for path parameters are\n * treated as empty strings.\n *\n * @example\n * ```\n * new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });\n * // returns '/user/bob?q=yes'\n * ```\n *\n * @param {Object} values  the values to substitute for the parameters in this pattern.\n * @returns {string}  the formatted URL (path and optionally search part).\n */\nUrlMatcher.prototype.format = function (values) {\n  var segments = this.segments, params = this.params;\n  if (!values) return segments.join('');\n\n  var nPath = segments.length-1, nTotal = params.length,\n    result = segments[0], i, search, value;\n\n  for (i=0; i<nPath; i++) {\n    value = values[params[i]];\n    // TODO: Maybe we should throw on null here? It's not really good style to use '' and null interchangeabley\n    if (value != null) result += encodeURIComponent(value);\n    result += segments[i+1];\n  }\n  for (/**/; i<nTotal; i++) {\n    value = values[params[i]];\n    if (value != null) {\n      result += (search ? '&' : '?') + params[i] + '=' + encodeURIComponent(value);\n      search = true;\n    }\n  }\n\n  return result;\n};\n\n\n\n/**\n * @ngdoc object\n * @name ui.router.util.$urlMatcherFactory\n *\n * @description\n * Factory for {@link ui.router.util.type:UrlMatcher} instances. The factory is also available to providers\n * under the name `$urlMatcherFactoryProvider`.\n */\nfunction $UrlMatcherFactory() {\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#compile\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Creates a {@link ui.router.util.type:UrlMatcher} for the specified pattern.\n   *   \n   * @param {string} pattern  The URL pattern.\n   * @returns {ui.router.util.type:UrlMatcher}  The UrlMatcher.\n   */\n  this.compile = function (pattern) {\n    return new UrlMatcher(pattern);\n  };\n\n  /**\n   * @ngdoc function\n   * @name ui.router.util.$urlMatcherFactory#isMatcher\n   * @methodOf ui.router.util.$urlMatcherFactory\n   *\n   * @description\n   * Returns true if the specified object is a UrlMatcher, or false otherwise.\n   *\n   * @param {Object} object  The object to perform the type check against.\n   * @returns {Boolean}  Returns `true` if the object has the following functions: `exec`, `format`, and `concat`.\n   */\n  this.isMatcher = function (o) {\n    return isObject(o) && isFunction(o.exec) && isFunction(o.format) && isFunction(o.concat);\n  };\n  \n  /* No need to document $get, since it returns this */\n  this.$get = function () {\n    return this;\n  };\n}\n\n// Register as a provider so it's available to other providers\nangular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory);\n\n/**\n * @ngdoc object\n * @name ui.router.router.$urlRouterProvider\n *\n * @requires ui.router.util.$urlMatcherFactoryProvider\n *\n * @description\n * `$urlRouterProvider` has the responsibility of watching `$location`. \n * When `$location` changes it runs through a list of rules one by one until a \n * match is found. `$urlRouterProvider` is used behind the scenes anytime you specify \n * a url in a state configuration. All urls are compiled into a UrlMatcher object.\n *\n * There are several methods on `$urlRouterProvider` that make it useful to use directly\n * in your module config.\n */\n$UrlRouterProvider.$inject = ['$urlMatcherFactoryProvider'];\nfunction $UrlRouterProvider(  $urlMatcherFactory) {\n  var rules = [], \n      otherwise = null;\n\n  // Returns a string that is a prefix of all strings matching the RegExp\n  function regExpPrefix(re) {\n    var prefix = /^\\^((?:\\\\[^a-zA-Z0-9]|[^\\\\\\[\\]\\^$*+?.()|{}]+)*)/.exec(re.source);\n    return (prefix != null) ? prefix[1].replace(/\\\\(.)/g, \"$1\") : '';\n  }\n\n  // Interpolates matched values into a String.replace()-style pattern\n  function interpolate(pattern, match) {\n    return pattern.replace(/\\$(\\$|\\d{1,2})/, function (m, what) {\n      return match[what === '$' ? 0 : Number(what)];\n    });\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.router.$urlRouterProvider#rule\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Defines rules that are used by `$urlRouterProvider to find matches for\n   * specific URLs.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   // Here's an example of how you might allow case insensitive urls\n   *   $urlRouterProvider.rule(function ($injector, $location) {\n   *     var path = $location.path(),\n   *         normalized = path.toLowerCase();\n   *\n   *     if (path !== normalized) {\n   *       return normalized;\n   *     }\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {object} rule Handler function that takes `$injector` and `$location`\n   * services as arguments. You can use them to return a valid path as a string.\n   *\n   * @return {object} $urlRouterProvider - $urlRouterProvider instance\n   */\n  this.rule =\n    function (rule) {\n      if (!isFunction(rule)) throw new Error(\"'rule' must be a function\");\n      rules.push(rule);\n      return this;\n    };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.router.$urlRouterProvider#otherwise\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Defines a path that is used when an invalied route is requested.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   // if the path doesn't match any of the urls you configured\n   *   // otherwise will take care of routing the user to the\n   *   // specified url\n   *   $urlRouterProvider.otherwise('/index');\n   *\n   *   // Example of using function rule as param\n   *   $urlRouterProvider.otherwise(function ($injector, $location) {\n   *     ...\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string|object} rule The url path you want to redirect to or a function \n   * rule that returns the url path. The function version is passed two params: \n   * `$injector` and `$location` services.\n   *\n   * @return {object} $urlRouterProvider - $urlRouterProvider instance\n   */\n  this.otherwise =\n    function (rule) {\n      if (isString(rule)) {\n        var redirect = rule;\n        rule = function () { return redirect; };\n      }\n      else if (!isFunction(rule)) throw new Error(\"'rule' must be a function\");\n      otherwise = rule;\n      return this;\n    };\n\n\n  function handleIfMatch($injector, handler, match) {\n    if (!match) return false;\n    var result = $injector.invoke(handler, handler, { $match: match });\n    return isDefined(result) ? result : true;\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.router.$urlRouterProvider#when\n   * @methodOf ui.router.router.$urlRouterProvider\n   *\n   * @description\n   * Registers a handler for a given url matching. if handle is a string, it is\n   * treated as a redirect, and is interpolated according to the syyntax of match\n   * (i.e. like String.replace() for RegExp, or like a UrlMatcher pattern otherwise).\n   *\n   * If the handler is a function, it is injectable. It gets invoked if `$location`\n   * matches. You have the option of inject the match object as `$match`.\n   *\n   * The handler can return\n   *\n   * - **falsy** to indicate that the rule didn't match after all, then `$urlRouter`\n   *   will continue trying to find another one that matches.\n   * - **string** which is treated as a redirect and passed to `$location.url()`\n   * - **void** or any **truthy** value tells `$urlRouter` that the url was handled.\n   *\n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.router']);\n   *\n   * app.config(function ($urlRouterProvider) {\n   *   $urlRouterProvider.when($state.url, function ($match, $stateParams) {\n   *     if ($state.$current.navigable !== state ||\n   *         !equalForKeys($match, $stateParams) {\n   *      $state.transitionTo(state, $match, false);\n   *     }\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string|object} what The incoming path that you want to redirect.\n   * @param {string|object} handler The path you want to redirect your user to.\n   */\n  this.when =\n    function (what, handler) {\n      var redirect, handlerIsString = isString(handler);\n      if (isString(what)) what = $urlMatcherFactory.compile(what);\n\n      if (!handlerIsString && !isFunction(handler) && !isArray(handler))\n        throw new Error(\"invalid 'handler' in when()\");\n\n      var strategies = {\n        matcher: function (what, handler) {\n          if (handlerIsString) {\n            redirect = $urlMatcherFactory.compile(handler);\n            handler = ['$match', function ($match) { return redirect.format($match); }];\n          }\n          return extend(function ($injector, $location) {\n            return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));\n          }, {\n            prefix: isString(what.prefix) ? what.prefix : ''\n          });\n        },\n        regex: function (what, handler) {\n          if (what.global || what.sticky) throw new Error(\"when() RegExp must not be global or sticky\");\n\n          if (handlerIsString) {\n            redirect = handler;\n            handler = ['$match', function ($match) { return interpolate(redirect, $match); }];\n          }\n          return extend(function ($injector, $location) {\n            return handleIfMatch($injector, handler, what.exec($location.path()));\n          }, {\n            prefix: regExpPrefix(what)\n          });\n        }\n      };\n\n      var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };\n\n      for (var n in check) {\n        if (check[n]) {\n          return this.rule(strategies[n](what, handler));\n        }\n      }\n\n      throw new Error(\"invalid 'what' in when()\");\n    };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.router.$urlRouter\n   *\n   * @requires $location\n   * @requires $rootScope\n   * @requires $injector\n   *\n   * @description\n   *\n   */\n  this.$get =\n    [        '$location', '$rootScope', '$injector',\n    function ($location,   $rootScope,   $injector) {\n      // TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree\n      function update(evt) {\n        if (evt && evt.defaultPrevented) return;\n        function check(rule) {\n          var handled = rule($injector, $location);\n          if (handled) {\n            if (isString(handled)) $location.replace().url(handled);\n            return true;\n          }\n          return false;\n        }\n        var n=rules.length, i;\n        for (i=0; i<n; i++) {\n          if (check(rules[i])) return;\n        }\n        // always check otherwise last to allow dynamic updates to the set of rules\n        if (otherwise) check(otherwise);\n      }\n\n      $rootScope.$on('$locationChangeSuccess', update);\n\n      return {\n        /**\n         * @ngdoc function\n         * @name ui.router.router.$urlRouter#sync\n         * @methodOf ui.router.router.$urlRouter\n         *\n         * @description\n         * Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.\n         * This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event, \n         * perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed \n         * with the transition by calling `$urlRouter.sync()`.\n         *\n         * @example\n         * <pre>\n         * angular.module('app', ['ui.router']);\n         *   .run(function($rootScope, $urlRouter) {\n         *     $rootScope.$on('$locationChangeSuccess', function(evt) {\n         *       // Halt state change from even starting\n         *       evt.preventDefault();\n         *       // Perform custom logic\n         *       var meetsRequirement = ...\n         *       // Continue with the update and state transition if logic allows\n         *       if (meetsRequirement) $urlRouter.sync();\n         *     });\n         * });\n         * </pre>\n         */\n        sync: function () {\n          update();\n        }\n      };\n    }];\n}\n\nangular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);\n\n/**\n * @ngdoc object\n * @name ui.router.state.$stateProvider\n *\n * @requires ui.router.router.$urlRouterProvider\n * @requires ui.router.util.$urlMatcherFactoryProvider\n * @requires $locationProvider\n *\n * @description\n * The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely\n * on state.\n *\n * A state corresponds to a \"place\" in the application in terms of the overall UI and\n * navigation. A state describes (via the controller / template / view properties) what\n * the UI looks like and does at that place.\n *\n * States often have things in common, and the primary way of factoring out these\n * commonalities in this model is via the state hierarchy, i.e. parent/child states aka\n * nested states.\n *\n * The `$stateProvider` provides interfaces to declare these states for your app.\n */\n$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider', '$locationProvider'];\nfunction $StateProvider(   $urlRouterProvider,   $urlMatcherFactory,           $locationProvider) {\n\n  var root, states = {}, $state, queue = {}, abstractKey = 'abstract';\n\n  // Builds state properties from definition passed to registerState()\n  var stateBuilder = {\n\n    // Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.\n    // state.children = [];\n    // if (parent) parent.children.push(state);\n    parent: function(state) {\n      if (isDefined(state.parent) && state.parent) return findState(state.parent);\n      // regex matches any valid composite state name\n      // would match \"contact.list\" but not \"contacts\"\n      var compositeName = /^(.+)\\.[^.]+$/.exec(state.name);\n      return compositeName ? findState(compositeName[1]) : root;\n    },\n\n    // inherit 'data' from parent and override by own values (if any)\n    data: function(state) {\n      if (state.parent && state.parent.data) {\n        state.data = state.self.data = extend({}, state.parent.data, state.data);\n      }\n      return state.data;\n    },\n\n    // Build a URLMatcher if necessary, either via a relative or absolute URL\n    url: function(state) {\n      var url = state.url;\n\n      if (isString(url)) {\n        if (url.charAt(0) == '^') {\n          return $urlMatcherFactory.compile(url.substring(1));\n        }\n        return (state.parent.navigable || root).url.concat(url);\n      }\n\n      if ($urlMatcherFactory.isMatcher(url) || url == null) {\n        return url;\n      }\n      throw new Error(\"Invalid url '\" + url + \"' in state '\" + state + \"'\");\n    },\n\n    // Keep track of the closest ancestor state that has a URL (i.e. is navigable)\n    navigable: function(state) {\n      return state.url ? state : (state.parent ? state.parent.navigable : null);\n    },\n\n    // Derive parameters for this state and ensure they're a super-set of parent's parameters\n    params: function(state) {\n      if (!state.params) {\n        return state.url ? state.url.parameters() : state.parent.params;\n      }\n      if (!isArray(state.params)) throw new Error(\"Invalid params in state '\" + state + \"'\");\n      if (state.url) throw new Error(\"Both params and url specicified in state '\" + state + \"'\");\n      return state.params;\n    },\n\n    // If there is no explicit multi-view configuration, make one up so we don't have\n    // to handle both cases in the view directive later. Note that having an explicit\n    // 'views' property will mean the default unnamed view properties are ignored. This\n    // is also a good time to resolve view names to absolute names, so everything is a\n    // straight lookup at link time.\n    views: function(state) {\n      var views = {};\n\n      forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {\n        if (name.indexOf('@') < 0) name += '@' + state.parent.name;\n        views[name] = view;\n      });\n      return views;\n    },\n\n    ownParams: function(state) {\n      if (!state.parent) {\n        return state.params;\n      }\n      var paramNames = {}; forEach(state.params, function (p) { paramNames[p] = true; });\n\n      forEach(state.parent.params, function (p) {\n        if (!paramNames[p]) {\n          throw new Error(\"Missing required parameter '\" + p + \"' in state '\" + state.name + \"'\");\n        }\n        paramNames[p] = false;\n      });\n      var ownParams = [];\n\n      forEach(paramNames, function (own, p) {\n        if (own) ownParams.push(p);\n      });\n      return ownParams;\n    },\n\n    // Keep a full path from the root down to this state as this is needed for state activation.\n    path: function(state) {\n      return state.parent ? state.parent.path.concat(state) : []; // exclude root from path\n    },\n\n    // Speed up $state.contains() as it's used a lot\n    includes: function(state) {\n      var includes = state.parent ? extend({}, state.parent.includes) : {};\n      includes[state.name] = true;\n      return includes;\n    },\n\n    $delegates: {}\n  };\n\n  function isRelative(stateName) {\n    return stateName.indexOf(\".\") === 0 || stateName.indexOf(\"^\") === 0;\n  }\n\n  function findState(stateOrName, base) {\n    var isStr = isString(stateOrName),\n        name  = isStr ? stateOrName : stateOrName.name,\n        path  = isRelative(name);\n\n    if (path) {\n      if (!base) throw new Error(\"No reference point given for path '\"  + name + \"'\");\n      var rel = name.split(\".\"), i = 0, pathLength = rel.length, current = base;\n\n      for (; i < pathLength; i++) {\n        if (rel[i] === \"\" && i === 0) {\n          current = base;\n          continue;\n        }\n        if (rel[i] === \"^\") {\n          if (!current.parent) throw new Error(\"Path '\" + name + \"' not valid for state '\" + base.name + \"'\");\n          current = current.parent;\n          continue;\n        }\n        break;\n      }\n      rel = rel.slice(i).join(\".\");\n      name = current.name + (current.name && rel ? \".\" : \"\") + rel;\n    }\n    var state = states[name];\n\n    if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {\n      return state;\n    }\n    return undefined;\n  }\n\n  function queueState(parentName, state) {\n    if (!queue[parentName]) {\n      queue[parentName] = [];\n    }\n    queue[parentName].push(state);\n  }\n\n  function registerState(state) {\n    // Wrap a new object around the state so we can store our private details easily.\n    state = inherit(state, {\n      self: state,\n      resolve: state.resolve || {},\n      toString: function() { return this.name; }\n    });\n\n    var name = state.name;\n    if (!isString(name) || name.indexOf('@') >= 0) throw new Error(\"State must have a valid name\");\n    if (states.hasOwnProperty(name)) throw new Error(\"State '\" + name + \"'' is already defined\");\n\n    // Get parent name\n    var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))\n        : (isString(state.parent)) ? state.parent\n        : '';\n\n    // If parent is not registered yet, add state to queue and register later\n    if (parentName && !states[parentName]) {\n      return queueState(parentName, state.self);\n    }\n\n    for (var key in stateBuilder) {\n      if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);\n    }\n    states[name] = state;\n\n    // Register the state in the global state list and with $urlRouter if necessary.\n    if (!state[abstractKey] && state.url) {\n      $urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {\n        if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {\n          $state.transitionTo(state, $match, { location: false });\n        }\n      }]);\n    }\n\n    // Register any queued children\n    if (queue[name]) {\n      for (var i = 0; i < queue[name].length; i++) {\n        registerState(queue[name][i]);\n      }\n    }\n\n    return state;\n  }\n\n  // Checks text to see if it looks like a glob.\n  function isGlob (text) {\n    return text.indexOf('*') > -1;\n  }\n\n  // Returns true if glob matches current $state name.\n  function doesStateMatchGlob (glob) {\n    var globSegments = glob.split('.'),\n        segments = $state.$current.name.split('.');\n\n    //match greedy starts\n    if (globSegments[0] === '**') {\n       segments = segments.slice(segments.indexOf(globSegments[1]));\n       segments.unshift('**');\n    }\n    //match greedy ends\n    if (globSegments[globSegments.length - 1] === '**') {\n       segments.splice(segments.indexOf(globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);\n       segments.push('**');\n    }\n\n    if (globSegments.length != segments.length) {\n      return false;\n    }\n\n    //match single stars\n    for (var i = 0, l = globSegments.length; i < l; i++) {\n      if (globSegments[i] === '*') {\n        segments[i] = '*';\n      }\n    }\n\n    return segments.join('') === globSegments.join('');\n  }\n\n\n  // Implicit root state that is always active\n  root = registerState({\n    name: '',\n    url: '^',\n    views: null,\n    'abstract': true\n  });\n  root.navigable = null;\n\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$stateProvider#decorator\n   * @methodOf ui.router.state.$stateProvider\n   *\n   * @description\n   * Allows you to extend (carefully) or override (at your own peril) the \n   * `stateBuilder` object used internally by `$stateProvider`. This can be used \n   * to add custom functionality to ui-router, for example inferring templateUrl \n   * based on the state name.\n   *\n   * When passing only a name, it returns the current (original or decorated) builder\n   * function that matches `name`.\n   *\n   * The builder functions that can be decorated are listed below. Though not all\n   * necessarily have a good use case for decoration, that is up to you to decide.\n   *\n   * In addition, users can attach custom decorators, which will generate new \n   * properties within the state's internal definition. There is currently no clear \n   * use-case for this beyond accessing internal states (i.e. $state.$current), \n   * however, expect this to become increasingly relevant as we introduce additional \n   * meta-programming features.\n   *\n   * **Warning**: Decorators should not be interdependent because the order of \n   * execution of the builder functions in non-deterministic. Builder functions \n   * should only be dependent on the state definition object and super function.\n   *\n   *\n   * Existing builder functions and current return values:\n   *\n   * - **parent** `{object}` - returns the parent state object.\n   * - **data** `{object}` - returns state data, including any inherited data that is not\n   *   overridden by own values (if any).\n   * - **url** `{object}` - returns a {link ui.router.util.type:UrlMatcher} or null.\n   * - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is \n   *   navigable).\n   * - **params** `{object}` - returns an array of state params that are ensured to \n   *   be a super-set of parent's params.\n   * - **views** `{object}` - returns a views object where each key is an absolute view \n   *   name (i.e. \"viewName@stateName\") and each value is the config object \n   *   (template, controller) for the view. Even when you don't use the views object \n   *   explicitly on a state config, one is still created for you internally.\n   *   So by decorating this builder function you have access to decorating template \n   *   and controller properties.\n   * - **ownParams** `{object}` - returns an array of params that belong to the state, \n   *   not including any params defined by ancestor states.\n   * - **path** `{string}` - returns the full path from the root down to this state. \n   *   Needed for state activation.\n   * - **includes** `{object}` - returns an object that includes every state that \n   *   would pass a '$state.includes()' test.\n   *\n   * @example\n   * <pre>\n   * // Override the internal 'views' builder with a function that takes the state\n   * // definition, and a reference to the internal function being overridden:\n   * $stateProvider.decorator('views', function ($state, parent) {\n   *   var result = {},\n   *       views = parent(state);\n   *\n   *   angular.forEach(view, function (config, name) {\n   *     var autoName = (state.name + '.' + name).replace('.', '/');\n   *     config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';\n   *     result[name] = config;\n   *   });\n   *   return result;\n   * });\n   *\n   * $stateProvider.state('home', {\n   *   views: {\n   *     'contact.list': { controller: 'ListController' },\n   *     'contact.item': { controller: 'ItemController' }\n   *   }\n   * });\n   *\n   * // ...\n   *\n   * $state.go('home');\n   * // Auto-populates list and item views with /partials/home/contact/list.html,\n   * // and /partials/home/contact/item.html, respectively.\n   * </pre>\n   *\n   * @param {string} name The name of the builder function to decorate. \n   * @param {object} func A function that is responsible for decorating the original \n   * builder function. The function receives two parameters:\n   *\n   *   - `{object}` - state - The state config object.\n   *   - `{object}` - super - The original builder function.\n   *\n   * @return {object} $stateProvider - $stateProvider instance\n   */\n  this.decorator = decorator;\n  function decorator(name, func) {\n    /*jshint validthis: true */\n    if (isString(name) && !isDefined(func)) {\n      return stateBuilder[name];\n    }\n    if (!isFunction(func) || !isString(name)) {\n      return this;\n    }\n    if (stateBuilder[name] && !stateBuilder.$delegates[name]) {\n      stateBuilder.$delegates[name] = stateBuilder[name];\n    }\n    stateBuilder[name] = func;\n    return this;\n  }\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$stateProvider#state\n   * @methodOf ui.router.state.$stateProvider\n   *\n   * @description\n   * Registers a state configuration under a given state name. The stateConfig object\n   * has the following acceptable properties.\n   *\n   * <a id='template'></a>\n   *\n   * - **`template`** - {string|function=} - html template as a string or a function that returns\n   *   an html template as a string which should be used by the uiView directives. This property \n   *   takes precedence over templateUrl.\n   *   \n   *   If `template` is a function, it will be called with the following parameters:\n   *\n   *   - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by\n   *     applying the current state\n   *\n   * <a id='templateUrl'></a>\n   *\n   * - **`templateUrl`** - {string|function=} - path or function that returns a path to an html \n   *   template that should be used by uiView.\n   *   \n   *   If `templateUrl` is a function, it will be called with the following parameters:\n   *\n   *   - {array.&lt;object&gt;} - state parameters extracted from the current $location.path() by \n   *     applying the current state\n   *\n   * <a id='templateProvider'></a>\n   *\n   * - **`templateProvider`** - {function=} - Provider function that returns HTML content\n   *   string.\n   *\n   * <a id='controller'></a>\n   *\n   * - **`controller`** - {string|function=} -  Controller fn that should be associated with newly \n   *   related scope or the name of a registered controller if passed as a string.\n   *\n   * <a id='controllerProvider'></a>\n   *\n   * - **`controllerProvider`** - {function=} - Injectable provider function that returns\n   *   the actual controller or string.\n   *\n   * <a id='controllerAs'></a>\n   * \n   * - **`controllerAs`** – {string=} – A controller alias name. If present the controller will be \n   *   published to scope under the controllerAs name.\n   *\n   * <a id='resolve'></a>\n   *\n   * - **`resolve`** - {object.&lt;string, function&gt;=} - An optional map of dependencies which \n   *   should be injected into the controller. If any of these dependencies are promises, \n   *   the router will wait for them all to be resolved or one to be rejected before the \n   *   controller is instantiated. If all the promises are resolved successfully, the values \n   *   of the resolved promises are injected and $stateChangeSuccess event is fired. If any \n   *   of the promises are rejected the $stateChangeError event is fired. The map object is:\n   *   \n   *   - key - {string}: name of dependency to be injected into controller\n   *   - factory - {string|function}: If string then it is alias for service. Otherwise if function, \n   *     it is injected and return value it treated as dependency. If result is a promise, it is \n   *     resolved before its value is injected into controller.\n   *\n   * <a id='url'></a>\n   *\n   * - **`url`** - {string=} - A url with optional parameters. When a state is navigated or\n   *   transitioned to, the `$stateParams` service will be populated with any \n   *   parameters that were passed.\n   *\n   * <a id='params'></a>\n   *\n   * - **`params`** - {object=} - An array of parameter names or regular expressions. Only \n   *   use this within a state if you are not using url. Otherwise you can specify your\n   *   parameters within the url. When a state is navigated or transitioned to, the \n   *   $stateParams service will be populated with any parameters that were passed.\n   *\n   * <a id='views'></a>\n   *\n   * - **`views`** - {object=} - Use the views property to set up multiple views or to target views\n   *   manually/explicitly.\n   *\n   * <a id='abstract'></a>\n   *\n   * - **`abstract`** - {boolean=} - An abstract state will never be directly activated, \n   *   but can provide inherited properties to its common children states.\n   *\n   * <a id='onEnter'></a>\n   *\n   * - **`onEnter`** - {object=} - Callback function for when a state is entered. Good way\n   *   to trigger an action or dispatch an event, such as opening a dialog.\n   *\n   * <a id='onExit'></a>\n   *\n   * - **`onExit`** - {object=} - Callback function for when a state is exited. Good way to\n   *   trigger an action or dispatch an event, such as opening a dialog.\n   *\n   * <a id='reloadOnSearch'></a>\n   *\n   * - **`reloadOnSearch = true`** - {boolean=} - If `false`, will not retrigger the same state \n   *   just because a search/query parameter has changed (via $location.search() or $location.hash()). \n   *   Useful for when you'd like to modify $location.search() without triggering a reload.\n   *\n   * <a id='data'></a>\n   *\n   * - **`data`** - {object=} - Arbitrary data object, useful for custom configuration.\n   *\n   * @example\n   * <pre>\n   * // Some state name examples\n   *\n   * // stateName can be a single top-level name (must be unique).\n   * $stateProvider.state(\"home\", {});\n   *\n   * // Or it can be a nested state name. This state is a child of the \n   * // above \"home\" state.\n   * $stateProvider.state(\"home.newest\", {});\n   *\n   * // Nest states as deeply as needed.\n   * $stateProvider.state(\"home.newest.abc.xyz.inception\", {});\n   *\n   * // state() returns $stateProvider, so you can chain state declarations.\n   * $stateProvider\n   *   .state(\"home\", {})\n   *   .state(\"about\", {})\n   *   .state(\"contacts\", {});\n   * </pre>\n   *\n   * @param {string} name A unique state name, e.g. \"home\", \"about\", \"contacts\". \n   * To create a parent/child state use a dot, e.g. \"about.sales\", \"home.newest\".\n   * @param {object} definition State configuration object.\n   */\n  this.state = state;\n  function state(name, definition) {\n    /*jshint validthis: true */\n    if (isObject(name)) definition = name;\n    else definition.name = name;\n    registerState(definition);\n    return this;\n  }\n\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$state\n   *\n   * @requires $rootScope\n   * @requires $q\n   * @requires ui.router.state.$view\n   * @requires $injector\n   * @requires ui.router.util.$resolve\n   * @requires ui.router.state.$stateParams\n   *\n   * @property {object} params A param object, e.g. {sectionId: section.id)}, that \n   * you'd like to test against the current active state.\n   * @property {object} current A reference to the state's config object. However \n   * you passed it in. Useful for accessing custom data.\n   * @property {object} transition Currently pending transition. A promise that'll \n   * resolve or reject.\n   *\n   * @description\n   * `$state` service is responsible for representing states as well as transitioning\n   * between them. It also provides interfaces to ask for current state or even states\n   * you're coming from.\n   */\n  // $urlRouter is injected just to ensure it gets instantiated\n  this.$get = $get;\n  $get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$location', '$urlRouter', '$browser'];\n  function $get(   $rootScope,   $q,   $view,   $injector,   $resolve,   $stateParams,   $location,   $urlRouter,   $browser) {\n\n    var TransitionSuperseded = $q.reject(new Error('transition superseded'));\n    var TransitionPrevented = $q.reject(new Error('transition prevented'));\n    var TransitionAborted = $q.reject(new Error('transition aborted'));\n    var TransitionFailed = $q.reject(new Error('transition failed'));\n    var currentLocation = $location.url();\n    var baseHref = $browser.baseHref();\n\n    function syncUrl() {\n      if ($location.url() !== currentLocation) {\n        $location.url(currentLocation);\n        $location.replace();\n      }\n    }\n\n    root.locals = { resolve: null, globals: { $stateParams: {} } };\n    $state = {\n      params: {},\n      current: root.self,\n      $current: root,\n      transition: null\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#reload\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A method that force reloads the current state. All resolves are re-resolved, events are not re-fired, \n     * and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon).\n     *\n     * @example\n     * <pre>\n     * var app angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.reload = function(){\n     *     $state.reload();\n     *   }\n     * });\n     * </pre>\n     *\n     * `reload()` is just an alias for:\n     * <pre>\n     * $state.transitionTo($state.current, $stateParams, { \n     *   reload: true, inherit: false, notify: false \n     * });\n     * </pre>\n     */\n    $state.reload = function reload() {\n      $state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: false });\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#go\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Convenience method for transitioning to a new state. `$state.go` calls \n     * `$state.transitionTo` internally but automatically sets options to \n     * `{ location: true, inherit: true, relative: $state.$current, notify: true }`. \n     * This allows you to easily use an absolute or relative to path and specify \n     * only the parameters you'd like to update (while letting unspecified parameters \n     * inherit from the currently active ancestor states).\n     *\n     * @example\n     * <pre>\n     * var app = angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.changeState = function () {\n     *     $state.go('contact.detail');\n     *   };\n     * });\n     * </pre>\n     * <img src='../ngdoc_assets/StateGoExamples.png'/>\n     *\n     * @param {string} to Absolute state name or relative state path. Some examples:\n     *\n     * - `$state.go('contact.detail')` - will go to the `contact.detail` state\n     * - `$state.go('^')` - will go to a parent state\n     * - `$state.go('^.sibling')` - will go to a sibling state\n     * - `$state.go('.child.grandchild')` - will go to grandchild state\n     *\n     * @param {object=} params A map of the parameters that will be sent to the state, \n     * will populate $stateParams. Any parameters that are not specified will be inherited from currently \n     * defined parameters. This allows, for example, going to a sibling state that shares parameters\n     * specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.\n     * transitioning to a sibling will get you the parameters for all parents, transitioning to a child\n     * will get you all current parameters, etc.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`\n     *    will not. If string, must be `\"replace\"`, which will update url and also replace last history record.\n     * - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.\n     * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params \n     *    have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd\n     *    use this when you want to force a reload when *everything* is the same, including search params.\n     *\n     * @returns {promise} A promise representing the state of the new transition.\n     *\n     * Possible success values:\n     *\n     * - $state.current\n     *\n     * <br/>Possible rejection values:\n     *\n     * - 'transition superseded' - when a newer transition has been started after this one\n     * - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener\n     * - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or\n     *   when a `$stateNotFound` `event.retry` promise errors.\n     * - 'transition failed' - when a state has been unsuccessfully found after 2 tries.\n     * - *resolve error* - when an error has occurred with a `resolve`\n     *\n     */\n    $state.go = function go(to, params, options) {\n      return this.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#transitionTo\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}\n     * uses `transitionTo` internally. `$state.go` is recommended in most situations.\n     *\n     * @example\n     * <pre>\n     * var app = angular.module('app', ['ui.router']);\n     *\n     * app.controller('ctrl', function ($scope, $state) {\n     *   $scope.changeState = function () {\n     *     $state.transitionTo('contact.detail');\n     *   };\n     * });\n     * </pre>\n     *\n     * @param {string} to State name.\n     * @param {object=} toParams A map of the parameters that will be sent to the state,\n     * will populate $stateParams.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`\n     *    will not. If string, must be `\"replace\"`, which will update url and also replace last history record.\n     * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.\n     * - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params \n     *    have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd\n     *    use this when you want to force a reload when *everything* is the same, including search params.\n     *\n     * @returns {promise} A promise representing the state of the new transition. See\n     * {@link ui.router.state.$state#methods_go $state.go}.\n     */\n    $state.transitionTo = function transitionTo(to, toParams, options) {\n      toParams = toParams || {};\n      options = extend({\n        location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false\n      }, options || {});\n\n      var from = $state.$current, fromParams = $state.params, fromPath = from.path;\n      var evt, toState = findState(to, options.relative);\n\n      if (!isDefined(toState)) {\n        // Broadcast not found event and abort the transition if prevented\n        var redirect = { to: to, toParams: toParams, options: options };\n\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateNotFound\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when a requested state **cannot be found** using the provided state name during transition.\n         * The event is broadcast allowing any handlers a single chance to deal with the error (usually by\n         * lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,\n         * you can see its three properties in the example. You can use `event.preventDefault()` to abort the\n         * transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.\n         *\n         * @param {Object} event Event object.\n         * @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.\n         * @param {State} fromState Current state object.\n         * @param {Object} fromParams Current state params.\n         *\n         * @example\n         *\n         * <pre>\n         * // somewhere, assume lazy.state has not been defined\n         * $state.go(\"lazy.state\", {a:1, b:2}, {inherit:false});\n         *\n         * // somewhere else\n         * $scope.$on('$stateNotFound',\n         * function(event, unfoundState, fromState, fromParams){\n         *     console.log(unfoundState.to); // \"lazy.state\"\n         *     console.log(unfoundState.toParams); // {a:1, b:2}\n         *     console.log(unfoundState.options); // {inherit:false} + default options\n         * })\n         * </pre>\n         */\n        evt = $rootScope.$broadcast('$stateNotFound', redirect, from.self, fromParams);\n        if (evt.defaultPrevented) {\n          syncUrl();\n          return TransitionAborted;\n        }\n\n        // Allow the handler to return a promise to defer state lookup retry\n        if (evt.retry) {\n          if (options.$retry) {\n            syncUrl();\n            return TransitionFailed;\n          }\n          var retryTransition = $state.transition = $q.when(evt.retry);\n          retryTransition.then(function() {\n            if (retryTransition !== $state.transition) return TransitionSuperseded;\n            redirect.options.$retry = true;\n            return $state.transitionTo(redirect.to, redirect.toParams, redirect.options);\n          }, function() {\n            return TransitionAborted;\n          });\n          syncUrl();\n          return retryTransition;\n        }\n\n        // Always retry once if the $stateNotFound was not prevented\n        // (handles either redirect changed or state lazy-definition)\n        to = redirect.to;\n        toParams = redirect.toParams;\n        options = redirect.options;\n        toState = findState(to, options.relative);\n        if (!isDefined(toState)) {\n          if (options.relative) throw new Error(\"Could not resolve '\" + to + \"' from state '\" + options.relative + \"'\");\n          throw new Error(\"No such state '\" + to + \"'\");\n        }\n      }\n      if (toState[abstractKey]) throw new Error(\"Cannot transition to abstract state '\" + to + \"'\");\n      if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);\n      to = toState;\n\n      var toPath = to.path;\n\n      // Starting from the root of the path, keep all levels that haven't changed\n      var keep, state, locals = root.locals, toLocals = [];\n      for (keep = 0, state = toPath[keep];\n           state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams) && !options.reload;\n           keep++, state = toPath[keep]) {\n        locals = toLocals[keep] = state.locals;\n      }\n\n      // If we're going to the same state and all locals are kept, we've got nothing to do.\n      // But clear 'transition', as we still want to cancel any other pending transitions.\n      // TODO: We may not want to bump 'transition' if we're called from a location change that we've initiated ourselves,\n      // because we might accidentally abort a legitimate transition initiated from code?\n      if (shouldTriggerReload(to, from, locals, options) ) {\n        if ( to.self.reloadOnSearch !== false )\n          syncUrl();\n        $state.transition = null;\n        return $q.when($state.current);\n      }\n\n      // Normalize/filter parameters before we pass them to event handlers etc.\n      toParams = normalize(to.params, toParams || {});\n\n      // Broadcast start event and cancel the transition if requested\n      if (options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeStart\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when the state transition **begins**. You can use `event.preventDefault()`\n         * to prevent the transition from happening and then the transition promise will be\n         * rejected with a `'transition prevented'` value.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         *\n         * @example\n         *\n         * <pre>\n         * $rootScope.$on('$stateChangeStart',\n         * function(event, toState, toParams, fromState, fromParams){\n         *     event.preventDefault();\n         *     // transitionTo() promise will be rejected with\n         *     // a 'transition prevented' error\n         * })\n         * </pre>\n         */\n        evt = $rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams);\n        if (evt.defaultPrevented) {\n          syncUrl();\n          return TransitionPrevented;\n        }\n      }\n\n      // Resolve locals for the remaining states, but don't update any global state just\n      // yet -- if anything fails to resolve the current state needs to remain untouched.\n      // We also set up an inheritance chain for the locals here. This allows the view directive\n      // to quickly look up the correct definition for each view in the current state. Even\n      // though we create the locals object itself outside resolveState(), it is initially\n      // empty and gets filled asynchronously. We need to keep track of the promise for the\n      // (fully resolved) current locals, and pass this down the chain.\n      var resolved = $q.when(locals);\n      for (var l=keep; l<toPath.length; l++, state=toPath[l]) {\n        locals = toLocals[l] = inherit(locals);\n        resolved = resolveState(state, toParams, state===to, resolved, locals);\n      }\n\n      // Once everything is resolved, we are ready to perform the actual transition\n      // and return a promise for the new state. We also keep track of what the\n      // current promise is, so that we can detect overlapping transitions and\n      // keep only the outcome of the last transition.\n      var transition = $state.transition = resolved.then(function () {\n        var l, entering, exiting;\n\n        if ($state.transition !== transition) return TransitionSuperseded;\n\n        // Exit 'from' states not kept\n        for (l=fromPath.length-1; l>=keep; l--) {\n          exiting = fromPath[l];\n          if (exiting.self.onExit) {\n            $injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);\n          }\n          exiting.locals = null;\n        }\n\n        // Enter 'to' states not kept\n        for (l=keep; l<toPath.length; l++) {\n          entering = toPath[l];\n          entering.locals = toLocals[l];\n          if (entering.self.onEnter) {\n            $injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);\n          }\n        }\n\n        // Run it again, to catch any transitions in callbacks\n        if ($state.transition !== transition) return TransitionSuperseded;\n\n        // Update globals in $state\n        $state.$current = to;\n        $state.current = to.self;\n        $state.params = toParams;\n        copy($state.params, $stateParams);\n        $state.transition = null;\n\n        // Update $location\n        var toNav = to.navigable;\n        if (options.location && toNav) {\n          $location.url(toNav.url.format(toNav.locals.globals.$stateParams));\n\n          if (options.location === 'replace') {\n            $location.replace();\n          }\n        }\n\n        if (options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeSuccess\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired once the state transition is **complete**.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         */\n          $rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);\n        }\n        currentLocation = $location.url();\n\n        return $state.current;\n      }, function (error) {\n        if ($state.transition !== transition) return TransitionSuperseded;\n\n        $state.transition = null;\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$stateChangeError\n         * @eventOf ui.router.state.$state\n         * @eventType broadcast on root scope\n         * @description\n         * Fired when an **error occurs** during transition. It's important to note that if you\n         * have any errors in your resolve functions (javascript errors, non-existent services, etc)\n         * they will not throw traditionally. You must listen for this $stateChangeError event to\n         * catch **ALL** errors.\n         *\n         * @param {Object} event Event object.\n         * @param {State} toState The state being transitioned to.\n         * @param {Object} toParams The params supplied to the `toState`.\n         * @param {State} fromState The current state, pre-transition.\n         * @param {Object} fromParams The params supplied to the `fromState`.\n         * @param {Error} error The resolve error object.\n         */\n        $rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);\n        syncUrl();\n\n        return $q.reject(error);\n      });\n\n      return transition;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#is\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Similar to {@link ui.router.state.$state#methods_includes $state.includes},\n     * but only checks for the full state name. If params is supplied then it will be \n     * tested for strict equality against the current active params object, so all params \n     * must match with none missing and no extras.\n     *\n     * @example\n     * <pre>\n     * $state.is('contact.details.item'); // returns true\n     * $state.is(contactDetailItemStateObject); // returns true\n     *\n     * // everything else would return false\n     * </pre>\n     *\n     * @param {string|object} stateName The state name or state object you'd like to check.\n     * @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like \n     * to test against the current active state.\n     * @returns {boolean} Returns true if it is the state.\n     */\n    $state.is = function is(stateOrName, params) {\n      var state = findState(stateOrName);\n\n      if (!isDefined(state)) {\n        return undefined;\n      }\n\n      if ($state.$current !== state) {\n        return false;\n      }\n\n      return isDefined(params) && params !== null ? angular.equals($stateParams, params) : true;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#includes\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A method to determine if the current active state is equal to or is the child of the \n     * state stateName. If any params are passed then they will be tested for a match as well.\n     * Not all the parameters need to be passed, just the ones you'd like to test for equality.\n     *\n     * @example\n     * <pre>\n     * $state.$current.name = 'contacts.details.item';\n     *\n     * $state.includes(\"contacts\"); // returns true\n     * $state.includes(\"contacts.details\"); // returns true\n     * $state.includes(\"contacts.details.item\"); // returns true\n     * $state.includes(\"contacts.list\"); // returns false\n     * $state.includes(\"about\"); // returns false\n     * </pre>\n     *\n     * @description\n     * Basic globing patterns will also work.\n     *\n     * @example\n     * <pre>\n     * $state.$current.name = 'contacts.details.item.url';\n     *\n     * $state.includes(\"*.details.*.*\"); // returns true\n     * $state.includes(\"*.details.**\"); // returns true\n     * $state.includes(\"**.item.**\"); // returns true\n     * $state.includes(\"*.details.item.url\"); // returns true\n     * $state.includes(\"*.details.*.url\"); // returns true\n     * $state.includes(\"*.details.*\"); // returns false\n     * $state.includes(\"item.**\"); // returns false\n     * </pre>\n     *\n     * @param {string} stateOrName A partial name to be searched for within the current state name.\n     * @param {object} params A param object, e.g. `{sectionId: section.id}`, \n     * that you'd like to test against the current active state.\n     * @returns {boolean} Returns true if it does include the state\n     */\n\n    $state.includes = function includes(stateOrName, params) {\n      if (isString(stateOrName) && isGlob(stateOrName)) {\n        if (doesStateMatchGlob(stateOrName)) {\n          stateOrName = $state.$current.name;\n        } else {\n          return false;\n        }\n      }\n\n      var state = findState(stateOrName);\n      if (!isDefined(state)) {\n        return undefined;\n      }\n\n      if (!isDefined($state.$current.includes[state.name])) {\n        return false;\n      }\n\n      var validParams = true;\n      angular.forEach(params, function(value, key) {\n        if (!isDefined($stateParams[key]) || $stateParams[key] !== value) {\n          validParams = false;\n        }\n      });\n      return validParams;\n    };\n\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#href\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * A url generation method that returns the compiled url for the given state populated with the given params.\n     *\n     * @example\n     * <pre>\n     * expect($state.href(\"about.person\", { person: \"bob\" })).toEqual(\"/about/bob\");\n     * </pre>\n     *\n     * @param {string|object} stateOrName The state name or state object you'd like to generate a url from.\n     * @param {object=} params An object of parameter values to fill the state's required parameters.\n     * @param {object=} options Options object. The options are:\n     *\n     * - **`lossy`** - {boolean=true} -  If true, and if there is no url associated with the state provided in the\n     *    first parameter, then the constructed href url will be built from the first navigable ancestor (aka\n     *    ancestor with a valid url).\n     * - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.\n     * - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'), \n     *    defines which state to be relative from.\n     * - **`absolute`** - {boolean=false},  If true will generate an absolute url, e.g. \"http://www.example.com/fullurl\".\n     * \n     * @returns {string} compiled state url\n     */\n    $state.href = function href(stateOrName, params, options) {\n      options = extend({ lossy: true, inherit: false, absolute: false, relative: $state.$current }, options || {});\n      var state = findState(stateOrName, options.relative);\n      if (!isDefined(state)) return null;\n\n      params = inheritParams($stateParams, params || {}, $state.$current, state);\n      var nav = (state && options.lossy) ? state.navigable : state;\n      var url = (nav && nav.url) ? nav.url.format(normalize(state.params, params || {})) : null;\n      if (!$locationProvider.html5Mode() && url) {\n        url = \"#\" + $locationProvider.hashPrefix() + url;\n      }\n\n      if (baseHref !== '/') {\n        if ($locationProvider.html5Mode()) {\n          url = baseHref.slice(0, -1) + url;\n        } else if (options.absolute){\n          url = baseHref.slice(1) + url;\n        }\n      }\n\n      if (options.absolute && url) {\n        url = $location.protocol() + '://' + \n              $location.host() + \n              ($location.port() == 80 || $location.port() == 443 ? '' : ':' + $location.port()) + \n              (!$locationProvider.html5Mode() && url ? '/' : '') + \n              url;\n      }\n      return url;\n    };\n\n    /**\n     * @ngdoc function\n     * @name ui.router.state.$state#get\n     * @methodOf ui.router.state.$state\n     *\n     * @description\n     * Returns the state configuration object for any specific state or all states.\n     *\n     * @param {string|object=} stateOrName If provided, will only get the config for\n     * the requested state. If not provided, returns an array of ALL state configs.\n     * @returns {object|array} State configuration object or array of all objects.\n     */\n    $state.get = function (stateOrName, context) {\n      if (!isDefined(stateOrName)) {\n        var list = [];\n        forEach(states, function(state) { list.push(state.self); });\n        return list;\n      }\n      var state = findState(stateOrName, context);\n      return (state && state.self) ? state.self : null;\n    };\n\n    function resolveState(state, params, paramsAreFiltered, inherited, dst) {\n      // Make a restricted $stateParams with only the parameters that apply to this state if\n      // necessary. In addition to being available to the controller and onEnter/onExit callbacks,\n      // we also need $stateParams to be available for any $injector calls we make during the\n      // dependency resolution process.\n      var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params, params);\n      var locals = { $stateParams: $stateParams };\n\n      // Resolve 'global' dependencies for the state, i.e. those not specific to a view.\n      // We're also including $stateParams in this; that way the parameters are restricted\n      // to the set that should be visible to the state, and are independent of when we update\n      // the global $state and $stateParams values.\n      dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);\n      var promises = [ dst.resolve.then(function (globals) {\n        dst.globals = globals;\n      }) ];\n      if (inherited) promises.push(inherited);\n\n      // Resolve template and dependencies for all views.\n      forEach(state.views, function (view, name) {\n        var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});\n        injectables.$template = [ function () {\n          return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: false }) || '';\n        }];\n\n        promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {\n          // References to the controller (only instantiated at link time)\n          if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {\n            var injectLocals = angular.extend({}, injectables, locals);\n            result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);\n          } else {\n            result.$$controller = view.controller;\n          }\n          // Provide access to the state itself for internal use\n          result.$$state = state;\n          result.$$controllerAs = view.controllerAs;\n          dst[name] = result;\n        }));\n      });\n\n      // Wait for all the promises and then return the activation object\n      return $q.all(promises).then(function (values) {\n        return dst;\n      });\n    }\n\n    return $state;\n  }\n\n  function shouldTriggerReload(to, from, locals, options) {\n    if ( to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false)) ) {\n      return true;\n    }\n  }\n}\n\nangular.module('ui.router.state')\n  .value('$stateParams', {})\n  .provider('$state', $StateProvider);\n\n\n$ViewProvider.$inject = [];\nfunction $ViewProvider() {\n\n  this.$get = $get;\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$view\n   *\n   * @requires ui.router.util.$templateFactory\n   * @requires $rootScope\n   *\n   * @description\n   *\n   */\n  $get.$inject = ['$rootScope', '$templateFactory'];\n  function $get(   $rootScope,   $templateFactory) {\n    return {\n      // $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })\n      /**\n       * @ngdoc function\n       * @name ui.router.state.$view#load\n       * @methodOf ui.router.state.$view\n       *\n       * @description\n       *\n       * @param {string} name name\n       * @param {object} options option object.\n       */\n      load: function load(name, options) {\n        var result, defaults = {\n          template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}\n        };\n        options = extend(defaults, options);\n\n        if (options.view) {\n          result = $templateFactory.fromConfig(options.view, options.params, options.locals);\n        }\n        if (result && options.notify) {\n        /**\n         * @ngdoc event\n         * @name ui.router.state.$state#$viewContentLoading\n         * @eventOf ui.router.state.$view\n         * @eventType broadcast on root scope\n         * @description\n         *\n         * Fired once the view **begins loading**, *before* the DOM is rendered.\n         *\n         * @param {Object} event Event object.\n         * @param {Object} viewConfig The view config properties (template, controller, etc).\n         *\n         * @example\n         *\n         * <pre>\n         * $scope.$on('$viewContentLoading',\n         * function(event, viewConfig){\n         *     // Access to all the view config properties.\n         *     // and one special property 'targetView'\n         *     // viewConfig.targetView\n         * });\n         * </pre>\n         */\n          $rootScope.$broadcast('$viewContentLoading', options);\n        }\n        return result;\n      }\n    };\n  }\n}\n\nangular.module('ui.router.state').provider('$view', $ViewProvider);\n\n/**\n * @ngdoc object\n * @name ui.router.state.$uiViewScrollProvider\n *\n * @description\n * Provider that returns the {@link ui.router.state.$uiViewScroll} service function.\n */\nfunction $ViewScrollProvider() {\n\n  var useAnchorScroll = false;\n\n  /**\n   * @ngdoc function\n   * @name ui.router.state.$uiViewScrollProvider#useAnchorScroll\n   * @methodOf ui.router.state.$uiViewScrollProvider\n   *\n   * @description\n   * Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for\n   * scrolling based on the url anchor.\n   */\n  this.useAnchorScroll = function () {\n    useAnchorScroll = true;\n  };\n\n  /**\n   * @ngdoc object\n   * @name ui.router.state.$uiViewScroll\n   *\n   * @requires $anchorScroll\n   * @requires $timeout\n   *\n   * @description\n   * When called with a jqLite element, it scrolls the element into view (after a\n   * `$timeout` so the DOM has time to refresh).\n   *\n   * If you prefer to rely on `$anchorScroll` to scroll the view to the anchor,\n   * this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}.\n   */\n  this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) {\n    if (useAnchorScroll) {\n      return $anchorScroll;\n    }\n\n    return function ($element) {\n      $timeout(function () {\n        $element[0].scrollIntoView();\n      }, 0, false);\n    };\n  }];\n}\n\nangular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider);\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-view\n *\n * @requires ui.router.state.$state\n * @requires $compile\n * @requires $controller\n * @requires $injector\n * @requires ui.router.state.$uiViewScroll\n * @requires $document\n *\n * @restrict ECA\n *\n * @description\n * The ui-view directive tells $state where to place your templates.\n *\n * @param {string=} ui-view A view name. The name should be unique amongst the other views in the\n * same state. You can have views of the same name that live in different states.\n *\n * @param {string=} autoscroll It allows you to set the scroll behavior of the browser window\n * when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll\n * service, {@link ui.router.state.$uiViewScroll}. This custom service let's you\n * scroll ui-view elements into view when they are populated during a state activation.\n *\n * *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll)\n * functionality, call `$uiViewScrollProvider.useAnchorScroll()`.*\n *\n * @param {string=} onload Expression to evaluate whenever the view updates.\n * \n * @example\n * A view can be unnamed or named. \n * <pre>\n * <!-- Unnamed -->\n * <div ui-view></div> \n * \n * <!-- Named -->\n * <div ui-view=\"viewName\"></div>\n * </pre>\n *\n * You can only have one unnamed view within any template (or root html). If you are only using a \n * single view and it is unnamed then you can populate it like so:\n * <pre>\n * <div ui-view></div> \n * $stateProvider.state(\"home\", {\n *   template: \"<h1>HELLO!</h1>\"\n * })\n * </pre>\n * \n * The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`}\n * config property, by name, in this case an empty name:\n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     }\n *   }    \n * })\n * </pre>\n * \n * But typically you'll only use the views property if you name your view or have more than one view \n * in the same template. There's not really a compelling reason to name a view if its the only one, \n * but you could if you wanted, like so:\n * <pre>\n * <div ui-view=\"main\"></div>\n * </pre> \n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"main\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     }\n *   }    \n * })\n * </pre>\n * \n * Really though, you'll use views to set up multiple views:\n * <pre>\n * <div ui-view></div>\n * <div ui-view=\"chart\"></div> \n * <div ui-view=\"data\"></div> \n * </pre>\n * \n * <pre>\n * $stateProvider.state(\"home\", {\n *   views: {\n *     \"\": {\n *       template: \"<h1>HELLO!</h1>\"\n *     },\n *     \"chart\": {\n *       template: \"<chart_thing/>\"\n *     },\n *     \"data\": {\n *       template: \"<data_thing/>\"\n *     }\n *   }    \n * })\n * </pre>\n *\n * Examples for `autoscroll`:\n *\n * <pre>\n * <!-- If autoscroll present with no expression,\n *      then scroll ui-view into view -->\n * <ui-view autoscroll/>\n *\n * <!-- If autoscroll present with valid expression,\n *      then scroll ui-view into view if expression evaluates to true -->\n * <ui-view autoscroll='true'/>\n * <ui-view autoscroll='false'/>\n * <ui-view autoscroll='scopeVariable'/>\n * </pre>\n */\n$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll'];\nfunction $ViewDirective(   $state,   $injector,   $uiViewScroll) {\n\n  function getService() {\n    return ($injector.has) ? function(service) {\n      return $injector.has(service) ? $injector.get(service) : null;\n    } : function(service) {\n      try {\n        return $injector.get(service);\n      } catch (e) {\n        return null;\n      }\n    };\n  }\n\n  var service = getService(),\n      $animator = service('$animator'),\n      $animate = service('$animate');\n\n  // Returns a set of DOM manipulation functions based on which Angular version\n  // it should use\n  function getRenderer(attrs, scope) {\n    var statics = function() {\n      return {\n        enter: function (element, target, cb) { target.after(element); cb(); },\n        leave: function (element, cb) { element.remove(); cb(); }\n      };\n    };\n\n    if ($animate) {\n      return {\n        enter: function(element, target, cb) { $animate.enter(element, null, target, cb); },\n        leave: function(element, cb) { $animate.leave(element, cb); }\n      };\n    }\n\n    if ($animator) {\n      var animate = $animator && $animator(scope, attrs);\n\n      return {\n        enter: function(element, target, cb) {animate.enter(element, null, target); cb(); },\n        leave: function(element, cb) { animate.leave(element); cb(); }\n      };\n    }\n\n    return statics();\n  }\n\n  var directive = {\n    restrict: 'ECA',\n    terminal: true,\n    priority: 400,\n    transclude: 'element',\n    compile: function (tElement, tAttrs, $transclude) {\n      return function (scope, $element, attrs) {\n        var previousEl, currentEl, currentScope, latestLocals,\n            onloadExp     = attrs.onload || '',\n            autoScrollExp = attrs.autoscroll,\n            renderer      = getRenderer(attrs, scope);\n\n        scope.$on('$stateChangeSuccess', function() {\n          updateView(false);\n        });\n        scope.$on('$viewContentLoading', function() {\n          updateView(false);\n        });\n\n        updateView(true);\n\n        function cleanupLastView() {\n          if (previousEl) {\n            previousEl.remove();\n            previousEl = null;\n          }\n\n          if (currentScope) {\n            currentScope.$destroy();\n            currentScope = null;\n          }\n\n          if (currentEl) {\n            renderer.leave(currentEl, function() {\n              previousEl = null;\n            });\n\n            previousEl = currentEl;\n            currentEl = null;\n          }\n        }\n\n        function updateView(firstTime) {\n          var newScope        = scope.$new(),\n              name            = currentEl && currentEl.data('$uiViewName'),\n              previousLocals  = name && $state.$current && $state.$current.locals[name];\n\n          if (!firstTime && previousLocals === latestLocals) return; // nothing to do\n\n          var clone = $transclude(newScope, function(clone) {\n            renderer.enter(clone, $element, function onUiViewEnter() {\n              if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) {\n                $uiViewScroll(clone);\n              }\n            });\n            cleanupLastView();\n          });\n\n          latestLocals = $state.$current.locals[clone.data('$uiViewName')];\n\n          currentEl = clone;\n          currentScope = newScope;\n          /**\n           * @ngdoc event\n           * @name ui.router.state.directive:ui-view#$viewContentLoaded\n           * @eventOf ui.router.state.directive:ui-view\n           * @eventType emits on ui-view directive scope\n           * @description           *\n           * Fired once the view is **loaded**, *after* the DOM is rendered.\n           *\n           * @param {Object} event Event object.\n           */\n          currentScope.$emit('$viewContentLoaded');\n          currentScope.$eval(onloadExp);\n        }\n      };\n    }\n  };\n\n  return directive;\n}\n\n$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state'];\nfunction $ViewDirectiveFill ($compile, $controller, $state) {\n  return {\n    restrict: 'ECA',\n    priority: -400,\n    compile: function (tElement) {\n      var initial = tElement.html();\n      return function (scope, $element, attrs) {\n        var name      = attrs.uiView || attrs.name || '',\n            inherited = $element.inheritedData('$uiView');\n\n        if (name.indexOf('@') < 0) {\n          name = name + '@' + (inherited ? inherited.state.name : '');\n        }\n\n        $element.data('$uiViewName', name);\n\n        var current = $state.$current,\n            locals  = current && current.locals[name];\n\n        if (! locals) {\n          return;\n        }\n\n        $element.data('$uiView', { name: name, state: locals.$$state });\n        $element.html(locals.$template ? locals.$template : initial);\n\n        var link = $compile($element.contents());\n\n        if (locals.$$controller) {\n          locals.$scope = scope;\n          var controller = $controller(locals.$$controller, locals);\n          if (locals.$$controllerAs) {\n            scope[locals.$$controllerAs] = controller;\n          }\n          $element.data('$ngControllerController', controller);\n          $element.children().data('$ngControllerController', controller);\n        }\n\n        link(scope);\n      };\n    }\n  };\n}\n\nangular.module('ui.router.state').directive('uiView', $ViewDirective);\nangular.module('ui.router.state').directive('uiView', $ViewDirectiveFill);\n\nfunction parseStateRef(ref) {\n  var parsed = ref.replace(/\\n/g, \" \").match(/^([^(]+?)\\s*(\\((.*)\\))?$/);\n  if (!parsed || parsed.length !== 4) throw new Error(\"Invalid state ref '\" + ref + \"'\");\n  return { state: parsed[1], paramExpr: parsed[3] || null };\n}\n\nfunction stateContext(el) {\n  var stateData = el.parent().inheritedData('$uiView');\n\n  if (stateData && stateData.state && stateData.state.name) {\n    return stateData.state;\n  }\n}\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-sref\n *\n * @requires ui.router.state.$state\n * @requires $timeout\n *\n * @restrict A\n *\n * @description\n * A directive that binds a link (`<a>` tag) to a state. If the state has an associated \n * URL, the directive will automatically generate & update the `href` attribute via \n * the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking \n * the link will trigger a state transition with optional parameters. \n *\n * Also middle-clicking, right-clicking, and ctrl-clicking on the link will be \n * handled natively by the browser.\n *\n * You can also use relative state paths within ui-sref, just like the relative \n * paths passed to `$state.go()`. You just need to be aware that the path is relative\n * to the state that the link lives in, in other words the state that loaded the \n * template containing the link.\n *\n * You can specify options to pass to {@link ui.router.state.$state#go $state.go()}\n * using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`,\n * and `reload`.\n *\n * @example\n * Here's an example of how you'd use ui-sref and how it would compile. If you have the \n * following template:\n * <pre>\n * <a ui-sref=\"home\">Home</a> | <a ui-sref=\"about\">About</a>\n * \n * <ul>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a ui-sref=\"contacts.detail({ id: contact.id })\">{{ contact.name }}</a>\n *     </li>\n * </ul>\n * </pre>\n * \n * Then the compiled html would be (assuming Html5Mode is off):\n * <pre>\n * <a href=\"#/home\" ui-sref=\"home\">Home</a> | <a href=\"#/about\" ui-sref=\"about\">About</a>\n * \n * <ul>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/1\" ui-sref=\"contacts.detail({ id: contact.id })\">Joe</a>\n *     </li>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/2\" ui-sref=\"contacts.detail({ id: contact.id })\">Alice</a>\n *     </li>\n *     <li ng-repeat=\"contact in contacts\">\n *         <a href=\"#/contacts/3\" ui-sref=\"contacts.detail({ id: contact.id })\">Bob</a>\n *     </li>\n * </ul>\n *\n * <a ui-sref=\"home\" ui-sref-opts=\"{reload: true}\">Home</a>\n * </pre>\n *\n * @param {string} ui-sref 'stateName' can be any valid absolute or relative state\n * @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#go $state.go()}\n */\n$StateRefDirective.$inject = ['$state', '$timeout'];\nfunction $StateRefDirective($state, $timeout) {\n  var allowedOptions = ['location', 'inherit', 'reload'];\n\n  return {\n    restrict: 'A',\n    require: '?^uiSrefActive',\n    link: function(scope, element, attrs, uiSrefActive) {\n      var ref = parseStateRef(attrs.uiSref);\n      var params = null, url = null, base = stateContext(element) || $state.$current;\n      var isForm = element[0].nodeName === \"FORM\";\n      var attr = isForm ? \"action\" : \"href\", nav = true;\n\n      var options = {\n        relative: base\n      };\n      var optionsOverride = scope.$eval(attrs.uiSrefOpts) || {};\n      angular.forEach(allowedOptions, function(option) {\n        if (option in optionsOverride) {\n          options[option] = optionsOverride[option];\n        }\n      });\n\n      var update = function(newVal) {\n        if (newVal) params = newVal;\n        if (!nav) return;\n\n        var newHref = $state.href(ref.state, params, options);\n\n        if (uiSrefActive) {\n          uiSrefActive.$$setStateInfo(ref.state, params);\n        }\n        if (!newHref) {\n          nav = false;\n          return false;\n        }\n        element[0][attr] = newHref;\n      };\n\n      if (ref.paramExpr) {\n        scope.$watch(ref.paramExpr, function(newVal, oldVal) {\n          if (newVal !== params) update(newVal);\n        }, true);\n        params = scope.$eval(ref.paramExpr);\n      }\n      update();\n\n      if (isForm) return;\n\n      element.bind(\"click\", function(e) {\n        var button = e.which || e.button;\n        if ( !(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr('target')) ) {\n          // HACK: This is to allow ng-clicks to be processed before the transition is initiated:\n          $timeout(function() {\n            $state.go(ref.state, params, options);\n          });\n          e.preventDefault();\n        }\n      });\n    }\n  };\n}\n\n/**\n * @ngdoc directive\n * @name ui.router.state.directive:ui-sref-active\n *\n * @requires ui.router.state.$state\n * @requires ui.router.state.$stateParams\n * @requires $interpolate\n *\n * @restrict A\n *\n * @description\n * A directive working alongside ui-sref to add classes to an element when the \n * related ui-sref directive's state is active, and removing them when it is inactive.\n * The primary use-case is to simplify the special appearance of navigation menus \n * relying on `ui-sref`, by having the \"active\" state's menu button appear different,\n * distinguishing it from the inactive menu items.\n *\n * @example\n * Given the following template:\n * <pre>\n * <ul>\n *   <li ui-sref-active=\"active\" class=\"item\">\n *     <a href ui-sref=\"app.user({user: 'bilbobaggins'})\">@bilbobaggins</a>\n *   </li>\n * </ul>\n * </pre>\n * \n * When the app state is \"app.user\", and contains the state parameter \"user\" with value \"bilbobaggins\", \n * the resulting HTML will appear as (note the 'active' class):\n * <pre>\n * <ul>\n *   <li ui-sref-active=\"active\" class=\"item active\">\n *     <a ui-sref=\"app.user({user: 'bilbobaggins'})\" href=\"/users/bilbobaggins\">@bilbobaggins</a>\n *   </li>\n * </ul>\n * </pre>\n * \n * The class name is interpolated **once** during the directives link time (any further changes to the \n * interpolated value are ignored). \n * \n * Multiple classes may be specified in a space-separated format:\n * <pre>\n * <ul>\n *   <li ui-sref-active='class1 class2 class3'>\n *     <a ui-sref=\"app.user\">link</a>\n *   </li>\n * </ul>\n * </pre>\n */\n$StateActiveDirective.$inject = ['$state', '$stateParams', '$interpolate'];\nfunction $StateActiveDirective($state, $stateParams, $interpolate) {\n  return {\n    restrict: \"A\",\n    controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n      var state, params, activeClass;\n\n      // There probably isn't much point in $observing this\n      activeClass = $interpolate($attrs.uiSrefActive || '', false)($scope);\n\n      // Allow uiSref to communicate with uiSrefActive\n      this.$$setStateInfo = function(newState, newParams) {\n        state = $state.get(newState, stateContext($element));\n        params = newParams;\n        update();\n      };\n\n      $scope.$on('$stateChangeSuccess', update);\n\n      // Update route state\n      function update() {\n        if ($state.$current.self === state && matchesParams()) {\n          $element.addClass(activeClass);\n        } else {\n          $element.removeClass(activeClass);\n        }\n      }\n\n      function matchesParams() {\n        return !params || equalForKeys(params, $stateParams);\n      }\n    }]\n  };\n}\n\nangular.module('ui.router.state')\n  .directive('uiSref', $StateRefDirective)\n  .directive('uiSrefActive', $StateActiveDirective);\n\n/**\n * @ngdoc filter\n * @name ui.router.state.filter:isState\n *\n * @requires ui.router.state.$state\n *\n * @description\n * Translates to {@link ui.router.state.$state#methods_is $state.is(\"stateName\")}.\n */\n$IsStateFilter.$inject = ['$state'];\nfunction $IsStateFilter($state) {\n  return function(state) {\n    return $state.is(state);\n  };\n}\n\n/**\n * @ngdoc filter\n * @name ui.router.state.filter:includedByState\n *\n * @requires ui.router.state.$state\n *\n * @description\n * Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}.\n */\n$IncludedByStateFilter.$inject = ['$state'];\nfunction $IncludedByStateFilter($state) {\n  return function(state) {\n    return $state.includes(state);\n  };\n}\n\nangular.module('ui.router.state')\n  .filter('isState', $IsStateFilter)\n  .filter('includedByState', $IncludedByStateFilter);\n\n/*\n * @ngdoc object\n * @name ui.router.compat.$routeProvider\n *\n * @requires ui.router.state.$stateProvider\n * @requires ui.router.router.$urlRouterProvider\n *\n * @description\n * `$routeProvider` of the `ui.router.compat` module overwrites the existing\n * `routeProvider` from the core. This is done to provide compatibility between\n * the UI Router and the core router.\n *\n * It also provides a `when()` method to register routes that map to certain urls.\n * Behind the scenes it actually delegates either to \n * {@link ui.router.router.$urlRouterProvider $urlRouterProvider} or to the \n * {@link ui.router.state.$stateProvider $stateProvider} to postprocess the given \n * router definition object.\n */\n$RouteProvider.$inject = ['$stateProvider', '$urlRouterProvider'];\nfunction $RouteProvider(  $stateProvider,    $urlRouterProvider) {\n\n  var routes = [];\n\n  onEnterRoute.$inject = ['$$state'];\n  function onEnterRoute(   $$state) {\n    /*jshint validthis: true */\n    this.locals = $$state.locals.globals;\n    this.params = this.locals.$stateParams;\n  }\n\n  function onExitRoute() {\n    /*jshint validthis: true */\n    this.locals = null;\n    this.params = null;\n  }\n\n  this.when = when;\n  /*\n   * @ngdoc function\n   * @name ui.router.compat.$routeProvider#when\n   * @methodOf ui.router.compat.$routeProvider\n   *\n   * @description\n   * Registers a route with a given route definition object. The route definition\n   * object has the same interface the angular core route definition object has.\n   * \n   * @example\n   * <pre>\n   * var app = angular.module('app', ['ui.router.compat']);\n   *\n   * app.config(function ($routeProvider) {\n   *   $routeProvider.when('home', {\n   *     controller: function () { ... },\n   *     templateUrl: 'path/to/template'\n   *   });\n   * });\n   * </pre>\n   *\n   * @param {string} url URL as string\n   * @param {object} route Route definition object\n   *\n   * @return {object} $routeProvider - $routeProvider instance\n   */\n  function when(url, route) {\n    /*jshint validthis: true */\n    if (route.redirectTo != null) {\n      // Redirect, configure directly on $urlRouterProvider\n      var redirect = route.redirectTo, handler;\n      if (isString(redirect)) {\n        handler = redirect; // leave $urlRouterProvider to handle\n      } else if (isFunction(redirect)) {\n        // Adapt to $urlRouterProvider API\n        handler = function (params, $location) {\n          return redirect(params, $location.path(), $location.search());\n        };\n      } else {\n        throw new Error(\"Invalid 'redirectTo' in when()\");\n      }\n      $urlRouterProvider.when(url, handler);\n    } else {\n      // Regular route, configure as state\n      $stateProvider.state(inherit(route, {\n        parent: null,\n        name: 'route:' + encodeURIComponent(url),\n        url: url,\n        onEnter: onEnterRoute,\n        onExit: onExitRoute\n      }));\n    }\n    routes.push(route);\n    return this;\n  }\n\n  /*\n   * @ngdoc object\n   * @name ui.router.compat.$route\n   *\n   * @requires ui.router.state.$state\n   * @requires $rootScope\n   * @requires $routeParams\n   *\n   * @property {object} routes - Array of registered routes.\n   * @property {object} params - Current route params as object.\n   * @property {string} current - Name of the current route.\n   *\n   * @description\n   * The `$route` service provides interfaces to access defined routes. It also let's\n   * you access route params through `$routeParams` service, so you have fully\n   * control over all the stuff you would actually get from angular's core `$route`\n   * service.\n   */\n  this.$get = $get;\n  $get.$inject = ['$state', '$rootScope', '$routeParams'];\n  function $get(   $state,   $rootScope,   $routeParams) {\n\n    var $route = {\n      routes: routes,\n      params: $routeParams,\n      current: undefined\n    };\n\n    function stateAsRoute(state) {\n      return (state.name !== '') ? state : undefined;\n    }\n\n    $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {\n      $rootScope.$broadcast('$routeChangeStart', stateAsRoute(to), stateAsRoute(from));\n    });\n\n    $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {\n      $route.current = stateAsRoute(to);\n      $rootScope.$broadcast('$routeChangeSuccess', stateAsRoute(to), stateAsRoute(from));\n      copy(toParams, $route.params);\n    });\n\n    $rootScope.$on('$stateChangeError', function (ev, to, toParams, from, fromParams, error) {\n      $rootScope.$broadcast('$routeChangeError', stateAsRoute(to), stateAsRoute(from), error);\n    });\n\n    return $route;\n  }\n}\n\nangular.module('ui.router.compat')\n  .provider('$route', $RouteProvider)\n  .directive('ngView', $ViewDirective);\n})(window, window.angular);"
  },
  {
    "path": "works/js/lib/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v1.9.0\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-1-14\n */\n(function( window, undefined ) {\n\"use strict\";\nvar\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tdocument = window.document,\n\tlocation = window.location,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.9.0\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler and self cleanup method\n\tDOMContentLoaded = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\t\t\tjQuery.ready();\n\t\t} else if ( document.readyState === \"complete\" ) {\n\t\t\t// we're here because readyState === \"complete\" in oldIE\n\t\t\t// which is good enough for us to call the dom ready!\n\t\t\tdocument.detachEvent( \"onreadystatechange\", DOMContentLoaded );\n\t\t\tjQuery.ready();\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\t// The number of elements contained in the matched element set\n\tsize: function() {\n\t\treturn this.length;\n\t},\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\n\t\tvar key;\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar tmp, args, proxy;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", DOMContentLoaded, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", jQuery.ready, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", DOMContentLoaded );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", jQuery.ready );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Control if a given callback is in the list\n\t\t\thas: function( fn ) {\n\t\t\t\treturn jQuery.inArray( fn, list ) > -1;\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\targs = args || [];\n\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function() {\n\n\tvar support, all, a, select, opt, input, fragment, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Support tests won't run in some limited or non-browser environments\n\tall = div.getElementsByTagName(\"*\");\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !all || !a || !all.length ) {\n\t\treturn {};\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\tsupport = {\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: div.firstChild.nodeType === 3,\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test( a.getAttribute(\"style\") ),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: a.getAttribute(\"href\") === \"/a\",\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.5/.test( a.style.opacity ),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\t\tcheckOn: !!input.value,\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Tests for enctype support on a form (#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\t\tboxModel: document.compatMode === \"CSS1Compat\",\n\n\t\t// Will be defined later\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tboxSizingReliable: true,\n\t\tpixelPosition: false\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\t\tsupport.boxSizing = ( div.offsetWidth === 4 );\n\t\tsupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== \"undefined\" ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\tbody.style.zoom = 1;\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})();\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\t\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, ret,\n\t\tinternalKey = jQuery.expando,\n\t\tgetByName = typeof name === \"string\",\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\telem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\tcache[ id ] = {};\n\n\t\t// Avoids exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tif ( !isNode ) {\n\t\t\tcache[ id ].toJSON = jQuery.noop;\n\t\t}\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( getByName ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt /* For internal use only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i, l,\n\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\tfor ( i = 0, l = name.length; i < l; i++ ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\",\n\t\t\"applet\": true\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, false );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, false );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\t\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\telem = this[0],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( !name.indexOf( \"data-\" ) ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.substring(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn jQuery.access( this, function( value ) {\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\t// Try to fetch any internally stored data first\n\t\t\t\treturn elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t\t\t}\n\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\tdata === \"false\" ? false :\n\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\thooks.cur = fn;\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\trboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisBool = typeof stateVal === \"boolean\";\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tstate = stateVal,\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tstate = isBool ? state : !self.hasClass( className );\n\t\t\t\t\tself[ state ? \"addClass\" : \"removeClass\" ]( className );\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === \"undefined\" || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar hooks, ret, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val,\n\t\t\t\tself = jQuery(this);\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, self.val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar values = jQuery.makeArray( value );\n\n\t\t\t\tjQuery(elem).find(\"option\").each(function() {\n\t\t\t\t\tthis.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;\n\t\t\t\t});\n\n\t\t\t\tif ( !values.length ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( notxml ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && notxml && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && notxml && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\n\t\t\t// In IE9+, Flash objects don't have .getAttribute (#12945)\n\t\t\t// Support: IE9+\n\t\t\tif ( typeof elem.getAttribute !== \"undefined\" ) {\n\t\t\t\tret =  elem.getAttribute( name );\n\t\t\t}\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( rboolean.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false for boolean attributes\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8\n\t\t\t\t\tif ( !getSetAttribute && ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\ttabindex: \"tabIndex\",\n\t\treadonly: \"readOnly\",\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\",\n\t\tmaxlength: \"maxLength\",\n\t\tcellspacing: \"cellSpacing\",\n\t\tcellpadding: \"cellPadding\",\n\t\trowspan: \"rowSpan\",\n\t\tcolspan: \"colSpan\",\n\t\tusemap: \"useMap\",\n\t\tframeborder: \"frameBorder\",\n\t\tcontenteditable: \"contentEditable\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn ( elem[ name ] = value );\n\t\t\t}\n\n\t\t} else {\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\treturn elem[ name ];\n\t\t\t}\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\tvar attributeNode = elem.getAttributeNode(\"tabindex\");\n\n\t\t\t\treturn attributeNode && attributeNode.specified ?\n\t\t\t\t\tparseInt( attributeNode.value, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tundefined;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hook for boolean attributes\nboolHook = {\n\tget: function( elem, name ) {\n\t\tvar\n\t\t\t// Use .prop to determine if this attribute is understood as boolean\n\t\t\tprop = jQuery.prop( elem, name ),\n\n\t\t\t// Fetch it accordingly\n\t\t\tattr = typeof prop === \"boolean\" && elem.getAttribute( name ),\n\t\t\tdetail = typeof prop === \"boolean\" ?\n\n\t\t\t\tgetSetInput && getSetAttribute ?\n\t\t\t\t\tattr != null :\n\t\t\t\t\t// oldIE fabricates an empty string for missing boolean attributes\n\t\t\t\t\t// and conflates checked/selected into attroperties\n\t\t\t\t\truseDefault.test( name ) ?\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] :\n\t\t\t\t\t\t!!attr :\n\n\t\t\t\t// fetch an attribute node for properties not recognized as boolean\n\t\t\t\telem.getAttributeNode( name );\n\n\t\treturn detail && detail.value !== false ?\n\t\t\tname.toLowerCase() :\n\t\t\tundefined;\n\t},\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\n\n// fix oldIE value attroperty\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn jQuery.nodeName( elem, \"input\" ) ?\n\n\t\t\t\t// Ignore the value *property* by using defaultValue\n\t\t\t\telem.defaultValue :\n\n\t\t\t\tret && ret.specified ? ret.value : undefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = jQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ( name === \"id\" || name === \"name\" || name === \"coords\" ? ret.value !== \"\" : ret.specified ) ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tget: nodeHook.get,\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\tjQuery.each([ \"href\", \"src\", \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar ret = elem.getAttribute( name, 2 );\n\t\t\t\treturn ret == null ? undefined : ret;\n\t\t\t}\n\t\t});\n\t});\n\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t});\n}\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\nif ( !jQuery.support.checkOn ) {\n\tjQuery.each([ \"radio\", \"checkbox\" ], function() {\n\t\tjQuery.valHooks[ this ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Handle the case where in Webkit \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t\t}\n\t\t};\n\t});\n}\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t});\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\t\telemData = elem.nodeType !== 3 && elem.nodeType !== 8 && jQuery._data( elem );\n\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\t// jQuery(...).bind(\"mouseover mouseout\", fn);\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = event.type || event,\n\t\t\tnamespaces = event.namespace ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\tevent.isTrigger = true;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&\n\t\t\t\t!(type === \"click\" && jQuery.nodeName( elem, \"a\" )) && jQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, j, ret, matched, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, matches, sel, handleObj,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.disabled !== true || event.type !== \"click\" ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = jQuery.event.fixHooks[ event.type ] || {},\n\t\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== document.activeElement && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === document.activeElement && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{ type: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === \"undefined\" ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n});\n\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n\n\tif ( rkeyEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;\n\t}\n\n\tif ( rmouseEvent.test( name ) ) {\n\t\tjQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;\n\t}\n});\n/*!\n * Sizzle CSS Selector Engine\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license\n * http://sizzlejs.com/\n */\n(function( window, undefined ) {\n\nvar i,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\thasDuplicate,\n\toutermostContext,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsXML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\tsortOrder,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tsupport = {},\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Array methods\n\tarr = [],\n\tpop = arr.pop,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\toperators = \"([*^$|!~]?=)\",\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:\" + operators + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([\\\\x20\\\\t\\\\r\\\\n\\\\f>+~])\" + whitespace + \"*\" ),\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"NAME\": new RegExp( \"^\\\\[name=['\\\"]?(\" + characterEncoding + \")['\\\"]?\\\\]\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trsibling = /[\\x20\\t\\r\\n\\f]*[+~]/,\n\n\trnative = /\\{\\s*\\[native code\\]\\s*\\}/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\trattributeQuotes = /\\=[\\x20\\t\\r\\n\\f]*([^'\"\\]]*)[\\x20\\t\\r\\n\\f]*\\]/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = /\\\\([\\da-fA-F]{1,6}[\\x20\\t\\r\\n\\f]?|.)/g,\n\tfunescape = function( _, escaped ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\treturn high !== high ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Use a stripped-down slice if we can't use a native one\ntry {\n\tslice.call( docElem.childNodes, 0 )[0].nodeType;\n} catch ( e ) {\n\tslice = function( i ) {\n\t\tvar elem,\n\t\t\tresults = [];\n\t\tfor ( ; (elem = this[i]); i++ ) {\n\t\t\tresults.push( elem );\n\t\t}\n\t\treturn results;\n\t};\n}\n\n/**\n * For feature detection\n * @param {Function} fn The function to test for native support\n */\nfunction isNative( fn ) {\n\treturn rnative.test( fn + \"\" );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar cache,\n\t\tkeys = [];\n\n\treturn (cache = function( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t});\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( !documentIsXML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && !rbuggyQSA.test(selector) ) {\n\t\t\told = true;\n\t\t\tnid = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results, slice.call( newContext.querySelectorAll(\n\t\t\t\t\t\tnewSelector\n\t\t\t\t\t), 0 ) );\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsXML = isXML( doc );\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.tagNameNoComments = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if attributes should be retrieved by attribute nodes\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.innerHTML = \"<select></select>\";\n\t\tvar type = typeof div.lastChild.getAttribute(\"multiple\");\n\t\t// IE8 returns a string for some attributes even when not present\n\t\treturn type !== \"boolean\" && type !== \"string\";\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getByClassName = assert(function( div ) {\n\t\t// Opera can't find a second classname (in 9.6)\n\t\tdiv.innerHTML = \"<div class='hidden e'></div><div class='hidden'></div>\";\n\t\tif ( !div.getElementsByClassName || !div.getElementsByClassName(\"e\").length ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Safari 3.2 caches class attributes and doesn't catch changes\n\t\tdiv.lastChild.className = \"e\";\n\t\treturn div.getElementsByClassName(\"e\").length === 2;\n\t});\n\n\t// Check if getElementById returns elements by name\n\t// Check if getElementsByName privileges form controls or returns elements by ID\n\tsupport.getByName = assert(function( div ) {\n\t\t// Inject content\n\t\tdiv.id = expando + 0;\n\t\tdiv.innerHTML = \"<a name='\" + expando + \"'></a><div name='\" + expando + \"'></div>\";\n\t\tdocElem.insertBefore( div, docElem.firstChild );\n\n\t\t// Test\n\t\tvar pass = doc.getElementsByName &&\n\t\t\t// buggy browsers will return fewer than the correct 2\n\t\t\tdoc.getElementsByName( expando ).length === 2 +\n\t\t\t// buggy browsers will return more than the correct 0\n\t\t\tdoc.getElementsByName( expando + 0 ).length;\n\t\tsupport.getIdNotName = !doc.getElementById( expando );\n\n\t\t// Cleanup\n\t\tdocElem.removeChild( div );\n\n\t\treturn pass;\n\t});\n\n\t// IE6/7 return modified attributes\n\tExpr.attrHandle = assert(function( div ) {\n\t\tdiv.innerHTML = \"<a href='#'></a>\";\n\t\treturn div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\n\t\t\tdiv.firstChild.getAttribute(\"href\") === \"#\";\n\t}) ?\n\t\t{} :\n\t\t{\n\t\t\t\"href\": function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"href\", 2 );\n\t\t\t},\n\t\t\t\"type\": function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"type\");\n\t\t\t}\n\t\t};\n\n\t// ID find and filter\n\tif ( support.getIdNotName ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && !documentIsXML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && !documentIsXML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\n\t\t\t\treturn m ?\n\t\t\t\t\tm.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode(\"id\").value === id ?\n\t\t\t\t\t\t[m] :\n\t\t\t\t\t\tundefined :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.tagNameNoComments ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Name\n\tExpr.find[\"NAME\"] = support.getByName && function( tag, context ) {\n\t\tif ( typeof context.getElementsByName !== strundefined ) {\n\t\t\treturn context.getElementsByName( name );\n\t\t}\n\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21),\n\t// no need to also add to buggyMatches since matches checks buggyQSA\n\t// A support test would require too much code (would include document ready)\n\trbuggyQSA = [ \":focus\" ];\n\n\tif ( (support.qsa = isNative(doc.querySelectorAll)) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explictly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// IE8 - Some boolean attributes are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:checked|disabled|ismap|multiple|readonly|selected|value)\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Opera 10-12/IE8 - ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\tdiv.innerHTML = \"<input type='hidden' i=''/>\";\n\t\t\tif ( div.querySelectorAll(\"[i^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:\\\"\\\"|'')\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = new RegExp( rbuggyMatches.join(\"|\") );\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = isNative(docElem.contains) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\t\tvar compare;\n\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tif ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {\n\t\t\tif ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {\n\t\t\t\tif ( a === doc || contains( preferredDoc, a ) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains( preferredDoc, b ) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// The nodes are identical, we can exit early\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Fallback to using sourceIndex (in IE) if it's available on both nodes\n\t\t} else if ( a.sourceIndex && b.sourceIndex ) {\n\t\t\treturn ( ~b.sourceIndex || MAX_NEGATIVE ) - ( contains( preferredDoc, a ) && ~a.sourceIndex || MAX_NEGATIVE );\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\t// Always assume the presence of duplicates if sort doesn't\n\t// pass them to our comparison function (as in Google Chrome).\n\thasDuplicate = false;\n\t[0, 0].sort( sortOrder );\n\tsupport.detectDuplicates = hasDuplicate;\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\t// rbuggyQSA always contains :focus, so no need for an existence check\n\tif ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\tvar val;\n\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tif ( !documentIsXML ) {\n\t\tname = name.toLowerCase();\n\t}\n\tif ( (val = Expr.attrHandle[ name ]) ) {\n\t\treturn val( elem );\n\t}\n\tif ( documentIsXML || support.attributes ) {\n\t\treturn elem.getAttribute( name );\n\t}\n\treturn ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?\n\t\tname :\n\t\tval && val.specified ? val.value : null;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n// Document sorting and removing duplicates\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\ti = 1,\n\t\tj = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\tfor ( ; (elem = results[i]); i++ ) {\n\t\t\tif ( elem === results[ i - 1 ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\nfunction siblingCheck( a, b ) {\n\tvar cur = a && b && a.nextSibling;\n\n\tfor ( ; cur; cur = cur.nextSibling ) {\n\t\tif ( cur === b ) {\n\t\t\treturn -1;\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n// Returns a function to use in pseudos for input types\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for buttons\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n// Returns a function to use in pseudos for positionals\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[4] ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeName ) {\n\t\t\tif ( nodeName === \"*\" ) {\n\t\t\t\treturn function() { return true; };\n\t\t\t}\n\n\t\t\tnodeName = nodeName.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\")) || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.substr( result.length - check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.substr( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifider\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsXML ?\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\") :\n\t\t\t\t\t\telem.lang) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && combinator.dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Nested matchers should use non-integer dirruns\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tfor ( j = 0; (matcher = elementMatchers[j]); j++ ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// `i` starts as a string, so matchedCount would equal \"00\" if there are no elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tfor ( j = 0; (matcher = setMatchers[j]); j++ ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tcontext.nodeType === 9 && !documentIsXML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = Expr.find[\"ID\"]( token.matches[0].replace( runescape, funescape ), context )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\tfor ( i = matchExpr[\"needsContext\"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, slice.call( seed, 0 ) );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\tdocumentIsXML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// Deprecated\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nExpr.filters = setFilters.prototype = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\n// Initialize with the default document\nsetDocument();\n\n// Override sizzle attribute retrieval\nSizzle.attr = jQuery.attr;\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\nvar runtil = /Until$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\tisSimple = /^.[^:#\\[\\.,]*$/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i, ret, self;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\tself = this;\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < self.length; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tret = [];\n\t\tfor ( i = 0; i < this.length; i++ ) {\n\t\t\tjQuery.find( selector, this[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( jQuery.unique( ret ) );\n\t\tret.selector = ( this.selector ? this.selector + \" \" : \"\" ) + selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, false) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector, true) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!selector && (\n\t\t\ttypeof selector === \"string\" ?\n\t\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\t\trneedsContext.test( selector ) ?\n\t\t\t\t\tjQuery( selector, this.context ).index( this[0] ) >= 0 :\n\t\t\t\t\tjQuery.filter( selector, this ).length > 0 :\n\t\t\t\tthis.filter( selector ).length > 0 );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tcur = this[i];\n\n\t\t\twhile ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {\n\t\t\t\tif ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {\n\t\t\t\t\tret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( !runtil.test( name ) ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;\n\n\t\tif ( this.length > 1 && rparentsprev.test( name ) ) {\n\t\t\tret = ret.reverse();\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 ?\n\t\t\tjQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :\n\t\t\tjQuery.find.matches(expr, elems);\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, keep ) {\n\n\t// Can't pass null or undefined to indexOf in Firefox 4\n\t// Set to 0 to skip string check\n\tqualifier = qualifier || 0;\n\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep(elements, function( elem, i ) {\n\t\t\tvar retVal = !!qualifier.call( elem, i, elem );\n\t\t\treturn retVal === keep;\n\t\t});\n\n\t} else if ( qualifier.nodeType ) {\n\t\treturn jQuery.grep(elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) === keep;\n\t\t});\n\n\t} else if ( typeof qualifier === \"string\" ) {\n\t\tvar filtered = jQuery.grep(elements, function( elem ) {\n\t\t\treturn elem.nodeType === 1;\n\t\t});\n\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter(qualifier, filtered, !keep);\n\t\t} else {\n\t\t\tqualifier = jQuery.filter( qualifier, filtered );\n\t\t}\n\t}\n\n\treturn jQuery.grep(elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tthis.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip(arguments, true, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tthis.insertBefore( elem, this.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, false, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, false, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\tif ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {\n\t\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t\t}\n\n\t\t\t\tif ( elem.parentNode ) {\n\t\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function( value ) {\n\t\tvar isFunc = jQuery.isFunction( value );\n\n\t\t// Make sure that the elements are removed from the DOM before they are inserted\n\t\t// this can help fix replacing a parent with child elements\n\t\tif ( !isFunc && typeof value !== \"string\" ) {\n\t\t\tvalue = jQuery( value ).not( this ).detach();\n\t\t}\n\n\t\treturn this.domManip( [ value ], true, function( elem ) {\n\t\t\tvar next = this.nextSibling,\n\t\t\t\tparent = this.parentNode;\n\n\t\t\tif ( parent && this.nodeType === 1 || this.nodeType === 11 ) {\n\n\t\t\t\tjQuery( this ).remove();\n\n\t\t\t\tif ( next ) {\n\t\t\t\t\tnext.parentNode.insertBefore( elem, next );\n\t\t\t\t} else {\n\t\t\t\t\tparent.appendChild( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, table, callback ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, table ? self.html() : undefined );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, table, callback );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\ttable = table && jQuery.nodeName( first, \"tr\" );\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call(\n\t\t\t\t\t\ttable && jQuery.nodeName( this[i], \"table\" ) ?\n\t\t\t\t\t\t\tfindOrAppend( this[i], \"tbody\" ) :\n\t\t\t\t\t\t\tthis[i],\n\t\t\t\t\t\tnode,\n\t\t\t\t\t\ti\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery.ajax({\n\t\t\t\t\t\t\t\t\turl: node.src,\n\t\t\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\t\t\tdataType: \"script\",\n\t\t\t\t\t\t\t\t\tasync: false,\n\t\t\t\t\t\t\t\t\tglobal: false,\n\t\t\t\t\t\t\t\t\t\"throws\": true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nfunction findOrAppend( elem, tag ) {\n\treturn elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\tvar attr = elem.getAttributeNode(\"type\");\n\telem.type = ( attr && attr.specified ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, data, e;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== \"undefined\" ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== \"undefined\" ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, srcElements, node, i, clone,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar contains, elem, tag, tmp, wrap, tbody, j,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar data, id, elem, type,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== \"undefined\" ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n});\nvar curCSS, getStyles, iframe,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && elem.style.display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else if ( !values[ index ] && !isHidden( elem ) ) {\n\t\t\tjQuery._data( elem, \"olddisplay\", jQuery.css( elem, \"display\" ) );\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tvar bool = typeof state === \"boolean\";\n\n\t\treturn this.each(function() {\n\t\t\tif ( bool ? state : isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Exclude the following css properties to add px\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\treturn ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\t\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": window.String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? 80 : 443 ) ) !=\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? 80 : 443 ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( status >= 200 && status < 300 || status === 304 ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If not modified\n\t\t\t\tif ( status === 304 ) {\n\t\t\t\t\tisSuccess = true;\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data\n\t\t\t\t} else {\n\t\t\t\t\tisSuccess = ajaxConvert( s, response );\n\t\t\t\t\tstatusText = isSuccess.state;\n\t\t\t\t\tsuccess = isSuccess.data;\n\t\t\t\t\terror = isSuccess.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t}\n});\n\n/* Handles responses to an ajax request:\n * - sets all responseXXX fields accordingly\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes,\n\t\tresponseFields = s.responseFields;\n\n\t// Fill responseXXX fields\n\tfor ( type in responseFields ) {\n\t\tif ( type in responses ) {\n\t\t\tjqXHR[ responseFields[type] ] = responses[ type ];\n\t\t}\n\t}\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n// Chain conversions given the request and the original response\nfunction ajaxConvert( s, response ) {\n\n\tvar conv, conv2, current, tmp,\n\t\tconverters = {},\n\t\ti = 0,\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice(),\n\t\tprev = dataTypes[ 0 ];\n\n\t// Apply the dataFilter if provided\n\tif ( s.dataFilter ) {\n\t\tresponse = s.dataFilter( response, s.dataType );\n\t}\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\t// Convert to each sequential dataType, tolerating list modification\n\tfor ( ; (current = dataTypes[++i]); ) {\n\n\t\t// There's only work to do if current dataType is non-auto\n\t\tif ( current !== \"*\" ) {\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\tif ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split(\" \");\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.splice( i--, 0, current );\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[\"throws\"] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update prev for next iteration\n\t\t\tprev = current;\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\n\t\t\t\t\t\tvar status,\n\t\t\t\t\t\t\tstatusText,\n\t\t\t\t\t\t\tresponseHeaders,\n\t\t\t\t\t\t\tresponses,\n\t\t\t\t\t\t\txml;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\txml = xhr.responseXML;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// Construct response list\n\t\t\t\t\t\t\t\t\tif ( xml && xml.documentElement /* #4958 */ ) {\n\t\t\t\t\t\t\t\t\t\tresponses.xml = xml;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar end, unit,\n\t\t\t\ttween = this.createTween( prop, value ),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tstart = +target || 0,\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( parts ) {\n\t\t\t\tend = +parts[2];\n\t\t\t\tunit = parts[3] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\n\t\t\t\t// We need to compute starting value\n\t\t\t\tif ( unit !== \"px\" && start ) {\n\t\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\t\t// Prefer the current property, because this process will be trivial if it uses the same units\n\t\t\t\t\t// Fallback to end or a simple constant\n\t\t\t\t\tstart = jQuery.css( tween.elem, prop, true ) || end || 1;\n\n\t\t\t\t\tdo {\n\t\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t\t// Adjust and apply\n\t\t\t\t\t\tstart = start / scale;\n\t\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t\t}\n\n\t\t\t\ttween.unit = unit;\n\t\t\t\ttween.start = start;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;\n\t\t\t}\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTweens( animation, props ) {\n\tjQuery.each( props, function( prop, value ) {\n\t\tvar collection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\t\tindex = 0,\n\t\t\tlength = collection.length;\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tif ( collection[ index ].call( animation, prop, value ) ) {\n\n\t\t\t\t// we're done with this property\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tcreateTweens( animation, props );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/*jshint validthis:true */\n\tvar index, prop, value, length, dataShow, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\tstyle = elem.style,\n\t\torig = {},\n\t\thandled = [],\n\t\thidden = elem.nodeType && isHidden( elem );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.done(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( index in props ) {\n\t\tvalue = props[ index ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ index ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thandled.push( index );\n\t\t}\n\t}\n\n\tlength = handled.length;\n\tif ( length ) {\n\t\tdataShow = jQuery._data( elem, \"fxshow\" ) || jQuery._data( elem, \"fxshow\", {} );\n\t\tif ( \"hidden\" in dataShow ) {\n\t\t\thidden = dataShow.hidden;\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( index = 0 ; index < length ; index++ ) {\n\t\t\tprop = handled[ index ];\n\t\t\ttween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );\n\t\t\torig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing a non empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"auto\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Remove in 2.0 - this supports IE8's panic based approach\n// to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\t\t\t\tdoAnimation.finish = function() {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t};\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.cur && hooks.cur.finish ) {\n\t\t\t\thooks.cur.finish.call( this );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== \"undefined\" ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || document.documentElement;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || document.documentElement;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// })();\n// Expose jQuery to the global object\nwindow.jQuery = window.$ = jQuery;\n\n// Expose jQuery as an AMD module, but only for AMD loaders that\n// understand the issues with loading multiple versions of jQuery\n// in a page that all might call define(). The loader will indicate\n// they have special allowances for multiple jQuery versions by\n// specifying define.amd.jQuery = true. Register as a named module,\n// since jQuery can be concatenated with other files that may use define,\n// but not use a proper concatenation script that understands anonymous\n// AMD modules. A named AMD is safest and most robust way to register.\n// Lowercase jquery is used because AMD module names are derived from\n// file names, and jQuery is normally delivered in a lowercase file name.\n// Do this after creating the global so that if an AMD module wants to call\n// noConflict to hide this version of jQuery, it will work.\nif ( typeof define === \"function\" && define.amd && define.amd.jQuery ) {\n\tdefine( \"jquery\", [], function () { return jQuery; } );\n}\n\n})( window );\n"
  },
  {
    "path": "works/js/lib/ui-bootstrap-tpls-0.11.0.js",
    "content": "/*\n * angular-ui-bootstrap\n * http://angular-ui.github.io/bootstrap/\n\n * Version: 0.11.0 - 2014-05-01\n * License: MIT\n */\nangular.module(\"ui.bootstrap\", [\"ui.bootstrap.tpls\", \"ui.bootstrap.transition\",\"ui.bootstrap.collapse\",\"ui.bootstrap.accordion\",\"ui.bootstrap.alert\",\"ui.bootstrap.bindHtml\",\"ui.bootstrap.buttons\",\"ui.bootstrap.carousel\",\"ui.bootstrap.dateparser\",\"ui.bootstrap.position\",\"ui.bootstrap.datepicker\",\"ui.bootstrap.dropdown\",\"ui.bootstrap.modal\",\"ui.bootstrap.pagination\",\"ui.bootstrap.tooltip\",\"ui.bootstrap.popover\",\"ui.bootstrap.progressbar\",\"ui.bootstrap.rating\",\"ui.bootstrap.tabs\",\"ui.bootstrap.timepicker\",\"ui.bootstrap.typeahead\"]);\nangular.module(\"ui.bootstrap.tpls\", [\"template/accordion/accordion-group.html\",\"template/accordion/accordion.html\",\"template/alert/alert.html\",\"template/carousel/carousel.html\",\"template/carousel/slide.html\",\"template/datepicker/datepicker.html\",\"template/datepicker/day.html\",\"template/datepicker/month.html\",\"template/datepicker/popup.html\",\"template/datepicker/year.html\",\"template/modal/backdrop.html\",\"template/modal/window.html\",\"template/pagination/pager.html\",\"template/pagination/pagination.html\",\"template/tooltip/tooltip-html-unsafe-popup.html\",\"template/tooltip/tooltip-popup.html\",\"template/popover/popover.html\",\"template/progressbar/bar.html\",\"template/progressbar/progress.html\",\"template/progressbar/progressbar.html\",\"template/rating/rating.html\",\"template/tabs/tab.html\",\"template/tabs/tabset.html\",\"template/timepicker/timepicker.html\",\"template/typeahead/typeahead-match.html\",\"template/typeahead/typeahead-popup.html\"]);\nangular.module('ui.bootstrap.transition', [])\n\n/**\n * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete.\n * @param  {DOMElement} element  The DOMElement that will be animated.\n * @param  {string|object|function} trigger  The thing that will cause the transition to start:\n *   - As a string, it represents the css class to be added to the element.\n *   - As an object, it represents a hash of style attributes to be applied to the element.\n *   - As a function, it represents a function to be called that will cause the transition to occur.\n * @return {Promise}  A promise that is resolved when the transition finishes.\n */\n.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) {\n\n  var $transition = function(element, trigger, options) {\n    options = options || {};\n    var deferred = $q.defer();\n    var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName'];\n\n    var transitionEndHandler = function(event) {\n      $rootScope.$apply(function() {\n        element.unbind(endEventName, transitionEndHandler);\n        deferred.resolve(element);\n      });\n    };\n\n    if (endEventName) {\n      element.bind(endEventName, transitionEndHandler);\n    }\n\n    // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur\n    $timeout(function() {\n      if ( angular.isString(trigger) ) {\n        element.addClass(trigger);\n      } else if ( angular.isFunction(trigger) ) {\n        trigger(element);\n      } else if ( angular.isObject(trigger) ) {\n        element.css(trigger);\n      }\n      //If browser does not support transitions, instantly resolve\n      if ( !endEventName ) {\n        deferred.resolve(element);\n      }\n    });\n\n    // Add our custom cancel function to the promise that is returned\n    // We can call this if we are about to run a new transition, which we know will prevent this transition from ending,\n    // i.e. it will therefore never raise a transitionEnd event for that transition\n    deferred.promise.cancel = function() {\n      if ( endEventName ) {\n        element.unbind(endEventName, transitionEndHandler);\n      }\n      deferred.reject('Transition cancelled');\n    };\n\n    return deferred.promise;\n  };\n\n  // Work out the name of the transitionEnd event\n  var transElement = document.createElement('trans');\n  var transitionEndEventNames = {\n    'WebkitTransition': 'webkitTransitionEnd',\n    'MozTransition': 'transitionend',\n    'OTransition': 'oTransitionEnd',\n    'transition': 'transitionend'\n  };\n  var animationEndEventNames = {\n    'WebkitTransition': 'webkitAnimationEnd',\n    'MozTransition': 'animationend',\n    'OTransition': 'oAnimationEnd',\n    'transition': 'animationend'\n  };\n  function findEndEventName(endEventNames) {\n    for (var name in endEventNames){\n      if (transElement.style[name] !== undefined) {\n        return endEventNames[name];\n      }\n    }\n  }\n  $transition.transitionEndEventName = findEndEventName(transitionEndEventNames);\n  $transition.animationEndEventName = findEndEventName(animationEndEventNames);\n  return $transition;\n}]);\n\nangular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition'])\n\n  .directive('collapse', ['$transition', function ($transition) {\n\n    return {\n      link: function (scope, element, attrs) {\n\n        var initialAnimSkip = true;\n        var currentTransition;\n\n        function doTransition(change) {\n          var newTransition = $transition(element, change);\n          if (currentTransition) {\n            currentTransition.cancel();\n          }\n          currentTransition = newTransition;\n          newTransition.then(newTransitionDone, newTransitionDone);\n          return newTransition;\n\n          function newTransitionDone() {\n            // Make sure it's this transition, otherwise, leave it alone.\n            if (currentTransition === newTransition) {\n              currentTransition = undefined;\n            }\n          }\n        }\n\n        function expand() {\n          if (initialAnimSkip) {\n            initialAnimSkip = false;\n            expandDone();\n          } else {\n            element.removeClass('collapse').addClass('collapsing');\n            doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone);\n          }\n        }\n\n        function expandDone() {\n          element.removeClass('collapsing');\n          element.addClass('collapse in');\n          element.css({height: 'auto'});\n        }\n\n        function collapse() {\n          if (initialAnimSkip) {\n            initialAnimSkip = false;\n            collapseDone();\n            element.css({height: 0});\n          } else {\n            // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value\n            element.css({ height: element[0].scrollHeight + 'px' });\n            //trigger reflow so a browser realizes that height was updated from auto to a specific value\n            var x = element[0].offsetWidth;\n\n            element.removeClass('collapse in').addClass('collapsing');\n\n            doTransition({ height: 0 }).then(collapseDone);\n          }\n        }\n\n        function collapseDone() {\n          element.removeClass('collapsing');\n          element.addClass('collapse');\n        }\n\n        scope.$watch(attrs.collapse, function (shouldCollapse) {\n          if (shouldCollapse) {\n            collapse();\n          } else {\n            expand();\n          }\n        });\n      }\n    };\n  }]);\n\nangular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse'])\n\n.constant('accordionConfig', {\n  closeOthers: true\n})\n\n.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) {\n\n  // This array keeps track of the accordion groups\n  this.groups = [];\n\n  // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to\n  this.closeOthers = function(openGroup) {\n    var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;\n    if ( closeOthers ) {\n      angular.forEach(this.groups, function (group) {\n        if ( group !== openGroup ) {\n          group.isOpen = false;\n        }\n      });\n    }\n  };\n\n  // This is called from the accordion-group directive to add itself to the accordion\n  this.addGroup = function(groupScope) {\n    var that = this;\n    this.groups.push(groupScope);\n\n    groupScope.$on('$destroy', function (event) {\n      that.removeGroup(groupScope);\n    });\n  };\n\n  // This is called from the accordion-group directive when to remove itself\n  this.removeGroup = function(group) {\n    var index = this.groups.indexOf(group);\n    if ( index !== -1 ) {\n      this.groups.splice(index, 1);\n    }\n  };\n\n}])\n\n// The accordion directive simply sets up the directive controller\n// and adds an accordion CSS class to itself element.\n.directive('accordion', function () {\n  return {\n    restrict:'EA',\n    controller:'AccordionController',\n    transclude: true,\n    replace: false,\n    templateUrl: 'template/accordion/accordion.html'\n  };\n})\n\n// The accordion-group directive indicates a block of html that will expand and collapse in an accordion\n.directive('accordionGroup', function() {\n  return {\n    require:'^accordion',         // We need this directive to be inside an accordion\n    restrict:'EA',\n    transclude:true,              // It transcludes the contents of the directive into the template\n    replace: true,                // The element containing the directive will be replaced with the template\n    templateUrl:'template/accordion/accordion-group.html',\n    scope: {\n      heading: '@',               // Interpolate the heading attribute onto this scope\n      isOpen: '=?',\n      isDisabled: '=?'\n    },\n    controller: function() {\n      this.setHeading = function(element) {\n        this.heading = element;\n      };\n    },\n    link: function(scope, element, attrs, accordionCtrl) {\n      accordionCtrl.addGroup(scope);\n\n      scope.$watch('isOpen', function(value) {\n        if ( value ) {\n          accordionCtrl.closeOthers(scope);\n        }\n      });\n\n      scope.toggleOpen = function() {\n        if ( !scope.isDisabled ) {\n          scope.isOpen = !scope.isOpen;\n        }\n      };\n    }\n  };\n})\n\n// Use accordion-heading below an accordion-group to provide a heading containing HTML\n// <accordion-group>\n//   <accordion-heading>Heading containing HTML - <img src=\"...\"></accordion-heading>\n// </accordion-group>\n.directive('accordionHeading', function() {\n  return {\n    restrict: 'EA',\n    transclude: true,   // Grab the contents to be used as the heading\n    template: '',       // In effect remove this element!\n    replace: true,\n    require: '^accordionGroup',\n    link: function(scope, element, attr, accordionGroupCtrl, transclude) {\n      // Pass the heading to the accordion-group controller\n      // so that it can be transcluded into the right place in the template\n      // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat]\n      accordionGroupCtrl.setHeading(transclude(scope, function() {}));\n    }\n  };\n})\n\n// Use in the accordion-group template to indicate where you want the heading to be transcluded\n// You must provide the property on the accordion-group controller that will hold the transcluded element\n// <div class=\"accordion-group\">\n//   <div class=\"accordion-heading\" ><a ... accordion-transclude=\"heading\">...</a></div>\n//   ...\n// </div>\n.directive('accordionTransclude', function() {\n  return {\n    require: '^accordionGroup',\n    link: function(scope, element, attr, controller) {\n      scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) {\n        if ( heading ) {\n          element.html('');\n          element.append(heading);\n        }\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.alert', [])\n\n.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) {\n  $scope.closeable = 'close' in $attrs;\n}])\n\n.directive('alert', function () {\n  return {\n    restrict:'EA',\n    controller:'AlertController',\n    templateUrl:'template/alert/alert.html',\n    transclude:true,\n    replace:true,\n    scope: {\n      type: '@',\n      close: '&'\n    }\n  };\n});\n\nangular.module('ui.bootstrap.bindHtml', [])\n\n  .directive('bindHtmlUnsafe', function () {\n    return function (scope, element, attr) {\n      element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe);\n      scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) {\n        element.html(value || '');\n      });\n    };\n  });\nangular.module('ui.bootstrap.buttons', [])\n\n.constant('buttonConfig', {\n  activeClass: 'active',\n  toggleEvent: 'click'\n})\n\n.controller('ButtonsController', ['buttonConfig', function(buttonConfig) {\n  this.activeClass = buttonConfig.activeClass || 'active';\n  this.toggleEvent = buttonConfig.toggleEvent || 'click';\n}])\n\n.directive('btnRadio', function () {\n  return {\n    require: ['btnRadio', 'ngModel'],\n    controller: 'ButtonsController',\n    link: function (scope, element, attrs, ctrls) {\n      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      //model -> UI\n      ngModelCtrl.$render = function () {\n        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio)));\n      };\n\n      //ui->model\n      element.bind(buttonsCtrl.toggleEvent, function () {\n        var isActive = element.hasClass(buttonsCtrl.activeClass);\n\n        if (!isActive || angular.isDefined(attrs.uncheckable)) {\n          scope.$apply(function () {\n            ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio));\n            ngModelCtrl.$render();\n          });\n        }\n      });\n    }\n  };\n})\n\n.directive('btnCheckbox', function () {\n  return {\n    require: ['btnCheckbox', 'ngModel'],\n    controller: 'ButtonsController',\n    link: function (scope, element, attrs, ctrls) {\n      var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      function getTrueValue() {\n        return getCheckboxValue(attrs.btnCheckboxTrue, true);\n      }\n\n      function getFalseValue() {\n        return getCheckboxValue(attrs.btnCheckboxFalse, false);\n      }\n\n      function getCheckboxValue(attributeValue, defaultValue) {\n        var val = scope.$eval(attributeValue);\n        return angular.isDefined(val) ? val : defaultValue;\n      }\n\n      //model -> UI\n      ngModelCtrl.$render = function () {\n        element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue()));\n      };\n\n      //ui->model\n      element.bind(buttonsCtrl.toggleEvent, function () {\n        scope.$apply(function () {\n          ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue());\n          ngModelCtrl.$render();\n        });\n      });\n    }\n  };\n});\n\n/**\n* @ngdoc overview\n* @name ui.bootstrap.carousel\n*\n* @description\n* AngularJS version of an image carousel.\n*\n*/\nangular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition'])\n.controller('CarouselController', ['$scope', '$timeout', '$transition', function ($scope, $timeout, $transition) {\n  var self = this,\n    slides = self.slides = $scope.slides = [],\n    currentIndex = -1,\n    currentTimeout, isPlaying;\n  self.currentSlide = null;\n\n  var destroyed = false;\n  /* direction: \"prev\" or \"next\" */\n  self.select = $scope.select = function(nextSlide, direction) {\n    var nextIndex = slides.indexOf(nextSlide);\n    //Decide direction if it's not given\n    if (direction === undefined) {\n      direction = nextIndex > currentIndex ? 'next' : 'prev';\n    }\n    if (nextSlide && nextSlide !== self.currentSlide) {\n      if ($scope.$currentTransition) {\n        $scope.$currentTransition.cancel();\n        //Timeout so ng-class in template has time to fix classes for finished slide\n        $timeout(goNext);\n      } else {\n        goNext();\n      }\n    }\n    function goNext() {\n      // Scope has been destroyed, stop here.\n      if (destroyed) { return; }\n      //If we have a slide to transition from and we have a transition type and we're allowed, go\n      if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) {\n        //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime\n        nextSlide.$element.addClass(direction);\n        var reflow = nextSlide.$element[0].offsetWidth; //force reflow\n\n        //Set all other slides to stop doing their stuff for the new transition\n        angular.forEach(slides, function(slide) {\n          angular.extend(slide, {direction: '', entering: false, leaving: false, active: false});\n        });\n        angular.extend(nextSlide, {direction: direction, active: true, entering: true});\n        angular.extend(self.currentSlide||{}, {direction: direction, leaving: true});\n\n        $scope.$currentTransition = $transition(nextSlide.$element, {});\n        //We have to create new pointers inside a closure since next & current will change\n        (function(next,current) {\n          $scope.$currentTransition.then(\n            function(){ transitionDone(next, current); },\n            function(){ transitionDone(next, current); }\n          );\n        }(nextSlide, self.currentSlide));\n      } else {\n        transitionDone(nextSlide, self.currentSlide);\n      }\n      self.currentSlide = nextSlide;\n      currentIndex = nextIndex;\n      //every time you change slides, reset the timer\n      restartTimer();\n    }\n    function transitionDone(next, current) {\n      angular.extend(next, {direction: '', active: true, leaving: false, entering: false});\n      angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false});\n      $scope.$currentTransition = null;\n    }\n  };\n  $scope.$on('$destroy', function () {\n    destroyed = true;\n  });\n\n  /* Allow outside people to call indexOf on slides array */\n  self.indexOfSlide = function(slide) {\n    return slides.indexOf(slide);\n  };\n\n  $scope.next = function() {\n    var newIndex = (currentIndex + 1) % slides.length;\n\n    //Prevent this user-triggered transition from occurring if there is already one in progress\n    if (!$scope.$currentTransition) {\n      return self.select(slides[newIndex], 'next');\n    }\n  };\n\n  $scope.prev = function() {\n    var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1;\n\n    //Prevent this user-triggered transition from occurring if there is already one in progress\n    if (!$scope.$currentTransition) {\n      return self.select(slides[newIndex], 'prev');\n    }\n  };\n\n  $scope.isActive = function(slide) {\n     return self.currentSlide === slide;\n  };\n\n  $scope.$watch('interval', restartTimer);\n  $scope.$on('$destroy', resetTimer);\n\n  function restartTimer() {\n    resetTimer();\n    var interval = +$scope.interval;\n    if (!isNaN(interval) && interval>=0) {\n      currentTimeout = $timeout(timerFn, interval);\n    }\n  }\n\n  function resetTimer() {\n    if (currentTimeout) {\n      $timeout.cancel(currentTimeout);\n      currentTimeout = null;\n    }\n  }\n\n  function timerFn() {\n    if (isPlaying) {\n      $scope.next();\n      restartTimer();\n    } else {\n      $scope.pause();\n    }\n  }\n\n  $scope.play = function() {\n    if (!isPlaying) {\n      isPlaying = true;\n      restartTimer();\n    }\n  };\n  $scope.pause = function() {\n    if (!$scope.noPause) {\n      isPlaying = false;\n      resetTimer();\n    }\n  };\n\n  self.addSlide = function(slide, element) {\n    slide.$element = element;\n    slides.push(slide);\n    //if this is the first slide or the slide is set to active, select it\n    if(slides.length === 1 || slide.active) {\n      self.select(slides[slides.length-1]);\n      if (slides.length == 1) {\n        $scope.play();\n      }\n    } else {\n      slide.active = false;\n    }\n  };\n\n  self.removeSlide = function(slide) {\n    //get the index of the slide inside the carousel\n    var index = slides.indexOf(slide);\n    slides.splice(index, 1);\n    if (slides.length > 0 && slide.active) {\n      if (index >= slides.length) {\n        self.select(slides[index-1]);\n      } else {\n        self.select(slides[index]);\n      }\n    } else if (currentIndex > index) {\n      currentIndex--;\n    }\n  };\n\n}])\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.carousel.directive:carousel\n * @restrict EA\n *\n * @description\n * Carousel is the outer container for a set of image 'slides' to showcase.\n *\n * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide.\n * @param {boolean=} noTransition Whether to disable transitions on the carousel.\n * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover).\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <carousel>\n      <slide>\n        <img src=\"http://placekitten.com/150/150\" style=\"margin:auto;\">\n        <div class=\"carousel-caption\">\n          <p>Beautiful!</p>\n        </div>\n      </slide>\n      <slide>\n        <img src=\"http://placekitten.com/100/150\" style=\"margin:auto;\">\n        <div class=\"carousel-caption\">\n          <p>D'aww!</p>\n        </div>\n      </slide>\n    </carousel>\n  </file>\n  <file name=\"demo.css\">\n    .carousel-indicators {\n      top: auto;\n      bottom: 15px;\n    }\n  </file>\n</example>\n */\n.directive('carousel', [function() {\n  return {\n    restrict: 'EA',\n    transclude: true,\n    replace: true,\n    controller: 'CarouselController',\n    require: 'carousel',\n    templateUrl: 'template/carousel/carousel.html',\n    scope: {\n      interval: '=',\n      noTransition: '=',\n      noPause: '='\n    }\n  };\n}])\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.carousel.directive:slide\n * @restrict EA\n *\n * @description\n * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}.  Must be placed as a child of a carousel element.\n *\n * @param {boolean=} active Model binding, whether or not this slide is currently active.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n<div ng-controller=\"CarouselDemoCtrl\">\n  <carousel>\n    <slide ng-repeat=\"slide in slides\" active=\"slide.active\">\n      <img ng-src=\"{{slide.image}}\" style=\"margin:auto;\">\n      <div class=\"carousel-caption\">\n        <h4>Slide {{$index}}</h4>\n        <p>{{slide.text}}</p>\n      </div>\n    </slide>\n  </carousel>\n  Interval, in milliseconds: <input type=\"number\" ng-model=\"myInterval\">\n  <br />Enter a negative number to stop the interval.\n</div>\n  </file>\n  <file name=\"script.js\">\nfunction CarouselDemoCtrl($scope) {\n  $scope.myInterval = 5000;\n}\n  </file>\n  <file name=\"demo.css\">\n    .carousel-indicators {\n      top: auto;\n      bottom: 15px;\n    }\n  </file>\n</example>\n*/\n\n.directive('slide', function() {\n  return {\n    require: '^carousel',\n    restrict: 'EA',\n    transclude: true,\n    replace: true,\n    templateUrl: 'template/carousel/slide.html',\n    scope: {\n      active: '=?'\n    },\n    link: function (scope, element, attrs, carouselCtrl) {\n      carouselCtrl.addSlide(scope, element);\n      //when the scope is destroyed then remove the slide from the current slides array\n      scope.$on('$destroy', function() {\n        carouselCtrl.removeSlide(scope);\n      });\n\n      scope.$watch('active', function(active) {\n        if (active) {\n          carouselCtrl.select(scope);\n        }\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.dateparser', [])\n\n.service('dateParser', ['$locale', 'orderByFilter', function($locale, orderByFilter) {\n\n  this.parsers = {};\n\n  var formatCodeToRegex = {\n    'yyyy': {\n      regex: '\\\\d{4}',\n      apply: function(value) { this.year = +value; }\n    },\n    'yy': {\n      regex: '\\\\d{2}',\n      apply: function(value) { this.year = +value + 2000; }\n    },\n    'y': {\n      regex: '\\\\d{1,4}',\n      apply: function(value) { this.year = +value; }\n    },\n    'MMMM': {\n      regex: $locale.DATETIME_FORMATS.MONTH.join('|'),\n      apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); }\n    },\n    'MMM': {\n      regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'),\n      apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); }\n    },\n    'MM': {\n      regex: '0[1-9]|1[0-2]',\n      apply: function(value) { this.month = value - 1; }\n    },\n    'M': {\n      regex: '[1-9]|1[0-2]',\n      apply: function(value) { this.month = value - 1; }\n    },\n    'dd': {\n      regex: '[0-2][0-9]{1}|3[0-1]{1}',\n      apply: function(value) { this.date = +value; }\n    },\n    'd': {\n      regex: '[1-2]?[0-9]{1}|3[0-1]{1}',\n      apply: function(value) { this.date = +value; }\n    },\n    'EEEE': {\n      regex: $locale.DATETIME_FORMATS.DAY.join('|')\n    },\n    'EEE': {\n      regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|')\n    }\n  };\n\n  this.createParser = function(format) {\n    var map = [], regex = format.split('');\n\n    angular.forEach(formatCodeToRegex, function(data, code) {\n      var index = format.indexOf(code);\n\n      if (index > -1) {\n        format = format.split('');\n\n        regex[index] = '(' + data.regex + ')';\n        format[index] = '$'; // Custom symbol to define consumed part of format\n        for (var i = index + 1, n = index + code.length; i < n; i++) {\n          regex[i] = '';\n          format[i] = '$';\n        }\n        format = format.join('');\n\n        map.push({ index: index, apply: data.apply });\n      }\n    });\n\n    return {\n      regex: new RegExp('^' + regex.join('') + '$'),\n      map: orderByFilter(map, 'index')\n    };\n  };\n\n  this.parse = function(input, format) {\n    if ( !angular.isString(input) ) {\n      return input;\n    }\n\n    format = $locale.DATETIME_FORMATS[format] || format;\n\n    if ( !this.parsers[format] ) {\n      this.parsers[format] = this.createParser(format);\n    }\n\n    var parser = this.parsers[format],\n        regex = parser.regex,\n        map = parser.map,\n        results = input.match(regex);\n\n    if ( results && results.length ) {\n      var fields = { year: 1900, month: 0, date: 1, hours: 0 }, dt;\n\n      for( var i = 1, n = results.length; i < n; i++ ) {\n        var mapper = map[i-1];\n        if ( mapper.apply ) {\n          mapper.apply.call(fields, results[i]);\n        }\n      }\n\n      if ( isValid(fields.year, fields.month, fields.date) ) {\n        dt = new Date( fields.year, fields.month, fields.date, fields.hours);\n      }\n\n      return dt;\n    }\n  };\n\n  // Check if date is valid for specific month (and year for February).\n  // Month: 0 = Jan, 1 = Feb, etc\n  function isValid(year, month, date) {\n    if ( month === 1 && date > 28) {\n        return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);\n    }\n\n    if ( month === 3 || month === 5 || month === 8 || month === 10) {\n        return date < 31;\n    }\n\n    return true;\n  }\n}]);\n\nangular.module('ui.bootstrap.position', [])\n\n/**\n * A set of utility methods that can be use to retrieve position of DOM elements.\n * It is meant to be used where we need to absolute-position DOM elements in\n * relation to other, existing elements (this is the case for tooltips, popovers,\n * typeahead suggestions etc.).\n */\n  .factory('$position', ['$document', '$window', function ($document, $window) {\n\n    function getStyle(el, cssprop) {\n      if (el.currentStyle) { //IE\n        return el.currentStyle[cssprop];\n      } else if ($window.getComputedStyle) {\n        return $window.getComputedStyle(el)[cssprop];\n      }\n      // finally try and get inline style\n      return el.style[cssprop];\n    }\n\n    /**\n     * Checks if a given element is statically positioned\n     * @param element - raw DOM element\n     */\n    function isStaticPositioned(element) {\n      return (getStyle(element, 'position') || 'static' ) === 'static';\n    }\n\n    /**\n     * returns the closest, non-statically positioned parentOffset of a given element\n     * @param element\n     */\n    var parentOffsetEl = function (element) {\n      var docDomEl = $document[0];\n      var offsetParent = element.offsetParent || docDomEl;\n      while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) {\n        offsetParent = offsetParent.offsetParent;\n      }\n      return offsetParent || docDomEl;\n    };\n\n    return {\n      /**\n       * Provides read-only equivalent of jQuery's position function:\n       * http://api.jquery.com/position/\n       */\n      position: function (element) {\n        var elBCR = this.offset(element);\n        var offsetParentBCR = { top: 0, left: 0 };\n        var offsetParentEl = parentOffsetEl(element[0]);\n        if (offsetParentEl != $document[0]) {\n          offsetParentBCR = this.offset(angular.element(offsetParentEl));\n          offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop;\n          offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft;\n        }\n\n        var boundingClientRect = element[0].getBoundingClientRect();\n        return {\n          width: boundingClientRect.width || element.prop('offsetWidth'),\n          height: boundingClientRect.height || element.prop('offsetHeight'),\n          top: elBCR.top - offsetParentBCR.top,\n          left: elBCR.left - offsetParentBCR.left\n        };\n      },\n\n      /**\n       * Provides read-only equivalent of jQuery's offset function:\n       * http://api.jquery.com/offset/\n       */\n      offset: function (element) {\n        var boundingClientRect = element[0].getBoundingClientRect();\n        return {\n          width: boundingClientRect.width || element.prop('offsetWidth'),\n          height: boundingClientRect.height || element.prop('offsetHeight'),\n          top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop),\n          left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft)\n        };\n      },\n\n      /**\n       * Provides coordinates for the targetEl in relation to hostEl\n       */\n      positionElements: function (hostEl, targetEl, positionStr, appendToBody) {\n\n        var positionStrParts = positionStr.split('-');\n        var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center';\n\n        var hostElPos,\n          targetElWidth,\n          targetElHeight,\n          targetElPos;\n\n        hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl);\n\n        targetElWidth = targetEl.prop('offsetWidth');\n        targetElHeight = targetEl.prop('offsetHeight');\n\n        var shiftWidth = {\n          center: function () {\n            return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2;\n          },\n          left: function () {\n            return hostElPos.left;\n          },\n          right: function () {\n            return hostElPos.left + hostElPos.width;\n          }\n        };\n\n        var shiftHeight = {\n          center: function () {\n            return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2;\n          },\n          top: function () {\n            return hostElPos.top;\n          },\n          bottom: function () {\n            return hostElPos.top + hostElPos.height;\n          }\n        };\n\n        switch (pos0) {\n          case 'right':\n            targetElPos = {\n              top: shiftHeight[pos1](),\n              left: shiftWidth[pos0]()\n            };\n            break;\n          case 'left':\n            targetElPos = {\n              top: shiftHeight[pos1](),\n              left: hostElPos.left - targetElWidth\n            };\n            break;\n          case 'bottom':\n            targetElPos = {\n              top: shiftHeight[pos0](),\n              left: shiftWidth[pos1]()\n            };\n            break;\n          default:\n            targetElPos = {\n              top: hostElPos.top - targetElHeight,\n              left: shiftWidth[pos1]()\n            };\n            break;\n        }\n\n        return targetElPos;\n      }\n    };\n  }]);\n\nangular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position'])\n\n.constant('datepickerConfig', {\n  formatDay: 'dd',\n  formatMonth: 'MMMM',\n  formatYear: 'yyyy',\n  formatDayHeader: 'EEE',\n  formatDayTitle: 'MMMM yyyy',\n  formatMonthTitle: 'yyyy',\n  datepickerMode: 'day',\n  minMode: 'day',\n  maxMode: 'year',\n  showWeeks: true,\n  startingDay: 0,\n  yearRange: 20,\n  minDate: null,\n  maxDate: null\n})\n\n.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) {\n  var self = this,\n      ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl;\n\n  // Modes chain\n  this.modes = ['day', 'month', 'year'];\n\n  // Configuration attributes\n  angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle',\n                   'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange'], function( key, index ) {\n    self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key];\n  });\n\n  // Watchable attributes\n  angular.forEach(['minDate', 'maxDate'], function( key ) {\n    if ( $attrs[key] ) {\n      $scope.$parent.$watch($parse($attrs[key]), function(value) {\n        self[key] = value ? new Date(value) : null;\n        self.refreshView();\n      });\n    } else {\n      self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null;\n    }\n  });\n\n  $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode;\n  $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000);\n  this.activeDate = angular.isDefined($attrs.initDate) ? $scope.$parent.$eval($attrs.initDate) : new Date();\n\n  $scope.isActive = function(dateObject) {\n    if (self.compare(dateObject.date, self.activeDate) === 0) {\n      $scope.activeDateId = dateObject.uid;\n      return true;\n    }\n    return false;\n  };\n\n  this.init = function( ngModelCtrl_ ) {\n    ngModelCtrl = ngModelCtrl_;\n\n    ngModelCtrl.$render = function() {\n      self.render();\n    };\n  };\n\n  this.render = function() {\n    if ( ngModelCtrl.$modelValue ) {\n      var date = new Date( ngModelCtrl.$modelValue ),\n          isValid = !isNaN(date);\n\n      if ( isValid ) {\n        this.activeDate = date;\n      } else {\n        $log.error('Datepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\n      }\n      ngModelCtrl.$setValidity('date', isValid);\n    }\n    this.refreshView();\n  };\n\n  this.refreshView = function() {\n    if ( this.element ) {\n      this._refreshView();\n\n      var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null;\n      ngModelCtrl.$setValidity('date-disabled', !date || (this.element && !this.isDisabled(date)));\n    }\n  };\n\n  this.createDateObject = function(date, format) {\n    var model = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null;\n    return {\n      date: date,\n      label: dateFilter(date, format),\n      selected: model && this.compare(date, model) === 0,\n      disabled: this.isDisabled(date),\n      current: this.compare(date, new Date()) === 0\n    };\n  };\n\n  this.isDisabled = function( date ) {\n    return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode})));\n  };\n\n  // Split array into smaller arrays\n  this.split = function(arr, size) {\n    var arrays = [];\n    while (arr.length > 0) {\n      arrays.push(arr.splice(0, size));\n    }\n    return arrays;\n  };\n\n  $scope.select = function( date ) {\n    if ( $scope.datepickerMode === self.minMode ) {\n      var dt = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0);\n      dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() );\n      ngModelCtrl.$setViewValue( dt );\n      ngModelCtrl.$render();\n    } else {\n      self.activeDate = date;\n      $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ];\n    }\n  };\n\n  $scope.move = function( direction ) {\n    var year = self.activeDate.getFullYear() + direction * (self.step.years || 0),\n        month = self.activeDate.getMonth() + direction * (self.step.months || 0);\n    self.activeDate.setFullYear(year, month, 1);\n    self.refreshView();\n  };\n\n  $scope.toggleMode = function( direction ) {\n    direction = direction || 1;\n\n    if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) {\n      return;\n    }\n\n    $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ];\n  };\n\n  // Key event mapper\n  $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' };\n\n  var focusElement = function() {\n    $timeout(function() {\n      self.element[0].focus();\n    }, 0 , false);\n  };\n\n  // Listen for focus requests from popup directive\n  $scope.$on('datepicker.focus', focusElement);\n\n  $scope.keydown = function( evt ) {\n    var key = $scope.keys[evt.which];\n\n    if ( !key || evt.shiftKey || evt.altKey ) {\n      return;\n    }\n\n    evt.preventDefault();\n    evt.stopPropagation();\n\n    if (key === 'enter' || key === 'space') {\n      if ( self.isDisabled(self.activeDate)) {\n        return; // do nothing\n      }\n      $scope.select(self.activeDate);\n      focusElement();\n    } else if (evt.ctrlKey && (key === 'up' || key === 'down')) {\n      $scope.toggleMode(key === 'up' ? 1 : -1);\n      focusElement();\n    } else {\n      self.handleKeyDown(key, evt);\n      self.refreshView();\n    }\n  };\n}])\n\n.directive( 'datepicker', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/datepicker.html',\n    scope: {\n      datepickerMode: '=?',\n      dateDisabled: '&'\n    },\n    require: ['datepicker', '?^ngModel'],\n    controller: 'DatepickerController',\n    link: function(scope, element, attrs, ctrls) {\n      var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if ( ngModelCtrl ) {\n        datepickerCtrl.init( ngModelCtrl );\n      }\n    }\n  };\n})\n\n.directive('daypicker', ['dateFilter', function (dateFilter) {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/day.html',\n    require: '^datepicker',\n    link: function(scope, element, attrs, ctrl) {\n      scope.showWeeks = ctrl.showWeeks;\n\n      ctrl.step = { months: 1 };\n      ctrl.element = element;\n\n      var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n      function getDaysInMonth( year, month ) {\n        return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month];\n      }\n\n      function getDates(startDate, n) {\n        var dates = new Array(n), current = new Date(startDate), i = 0;\n        current.setHours(12); // Prevent repeated dates because of timezone bug\n        while ( i < n ) {\n          dates[i++] = new Date(current);\n          current.setDate( current.getDate() + 1 );\n        }\n        return dates;\n      }\n\n      ctrl._refreshView = function() {\n        var year = ctrl.activeDate.getFullYear(),\n          month = ctrl.activeDate.getMonth(),\n          firstDayOfMonth = new Date(year, month, 1),\n          difference = ctrl.startingDay - firstDayOfMonth.getDay(),\n          numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference,\n          firstDate = new Date(firstDayOfMonth);\n\n        if ( numDisplayedFromPreviousMonth > 0 ) {\n          firstDate.setDate( - numDisplayedFromPreviousMonth + 1 );\n        }\n\n        // 42 is the number of days on a six-month calendar\n        var days = getDates(firstDate, 42);\n        for (var i = 0; i < 42; i ++) {\n          days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), {\n            secondary: days[i].getMonth() !== month,\n            uid: scope.uniqueId + '-' + i\n          });\n        }\n\n        scope.labels = new Array(7);\n        for (var j = 0; j < 7; j++) {\n          scope.labels[j] = {\n            abbr: dateFilter(days[j].date, ctrl.formatDayHeader),\n            full: dateFilter(days[j].date, 'EEEE')\n          };\n        }\n\n        scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle);\n        scope.rows = ctrl.split(days, 7);\n\n        if ( scope.showWeeks ) {\n          scope.weekNumbers = [];\n          var weekNumber = getISO8601WeekNumber( scope.rows[0][0].date ),\n              numWeeks = scope.rows.length;\n          while( scope.weekNumbers.push(weekNumber++) < numWeeks ) {}\n        }\n      };\n\n      ctrl.compare = function(date1, date2) {\n        return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) );\n      };\n\n      function getISO8601WeekNumber(date) {\n        var checkDate = new Date(date);\n        checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday\n        var time = checkDate.getTime();\n        checkDate.setMonth(0); // Compare with Jan 1\n        checkDate.setDate(1);\n        return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\n      }\n\n      ctrl.handleKeyDown = function( key, evt ) {\n        var date = ctrl.activeDate.getDate();\n\n        if (key === 'left') {\n          date = date - 1;   // up\n        } else if (key === 'up') {\n          date = date - 7;   // down\n        } else if (key === 'right') {\n          date = date + 1;   // down\n        } else if (key === 'down') {\n          date = date + 7;\n        } else if (key === 'pageup' || key === 'pagedown') {\n          var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1);\n          ctrl.activeDate.setMonth(month, 1);\n          date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date);\n        } else if (key === 'home') {\n          date = 1;\n        } else if (key === 'end') {\n          date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth());\n        }\n        ctrl.activeDate.setDate(date);\n      };\n\n      ctrl.refreshView();\n    }\n  };\n}])\n\n.directive('monthpicker', ['dateFilter', function (dateFilter) {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/month.html',\n    require: '^datepicker',\n    link: function(scope, element, attrs, ctrl) {\n      ctrl.step = { years: 1 };\n      ctrl.element = element;\n\n      ctrl._refreshView = function() {\n        var months = new Array(12),\n            year = ctrl.activeDate.getFullYear();\n\n        for ( var i = 0; i < 12; i++ ) {\n          months[i] = angular.extend(ctrl.createDateObject(new Date(year, i, 1), ctrl.formatMonth), {\n            uid: scope.uniqueId + '-' + i\n          });\n        }\n\n        scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle);\n        scope.rows = ctrl.split(months, 3);\n      };\n\n      ctrl.compare = function(date1, date2) {\n        return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() );\n      };\n\n      ctrl.handleKeyDown = function( key, evt ) {\n        var date = ctrl.activeDate.getMonth();\n\n        if (key === 'left') {\n          date = date - 1;   // up\n        } else if (key === 'up') {\n          date = date - 3;   // down\n        } else if (key === 'right') {\n          date = date + 1;   // down\n        } else if (key === 'down') {\n          date = date + 3;\n        } else if (key === 'pageup' || key === 'pagedown') {\n          var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1);\n          ctrl.activeDate.setFullYear(year);\n        } else if (key === 'home') {\n          date = 0;\n        } else if (key === 'end') {\n          date = 11;\n        }\n        ctrl.activeDate.setMonth(date);\n      };\n\n      ctrl.refreshView();\n    }\n  };\n}])\n\n.directive('yearpicker', ['dateFilter', function (dateFilter) {\n  return {\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/datepicker/year.html',\n    require: '^datepicker',\n    link: function(scope, element, attrs, ctrl) {\n      var range = ctrl.yearRange;\n\n      ctrl.step = { years: range };\n      ctrl.element = element;\n\n      function getStartingYear( year ) {\n        return parseInt((year - 1) / range, 10) * range + 1;\n      }\n\n      ctrl._refreshView = function() {\n        var years = new Array(range);\n\n        for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) {\n          years[i] = angular.extend(ctrl.createDateObject(new Date(start + i, 0, 1), ctrl.formatYear), {\n            uid: scope.uniqueId + '-' + i\n          });\n        }\n\n        scope.title = [years[0].label, years[range - 1].label].join(' - ');\n        scope.rows = ctrl.split(years, 5);\n      };\n\n      ctrl.compare = function(date1, date2) {\n        return date1.getFullYear() - date2.getFullYear();\n      };\n\n      ctrl.handleKeyDown = function( key, evt ) {\n        var date = ctrl.activeDate.getFullYear();\n\n        if (key === 'left') {\n          date = date - 1;   // up\n        } else if (key === 'up') {\n          date = date - 5;   // down\n        } else if (key === 'right') {\n          date = date + 1;   // down\n        } else if (key === 'down') {\n          date = date + 5;\n        } else if (key === 'pageup' || key === 'pagedown') {\n          date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years;\n        } else if (key === 'home') {\n          date = getStartingYear( ctrl.activeDate.getFullYear() );\n        } else if (key === 'end') {\n          date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1;\n        }\n        ctrl.activeDate.setFullYear(date);\n      };\n\n      ctrl.refreshView();\n    }\n  };\n}])\n\n.constant('datepickerPopupConfig', {\n  datepickerPopup: 'yyyy-MM-dd',\n  currentText: 'Today',\n  clearText: 'Clear',\n  closeText: 'Done',\n  closeOnDateSelection: true,\n  appendToBody: false,\n  showButtonBar: true\n})\n\n.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig',\nfunction ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) {\n  return {\n    restrict: 'EA',\n    require: 'ngModel',\n    scope: {\n      isOpen: '=?',\n      currentText: '@',\n      clearText: '@',\n      closeText: '@',\n      dateDisabled: '&'\n    },\n    link: function(scope, element, attrs, ngModel) {\n      var dateFormat,\n          closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection,\n          appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody;\n\n      scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar;\n\n      scope.getText = function( key ) {\n        return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text'];\n      };\n\n      attrs.$observe('datepickerPopup', function(value) {\n          dateFormat = value || datepickerPopupConfig.datepickerPopup;\n          ngModel.$render();\n      });\n\n      // popup element used to display calendar\n      var popupEl = angular.element('<div datepicker-popup-wrap><div datepicker></div></div>');\n      popupEl.attr({\n        'ng-model': 'date',\n        'ng-change': 'dateSelection()'\n      });\n\n      function cameltoDash( string ){\n        return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); });\n      }\n\n      // datepicker element\n      var datepickerEl = angular.element(popupEl.children()[0]);\n      if ( attrs.datepickerOptions ) {\n        angular.forEach(scope.$parent.$eval(attrs.datepickerOptions), function( value, option ) {\n          datepickerEl.attr( cameltoDash(option), value );\n        });\n      }\n\n      angular.forEach(['minDate', 'maxDate'], function( key ) {\n        if ( attrs[key] ) {\n          scope.$parent.$watch($parse(attrs[key]), function(value){\n            scope[key] = value;\n          });\n          datepickerEl.attr(cameltoDash(key), key);\n        }\n      });\n      if (attrs.dateDisabled) {\n        datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })');\n      }\n\n      function parseDate(viewValue) {\n        if (!viewValue) {\n          ngModel.$setValidity('date', true);\n          return null;\n        } else if (angular.isDate(viewValue) && !isNaN(viewValue)) {\n          ngModel.$setValidity('date', true);\n          return viewValue;\n        } else if (angular.isString(viewValue)) {\n          var date = dateParser.parse(viewValue, dateFormat) || new Date(viewValue);\n          if (isNaN(date)) {\n            ngModel.$setValidity('date', false);\n            return undefined;\n          } else {\n            ngModel.$setValidity('date', true);\n            return date;\n          }\n        } else {\n          ngModel.$setValidity('date', false);\n          return undefined;\n        }\n      }\n      ngModel.$parsers.unshift(parseDate);\n\n      // Inner change\n      scope.dateSelection = function(dt) {\n        if (angular.isDefined(dt)) {\n          scope.date = dt;\n        }\n        ngModel.$setViewValue(scope.date);\n        ngModel.$render();\n\n        if ( closeOnDateSelection ) {\n          scope.isOpen = false;\n          element[0].focus();\n        }\n      };\n\n      element.bind('input change keyup', function() {\n        scope.$apply(function() {\n          scope.date = ngModel.$modelValue;\n        });\n      });\n\n      // Outter change\n      ngModel.$render = function() {\n        var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : '';\n        element.val(date);\n        scope.date = parseDate( ngModel.$modelValue );\n      };\n\n      var documentClickBind = function(event) {\n        if (scope.isOpen && event.target !== element[0]) {\n          scope.$apply(function() {\n            scope.isOpen = false;\n          });\n        }\n      };\n\n      var keydown = function(evt, noApply) {\n        scope.keydown(evt);\n      };\n      element.bind('keydown', keydown);\n\n      scope.keydown = function(evt) {\n        if (evt.which === 27) {\n          evt.preventDefault();\n          evt.stopPropagation();\n          scope.close();\n        } else if (evt.which === 40 && !scope.isOpen) {\n          scope.isOpen = true;\n        }\n      };\n\n      scope.$watch('isOpen', function(value) {\n        if (value) {\n          scope.$broadcast('datepicker.focus');\n          scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n          scope.position.top = scope.position.top + element.prop('offsetHeight');\n\n          $document.bind('click', documentClickBind);\n        } else {\n          $document.unbind('click', documentClickBind);\n        }\n      });\n\n      scope.select = function( date ) {\n        if (date === 'today') {\n          var today = new Date();\n          if (angular.isDate(ngModel.$modelValue)) {\n            date = new Date(ngModel.$modelValue);\n            date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate());\n          } else {\n            date = new Date(today.setHours(0, 0, 0, 0));\n          }\n        }\n        scope.dateSelection( date );\n      };\n\n      scope.close = function() {\n        scope.isOpen = false;\n        element[0].focus();\n      };\n\n      var $popup = $compile(popupEl)(scope);\n      if ( appendToBody ) {\n        $document.find('body').append($popup);\n      } else {\n        element.after($popup);\n      }\n\n      scope.$on('$destroy', function() {\n        $popup.remove();\n        element.unbind('keydown', keydown);\n        $document.unbind('click', documentClickBind);\n      });\n    }\n  };\n}])\n\n.directive('datepickerPopupWrap', function() {\n  return {\n    restrict:'EA',\n    replace: true,\n    transclude: true,\n    templateUrl: 'template/datepicker/popup.html',\n    link:function (scope, element, attrs) {\n      element.bind('click', function(event) {\n        event.preventDefault();\n        event.stopPropagation();\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.dropdown', [])\n\n.constant('dropdownConfig', {\n  openClass: 'open'\n})\n\n.service('dropdownService', ['$document', function($document) {\n  var openScope = null;\n\n  this.open = function( dropdownScope ) {\n    if ( !openScope ) {\n      $document.bind('click', closeDropdown);\n      $document.bind('keydown', escapeKeyBind);\n    }\n\n    if ( openScope && openScope !== dropdownScope ) {\n        openScope.isOpen = false;\n    }\n\n    openScope = dropdownScope;\n  };\n\n  this.close = function( dropdownScope ) {\n    if ( openScope === dropdownScope ) {\n      openScope = null;\n      $document.unbind('click', closeDropdown);\n      $document.unbind('keydown', escapeKeyBind);\n    }\n  };\n\n  var closeDropdown = function( evt ) {\n    if (evt && evt.isDefaultPrevented()) {\n        return;\n    }\n\n    openScope.$apply(function() {\n      openScope.isOpen = false;\n    });\n  };\n\n  var escapeKeyBind = function( evt ) {\n    if ( evt.which === 27 ) {\n      openScope.focusToggleElement();\n      closeDropdown();\n    }\n  };\n}])\n\n.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) {\n  var self = this,\n      scope = $scope.$new(), // create a child scope so we are not polluting original one\n      openClass = dropdownConfig.openClass,\n      getIsOpen,\n      setIsOpen = angular.noop,\n      toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop;\n\n  this.init = function( element ) {\n    self.$element = element;\n\n    if ( $attrs.isOpen ) {\n      getIsOpen = $parse($attrs.isOpen);\n      setIsOpen = getIsOpen.assign;\n\n      $scope.$watch(getIsOpen, function(value) {\n        scope.isOpen = !!value;\n      });\n    }\n  };\n\n  this.toggle = function( open ) {\n    return scope.isOpen = arguments.length ? !!open : !scope.isOpen;\n  };\n\n  // Allow other directives to watch status\n  this.isOpen = function() {\n    return scope.isOpen;\n  };\n\n  scope.focusToggleElement = function() {\n    if ( self.toggleElement ) {\n      self.toggleElement[0].focus();\n    }\n  };\n\n  scope.$watch('isOpen', function( isOpen, wasOpen ) {\n    $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass);\n\n    if ( isOpen ) {\n      scope.focusToggleElement();\n      dropdownService.open( scope );\n    } else {\n      dropdownService.close( scope );\n    }\n\n    setIsOpen($scope, isOpen);\n    if (angular.isDefined(isOpen) && isOpen !== wasOpen) {\n      toggleInvoker($scope, { open: !!isOpen });\n    }\n  });\n\n  $scope.$on('$locationChangeSuccess', function() {\n    scope.isOpen = false;\n  });\n\n  $scope.$on('$destroy', function() {\n    scope.$destroy();\n  });\n}])\n\n.directive('dropdown', function() {\n  return {\n    restrict: 'CA',\n    controller: 'DropdownController',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      dropdownCtrl.init( element );\n    }\n  };\n})\n\n.directive('dropdownToggle', function() {\n  return {\n    restrict: 'CA',\n    require: '?^dropdown',\n    link: function(scope, element, attrs, dropdownCtrl) {\n      if ( !dropdownCtrl ) {\n        return;\n      }\n\n      dropdownCtrl.toggleElement = element;\n\n      var toggleDropdown = function(event) {\n        event.preventDefault();\n\n        if ( !element.hasClass('disabled') && !attrs.disabled ) {\n          scope.$apply(function() {\n            dropdownCtrl.toggle();\n          });\n        }\n      };\n\n      element.bind('click', toggleDropdown);\n\n      // WAI-ARIA\n      element.attr({ 'aria-haspopup': true, 'aria-expanded': false });\n      scope.$watch(dropdownCtrl.isOpen, function( isOpen ) {\n        element.attr('aria-expanded', !!isOpen);\n      });\n\n      scope.$on('$destroy', function() {\n        element.unbind('click', toggleDropdown);\n      });\n    }\n  };\n});\n\nangular.module('ui.bootstrap.modal', ['ui.bootstrap.transition'])\n\n/**\n * A helper, internal data structure that acts as a map but also allows getting / removing\n * elements in the LIFO order\n */\n  .factory('$$stackedMap', function () {\n    return {\n      createNew: function () {\n        var stack = [];\n\n        return {\n          add: function (key, value) {\n            stack.push({\n              key: key,\n              value: value\n            });\n          },\n          get: function (key) {\n            for (var i = 0; i < stack.length; i++) {\n              if (key == stack[i].key) {\n                return stack[i];\n              }\n            }\n          },\n          keys: function() {\n            var keys = [];\n            for (var i = 0; i < stack.length; i++) {\n              keys.push(stack[i].key);\n            }\n            return keys;\n          },\n          top: function () {\n            return stack[stack.length - 1];\n          },\n          remove: function (key) {\n            var idx = -1;\n            for (var i = 0; i < stack.length; i++) {\n              if (key == stack[i].key) {\n                idx = i;\n                break;\n              }\n            }\n            return stack.splice(idx, 1)[0];\n          },\n          removeTop: function () {\n            return stack.splice(stack.length - 1, 1)[0];\n          },\n          length: function () {\n            return stack.length;\n          }\n        };\n      }\n    };\n  })\n\n/**\n * A helper directive for the $modal service. It creates a backdrop element.\n */\n  .directive('modalBackdrop', ['$timeout', function ($timeout) {\n    return {\n      restrict: 'EA',\n      replace: true,\n      templateUrl: 'template/modal/backdrop.html',\n      link: function (scope) {\n\n        scope.animate = false;\n\n        //trigger CSS transitions\n        $timeout(function () {\n          scope.animate = true;\n        });\n      }\n    };\n  }])\n\n  .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) {\n    return {\n      restrict: 'EA',\n      scope: {\n        index: '@',\n        animate: '='\n      },\n      replace: true,\n      transclude: true,\n      templateUrl: function(tElement, tAttrs) {\n        return tAttrs.templateUrl || 'template/modal/window.html';\n      },\n      link: function (scope, element, attrs) {\n        element.addClass(attrs.windowClass || '');\n        scope.size = attrs.size;\n\n        $timeout(function () {\n          // trigger CSS transitions\n          scope.animate = true;\n          // focus a freshly-opened modal\n          element[0].focus();\n        });\n\n        scope.close = function (evt) {\n          var modal = $modalStack.getTop();\n          if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) {\n            evt.preventDefault();\n            evt.stopPropagation();\n            $modalStack.dismiss(modal.key, 'backdrop click');\n          }\n        };\n      }\n    };\n  }])\n\n  .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap',\n    function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) {\n\n      var OPENED_MODAL_CLASS = 'modal-open';\n\n      var backdropDomEl, backdropScope;\n      var openedWindows = $$stackedMap.createNew();\n      var $modalStack = {};\n\n      function backdropIndex() {\n        var topBackdropIndex = -1;\n        var opened = openedWindows.keys();\n        for (var i = 0; i < opened.length; i++) {\n          if (openedWindows.get(opened[i]).value.backdrop) {\n            topBackdropIndex = i;\n          }\n        }\n        return topBackdropIndex;\n      }\n\n      $rootScope.$watch(backdropIndex, function(newBackdropIndex){\n        if (backdropScope) {\n          backdropScope.index = newBackdropIndex;\n        }\n      });\n\n      function removeModalWindow(modalInstance) {\n\n        var body = $document.find('body').eq(0);\n        var modalWindow = openedWindows.get(modalInstance).value;\n\n        //clean up the stack\n        openedWindows.remove(modalInstance);\n\n        //remove window DOM element\n        removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, function() {\n          modalWindow.modalScope.$destroy();\n          body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0);\n          checkRemoveBackdrop();\n        });\n      }\n\n      function checkRemoveBackdrop() {\n          //remove backdrop if no longer needed\n          if (backdropDomEl && backdropIndex() == -1) {\n            var backdropScopeRef = backdropScope;\n            removeAfterAnimate(backdropDomEl, backdropScope, 150, function () {\n              backdropScopeRef.$destroy();\n              backdropScopeRef = null;\n            });\n            backdropDomEl = undefined;\n            backdropScope = undefined;\n          }\n      }\n\n      function removeAfterAnimate(domEl, scope, emulateTime, done) {\n        // Closing animation\n        scope.animate = false;\n\n        var transitionEndEventName = $transition.transitionEndEventName;\n        if (transitionEndEventName) {\n          // transition out\n          var timeout = $timeout(afterAnimating, emulateTime);\n\n          domEl.bind(transitionEndEventName, function () {\n            $timeout.cancel(timeout);\n            afterAnimating();\n            scope.$apply();\n          });\n        } else {\n          // Ensure this call is async\n          $timeout(afterAnimating, 0);\n        }\n\n        function afterAnimating() {\n          if (afterAnimating.done) {\n            return;\n          }\n          afterAnimating.done = true;\n\n          domEl.remove();\n          if (done) {\n            done();\n          }\n        }\n      }\n\n      $document.bind('keydown', function (evt) {\n        var modal;\n\n        if (evt.which === 27) {\n          modal = openedWindows.top();\n          if (modal && modal.value.keyboard) {\n            evt.preventDefault();\n            $rootScope.$apply(function () {\n              $modalStack.dismiss(modal.key, 'escape key press');\n            });\n          }\n        }\n      });\n\n      $modalStack.open = function (modalInstance, modal) {\n\n        openedWindows.add(modalInstance, {\n          deferred: modal.deferred,\n          modalScope: modal.scope,\n          backdrop: modal.backdrop,\n          keyboard: modal.keyboard\n        });\n\n        var body = $document.find('body').eq(0),\n            currBackdropIndex = backdropIndex();\n\n        if (currBackdropIndex >= 0 && !backdropDomEl) {\n          backdropScope = $rootScope.$new(true);\n          backdropScope.index = currBackdropIndex;\n          backdropDomEl = $compile('<div modal-backdrop></div>')(backdropScope);\n          body.append(backdropDomEl);\n        }\n\n        var angularDomEl = angular.element('<div modal-window></div>');\n        angularDomEl.attr({\n          'template-url': modal.windowTemplateUrl,\n          'window-class': modal.windowClass,\n          'size': modal.size,\n          'index': openedWindows.length() - 1,\n          'animate': 'animate'\n        }).html(modal.content);\n\n        var modalDomEl = $compile(angularDomEl)(modal.scope);\n        openedWindows.top().value.modalDomEl = modalDomEl;\n        body.append(modalDomEl);\n        body.addClass(OPENED_MODAL_CLASS);\n      };\n\n      $modalStack.close = function (modalInstance, result) {\n        var modalWindow = openedWindows.get(modalInstance).value;\n        if (modalWindow) {\n          modalWindow.deferred.resolve(result);\n          removeModalWindow(modalInstance);\n        }\n      };\n\n      $modalStack.dismiss = function (modalInstance, reason) {\n        var modalWindow = openedWindows.get(modalInstance).value;\n        if (modalWindow) {\n          modalWindow.deferred.reject(reason);\n          removeModalWindow(modalInstance);\n        }\n      };\n\n      $modalStack.dismissAll = function (reason) {\n        var topModal = this.getTop();\n        while (topModal) {\n          this.dismiss(topModal.key, reason);\n          topModal = this.getTop();\n        }\n      };\n\n      $modalStack.getTop = function () {\n        return openedWindows.top();\n      };\n\n      return $modalStack;\n    }])\n\n  .provider('$modal', function () {\n\n    var $modalProvider = {\n      options: {\n        backdrop: true, //can be also false or 'static'\n        keyboard: true\n      },\n      $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack',\n        function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) {\n\n          var $modal = {};\n\n          function getTemplatePromise(options) {\n            return options.template ? $q.when(options.template) :\n              $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) {\n                return result.data;\n              });\n          }\n\n          function getResolvePromises(resolves) {\n            var promisesArr = [];\n            angular.forEach(resolves, function (value, key) {\n              if (angular.isFunction(value) || angular.isArray(value)) {\n                promisesArr.push($q.when($injector.invoke(value)));\n              }\n            });\n            return promisesArr;\n          }\n\n          $modal.open = function (modalOptions) {\n\n            var modalResultDeferred = $q.defer();\n            var modalOpenedDeferred = $q.defer();\n\n            //prepare an instance of a modal to be injected into controllers and returned to a caller\n            var modalInstance = {\n              result: modalResultDeferred.promise,\n              opened: modalOpenedDeferred.promise,\n              close: function (result) {\n                $modalStack.close(modalInstance, result);\n              },\n              dismiss: function (reason) {\n                $modalStack.dismiss(modalInstance, reason);\n              }\n            };\n\n            //merge and clean up options\n            modalOptions = angular.extend({}, $modalProvider.options, modalOptions);\n            modalOptions.resolve = modalOptions.resolve || {};\n\n            //verify options\n            if (!modalOptions.template && !modalOptions.templateUrl) {\n              throw new Error('One of template or templateUrl options is required.');\n            }\n\n            var templateAndResolvePromise =\n              $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve)));\n\n\n            templateAndResolvePromise.then(function resolveSuccess(tplAndVars) {\n\n              var modalScope = (modalOptions.scope || $rootScope).$new();\n              modalScope.$close = modalInstance.close;\n              modalScope.$dismiss = modalInstance.dismiss;\n\n              var ctrlInstance, ctrlLocals = {};\n              var resolveIter = 1;\n\n              //controllers\n              if (modalOptions.controller) {\n                ctrlLocals.$scope = modalScope;\n                ctrlLocals.$modalInstance = modalInstance;\n                angular.forEach(modalOptions.resolve, function (value, key) {\n                  ctrlLocals[key] = tplAndVars[resolveIter++];\n                });\n\n                ctrlInstance = $controller(modalOptions.controller, ctrlLocals);\n              }\n\n              $modalStack.open(modalInstance, {\n                scope: modalScope,\n                deferred: modalResultDeferred,\n                content: tplAndVars[0],\n                backdrop: modalOptions.backdrop,\n                keyboard: modalOptions.keyboard,\n                windowClass: modalOptions.windowClass,\n                windowTemplateUrl: modalOptions.windowTemplateUrl,\n                size: modalOptions.size\n              });\n\n            }, function resolveError(reason) {\n              modalResultDeferred.reject(reason);\n            });\n\n            templateAndResolvePromise.then(function () {\n              modalOpenedDeferred.resolve(true);\n            }, function () {\n              modalOpenedDeferred.reject(false);\n            });\n\n            return modalInstance;\n          };\n\n          return $modal;\n        }]\n    };\n\n    return $modalProvider;\n  });\n\nangular.module('ui.bootstrap.pagination', [])\n\n.controller('PaginationController', ['$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) {\n  var self = this,\n      ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\n      setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop;\n\n  this.init = function(ngModelCtrl_, config) {\n    ngModelCtrl = ngModelCtrl_;\n    this.config = config;\n\n    ngModelCtrl.$render = function() {\n      self.render();\n    };\n\n    if ($attrs.itemsPerPage) {\n      $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) {\n        self.itemsPerPage = parseInt(value, 10);\n        $scope.totalPages = self.calculateTotalPages();\n      });\n    } else {\n      this.itemsPerPage = config.itemsPerPage;\n    }\n  };\n\n  this.calculateTotalPages = function() {\n    var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage);\n    return Math.max(totalPages || 0, 1);\n  };\n\n  this.render = function() {\n    $scope.page = parseInt(ngModelCtrl.$viewValue, 10) || 1;\n  };\n\n  $scope.selectPage = function(page) {\n    if ( $scope.page !== page && page > 0 && page <= $scope.totalPages) {\n      ngModelCtrl.$setViewValue(page);\n      ngModelCtrl.$render();\n    }\n  };\n\n  $scope.getText = function( key ) {\n    return $scope[key + 'Text'] || self.config[key + 'Text'];\n  };\n  $scope.noPrevious = function() {\n    return $scope.page === 1;\n  };\n  $scope.noNext = function() {\n    return $scope.page === $scope.totalPages;\n  };\n\n  $scope.$watch('totalItems', function() {\n    $scope.totalPages = self.calculateTotalPages();\n  });\n\n  $scope.$watch('totalPages', function(value) {\n    setNumPages($scope.$parent, value); // Readonly variable\n\n    if ( $scope.page > value ) {\n      $scope.selectPage(value);\n    } else {\n      ngModelCtrl.$render();\n    }\n  });\n}])\n\n.constant('paginationConfig', {\n  itemsPerPage: 10,\n  boundaryLinks: false,\n  directionLinks: true,\n  firstText: 'First',\n  previousText: 'Previous',\n  nextText: 'Next',\n  lastText: 'Last',\n  rotate: true\n})\n\n.directive('pagination', ['$parse', 'paginationConfig', function($parse, paginationConfig) {\n  return {\n    restrict: 'EA',\n    scope: {\n      totalItems: '=',\n      firstText: '@',\n      previousText: '@',\n      nextText: '@',\n      lastText: '@'\n    },\n    require: ['pagination', '?ngModel'],\n    controller: 'PaginationController',\n    templateUrl: 'template/pagination/pagination.html',\n    replace: true,\n    link: function(scope, element, attrs, ctrls) {\n      var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if (!ngModelCtrl) {\n         return; // do nothing if no ng-model\n      }\n\n      // Setup configuration parameters\n      var maxSize = angular.isDefined(attrs.maxSize) ? scope.$parent.$eval(attrs.maxSize) : paginationConfig.maxSize,\n          rotate = angular.isDefined(attrs.rotate) ? scope.$parent.$eval(attrs.rotate) : paginationConfig.rotate;\n      scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : paginationConfig.boundaryLinks;\n      scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : paginationConfig.directionLinks;\n\n      paginationCtrl.init(ngModelCtrl, paginationConfig);\n\n      if (attrs.maxSize) {\n        scope.$parent.$watch($parse(attrs.maxSize), function(value) {\n          maxSize = parseInt(value, 10);\n          paginationCtrl.render();\n        });\n      }\n\n      // Create page object used in template\n      function makePage(number, text, isActive) {\n        return {\n          number: number,\n          text: text,\n          active: isActive\n        };\n      }\n\n      function getPages(currentPage, totalPages) {\n        var pages = [];\n\n        // Default page limits\n        var startPage = 1, endPage = totalPages;\n        var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages );\n\n        // recompute if maxSize\n        if ( isMaxSized ) {\n          if ( rotate ) {\n            // Current page is displayed in the middle of the visible ones\n            startPage = Math.max(currentPage - Math.floor(maxSize/2), 1);\n            endPage   = startPage + maxSize - 1;\n\n            // Adjust if limit is exceeded\n            if (endPage > totalPages) {\n              endPage   = totalPages;\n              startPage = endPage - maxSize + 1;\n            }\n          } else {\n            // Visible pages are paginated with maxSize\n            startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1;\n\n            // Adjust last page if limit is exceeded\n            endPage = Math.min(startPage + maxSize - 1, totalPages);\n          }\n        }\n\n        // Add page number links\n        for (var number = startPage; number <= endPage; number++) {\n          var page = makePage(number, number, number === currentPage);\n          pages.push(page);\n        }\n\n        // Add links to move between page sets\n        if ( isMaxSized && ! rotate ) {\n          if ( startPage > 1 ) {\n            var previousPageSet = makePage(startPage - 1, '...', false);\n            pages.unshift(previousPageSet);\n          }\n\n          if ( endPage < totalPages ) {\n            var nextPageSet = makePage(endPage + 1, '...', false);\n            pages.push(nextPageSet);\n          }\n        }\n\n        return pages;\n      }\n\n      var originalRender = paginationCtrl.render;\n      paginationCtrl.render = function() {\n        originalRender();\n        if (scope.page > 0 && scope.page <= scope.totalPages) {\n          scope.pages = getPages(scope.page, scope.totalPages);\n        }\n      };\n    }\n  };\n}])\n\n.constant('pagerConfig', {\n  itemsPerPage: 10,\n  previousText: '« Previous',\n  nextText: 'Next »',\n  align: true\n})\n\n.directive('pager', ['pagerConfig', function(pagerConfig) {\n  return {\n    restrict: 'EA',\n    scope: {\n      totalItems: '=',\n      previousText: '@',\n      nextText: '@'\n    },\n    require: ['pager', '?ngModel'],\n    controller: 'PaginationController',\n    templateUrl: 'template/pagination/pager.html',\n    replace: true,\n    link: function(scope, element, attrs, ctrls) {\n      var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if (!ngModelCtrl) {\n         return; // do nothing if no ng-model\n      }\n\n      scope.align = angular.isDefined(attrs.align) ? scope.$parent.$eval(attrs.align) : pagerConfig.align;\n      paginationCtrl.init(ngModelCtrl, pagerConfig);\n    }\n  };\n}]);\n\n/**\n * The following features are still outstanding: animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html tooltips, and selector delegation.\n */\nangular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] )\n\n/**\n * The $tooltip service creates tooltip- and popover-like directives as well as\n * houses global options for them.\n */\n.provider( '$tooltip', function () {\n  // The default options tooltip and popover.\n  var defaultOptions = {\n    placement: 'top',\n    animation: true,\n    popupDelay: 0\n  };\n\n  // Default hide triggers for each show trigger\n  var triggerMap = {\n    'mouseenter': 'mouseleave',\n    'click': 'click',\n    'focus': 'blur'\n  };\n\n  // The options specified to the provider globally.\n  var globalOptions = {};\n\n  /**\n   * `options({})` allows global configuration of all tooltips in the\n   * application.\n   *\n   *   var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) {\n   *     // place tooltips left instead of top by default\n   *     $tooltipProvider.options( { placement: 'left' } );\n   *   });\n   */\n\tthis.options = function( value ) {\n\t\tangular.extend( globalOptions, value );\n\t};\n\n  /**\n   * This allows you to extend the set of trigger mappings available. E.g.:\n   *\n   *   $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' );\n   */\n  this.setTriggers = function setTriggers ( triggers ) {\n    angular.extend( triggerMap, triggers );\n  };\n\n  /**\n   * This is a helper function for translating camel-case to snake-case.\n   */\n  function snake_case(name){\n    var regexp = /[A-Z]/g;\n    var separator = '-';\n    return name.replace(regexp, function(letter, pos) {\n      return (pos ? separator : '') + letter.toLowerCase();\n    });\n  }\n\n  /**\n   * Returns the actual instance of the $tooltip service.\n   * TODO support multiple triggers\n   */\n  this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) {\n    return function $tooltip ( type, prefix, defaultTriggerShow ) {\n      var options = angular.extend( {}, defaultOptions, globalOptions );\n\n      /**\n       * Returns an object of show and hide triggers.\n       *\n       * If a trigger is supplied,\n       * it is used to show the tooltip; otherwise, it will use the `trigger`\n       * option passed to the `$tooltipProvider.options` method; else it will\n       * default to the trigger supplied to this directive factory.\n       *\n       * The hide trigger is based on the show trigger. If the `trigger` option\n       * was passed to the `$tooltipProvider.options` method, it will use the\n       * mapped trigger from `triggerMap` or the passed trigger if the map is\n       * undefined; otherwise, it uses the `triggerMap` value of the show\n       * trigger; else it will just use the show trigger.\n       */\n      function getTriggers ( trigger ) {\n        var show = trigger || options.trigger || defaultTriggerShow;\n        var hide = triggerMap[show] || show;\n        return {\n          show: show,\n          hide: hide\n        };\n      }\n\n      var directiveName = snake_case( type );\n\n      var startSym = $interpolate.startSymbol();\n      var endSym = $interpolate.endSymbol();\n      var template =\n        '<div '+ directiveName +'-popup '+\n          'title=\"'+startSym+'tt_title'+endSym+'\" '+\n          'content=\"'+startSym+'tt_content'+endSym+'\" '+\n          'placement=\"'+startSym+'tt_placement'+endSym+'\" '+\n          'animation=\"tt_animation\" '+\n          'is-open=\"tt_isOpen\"'+\n          '>'+\n        '</div>';\n\n      return {\n        restrict: 'EA',\n        scope: true,\n        compile: function (tElem, tAttrs) {\n          var tooltipLinker = $compile( template );\n\n          return function link ( scope, element, attrs ) {\n            var tooltip;\n            var transitionTimeout;\n            var popupTimeout;\n            var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false;\n            var triggers = getTriggers( undefined );\n            var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']);\n\n            var positionTooltip = function () {\n\n              var ttPosition = $position.positionElements(element, tooltip, scope.tt_placement, appendToBody);\n              ttPosition.top += 'px';\n              ttPosition.left += 'px';\n\n              // Now set the calculated positioning.\n              tooltip.css( ttPosition );\n            };\n\n            // By default, the tooltip is not open.\n            // TODO add ability to start tooltip opened\n            scope.tt_isOpen = false;\n\n            function toggleTooltipBind () {\n              if ( ! scope.tt_isOpen ) {\n                showTooltipBind();\n              } else {\n                hideTooltipBind();\n              }\n            }\n\n            // Show the tooltip with delay if specified, otherwise show it immediately\n            function showTooltipBind() {\n              if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) {\n                return;\n              }\n              if ( scope.tt_popupDelay ) {\n                // Do nothing if the tooltip was already scheduled to pop-up.\n                // This happens if show is triggered multiple times before any hide is triggered.\n                if (!popupTimeout) {\n                  popupTimeout = $timeout( show, scope.tt_popupDelay, false );\n                  popupTimeout.then(function(reposition){reposition();});\n                }\n              } else {\n                show()();\n              }\n            }\n\n            function hideTooltipBind () {\n              scope.$apply(function () {\n                hide();\n              });\n            }\n\n            // Show the tooltip popup element.\n            function show() {\n\n              popupTimeout = null;\n\n              // If there is a pending remove transition, we must cancel it, lest the\n              // tooltip be mysteriously removed.\n              if ( transitionTimeout ) {\n                $timeout.cancel( transitionTimeout );\n                transitionTimeout = null;\n              }\n\n              // Don't show empty tooltips.\n              if ( ! scope.tt_content ) {\n                return angular.noop;\n              }\n\n              createTooltip();\n\n              // Set the initial positioning.\n              tooltip.css({ top: 0, left: 0, display: 'block' });\n\n              // Now we add it to the DOM because need some info about it. But it's not \n              // visible yet anyway.\n              if ( appendToBody ) {\n                  $document.find( 'body' ).append( tooltip );\n              } else {\n                element.after( tooltip );\n              }\n\n              positionTooltip();\n\n              // And show the tooltip.\n              scope.tt_isOpen = true;\n              scope.$digest(); // digest required as $apply is not called\n\n              // Return positioning function as promise callback for correct\n              // positioning after draw.\n              return positionTooltip;\n            }\n\n            // Hide the tooltip popup element.\n            function hide() {\n              // First things first: we don't show it anymore.\n              scope.tt_isOpen = false;\n\n              //if tooltip is going to be shown after delay, we must cancel this\n              $timeout.cancel( popupTimeout );\n              popupTimeout = null;\n\n              // And now we remove it from the DOM. However, if we have animation, we \n              // need to wait for it to expire beforehand.\n              // FIXME: this is a placeholder for a port of the transitions library.\n              if ( scope.tt_animation ) {\n                if (!transitionTimeout) {\n                  transitionTimeout = $timeout(removeTooltip, 500);\n                }\n              } else {\n                removeTooltip();\n              }\n            }\n\n            function createTooltip() {\n              // There can only be one tooltip element per directive shown at once.\n              if (tooltip) {\n                removeTooltip();\n              }\n              tooltip = tooltipLinker(scope, function () {});\n\n              // Get contents rendered into the tooltip\n              scope.$digest();\n            }\n\n            function removeTooltip() {\n              transitionTimeout = null;\n              if (tooltip) {\n                tooltip.remove();\n                tooltip = null;\n              }\n            }\n\n            /**\n             * Observe the relevant attributes.\n             */\n            attrs.$observe( type, function ( val ) {\n              scope.tt_content = val;\n\n              if (!val && scope.tt_isOpen ) {\n                hide();\n              }\n            });\n\n            attrs.$observe( prefix+'Title', function ( val ) {\n              scope.tt_title = val;\n            });\n\n            attrs.$observe( prefix+'Placement', function ( val ) {\n              scope.tt_placement = angular.isDefined( val ) ? val : options.placement;\n            });\n\n            attrs.$observe( prefix+'PopupDelay', function ( val ) {\n              var delay = parseInt( val, 10 );\n              scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay;\n            });\n\n            var unregisterTriggers = function () {\n              element.unbind(triggers.show, showTooltipBind);\n              element.unbind(triggers.hide, hideTooltipBind);\n            };\n\n            attrs.$observe( prefix+'Trigger', function ( val ) {\n              unregisterTriggers();\n\n              triggers = getTriggers( val );\n\n              if ( triggers.show === triggers.hide ) {\n                element.bind( triggers.show, toggleTooltipBind );\n              } else {\n                element.bind( triggers.show, showTooltipBind );\n                element.bind( triggers.hide, hideTooltipBind );\n              }\n            });\n\n            var animation = scope.$eval(attrs[prefix + 'Animation']);\n            scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation;\n\n            attrs.$observe( prefix+'AppendToBody', function ( val ) {\n              appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody;\n            });\n\n            // if a tooltip is attached to <body> we need to remove it on\n            // location change as its parent scope will probably not be destroyed\n            // by the change.\n            if ( appendToBody ) {\n              scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () {\n              if ( scope.tt_isOpen ) {\n                hide();\n              }\n            });\n            }\n\n            // Make sure tooltip is destroyed and removed.\n            scope.$on('$destroy', function onDestroyTooltip() {\n              $timeout.cancel( transitionTimeout );\n              $timeout.cancel( popupTimeout );\n              unregisterTriggers();\n              removeTooltip();\n            });\n          };\n        }\n      };\n    };\n  }];\n})\n\n.directive( 'tooltipPopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/tooltip/tooltip-popup.html'\n  };\n})\n\n.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'tooltip', 'tooltip', 'mouseenter' );\n}])\n\n.directive( 'tooltipHtmlUnsafePopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html'\n  };\n})\n\n.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' );\n}]);\n\n/**\n * The following features are still outstanding: popup delay, animation as a\n * function, placement as a function, inside, support for more triggers than\n * just mouse enter/leave, html popovers, and selector delegatation.\n */\nangular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] )\n\n.directive( 'popoverPopup', function () {\n  return {\n    restrict: 'EA',\n    replace: true,\n    scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' },\n    templateUrl: 'template/popover/popover.html'\n  };\n})\n\n.directive( 'popover', [ '$tooltip', function ( $tooltip ) {\n  return $tooltip( 'popover', 'popover', 'click' );\n}]);\n\nangular.module('ui.bootstrap.progressbar', [])\n\n.constant('progressConfig', {\n  animate: true,\n  max: 100\n})\n\n.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) {\n    var self = this,\n        animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;\n\n    this.bars = [];\n    $scope.max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max;\n\n    this.addBar = function(bar, element) {\n        if ( !animate ) {\n            element.css({'transition': 'none'});\n        }\n\n        this.bars.push(bar);\n\n        bar.$watch('value', function( value ) {\n            bar.percent = +(100 * value / $scope.max).toFixed(2);\n        });\n\n        bar.$on('$destroy', function() {\n            element = null;\n            self.removeBar(bar);\n        });\n    };\n\n    this.removeBar = function(bar) {\n        this.bars.splice(this.bars.indexOf(bar), 1);\n    };\n}])\n\n.directive('progress', function() {\n    return {\n        restrict: 'EA',\n        replace: true,\n        transclude: true,\n        controller: 'ProgressController',\n        require: 'progress',\n        scope: {},\n        templateUrl: 'template/progressbar/progress.html'\n    };\n})\n\n.directive('bar', function() {\n    return {\n        restrict: 'EA',\n        replace: true,\n        transclude: true,\n        require: '^progress',\n        scope: {\n            value: '=',\n            type: '@'\n        },\n        templateUrl: 'template/progressbar/bar.html',\n        link: function(scope, element, attrs, progressCtrl) {\n            progressCtrl.addBar(scope, element);\n        }\n    };\n})\n\n.directive('progressbar', function() {\n    return {\n        restrict: 'EA',\n        replace: true,\n        transclude: true,\n        controller: 'ProgressController',\n        scope: {\n            value: '=',\n            type: '@'\n        },\n        templateUrl: 'template/progressbar/progressbar.html',\n        link: function(scope, element, attrs, progressCtrl) {\n            progressCtrl.addBar(scope, angular.element(element.children()[0]));\n        }\n    };\n});\nangular.module('ui.bootstrap.rating', [])\n\n.constant('ratingConfig', {\n  max: 5,\n  stateOn: null,\n  stateOff: null\n})\n\n.controller('RatingController', ['$scope', '$attrs', 'ratingConfig', function($scope, $attrs, ratingConfig) {\n  var ngModelCtrl  = { $setViewValue: angular.noop };\n\n  this.init = function(ngModelCtrl_) {\n    ngModelCtrl = ngModelCtrl_;\n    ngModelCtrl.$render = this.render;\n\n    this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn;\n    this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff;\n\n    var ratingStates = angular.isDefined($attrs.ratingStates) ? $scope.$parent.$eval($attrs.ratingStates) :\n                        new Array( angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max );\n    $scope.range = this.buildTemplateObjects(ratingStates);\n  };\n\n  this.buildTemplateObjects = function(states) {\n    for (var i = 0, n = states.length; i < n; i++) {\n      states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff }, states[i]);\n    }\n    return states;\n  };\n\n  $scope.rate = function(value) {\n    if ( !$scope.readonly && value >= 0 && value <= $scope.range.length ) {\n      ngModelCtrl.$setViewValue(value);\n      ngModelCtrl.$render();\n    }\n  };\n\n  $scope.enter = function(value) {\n    if ( !$scope.readonly ) {\n      $scope.value = value;\n    }\n    $scope.onHover({value: value});\n  };\n\n  $scope.reset = function() {\n    $scope.value = ngModelCtrl.$viewValue;\n    $scope.onLeave();\n  };\n\n  $scope.onKeydown = function(evt) {\n    if (/(37|38|39|40)/.test(evt.which)) {\n      evt.preventDefault();\n      evt.stopPropagation();\n      $scope.rate( $scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1) );\n    }\n  };\n\n  this.render = function() {\n    $scope.value = ngModelCtrl.$viewValue;\n  };\n}])\n\n.directive('rating', function() {\n  return {\n    restrict: 'EA',\n    require: ['rating', 'ngModel'],\n    scope: {\n      readonly: '=?',\n      onHover: '&',\n      onLeave: '&'\n    },\n    controller: 'RatingController',\n    templateUrl: 'template/rating/rating.html',\n    replace: true,\n    link: function(scope, element, attrs, ctrls) {\n      var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if ( ngModelCtrl ) {\n        ratingCtrl.init( ngModelCtrl );\n      }\n    }\n  };\n});\n\n/**\n * @ngdoc overview\n * @name ui.bootstrap.tabs\n *\n * @description\n * AngularJS version of the tabs directive.\n */\n\nangular.module('ui.bootstrap.tabs', [])\n\n.controller('TabsetController', ['$scope', function TabsetCtrl($scope) {\n  var ctrl = this,\n      tabs = ctrl.tabs = $scope.tabs = [];\n\n  ctrl.select = function(selectedTab) {\n    angular.forEach(tabs, function(tab) {\n      if (tab.active && tab !== selectedTab) {\n        tab.active = false;\n        tab.onDeselect();\n      }\n    });\n    selectedTab.active = true;\n    selectedTab.onSelect();\n  };\n\n  ctrl.addTab = function addTab(tab) {\n    tabs.push(tab);\n    // we can't run the select function on the first tab\n    // since that would select it twice\n    if (tabs.length === 1) {\n      tab.active = true;\n    } else if (tab.active) {\n      ctrl.select(tab);\n    }\n  };\n\n  ctrl.removeTab = function removeTab(tab) {\n    var index = tabs.indexOf(tab);\n    //Select a new tab if the tab to be removed is selected\n    if (tab.active && tabs.length > 1) {\n      //If this is the last tab, select the previous tab. else, the next tab.\n      var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1;\n      ctrl.select(tabs[newActiveIndex]);\n    }\n    tabs.splice(index, 1);\n  };\n}])\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.tabs.directive:tabset\n * @restrict EA\n *\n * @description\n * Tabset is the outer container for the tabs directive\n *\n * @param {boolean=} vertical Whether or not to use vertical styling for the tabs.\n * @param {boolean=} justified Whether or not to use justified styling for the tabs.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <tabset>\n      <tab heading=\"Tab 1\"><b>First</b> Content!</tab>\n      <tab heading=\"Tab 2\"><i>Second</i> Content!</tab>\n    </tabset>\n    <hr />\n    <tabset vertical=\"true\">\n      <tab heading=\"Vertical Tab 1\"><b>First</b> Vertical Content!</tab>\n      <tab heading=\"Vertical Tab 2\"><i>Second</i> Vertical Content!</tab>\n    </tabset>\n    <tabset justified=\"true\">\n      <tab heading=\"Justified Tab 1\"><b>First</b> Justified Content!</tab>\n      <tab heading=\"Justified Tab 2\"><i>Second</i> Justified Content!</tab>\n    </tabset>\n  </file>\n</example>\n */\n.directive('tabset', function() {\n  return {\n    restrict: 'EA',\n    transclude: true,\n    replace: true,\n    scope: {\n      type: '@'\n    },\n    controller: 'TabsetController',\n    templateUrl: 'template/tabs/tabset.html',\n    link: function(scope, element, attrs) {\n      scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false;\n      scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false;\n    }\n  };\n})\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.tabs.directive:tab\n * @restrict EA\n *\n * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}.\n * @param {string=} select An expression to evaluate when the tab is selected.\n * @param {boolean=} active A binding, telling whether or not this tab is selected.\n * @param {boolean=} disabled A binding, telling whether or not this tab is disabled.\n *\n * @description\n * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <div ng-controller=\"TabsDemoCtrl\">\n      <button class=\"btn btn-small\" ng-click=\"items[0].active = true\">\n        Select item 1, using active binding\n      </button>\n      <button class=\"btn btn-small\" ng-click=\"items[1].disabled = !items[1].disabled\">\n        Enable/disable item 2, using disabled binding\n      </button>\n      <br />\n      <tabset>\n        <tab heading=\"Tab 1\">First Tab</tab>\n        <tab select=\"alertMe()\">\n          <tab-heading><i class=\"icon-bell\"></i> Alert me!</tab-heading>\n          Second Tab, with alert callback and html heading!\n        </tab>\n        <tab ng-repeat=\"item in items\"\n          heading=\"{{item.title}}\"\n          disabled=\"item.disabled\"\n          active=\"item.active\">\n          {{item.content}}\n        </tab>\n      </tabset>\n    </div>\n  </file>\n  <file name=\"script.js\">\n    function TabsDemoCtrl($scope) {\n      $scope.items = [\n        { title:\"Dynamic Title 1\", content:\"Dynamic Item 0\" },\n        { title:\"Dynamic Title 2\", content:\"Dynamic Item 1\", disabled: true }\n      ];\n\n      $scope.alertMe = function() {\n        setTimeout(function() {\n          alert(\"You've selected the alert tab!\");\n        });\n      };\n    };\n  </file>\n</example>\n */\n\n/**\n * @ngdoc directive\n * @name ui.bootstrap.tabs.directive:tabHeading\n * @restrict EA\n *\n * @description\n * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element.\n *\n * @example\n<example module=\"ui.bootstrap\">\n  <file name=\"index.html\">\n    <tabset>\n      <tab>\n        <tab-heading><b>HTML</b> in my titles?!</tab-heading>\n        And some content, too!\n      </tab>\n      <tab>\n        <tab-heading><i class=\"icon-heart\"></i> Icon heading?!?</tab-heading>\n        That's right.\n      </tab>\n    </tabset>\n  </file>\n</example>\n */\n.directive('tab', ['$parse', function($parse) {\n  return {\n    require: '^tabset',\n    restrict: 'EA',\n    replace: true,\n    templateUrl: 'template/tabs/tab.html',\n    transclude: true,\n    scope: {\n      active: '=?',\n      heading: '@',\n      onSelect: '&select', //This callback is called in contentHeadingTransclude\n                          //once it inserts the tab's content into the dom\n      onDeselect: '&deselect'\n    },\n    controller: function() {\n      //Empty controller so other directives can require being 'under' a tab\n    },\n    compile: function(elm, attrs, transclude) {\n      return function postLink(scope, elm, attrs, tabsetCtrl) {\n        scope.$watch('active', function(active) {\n          if (active) {\n            tabsetCtrl.select(scope);\n          }\n        });\n\n        scope.disabled = false;\n        if ( attrs.disabled ) {\n          scope.$parent.$watch($parse(attrs.disabled), function(value) {\n            scope.disabled = !! value;\n          });\n        }\n\n        scope.select = function() {\n          if ( !scope.disabled ) {\n            scope.active = true;\n          }\n        };\n\n        tabsetCtrl.addTab(scope);\n        scope.$on('$destroy', function() {\n          tabsetCtrl.removeTab(scope);\n        });\n\n        //We need to transclude later, once the content container is ready.\n        //when this link happens, we're inside a tab heading.\n        scope.$transcludeFn = transclude;\n      };\n    }\n  };\n}])\n\n.directive('tabHeadingTransclude', [function() {\n  return {\n    restrict: 'A',\n    require: '^tab',\n    link: function(scope, elm, attrs, tabCtrl) {\n      scope.$watch('headingElement', function updateHeadingElement(heading) {\n        if (heading) {\n          elm.html('');\n          elm.append(heading);\n        }\n      });\n    }\n  };\n}])\n\n.directive('tabContentTransclude', function() {\n  return {\n    restrict: 'A',\n    require: '^tabset',\n    link: function(scope, elm, attrs) {\n      var tab = scope.$eval(attrs.tabContentTransclude);\n\n      //Now our tab is ready to be transcluded: both the tab heading area\n      //and the tab content area are loaded.  Transclude 'em both.\n      tab.$transcludeFn(tab.$parent, function(contents) {\n        angular.forEach(contents, function(node) {\n          if (isTabHeading(node)) {\n            //Let tabHeadingTransclude know.\n            tab.headingElement = node;\n          } else {\n            elm.append(node);\n          }\n        });\n      });\n    }\n  };\n  function isTabHeading(node) {\n    return node.tagName &&  (\n      node.hasAttribute('tab-heading') ||\n      node.hasAttribute('data-tab-heading') ||\n      node.tagName.toLowerCase() === 'tab-heading' ||\n      node.tagName.toLowerCase() === 'data-tab-heading'\n    );\n  }\n})\n\n;\n\nangular.module('ui.bootstrap.timepicker', [])\n\n.constant('timepickerConfig', {\n  hourStep: 1,\n  minuteStep: 1,\n  showMeridian: true,\n  meridians: null,\n  readonlyInput: false,\n  mousewheel: true\n})\n\n.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) {\n  var selected = new Date(),\n      ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl\n      meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS;\n\n  this.init = function( ngModelCtrl_, inputs ) {\n    ngModelCtrl = ngModelCtrl_;\n    ngModelCtrl.$render = this.render;\n\n    var hoursInputEl = inputs.eq(0),\n        minutesInputEl = inputs.eq(1);\n\n    var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel;\n    if ( mousewheel ) {\n      this.setupMousewheelEvents( hoursInputEl, minutesInputEl );\n    }\n\n    $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput;\n    this.setupInputEvents( hoursInputEl, minutesInputEl );\n  };\n\n  var hourStep = timepickerConfig.hourStep;\n  if ($attrs.hourStep) {\n    $scope.$parent.$watch($parse($attrs.hourStep), function(value) {\n      hourStep = parseInt(value, 10);\n    });\n  }\n\n  var minuteStep = timepickerConfig.minuteStep;\n  if ($attrs.minuteStep) {\n    $scope.$parent.$watch($parse($attrs.minuteStep), function(value) {\n      minuteStep = parseInt(value, 10);\n    });\n  }\n\n  // 12H / 24H mode\n  $scope.showMeridian = timepickerConfig.showMeridian;\n  if ($attrs.showMeridian) {\n    $scope.$parent.$watch($parse($attrs.showMeridian), function(value) {\n      $scope.showMeridian = !!value;\n\n      if ( ngModelCtrl.$error.time ) {\n        // Evaluate from template\n        var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate();\n        if (angular.isDefined( hours ) && angular.isDefined( minutes )) {\n          selected.setHours( hours );\n          refresh();\n        }\n      } else {\n        updateTemplate();\n      }\n    });\n  }\n\n  // Get $scope.hours in 24H mode if valid\n  function getHoursFromTemplate ( ) {\n    var hours = parseInt( $scope.hours, 10 );\n    var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24);\n    if ( !valid ) {\n      return undefined;\n    }\n\n    if ( $scope.showMeridian ) {\n      if ( hours === 12 ) {\n        hours = 0;\n      }\n      if ( $scope.meridian === meridians[1] ) {\n        hours = hours + 12;\n      }\n    }\n    return hours;\n  }\n\n  function getMinutesFromTemplate() {\n    var minutes = parseInt($scope.minutes, 10);\n    return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined;\n  }\n\n  function pad( value ) {\n    return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value;\n  }\n\n  // Respond on mousewheel spin\n  this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) {\n    var isScrollingUp = function(e) {\n      if (e.originalEvent) {\n        e = e.originalEvent;\n      }\n      //pick correct delta variable depending on event\n      var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY;\n      return (e.detail || delta > 0);\n    };\n\n    hoursInputEl.bind('mousewheel wheel', function(e) {\n      $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() );\n      e.preventDefault();\n    });\n\n    minutesInputEl.bind('mousewheel wheel', function(e) {\n      $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() );\n      e.preventDefault();\n    });\n\n  };\n\n  this.setupInputEvents = function( hoursInputEl, minutesInputEl ) {\n    if ( $scope.readonlyInput ) {\n      $scope.updateHours = angular.noop;\n      $scope.updateMinutes = angular.noop;\n      return;\n    }\n\n    var invalidate = function(invalidHours, invalidMinutes) {\n      ngModelCtrl.$setViewValue( null );\n      ngModelCtrl.$setValidity('time', false);\n      if (angular.isDefined(invalidHours)) {\n        $scope.invalidHours = invalidHours;\n      }\n      if (angular.isDefined(invalidMinutes)) {\n        $scope.invalidMinutes = invalidMinutes;\n      }\n    };\n\n    $scope.updateHours = function() {\n      var hours = getHoursFromTemplate();\n\n      if ( angular.isDefined(hours) ) {\n        selected.setHours( hours );\n        refresh( 'h' );\n      } else {\n        invalidate(true);\n      }\n    };\n\n    hoursInputEl.bind('blur', function(e) {\n      if ( !$scope.invalidHours && $scope.hours < 10) {\n        $scope.$apply( function() {\n          $scope.hours = pad( $scope.hours );\n        });\n      }\n    });\n\n    $scope.updateMinutes = function() {\n      var minutes = getMinutesFromTemplate();\n\n      if ( angular.isDefined(minutes) ) {\n        selected.setMinutes( minutes );\n        refresh( 'm' );\n      } else {\n        invalidate(undefined, true);\n      }\n    };\n\n    minutesInputEl.bind('blur', function(e) {\n      if ( !$scope.invalidMinutes && $scope.minutes < 10 ) {\n        $scope.$apply( function() {\n          $scope.minutes = pad( $scope.minutes );\n        });\n      }\n    });\n\n  };\n\n  this.render = function() {\n    var date = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : null;\n\n    if ( isNaN(date) ) {\n      ngModelCtrl.$setValidity('time', false);\n      $log.error('Timepicker directive: \"ng-model\" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.');\n    } else {\n      if ( date ) {\n        selected = date;\n      }\n      makeValid();\n      updateTemplate();\n    }\n  };\n\n  // Call internally when we know that model is valid.\n  function refresh( keyboardChange ) {\n    makeValid();\n    ngModelCtrl.$setViewValue( new Date(selected) );\n    updateTemplate( keyboardChange );\n  }\n\n  function makeValid() {\n    ngModelCtrl.$setValidity('time', true);\n    $scope.invalidHours = false;\n    $scope.invalidMinutes = false;\n  }\n\n  function updateTemplate( keyboardChange ) {\n    var hours = selected.getHours(), minutes = selected.getMinutes();\n\n    if ( $scope.showMeridian ) {\n      hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system\n    }\n\n    $scope.hours = keyboardChange === 'h' ? hours : pad(hours);\n    $scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes);\n    $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1];\n  }\n\n  function addMinutes( minutes ) {\n    var dt = new Date( selected.getTime() + minutes * 60000 );\n    selected.setHours( dt.getHours(), dt.getMinutes() );\n    refresh();\n  }\n\n  $scope.incrementHours = function() {\n    addMinutes( hourStep * 60 );\n  };\n  $scope.decrementHours = function() {\n    addMinutes( - hourStep * 60 );\n  };\n  $scope.incrementMinutes = function() {\n    addMinutes( minuteStep );\n  };\n  $scope.decrementMinutes = function() {\n    addMinutes( - minuteStep );\n  };\n  $scope.toggleMeridian = function() {\n    addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) );\n  };\n}])\n\n.directive('timepicker', function () {\n  return {\n    restrict: 'EA',\n    require: ['timepicker', '?^ngModel'],\n    controller:'TimepickerController',\n    replace: true,\n    scope: {},\n    templateUrl: 'template/timepicker/timepicker.html',\n    link: function(scope, element, attrs, ctrls) {\n      var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1];\n\n      if ( ngModelCtrl ) {\n        timepickerCtrl.init( ngModelCtrl, element.find('input') );\n      }\n    }\n  };\n});\n\nangular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml'])\n\n/**\n * A helper service that can parse typeahead's syntax (string provided by users)\n * Extracted to a separate service for ease of unit testing\n */\n  .factory('typeaheadParser', ['$parse', function ($parse) {\n\n  //                      00000111000000000000022200000000000000003333333333333330000000000044000\n  var TYPEAHEAD_REGEXP = /^\\s*(.*?)(?:\\s+as\\s+(.*?))?\\s+for\\s+(?:([\\$\\w][\\$\\w\\d]*))\\s+in\\s+(.*)$/;\n\n  return {\n    parse:function (input) {\n\n      var match = input.match(TYPEAHEAD_REGEXP);\n      if (!match) {\n        throw new Error(\n          'Expected typeahead specification in form of \"_modelValue_ (as _label_)? for _item_ in _collection_\"' +\n            ' but got \"' + input + '\".');\n      }\n\n      return {\n        itemName:match[3],\n        source:$parse(match[4]),\n        viewMapper:$parse(match[2] || match[1]),\n        modelMapper:$parse(match[1])\n      };\n    }\n  };\n}])\n\n  .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser',\n    function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) {\n\n  var HOT_KEYS = [9, 13, 27, 38, 40];\n\n  return {\n    require:'ngModel',\n    link:function (originalScope, element, attrs, modelCtrl) {\n\n      //SUPPORTED ATTRIBUTES (OPTIONS)\n\n      //minimal no of characters that needs to be entered before typeahead kicks-in\n      var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1;\n\n      //minimal wait time after last character typed before typehead kicks-in\n      var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0;\n\n      //should it restrict model values to the ones selected from the popup only?\n      var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false;\n\n      //binding to a variable that indicates if matches are being retrieved asynchronously\n      var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop;\n\n      //a callback executed when a match is selected\n      var onSelectCallback = $parse(attrs.typeaheadOnSelect);\n\n      var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined;\n\n      var appendToBody =  attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false;\n\n      //INTERNAL VARIABLES\n\n      //model setter executed upon match selection\n      var $setModelValue = $parse(attrs.ngModel).assign;\n\n      //expressions used by typeahead\n      var parserResult = typeaheadParser.parse(attrs.typeahead);\n\n      var hasFocus;\n\n      //create a child scope for the typeahead directive so we are not polluting original scope\n      //with typeahead-specific data (matches, query etc.)\n      var scope = originalScope.$new();\n      originalScope.$on('$destroy', function(){\n        scope.$destroy();\n      });\n\n      // WAI-ARIA\n      var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000);\n      element.attr({\n        'aria-autocomplete': 'list',\n        'aria-expanded': false,\n        'aria-owns': popupId\n      });\n\n      //pop-up element used to display matches\n      var popUpEl = angular.element('<div typeahead-popup></div>');\n      popUpEl.attr({\n        id: popupId,\n        matches: 'matches',\n        active: 'activeIdx',\n        select: 'select(activeIdx)',\n        query: 'query',\n        position: 'position'\n      });\n      //custom item template\n      if (angular.isDefined(attrs.typeaheadTemplateUrl)) {\n        popUpEl.attr('template-url', attrs.typeaheadTemplateUrl);\n      }\n\n      var resetMatches = function() {\n        scope.matches = [];\n        scope.activeIdx = -1;\n        element.attr('aria-expanded', false);\n      };\n\n      var getMatchId = function(index) {\n        return popupId + '-option-' + index;\n      };\n\n      // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead.\n      // This attribute is added or removed automatically when the `activeIdx` changes.\n      scope.$watch('activeIdx', function(index) {\n        if (index < 0) {\n          element.removeAttr('aria-activedescendant');\n        } else {\n          element.attr('aria-activedescendant', getMatchId(index));\n        }\n      });\n\n      var getMatchesAsync = function(inputValue) {\n\n        var locals = {$viewValue: inputValue};\n        isLoadingSetter(originalScope, true);\n        $q.when(parserResult.source(originalScope, locals)).then(function(matches) {\n\n          //it might happen that several async queries were in progress if a user were typing fast\n          //but we are interested only in responses that correspond to the current view value\n          var onCurrentRequest = (inputValue === modelCtrl.$viewValue);\n          if (onCurrentRequest && hasFocus) {\n            if (matches.length > 0) {\n\n              scope.activeIdx = 0;\n              scope.matches.length = 0;\n\n              //transform labels\n              for(var i=0; i<matches.length; i++) {\n                locals[parserResult.itemName] = matches[i];\n                scope.matches.push({\n                  id: getMatchId(i),\n                  label: parserResult.viewMapper(scope, locals),\n                  model: matches[i]\n                });\n              }\n\n              scope.query = inputValue;\n              //position pop-up with matches - we need to re-calculate its position each time we are opening a window\n              //with matches as a pop-up might be absolute-positioned and position of an input might have changed on a page\n              //due to other elements being rendered\n              scope.position = appendToBody ? $position.offset(element) : $position.position(element);\n              scope.position.top = scope.position.top + element.prop('offsetHeight');\n\n              element.attr('aria-expanded', true);\n            } else {\n              resetMatches();\n            }\n          }\n          if (onCurrentRequest) {\n            isLoadingSetter(originalScope, false);\n          }\n        }, function(){\n          resetMatches();\n          isLoadingSetter(originalScope, false);\n        });\n      };\n\n      resetMatches();\n\n      //we need to propagate user's query so we can higlight matches\n      scope.query = undefined;\n\n      //Declare the timeout promise var outside the function scope so that stacked calls can be cancelled later \n      var timeoutPromise;\n\n      //plug into $parsers pipeline to open a typeahead on view changes initiated from DOM\n      //$parsers kick-in on all the changes coming from the view as well as manually triggered by $setViewValue\n      modelCtrl.$parsers.unshift(function (inputValue) {\n\n        hasFocus = true;\n\n        if (inputValue && inputValue.length >= minSearch) {\n          if (waitTime > 0) {\n            if (timeoutPromise) {\n              $timeout.cancel(timeoutPromise);//cancel previous timeout\n            }\n            timeoutPromise = $timeout(function () {\n              getMatchesAsync(inputValue);\n            }, waitTime);\n          } else {\n            getMatchesAsync(inputValue);\n          }\n        } else {\n          isLoadingSetter(originalScope, false);\n          resetMatches();\n        }\n\n        if (isEditable) {\n          return inputValue;\n        } else {\n          if (!inputValue) {\n            // Reset in case user had typed something previously.\n            modelCtrl.$setValidity('editable', true);\n            return inputValue;\n          } else {\n            modelCtrl.$setValidity('editable', false);\n            return undefined;\n          }\n        }\n      });\n\n      modelCtrl.$formatters.push(function (modelValue) {\n\n        var candidateViewValue, emptyViewValue;\n        var locals = {};\n\n        if (inputFormatter) {\n\n          locals['$model'] = modelValue;\n          return inputFormatter(originalScope, locals);\n\n        } else {\n\n          //it might happen that we don't have enough info to properly render input value\n          //we need to check for this situation and simply return model value if we can't apply custom formatting\n          locals[parserResult.itemName] = modelValue;\n          candidateViewValue = parserResult.viewMapper(originalScope, locals);\n          locals[parserResult.itemName] = undefined;\n          emptyViewValue = parserResult.viewMapper(originalScope, locals);\n\n          return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue;\n        }\n      });\n\n      scope.select = function (activeIdx) {\n        //called from within the $digest() cycle\n        var locals = {};\n        var model, item;\n\n        locals[parserResult.itemName] = item = scope.matches[activeIdx].model;\n        model = parserResult.modelMapper(originalScope, locals);\n        $setModelValue(originalScope, model);\n        modelCtrl.$setValidity('editable', true);\n\n        onSelectCallback(originalScope, {\n          $item: item,\n          $model: model,\n          $label: parserResult.viewMapper(originalScope, locals)\n        });\n\n        resetMatches();\n\n        //return focus to the input element if a match was selected via a mouse click event\n        // use timeout to avoid $rootScope:inprog error\n        $timeout(function() { element[0].focus(); }, 0, false);\n      };\n\n      //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27)\n      element.bind('keydown', function (evt) {\n\n        //typeahead is open and an \"interesting\" key was pressed\n        if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) {\n          return;\n        }\n\n        evt.preventDefault();\n\n        if (evt.which === 40) {\n          scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length;\n          scope.$digest();\n\n        } else if (evt.which === 38) {\n          scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1;\n          scope.$digest();\n\n        } else if (evt.which === 13 || evt.which === 9) {\n          scope.$apply(function () {\n            scope.select(scope.activeIdx);\n          });\n\n        } else if (evt.which === 27) {\n          evt.stopPropagation();\n\n          resetMatches();\n          scope.$digest();\n        }\n      });\n\n      element.bind('blur', function (evt) {\n        hasFocus = false;\n      });\n\n      // Keep reference to click handler to unbind it.\n      var dismissClickHandler = function (evt) {\n        if (element[0] !== evt.target) {\n          resetMatches();\n          scope.$digest();\n        }\n      };\n\n      $document.bind('click', dismissClickHandler);\n\n      originalScope.$on('$destroy', function(){\n        $document.unbind('click', dismissClickHandler);\n      });\n\n      var $popup = $compile(popUpEl)(scope);\n      if ( appendToBody ) {\n        $document.find('body').append($popup);\n      } else {\n        element.after($popup);\n      }\n    }\n  };\n\n}])\n\n  .directive('typeaheadPopup', function () {\n    return {\n      restrict:'EA',\n      scope:{\n        matches:'=',\n        query:'=',\n        active:'=',\n        position:'=',\n        select:'&'\n      },\n      replace:true,\n      templateUrl:'template/typeahead/typeahead-popup.html',\n      link:function (scope, element, attrs) {\n\n        scope.templateUrl = attrs.templateUrl;\n\n        scope.isOpen = function () {\n          return scope.matches.length > 0;\n        };\n\n        scope.isActive = function (matchIdx) {\n          return scope.active == matchIdx;\n        };\n\n        scope.selectActive = function (matchIdx) {\n          scope.active = matchIdx;\n        };\n\n        scope.selectMatch = function (activeIdx) {\n          scope.select({activeIdx:activeIdx});\n        };\n      }\n    };\n  })\n\n  .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) {\n    return {\n      restrict:'EA',\n      scope:{\n        index:'=',\n        match:'=',\n        query:'='\n      },\n      link:function (scope, element, attrs) {\n        var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html';\n        $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){\n           element.replaceWith($compile(tplContent.trim())(scope));\n        });\n      }\n    };\n  }])\n\n  .filter('typeaheadHighlight', function() {\n\n    function escapeRegexp(queryToEscape) {\n      return queryToEscape.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n    }\n\n    return function(matchItem, query) {\n      return query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '<strong>$&</strong>') : matchItem;\n    };\n  });\n\nangular.module(\"template/accordion/accordion-group.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/accordion/accordion-group.html\",\n    \"<div class=\\\"panel panel-default\\\">\\n\" +\n    \"  <div class=\\\"panel-heading\\\">\\n\" +\n    \"    <h4 class=\\\"panel-title\\\">\\n\" +\n    \"      <a class=\\\"accordion-toggle\\\" ng-click=\\\"toggleOpen()\\\" accordion-transclude=\\\"heading\\\"><span ng-class=\\\"{'text-muted': isDisabled}\\\">{{heading}}</span></a>\\n\" +\n    \"    </h4>\\n\" +\n    \"  </div>\\n\" +\n    \"  <div class=\\\"panel-collapse\\\" collapse=\\\"!isOpen\\\">\\n\" +\n    \"\t  <div class=\\\"panel-body\\\" ng-transclude></div>\\n\" +\n    \"  </div>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/accordion/accordion.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/accordion/accordion.html\",\n    \"<div class=\\\"panel-group\\\" ng-transclude></div>\");\n}]);\n\nangular.module(\"template/alert/alert.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/alert/alert.html\",\n    \"<div class=\\\"alert\\\" ng-class=\\\"{'alert-{{type || 'warning'}}': true, 'alert-dismissable': closeable}\\\" role=\\\"alert\\\">\\n\" +\n    \"    <button ng-show=\\\"closeable\\\" type=\\\"button\\\" class=\\\"close\\\" ng-click=\\\"close()\\\">\\n\" +\n    \"        <span aria-hidden=\\\"true\\\">&times;</span>\\n\" +\n    \"        <span class=\\\"sr-only\\\">Close</span>\\n\" +\n    \"    </button>\\n\" +\n    \"    <div ng-transclude></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/carousel/carousel.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/carousel/carousel.html\",\n    \"<div ng-mouseenter=\\\"pause()\\\" ng-mouseleave=\\\"play()\\\" class=\\\"carousel\\\" ng-swipe-right=\\\"prev()\\\" ng-swipe-left=\\\"next()\\\">\\n\" +\n    \"    <ol class=\\\"carousel-indicators\\\" ng-show=\\\"slides.length > 1\\\">\\n\" +\n    \"        <li ng-repeat=\\\"slide in slides track by $index\\\" ng-class=\\\"{active: isActive(slide)}\\\" ng-click=\\\"select(slide)\\\"></li>\\n\" +\n    \"    </ol>\\n\" +\n    \"    <div class=\\\"carousel-inner\\\" ng-transclude></div>\\n\" +\n    \"    <a class=\\\"left carousel-control\\\" ng-click=\\\"prev()\\\" ng-show=\\\"slides.length > 1\\\"><span class=\\\"glyphicon glyphicon-chevron-left\\\"></span></a>\\n\" +\n    \"    <a class=\\\"right carousel-control\\\" ng-click=\\\"next()\\\" ng-show=\\\"slides.length > 1\\\"><span class=\\\"glyphicon glyphicon-chevron-right\\\"></span></a>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/carousel/slide.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/carousel/slide.html\",\n    \"<div ng-class=\\\"{\\n\" +\n    \"    'active': leaving || (active && !entering),\\n\" +\n    \"    'prev': (next || active) && direction=='prev',\\n\" +\n    \"    'next': (next || active) && direction=='next',\\n\" +\n    \"    'right': direction=='prev',\\n\" +\n    \"    'left': direction=='next'\\n\" +\n    \"  }\\\" class=\\\"item text-center\\\" ng-transclude></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/datepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/datepicker.html\",\n    \"<div ng-switch=\\\"datepickerMode\\\" role=\\\"application\\\" ng-keydown=\\\"keydown($event)\\\">\\n\" +\n    \"  <daypicker ng-switch-when=\\\"day\\\" tabindex=\\\"0\\\"></daypicker>\\n\" +\n    \"  <monthpicker ng-switch-when=\\\"month\\\" tabindex=\\\"0\\\"></monthpicker>\\n\" +\n    \"  <yearpicker ng-switch-when=\\\"year\\\" tabindex=\\\"0\\\"></yearpicker>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/datepicker/day.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/day.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-left\\\"></i></button></th>\\n\" +\n    \"      <th colspan=\\\"{{5 + showWeeks}}\\\"><button id=\\\"{{uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"toggleMode()\\\" tabindex=\\\"-1\\\" style=\\\"width:100%;\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-right\\\"></i></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th ng-show=\\\"showWeeks\\\" class=\\\"text-center\\\"></th>\\n\" +\n    \"      <th ng-repeat=\\\"label in labels track by $index\\\" class=\\\"text-center\\\"><small aria-label=\\\"{{label.full}}\\\">{{label.abbr}}</small></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr ng-repeat=\\\"row in rows track by $index\\\">\\n\" +\n    \"      <td ng-show=\\\"showWeeks\\\" class=\\\"text-center h6\\\"><em>{{ weekNumbers[$index] }}</em></td>\\n\" +\n    \"      <td ng-repeat=\\\"dt in row track by dt.date\\\" class=\\\"text-center\\\" role=\\\"gridcell\\\" id=\\\"{{dt.uid}}\\\" aria-disabled=\\\"{{!!dt.disabled}}\\\">\\n\" +\n    \"        <button type=\\\"button\\\" style=\\\"width:100%;\\\" class=\\\"btn btn-default btn-sm\\\" ng-class=\\\"{'btn-info': dt.selected, active: isActive(dt)}\\\" ng-click=\\\"select(dt.date)\\\" ng-disabled=\\\"dt.disabled\\\" tabindex=\\\"-1\\\"><span ng-class=\\\"{'text-muted': dt.secondary, 'text-info': dt.current}\\\">{{dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/month.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/month.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-left\\\"></i></button></th>\\n\" +\n    \"      <th><button id=\\\"{{uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"toggleMode()\\\" tabindex=\\\"-1\\\" style=\\\"width:100%;\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-right\\\"></i></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr ng-repeat=\\\"row in rows track by $index\\\">\\n\" +\n    \"      <td ng-repeat=\\\"dt in row track by dt.date\\\" class=\\\"text-center\\\" role=\\\"gridcell\\\" id=\\\"{{dt.uid}}\\\" aria-disabled=\\\"{{!!dt.disabled}}\\\">\\n\" +\n    \"        <button type=\\\"button\\\" style=\\\"width:100%;\\\" class=\\\"btn btn-default\\\" ng-class=\\\"{'btn-info': dt.selected, active: isActive(dt)}\\\" ng-click=\\\"select(dt.date)\\\" ng-disabled=\\\"dt.disabled\\\" tabindex=\\\"-1\\\"><span ng-class=\\\"{'text-info': dt.current}\\\">{{dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/popup.html\",\n    \"<ul class=\\\"dropdown-menu\\\" ng-style=\\\"{display: (isOpen && 'block') || 'none', top: position.top+'px', left: position.left+'px'}\\\" ng-keydown=\\\"keydown($event)\\\">\\n\" +\n    \"\t<li ng-transclude></li>\\n\" +\n    \"\t<li ng-if=\\\"showButtonBar\\\" style=\\\"padding:10px 9px 2px\\\">\\n\" +\n    \"\t\t<span class=\\\"btn-group\\\">\\n\" +\n    \"\t\t\t<button type=\\\"button\\\" class=\\\"btn btn-sm btn-info\\\" ng-click=\\\"select('today')\\\">{{ getText('current') }}</button>\\n\" +\n    \"\t\t\t<button type=\\\"button\\\" class=\\\"btn btn-sm btn-danger\\\" ng-click=\\\"select(null)\\\">{{ getText('clear') }}</button>\\n\" +\n    \"\t\t</span>\\n\" +\n    \"\t\t<button type=\\\"button\\\" class=\\\"btn btn-sm btn-success pull-right\\\" ng-click=\\\"close()\\\">{{ getText('close') }}</button>\\n\" +\n    \"\t</li>\\n\" +\n    \"</ul>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/datepicker/year.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/datepicker/year.html\",\n    \"<table role=\\\"grid\\\" aria-labelledby=\\\"{{uniqueId}}-title\\\" aria-activedescendant=\\\"{{activeDateId}}\\\">\\n\" +\n    \"  <thead>\\n\" +\n    \"    <tr>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-left\\\" ng-click=\\\"move(-1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-left\\\"></i></button></th>\\n\" +\n    \"      <th colspan=\\\"3\\\"><button id=\\\"{{uniqueId}}-title\\\" role=\\\"heading\\\" aria-live=\\\"assertive\\\" aria-atomic=\\\"true\\\" type=\\\"button\\\" class=\\\"btn btn-default btn-sm\\\" ng-click=\\\"toggleMode()\\\" tabindex=\\\"-1\\\" style=\\\"width:100%;\\\"><strong>{{title}}</strong></button></th>\\n\" +\n    \"      <th><button type=\\\"button\\\" class=\\\"btn btn-default btn-sm pull-right\\\" ng-click=\\\"move(1)\\\" tabindex=\\\"-1\\\"><i class=\\\"glyphicon glyphicon-chevron-right\\\"></i></button></th>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </thead>\\n\" +\n    \"  <tbody>\\n\" +\n    \"    <tr ng-repeat=\\\"row in rows track by $index\\\">\\n\" +\n    \"      <td ng-repeat=\\\"dt in row track by dt.date\\\" class=\\\"text-center\\\" role=\\\"gridcell\\\" id=\\\"{{dt.uid}}\\\" aria-disabled=\\\"{{!!dt.disabled}}\\\">\\n\" +\n    \"        <button type=\\\"button\\\" style=\\\"width:100%;\\\" class=\\\"btn btn-default\\\" ng-class=\\\"{'btn-info': dt.selected, active: isActive(dt)}\\\" ng-click=\\\"select(dt.date)\\\" ng-disabled=\\\"dt.disabled\\\" tabindex=\\\"-1\\\"><span ng-class=\\\"{'text-info': dt.current}\\\">{{dt.label}}</span></button>\\n\" +\n    \"      </td>\\n\" +\n    \"    </tr>\\n\" +\n    \"  </tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/modal/backdrop.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/modal/backdrop.html\",\n    \"<div class=\\\"modal-backdrop fade\\\"\\n\" +\n    \"     ng-class=\\\"{in: animate}\\\"\\n\" +\n    \"     ng-style=\\\"{'z-index': 1040 + (index && 1 || 0) + index*10}\\\"\\n\" +\n    \"></div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/modal/window.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/modal/window.html\",\n    \"<div tabindex=\\\"-1\\\" role=\\\"dialog\\\" class=\\\"modal fade\\\" ng-class=\\\"{in: animate}\\\" ng-style=\\\"{'z-index': 1050 + index*10, display: 'block'}\\\" ng-click=\\\"close($event)\\\">\\n\" +\n    \"    <div class=\\\"modal-dialog\\\" ng-class=\\\"{'modal-sm': size == 'sm', 'modal-lg': size == 'lg'}\\\"><div class=\\\"modal-content\\\" ng-transclude></div></div>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/pagination/pager.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/pagination/pager.html\",\n    \"<ul class=\\\"pager\\\">\\n\" +\n    \"  <li ng-class=\\\"{disabled: noPrevious(), previous: align}\\\"><a href ng-click=\\\"selectPage(page - 1)\\\">{{getText('previous')}}</a></li>\\n\" +\n    \"  <li ng-class=\\\"{disabled: noNext(), next: align}\\\"><a href ng-click=\\\"selectPage(page + 1)\\\">{{getText('next')}}</a></li>\\n\" +\n    \"</ul>\");\n}]);\n\nangular.module(\"template/pagination/pagination.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/pagination/pagination.html\",\n    \"<ul class=\\\"pagination\\\">\\n\" +\n    \"  <li ng-if=\\\"boundaryLinks\\\" ng-class=\\\"{disabled: noPrevious()}\\\"><a href ng-click=\\\"selectPage(1)\\\">{{getText('first')}}</a></li>\\n\" +\n    \"  <li ng-if=\\\"directionLinks\\\" ng-class=\\\"{disabled: noPrevious()}\\\"><a href ng-click=\\\"selectPage(page - 1)\\\">{{getText('previous')}}</a></li>\\n\" +\n    \"  <li ng-repeat=\\\"page in pages track by $index\\\" ng-class=\\\"{active: page.active}\\\"><a href ng-click=\\\"selectPage(page.number)\\\">{{page.text}}</a></li>\\n\" +\n    \"  <li ng-if=\\\"directionLinks\\\" ng-class=\\\"{disabled: noNext()}\\\"><a href ng-click=\\\"selectPage(page + 1)\\\">{{getText('next')}}</a></li>\\n\" +\n    \"  <li ng-if=\\\"boundaryLinks\\\" ng-class=\\\"{disabled: noNext()}\\\"><a href ng-click=\\\"selectPage(totalPages)\\\">{{getText('last')}}</a></li>\\n\" +\n    \"</ul>\");\n}]);\n\nangular.module(\"template/tooltip/tooltip-html-unsafe-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tooltip/tooltip-html-unsafe-popup.html\",\n    \"<div class=\\\"tooltip {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"  <div class=\\\"tooltip-inner\\\" bind-html-unsafe=\\\"content\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/tooltip/tooltip-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tooltip/tooltip-popup.html\",\n    \"<div class=\\\"tooltip {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"tooltip-arrow\\\"></div>\\n\" +\n    \"  <div class=\\\"tooltip-inner\\\" ng-bind=\\\"content\\\"></div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/popover/popover.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/popover/popover.html\",\n    \"<div class=\\\"popover {{placement}}\\\" ng-class=\\\"{ in: isOpen(), fade: animation() }\\\">\\n\" +\n    \"  <div class=\\\"arrow\\\"></div>\\n\" +\n    \"\\n\" +\n    \"  <div class=\\\"popover-inner\\\">\\n\" +\n    \"      <h3 class=\\\"popover-title\\\" ng-bind=\\\"title\\\" ng-show=\\\"title\\\"></h3>\\n\" +\n    \"      <div class=\\\"popover-content\\\" ng-bind=\\\"content\\\"></div>\\n\" +\n    \"  </div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/progressbar/bar.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/progressbar/bar.html\",\n    \"<div class=\\\"progress-bar\\\" ng-class=\\\"type && 'progress-bar-' + type\\\" role=\\\"progressbar\\\" aria-valuenow=\\\"{{value}}\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{max}}\\\" ng-style=\\\"{width: percent + '%'}\\\" aria-valuetext=\\\"{{percent | number:0}}%\\\" ng-transclude></div>\");\n}]);\n\nangular.module(\"template/progressbar/progress.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/progressbar/progress.html\",\n    \"<div class=\\\"progress\\\" ng-transclude></div>\");\n}]);\n\nangular.module(\"template/progressbar/progressbar.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/progressbar/progressbar.html\",\n    \"<div class=\\\"progress\\\">\\n\" +\n    \"  <div class=\\\"progress-bar\\\" ng-class=\\\"type && 'progress-bar-' + type\\\" role=\\\"progressbar\\\" aria-valuenow=\\\"{{value}}\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{max}}\\\" ng-style=\\\"{width: percent + '%'}\\\" aria-valuetext=\\\"{{percent | number:0}}%\\\" ng-transclude></div>\\n\" +\n    \"</div>\");\n}]);\n\nangular.module(\"template/rating/rating.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/rating/rating.html\",\n    \"<span ng-mouseleave=\\\"reset()\\\" ng-keydown=\\\"onKeydown($event)\\\" tabindex=\\\"0\\\" role=\\\"slider\\\" aria-valuemin=\\\"0\\\" aria-valuemax=\\\"{{range.length}}\\\" aria-valuenow=\\\"{{value}}\\\">\\n\" +\n    \"    <i ng-repeat=\\\"r in range track by $index\\\" ng-mouseenter=\\\"enter($index + 1)\\\" ng-click=\\\"rate($index + 1)\\\" class=\\\"glyphicon\\\" ng-class=\\\"$index < value && (r.stateOn || 'glyphicon-star') || (r.stateOff || 'glyphicon-star-empty')\\\">\\n\" +\n    \"        <span class=\\\"sr-only\\\">({{ $index < value ? '*' : ' ' }})</span>\\n\" +\n    \"    </i>\\n\" +\n    \"</span>\");\n}]);\n\nangular.module(\"template/tabs/tab.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tabs/tab.html\",\n    \"<li ng-class=\\\"{active: active, disabled: disabled}\\\">\\n\" +\n    \"  <a ng-click=\\\"select()\\\" tab-heading-transclude>{{heading}}</a>\\n\" +\n    \"</li>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/tabs/tabset-titles.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tabs/tabset-titles.html\",\n    \"<ul class=\\\"nav {{type && 'nav-' + type}}\\\" ng-class=\\\"{'nav-stacked': vertical}\\\">\\n\" +\n    \"</ul>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/tabs/tabset.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/tabs/tabset.html\",\n    \"\\n\" +\n    \"<div>\\n\" +\n    \"  <ul class=\\\"nav nav-{{type || 'tabs'}}\\\" ng-class=\\\"{'nav-stacked': vertical, 'nav-justified': justified}\\\" ng-transclude></ul>\\n\" +\n    \"  <div class=\\\"tab-content\\\">\\n\" +\n    \"    <div class=\\\"tab-pane\\\" \\n\" +\n    \"         ng-repeat=\\\"tab in tabs\\\" \\n\" +\n    \"         ng-class=\\\"{active: tab.active}\\\"\\n\" +\n    \"         tab-content-transclude=\\\"tab\\\">\\n\" +\n    \"    </div>\\n\" +\n    \"  </div>\\n\" +\n    \"</div>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/timepicker/timepicker.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/timepicker/timepicker.html\",\n    \"<table>\\n\" +\n    \"\t<tbody>\\n\" +\n    \"\t\t<tr class=\\\"text-center\\\">\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"incrementHours()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-up\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td>&nbsp;</td>\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"incrementMinutes()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-up\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td ng-show=\\\"showMeridian\\\"></td>\\n\" +\n    \"\t\t</tr>\\n\" +\n    \"\t\t<tr>\\n\" +\n    \"\t\t\t<td style=\\\"width:50px;\\\" class=\\\"form-group\\\" ng-class=\\\"{'has-error': invalidHours}\\\">\\n\" +\n    \"\t\t\t\t<input type=\\\"text\\\" ng-model=\\\"hours\\\" ng-change=\\\"updateHours()\\\" class=\\\"form-control text-center\\\" ng-mousewheel=\\\"incrementHours()\\\" ng-readonly=\\\"readonlyInput\\\" maxlength=\\\"2\\\">\\n\" +\n    \"\t\t\t</td>\\n\" +\n    \"\t\t\t<td>:</td>\\n\" +\n    \"\t\t\t<td style=\\\"width:50px;\\\" class=\\\"form-group\\\" ng-class=\\\"{'has-error': invalidMinutes}\\\">\\n\" +\n    \"\t\t\t\t<input type=\\\"text\\\" ng-model=\\\"minutes\\\" ng-change=\\\"updateMinutes()\\\" class=\\\"form-control text-center\\\" ng-readonly=\\\"readonlyInput\\\" maxlength=\\\"2\\\">\\n\" +\n    \"\t\t\t</td>\\n\" +\n    \"\t\t\t<td ng-show=\\\"showMeridian\\\"><button type=\\\"button\\\" class=\\\"btn btn-default text-center\\\" ng-click=\\\"toggleMeridian()\\\">{{meridian}}</button></td>\\n\" +\n    \"\t\t</tr>\\n\" +\n    \"\t\t<tr class=\\\"text-center\\\">\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"decrementHours()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-down\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td>&nbsp;</td>\\n\" +\n    \"\t\t\t<td><a ng-click=\\\"decrementMinutes()\\\" class=\\\"btn btn-link\\\"><span class=\\\"glyphicon glyphicon-chevron-down\\\"></span></a></td>\\n\" +\n    \"\t\t\t<td ng-show=\\\"showMeridian\\\"></td>\\n\" +\n    \"\t\t</tr>\\n\" +\n    \"\t</tbody>\\n\" +\n    \"</table>\\n\" +\n    \"\");\n}]);\n\nangular.module(\"template/typeahead/typeahead-match.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/typeahead/typeahead-match.html\",\n    \"<a tabindex=\\\"-1\\\" bind-html-unsafe=\\\"match.label | typeaheadHighlight:query\\\"></a>\");\n}]);\n\nangular.module(\"template/typeahead/typeahead-popup.html\", []).run([\"$templateCache\", function($templateCache) {\n  $templateCache.put(\"template/typeahead/typeahead-popup.html\",\n    \"<ul class=\\\"dropdown-menu\\\" ng-if=\\\"isOpen()\\\" ng-style=\\\"{top: position.top+'px', left: position.left+'px'}\\\" style=\\\"display: block;\\\" role=\\\"listbox\\\" aria-hidden=\\\"{{!isOpen()}}\\\">\\n\" +\n    \"    <li ng-repeat=\\\"match in matches track by $index\\\" ng-class=\\\"{active: isActive($index) }\\\" ng-mouseenter=\\\"selectActive($index)\\\" ng-click=\\\"selectMatch($index)\\\" role=\\\"option\\\" id=\\\"{{match.id}}\\\">\\n\" +\n    \"        <div typeahead-match index=\\\"$index\\\" match=\\\"match\\\" query=\\\"query\\\" template-url=\\\"templateUrl\\\"></div>\\n\" +\n    \"    </li>\\n\" +\n    \"</ul>\");\n}]);\n"
  },
  {
    "path": "works/main.html",
    "content": "<!DOCTYPE html>\n<html>\n\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>前端小练习</title>\n\t\t<link href=\"http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.css\" rel=\"stylesheet\">\n\t</head>\n\n\t<body>\n\n\t\t<div class=\"container\">\n\t\t\t<div class=\"jumbotron\">\n\t\t\t\t<h1>前端小练习</h1>\n\t\t\t\t<p>跬步积千里,滴水汇长河</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a class=\"btn btn-lg btn-primary\" target=\"_blank\" href=\"https://github.com/hacke2/hacke2.github.io/tree/master/works\" role=\"button\">查看github项目</a>\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n\n</html>\n\n\n"
  },
  {
    "path": "works/template/about.html",
    "content": "<div class=\"jumbotron\" ng-repeat=\"work in works\">\n\t<h1>{{work.name}}</h1>\n\t<p>{{work.desc}}</p>\n\t<p>\n\t\t<a class=\"btn btn-lg btn-primary\" target=\"_blank\" href=\"{{work.url}}\" role=\"button\">查看github项目</a>\n\t</p>\n</div>"
  },
  {
    "path": "works/template/show-m.html",
    "content": "<!--\n\t作者：hacke2@qq.com\n\t时间：2014-09-20\n\t描述：详细展示模板\n-->\n<div class=\"row\">\n\t<div class=\"col-md-2\">\n\t\t<ul class=\"list-group\">\n\t\t\t<a ng-repeat=\"work in works\" href=\"index.html#/{{routeName}}/{{$index}}\"  title=\"{{work.desc}}\"  class=\"list-group-item\" >{{work.name}}</a>\n\t\t</ul>\n\t</div>\n\t<div class=\"col-md-10\">\n\t\t<div style=\"position:relative;margin: 0 auto;border:solid 15px #666;border-bottom:solid 50px #666;border-radius:8px;width: 320px;height: 480px;\">\n\t\t\t<div style=\"height: 480px;\">\n\t\t\t\t<iframe id=\"mainIframe\" name=\"iframe\" src=\"#\" frameborder=\"0\"></iframe>\n\t\t\t</div>\n\t\t\t<div style=\"position: absolute;bottom: -45px;left: 130px;border-radius:20px;z-index: 10;width:40px;height:40px;background:#f0f0f0\"></div>\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "works/template/show.html",
    "content": "<!--\n\t作者：hacke2@qq.com\n\t时间：2014-09-20\n\t描述：详细展示模板\n-->\n<div class=\"row\">\n\t<div class=\"col-md-2\">\n\t\t<ul class=\"list-group\">\n\t\t\t<a ng-repeat=\"work in works\" href=\"index.html#/{{routeName}}/{{$index}}\"  title=\"{{work.desc}}\"  class=\"list-group-item\" >{{work.name}}</a>\n\t\t</ul>\n\t</div>\n\t<div class=\"col-md-10 h100\">\n\t\t<iframe id=\"mainIframe\" name=\"iframe\" style=\"width: 100%;height: 100%;\"  src=\"#\" frameborder=\"0\"></iframe>\n\t</div>\n</div>\n"
  }
]